본문 바로가기

Electronics

아두이노로 만드는 로봇 Blinky 2편

요즘 무규칙이종결합공작소 용도변경에서는 아두이노를 이용해서 만드는 로봇 Blinky를 만들면서 아두이노를 공부해보는 워크샵을 진행중이다.  지난 1편에서는 빛 센서를 이용해서 어둠을 감지하면 눈에 있는 LED를 켜주는 방법을 알아봤다. 이번에는 LED를 그냥 켜는게 아니라 서서히 밝아지도록 했다가 서서히 어두워 지도록 하는 것을 구현해보도록 하겠다.

지난번에는 digitalWrite 명령을 써서 LED를 켜고 껐었다. digitalWrite는 최고 밝기로 켜거나 아니면 끄는 것 밖엔 할 수 없다. 그래서 서서히 켜지도록 하려면 밝기를 제어해야 하는데 그때 쓰는 명령이 analogWrite명령이다.  analogRead도  A0부터 A5까지 여섯개의 핀에서만 가능하듯이 analogWrite도 특정 핀에서만 가능한 명령이다. 아두이노 사이트에서 pin mapping을 검색하면 각 핀의 기능이 표시되어 있는 아래와 같은 그림이 나온다. 


 
위 그림에서 빨간색글씨로 쓴 것이 아두이노의 핀번호와 기능이다. 그 중에 괄호 안에 PWM이라고 써 있는 3,5,6,9,10,11 번이 아날로그로 출력을 할 수 있는 핀들이다. 하지만 아날로그 출력은 아날로그 입력과 달리 256단계의 해상도 밖에 지원하지 않는다. 

analogWrite(leftEye, 100); 처럼 괄호안에 LED핀번호와 숫자를 넣는것으로 원하는 LED를 특정 밝기로 켤 수 있다. 100을 넣는 다면 5V의 100/256만큼 전압이 출력될 것이고,  그만큼의 비율의 밝기로 켜질 것이다. 255를 써 넣으면 최대 밝기가 되고 0을 써 넣으면 꺼진다.

하지만 서서히 밝기가 변하도록 하려면 analogWrite만으로는 충분하지 않다. 어떻게 해야될까? 핀이름 다음에 넣어줄 밝기를 나타내는 숫자를 점차 커지도록 설정한다면 서서히 밝기에 변화를 줄 수 있을 것이다. 점차 변화하는 숫자를 만들어내는 방법으로 아두이노에서는 for 문을 사용한다.

    for ( int  i = 0 ; i < 256 ; i++ ){     
      analogWrite(leftEye, i);
      analogWrite(rightEye, i);
    }
 
위 예제는 왼쪽 눈과 오른쪽눈의 LED의 밝기를 0에서 부터 255까지 1만큼 씩 점차 밝아지도록 하는 코드이다. for문의 형식은 for 다음에 오는 괄호안에 변화하는 값을 담을 변수를 하나 지정하고 그 변수 어떤 값부터 시작하여 어떤 값까지 얼마 만큼씩 증가할지 감소할지를 지정하는 형식으로 되어 있다.  
 
그러나 위의 코드는 실제로 실행시켜보면 그냥 켜지는 것처럼 보일것이다. for문의 실행속도가 엄청 빠르기 때문에 사람이 알아차리기 전에 최고 밝기에 도달해버리기 때문이다. 그래서 for 루프의 끝에 시간을 지체하도록 delay 문을 넣어주어야 천천히 밝아지는 모습을 볼 수 있다. delay문은 delay다음에 괄호를치고 숫자를 써 넣는 방법으로 사용하는데 1/1000초인 ms( 밀리초)단위로 값을 써 넣게 되어 있다. 1000을 넣으면 1초가 되고, 100을 넣으면 0.1초가 되는 것이다.

전체 코드는 다음과 같다.



int sensorPin = A0;
int leftEye = 5;
int rightEye = 6;
int sensorValue;

void setup() {
  Serial.begin(9600);
  pinMode(leftEye, OUTPUT);
  pinMode(rightEye, OUTPUT);

}

void loop() {

  sensorValue = analogRead(sensorPin);
  Serial.println(sensorValue);
  if (sensorValue > 900)
  {
    for (int i=0;i<256;i++){     
      analogWrite(leftEye,i);
      analogWrite(rightEye,i);
      delay(10);
    }
    for (int i=255;i>= 0;i--){     
      analogWrite(leftEye,i);
      analogWrite(rightEye,i);
      delay(10);
    }
    delay(200);
  }
  else
  {
    digitalWrite(leftEye, LOW);
    digitalWrite(rightEye, LOW);
  }
}

방안의 밝기가 어두워져서 빛감지 센서로부터 들어오는 아날로그 입력 값이  900을 넘게 되 양쪽눈의 LED를 점차 밝게 했다가 다시 점차 어둡게 하는 코드가 되겠다.