로봇카 기초 배우기

프로펠러 로봇카

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

Contents

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


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

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

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

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

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

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

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


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


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


로봇카 전방에 장애물이 있는지 없는지를 더듬이 센서로 감지하고 회피할 수 있습니다. 여기서 우리는 가장 간단한 센서 형태이면서 푸시버튼과 동일한 원리로 접촉상태를 감지할 수 있는 더듬이 센서를 사용할 것입니다. 그래서 로봇카가 조금 더 지능적인 동작을 하게 될 것입니다. 아래 링크들을 선택해서 당신이 필요한 내용을 선택하고 살펴볼 수 있습니다.


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

1) 더듬이 센서 만들기

2) 더듬이 센서 테스트

3) 더듬이 센서 회로 내부 (옵션)

4) 더듬이 센서 상태 LED 표시등 추가

5) 더듬이 센서 바퀴 응답

6) 더듬이 센서로 주행하는 로봇카


더듬이 센서를 사용하면 로봇이 장애물을 충돌했는지를 감지할 수 있습니다. 로봇의 더듬이가 물체에 충돌하면 더듬이 스프링과 브레드 보드상의 회로가 전기적으로 연결됩니다. 이 내용에서는 로봇의 프로펠러 마이크로 컨트롤러를 프로그래밍하여 해당 접촉을 감지하고 로봇이 장애물을 피하도록 합니다.


실습을 시작하기 전에 SimpleIDE 소프트웨어가 설치되었는지 확인하고, 만약 설치되지 않았다면 교육내용의 앞부분으로 가서 먼저 살펴보고 실행하기 바랍니다.


1) 더듬이 센서 만들기


필요한 부품 목록

(2) 위스키 와이어

(2) 3 핀 헤더

(2) 10 kΩ 저항기 (갈색 검정색 주황색)

(2) 220 Ω 저항기 (빨강 - 적갈색)

(기타) 점퍼 와이어

그림입니다. 원본 그림의 이름: mem000005a0002e.jpg 원본 그림의 크기: 가로 346pixel, 세로 339pixel


더듬이 설치하기

- 보드 전면을 섀시 스탠드오프에 연결하는 나사 2 개를 풉니다.

- 아래 그림과 같이 각 나사에 위스커 선을 걸으십시오.

- 나일론 와셔 위에 위스커 한 개를 놓고 아래에 다른 한 개를 놓으십시오.

- 케이블의 가장자리가 브레드보드의 가장자리와 평행하도록 나사를 조심스럽게 다시 조입니다.

그림입니다. 원본 그림의 이름: mem000005a0002f.jpg 원본 그림의 크기: 가로 501pixel, 세로 328pixel


전자회로 만들기

다음 그림은 더듬이센서 배선을 보여줍니다. 더듬이 회로와 함께 우리가 사용했던 피에조 스피커가 있습니다.

- 그림과 같이 회로를 만드십시오.

- 수염 모양과 3 핀 헤더 사이에 약간의 간격을 두십시오.

- 또한 10kΩ 저항 (갈색 - 검정색 주황색)이 3.3V 소켓을 3 핀 헤더가 있는 행에 연결하는 저항인지 확인하십시오.

- 마찬가지로 220 Ω (빨강 - 갈색) 저항은 P8과 P7을 3 핀 헤더 행에 연결해야 합니다. 

그림입니다. 원본 그림의 이름: mem000005a00030.png 원본 그림의 크기: 가로 549pixel, 세로 478pixel 사진 찍은 날짜: 2013년 08월 30일 오후 4:19

그림입니다. 원본 그림의 이름: mem000005a00031.png 원본 그림의 크기: 가로 545pixel, 세로 289pixel 사진 찍은 날짜: 2013년 08월 30일 오후 4:20


2) 더듬이(Whiskers) 센서 테스트


로봇을 프로그래밍하기 전에 더듬이 센서 접촉을 테스트하는 것이 중요합니다. 그렇게 하면 더듬이 센서가 올바른 신호를 보내는지 확인할 수 있습니다. 그렇지 않으면, 감지하지 못했더라도 프로펠러에게 그들이 무엇인가를 감지했다고 말할 수 있고, 그 반대일 수 있습니다.


- 로봇의 배터리 팩이 보드에 꽂혀 있는지 확인하십시오.

- PWR 스위치를 1로 설정하십시오.

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

- SimpleIDE> 학습> 예제> ActivityBot으로 이동하십시오.

- Terminal.side 로 Test Whiskers를 오픈하시오.

- 터미널로 실행 버튼을 클릭하십시오. 더듬이를 누르지 않으면 wL = 1 wR = 1로 표시됩니다.

숫자 중 하나가 0이거나 1과 0 중 하나가 깜박이면 회로 오류일 가능성이 큽니다.

- 회로 오류가 있으면 뒤로 가서 모든 연결이 올바른지 다시 확인하십시오.

그림입니다. 원본 그림의 이름: mem000005a00032.png 원본 그림의 크기: 가로 585pixel, 세로 332pixel 사진 찍은 날짜: 2013년 08월 30일 오후 4:50


다음으로 오른쪽 더듬이가 눌려지거나 장애물과 접촉했을 때 프로펠러 칩이 감지하는지 확인하십시오.


- 오른쪽 더듬이를 눌러 3 핀 헤더의 앞쪽 포스트에 닿게 하십시오.

- SimpleIDE 터미널에 wL = 1 wR = 0이 표시되는지 확인하십시오. 오른쪽 더듬이가 눌려 있음을 의미합니다.

- 올바른 더듬이를 누르고있는 동안 SimpleIDE 터미널에 wL = 1 wR = 0 이외의 값이 표시되면 회로 오류를 찾아 수정하십시오.

- 왼쪽 더듬이에 대해 반복하십시오. Parallax Serial Terminal에서 wL = 0 wR = 1을 보길 원할 것입니다. 그런 식으로 표시되는지 확인하십시오. 그렇지 않으면 회로 오류를 찾아 수정하십시오.

- 두 더듬이를 포스트에 대해 누르고 있으면, Parallax 시리얼 터미널에 wL = 0 wR = 0이 표시되어야 합니다.


그림입니다. 원본 그림의 이름: mem000005a00033.png 원본 그림의 크기: 가로 600pixel, 세로 342pixel 사진 찍은 날짜: 2013년 08월 30일 오후 4:51

 

어떻게 동작하는가요?

main 함수는 우리의 현재 익숙하지 않은 리셋 지시 코드로 시작합니다. freqout (4, 2000 (3000)은 3 kHz의 주파수에서 2 초동안 P4 에 연결된 스피커의 경고음을 만듭니다.


그 후, 프로그램은 끝없이 반복되는 while (1) 루프를 시작합니다. 그 루프 안에서, int wL = input (7) 은 input (7)이 wL (whisker-Left의 약자: 왼쪽 더듬이) 이라는 int 변수에 반환하는 값을 복사합니다. 입력 (7) 호출은 왼쪽 더듬이를 누르면 있지 않음을 나타내는 1 을 반환할 수 있습니다. 또는, 눌려 졌음을 나타내는 0을 리턴할 수도 있습니다. 두 경우 모두 해당 1 또는 0 값이 wL 변수에 복사됩니다. int WR = input (8) 문은 거의 동일한 방법으로 동작하고, 오른쪽 더듬이 회로에 대한 1 또는 0 값을 저장하는 것을 제외하고, P8에 연결되며, wR (오른쪽 더듬이)이라는 변수명을 사용합니다.


/*

  Test Whiskers with Terminal.c

  Display whisker states in terminal.  1 = not pressed, 0 = pressed.

*/

#include "simpletools.h"                      // Include simpletools header

int main()                                    // main function

{

  freqout(4, 2000, 3000);                     // Speaker tone: P4, 2 s, 3 kHz

  while(1)                                    // Endless loop

  {

    int wL = input(7);                        // Left whisker -> wL variable

    int wR = input(8);                        // Right whisker -> wR variable

    print("%c", HOME);                        // Terminal cursor home (top-left)

    print("wL = %d  wR = %d", wL, wR);        // Display whisker variables

    pause(50);                                // Pause 50 ms before repeat

  }

}


wL 및 wR 변수에 더듬이 상태를 저장한 후 print ( "% c", HOME) 는 커서를 원위치로 보냅니다. %C의 형식 문자열은 print 함수에 문자형 변수의 값을 보내라고 말하는 것입니다.  HOME 은 숫자 1이고, print가 SimpleIDE 단말기로 그 값을 전송하면, 단말기는 커서를 왼쪽 상단의 "home"위치로 이동시킵니다. 그 후 print ( "wL = % d wR = % d", wL, wR) 는 wL 및 wR 변수의 값을 표시합니다. 이번에는 %d 형식 문자열이 print 함수가 10진수로 값을 표시하도록 만들었습니다. (이 경우 더듬이센서 상태는 1 또는 0).


 

알고 계셨습니까?

simpletools 라이브러리에는 화면을 지우고 커서를 놓는 것과 같은 작업을 수행하는데 사용할 수 있는 16 개의 제어 문자가 있습니다.


이름          기술

HOME  1      왼쪽 상단 (집) 위치로 커서 보내기

CRSRXY 2      커서를 놓습니다. x와 y 값을 따르십시오. 예는 커서를 10 칸 씩, 5 줄을 아래로 내립니다. print ( "% c % c % c", CRSRXY, 10, 5);

CRSRLF 3      한 칸 왼쪽으로 커서 이동

CRSRRT 4      커서를 한 칸 오른쪽으로 이동

CRSRUP 5      한 줄 위로 커서 이동

CRSRDN 6      한 줄 아래로 커서 이동

BEEP   7      호스트 컴퓨터에서 경고음을 내십시오.

BKSP   8      역행 키이

TAB    9      

NL     10     다음 줄로 커서 보내기

CLREOL 11     커서 오른쪽의 텍스트 지우기

CLRDN 12     커서 아래의 일반 텍스트

CR     13     캐리지 리턴

CRSRX  14     커서를 오른쪽으로 x 칸 배치

CRSRY  15     커서 y 줄을 아래로 배치하십시오.

CLS    16     디스플레이 지우기

 

시도해 보세요!

더듬이(whisker) 상태를 인쇄하기 전에 커서를 10 칸 위나 5 줄 아래로 내려놓으십시오.


그림입니다. 원본 그림의 이름: mem000005a00034.png 원본 그림의 크기: 가로 471pixel, 세로 271pixel 사진 찍은 날짜: 2013년 08월 22일 오후 9:11


- 프로젝트로 저장 버튼을 클릭하십시오.

- 프로젝트 이름을 CRSRXY로 표시하고 ActivityBot Tutorial 폴더에 저장하십시오.

- 위와 일치하도록 main 함수를 업데이트 하십시오.

- Run with Terminal 버튼을 클릭하고 SimpleIDE 터미널이 표시하는 테이블을 검사하십시오.

 

당신 차례 !

- CRSRXY 를 사용하는 인쇄 호출로 for 루프를 작성하여 다음 출력을 작성하십시오.

그림입니다. 원본 그림의 이름: mem000005a00035.png 원본 그림의 크기: 가로 431pixel, 세로 312pixel 사진 찍은 날짜: 2013년 08월 21일 오후 9:06


3) 더듬이 센서 회로 내부 (옵션)


오른쪽 더듬이를 살펴보고, 눌려지지 않은 상태와 누른 상태일 때 일어난 일을 살펴봅시다.


더듬이가 눌려지지 않았을 때 브레드보드의 3 핀 헤더에 닿지 않으므로 둘 사이에 전기 접촉이 없습니다. 이 때문에 브레드보드 위의 3.3V 소켓에 연결된 10kΩ 저항은 3 핀 헤더 포스트가 있는 브레드보드 행에 3.3V를 적용합니다. 해당 행을 P8에 연결하는 220 Ω 저항은 3.3V를 P8에 적용합니다.


더듬이 센서 상태는 일반적으로 열린 스위치와 같습니다. 회로도에서 P8은 220 Ω 및 10 k Ω 저항을 통해 3.3 V를 감지합니다. 회로가 3.3 V (또는 1.65V 이상)를 P8에 공급할 때마다 input (8)은 1을 반환합니다. 즉, wR = input (8) 이 wR 변수에 1 의 값을 복사하는 이유입니다. (당신은 SimpleIDE 터미널에 표시된 것을 보았습니다.)


그림입니다. 원본 그림의 이름: mem000005a00036.png 원본 그림의 크기: 가로 531pixel, 세로 416pixel 사진 찍은 날짜: 2013년 08월 22일 오후 9:53


참고: 왜 P8에서 3.3V인가?  왜 P8의 전압이 10kΩ 저항 위의 전압과 같은지 궁금한 경우 다음을 참조하십시오.

우선, 설계도에는 "Not pressed"레이블이 있는 열린 스위치가 표시됩니다. 이 오픈 스위치는 3 핀 헤더와 접촉하지 않는 더듬이 모양이며 회로에서 접지 (GND = 0V)를 유지합니다. 따라서 우리는 저항 쌍의 한쪽 끝에서 3.3V이고 반대쪽 끝에서 P8입니다. P8은 입력으로 설정되기 때문에 회로에 보이지 않습니다. 회로에 관한한, 220 Ω 저항의 오른쪽은 모든 것에서 분리되어 공중으로 튀어나올 수도 있습니다. 하나의 전압만 하나의 저항 또는 일련의 저항기에 가해질 때, 동일한 전압이 다른 쪽 끝에도 나타납니다. 따라서 P8은 입력으로 회로에는 보이지 않지만 회로에 적용되는 전압은 감지할 수 있습니다. 이 경우, 이 전압은 3.3V이므로 프로펠러가 P8 입력 레지스터에 1을 저장하게 하고, input (8) 은 값 1을 반환합니다.



로봇이 장애물에 부딪혀 오른쪽 더듬이가 눌려지면 오른쪽 더듬이가 3-핀 헤더의 앞 기둥과 접촉합니다. 위스커는 보드 모서리의 도금된 구멍에 전기적으로 연결되어 결국 배터리의 음극 단자에 연결됩니다. 이 음극 단자는 흔히 접지라고 불리며 0V의 값을 가지고 있습니다. 더듬이가 3 핀 헤더 포스트에 닿고, 그 행을 접지에 연결하므로 P8은 220Ω 저항을 통해 0V와 같게 됩니다.


이 회로도를 살펴보십시오. 더듬이가 10 kΩ 및 220 Ω 저항이 접지 (0 V)에서 만나는 노드를 연결하는 방법을 보여줍니다. 그리고 그것이 P8이 감지한 것입니다. 결과적으로, input (8)에 대한 호출은 0을 반환합니다. 그 0 값은 wR = input (8) 을 사용하여 wR 로 복사되며 , 더듬이가 눌려지면 Parallax Terminal Window에 표시됩니다.


그림입니다. 원본 그림의 이름: mem000005a00037.png 원본 그림의 크기: 가로 537pixel, 세로 399pixel 사진 찍은 날짜: 2013년 08월 22일 오후 9:38


참고: 왜 P8에서 0V인가? 더듬이가 눌려 졌으므로 위의 회로도는 0V가 P8에 적용되었음을 보여줍니다. 왜냐하면 더듬이를 포스트에 대고 밀어 넣으면 10kΩ 및 220Ω 저항이 만나는 노드에 GND (0V)가 연결되기 때문입니다. 이제는 3.3V 대신 P8에 0V가 적용됩니다. 이유는, 0V가 220 Ω 저항의 왼쪽에 적용되고, 회로는 여전히 그 저항의 오른쪽이 공중에 떠있는 것으로 생각합니다. 따라서 높은 임피던스 입력에 대한 규칙이 계속 적용되며 220 Ω 저항의 오른쪽에 있는 전압은 왼쪽에 적용된 전압과 같습니다.


이제 10 kΩ 저항의 한쪽 끝에 3.3 V가 있고 다른 쪽 끝에 0 V가 있으므로 전류를 해당 저항을 통해 흐르게 하는 전기 압력이 적용됩니다. V = I x R의 옴의 법칙 방정식을 사용하여 계산할 수 있습니다. 이 방정식은 저항의 두 끝에서 전압 (V) 차이가 전류 (I)에 저항의 저항 (R)을 곱한 값과 같다고 말합니다. 작은 대수학의 경우 우리는 I = V ÷ R = 3.3 V ÷ 10,000 Ω = 0.00033 A를가집니다. 0.00033 A 또는 밀리 암페어의 경우 0.33 mA, 매우 적은 양의 전류, 특히 약 140 mA와 비교하면, 서보가 프로펠러 ActivityBot을 움직이는데 필요합니다.


10kΩ 저항은 풀업 저항이라고 부릅니다. 더듬이를 누르지 않으면 P8의 전압이 3.3V까지 끌어당깁니다. 스위치 회로에서 풀업 저항 또는 풀다운 저항을 갖는 것이 중요합니다. 풀업 또는 풀다운 저항은 스위치 / 버튼 접촉이 이루어질 때 I / O 핀이 감지할 전압과 반대되는 전압을 인가합니다. I / O 핀이 없으면 근처의 전계가 입력 기능에 1 또는 0을 보고하는지 여부에 영향을 줄 수 있습니다. 예를 들어 풀업 / 풀다운 저항이 없으면 손을 220 Ω 저항 근처에 가까이 가더라도 입력으로 보고하는 값이 변경될 수 있습니다. 즉 불안정한 디지털 상태가 존재할 수 있습니다.


4) 더듬이 센서 상태 LED 표시등 추가


보드에 더듬이 회로를 만들 때 회로 보드에 내장된 LED에 2 개의 프로펠러 I / O 핀을 연결했습니다. 즉, 이 I / O 핀에 high / low 신호를 보내도록 프로펠러를 프로그래밍할 수 있으므로 연결된 LED를 켜고 끌 수 있습니다.


- Propeller Activity Board (오리지널 및 WX 버전)는 LED 회로에 내장된 P26 및 P27 LED를 사용합니다.

그림입니다. 원본 그림의 이름: mem000005a00038.png 원본 그림의 크기: 가로 586pixel, 세로 323pixel 사진 찍은 날짜: 2013년 08월 21일 오후 9:47


- SimpleIDE> 학습> 예제> ActivityBot으로 이동하십시오.

- LEDs.With로 Test Whiskers를 오픈하십시오..

- 터미널 버튼을 실행하십시오.

- 각 더듬이 모양을 눌러보십시오. 왼쪽 더듬이가 눌러져있는 동안 P26 표시등이 켜지고 오른쪽 더듬이가 눌러져있는 동안 P27 표시등이 켜져야 합니다.


어떻게 동작하는가요?

LEDs.c 로 더듬이 테스트는 두 개의 if ... else 문이 추가된 이전 프로그램입니다. 먼저, (wL == 0)이면 high (26); else low (26) 두 가지 중 하나를 수행합니다. 만약 wL이 0을 저장하면, 그것은 좌측 더듬이가 눌려졌다는 것을 의미하므로, high (26)은 P26의 LED를 켭니다. 만약 wL이 1을 저장하면, 더듬이가 눌려지지 않았다는 것을 의미합니다. 이 경우에, low (26) 은 LED를 끕니다. 다음 두 번째 줄은 if (wR == 0) high (27) ; else low (27) 입니다. 이것은 P27 LED를 켜고 끄는 것을 제외하고는 wr 이 1 또는 0을 저장하는지 여부에 따라  동일한 작업을 수행합니다.


/*

  Test Whiskers with LEDs.c

  Display whisker states in terminal.  1 = not pressed, 0 = pressed.

*/

#include "simpletools.h"                      // Include simpletools header

int main()                                    // main function

{

  freqout(4, 2000, 3000);                     // Speaker tone: P4, 2 s, 3 kHz

  while(1)                                    // Endless loop

  {

    int wL = input(7);                        // Left whisker -> wL variable

    int wR = input(8);                        // Right whisker -> wR variable

    if(wL == 0) high(26); else low(26);       // Light for left whisker

    if(wR == 0) high(27); else low(27);       // Light for right whisker

    print("%c", HOME);                        // Terminal cursor home (top-left)

    print("wL = %d  wR = %d", wL, wR);        // Display whisker variables

    pause(50);                                // Pause 50 ms before repeat

  }

}

 

시도해 보세요!

더듬이가 다음과 같이 눌려지면 표시등이 깜박이도록 프로그램을 수정할 수 있습니다.


그림입니다. 원본 그림의 이름: mem000005a00039.png 원본 그림의 크기: 가로 431pixel, 세로 447pixel 사진 찍은 날짜: 2013년 08월 22일 오후 10:02


- 프로젝트로 저장 버튼을 클릭하십시오.

- 프로젝트 이름을 깜박이는 LED로 테스트합니다.

- 위와 일치하도록 main 함수를 업데이트 하십시오.

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

- 각 더듬이를 누르고 있으면 각 표시등이 깜박이는지 확인하십시오.

 

당신 차례 !

귀하의 도전 과제는 더듬이를 누를 때마다 귀하의 턴 코드가 10 번 깜박이도록 수정하는 것입니다. 힌트 : 카운팅 루프를 검토하십시오. if 문 안에 for 루프를 중첩할 수 있습니다.


5) 더듬이 센서 바퀴 응답


이제 브레드보드 포스트에 대해 더듬이를 밀고 들어 올리면서 로봇을 백업하는 프로그램을 시도해 봅시다.


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

- 다음 Documents \ SimpleIDE \ Learn \ Examples \ Robots \ ActivityBot로 이동하십시오.

- Whiskers Push Bot.side를 오픈하시오.

- PWR 스위치를 1로 설정하십시오.

- EEPROM로드 및 실행 버튼을 클릭하십시오. 로드가 완료될 때까지 기다렸다가 PWR을 0 (꺼짐)으로 전환하십시오.

- 당신의 로봇카를 USB 케이블에서 분리하고 바닥에 놓습니다 (책상이나 다른 높은 곳에 눕히지 마십시오).

- PWR 스위치를 2로 설정하십시오.

- 더듬이 중 하나를 접촉 기둥에 대고 누르고 있습니다. 수염을 계속 누르고 있으면 로봇이 다시 되돌아와야 합니다.


어떻게 동작하는가요?

while (1) 루프를 시작하기 전에, 스피커 비프 음을 울리기 위해 프로그램에는 일반적인 freqout 호출이 있습니다.


main 함수의 while(1) 루프 내부에는, 앞 두줄이 유사하게 보입니다. : 더듬이 입력 상태를 테스트하고, wL 과 wR 에 결과를 할당합니다. 


다음으로 if ((wL == 0) || (wR == 0)) 코드 블록이옵니다. “만약 wL 이 0 또는 wR 이 0 이면, 을 저장하는 경우 0, 코드 블록 안에 있는 것을 수행하십시오." 따라서 두 변수 중 하나가 0을 저장하면, drive_speed (-64, -64) 는 로봇의 서보를 20ms 동안 후진으로 실행합니다.


더듬이 변수가 0을 저장하지 않으면, 프로그램 실행은 if ... code 블록을 건너뛰고 아래의 else 코드 블록으로 이동합니다. 거기에서 drive_speed (0, 0)로 두 서보를 모두 멈춥니다.


/*

  Whiskers Push Bot.c

  Push the whiskers to make the Propeller ActivityBot back up.

*/

#include "simpletools.h"                      // Include simpletools header

#include "abdrive.h"                          // Include abdrive header

int main()                                    // main function

{

  freqout(4, 2000, 3000);                     // Speaker tone: 2 s, 3 kHz


  while(1)

  {

    // Check whisker states.

    int wL = input(7);                        // Left whisker -> wL variable

    int wR = input(8);                        // Right whisker -> wR variable


    // If whisker pressed, back up

    if((wL == 0) || (wR == 0))                // Either whisker detects

    {

      drive_speed(-64, -64);                  // Back up

    }

    else                                      // Neither whisker detects

    {

      drive_speed(0, 0);                      // Stay still

    }

  }

}


시도해 보세요!

다음은 주요 기능을 위해 수정된 루프입니다. if ... else 문을 한 번에 하나의 더듬이를 밀어서 한쪽 또는 다른 쪽으로 돌리거나 두 더듬이를 뒤쪽으로 똑바로 움직일 수 있는 코드로 바꿉니다.


그림입니다. 원본 그림의 이름: mem000005a0003a.png 원본 그림의 크기: 가로 666pixel, 세로 361pixel 사진 찍은 날짜: 2017년 07월 28일 오후 10:04


- 프로젝트로 저장 버튼을 클릭하십시오.

- 프로젝트 Whiskers Push Bot 개선의 이름을 지정하십시오.

- 새로운 변수 speedLeft 와 speedRight를 main 위에 추가하십시오.

- 위의 것과 일치하는 두 개의 새로운 if ... 문과 변수를 사용하도록 while (1) 루프를 수정하십시오.

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

- 각 더듬이를 길게 누릅니다. 각각의 더듬이를 잡으면 회전해야 하고, 두 개 더듬이를 함께 잡으면 후진해야 합니다.


당신 차례 !

- 더듬이를 누를 때마다 로봇카가 전속력으로 후진하도록 Whiskers Push Bot.side를 수정하시오.


6) 더듬이 센서로 주행하는 로봇카


이제 로봇이 더듬이에 반응하도록 만드는 방법을 배웠으므로 이를 확장해서 더듬이를 사용해 주행해 봅시다.


주행하려면 로봇카가 무언가에 부딪힐 때까지 앞으로 나아가야 합니다. 그런 일이 일어나면, 뒤로 물러나 장애물에서 멀어지며 다시 앞으로 나아갈 필요가 있습니다. 로봇이 앞으로 나아갈 때 더듬이 검사를 최소한으로 지연시켜 더듬이 모양을 반복적으로 점검해야 합니다. 그렇게 하면 장애를 만났을 때 즉시 알 수 있습니다.


예제 코드 실행

- SimpleIDE> Learn > Examples > ActivityBot으로 이동하십시오.

- Whiskers.side로 로밍 열기.

- PWR 스위치를 1로 설정하십시오.

- Load EEPROM & Run 버튼을 클릭하고 로딩이 끝나면, PWR을 0 (꺼짐)으로 설정하십시오.

- 로봇을 USB 케이블에서 분리하십시오. 더듬이가 부딪치기에 충분한 장애물이 있는 지역에서 로봇카를 땅바닥에 놓습니다.

- 전원 스위치를 2로 설정하십시오.

- 주행 동작을 관찰하십시오.


어떻게 동작하는가?

while (1) 루프 안의 두 줄을 살펴보십시오. drive_speed (100, 100)은 로봇이 1/50초동안 전속력 전진합니다.

다음 두 줄은 더듬이 상태를 wL 및 wR 변수로 복사합니다.

다음으로, 두 개의 else if 문이 하나의 더듬이 또는 다른 더듬이 하나가 눌러졌는지 확인하기 위해 차례로 체크합니다. 더듬이가 하나만 눌려지면 로봇이 1 초 동안 후진하고, 그 다음 0.6 초 동안 더듬이에서 멀리 떨어집니다. 두 더듬이가 모두 눌려지면 로봇이 후진한 다음 왼쪽이나 오른쪽으로 회전할 것입니다.

더듬이가 눌러지지 않은 경우, if ... else if ... else if 문의 전체 세트 조건중 하나도 true가 아니므로 해당 코드 블록 중 아무 것도 실행되지 않습니다. 그 결과, 로봇은 단지 20 밀리 초마다 앞으로 굴러가서 수염을 점검합니다.


/*

  Roaming with Whiskers.c

  Go forward until object detected by whisker(s).  Then, back up, turn

  and go a new direction.

*/


#include "simpletools.h"                        // Include simpletools library

#include "abdrive.h"                            // Include abdrive library


int main()                                      // main function

{

  freqout(4, 2000, 3000);                       // Speaker tone: 2 s, 3 kHz


  while(1)                                      // main loop

  {

    // Go forward for 1/50th of a second.

    drive_speed(100, 100);                      // Go forward


    // Check whisker states.

    int wL = input(7);                          // Left whisker -> wL variable

    int wR = input(8);                          // Right whisker -> wR variable


    // If whisker(s) pressed, avoid obstacle.

    if(wR == 0)                                 // Just right whisker

    {

      drive_speed(-100, -100);                  // Back up 0.5 seconds

      pause(500);

      drive_speed(-100, 100);                   // Turn left 0.22 seconds

      pause(220);

    }

    else if(wL == 0)                            // Just left whisker

    {

      drive_speed(-100, -100);                  // Back up 0.5 seconds

      pause(500);

      drive_speed(100, -100);                   // Turn right 0.22 seconds

      pause(220);

    }

  }

}


시도해 보세요!

로봇의 어떤 더듬이가 피하는지 표시하기 위해 표시등이 켜지도록 하는 것이 좋습니다. if ... 문에 대한 수정된 코드 블록은 눌려진 더듬이의 LED가 켜지도록 합니다.


- 프로젝트에 새 이름을 지정하십시오.

- 다음과 같이 if ... condition 코드 블록을 업데이트하고 프로그램을 다시 로드하십시오.

- 두 개의 더듬이를 동시에 눌러서 두 개의 LED를 모두 점등시킬 수 있는지 확인하십시오.


그림입니다. 원본 그림의 이름: mem000005a0003b.png 원본 그림의 크기: 가로 497pixel, 세로 377pixel 사진 찍은 날짜: 2013년 08월 30일 오후 5:31


당신 차례 !

- 두 더듬이가 눌려졌는지 탐지하고 더 회전하도록 프로그램을 수정하십시오. 이를 위해 각 while 루프 반복 사이에 각각 30ms의 pause 을 추가하고, if 조건을 else if로 변경한 다음, 두 더듬이가 눌려지는지 확인하는 if 조건을 추가해야 합니다.



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