본문 바로가기

Electronics

아두이노 기초강좌 3



오늘은 아두이노를 쓰는 근본적인 이유라고나 할까? 그 이유를 체감할 수 있는 것을 만들어 보기로 한다. 아두이노를 이용해서 세상과 반응 하는 기계를 만드는 것이다. 말은 거창하지만 별거 아니다. 단지 빛에 반응해서 LED를 끄고 켜는 것을 만들어 보는 것이다.

세상과 반응하려면 세상을 읽어야 한다. 기계도 오감을 가질 수 있을까? 사람 처럼은 힘들어도 어느 정도는 가능하다. 빛센서를 이용해서 밝기를 감지할 수도 있고, 카메라를 달면 사물의 모양도 감지 할 수 있지만 아두이노는 카메라신호에서 웃는 얼굴을 구분하는 프로그램을 돌리기에는 좀 벅차다. 그런건 컴퓨터를 이용해서 해야하고 프로그래밍도 좀 어렵다. 그러나 게임기 Wii의 리모콘에 달려있는 적외선카메라는 아두이노에도 붙여서 적외선의 점의 좌표를 전달 해 줄 수 있다.

소리는 마이크로 들을 수 있고, 압력 센서나 정전기 센서로 촉각도 가질 수 있고, 온도계를 달면 온도를 감지 할 수 있으며, 냄새는 가스감지 센서 같은걸로 특정한 가스는 감지 할 수 있지만 사람 처럼 다양한 냄새를 구분하는건 힘들다. 연구실 수준에서는 가능한것도 같지만 일반인이 사서 쓰기는 힘들다. 맛을 보는 것은 냄새보다 더 어려운 것 같다.
전정기관이나 반고리관이 하는 일도 할 수 있다. 가속도 센서로는 기울기와 가속을 감지 할 수 있고, 자이로 센서로 회전을 감지 할 수 도 있다.

그리고 아두이노는 사람의 오감으로는 감지 할 수 없는, GPS신호를 받아 야외에서는 지구상에서의 위치도 파악 할수도 있고, 기압계를 달면 기압을 잴 수도 있고, 홀센서라는걸 쓰면 자기장도 감지 할 수 있고, 역시 자기장을 감지하는 나침반 센서를 이용해서 방향도 알 수 있다. 

세상과 교감하는 방법은 과학 기술적 지식과 창의력만 있으면 얼마든지 만들어 낼 수 도 있다. 흙의 습도에 따른 전기 전도도의 차이를 이용하면 화분의 흙이 얼마나 말랐는지를 감지할 수도 있다. 솔직히 새로 만드는 것까지는 바라지 않는다. 사람들이 이미 만들어서 인터넷에 올려 놓은 걸 잘 찾아내기만 해도 무궁무진하다는 것만 말하고 싶다.

오늘은 여러가지 빛 센서중에 Cds라고 불리는 것을 써보겠다. 황화카드뮴이라는 물질의 전기 전도도가 빛에 따라서 바뀌는 것을 이용한 센서로 알고 있다. 다시 말하면 빛에 따라서 저항값이 달라지는 센서인 것이다. 저항 처럼 단자가 두개 나와있다. 

회로는 아래와 같이 꾸며준다. 아날로그 포트5번에 센서와 10K오옴(갈색 흑색 주황색 은회색 띠) 저항을 사진처럼 브레드보드의 가로줄 구멍에 함께 꽂아서 넣어 주고 센서는 아두이노보드의 +(5V,빨간전선)에 저항은 - (GND,까만전선)에 연결한다. 이렇게 하면 아날로그 포트에 센서의 저항값의 변화에 따라  다른 값의 전압이 입력된다. 저항을 회로처럼 쓰지 않고 센서를 직접 +에 연결하면 전류값이 높아질 수 있어서 아두이노의 칩이 타버릴 수도 있다. 이보드에는 LED는 13반 포트에 아예 납땜되어 있다. 참고로 이 아두이노는 moderndevice라는 곳에서 파는 RBBB라는 복제보드이다. 



코드는 아래와 같다.
int sensorPin = 5;
int ledPin = 13;
int val = 0;

void setup()
{
pinMode(ledPin, OUTPUT);
}
 void loop()
{
   val = analogRead(sensorPin);
   if (val > 500)
      {
       digitalWrite(ledPin, HIGH);
      }
   else  
      {
       digitalWrite(ledPin, LOW);
      } 
}   

int sensorPin = 5; 는 아날로그 포트 5번을 센서로 쓰겠다는 것이고, 
int ledPin = 13; 는 디지털 포트 13번은 LED 출력으로 지정한 것이다.
처음 보는 명령어로 analogRead가 있다. 말그대로 아날로그 신호를 읽고 쓰는 명령어 되겠다. 웃긴건 출력포트는 setup()에서 pinMode를 써서 OUTPUT으로 지정을 해주는데, 입력은 해주질 않았다. 그러면 입력은 다 안해도 되는건가? 그런게 아니다. 디지털 입력은 INPUT이라고 지정해줘야한다. 아날로그 입력의 경우에만  pinMode로 지정해주지 않아도 되는 것이었다. 왜 그런지는 나도 모른다 --;; 

그리고 if문도 처음 나온다. 프로그래밍을 해본 사람은 쉽겠지만, 안해봤어도 눈치로 대충 때려잡을 수 있는 수준의 코드가 아닌가 싶다. 만약(if) val 값이 500보다 크면 LED 켜고 아니면(else) LED를 끈다는 말이다. 조건문은 소괄호안에 넣고, 중괄호로 각각의 경우에 실행할 문장을 감싸준다는 것도 눈치챘을 것이다. else이하의 문장을 생략할 수도 있다. 그런경우가 바로 정치인들이 많이 쓰는 '아니면 말고'와 같은 식의 코드가 되겠다. else가 있다면 '아니면 요렇게'라는 뒷감당까지 해주는 친절한 코드가 되는 것이다. 

val은 변수라고 하는 것으로 프로그래머가 임의로 정하는 데이타 저장소와 같은 것이다. 프로그램 윗부분에 int val = 0; 이라고 선언을 해줄때 생겨난 놈으로써 아날로그입력 값을 저장하고 또 써먹기 위해서 만든 것이다.

아날로그입력은 입력신호가 0V 일때는 0, 5v일때는 1023의 값을 가지는 아날로그를 디지털로 바꿔주는 변환기(ADC; Aanlog to Digital Converter)이다. 위의 if 문에서 판단의 근거로 사용한 500은 약 2.4v가 된다. 하지만 그것은 내 방의 조도에 맞춘 것이기 때문에, 이 물건을 쓸 곳의 밝기 변화에 맞추어 값을 변화 시켜주어야 한다.

어두웠다가 덜 어두웠다가 하는 정도의 밝기 변화인지, 밝았다가 아주 밝았다가 하는 밝기 변화인지에 따라 저 500이라는 값이 달라져야 한다는 말이다. 근데 그걸 어떻게 알아내는가? 그건 다음시간에 알아보기로 하겠다.

'Electronics' 카테고리의 다른 글

아두이노 기초강좌 5  (36) 2010.06.22
아두이노 기초강좌 4  (15) 2010.05.11
아두이노 기초강좌 2  (34) 2010.04.14
아두이노 기초 강좌 1  (36) 2010.04.07
꽃보다 남자? 물감보다 아두이노!  (15) 2010.03.30