본문 바로가기

Electronics

아두이노 기초강좌 2

지난번 아두이노 기초강좌1에서는 일단 LED를 켜고 끄는 간단한 코드를 살펴봤다. 아무리 간단해도 프로그램을 전혀 안해봤다면 적잖이 당황했을 것이다. 

모르는 프로그래밍 언어로된 코드를 처음 보고 가장 답답한것 중의 하나는, 어떤 것이 바꿀수 없는 명령어이고 어떤것이 바꿀수 있는 변수인지 구분이 어렵다는 것이다. 이런 의문 역시 프로그래밍을 좀 해본 사람이 가지는 궁금증일 것이다. 내가 프로그래밍을 처음 배울때를 최대한 기억해내면서 진행해보겠다. 

아무튼 오늘은 지난번의 예제 코드를 좀 더 들여다보면서 이것 저것을 바꿔보면서 어디를 얼마만큼 바꿀 수 있으며, 그럴때 뭐가 달라지는지를 설명해보기로 하겠다.



//LED blink example

int ledPin = 13;                              // 13번 핀을 ledPin이라고 이름지어 준다. ledPin이라는 정수형 
     // 변수의 선언이기도 하다.
void setup()                                    // 모든 아두이노 프로그램엔 void setup()이라는 함수가 들어가고, 
{                                                    // 처음 한번 만 실행되는 것들을 담고 있다.
  pinMode(ledPin,OUTPUT);              // 위에서 이름지어준 ledPin 이라는 포트를 OUTPUT출력으로
}                                                    // 지정한다.

void loop ()                                     //void loop()도 모든 아두이노 프로그램에 기본적으로 들어가는 것
{                                                    //으로써, 아두이노를 켜 놓는 동안 무한반복할 동작이 이 안에 들어
  digitalWrite(ledPin, HIGH);             //간다.  ledPin이라고 이름붙인 13번 핀에 전기를 줘서 불을 킨다.
  delay(1000);                                 // 그 상태 그대로 1000밀리 초(1초) 만큼 기다린다.
  digitalWrite(ledPin, LOW);              // ledPin에 전기를 끊어서 불을 끈다.
  delay(1000);                                 // 그 상태 그대로 1000밀리 초를 대기한다.
}      
       

// 처럼 슬래쉬 두개를 연달아 쓰면 그 뒤에 쓴 글씨는 코드를 설명해주기 위한 글로써, 나중에 자기가 보거나, 다른 사람이 보고 이해하기 쉽게 하기위해서 필요하다.  그리고 위의 코드처럼 좌우로 코드와 설명문들이 확연히 나뉘도록 줄을 맞춰 주는 것이 나중에 보기 쉽다. 안맞춰도 에러는 안난다.

맨 윗줄을 보자 

     int ledPin = 13; 

이 문장은 프로그래밍에서 변수를 선언한다고 보통 말하는 것에 해당한다. 아두이노에서는 이 변수선언이, 아두이노 보드의 단자, 그러니까 핀에 이름을 지어주는 것과 같다. 아두이노에는 디지털신호를 입력받거나 출력할 수 있는 핀이 13개가 있고 아날로그 신호를 입력하거나 출력할 수 있는 핀이 6개 있다.
 
그러니까 위 코드는 13번 핀을 ledPin 이라고 이름짓는다는 뜻이다. 왜 그냥 쓰지 이름을 따로 지어주냐고 묻는다면, 나도 별로 타당한 이유는 떠오르지 않는다. 그냥 숫자는 변수로 쓰지 않기로 정했기 때문이 아닐까 싶다. 프로그래밍은 그 언어를 만든 사람이 정한대로 따라야 에러없이 실행되는 것이지, 내 맘대로 한다면 그건 그냥 대화가 될 것이고 그 대화는 컴퓨터가 알아들을리가 만무하겠지. 

위의 코드에서 내 맘대로 바꿀 수 있는 것은 ledPin과 숫자 13이다. ledPin을 LEDpin이나 ledPort나  ledConnect 라고 바꿔도 상관 없다. 그러나 그 이후에 나오는 모든 ledPin도 똑같이 바꿔줘야 하는 것이다. 13은 1에서 부터 13사이의 아무 숫자로 바꿀 수 있다. 정확히는 아날로그 포트도 디지탈포트로 쓸 수 있기 때문에 13에 6개를 더해서 19개까지 디지탈포트로 쓸 수 있다. 여기서 포트나 핀은 같은 것을 말하니 고민하지 말기 바란다. 여자나 여성이나 같은 말인것과 같다. 
  
아래 사진에서 보면 보드의 윗쪽 까만색 단자에 숫자들이 매겨져 있는데 9 8 7 6 쯤 밑에 DIGITAL이라는 글씨가 보일 것이다. 오른쪽의 0부터 왼쪽의 13(마치 31처럼 보인다 --;)까지 디지탈포트라고 써 놓은거다


보드의 아래쪽을 보면 ANALOG IN 이라고 써 있고 그 밑에는 0 1 2 3 4 5 라고 숫자가 보인다. 그것이 포트0번 부터 5번까지 6개의 아날로그포트 이다. 프로그래밍 하다보면 숫자를 1부터 안세고 0부터 세는걸 많이 보게 된다. 그것 역시 꼭 그래야할 이유는 모르겠다. 정해진대로 쓰는 거다. 착하게~  

그럼 아날로그포트와 디지털포트가 무엇인가? 아날로그 포트는 아날로그 신호를 받아들이거나 출력할 수 있는 포트고, 디지털은 포트는 눈치 챘겠지만 디지털 신호를 입출력할 수 있는 포트이다. 눈치 너무 빨라서 눈물이 나올지경이다.

그럼 아날로그 신호는 뭐고 디지털신호는 뭐냐? 여기부터는 프로그래밍을 좀 해본 사람도 이론적으론 알지만 실제로 저런 복잡하게 생긴 보드에서 어디로 아날로그 신호가 흐르고  어디로 디지털 신호가 흐르는지는 모를 것이다. 여기가 프로그램 해본 사람이나 안해본 사람이나 똑같아 지는 순간이 되겠다. 

위 예제 코드를 실행하면 LED가 깜빡 거린다. 그때 LED에는 전기가 들어가다 끊기다를 반복하고 있는 것이다. 전기가 들어갈때는 일정하게 5v가 들어가고, 안들어갈때 0v인 것이다. 이런 신호를 바로 디지털 신호라고 한다. 예제 코드에서는 디지털 신호를 출력해야하니까 디지털 포트인 1번부터 13번 중에서 하나 골라서 사용하게 된 것이다. 디지털 포트를 다 써서 모자라거나 하면 아날로그포트를 디지털 포트로 전용할 수 있다. 아날로그 0번을 디지탈 14번 포트로 쓸 수 있고, 아날로그 1번은 디지털 15, 아날로그 2번은 디지탈 16.. 그래서 19번 까지 쓸 수 있다는 말씀 

아날로그 신호는 연속적인 신호라고 말은 많이 들었을 것이다. 아날로그 신호를 입력으로 줄 수 있는 부품은 온도를 재는 써미스터라는 소자가 있다. 써미스터라는 부품은 온도가 바뀌면 부품의 저항값이 변하게 되는 특성을 가지고 있어서, 전기가 써미스터를 통과해서 아두이노에 연결하게 되면  온도에 따라 1.18v 1.25V 1.32V 등 그야말로 다양한 전압이 입력 되는 것이다. 디지털 신호처럼 5v와 0v의 극단 밖에 모는 흑백주의자가 아니라 다양성을 인정할줄 아는 성숙한 신호인 것이다. (진짜 성숙한 신호라고 생각한 사람 손들어 보라. 당신의 아이큐는 100 이하일 가능성이 높다--;)

이런 아날로그 신호는 아날로그 포트 0번부터 5번까지 중에서 하나 골라서 연결해 줘야 그 전압의 변화를 온전히 읽어 들일 수 있는 것이다. 아날로그 출력은 모터에 주면 모터의 힘을 조절해서 로봇의 바퀴가 굴러가는 속도를 제어 할 수 도 있고, LED에도 아날로그 신호를 주면 그 밝기를 약간씩 조절 할 수 있어서 점점 밝아졌다가 다시 점점 어두워지는, 맥북 잠재웠을때 켜지는 LED같은 것을 구현할 수 있는 것이다. 

여기까지 오늘은 아날로그와 디지털 신호의 구분정도만 하고 자세한 프로그래밍 방법은 추후에 다루기로 한다.
그러고보니 예제코드 한줄을 부연설명하다가 여기까지 왔다. 이렇게 한 회를 마무리 짓기는 좀 아쉬운듯하니  좀 속도를 내어 보기로 하자.

그 다음 줄이 아래의 setup()함수 선언 부분이다. 

void setup()                                    // 모든 아두이노 프로그램엔 void setup()이라는 함수가 들어가고, 
{                                                    // 처음 한번 만 실행되는 것들을 담고 있다.
  pinMode(ledPin,OUTPUT);              // 위에서 이름지어준 ledPin 이라는 포트를 OUTPUT출력으로
}     

아두이노 코드는 모두 세미콜론(;)으로 끝을 맺게 되어 있는데, 위 코드 처럼 함수선언이나 중괄호 뒤에는 세미콜론을 쓰지 않는다. 
함수의 종류를 나타내는 void도 바꿔선 안되고 setup()이라는 이름도 바꿔선 안되니까 그대로 써줘야 된다. 모든 아두이노 프로그램엔 setup()함수가 한번 들어가야 하는 것으로 아두이노 보드를 켜면 처음에 한번만 실행해주는 것들을 setup()함수에서 지정해주는 것이다.  

setup()함수 등 모든 함수 정의의 내용은 중괄호{}로 둘러싸도록 되어 있다. 위 예제는 그 안에 덜렁 한 줄 pinMode(ledPin, OUTPUT); 만 들어 있지만 여러 줄 써 넣을 수 도 있다. pinMode( 핀이름 , OUTPUT) 이렇게 쓰면 핀이름이 정한 핀을 출력으로 쓸것이라는 것을 지정하는 것이다. 다시말하면 지정한 포트를 입력으로 쓸것인지 출력으로 쓸것인지를  setup()함수 내에서 지정을 해줘야 한다는 것이다.

pinMod(ledPin, INPUT)이라고도 쓸 수 있다는 말이다. LED는 빛을 내는 부품이기 때문에 입력을 받을 수는 없지만 ledPin 이라고 이름을 정했다고 해서 LED 만 연결 할 수 있는 것은 아니기 때문에, 거기에 스위치를 연결하면 스위치를 눌렀는지 아닌지를 입력 받을 수 있게 된다.

끝으로 아두이노를 켜 놓기만 하면 무한 루프를 돌면서 실행하게되는 void loop()함수에 대해서 알아보자.


void loop ()                                     //void loop()도 모든 아두이노 프로그램에 기본적으로 들어가는 것
{                                                    //으로써, 아두이노를 켜 놓는 동안 무한반복할 동작이 이 안에 들어
  digitalWrite(ledPin, HIGH);             //간다.  ledPin이라고 이름붙인 13번 핀에 전기를 줘서 불을 킨다.
  delay(1000);                                 // 그 상태 그대로 1000밀리 초(1초) 만큼 기다린다.
  digitalWrite(ledPin, LOW);              // ledPin에 전기를 끊어서 불을 끈다.
  delay(1000);                                 // 그 상태 그대로 1000밀리 초를 대기한다.
}      

loop()함수 안에는 디지탈 신호를 출력하라는 의미를 가진 digitalWrite 명령이 두 번 나오는데 위에 있는 것은 ledPin에  HIGH값 그러니까 5v를 주는 것이고 아래에 있는 것은 LOW 값인 0v를 주는 것을 말한다. digitalWrite 명령도 PinMode명령과 용법이 비슷하다는 것을 직감했을 것이다. 괄호안의 앞쪽엔 핀이름인 변수명이 들어가고, 쉼표 뒤에는 HIGH나 LOW가 들어간다. 이건 꼭 대문자로 써야된다. OUTPUT, INPUT 도 꼭 대문자로 써야된다. 

digitalWrite 명령들 사이에 delay명령이 들어 있다. delay는 1/1000초 단위로 현상태유지하면서 기다리라는 명령이다. 첫번째 것은 LED를 켜고 나서 기다리는 거니까 불이 켜진채로 기다리게 되는것이다. 두번째 delay는 LED를 끄고 나서 1000밀리초를 기다리는 것이다. 밀리는 m라고 쓰는데 배수를 나타내는 접두사로 1/1000을 의미한다. n이 나노로 읽고 십억분의 일을 뜻하는 것처럼 말이다. 참고로 c는 센티로 읽고 1/100 이고 d는 데시로 읽고 1/10 이다.
메모리나 하드디스크 용량 단위로 많이 나오는  M(메가, 백만)이나  G(기가, 십억)는 잘 알것이다. 소문자로 쓰는 기호는 1보다 작아지는 배수일때이고 대문자는 커지는 배수이다.  

중요한건 delay() 명령의 괄호안에 쓰는 숫자는 m초 단위라는 점이다. 1초를 대기시키려면 delay(1000); 라고 쓰고 1.5초를 대기 시키려면 delay(1500);이라고 쓰면 된다.


자 그럼! 연습문제로 SOS신호를 LED로 표시하는 코드를 짜보기로 하겠다. 

SOS신호는 띠띠띠 띠- 띠- 띠- 띠띠띠 띠- 띠-띠-  이런 신호를 반복하면 된다. 이 신호는 모르스 부호인데 S가 짧은 신호 세번, O가 긴 신호 세번으로써, 입력하기 제일 쉽기 때문에 조난시 급하게 타전하기 쉬우라고 SOS를 조난신호로 정한것이다.
짧은 신호는 0.5초 긴 신호는 1.5초로 하기로 한다. 댓글로 각자 코딩을 해서 올려보기로 하자. loop()함수의 내용만 바뀌니까 loop()함수에 들어갈 내용만 작성하면 된다.

자자 어서 댓글로 ! 

'Electronics' 카테고리의 다른 글

아두이노 기초강좌 4  (15) 2010.05.11
아두이노 기초강좌 3  (13) 2010.04.28
아두이노 기초 강좌 1  (36) 2010.04.07
꽃보다 남자? 물감보다 아두이노!  (15) 2010.03.30
CDROM drive stepper motor hack  (13) 2010.03.05