로봇카 기초 배우기

프로펠러 로봇카

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

Contents

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


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

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

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

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

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

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

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


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


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


당신은 지금부터 로봇카를 주행하고 싶어할 것입니다. 이해합니다! 그렇지만, 어떤 차량과 마찬가지로 운전을 시도하기 전에 컨트롤에 익숙해지는 것이 좋습니다. 먼저 다음 작업들을 살펴보기 바랍니다. 특히, 로봇카의 기초적인 주행동작을 위해 서모모터를 다루는 일련의 내용을 담고 있습니다. 천천히 다음 사항들에 익숙해진 후에 로봇카의 주행동작에 도전하기 바랍니다.


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

1) Propeller Activity Board의 기능을 살펴보기

2) 전원 스위치와 브레드 보드

3) 내장된 발광 다이오드(LED) 깜박이기

4) 피에조 스피커로 신호음 내기


로봇카의 주행동작 기초에 대한 내용입니다. 


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

5) 서보 / 엔코더 시스템 캘리브레이션

6) 최적의 성능을 위해 시스템 테스트 및 튜닝

7) 특정 거리를 운전하는 법

8) 특정 속도로 운전하는 법


이번 작업 내용을 충분히 숙지한다면 여러분은 로봇카의 주행동작 숙련에 매우 가까이 다가서게 됩니다. 시작해볼까요!


1) Propeller Activity Board의 기능을 살펴보기


프로펠러 Activity board (원본 또는 WX 버전)을 둘러보고 해당 내용을 숙지하십시오. 서보 포트에 케이블을 연결하고 배터리 팩을 전원 잭에 연결했습니다.

- 보드의 라벨을 확인하고 아래 기능에 대해 자세히 읽어보십시오.


프로펠러 Activity board WX (보드의 제품설명서 참조)


그림입니다. 원본 그림의 이름: mem000005a00018.png 원본 그림의 크기: 가로 562pixel, 세로 410pixel



프로펠러 Activity board (Original)

그림입니다. 원본 그림의 이름: mem000005a00019.png 원본 그림의 크기: 가로 595pixel, 세로 515pixel 사진 찍은 날짜: 2013년 04월 12일 오후 7:41


다음은 특히 전원 스위치와 브레드 보드의 두 가지 기능에 대해 자세히 살펴보겠습니다. 이 기능은 Activity board 의 두 버전에서 모두 볼 수 있습니다.


2) 전원 스위치와 브레드 보드


전원 스위치에는 세 가지 위치가 있습니다.

위치 0 은 보드의 회로 전원을 끕니다. (보드를 USB 포트에 꽂으면 컴퓨터에서 전원을 공급 받기 때문에 USB 커넥터 근처에 조명이 거의 보이지 않을 수도 있습니다. 회로를 구성하거나 수정하기 전에 항상 전원 스위치를 위치 0에 설정하십시오.

위치 1 은 흰색 브레드 보드의 세 가장자리에 있는 검은 색 소켓을 포함하여 보드의 대부분 회로에 전원을 연결합니다. 흰색 브레드 보드 위에 있는 P12-P17 레이블의 3 핀 서보 포트에는 전원이 연결되지 않습니다. 로봇의 바퀴를 돌릴 수 있는 탐색 프로그램을 로드하기 전에 위치 1에 스위치를 놓은 다음 프로그램을 EEPROM에 로드하십시오. 이렇게 하면 프로그램이 로드되는 즉시 로봇이 테이블을 벗어나지 않습니다.

위치 2 는 3 핀 서보 포트를 포함하여 보드의 모든 회로에 전원을 공급합니다. 네비게이션 프로그램을 EEPROM에 로드한 후, 로봇을 바닥에 놓고 리셋 버튼을 누른 상태에서 스위치를 위치 2에 놓을 수 있습니다. 리셋 버튼을 놓으면 프로그램이 실행되고 로봇이 움직입니다.


브레드 보드

브레드 보드를 사용하면 일반적인 전자 부품으로 회로를 직접 만들 수 있습니다. 전기에 대해 배우고 자신 만의 발명품을 실험해 볼 수 있는 좋은 방법입니다. 자신의 프로젝트를 설계하기 위해 전자회로를 제작하는 것을 프로토 타이핑이라고 하며 실제 엔지니어링 기술입니다.


Activity Board의 브레드 보드 (원본 또는 WX 버전)는 세면에 검은 색 소켓으로 둘러싸여 있습니다. 이를 통해 브레드 보드의 회로를 전원, 접지 및 프로펠러 I / O 핀에 편리하게 연결할 수 있습니다. 디지털 - 아날로그 변환기 및 아날로그 - 디지털 변환기에 연결하기 위한 소켓도 있습니다.


그림입니다. 원본 그림의 이름: mem000005a0001a.png 원본 그림의 크기: 가로 570pixel, 세로 526pixel 사진 찍은 날짜: 2013년 08월 23일 오후 8:17


3) 내장된 발광 다이오드(LED) 깜박이기


다음으로 Activity Board에 내장된 2 개의 조명 회로를 시운전 해봅시다.

Activity Board (오리지널 및 WX 버전)에는 보드의 오른쪽 하단 모서리 근처에 2 개의 내장 표시등(LED)이 있습니다. 이 작은 발광 다이오드 (LED)는 이미 I / O 핀 P26 및 P27에 전기적으로 연결되어 있습니다. 이 LED는 센서를 사용하는 응용 프로그램을 개발할 때 유용합니다. 센서를 활성화하면 LED가 켜지면서 로봇 공학자에게 센서가 실제로 무엇인가를 감지하고 있다는 시각적 신호를 얻을 수 있도록 프로그램을 작성하는 것이 아이디어입니다.


그림입니다. 원본 그림의 이름: mem000005a0001b.png 원본 그림의 크기: 가로 348pixel, 세로 251pixel 사진 찍은 날짜: 2013년 08월 23일 오후 7:10

Simple Circuits 자습서에는 이러한 LED를 깜박이는 예제 프로그램이 있습니다.

Blink a Light 튜토리얼을 시도한 다음, 완료되면 여기로 돌아오십시오.


4) 피에조 스피커로 신호음 내기


프로펠러 칩은 WAV 파일을 재생하고 음성을 합성할 수 있지만 간단한 비프 음은 때때로 작업을 완료하는데 필요한 소리음입니다. 로봇카(ActivityBot) 용으로 제작할 첫 번째 브레드 보드 회로는 간단한 피에조 스피커입니다.


그림입니다. 원본 그림의 이름: mem000005a0001c.png 원본 그림의 크기: 가로 200pixel, 세로 154pixel 사진 찍은 날짜: 2013년 08월 23일 오후 8:41


한 줄의 코드로 이 스피커 신호음을 울리는 것은 매우 쉽습니다.


freqout (4, 1000, 3000); // 핀, 지속 시간, 빈도


로봇카(ActivityBot) 예제 프로그램의 시작 부분에 이 라인 코드를 선택적으로 추가할 수 있습니다. 그런 다음 로봇 배터리가 부족하면 프로펠러 마이크로 컨트롤러가 프로그램을 재설정하고 다시 시작합니다. 경고음이 울리면 알려줍니다. 탐색 프로그램을 실험하고 예상치 못한 방식으로 로봇이 동작하는 이유를 알아내려고 할 때 매우 유용할 수 있습니다.


기타 스트링이 소리를 내기 위해 어떻게 진동해야 하는지 알아보았습니까? piezospeaker (압전 스피커의 약자) 부품에도 동일하게 적용됩니다. 스피커의 압전 소자는 전압이 인가될 때 구부러집니다. 전압을 빠르게 켜고 끄면 빠르게 진동하고 소리가납니다. 프로펠러를 프로그래밍하여 I / O 핀을 빠르게 켜고 끌 수 있습니다. 피에조 스피커의 양극 (+) 단자를 P4에 연결하고 표시되지 않은 음극 단자를 GND에 연결합시다.


부분품

(1) 피에조 스피커 (# 900-00001)


- 그림과 같이 피에조 스피커를 보드에 꽂습니다.

- 피에조 스피커 핀이 같은 행에 들어가도록 전선을 연결할 때 반드시 확인하십시오. Activity Board와 FLiP 다이어그램은 다른 방향을 사용하지만 회로 연결은 동일합니다.

그림입니다. 원본 그림의 이름: mem000005a0001d.jpg 원본 그림의 크기: 가로 410pixel, 세로 324pixel


코드 테스트

테스트 코드는 피에조 스피커가 상당히 고음의 톤으로 1 초 동안 비프 음을 울리게 합니다.

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

- Documents \ SimpleIDE \ Learn \ Examples \ Circuits에서 Piezo Beep을여십시오.

- 전원 스위치를 위치 1에 설정하십시오 (해당되는 경우).

- Load RAM & Run 버튼을 클릭하십시오.

- 스피커가 1 초 삐음을 울렸는지 확인하십시오.

 

어떻게 동작하는가?

freqout 함수는 핀(pin), msTime 및 주파수(frequency) 파라미터를 가집니다. 함수 호출 freqout (4, 1000, 3000) 은 3000 Hz (초당 3000 회)의 주파수에서 1000 ms (또는 1 초) 동안 핀 4에 교번하는 하이 / 로우 신호를 보냅니다. 스피커가 P4에 연결되어 있기 때문에, 이 3.3V에서 0V까지의 high/low 시퀀스는 빠른 피에조 소자를 초당 3000 번 진동시킵니다. 결과는 높은 음조입니다.


/* Piezo Beep.c

  Beep a piezo speaker connected to P4.  */

#include "simpletools.h"                      // Include simpletools                  

int main()                                    // main function            

{

  freqout(4, 1000, 3000);                     // pin, duration, frequency

}


알고 계셨습니까?

frequency 는 초 단위로 무언가 발생하는 횟수를 나타내는 척도이며 헤르츠 (Hz)로 측정됩니다.

kilo - k 는 미터 또는 SI 접두사의 예입니다. 이것은 1000을 의미하는 킬로를 약자로 만듭니다.

kHz - 피에조 스피커의 경우, 초당 3000 번 반복되는 on / off 신호가 수신되었으므로 3000Hz 또는 3kHz입니다.

가청 소리(Human-audible sound)의 진동은 약 20Hz (매우 낮은 피치)에서 20kHz (매우 높은 피치)까지 다양합니다. 청력을 테스트해보세요!


피아노의 건반을 누르면 작은 해머가 단단히 잡아 당겨져 와이어가 특정 주파수로 진동합니다. 다음은 피아노 키보드의 오른쪽에 있는 더 높은 건반의 주파수입니다.


그림입니다. 원본 그림의 이름: mem000005a0001e.jpg 원본 그림의 크기: 가로 603pixel, 세로 366pixel

 

시도해보세요!

배열을 사용하여 음표 값을 저장한 다음 for 루프로 음표를 재생할 수 있습니다. 자세한 내용은 새로 고침을 위한 배열 변수를 참조하십시오.

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

- 여기에 추가 및 수정을 하십시오.

- 프로그램을 실행하면 익숙한 곡을 재생해야합니다.

그림입니다. 원본 그림의 이름: mem000005a0001f.png 원본 그림의 크기: 가로 554pixel, 세로 225pixel 사진 찍은 날짜: 2013년 06월 20일 오후 5:33


당신 차례 !

또한 #define 을 사용하여 주파수 노트 이름을 사용할 수 있으며 숫자 대신 배열의 노트 이름을 사용할 수 있습니다. 디지털 구성을 훨씬 쉽게 할 수 있습니다.

- 일련의 음표와 길이를 결합하여 자신의 곡을 작곡하십시오.

- 부동 소수점 라이브러리를 사용하여 각 노트의 정확한 빈도를 재생할 수 있습니까?


그림입니다. 원본 그림의 이름: mem000005a00020.png 원본 그림의 크기: 가로 482pixel, 세로 304pixel 사진 찍은 날짜: 2013년 08월 29일 오후 4:55


로봇카에서 피에조스피커 소리내기

이제 아래 그림과 같이 압전 스피커 회로를 로봇카(ActivityBot) 브레드 보드의 새로운 위치로 조정하십시오. 이것은 나중에 다양한 센서 회로를 추가할 여지를 남겨둡니다. 이전 학습을 참조하여 piezo 스피커 회로를 다시 테스트하십시오.


그림입니다. 원본 그림의 이름: mem000005a00021.png 원본 그림의 크기: 가로 249pixel, 세로 350pixel 사진 찍은 날짜: 2013년 09월 02일 오후 2:01


5) 서보 / 엔코더 시스템 캘리브레이션


지금부터 로봇카(ActivityBot)를 움직이는 기초적인 방법을 설명합니다. 로봇카를 잘 다루기위해 다음 동작들이 필요합니다.

(1) 서보 / 엔코더 시스템 캘리브레이션

(2) 최적의 성능을 위해 시스템 테스트 및 튜닝

(3) 특정 거리를 운전하는 법

(4) 특정 속도로 운전하는 법

 

소개한 로봇카 동작을 시작하기 위해 다음과 같은 조건을 설정합니다.

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


여기서 우리는 로봇의 오른쪽과 왼쪽, 앞뒤를 말합니다. 이 용어는 하얀 브레드 보드에 앉아있는 작은 사람의 관점에서, 각 포스트와 발에 손을 얹어 보드 가장자리를 매달아 놓은 것입니다. 지금부터 서보 / 엔코더 시스템 캘리브레이션에 대해 살펴보겠습니다.


다음 테스트 프로그램은 각 엔코더 센서가 바퀴 옆에 있는 스포크를 볼 수 있도록 합니다. 엔코더가 제대로 작동하면 보드의 내장 LED가 스포크를 감지할 때마다 켜지고 스포크 사이의 구멍이 지나면 꺼집니다. 

- Documents \ SimpleIDE \ Learn \ Examples \ Robots \ ActivityBot을 찾습니다.

- SimpleIDE에서 Test Encoder Connections.side를 엽니다.

- 로봇의 PWR 스위치를 위치 2로 돌립니다.

- SimpleIDE에서 EEPROM 로드 및 실행을 클릭하십시오.

- 손으로 ActivityBot의 왼쪽 바퀴를 부드럽게 회전하십시오. 이렇게하면 휠을 돌릴 때 P26 LED가 켜지고 꺼집니다.

- 오른쪽 바퀴에 대해 반복하십시오. 오른쪽 바퀴를 돌리면 P27 LED가 켜지거나 꺼집니다.

 

그림입니다. 원본 그림의 이름: mem000005a00023.png 원본 그림의 크기: 가로 450pixel, 세로 376pixel 사진 찍은 날짜: 2013년 11월 19일 오후 1:34


/*   Test Encoder Connections */

#include "simpletools.h"

int main()                   

{

  low(26);

  low(27);

  while(1)

  {

    set_output(26, input(14));

    set_output(27, input(15));

  }

}


동작하지 않는 경우 몇 가지 증상과 원인


왼쪽 휠을 돌리는 동안 P26 표시등이 꺼져 있습니다.

- 왼쪽 엔코더 케이블이 P14 서보 포트에 역으로 플러그될 수 있습니다.

- 20 k 저항 (적 - 흑색 - 주황색)은 P14 또는 3.3 V 소켓에서 접촉하지 않을 수 있습니다.

- 왼쪽 엔코더는 휠 스포크를 향하는 대신 센서가 섀시를 향하도록 장착될 수 있습니다.

왼쪽 휠을 돌리는 동안 P27 표시등이 꺼져 있습니다.

- 올바른 엔코더 케이블이 P15 서보 포트에 역으로 플러그될 수 있습니다.

- 20 k 저항 (적 - 흑색 - 주황색)은 P15 또는 3.3 V 소켓에서 접촉하지 않을 수 있습니다.

- 올바른 인코더는 휠 스포크를 향하는 대신 센서가 섀시를 향하도록 장착될 수 있습니다.

P26 표시등 대신 P27 표시등이 깜박이고 휠이 왼쪽 휠을 돌리는 동안 (또는 그 반대).

- 인코더 케이블이 바뀌었습니다! P14 및 P15에 연결된 엔코더 케이블을 전환하십시오.

선회 중에는 P26 또는 P27 표시등이 켜져 있습니다.

- P14 또는 P15 소켓을 3.3V 소켓에 연결하는 저항이 너무 작습니다. 20 k-ohm이어야합니다 (적 - 흑 - 주황색). 이 저항기는 키트의 나머지 저항기가 아니라 엔코더 부품이 있는 백에 들어 있습니다.

인코더의 표시등은 항상 켜져 있거나 대부분의 시간 동안 켜져 있지만 때때로 깜박입니다.

- 인코더가 장착되어 센서가 바퀴 쐐기쪽으로 바깥쪽으로 향하지 않고 섀시쪽으로 안쪽을 향하게 됩니다. 언 마운트하고 스왑하여 바깥쪽으로 향하게 합니다.

- 서보 / 엔코더 브래킷 위치를 조정해야 할 수도 있습니다. 서보가 구멍의 중앙에 오도록 하십시오. 서보 본체 위와 아래에는 작은 간격이 있어야 합니다. 서보 스크류를 약간 풀고, 서보의 위치를 변경한 다음 나사를 다시 조이면 위치가 쉽게 정정됩니다.

P26 및 P27 모두 테스트 도중 항상 켜져 있습니다.

- P14 & P15의 점퍼에 결함이 있거나 올바르게 연결되어 있지 않을 수 있습니다. 핀에 끝까지 눌러 졌는지, 금이 갔는지, 느슨한지 또는 손상되어 있지 않은지 확인하십시오. 점퍼가 손상된 경우 영향을 받는 헤더에 전원을 공급하지 마십시오!

 


두 인코더 모두 작동하는 경우

축하합니다! 로봇카(ActivityBot)를 보정할 차례입니다. 다음 단계로 진행하십시오.


6) 최적의 성능을 위해 시스템 테스트 및 튜닝


다른 예제 프로그램을 실행하기 전에 로봇카(ActivityBot)를 조정해야합니다. 이는 로봇카(ActivityBot) 인코더의 정보를 사용하여 장애 및 속도를 측정하고 수정하기 위해 abdrive 라이브러리가 필요로하는 1 회성 교정입니다.


캘리브레이션은 요청된 속도 대비 측정된 속도 데이터를 수집하여 ActivityBoard의 EEPROM 메모리에 저장합니다. 이 메모리는 전원을 끈 후에도 데이터를 유지할 수 있습니다. 이렇게하면 로봇을 다시 켤 때마다 교정 데이터를 사용할 수 있습니다.


프로그램에서 특정 휠 속도를 묻는 경우 abdrive 라이브러리는 EEPROM의 보정 데이터를 사용하여 프로그램에서 요구하는 속도에 가까운 속도로 모터를 구동합니다. 그렇게하면 abdrive는 큰 수정을 할 필요가 없으며 작은 수정만으로 전체 정확도를 향상시킵니다.


전자회로

- 아직 전기 연결을 완료하지 않았다면 이전 단계로 돌아가서 완료하십시오.

 

코드 테스트

교정 프로그램은 모든 데이터를 수집하는데 2 분 미만의 시간을 필요로 합니다. 대략 1m²의 부드럽고 장애물이 없는 바닥이 필요합니다. 보정 프로그램이 실행되는 동안 로봇카(ActivityBot)는 한 번에 한 바퀴만 사용하여 다양한 속도로 원을 그리며 이동합니다. 브래드 보드 아래에 있는 P26 및 P27 표시등을 꺼서 완료될 때를 알려줍니다.

 

중요! 이 단계를 위해 신선한 배터리를 사용하십시오!

로봇카(ActivityBot) 또는 다른 ActivityBot 프로그램을 실행하기 전에 ActivityBot Library를 올바른 위치에 설치해야합니다.

로봇카(ActivityBot)는 라이브러리 폴더는 Documents \ SimpleIDE \ Learn \ Simple Libraries \ Robotics에 있어야 합니다. 직접 라이브러리 폴더를 설치하는 경우 라이브러리 폴더의 압축을 푼 다음 소프트웨어가 라이브러리 위치를 캐시하도록 허용하기 전에 SimpleIDE를 닫은 다음 다시 여십시오.


- 로봇카(ActivityBot)의 전원 스위치를 1로 설정하십시오.

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

- ActivityBot Calibrate ... Documents \ SimpleIDE \ Learn \ Examples \ Robots \ ActivityBot을 엽니다.

- EEPROM로드 및 실행 버튼을 클릭하십시오. ( 중요 :이 프로그램은 EEPROM에 있어야 합니다.)

- 프로그램 로드가 완료되면 P26 및 P27 표시등이 켜집니다. 전원이 켜지면 로봇의 전원을 끄십시오 (PWR 스위치를 0으로 돌리십시오).

- 로봇카(ActivityBot)를 프로그래밍 케이블에서 분리하고 1 미터의 장애물이 없는 부드러운 바닥에 놓습니다.

- 전원 스위치를 2로 설정하고 휠 스피드 데이터를 수집하는 동안 천천히 돌아다닐 수 있는 공간을 제공하기 위해 뒤로 이동하십시오.

- P26 및 P27 표시등이 꺼질 때까지 (약 2 분 총 시간) 혼자 둡니다. 그 후에 보정이 완료되고 전원을 다시 끌 수 있습니다.

 

참고: 동작하지 않으면 어떻게 될까요?

캘리브레이션 프로그램을 시작할 때 로봇이 움직이지 않았거나, 포워드 대신 처음으로 뒤로 가거나, 즉시 시작 및 중지되거나, 움직이지 않고 단지 비트는 경우 문제 해결 페이지로 이동하여 도움을 받으십시오.

보정 프로그램 다시 시작하기

보정 프로세스를 다시 시작해야하는 경우 P26 및 P27 표시등이 켜져있는 동안 언제든지 재설정 단추를 누를 수 있습니다. 보정 프로세스가 완료되면 프로그램 이미지가 수정되어 다시 실행할 수 없게 됩니다. 그러면 다음에 전원을 켜서 새 프로그램을 로드할 때 재보정을 시도하지 않게 됩니다. 보정을 다시 실행하려면 SimpleIDE를 사용하여 ActivityBot Calibrate를 EEPROM에 다시 로드해야 합니다.


어떻게 동작하는가요?

이 예제 프로그램은 high (26) 및 high (27)로 P26 및 P27 LED를 켭니다. 그런 다음 abcalibrate 라이브러리의 cal_activityBot 함수를 호출합니다. 이 함수는 방금 관찰한 일련의 동작을 통해 로봇을 가져옵니다. 동작을 수행하는 동안 cal_activityBot 함수는 서보에 적용되는 다양한 드라이브 수준에 해당하는 휠 속도 목록을 작성합니다. 이 값은 EEPROM에 저장되므로 모든 로봇카(ActivityBot) 탐색 프로그램에서 이 값을 사용하여 주어진 속도로 이동하는데 필요한 드라이브 수준을 찾을 수 있습니다. cal_activityBot 함수가 동작했을 때, 프로그램은 low (26) 과 low (27)를 사용하여 P26과 P27 조명을 꺼지게 합니다.


/*

  ActivityBot Calibrate.c

  Calibrate the ActivityBot's servos and encoders

*/

#include "simpletools.h"

#include "abcalibrate.h"   

int main()

{

  cal_servoPins(12, 13);

  cal_encoderPins(14, 15);

 

  high(26);

  high(27);

  cal_activityBot();

  low(26);

  low(27);

}


알고 계셨습니까?

인코더 틱 - 각 로봇카(ActivityBot) 인코더는 옆 바퀴의 32 스포크 링에서 적외선을 비춥니 다. 빛이 스포크 사이를 통과하면 인코더는 프로펠러에 높은(high) 신호를 보냅니다. 그것이 스포크에서 튀어 오르고 엔코더의 광 센서로 다시 반사되면, 프로펠러에 낮은(low) 신호를 보냅니다. 신호가 하이(high)에서 로우(low), 또는 로우(low)에서 하이(high)로 변할 때마다 프로펠러 칩은 이것을 인코더 틱으로 카운트합니다.

센싱 방향 - 프로펠러 칩은 서보가 움직이기 위해 사용하는 신호에 따라 서보가 회전하는 방향을 압니다. 인코더에서 필요한 것은 그것이 얼마나 빨리 돌고 있는지를 아는 것입니다. 일정 기간 동안 엔코더 틱을 계산하여 이를 수행합니다. 라이브러리는 이 모든 것을 추적하여 프로그램이 로봇에게 얼마나 멀리 또는 얼마나 빨리 갈지를 알려줄 필요가 있습니다.


그림입니다. 원본 그림의 이름: mem000005a00024.png 원본 그림의 크기: 가로 570pixel, 세로 358pixel 사진 찍은 날짜: 2013년 08월 08일 오후 11:02

 

보간 - cal_activityBot 함수는 모터 구동 레벨 및 휠이 돌린 실제 속도에 대한 데이터 포인트 테이블을 만듭니다. 네비게이션 프로그램은 이러한 데이터 포인트를 사용하여 특정 속도를 얻기 위해 휠을 얼마나 힘들게 움직이는지 파악합니다. 프로그램에서 요구하는 속도가 두 데이터 점 사이에 있는 경우 탐색 라이브러리는 알려진 두 값 사이의 최적 드라이브 값을 계산합니다. 예를 들어, 테이블에 초 당 60과 80 인코더 틱에 대한 데이터 포인트가 있고 프로그램이 초당 70 틱을 요구하면 탐색 라이브러리는 초당 60과 80 틱 수준의 중간 단계인 모터 드라이브 수준을 사용합니다. 이 프로세스를 보간이라고 하며 데이터 세트를 선형 보간 테이블이라고 합니다.

 

시도해 보세요!

보간 테이블을 보고 싶습니까? 그것은 초당 엔코더 틱에서 드라이브 레벨과 측정된 휠 속도를 보여주는 데이터입니다. 아래 프로그램을 사용하여 볼 수 있습니다.

- SimpleIDE에서 ... Documents \ SimpleIDE \ Learn \ Examples \ Robots \ ActivityBot에서 ActivityBot Display Calibration을 엽니다.

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

- 그런 다음, 터미널과 함께 실행 버튼을 클릭하면 SimpleIDE 터미널에 보간 테이블 값이 표시됩니다.


#include "simpletools.h"

#include "abdrive.h"

int main ()                  

{

  drive_displayInterpolation ();

}

 

그림입니다. 원본 그림의 이름: mem000005a00025.png 원본 그림의 크기: 가로 565pixel, 세로 459pixel 사진 찍은 날짜: 2013년 08월 21일 오후 11:25


보간 테이블 데이터는 로봇 보정 후 예상대로 운전하지 않으면 문제 해결에 매우 유용할 수 있습니다.


이제 로봇카(ActivityBot)가 보정되었으므로 간단한 테스트 프로그램을 실행하여 곧바로 운전할 차례입니다. 테스트 코드는 두 바퀴가 8 초 동안 32 인코더 틱으로 회전하도록 합니다. 이렇게하면 두 바퀴가 같은 속도로 같은 거리를 주행하면서 ActivityBot이 진행됩니다.


코드 테스트

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

- 다음 위치에서 트림 테스트를 엽니다. 문서 \ SimpleIDE \ Learn \ Examples \ ActivityBot.

- 3접점 스위치를 위치 1로 설정한 다음 EEPROM로드 및 실행 버튼을 클릭하십시오.

- 프로그램 로드가 완료되면 3접점 스위치를 0으로 설정하고 USB 케이블을 분리합니다.

- 리셋 버튼을 누른 상태에서 3접점 스위치를 위치 2로 설정하고 로봇을 단단하고 부드러운 바닥에 내려놓으십시오.

- 재설정 버튼을 놓고 로봇의 주행을 모니터링 하십시오.


로봇은 직선으로 약 80cm 앞으로 움직여야 합니다. 엔코더 피드백을 기반으로 로봇이 코스를 조정할 때 약간의 변화가 있을 수 있습니다.


참고: 작동하지 않으면 어떻게 될까요?

로봇이 앞으로 움직이지 않고 앞으로 움직이지 않거나 움직이지 않을 경우 문제 해결 페이지를 참조하십시오.


어떻게 동작하는가요?

simpletools의 일부인 일시 중지를 제외 하고 이 프로그램의 다른 모든 호출은 abdrive 라이브러리의 함수입니다.


먼저, drive_trimSet (0, 0, 0) 은 로봇이 이미 가질 수 있는 트림 설정을 지웁니다.

다음으로 drive_speed (32, 32) 는 초당 인코더 32 틱 (1/2 a turn) 속도로 두 바퀴를 설정합니다. 멈춤 (8000) 이 뒤따르기 때문에, 서보는 그 속도로 8 초 동안 계속 회전합니다. 마지막으로, drive_speed (0, 0) 는 서보를 정지시킵니다.


#include "simpletools.h"

#include "abdrive.h"


int main()                  

{

  drive_trimSet(0, 0, 0);

  drive_speed(32, 32);

  pause(8000);

  drive_speed(0, 0);

}


알고 계셨습니까?

업데이트 – 로봇카(ActivityBot)는 인코더 피드백을 기반으로 초당 50 회 모터 속도를 업데이트하여 회전해야 하는 정도와 실제로 회전한 정도 사이의 작은 차이를 수정합니다.

인코더 틱과 거리 - 각 엔코더 틱은 3.25mm 전진합니다. 인코더 센서가 스포크에서 홀로 또는 홀에서 스포크로의 전환을 감지하면 엔코더 틱이 계산됩니다. 32 개의 스포크와 32 개의 홀이 있기 때문에 휠 회전 당 총 64 개의 엔코더 틱이 있습니다.

램핑 (Ramping) - 램핑 (Ramping)은 휠 속도를 점차적으로 높이거나 낮추어서 갑자기 시작하고 멈추는 대신에 로봇카(ActivityBot)가 기동을 용이하게 하거나 해제할 수 있게 하는 용어입니다.

 

시도해 보세요!

같은 거리를 가고 싶지만 두 배나 빨리 가고 싶습니까?

- 다른 이름으로 프로젝트 저장을 클릭하고 빨리 이동하십시오.

- 다음과 같이 코드를 수정하십시오.

- PWR 스위치를 1로 놓고 EEPROM로드 및 실행을 클릭하십시오.

- PWR을 0으로 설정하고 USB 케이블에서 분리하십시오.

- 이제 재설정 버튼을 누른 상태에서 로봇을 다시 내려 놓고 PWR을 2로 설정한 다음 놓고 드라이브를 보도록 하십시오.


그림입니다. 원본 그림의 이름: mem000005a00026.png 원본 그림의 크기: 가로 368pixel, 세로 188pixel 사진 찍은 날짜: 2013년 10월 16일 오후 9:36

 

당신 차례 !

아래 프로그램을 사용하면 코드 및 로봇의 작동과 같은 개념의 램핑을 볼 수 있습니다. for 루프와 spped 라고 이름 붙여진 변수는 점진적으로 증가하고 바퀴가 회전 속도를 감소하기 위해 사용됩니다. 또한, abdrive 라이브러리는 램핑 (ramping)을 위한 내장 함수를 가지고 있습니다. 그러나 우리는 나중에 그것을 사용할 것입니다.

- SimpleIDE에서 Project를 클릭하고 New를 클릭하고 이 프로그램에 이름을 지정합니다.

- 아래 코드를 입력하고 EEPROM에 로드하십시오.

- 로봇의 속도가 점차 증가하고 감소하는 것을 볼 수 있습니까?


#include "simpletools.h"

#include "abdrive.h"

int main()                   

{

  for(int speed = 0; speed <= 128; speed += 2) 

  {

    drive_speed(speed, speed);

    pause(20);

  }

  pause(2000);

  for(int speed = 128; speed >= 0; speed -= 2)

  {

    drive_speed(speed, speed);

    pause(20);

  }

}


7) 특정 거리를 운전하는 법


속도를 선택하고 시간을 계산하여 특정 거리를 갈 수도 있지만 더 쉬운 방법이 있습니다. 그리고 시작할 때 램핑(ramping)을 추가하고 중지하려면 프로그램 코딩이 복잡해질 수 있습니다. 다행히도 abdrive 라이브러리에는 모든 것을 처리하는 기능이 있습니다. 그것은 drive_goto 라 불리우며, 이것을 사용하여 각 바퀴가 3.25 mm 단위로 회전해야 하는 거리를 로봇카(ActivityBot)에 알려줄 수 있습니다.


그림입니다. 원본 그림의 이름: mem000005a00027.png 원본 그림의 크기: 가로 594pixel, 세로 472pixel 사진 찍은 날짜: 2013년 08월 27일 오후 11:29


직선, 선회 및 엔코더 틱

"틱 (tick)"이라는 용어는 감지된 스포크에서 홀 검출로의 전환 또는 그 반대의 전환을 나타냅니다. 프로펠러 액티비티(Activity) 휠에는 총 32 개의 스포크가 32 개 간격으로 64 개씩 있습니다. 바퀴가 1/64 회전을 진행한다면, (즉 틱의 가치)는, 3.25 mm를 여행한 것입니다.


그림입니다. 원본 그림의 이름: mem000005a00028.png 원본 그림의 크기: 가로 386pixel, 세로 328pixel 사진 찍은 날짜: 2013년 08월 08일 오후 6:40


로봇카(ActivityBot)가 얼마나 멀리 굴러 갈 것인지 알고 있다면 거리를 3.25 mm (또는 0.325 cm 또는 0.00325 m)로 나누면 프로그램이 로봇카(ActivityBot)에 주행을 지시하는데 필요한 틱 수를 알 수 있습니다.


틱 = 거리 mm ÷ 3.25 mm / 틱


로봇카(ActivityBot)의 회전 반경은 일반적으로 105.8mm입니다.


그림입니다. 원본 그림의 이름: mem000005a00029.png 원본 그림의 크기: 가로 341pixel, 세로 409pixel 사진 찍은 날짜: 2013년 08월 08일 오후 6:45


여전히 오른쪽 바퀴를 잡고 왼쪽 바퀴를 돌리면 2 × π × r 회전해야 합니다. 이 경우 r은 회전 반경이므로 2 × π × 105.8 mm ≒ 664.76 mm가 됩니다. 로봇카(ActivityBot)를 1/4 바퀴 돌리려면 664.76mm ÷ 4 ? 166.2mm가 됩니다. 휠 틱은 몇 개입니까? 166.2 mm ÷ 3.25 mm / tick = 51.14 ticks = 51 ticks.


그림입니다. 원본 그림의 이름: mem000005a0002a.png 원본 그림의 크기: 가로 466pixel, 세로 385pixel 사진 찍은 날짜: 2013년 08월 08일 오후 6:44


TIP : 한 바퀴를 앞으로 26 틱, 다른 한 켠을 뒤쪽으로 25 틱 이동 시키면 ¼ 턴 동안 여전히 51 틱이 됩니다.


코드 테스트

이 테스트 코드는 로봇카(ActivityBot)를 앞으로 256 틱 이동시킨 다음 오른쪽으로 90도 회전합니다.

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

- Documents \ SimpleIDE \ Learn \ Examples \ Robots \ ActivityBot에서 Forward Stop Face Right.side를 오픈하십시오.

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

- EEPROM로드 및 실행 버튼을 클릭하십시오. 로딩이 완료되면 PWR을 0으로 설정하십시오.

- 프로그래밍 케이블 연결을 끊고 바닥에 로봇카(ActivityBot)를 설치하고 PWR을 위치 2로 전환하십시오.

- 로봇카(ActivityBot)가 4 바퀴 회전으로 전진하고, 정지한 다음 오른쪽으로 향하는지 확인하십시오.

 

어떻게 동작하는가요?

이 프로그램을 통해 로봇카(ActivityBot)는 256 틱 (4 회전)만큼 앞으로 이동합니다. 그런 다음, drive_goto (26, -25) 는 로봇카(ActivityBot)를 90도 우회전합니다.


#include "simpletools.h"

#include "abdrive.h"

int main ()                   

{

  drive_goto (256, 256);

  pause (200);

  drive_goto (26, -25);

}


알고 계셨습니까?

오버 슛 - drive_goto 함수가 오버 슛하면 올바른 틱 수까지 백업합니다.

 

시도해 보세요!

로봇카(ActivityBot)가 앞으로 나아가고 오른쪽으로 돌아간 후에 시작된 곳으로 로봇카(ActivityBot)의 경로를 되돌리는 프로그램을 확장하십시오. 이 작업을 수행하는데는 두 가지 방법이 있습니다.

- 로봇카(ActivityBot)를 90도 왼쪽으로 돌린 다음 시작 위치로 되돌립니다.

- 오른쪽으로 90도 더 돌리고 원래의 시작 위치로 앞으로 움직입니다.

 

당신 차례 !

간단한 중간지점 탐색 문제는 미리 프로그래밍된 코스를 운전하도록 로봇을 프로그래밍하는 것과 관련이 있습니다. 아래에 코스의 예가 나와 있습니다. 이 과정을 실행하려면 다음 manuvers를 위해 로봇카(ActivityBot)를 프로그래밍해야 합니다 (이것은 약간의 수학이 필요합니다).


1. START에서 곧장 41.6cm 앞으로 X로 가십시오.

2. 오른쪽으로 45도 회전하고 다음 X로 41.6cm 이동합니다.

3. 90도 왼쪽으로 돌리고 31.2cm 가면 X가 완성됩니다.

그림입니다. 원본 그림의 이름: mem000005a0002b.jpg 원본 그림의 크기: 가로 600pixel, 세로 353pixel


- Waypoint Maze를 만드십시오 - 마스킹 테이프 회랑이 잘 작동하고 처음부터 끝까지 탐색 할 수있는 프로그램을 작성하십시오.


8) 특정 속도로 운전하는 법


때로는 로봇카(ActivityBot)가 장애물에 부딪힐 때까지 특정 방향으로 이동해야 할 수도 있습니다. 특정 거리가 아닌 특정 속도로 로봇을 설정하면 이러한 종류의 응용 프로그램에 유용합니다.

abdrive 라이브러리의 drive_speed 함수를 사용하여 이 작업을 수행할 수 있습니다. 각 드라이브 서보를 초당 엔코더 틱 단위로 특정 속도로 설정합니다. 바퀴 회전에 64 개의 틱이 있기 때문에 바퀴 속도를 초당 64 틱으로 설정하면 초당 1 바퀴 씩 회전합니다. forward에는 양수 값을 사용하고 reverse에는 음수 값을 사용하십시오.

또한 로봇카(ActivityBot)의 속도를 높이고 점차 느려지게 하는 drive_ramp 기능을 시도할 것 입니다. 이렇게 하면 바퀴가 견인력을 잃지 않게 되고 급격한 정지로 로봇이 앞으로 기울어지지 않게 됩니다.


그림입니다. 원본 그림의 이름: mem000005a0002c.png 원본 그림의 크기: 가로 590pixel, 세로 479pixel 사진 찍은 날짜: 2013년 08월 27일 오후 11:53


속도 제어 예제

이 예제는 로봇이 200 tick 이상 앞으로 움직일 때까지 64 tick / second로 똑바로 진행하도록 설정합니다. 그런 다음 왼쪽 바퀴가 초당 32 틱을 돌리면서 45도 우회전을 실행합니다. 그 후 초당 128 틱으로 200 틱 이상 틱합니다.

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

- ... Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot에서 Speed for Navigation.side을 오픈하십시오.

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

- 앞으로 200 (또는 어쩌면 더 많은) 틱 전진하고, 약 45도 정도 우회전하고, 다시 200 + 틱을 전진하는지 확인하십시오.


어떻게 동작하는가요?

이 프로그램은 두 서보가 drive_speed (64, 64)로 초당 64 틱으로 회전되도록 설정합니다. 초당 64 틱은 1 초당 1 바퀴 회전하고, 이어서 pause (2000)이 뒤따르면, 초당 64 틱으로 2 초 동안 회전해야 합니다. 거리의 측면에서, 그것은 64 틱 / 초 x 2 초 = 128 틱이어야 합니다. drive_speed (0, 0) 가 되면 로봇이 약간의 운동량을 갖기 때문에 정확하지 않을 수 있습니다. 또한 보다 정확한 거리를 원한다면 drive_goto 함수를 사용하십시오.


#include "simpletools.h"                      // simpletools library

#include "abdrive.h"                          // abdrive library


int main()                  

{

  drive_speed(64, 64);                       // Forward 64 tps for 2 s

  pause(2000);

  drive_speed(0, 0);


  drive_speed(26, 0);                        // Turn 26 tps for 1 s

  pause(1000);

  drive_speed(0, 0);


  drive_speed(128, 128);                     // Forward 128 tps for 1 s

  pause(1000);

  drive_speed(0, 0);

}


다음으로 drive_speed (26, 0) 는 초당 약 26 틱으로 왼쪽 바퀴를 돌리고 오른쪽 바퀴는 정지상태에 해당합니다. 1 초 동안 진행되기 때문에 왼쪽 바퀴는 45도 회전에 해당하는 약 26 tick을 회전합니다. drive_speed (0, 0) 는 1 초 후에 멈춥니다. 마지막 기동은 첫 번째 기동과 같은 거리를 가야하지만, 절반의 시간 (2 초가 아니라 1 초) 동안 2 배 빠르게 진행됩니다 (64 대신 초당 128 틱).


알고 계셨습니까?

속도(Velocity)는 속도(Speed)이지만, 양의 값 (앞으로와 같은 값) 또는 음의 값 (뒤로 값과 같음)일 수 있습니다. 속도(Speed) 자체는 부호가 없는 속도(Velocity)입니다. 그래서, 당신이 5 km / hr의 속도로 뒤로 가고 있다면, 당신은 또한 -5 km / hr의 속도라고 부를 수 있습니다.


주어진 속도 (v)와 시간 (t)을 계산하는데 사용할 수 있는 방정식입니다.


  s = v × t


예 : 자동차는 40km / hr, 0.25km는 몇 km 씩 주행합니까? 답 : s = v × t = 40km / hr × 0.25hr = 10km.


로봇카(ActivityBot)에 적용됩니다. 휠이 2 초 동안 초당 64 틱이 되면 초당 v = 64 틱이고 t = 2 초입니다. 그래서:


  s = 64 틱 / 초 × 2 초 = 128 틱.


거리가 센티미터인 경우, 틱은 0.325cm이므로 휠이 주행한다는 것을 기억하십시오.


  s = 128 틱 × 0.325 ㎝ / 틱 = 41.6 ㎝.


s = v × t의 양변을 v로 나누면 다음과 같이 됩니다.


  t = s ÷ v


로봇카(ActivityBot)가 원하는 속도와 거리를 안다면 특정 방향으로 갈 시간을 정하는데 정말 유용합니다.

예 : 로봇카(ActivityBot)는 초당 64 틱 속도로 192 틱 앞으로 나아갈 필요가 있습니다.

얼마나 걸릴까요? 답 : t = 192 ticks ÷ 64 ticks / sec = 3 초.

pause 시간은 얼마나 됩니까? 응답 : pause 함수는 밀리 초 (1000 분의 1 초)이므로 3을 1000으로 곱하십시오. 프로그램을 pause (3000) 으로 해야 합니다.

 

시도해 보세요!

앞의 예제 프로그램에서 갑작스러운 시작과 멈춤을 발견하면 drive_ramp를 사용하여 완곡하게 움직일 수 있습니다. 이 기능은 휠을 점차 속도를 높이거나 낮춥니다.

- drive_speed 를 drive_ramp로 교체하고 다시 실행하고 차이점을 관찰하십시오. drive_ramp 는 순항 속도에 도달하는데 약간의 시간이 걸리기 때문에 조금 더 나아갈 것입니다.

그림입니다. 원본 그림의 이름: mem000005a0002d.png 원본 그림의 크기: 가로 498pixel, 세로 305pixel 사진 찍은 날짜: 2013년 08월 29일 오후 4:35


또한 drive_speed 를 사용하여 로봇카(ActivityBot)를 커브로 회전시킬 수도 있습니다.

하나의 휠을 80 틱 / 초로 설정하고 다른 하나는 60 틱 / 초로 설정하십시오.

 

#include "simpletools.h"

#include "abdrive.h"

int main ()

{

  drive_speed (80, 60);

  pause (2000);

  drive_speed (0, 0);

}

 


당신 차례 !

프로그램에서 각 휠이 얼마나 많은 틱을 이동했는지 알아야하는 경우 drive_getTicks 함수를 사용할 수 있습니다. 이 프로그램을 시도하기 전과 후에 이동한 틱 수를 기록한 예가 오른쪽에 있습니다. 터미널과 함께 실행을 사용하고 로봇을 꽂은 채로 둡니다 (로봇을 스탠드 위에 놓거나 책상 위에 올려놓으면 USB 케이블에 연결되어 있는 동안 멀리가지 않도록 하십시오).


당신의 도전 과제는 2 회의 기동을 추가하고 각 기동을 위해 이동한 거리를 표시하는 것입니다. 힌트 : 다음과 같은 방법으로 각 방향의 거리를 계산할 수 있습니다. distanceLeft = distLeft [1] - distLeft [0];


#include "simpletools.h"

#include "abdrive.h"

int distLeft [4], distRight [4];

int main ()

{

  drive_getTicks (& distLeft [0], & distRight [0]);

  print ( "distLeft [0] = % d, distRight [0] = % d \ n", distLeft [0], distRight [0]);

  drive_speed (80, 60);

  pause (2000);

  drive_speed (0, 0);

  drive_getTicks (& distLeft [1], & distRight [1]);

  print ( "distLeft [1] = % d, distRight [1] = % d \ n", distLeft [1], distRight [1]);

}



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