전자, 전기, 소프트웨어, 기계, 3D 프린터, 아두이노, 라즈베리파이, 쇼핑몰 창업

전체 페이지뷰

이 블로그 검색

최신글

[Blender] 3D viewport 사용법

[강좌] 11. 스위치 디바운싱 코드 작성하기


무작정 보고 따라하며 배우는 아두이노 강좌입니다.
아두이노 공식 사이트에서 제공하는 강좌를 바탕으로 작성되었습니다.
해당 게시글은 Arduino UNO 보드를 기준으로 작성되었습니다.

11. 스위치 바운싱 현상 해결하기


  지난 강좌에서 버튼을 사용하여 아두이노를 제어하는 방법을 알려드렸습니다. 그 과정에서 풀업/풀다운 저항에 대해 약간 언급하였으나, 풀업 풀다운 저항은 스위치 작동 후 잔전류에 의한 플로팅 현상이고, 이 잔전류를 흘려보내 깔끔한 스위치 제어를 하게 해 줍니다.

  이번 강좌에서 말씀드릴 바운싱 현상은 플로팅 현상과 다르게 스위치를 누르는 순간의 불규칙한 전압 상태를 뜻합니다. 플로팅은 스위치를 작동 후 남은 잔전류에 의한 것이라면 바운싱은 스위치를 누르는 과정에서 두 접점이 가까워지는 과정에 전기적 인력 등 여러 요인에 의해 요동치는 상태를 뜻합니다.

  바운싱 현상을 해결하기 위한 디바운싱 현상은 간단한 원리로 작동됩니다. 풀업/풀다운 저항처럼 하드웨어적으로 해결하는 것이 아닌, 소프트웨어상으로 스위치를 누른 후 일정 시간 후 다시 스위치의 상태를 점검하여 실제로 스위치를 작동한 것인지, 바운싱에 의해 잘못 처리된 입력인지 확인하게 됩니다.

  따라서, 본 강좌의 경우 새로운 코드를 알려드리기보다는 기존에 알려드린 코드를 응용하여 제작된 디바운싱 코드를 알려드립니다. 필자는 본 강좌의 경우 코드를 일일이 해석하여 분석하는 능력을 키우는 기회가 되었으면 합니다. 

준비물 ( 아두이노와 PC는 기본입니다 )

10k 저항, 브레드보드, 점퍼케이블, 푸시버튼

회로도

이전 강좌와 같은 회로입니다.
참고 : http://gucciheon.blogspot.kr/2018/03/10.html

코드설명 

  이번 소스 설명은 이전 강좌들에서 알려드린 소스들로 응용된 강좌입니다.

  일반적으로 디바운싱을 위한 코드로 delay()를 사용하여 지연을 주고 스위치의 상태를 확인하는 경우도 있지만, delay()를 사용하게 되면 전체 코드의 작동이 일시적으로 중단됩니다. 그래서 지난 강좌에서 알려드린 millis()를 사용하여 일정 시간간격으로 스위치를 제어합니다.
millis() 참고 : http://gucciheon.blogspot.kr/2018/03/9-delay-led.html

  디바운싱 코드는 이전 강좌를 읽어보신 분이라면 충분히 직접 작성해보실 수 있습니다.

  아래 아두이노 공식 홈페이지에서 제공하는 예제 소스는 ledState , buttonState(=reading) , lastButtonState , lastDebounceTime , debounceDelay 라는 변수들을 생성하여 millis()와 함께 스위치를 제어합니다. ledState로 현재 LED의 출력을 제어합니다. buttonState로는 버튼이 장착된 핀의 입력 값을 저장합니다. lastButtonState는 현재의 버튼 입력값과 기존 버튼 입력값을 비교해서 바운싱 현상을 체크하는 기준으로 사용됩니다. 이렇게 버튼 입력값을을 비교하는 시간간격을 설정하기 위해 debounceDelay 변수를 사용하고 마지막으로 버튼의 입력값이 바뀐 시점을 lastDebounceTime으로 지정하여 millis()에서 lastDebounceTime의 값을 뺸 것이 debounceDelay보다 크면 버튼의 상태를 재확인하게 됩니다.

말로 설명하니 어렵지요?..ㅎㅎ
코드를 보며 한줄한줄 해석을 시작해 보세요!

/*
 Debounce

 Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
 press), the output pin is toggled from LOW to HIGH or HIGH to LOW.  There's
 a minimum delay between toggles to debounce the circuit (i.e. to ignore
 noise).

 The circuit:

 * Note: On most Arduino boards, there is already an LED on the board
 connected to pin 13, so you don't need any extra components for this example.

 * LED attached from pin 13 to ground
 * pushbutton attached from pin 2 to +5V
 * 10K resistor attached from pin 2 to ground

 created 21 November 2006
 by David A. Mellis
 modified 30 Aug 2011
 by Limor Fried
 modified 28 Dec 2012
 by Mike Walters
 modified 30 Aug 2016
 by Arturo Guadalupi


 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Debounce
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;    // the number of the pushbutton pin
const int ledPin = 13;      // the number of the LED pin

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH),  and you've waited
  // long enough since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // whatever the reading is at, it's been there for longer
    // than the debounce delay, so take it as the actual current state:

        ledState = !ledState;
      }
    }
  }

  // set the LED:
  digitalWrite(ledPin, ledState);

  // save the reading.  Next time through the loop,
  // it'll be the lastButtonState:
  lastButtonState = reading;
}

[강좌] 10. 아두이노에서 푸시버튼 사용하기


무작정 보고 따라하며 배우는 아두이노 강좌입니다.
아두이노 공식 사이트에서 제공하는 강좌를 바탕으로 작성되었습니다.
해당 게시글은 Arduino UNO 보드를 기준으로 작성되었습니다.

10. 푸시버튼 사용하기


아두이노에서 버튼은 빠질 수 없는 존재입니다.
  버튼을 통해 아두이노에 입력을 주어 하드웨어와 소프트웨어를 잇는 다리 역할을 합니다. 시리얼 모니터와 같은 방법으로 아두이노에 입력을 주는 방법이 있지만, 푸쉬버튼을 사용하면 아두이노와 pc가 연결되어 있지 않더라도 외부의 물리적인 힘으로 프로그램을 제어할 수 있게 됩니다.
  기본적으로 푸쉬버튼을 제어하는 방법을 알아야, 그를 기반으로 다른 제어장치를 쉽게 사용할 수 있습니다. 이번 강좌에서는 푸쉬버튼으로 아두이노의 내장 LED를 제어하는 방법을 알려드리겠습니다.

  푸쉬버튼이나 스위치는 눌렀을 경우 두개의 접점을 이어주는 역할을 합니다. 푸시버튼의 한쪽 단자에 전압을 걸어주고 다른 단자에 아두이노에서 신호를 읽어올 수 있는 디지털 단자를 연결한다면, 푸시버튼을 누르는 경우 디지털단자로 전압이 들어가게 되어 이를 아두이노에서 읽어와 스위치 상태를 판단합니다.

준비물 ( 아두이노와 PC는 기본입니다 )

10k 저항, 브레드보드, 점퍼케이블, 푸시버튼

회로도

  보드와 3개의 선을 연결합니다. 먼저 전원을 브레드보드에 연결해 줍니다. 브레드보드 양 옆의 전원선에 아두이노 5V와 GND를 연결합니다. 다른 선 하나는 아두이노의 2번핀 (디지털 핀)과 푸쉬버튼의 한쪽을 연결합니다.
  브레드보드에서 스위치에 아두이노 2번핀이 연결된 곳과 같은곳에 10k 풀다운 저항을 설치해야 합니다. 풀다운 저항에 대해서는 다른 강좌에서 설명하도록 하고, 디지털 단자와 같은 단자에 10k옴 풀다운 저항과 GND를 연결합니다. 스위치의 다른 단자는 5V 전원과 연결합니다.

  푸시버튼을 누르지 않는 일반적인 상태라면, 2번핀은 10k 저항과 GND에 연결되게 됩니다. 이는 아두이노에서 LOW 상태로 인식하고, 푸시버튼을 누르게 되면 2번핀에는 5V의 전압이 들어가게 됩니다. 이를 HIGH 상태로 인식하게 됩니다.

  이 회로를 정반대로 설치하여 풀업저항과 5V를 연결하게 되면, 버시버튼을 누르지 않았을때 HIGH 눌렀을 때 LOW 상태를 나타냅니다.

  만약 2번핀을 아무것도 연결하지 않고 내버려 둔다면, LED는 켜지고 꺼짐을 반복할 것입니다. 2번핀의 입력이 불안정한 플로팅 상태가 되기 때문입니다. 이런 플로팅을 해결하기위해 풀다운, 풀업 저항을 사용합니다.


코드설명 


먼저 소스 제일 위에 const int로 각각 핀번호를 지정해주는 변수를 작성합니다.
버튼의 입력을 받을 핀을 2번핀으로 지정하고, 제어할 LED 핀을 13번으로 지정합니다. 아두이노 우노의 경우 13번 핀은 내장 LED와 연결되어 있습니다.

 const int buttonPin = 2; 
 const int ledPin = 13; 

버튼의 입력상태를 지정하는 변수를 작성합니다. 이 값은 버튼의 입력에 따라 변경되어야 하기에 변경하지 않는 const를 사용하지 않습니다.

 int buttonState = 0; 

setup()구문에서는 ledPinbuttonPin의 모드를 설정해줍니다. ledPin의 경우 출력모드, buttonPin의 경우 입력모드로 설정합니다.

 pinMode( ledPin, OUTPUT ); 
 pinMode( buttonPin, INPUT); 

loop()구문 내에서는 간단한 코드가 입력됩니다. 먼저, buttonStatedigitalRead()를 통해 읽어옵니다.

 buttonState = digitalRead(buttonPin); 

버튼의 상태를 읽어온 후, 해당 버튼의 상태에 따라 ledPin에 어떤 출력을 할지 결정하는 if문을 추가합니다.

 if ( buttonState == HIGH ) { 
//만약 buttonState가 HIGH라면
     digitalWrite(ledPin, HIGH); 
//ledPin의 출력을 HIGH
 } else { 
//그게 아니라면
     digitalWrite(ledPin, LOW); 
//ledPin의 출력을 LOW

/*
  Button

 Turns on and off a light emitting diode(LED) connected to digital
 pin 13, when pressing a pushbutton attached to pin 2.


 The circuit:
 * LED attached from pin 13 to ground
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground

 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.


 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

[강좌] 9. 아두이노에서 delay 없이 LED 깜빡이기


무작정 보고 따라하며 배우는 아두이노 강좌입니다.
아두이노 공식 사이트에서 제공하는 강좌를 바탕으로 작성되었습니다.
해당 게시글은 Arduino UNO 보드를 기준으로 작성되었습니다.

9. delay 없이 LED 깜빡이기


- millis() 사용하여 LED 제어하기

  때때로 아두이노 코딩을 하다보면, 두가지 일을 작동시켜야 할 때가 있습니다. 이런 경우 delay()를 사용하면 코드 전체가 일시정지 되기 때문에 두가지 일을 한번에 할 수가 없습니다. 예를 들어, delay()를 사용하여 LED를 깜빡이는 작업을 하는 도중 버튼의 입력을 받아야 하는 경우가 생기면, 버튼을 눌렀을때 delay()가 발효된 상태라면 버튼의 입력을 읽어올 수 없습니다. 
  본 강좌에서는, delay()를 사용하지 않고 LED를 깜빡이는 방법을 알려드립니다. 이 방법은, LED를 시간에 흐름에 따라 키고 끄는 방식입니다. 그리고, loop() 함수 내에서 마지막 LED 제어 후 흐른 시간을 확인하여 LED를 제어하는 방법입니다. 이 방법을 사용하면 LED 제어를 별다른 지연없이 할 수 있게 됩니다.

준비물 ( 아두이노와 PC는 기본입니다 )

브레드보드, 점퍼케이블, LED, 220옴 저항

회로도

회로는 비교적 간단합니다. 위 회로처럼 외장 LED를 사용하지 않더라도, 아두이노의 내장 LED (13번핀)을 사용하면 LED의 깜빡임을 확인할 수 있습니다.

코드설명 

아래 코드는  millis() 를 사용합니다. 이 함수의 기능은 아두이노에 전원이 공급된 순간부터, 현재까지의 경과시간을 millisecond 단위로 알려줍니다.

먼저,  const int 를  setup() 보다 위에 작성하여 전역변수로 설정해 줍니다. 아래 코드에서는  int 만 사용해도 되지만,  const int 를 사용하는 이유는  const 의 경우 값이 변하지 않게 됩니다.  아래 코드에서는  ledPin 을  LED_BUILTIN 으로 지정했습니다.  LED_BUILTIN 으로 사용하면 보드에 따른 내장 LED 핀을 잡아줍니다. 내장 LED를 사용하지 않고 다른 핀에 연결한 외장 LED를 사용할 것이라면,  LED_BUILTIN 자리에 사용하는 핀 번호를 입력해주면 됩니다.

 const int ledPin = 핀번호; 

LED의 상태를 미리 지정해줍니다. 이후 LED의 상태를 제어하기 위해 변수로 지정합니다. 취향에 따라 HIGH 상태로 시작해도 무관합니다.

 int ledState = LOW; 

 millis() 를 사용하여 LED를 제어하기 위해 두번의 시간 체크가 필요합니다. 마지막으로 LED를 제어한 시간, 현재의 시간을 확인해야합니다. 마지막으로 제어한 LED의 시간을 저장하기위해 변수를 하나 지정해 줍니다.  millis() 의 값은 엄청나게 증가하기 때문에 약 42억까지 저장이 가능한 변수인  unsigned long 을 사용해줍니다.

 unsigned long previousMillis = 0; 

LED를 제어할 시간간격을 지정해 줍니다. 기존  delay() 를 사용하는 코드에서는  delay() 의 값을 지정해주는 것과 같습니다.  loop() 내에서 현재시간과 과거시간을 비교할 때 기준으로 사용합니다.  millis() 의 값과 비교하기 때문에  interval 의 단위를 똑같이  millisecond 로 지정해 줍니다.

 const long interval = 1000; 

 loop() 구문 내에서는 현재 시간을 나타내는 변수를 추가하여 현재시간/ 이전시간의 비교를 편하게 합니다. 마찬가지로 변수의 값이 매우 커질 수 있어  unsigned long 변수로 지정해 줍니다.

 unsigned long currentMillis = millis(); 

이후  previousMillis 와  currentMillis 의 차를 구하여 그 차가  interval 이상이 된다면,  previousMillis 를  currentMillis 와 같게하고 LED의 현 상태를 알아와서 HIGH면 LOW로 LOW면 HIGH로  digitalWrite() 해줍니다.

/* Blink without Delay

 Turns on and off a light emitting diode (LED) connected to a digital
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.

 The circuit:
 * Use the onboard LED.
 * Note: Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO 
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino model, check
  the Technical Specs of your board  at https://www.arduino.cc/en/Main/Products

 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen
 modified 11 Nov 2013
 by Scott Fitzgerald
 modified 9 Jan 2017
 by Arturo Guadalupi


 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */

// constants won't change. Used here to set a pin number :
const int ledPin =  LED_BUILTIN;// the number of the LED pin

// Variables will change :
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change :
const long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the
  // difference between the current time and last time you blinked
  // the LED is bigger than the interval at which you want to
  // blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

[강좌] 8. 아두이노에서 전압 측정하기


무작정 보고 따라하며 배우는 아두이노 강좌입니다.
아두이노 공식 사이트에서 제공하는 강좌를 바탕으로 작성되었습니다.
해당 게시글은 Arduino UNO 보드를 기준으로 작성되었습니다.



7. 아두이노에서 전압 측정하기


- 5V 이하의 전압 아날로그 입력으로 측정하기

본 강좌에서는 아두이노의 Analog Pin 0 를 이용하여 analogRead()로 읽어온 값을 전압으로 변환하고, 아두이노 시리얼 모니터에 전압을 띄워줍니다. 단, 아두이노에서는 5V 이상의 전압이 입력되면 회로가 타버릴 수 있습니다. 5V 이상의 경우 분압저항을 이용하여 회로를 구성한 후 아두이노로 입력될 전압의 범위를 0~5V 이내로 하여 연결해 줍니다.

  해당 강좌에서는 외부 전압을 따로 측정하지 않고 아두이노에서 출력하는 5V에 가변저항을 달아 전압을 변경시켜 그 값을 아날로그로 읽어옵니다.

준비물 ( 아두이노와 PC는 기본입니다 )

10k 옴 가변저항, 브레드보드, 점퍼케이블

회로도

먼저, 10k 가변저항의 핀 3개 중 바깥쪽 핀 한개에 GND를 연결해 줍니다. 그 반대쪽 끝 핀에는 아두이노의 5V와 연결해 줍니다. 마지막으로 가변저항의 가운데 핀은 아두이노의 아날로그 0번핀과 연결해 줍니다.

가변저항을 돌리게 된다면 가변저항의 저항값이 변경되게 되고, 이로인해 가운데 핀의 전압이 변경되게 됩니다.

아두이노와 같은 마이크로컨트롤러에는 아날로그-디지털 변환기 ( ADC , analog-to-digital converter )가 내장되어 있습니다. 이 회로를 통해 변화하는 전압을 0에서 1023의 디지털 값으로 변환해 줍니다. 쉽게말해, 가변저항을 통해 변경되는 전압을 아두이노의 analogRead()로 변경하게 됩니다. 0V는 analogRead()의 0 5V는 analogRead()의 1023으로 변환됩니다.

코드 설명

아래 코드에서 가장 먼저, 아두이노와 컴퓨터의 통신 설정을 해야 합니다. 일반적으로 초당 9600비트의 정보를 전송합니다.

 setup() 함수 내의  Serial.begin(9600); 으로 설정합니다.

다음으로 loop()함수 내에서 아날로그 입력을 받은 값을 편하게 사용할 수 있도록 변수로 지정해 줍니다. 0~1023의 값을 사용할 변수로는 int 로 지정해줍니다.

 int sensorValue = analogRead(A0); 

0-1023 까지의 값들을 0-5V의 값으로 변환하기 위해 float 으로 새로 변수를 하나 만들어주고, 약간의 계산식을 추가합니다. float 변수를 사용하며 값을 소수점까지 띄울 수 있습니다. voltage5를 1023으로 나눈 값에 sensorValue를 곱한 값으로 지정합니다.

 float voltage = sensorValue * (5.0 / 1023.0); 

마지막으로 계산된 voltage 값을 시리얼 윈도우로 띄워줍니다. 이전 강좌에서 있던 Serial.println()를 마지막에 추가하여 사용합니다.

 Serial.println(voltage); 

이렇게 구성된 코드를 작동하면, 아두이노를 키고나서 시리얼 모니터를 키게 된다면 모니터에 voltage의 값이 매 줄마다 뜨게 됩니다. 가변저항을 돌리게 된다면, 시리얼 모니터의 값도 실시간으로 변경되게 됩니다.


/*
  ReadAnalogVoltage
  Reads an analog input on pin 0, converts it to voltage, and prints the result to the serial monitor.
  Graphical representation is available using serial plotter (Tools > Serial Plotter menu)
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

  This example code is in the public domain.
*/

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
}

[강좌] 7. 아두이노에서 LED 밝기 조절하기


무작정 보고 따라하며 배우는 아두이노 강좌입니다.
아두이노 공식 사이트에서 제공하는 강좌를 바탕으로 작성되었습니다.
해당 게시글은 Arduino UNO 보드를 기준으로 작성되었습니다.



7. 아두이노에서 LED 밝기 조절


- LED 서서히 밝아지고 서서히 어두워지게 하기

지난 강좌 중에서 아두이노의 내장 LED를 디지털 제어를 통해 키고 끄는 것을 해봤습니다.
이번 강좌에서는 아두이노에서 외장 LED를 연결하여 아날로그 제어를 통해 LED를 서서히 밝아지고 서서히 어두워지게 하는법을 알려드리겠습니다.

지난번의 디지털 신호는 0과 1로 구성된 즉, 전압히 HIGH LOW 두가지 상태이지만 LED의 밝기를 조절하기 위해서는 전압을 다양하게 조절해야합니다. 아두이노에서는 아날로그 출력을 지원하는데, 0에서 255까지의 값을 출력할 수 있습니다. HIGH와 LOW의 상태를 256 단계로 나눠서 출력합니다.

이 아날로그 출력을 PWM 제어라고 하는데, 아쉽게도 아두이노의 모든 핀에서 PWM 출력이 가능한 것이 아니라 일부분의 핀에서만 ( 아두이노에서 핀 번호 앞에 ~ 표시가 된 것) 출력이 가능합니다.

이번에는 내장 LED를 사용하지 않고 외장 LED를 사용한다고 하였는데, 아두이노 우노의 내장 LED의 핀은 13번 핀이고, 13번 핀은 PWM 제어가 불가능하여 브레드 보드를 이용하여 아두이노 외부에 LED를 연결해줘야 합니다.

준비물 ( 아두이노와 PC는 기본입니다 )

브레드보드, 점퍼케이블, LED, 220옴 저항

회로도

아두이노 우노 외 다른 보드를 사용할 경우 아래의 회로도를 보고 직접 배선하시면 됩니다.



위 회로도를 바탕으로 아두이노 우노 기준 브레드보드에 연결하는 예시입니다.


코드 설명

9번 핀을  ledPin 으로 선언합니다.
전역 변수로 제일 윗 부분에  ledPin 을 선언 후에는  setup() 함수 내에  ledPin 을 출력핀으로 지정하는 것 외에는 별다른 코드가 필요없습니다.

 analogWrite() 는 메인  loop() 함수에서 사용됩니다.  analogWrite(핀번호, 값) 의 형태로 사용합니다. 핀번호에는 출력할 핀, 값에는 PWM 제어값을 입력하면 됩니다.

LED를 서서히 제어하기 위해서는 PWM 값을 0부터 255까지 입력하여 제어하면 됩니다.
0은 보통 LOW상태 255는 HIGH 상태를 뜻합니다. LED가 켜지고 꺼지는걸 반복하려면 0에서 255, 다시 255에서 0으로 반복하는 코드를 작성하면 됩니다.

아래 코드에서는 PWM 값이  brightness 라고 지정되어 있습니다. 매번 반복하면서
 brightness 의 값은  fadeAmout 만큼 변화하게 됩니다.

만약  brightness 의 값이 0부터 255사이의 값을 넘어서면,  fadeAmout 의 값이 음수에서 양수로, 양수에서 음수로 변경되게 됩니다. 즉,  fadeAmout ( brightness의 변화량)이 5에서 255에 도달하면 -5로, -5에서 0에 도달하면 5로 변경됩니다.

 analogWrite() 는 PWM 값을 매우 빠르게 변화시킬 수 있습니다, 따라서 코드 하단의 지연 명령어를 조절하여 led의 밝기 변화 속도를 조절할 수 있습니다.

지연 명령어나 PWM 값을 제어하여 LED 밝기 변화 속도를 제어해 보세요!

지연 시간을 조절하여 LED를 더 빠르게 제어하면 부드럽고 빠른 밝기제어가 가능합니다.
 fadeAmount 의 값을 조절하면 LED의 밝기 제어가 부드럽게 변화하기보다는 단계별로 변화하게 됩니다.

/*
 Fade

 This example shows how to fade an LED on pin 9
 using the analogWrite() function.

 The analogWrite() function uses PWM, so if
 you want to change the pin you're using, be
 sure to use another PWM capable pin. On most
 Arduino, the PWM pins are identified with 
 a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.

 This example code is in the public domain.
 */

int led = 9;           // LED가 장착된 PWM 제어 핀
int brightness = 0;    // 초기 LED의 밝기
int fadeAmount = 5;    // LED 밝기의 변화량

// 아두이노 시작/재시작시 작동되는 코드:
void setup() {
  // led핀(9번핀)을 출력으로 선언:
  pinMode(led, OUTPUT);
}

// 계속 실행되는 코드:
void loop() {
  // led핀의 밝기 brightness 출력:
  analogWrite(led, brightness);

  // 한바퀴 돌고 다음 반복때의 brightness 값을 변경시키는 식:
  brightness = brightness + fadeAmount;

  // brightness의 값이 끝에 이르면 fadeAmount의 부호 변경:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // 30밀리초 지연
  delay(30);
}

위 코드를 업로드하고 작동시켜보면 LED가 서서히 밝아지고 어두워지는것을 계속 반복한다면 정상적으로 작동하는 것입니다!


아두이노 공식 사이트 강좌 원문 링크 :
https://www.arduino.cc/en/Tutorial/Fade