이번에는 가변저항을 이용하여 변화되는 전압을 측정하고, 변화하는 값에 따라서 LED밝기를 변화하도록 하는 기능을 만들어 보도록 하겠습니다.
가변저항같은 변화하는 부품의 전압값을 읽어내기 위해서는 아두이노의 아날로그 인(ANALOG IN) 단자를 사용하여 읽을 수 있습니다. 아날로그 인은 UNO R3기준으로 A0~A5까지 6개의 단자를 지원합니다.
가변저항은 리드(다리)가 총 3개입니다. 하나는 그라운드에 연결하고, 하나는 전원 여기서는 5V전원에 연결합니다. 그리고 나머지 가운데 다리는 아날로그 인에 연결하여 값을 읽어냅니다.
LED는 3,4편에서 사용했던데로 별도의 저항없이 연결하였습니다.
1. 하드웨어 구현
아날로그 인 부분과 디지털 부가 양쪽으로 나뉘어 있어서 두부분을 브레드보드 2개로 각각 표현하였습니다. 실제로 구현시에는 그럴 필요는 없습니다.;;
자 더 간단한 스케메틱을 보도록 합니다.
요렇게 간단히 하드웨어 구성을 살펴보았습니다.
2. 소프트웨어 구현
소프트웨어도 어려울 것이 없습니다.
단순히 가변저항의 변화된 저항값을 읽어서 LED에 적용하기만 하면 됩니다.
/** * 가변저항의 값을 읽어서 LED등에 적용하는 예제 * * 가변저항은 아날로그 신호로 변화하므로 아날로그 인풋을 이용하고 * LED는 디지털신호의 PWM(PowerWithModulation)을 사용하여 * 전압을 반영하도록 한다. * * @auth dante2k@gmail.com * @since 2015-08-09 */ const int LED = 11; // LED 핀번호 const int VR = A0; // 가변저항 void setup() { // Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(VR, INPUT); } void loop() { int pm = analogRead(VR); // Serial.println("Potentiometer = " + String(pm)); // delay(10); analogWrite(LED, map(pm, 0, 1023, 0, 255)); }
setup() 에서는 LED가 연결된 핀을 출력으로 설정합니다. 가변저항은 아날로그에 연결하였으니 아날로그에 연결된 A0 핀을 INPUT 상태로 설정합니다.
loop()에서는 실제 어떤 식으로 사용하는지 보는 부분입니다.
중요한 점은 아날로그 인 단자에서 읽어내는 값의 크기는 전압수치를 0~5V까지의 값을 0~1023까지의 숫자로 출력해준다는 것이 중요한 점입니다. 위의 소스에서 pm 이라는 변수에는 0~1023까지의 숫자가 asign 되는 거죠.
그러면 LED에는 어떤 범위의 숫자를 출력할 수 있나면, 디지털단자에는 0~255까지의 숫자를 출력할 수 있습니다. 이런 읽어낸 수치와 출력해야하는 수치를 서로 알맞게 변환해주어야 하는데 항상 그런 것을 걱정할 것이 없습니다. 왜냐하면 이미 그런 메소드는 구현되어 있으니까요!! map() 메소드를 arduino.cc 의 reference 페이지를 확인해보면 자세한 내용을 볼 수 있습니다.
위의 소스를 예로 들면, 가변저항은 0~1023까지의 숫자로 READ 되고, LED에는 0~255의 숫자로 WRITE을 해주어야 합니다. 그래서 map(pm, 0, 1023, 0, 255) 라는 메소드를 사용한 것 입니다. 예를 들어서 pm이 0이면 LED에 출력할 수치로 0이 자동 계산되어 나오고, pm 이 대략 512 정도의 수치가 나온다면 LED쪽의 수치로 125정도의 수치가 자동계산된다는 의미입니다.
이같이 LED쪽으로 출력할 수치를 계산하였으니 analogWrite()메소드를 사용하여 LED가 연결된 단자로 신호를 보냅니다. 이전과는 다르게 digitalWrite를 사용하지 않고, analogWrite를 사용하는데요. 이는 PWM(Power with Modulation)기능을 사용하여 디지털 단자에서도 아날로그 출력을 흉내낼 수 있기때문입니다. PWM의 자세한 내용은 구글링해보시기 바랍니다. 간단히 말해서 펄스로 이루어진 디지털 신호에서 신호간격을 이용해서 전압을 낮추거나 높이는 효과를 표현하는 방식이 PWM입니다.
기존에 LED를 켤때 사용한 digitalWrite()의 경우는 LOW, HIGH만 존재했지만, analogWrite() 메소드는 0~255까지의 수치를 사용할 수 있습니다.
위의 소스코드를 컴파일하여 업로드하면 가변저항을 돌리면 LED가 점점 밝아지거나 어두어지는 것을 확인할 수 있습니다.
끝.