유선 통신으로 움직이게 만들기

자신이 원하는 시간에 자신이 원하는 동작을 수행하도록 만드는 것, 정말 멋진 일입니다. 생활에서 아주 쉽게 볼 수 있는 예는 바로, 리모컨입니다. 우리가 원하는 채널을 보고싶을 때, 혹은 위 아래로 채널을 돌리면서 재미있는 프로그램을 찾을 때 우리는 리모컨을 이용합니다. 리모컨은 미리 약속해 놓은 신호를 보내고, 그 신호를 TV가 받으면 미리 약속해 놓은 동작을 수행합니다. 또 다른 예를 들어보겠습니다. 야구에서 포수가 가랑이 사이로 손가락을 이용해서 미리 약속해 놓은 신호를 보냅니다. 미리 어떤 신호는 어떤 볼을 던지라는 약속을 해 두었습니다. 그러면 투수는 약속한대로 공을 던지는 것입니다. 이 것도 리모컨이라고 할 수 있습니다. 키보드를 두드리는 것은 가장 가까운 예입니다. 우리가 원하는 글자를 타이핑하기 위해서 그 글자에 맞는 키보드 버튼을 누르면 화면에서 그 키보드에 맞는 글자가 표시됩니다.

이 것을 어떻게 구현할 수 있을까요? 복잡해 보이지만 다음 순서대로 생각하면 됩니다.

  1. 신호 만들기
  2. 신호를 받는 프로그램 만들기
  3. 신호에 맞는 동작하기

그리고 나서 우리는 우리의 로봇에게 신호를 보낼 것입니다.

만약 이 곳이 어렵다면 그냥 일단 무조건 갖다가 붙여서 동작을 확인하세요. 그리고 조금씩 바꿔보면서 실험을 해 보시면 비교적 쉽게 이해하실 수 있을 것입니다.

 

잘 동작하는 예제 소스 (유선통신)

/*********************************************************
    Open BuskingBot
    Written by Eunchan Park (박은찬)
    BSD license, all text above must be included in any redistribution
**********************************************************/
#include <Servo.h>
Servo myservo1; // 첫 번째 서보모터
Servo myservo2; // 두 번째 서보모터

void LeftHit() {
    myservo1.write(90); // 서보 1번에게 90도로 이동하라고 명령 (왼쪽 모터) (팔을 내린다)
    delay(200); // 200ms (0.2초 동안 여기서 대기)
    myservo1.write(00); // 서보 1번에게 0도로 이동하라고 명령 (왼쪽 모터) (팔을 든다)
}

void RightHit() {
    myservo2.write(0); // 서보 2번에게 90도로 이동하라고 명령 (오른쪽 모터) (팔을 내린다)
    delay(200); // 200ms (0.2초 동안 여기서 대기)
    myservo2.write(90); // 서보 2번에게 0도로 이동하라고 명령 (오른쪽 모터) (팔을 든다)
}

void setup() {
    myservo1.attach(9); // 9번 핀을 서보1번이라는 이름으로 컨트롤 하겠음 (왼쪽 모터)
    myservo2.attach(10); // 9번 핀을 서보2번이라는 이름으로 컨트롤 하겠음 (오른쪽 모터)

    // 시리얼 통신을 시작하겠음. 38400 이라는 속도로 하겠음
    // 38400  이라는 숫자는 미리 정해진 여러가지 속도 중 하나임
    Serial.begin(38400);
}

// 임시로 데이터를 저장할 공간을 마련함
char tempData = 0;

void loop() {
    // 통신을 통해 데이터를 받았다면
    if (Serial.available()) {
        // 임시 공간에 데이터 하나를 읽어서 저장하세요
        char tempData = Serial.read();
        // 만약 그 데이터가 'b' 라면
        if (tempData == 'b') {
            //왼팔을 움직이세요
            LeftHit();
        } else if (tempData == 's') {
            // s 라면 오른팔을 치세요
            RightHit();
        }
    }
}

예제 소스를 보드에 업로드하기

앞에서도 한 번 설명을 드렸지만 한 번 더 해보겠습니다.

[tools – Port]를 눌러서 현재 Port 상태를 확인

아두이노와 연결된 USB 를 꽂고 포트 확인/선택

보드 확인

Processor “ATmega328P”도 확인하세요

업로드 버튼 클릭

업로드 완료 (Done uploading)

 

통신으로 움직이게 만들어보기

소스에 주석을 달아 놓긴 했지만 이해가 안되실 수 있습니다. 이해가 안가시더라도 일단 테스트를 해보고 차근 차근 이해하는 방향으로 진행하겠습니다.

이제 시리얼을 통해서 아두이노에게 신호를 보내 보겠습니다. 시리얼통신이라는 통신 방법을 사용합니다. 시리얼 통신은 아주 고전적이고 오랫동안 많이 사용되오던 통신 중 가장 기초중의 기초인 방법입니다. 추 후 블루투스 통신을 할 때도 이 방법을 이용합니다. 시리얼 통신은 영어, 한국어처럼 하나의 언어라고 생각하시면 쉽습니다. 그 언어를 통해서 우리는 서로 이야기를 나눌 수 있습니다. 가끔은 휴대폰으로, 가끔은 유선전화로 할 수 있지요. 지금은 유선전화를 이용해서 통신을 한다고 생각하면 이해하기 쉽습니다.

자, 그럼 아두이노에 어떻게 신호를 보낼 수 있을까요?

바로, 컴퓨터를 이용합니다. 컴퓨터->USB->시리얼->아두이노 이 통로로 아두이노에게 신호를 보낼 수 있습니다. 신호를 보내기 위해서는 신호를 보내는 프로그램이 필요한데요, 아두이노에서 미리 만들어 둔 프로그램을 사용하겠습니다. 시리얼모니터를 열어 보겠습니다. 단축키는 Ctrl + Shift + M 입니다.

주의할 점은, COM 번호를 확인해야 하는 것입니다.

그런데 아까부터 COM COM 하는데요, 이게 무엇인가요?

항구에 가 보신적 있으신가요? 혹은 버스 터미널, 공항에 가 보신적이 있으시다면 터미널 번호를 본 적있으실 것입니다. 버스가 출발하거나 어디에서 차를 타야 하는지 우리는 티켓에서 확인할 수 있습니다. 출발할 때는 비교적 쉽게 터미널을 확인할 수 있지요. 그런데 도착할 때, 우리가 어떤 터미널에서 내릴지 쉽게 예상할 수 있나요? 버스기사님도 그 것은 예측하기 다소 어려울 수 있습니다. 왜냐하면 도착할때 쯤 버스터미널의 상황을 예상하기는 어렵기 때문입니다. 원래는 4번 터미널에서 하차하기로 했지만 4번 터미널에 아직 다른 버스가 대기하고 있다면 버스 기사님은 4번이 빌 때까지 기다리지 않고 5번이나 3번 터미널에 주차를 해 주십니다.

위의 COM은 바로 시리얼 포트입니다. 시리얼 포트는 번호를 가질 수 있지요. 마치 4번 터미널처럼요. 아두이노를 버스라고 생각해 보면, COM 번호는 터미널 번호입니다. 아두이노가 컴퓨터에 도착하면 컴퓨터는 어떤 포트가 비어있는지 확인 후 비어있는 포트를 아두이노에 할당해 줍니다.

IDE 가 정품아두이노는 잘 확인해서 어떤 COM 포트에 꽂혀 있는지 확인을 잘 해주거든요, 중국제 저가형 아두이노는 이렇게 수동으로 확인해 줄 필요가 있습니다.

시리얼 모니터를 띄우면 위 처럼 채팅창같은 화면인 뜹니다. 위에 커서가 깜빡이는 곳에 글자를 입력하고 엔터나 SEND 버튼을 누르면 아까 선택한 그 포트에 그 글자를 배달합니다. 우리가 신경써야 할 것들은 저 아래 9600 이라는 숫자입니다. 혹시 소스코드 기억나시나요?

void setup() {
    myservo1.attach(9); // 9번 핀을 서보1번이라는 이름으로 컨트롤 하겠음 (왼쪽 모터)
    myservo2.attach(10); // 9번 핀을 서보2번이라는 이름으로 컨트롤 하겠음 (오른쪽 모터)

    // 시리얼 통신을 시작하겠음. 9600 이라는 속도로 하겠음
    // 9600 이라는 숫자는 미리 정해진 여러가지 속도 중 하나임
    Serial.begin(9600);
}

Serial.begin(9600);

이 부분의 숫자와 같아야합니다. 통신 속도를 똑같이 맞춰줘야 서로 이해할 수 있습니다.

b 혹은 s 라고 입력하고 엔터를 쳐 봅니다. 그러면 왼쪽 모터가 움직이는 것을 확인할 수 있을 것입니다!

이런 식으로 아두이노와 컴퓨터가 통신할 수 있는 것입니다!

 

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *