[아두이노 강좌] 08. 가변저항을 이용하여 아날로그 입력으로 LED 밝기 조절하기

본 게시물에서는 시리얼 모니터 프로그램을 이용하여 아날로그 입력값을 디스플레이하는 것을 설명한 후 가변저항을 사용하여 켜지는 LED 갯수를 제어하는 실험을 할 것입니다.

overview.jpg

실험

먼저 포텐셔미터라고 알려진 가변저항에 대한 간단한 실험을 하여 보겠습니다. 브레드보드에 아래와 같이 연결을 하십시오.

breadboard_1.jpg

아래의 스케치 파일을 아두이노에 업로드 하여보십시오.

  1. int potPin = 0;
  2. void setup()
  3. {
  4. Serial.begin(9600);
  5. }
  6. void loop()
  7. {
  8. int reading = analogRead(potPin);
  9. Serial.println(reading);
  10. delay(500);
  11. }

업로드가 끝났으면 시리얼 모니터를 열어 보십시오. 화면 숫자들이 나타나는 것을 볼수 있을 것입니다.

serial_monitor.jpg

가변저항에 달려 있는 손잡이를 돌려 보면 숫자들이 0~1023사이에서 변하는 것을 확인 할 수 있을 겁니다.

시리얼 모니터는 아두이노가 아래의 스케치코드를 실행하면서 A0로부터 읽어 들인 아날로그 값을 표시하고 있는 것입니다.

  1. int reading = analogRead(potPin);

A0의 전압은 0에서 1023의 숫자로 변환되어 전송이 됩니다.

가변저항 (포텐셔미터)

가변저항은 A0핀의 전압레벨을 변경시킬 수 있습니다. 이 변경된 전압은 스케치 코드에 의해 0~1023의 값으로 변환이 됩니다.

pot.png

포텐셔미터는 둥글게 생긴 트랙이 있는데 저항과 같은 역활을 합니다. 포텐셔미터가 일반 저항과 다른점은 슬라이더라 불리는 중간 연결입니다. 이 슬라이더는 포텐셔미터를 돌리면 같이 돌아가는데 5V쪽으로 돌리면 점차 5V가 되고, GND쪽으로 돌리면 0V가 됩니다.

브레드보드 레이아웃

그러면 이제 좀 더 재미있는 프로젝트를 진행하여 보겠습니다. 가변저항을 요리조리 돌리면 켜지는 LED의 갯수를 변경시키는 것입니다.

아래와 같이 부품을 셋업합니다.

breadboard_2.jpg

아두이노 코드

아래의 스케치를 아두이노에 업로드합니다.

  1. int potPin = 0;
  2. int latchPin = 5;
  3. int clockPin = 6;
  4. int dataPin = 4;
  5. int leds = 0;
  6. void setup()
  7. {
  8. pinMode(latchPin, OUTPUT);
  9. pinMode(dataPin, OUTPUT);
  10. pinMode(clockPin, OUTPUT);
  11. }
  12. void loop()
  13. {
  14. int reading = analogRead(potPin);
  15. int numLEDSLit = reading / 114; //1023 / 9
  16. leds = 0;
  17. for (int i = 0; i < numLEDSLit; i++)
  18. {
  19. bitSet(leds, i);
  20. }
  21. updateShiftRegister();
  22. }
  23. void updateShiftRegister()
  24. {
  25. digitalWrite(latchPin, LOW);
  26. shiftOut(dataPin, clockPin, LSBFIRST, leds);
  27. digitalWrite(latchPin, HIGH);
  28. }

코드가 상당부분 4번 강좌와 비슷합니다. 만약 코드가 잘 이해가 안되시는 부분이 있다면 이전의 강좌를 참고 바랍니다.

이 스케치의 핵심부분은 아날로그 핀을 정의하는 부분인데 이 아날로그 핀은 포센셔미터의 슬라이더와 연결되게 됩니다.

  1. int potPin = 0;

핀을 아날로그 입력으로 설정하기 위해 setup함수에 아무것도 넣지 않았다는 점을 유의하여 보십시오

메인 루프에서 아래와 같이 아날로그 값을 읽게 됩니다.

  1. int reading = analogRead(potPin);

읽은 아날로그 값은 0에서 1023 사이의 값입니다. 이 값들을 0에서 8의 9개의 LED에 해당하는 숫자로 변경하여 주어야 합니다. 그래서 읽은 값을 114로 나누어 줍니다.

  1. int numLEDSLit = reading / 114;

이제 LED를 원하는 숫자 만큼 켜주기 위해서 for loop안에서는 0에서 numLEDSLit까지 숫자를 카운트하면서 비트를 셋팅하게 됩니다.

  1. leds = 0;
  2. for (int i = 0; i < numLEDSLit; i++)
  3. {
  4. bitSet(leds, i);
  5. }

updateShiftRegister함수를 호출하여 shift register를 업데이트합니다.

  1. updateShiftRegister();

가치창조기술 | www.vctec.co.kr
Comments