로봇카 기초 배우기

아두이노 로봇카

2. LED동작과 서보모터 제어

Contents

아두이노 로봇카 실습 세부목차


1. 프라이비 에듀 마이컴 보드 시작하기 

2. LED동작과 서보모터 제어 

3. 서보모터 조립과 동작 그리고 주행하기 

4. 더듬이센서로 주행하기 

5. 포토트랜지스터로 주행하기 

6. 적외선센서로 주행하기 

7. 주행거리 제어하기


※ 본 페이지의 내용은 패럴렉스(Learn.Parallax.com)사의 공식 홈페이지에서 제공되는 자료를 참고하여 작성되었습니다. 또한, 본 내용은 아두이노 neo-로봇카v2 또는 아두이노 로봇카N 키트실습에 사용할 수 있습니다.


본 자료의 원문을 참조하려면 패럴렉스 사의 아두이노를 위한 로보틱스 홈페이지를 방문할 수 있습니다. 이 자료의 로봇카 모든 제어명령 및 센서신호 수집작용은 프라이비 보드 또는 아두이노를 통하여 수행됩니다. 프라이비 보드는 아두이노 우노와 동일한 ATmega328P 마이컴이 사용된 호환보드이며, 아두이노 우노와 동일한 사용법이 적용됩니다.


이전 내용을 학습한 분이면, 로봇카를 동작하는데 팔요한 기초적인 내용을 시작할 수 있습니다. 로봇카의 동작신호를 LED로 나타내거나, 서보모터로 바퀴를 움직이는 동작에 필요한 작업을 포함하고 있습니다. 만약 로봇카를 부품상태에서 처음 조립해야 하거나, 이니 오래전에 실습에 사용했던 로봇카를 다시 사용하려고 한다면, 아래 연결 링크중 서보모터 중심맞추기를 반드시 실행해야 합니다. 각자 필요한 내용을 아래 링크에서 선택해서 학습할 수 있습니다.


아래 세부 내용들을 살펴볼 수 있습니다.

1) LED 동작 실습하기

2) 서보모터 제어동작 실습하기

3) 서보모터 중심 맞추기

4) 서보 회전방향 실습


LED 부품을 프라이비 마이컴 보드에 연결하여 다양하게 불빛을 제어할 수 있습니다. 아두이노 LED 제어실습을 위해서는 220Ω 저항을 LED와 직렬로 연결해서 사용해야 합니다. 저항을 사용해야 하는 이유는 LED 에서 불빛이 나올 때 너무 과도한 전류가 흐르지 않도록 하기 위한 것입니다.

                   그림입니다. 원본 그림의 이름: CLP00001b580006.bmp 원본 그림의 크기: 가로 235pixel, 세로 149pixel

저항 색상 코드표

0

1

2

3

4

5

6

7

8

9

흑색

갈색

빨강

주황

노랑

초록

파랑

보라

회색

백색


220Ω 저항의 색띠는 어떻게 표시될까요? 첫번째 색띠와 두번째 색띠가 빨간색이고 세번째 색띠가 갈색으로 표시됩니다. 세번째 색띠의 숫자는 10진수의 지수 숫자를 의미하므로 10의 1승에 해당하는 10을 의미하기 때문에 220 옴의 값으로 환산됩니다.


LED 부품은 전류를 한쪽 방향으로만 흐르게 하는 다이오드 부품입니다. 전류가 흐르면서 동시에 빛을 방출하기 때문에 Light Emitting Diode 의 약자인 LED 로 부릅니다. 이 부품은 한쪽 방향으로만 전류가 흐르기 때문에 이후 실습에서도 반드시 극성을 잘 살펴서 사용해야만 합니다. 만약 반대로 연결한다면 LED에서 불빛이 나오지 않습니다.


그림입니다. 원본 그림의 이름: CLP00001b580007.bmp 원본 그림의 크기: 가로 93pixel, 세로 156pixel


LED의 다리가 긴 쪽이 양극(+극)이고 짧은 쪽이 음극(-극)을 나타냅니다. 양극의 또 다른 이름은 애노드이고, 음극의 또 다른 용어는 캐소드입니다. 프라이비 에듀 보드로 로봇카 실습을 진행하려면 또 한 개의 부품 브래드보드에 대하여 살펴보아야 합니다.


그림입니다. 원본 그림의 이름: CLP00001b580009.bmp 원본 그림의 크기: 가로 452pixel, 세로 390pixel


가로방향(행)으로 나열된 5개의 구멍들은 모두 전기적으로 연결된 내부구조를 가지고 있습니다. 그래서 5개씩의 동일 행 구멍으로 여러 개의 부품들을 꽂으면 서로 전기적 연결상태를 만들 수 있습니다. 이런 브래드보드 연결방법은 별도의 납땜을 하지 않고도 전기적 연결을 만들 수 있어서 실험 실습용으로 많이 사용됩니다.

그리고 브래드 보드 좌측 그리고 상하 검은색 소켓은 아두이노의 디지털핀, 아날로그핀 그리고 전원핀들과 연결되어 있어서 아두이노 회로를 구성할 때 가까운 거리에서 하드웨어적 연결을 완성할 수 있습니다.


1) LED 켜고 끄기 실습하기


LED 실습에는 LED부품 이외에 220Ω (빨강-빨강-갈색) 저항이 필요합니다. 실습을 위해 먼저 전원이 차단되어 있는지 확인합니다. 만약 USB 케이블이나 외부 배터리 전원이 연결되어 있다면 분리하십시오. 다음 그림은 LED 회로도와 보드에 LED 부품과 저항을 연결한 모습을 나타낸 것입니다. 저항과 LED 부품 양극이 동일한 행의 브래드보드 구멍에 꽂혀서 전기적으로 연결된 상태를 이루었는지 확인해야 합니다. 그리고 접지와 연결된 점퍼선들이 브래드보드 동일한 행에 꽂혀서 모두 전기적으로 함께 연결되었는지 확인해야 합니다.


아래 회로도는 아두이노 디지털핀 12번과 13번핀에 각각 저항과 LED 양극이 직렬로 연결되고, LED 음극이 접지로 연결되어야 합니다.


그림입니다. 원본 그림의 이름: CLP00001b58000a.bmp 원본 그림의 크기: 가로 349pixel, 세로 220pixel

     

두 개의 LED 양극과 연결된 디지털 핀 12번과 13번에서는 스케치 코드 표현에 따라 5V 의 전압을 출력할 수도 있고 출력하지 않을 수도 있습니다. 하드웨어 구성이 완성된 상태에서 아두이노 IDE프로그래밍 도구를 이용하여 두 개의 LED에 전류를 흐르게 하거나, 흐르지 않게 명령코드를 작성할 수 있어서 LED의 출력형태인 빛을 환하게 나오는 상태 또는 빛이 나오지 않고 어두운 상태를 쉽게 만들 수 있습니다.

먼저 디지털 핀 13번에 연결된 LED를 켜고 끄는 스케치를 시도해 봅시다!


void setup()  

{

   pinMode(13,   OUTPUT);        // 디지털 핀13 출력(OUTPUT) 설정

}

void loop()    

{                                          

   digitalWrite(13, HIGH);        // 디지털핀13으로 5V 출력

   delay(500);                         // 0.5초   동안 지속

   digitalWrite(13, LOW);         // 디지털핀13으로 0V 출력

   delay(500);                         // 0.5초 동안 지속

}


코드 명령어로 먼저 setup() 함수에서 디지털 핀13번을 출력모드(OUTPUT)로 설정해야 합니다. 상세한 코드 명령어는 다음과 같습니다.


   pinMode(13, OUTPUT); 


출력모드 설정이 완료되었다면, 디지털 핀으로 최대값(5V)를 인가할 것인지 또는 최소값(0V)를 인가할 것인지를 결정하는 코드를 추가해야 합니다. 우리는 LED 불빛이 한번만 반짝이지 않고 반복적인 명령을 수행하기를 원하기 때문에, LED 불빛 제어에 필요한 명령어 문장을 loop() 함수에서 표현할 것입니다.


위의 예제 스케치는 0.5초 동안 HIGH 상태로 LED 양극에 5V를 공급하여 전류가 흐르는 동작을 만들고, 따라서 LED의 불빛이 0.5 초 동안 밝게 빛날 것입니다. 이어서 0.5초 동안 LOW 상태로 전환되어 LED 양극에 0V 를 공급하여 전류가 흐르지 않게 할 것입니다. 이때 LED는 당연히 불이 켜지지 않습니다. 이런 LED 제어 스케치가 loop() 함수에서는 반복적으로 실행되기 때문에 LED는 0.5초 간격으로 밝았다 어두워졌다 하면서 깜박이는 동작을 하게 됩니다. 실제로 그렇게 되는지 직접 실습해봅시다.


LED 불빛 깜박임 타임차트 만들기

타임차트는 LED를 제어하는 digitalWrite( , ) 상태를 표현하는 HIGH 상태와 LOW 상태의 지속시간을 delay() 함수로 조절할 수 있는데, 이때의 시간을 각각 표시한 것입니다.

      

그림입니다. 원본 그림의 이름: CLP00001b58000b.bmp 원본 그림의 크기: 가로 305pixel, 세로 213pixel

 

타임차트에서 처럼 LED 가 켜진 시간과 꺼진 시간을 각각 다르게 표시하여 다양한 LED 불빛 효과를 만들 수 있습니다. 이상의 원리를 활용하여 여러분의 실습에서 LED불빛이 깜박이는 시간간격을 바꾸는 실습을 시도할 수 있고, 디지털핀 12번에 연결된 LED 도 동일하게 동작하는지 확인할 수 있습니다. 두 개의 LED를 함께 동작시키려면 코드의 구성을 어떻게 하면 될까요?

두 개의 LED를 함께 동작시키는데 참고할 스케치 내용을 소개합니다. 여러분은 아마도 아래 내용을 이미 알아차리고 있을 수도 있습니다.


• pinMode 두 개를 사용하는 스케치 문장

setup() 함수내 추가

    pinMode(13, OUTPUT);    

    pinMode(12, OUTPUT);    

loop() 함수내 추가

    digitalWrite(13, HIGH);     

    digitalWrite(12, HIGH);     

    delay(500);                   

    digitalWrite(13, LOW);     

    digitalWrite(12, LOW);      

    delay(500);                  


2) 서보모터 제어동작 실습하기


아두이노 서보 라이브러리를 사용하여 서보모터를 매우 간단하게 동작시킬 수 있습니다. 아래 소개하는 함수는 아두이노에서 서보모터를 동작시키기 위해 필요한 것들입니다.


   attach()

   writeMicroseconds()

   detach()


서보모터 동작의 위 함수들에 대하여 더 자세히 살펴보려면 아두이노 홈페이지 Servo library 자료를 참고할 수 있습니다. 서보는 규칙적인 시간간격으로 HIGH 펄스 제어신호를 수신해야 합니다. 만약 신호가 멈추면 서보는 동작하지 않습니다. 여러분은 배후에서 동작하는 서보 라이브러리를 사용하여 서보모터를 동작시키는 방법을 배울 것입니다.


서보모터 제어를 위해 서보라이브러리를 사용하는 방법은 다음과 같습니다.

1) setup() 함수 이전에 다음의 선행처리 문장을 표시해야 한다.

     #include <Servo.h>

2) 전단계에서 기록한 선행처리문과 setup() 함수 사이에 서보모터의 이름을 선언한다. 서보명은 사용자에 따라 다양하게 작명하면 된다.

     Servo servoLeft;

3) setup() 함수내에서, 작명한 서보모터 이름을 아두이노 디디털핀 몇번에 연결할 것인지를 설정해야 한다. 아래 예시는 디지털핀 13번에 연결하는 표시이다.

attach() 함수는 서보모터를 동작하겠다는 준비 표시라고 할 수 있다.

     servoLeft.attach(13);

4) 서보모터를 어떤 속도로 동작시키는 것에 대한 명령을 나타낸 것이다. writeMicroseconds 함수를 사용하는데, 이 표현은 setup() 와 loop() 함수 어느 쪽에서든지 사용자의 필요에 따라 선택해서 사용할 수 있다.

     servoLeft.writeMicroseconds(1500);


지금까지의 서보모터 제어를 위한 코드를 함께 표시하면 다음과 같습니다. 여러분은 아래 코드의 형식을 기억해두었다가 항상 반복 사용하면 됩니다.


#include   <Servo.h>         

Servo   servoLeft;     

void   setup()          

{

    servoLeft.attach(13);       

    servoLeft.writeMicroseconds(1500);

void   loop()                                   

{                              

}


아두이노 neo-로봇카 v2 키트는 두 개의 연속회전형 서보모터를 사용하여 주행동작을 구현할 수 있습니다. 따라서 위 서보동작 스케치에 또 다른 서보모터 동작을 위해 코드를 추가해야 합니다. 여러분은 어떻게 추가할지 예상이 됩니까? 이전 LED를 추가하던 때와 같은 방식으로 추가할 수 있습니다.


#include   <Servo.h>         

Servo servoLeft;   

Servo servoRight; 

void   setup()          

{

    servoLeft.attach(13);  

    servoRight.attach(12);    

    servoLeft.writeMicroseconds(1500);

    servoRight.writeMicroseconds(1500);

void   loop() 

{

}                                 


로봇을 조종할 때, 연속회전형 서보모터는 여러 가지 다양한 모터 종류들 중에서 초보자도 쉽게 모터를 제어할 수 있고, 가격도 저렴한 특징이 있습니다. 여기 로봇카 키트에서 사용하는 서보는 Parallax 사의 연속회전형 서보모터입니다.


    그림입니다. 원본 그림의 이름: CLP00001b58000c.bmp 원본 그림의 크기: 가로 416pixel, 세로 186pixel


서보모터는 3개의 연결핀으로 구성되어 있는데, 전압공급과 접지 그리고 나머지 하나의 핀은 서보모터 제어를 위한 신호용입니다. 이 신호용 핀을 스케치에서 서보모터 제어를 위해 선언한 아두이노 디지털핀 번호로 연결하면 됩니다.


로봇카 보드에 서보모터를 연결하기 위해서는 아래 사항을 점검해야 합니다.


그림입니다. 원본 그림의 이름: CLP00001b58000d.bmp 원본 그림의 크기: 가로 272pixel, 세로 180pixel


먼저 3접점 스위치는 맨좌측으로 옮겨서 서보모터와 연결될 핀(10,11,12,13)으로 전원이 공급되지 않도록 해야 합니다. 다음으로 서보모터로 안정적인 5V 전원이 공급될 수 있도록 점퍼위치가 +5V 방향으로 꽂혀있는지 확인합니다. (만약 Vin 방향으로 꽂혀 있으면 점퍼 위치를 수정해야 합니다.) 이제 보드에 서보모터를 연결할 차례입니다. 아래 그림을 참고하여 직접 연결해봅시다.


그림입니다. 원본 그림의 이름: CLP00001b58000e.bmp 원본 그림의 크기: 가로 355pixel, 세로 180pixel

       

연결할 때 주의할 점은 서보모터의 3색 위치를 살펴서 바르게 연결하는 것입니다. 흰색선(신호선)이 그림의 위쪽(또는 로봇카 가장자리쪽) 그리고 검은색(접지)선이 브래드보드쪽(또는 로봇카 내부방향)이 되도록 연결해야 합니다.


서보모터에 충분한 전압이 공급되지 않으면 로봇카 동작 오류를 일으킬 수 있습니다. 그래서 아두이노에 공급되는 전압은 최소 6V 이상은 유지하는 것이 좋습니다. 이런 문제를 고려하여 아두이노 neo-로봇카 v2 키트에서는 5개의 AA 건전지를 사용하는 배터리 홀더가 장착됩니다. 5개의 AA 건전지를 신규로 사용하면, 총 공급전압은 약 8.1V 정도 되어서 아두이노(여기서는 프라이비 에듀) 공급전압 범위(7~12V)를 충족합니다. 이제 여러분은 4개의 AA 건전지를 사용할 때보다 5개의 AA 건전지를 사용하므로써 조금 더 오래동안 안정적인 전원 전압을 유지할 수 있습니다.


3) 서보모터 중심 맞추기


지금까지 서보모터 동작에 대한 기본적인 사항들을 살펴보았습니다. 이제 아두이노 로봇카 동작을 위해 필수적인 서보 중심맞추기 동작에 대해 설명합니다. 이 작업이 정상적으로 완료되지 않으면 이후 모든 단계의 로봇카 동작을 따라하는데 어려움을 겪을 수 있습니다. 경우에 따라서 이 작업이 까다롭게 여겨질 수도 있지만, 인내심을 가지고 꼭 완료하기 바랍니다.


서보 중심 맞추기에 필요한 도구는 스크루 드라이버입니다. 드라이버가 준비되었다면, 다음 순서로 따라하면 됩니다.

1) 프라이비 보드에 아래 스케치를 업로드한다. 여러분의 눈에 익은 코드일 것입니다. 이 코드를 그대로 업로드합니다.


#include   <Servo.h>         

Servo servoLeft;   

Servo servoRight; 

void   setup()          

{

    servoLeft.attach(13);  

    servoRight.attach(12);    

    servoLeft.writeMicroseconds(1500);

    servoRight.writeMicroseconds(1500);

void   loop()                                   

{                              

}


2) 서보모터 두 개를 보드의 12번, 13번 핀에 바르게 연결합니다. 또는 10번 11번 핀에 연결해도 좋습니다.

3) 3접점 스위치 방향을 맨 우측으로 전환합니다.


이상의 작업이 완료되었다면, 실습에 참여중인 각자의 상황이 모두 다르게 나타날 수 있습니다. 현재 상황에 대하여 설명을 추가하면, writeMicroseconds(1500); 함수 의미는 서보모터가 정지상태를 유지하라는 명령을 담고 있습니다. 그렇지만, 공장에서 출시되는 서보모터의 초기조건은 모두 동일하지 않아서 사용자가 직접 스크루 드라이버로 각각의 하드웨어적인 서보 초기상태를 만들어주어야 합니다. 그 방법은 간단하지만, 상당히 미세한 동작이 필요할 수 있어서 어려움을 겪을 수 있습니다. 그렇지만, 어느 순간 서보모터가 정지하는 순간을 스크루 조정으로 맞출 수 있습니다. 두 개의 서보에 대하여 이 작업을 수행하는 것이 서보 중심맞추기입니다.


    그림입니다. 원본 그림의 이름: CLP00001b58000f.bmp 원본 그림의 크기: 가로 197pixel, 세로 135pixel  그림입니다. 원본 그림의 이름: CLP00001b580010.bmp 원본 그림의 크기: 가로 189pixel, 세로 137pixel


4) 서보 회전방향 실습


 그림입니다. 원본 그림의 이름: CLP00001b580011.bmp 원본 그림의 크기: 가로 351pixel, 세로 143pixel    


그림입니다. 원본 그림의 이름: CLP00001b580012.bmp 원본 그림의 크기: 가로 403pixel, 세로 158pixel


서보 제어를 위해 사용하는 writeMicroseconds() 함수에 표시하는 값은 위 그림의 펄스 시간 1.3ms, 1.5ms, 1.7ms 와 같은 의미를 전달하는 것입니다. 서보 중심맞추기에서 사용했던 1500 숫자는 1.5ms 의미로 사용된 것입니다.


실습에 사용하는 서보모터의 값을 1300 으로 사용하면 분당 50~60 회 정도 전속으로 시계방향 회전을 합니다. 그리고 숫자를 점차 높여서 1500 에 가까워지면 서보모터가 정지합니다. 그리고 1500 을 초과하면 다시 반시계방향으로 천천히 회전하기 시작하여 1700 에 도달하면 반시계방향으로 전속력 회전합니다. 이제 서보모터의 동작원리가 이해되었기를 바랍니다.


로봇카의 동작에서 전진동작을 만들려면 두 개의 서보모터 회전방향이 서로 반대방향이 되어야 합니다. 가령 예를 들면 아래와 같은 코드 구성이 만들어져야 합니다. 아래 스케치를 참고하여 3초간 전진하고, 3초간 회전하고, 다시 3초간 정지하는 로봇카 동작을 구형하려면 아래 코드를 어떻게 수정해야 할까요? 아래 코드는 loop() 함수에서 서보명령을 수행하고 있지만, setup() 함수에서 점검하는 것도 가능합니다.


#include   <Servo.h>         

Servo servoLeft;   

Servo servoRight; 

void   setup()          

{

    servoLeft.attach(13);  

    servoRight.attach(12);    

void   loop()                                   

{                             

  servoLeft.writeMicroseconds(1300);

    servoRight.writeMicroseconds(1700);

}



이전 페이지로      다음 페이지로