로봇카 기초 배우기

프로펠러 로봇카

7. 적외선 불빛으로 주행하기

Contents

프로펠러 로봇카 실습 세부목차


1. 프로펠러 로봇카 시작하기

2. 소프트웨어 프로그래밍

3. 전자회로 및 주행 기초실습

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

5. 초음파센서로 주행하기

6. 가시광선 탐색 주행하기

7. 적외선 불빛으로 주행하기


※ 본 페이지의 내용은 패럴렉스(Learn.Parallax.com)사의 공식 홈페이지에서 제공되는 자료를 참고하여 작성되었습니다.


본 자료의 원문을 참조하려면 프로펠러 C-프로그래밍 ActivityBot 홈페이지를 방문할 수 있습니다. 프로펠러 로봇카는 아두이노 로봇카와 달리 C-언어 문법을 사용합니다. C-언어에 익숙해지려는 목적이라면 이 자료를 조금 더 자세히 살펴보기 바랍니다.


많은 TV 및 기타 장비는 적외선 리모컨으로 제어됩니다. 리모컨을 TV로 향하게 하고 채널 업 버튼을 누르면 채널이 변경됩니다. 버튼을 누르면 원격 플래시가 TV에서 적외선 빛의 패턴이 됩니다. 적외선은 사람에게는 보이지 않지만 TV의 적외선 수신기는 깜박이는 빛의 패턴을 감지합니다. TV의 마이크로 컨트롤러는 이 패턴을 해독하고 해당 정보를 사용하여 채널을 변경합니다.


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

1) IR 센서 회로 구성하기

2) IR 센서 회로 테스트

3) 적외선 손전등으로 탐색 주행하기


적외선 (IR LED)과 수신기는 로봇카(ActivityBot)의 "손전등"과 "눈"으로 잘 동작합니다. IR LED가 앞으로 빛나고 IR 수신기가 근처의 장애물로부터 반사를 감지합니다.


그림입니다. 원본 그림의 이름: mem000005a00055.png 원본 그림의 크기: 가로 216pixel, 세로 219pixel 사진 찍은 날짜: 2013년 09월 13일 오후 4:27


프로펠러 마이크로 컨트롤러는 IR 수신기에서 반사 데이터를 수신하여 탐색 결정에 사용합니다. 이런 식으로 로봇카(ActivityBot)는 먼저 장애물에 부딪히지 않고 장애물 주위를 돌아 다닐 수 있습니다.


본 실습을 사용하기 전에 SimpleIDE 소프트웨어가 설치되어 있는지 확인하십시오. 만약 설치되어 있지 않다면 이전으로 돌아가서 설치하기 바랍니다.


1) IR 센서 회로 구성하기


이 작업에서는 적외선 객체 센서를 작성하고 테스트하여 로봇카(ActivityBot) 앞에 있는 객체를 감지하는지 확인합니다.


회로 구성에 필요한 부품

(2) IR

수신기 

(2) 1 k 옴 저항 (갈색 - 검정 - 빨강)

(2) 220 옴 저항 (적 - 적 - 갈색)


- 키트에 있는 두 개의 IR LED를 찾으십시오. 이 LED는 돔 모양 (평면이 아님)의 상단이 있는 명확한 LED입니다.

그림입니다. 원본 그림의 이름: mem000005a00056.png 원본 그림의 크기: 가로 285pixel, 세로 180pixel 사진 찍은 날짜: 2013년 09월 13일 오후 4:28


손전등처럼 IR LED의 빛을 지시하기 위해 IR LED 스탠드 오프 (긴 튜브)와 보호 장치 (짧은 튜브)를 사용합니다.


그림입니다. 원본 그림의 이름: mem000005a00057.png 원본 그림의 크기: 가로 256pixel, 세로 170pixel 사진 찍은 날짜: 2013년 09월 13일 오후 4:28


- IR LED의 리드를 스탠드 오프 튜브에 삽입하고 스탠드오프의 하단에 있는 두 개의 구멍을 통해 빠져 나오십시오.

- 단단히 눌러서 IR LED가 제자리에 끼워져야 합니다. 그렇지 않다면 꺼내서 반 바퀴 돌려주고 다시 시도하십시오.

- 스탠드오프에 LED 차폐를 장착하십시오.


참고: 실드가 스탠드오프에 마찰을 가할지라도, 튜브를 단단히 고정시켜서 튜브를 단단히 고정시키는 것이 좋습니다. 테이프가 튜브 끝에 닿지 않거나 IR LED를 덮지 않도록 하십시오.


- 키트에 IR 수신기를 찾으십시오. 두 가지 종류가 있는 경우 이 활동을 위해 은색 금속 상자가 있는 것을 사용하십시오.


그림입니다. 원본 그림의 이름: mem000005a00059.png 원본 그림의 크기: 가로 64pixel, 세로 182pixel 사진 찍은 날짜: 2013년 09월 13일 오후 5:39그림입니다. 원본 그림의 이름: mem000005a00058.png 원본 그림의 크기: 가로 362pixel, 세로 122pixel 사진 찍은 날짜: 2013년 09월 13일 오후 5:40


IR LED의 음극은 D / A0 및 D / A1에 연결됩니다. 물체 감지를 위해 D / A 출력은 0V = GND로 설정됩니다. IR LED가 더 밝아지도록 전압을 높이면 더 가까운 범위를 감지할 수 있습니다. (그들은 오브젝트의 거리에 대한 대략적인 아이디어를 얻기 위해 다양한 전압 레벨에서 테스트할 수 있습니다. 하지만 그것은 다른 활동을 위한 것입니다.)


- 이 결선 다이어그램과 회로도를 사용하여 적외선 감지기를 구축하십시오.

- 긴 IR LED 양극 핀이 결선도에 표시된 행에 꽂혀 있는지 확인하십시오.

- IR 수신기가 검은 색 플라스틱 케이스가 아닌 은색 케이스인지 확인하십시오 (검은 색 플라스틱 케이스가 아님).

그림입니다. 원본 그림의 이름: mem000005a0005a.png 원본 그림의 크기: 가로 490pixel, 세로 763pixel 사진 찍은 날짜: 2013년 09월 13일 오후 4:29


2) IR 센서 회로 테스트


테스트 코드는 각 IR 감지기의 상태를 표시합니다. 1 = 적외선 반사 감지 안 함, 0 = 예, 대상에서 반사된 적외선 감지됨. 계속하기 전에 양측이 확실하게 객체를 감지할 수 있는지 확인하십시오.

그림입니다. 원본 그림의 이름: mem000005a0005b.png 원본 그림의 크기: 가로 548pixel, 세로 341pixel 사진 찍은 날짜: 2013년 09월 16일 오후 4:21



코드 테스트

- SimpleIDE의 Open Project 버튼을 클릭하고 Test Detectors를 엽니다. Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot.

- 터미널 버튼으로 실행을 클릭하십시오.

- 로봇카(ActivityBot)가 두 개의 IR 탐지기가 어떤 물체를 가리키고 있는지 확인하고 두 탐지기 모두가 보고하는지 확인하십시오.

- 약 10cm (4 인치) 정도 떨어진 곳에 적외선 탐지기 앞에 손을 대면합니다. 이것은 irLeft = 1 , irRight = 0 표시되어야 합니다.

- 왼쪽 IR 검출기에 대해 반복하고 디스플레이가 irLeft = 0 , irRight = 1로 업데이트되는지 확인하십시오.

- 두 가지 모두에 대해 반복하고 두 가지 모두가 0으로 표시되는지 확인하십시오.

- 모든 테스트가 완료되면 다음 섹션으로 진행할 준비가 된 것입니다.


문제 해결

계속하기 전에 두 IR 감지기가 제대로 작동하는지 확인하는 것이 중요합니다. 

- IR 출력이 1 또는 0으로 고정되어 있으면 대개 배선 문제가 있음을 나타냅니다. 돌아가서 배선을 점검하십시오.

- 범위 안의 물체가 없으므로 적외선이 0으로 깜박이면 근처의 형광등을 끄고 다시 시도하십시오.

- 오브젝트가 정면에 있을 때 IR이 산발적으로만 감지하면 P11 및 P1에 연결된 레지스터의 색상 코드를 확인하십시오. 1kΩ의 경우 갈색 – 검정색이어야 합니다. 또한 로봇카(ActivityBot)가 직사광선이 비치지 않는지 확인하십시오.

- 두 개의 IR 센서가 잘 동작하는지 확인한 후에 다음 활동을 계속하십시오.


참고: IR 센서가 볼 수없는 것

기억하십시오, IR 센서 시스템은 반사된 적외선을 찾고 있습니다. 밝은 색상의 물체는 적외선을 잘 반사하지만 어두운 색상의 물체는 반사하는 대신 적외선을 흡수합니다. 따라서 IR 센서가 검은 색 신발이나 검은 색 플라스틱 휴지통을 볼 수 없다면 걱정하지 마십시오. 정상입니다!


어떻게 동작하는가?

첫째, int 변수 irLeft 와 irRight 는 IR 검출기 출력 상태를 유지하기 위해 선언됩니다. 그리고, main 내부에서, 코드는 P26 및 P27을 낮게(low) D / A 단자 모두 음극 IR LED가 0 V를 제공하고 있는지 확인하고 설정합니다.


IR 수신기는 초당 38,000 회 (38kHz)로 깜박이는 적외선을 볼 경우에만 탐지 신호를 보내도록 설계되었습니다. 따라서 main 함수의 while 루프에서 freqout (11, 1, 38000) 송신 신호는 초당 38000 회 반복되는 high / low 신호를 IR LED의 양극에 보낸다. 그러면 이 속도로 플래시가 켜지거나 꺼집니다.


다음으로 irLeft = input (10) 은 IR 수신기의 출력을 irLeft 변수에 저장합니다. IR 리시버의 출력이 높으면 IR 리플렉션이 감지되지 않았고 input (10) 은 1을 반환합니다. 리시버의 출력이 낮으면 반사된 IR이 감지되었음을 의미하고 intput (10) 은 0을 반환합니다. 동일한 과정을 오른쪽 IR 감지기에도 freqout (1, 1, 38000) 및 irRight = input (2)로 반복합니다.


/*

  Test IR Detectors.c

*/

#include "simpletools.h"                        // Include simpletools

int irLeft, irRight;                            // Global variables

int main()                                      // main function

{

  low(26);                                      // D/A0 & D/A1 to 0 V

  low(27);


  while(1)                                      // Main loop

  {

    freqout(11, 1, 38000);                      // Left IR LED light

    irLeft = input(10);                         // Check left IR detector


    freqout(1, 1, 38000);                       // Repeat for right detector

    irRight = input(2);


    print("%c irLeft = %d, irRight = %d",       // Display detector states

           HOME,       irLeft,       irRight);

    pause(100);                                 // Pause before repeating

  }

}


두 개의 적외선 탐지 결과가 irLeft 및 irRight에 저장되면 print (% c irLeft = % d, irRight = % d ", HOME, irLeft, irRight) 는 여러 가지 작업을 수행합니다. % C는 HOME 값 (1)을 SimpleIDE 터미널로 보내도록 합니다. 커서가 왼쪽 상단으로 이동합니다. 그 후, irLeft = % d, irRight = % d 는 irLeft = 뒤에 irLeft가 저장하는 1 또는 0을 표시한 다음 irRight = 뒤에 irRight가 저장하는 1 또는 0을 표시합니다. 마지막으로, pause (100) 는 초당 10 회 근처에서 SimpleIDE 터미널이 업데이트되는 속도를 유지합니다.


알고 계셨습니까?

적외선 - "적색 이하"를 의미하며, 빛의 주파수가 색상 스펙트럼에서 적색의 주파수보다 낮다는 것을 의미합니다.

필터링 - IR 수신기에는 38000 회 / 초 (38 kHz)로 깜박이는 적외선을 찾는 필터가 내장되어 있습니다. 이를 통해 TV 리모컨에서 나오는 적외선과 할로겐 및 백열등과 같은 기타 IR 소스는 물론 근처의 창을 통해 들어오는 햇빛을 구별할 수 있습니다.

햇빛 - IR 수신기가 햇빛을 필터링하더라도 직사광선은 종종 IR LED의 신호를 어둡게합니다. 창문을 통해 들어오는 햇빛을 피하고 실내에 보관하십시오.

 

시도해 보세요!

P26 및 P27 라인은 현재 IR LED 음극에 0V를 공급하는 용도로 사용되고 있으므로 우리는 더듬이를 사용하여 IR 검출기 상태를 나타내는 용도로 LED를 사용할 수 없습니다. 이제 브레드보드에 표시기를 위한 LED 몇 개를 만들어 봅시다.


- 키트에서 2 개의 빨간색 LED, 2 개의 220 Ω 저항 (적 - 적 - 갈색) 및 2 개의 검은 색 점퍼 전선을 수집하십시오.

- 이 부분을 사용하여 여기에 표시된 두 개의 LED 표시기 회로를 추가로 구성하십시오.

그림입니다. 원본 그림의 이름: mem000005a0005c.png 원본 그림의 크기: 가로 513pixel, 세로 322pixel 사진 찍은 날짜: 2013년 09월 13일 오후 4:31


다음으로 IR 수신기가 0을 반환하면 주어진 조명을 켜고, 1을 반환하면 꺼지도록 코드를 수정하십시오.


- 다른 이름으로 프로젝트 저장 버튼을 사용하여 프로젝트의 복사본을 만들고 이름을 IR Detectors로 지정하십시오 (Try This)

- 아래와 같이 print 및 pause 함수 호출 사이에 두 개의 if 문을 추가하십시오.

- 프로그램을 실행하고 옆에 있는 물체 감지기 앞에 장애물을 놓으면 각 표시등이 켜지는지 확인하십시오.


그림입니다. 원본 그림의 이름: mem000005a0005d.png 원본 그림의 크기: 가로 448pixel, 세로 148pixel 사진 찍은 날짜: 2013년 09월 16일 오후 5:20

 

당신 차례 !

시도해 보세요에서 IR 탐지 코드를 추가로 수정할 수 있으므로 환경의 IR 간섭을 감지하면 경보가 울립니다. 근처의 형광등이 탐지기를 방해하는 신호를 보내는지 알아내는데 유용한 테스트입니다. 열쇠는 IR LED로 적외선을 방출하지 않는 것입니다. 수신기가 여전히 낮은 신호를 보내면 다른 소스에서 오는 IR 간섭이 있어야 합니다. 간섭이 감지되면 피에조 스피커가 6회 50ms 멈춤으로 분리된 6 개의 50ms, 4kHz 소리로 주의를 환기시키십시오. TV 리모콘을 사용하여 이를 테스트할 수 있습니다.


- 다른 이름으로 프로젝트 저장 버튼을 사용하여 Test IR Detectors (Try This) 사본을 저장하고 Test IR Detectors (Your Turn)로 이름을 변경하십시오.

- print 와 pause 와 함께 freqout 함수를 호출하십시오.

- 당신의 IR 수신기에 TV 리모콘을 가리키고, 버튼을 누르십시오. 불빛 표시가 나오는지 살펴보세요.

- irLeft 또는 irRight 가 1을 유지하는 경우 6 개의 50ms pause로 구분된 일련의 6 개의 50ms, 4khz 반복을 재생하는 if 블록을 추가합니다.

- 오디오 경보와 함께 깜박이는 표시등을 추가하십시오.


3) 적외선 손전등으로 탐색 주행하기


귀하의 IR 객체 센서를 구축하고 테스트하면 로봇카(ActivityBot)를 로밍하고 장애물이 부딪히지 않고 피할 수 있습니다.

 

IR 로밍 코드

IR 로밍 코드 예제는 장애물을 감지할 때까지 로봇카(ActivityBot)를 앞으로 진행시킵니다. 왼쪽에 장애물이 보이면 오른쪽으로 돌 것입니다. 마찬가지로 오른쪽에 하나가 있으면 왼쪽으로 돌고 왼쪽과 오른쪽에 장애물이 있으면 후진합니다.


참고: 모든 장애물을 볼 수 있는 것은 아닙니다.

많은 검은 색 물체가 그것을 반사하는 대신 적외선을 흡수합니다. 의심스러운 경우 IR Detector "빌드 및 테스트"에서 LED 표시기 프로그램을 사용하십시오. 개체가 IR 개체 탐지기에 표시되면 LED에 표시됩니다.


- SimpleIDE의 프로젝트 열기 단추를 클릭하십시오.

- ... Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot에서 IR 로밍을 엽니다.

- EEPROM 로드 및 실행 버튼을 클릭하십시오.

- 로봇카가 바닥이나 장애물 코스에서 느슨해지도록 하십시오.  

 

어떻게 동작하는가?

이 예제는 IR 센서 회로 빌드 및 테스트에서 IR Detectors.c 테스트와 거의 동일합니다. 코드 변경 내용은 다음과 같습니다.


drive_setRampStep의 호출은 초기화에 추가되었습니다.

print 문은 if ... else if ... else if ... else 로 교체되었습니다.

pause (100)이 제거되었습니다.


/*

  IR Roaming.c

  Use IR LEDs and IR receivers to detect obstacles while roaming.

*/

#include "simpletools.h"                        // Library includes

#include "abdrive.h"

int irLeft, irRight;                            // IR variables

int main()                                      // main function

{

  low(26);                                      // D/A0 & D/A1 to 0 V

  low(27);


  drive_setRampStep(12);                        // Max step 12 ticks/s every 20 ms


  while(1)

  {

    freqout(11, 1, 38000);                      // Check left & right objects

    irLeft = input(10);


    freqout(1, 1, 38000);

    irRight = input(2);


    if(irRight == 1 && irLeft == 1)             // No obstacles?

      drive_rampStep(128, 128);                 // ...full speed ahead

    else if(irLeft == 0 && irRight == 0)        // Left & right obstacles?

      drive_rampStep(-128, -128);               // ...full speed reverse

    else if(irRight == 0)                       // Just right obstacle?

      drive_rampStep(-128, 128);                // ...rotate left

    else if(irLeft == 0)                        // Just left obstacle?

      drive_rampStep(128, -128);                // ...rotate right

  }

}


drive_rampStep의 기능은 루프에 사용할 수 있도록 설계되었습니다. drive_setRampStep (12) 호출 후 loop가 drive_rampStep (128, 128)을 호출하면 호출할 때마다 초 당 최종 128 틱으로 한 번에 12 틱 / 초의 속도가 증가합니다. 초당 50 번 (20ms pause)을 호출하는 경우 최대 속도를 얻으려면 11 번의 반복 호출 (11/50 초)이 필요합니다. 로봇카(ActivityBot)가 최대 속도에 도달하면 drive_rampStep (128, 128) 을 반복적으로 호출해도 이미 속도가 변경되지 않습니다. 루프가 drive_rampStep (-128, -128) 호출 반복을 시작하면 최대 속도에서 최대 속도로 후진하기 위해 22/50 초 (0.5 초에 가까워짐) 가 소요됩니다.


if ... else if ... else if ... else 문은 irLeft 및 irRight 탐색에 대한 검색 결과 값을 사용하는 것입니다. 예를 들어, (irRight == 1 && irLeft == 1) 이면 아무런 객체도 감지되지 않기 때문에 drive_rampStep (128, 128) 은 로봇카(ActivityBot)를 두 바퀴가 모두 그 속도로 움직이지 않으면 초당 128 틱을 향해 12 틱/초 씩 보냅니다. 만약 로봇카(ActivityBot)가 오른 쪽의 장애물을 보는 경우, else if (irRight == 0) 조건이 참이 되기 때문에, 루프를 때마다, 매 1/50 초마다 12 틱 / 초 씩 왼쪽으로 회전합니다. 제자리에서의 회전은 왼쪽 휠이 전속력으로 -128 틱 / 초로 뒤로 회전하고 오른쪽으로 128 틱 / 초로 전진 회전하여 이루어집니다.


로봇카(ActivityBot)가 오른쪽 장애물을 피하기 위해 왼쪽으로 회전하면 장애물이 오른쪽 탐지기의 시각에서 사라집니다. 이 시점에서 탐지 상태는 irLeft == 1 및 irRight == 1로 돌아가고 첫 번째 if 문을 다시 참으로 만들고 drive_rampStep (128, 128) 은 전진 속도로 다시 램핑을 시작합니다.


while (1) 루프 반복 사이의 pause는 drive_rampStep의 함수가 되돌아오기 전에 1/50 초 지연하기 때문에 필요하지 않습니다.


알고 계셨습니까?

drive_setRampStep - 이 기능은 drive_rampStep가 1/50 초마다 일어나기 때문에 최대 속도 변화를 설정합니다. abdrive 라이브러리는 기본 값이 4 이고, 이것은 허용 속도의 큰 변화가 1/50초 마다 4 개 틱/초 임을 의미합니다. 이 기본 설정으로 인해 drive_ramp 및 drive_rampStep 이 원활하고 매끄럽게 동작하지만 장애물을 최고 속도로 감지하고 피하는 데는 약간의 시간만 변경하면 충분하지 않습니다. 그래서 drive_setRampStep (12)는 1/50초  허용 속도 변화의 3배입니다. 확실히 부드럽지는 않지만 장애물을 피할만큼 반응이 좋습니다.

 

시도해 보세요!

프로그램의 128을 더 낮은 값으로 변경하여 로밍 속도를 줄일 수 있습니다.


- 다른 이름으로 프로젝트 저장 버튼을 사용하여 ... Documents \ SimpleIDE \ My Projects에 프로젝트 복사본을 저장하십시오.

- 프로그램의 128 값을 모두 64로 변경하십시오. 모든 음수 기호를 그대로 두십시오.

- 수정된 프로그램을 실행하고 로봇카(ActivityBot)를 절반 속도로 로밍시키십시오.


당신 차례 !

drive_setRampStep 함수 호출에서 사용되는 값을 더 높은 값으로 늘리면 로봇의 반응이 빨라지지만 더 기발하게 됩니다. 값을 줄이면 더 매끄럽게 만들지만 어느 시점에서는 충분히 빠르게 반응하지 않고 장애가 발생합니다.


- ... Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot에서 원래 수정되지 않은 IR 로밍 예제를 다시 엽니다.

- 다른 이름으로 저장하려면 다른 이름으로 프로젝트 저장 버튼을 클릭하십시오.

- drive_setRampStep 매개 변수를 늘리거나 줄여보십시오.

- 보고 피할 수 있었던 같은 장애물로 달려가기 전에 얼마나 낮게 갈 수 있습니까.

- 로봇카(ActivityBot)의 행동이 현저하게 떨리기 전에 얼마나 커질 수 있습니까?



이전 페이지로