로봇카 기초 배우기

프로펠러 로봇카

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

Contents

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


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

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

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

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

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

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

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


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


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


여기서는 초음파 센서로 로봇카 전방의 물체를 탐색하고, 물체를 회피하거나 또는 물체를 따라가는 동작을 만들 수 있습니다. Ping))) 초음파 거리 센서를 사용하면 로봇카(ActivityBot)에서 장애물을 감지하고 장애물과의 거리를 측정할 수 있습니다. PING)) 센서는 눈과 비슷하게 보입니다. 그리고 시각적으로 입과 귀처럼 보이기도 합니다.


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

1) Ping))) 센서 구성 및 테스트

2) 초음파 탐색 주행하기

3) 초음파 센서로 대상물체 따라 가기


박쥐와 마찬가지로 PING)) 센서는 초음파가 짹짹 울리면 짹짹 울림을 듣고 신호음을 듣습니다. 프로펠러 마이크로 컨트롤러는 PING))) 센서를 트리거하고 리턴 신호를 받는 사이의 시간을 표시할 수 있습니다. 이 에코 리턴 시간은 객체까지의 거리를 계산하는데 사용될 수 있습니다. 이런 기능은 주행 중에 장애물을 피하거나 움직이는 물체와의 거리를 일정하게 유지하는 등 다양한 로봇카(ActivityBot) 탐색 주행 전략을 가능하게 합니다.


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


1) Ping))) 센서 구성 및 테스트


본 실습에서는 PING))) 센서 회로를 구축하고 다양한 객체와의 거리를 측정하여, 어떤 종류의 객체를 감지하는지 또는 감지하지 못하는지에 대해 익숙해지도록 합니다. PING))) 센서는 거리 측정을 위해 프로펠러에 전원, 접지 및 신호 연결이 필요합니다.


필요한 부품 목록

(1) PING)))) 센서

(1) 2.2 k 옴 저항 (적색-적색-적색)

(1) 점퍼 선


 그림입니다. 원본 그림의 이름: mem000005a0003c.png 원본 그림의 크기: 가로 308pixel, 세로 202pixel 사진 찍은 날짜: 2013년 08월 30일 오후 8:57


PING))) 센서 전자회로 구성

- 벌써 그렇게 하지 않았다면, 더듬이 회로는 제거하고 피에조 스피커 회로는 그대로 남겨두십시오.

- PING))) 센서 회로를 Propeller Activity Board (오리지널 또는 WX 버전)에 구성하고 연결하십시오.

- PING)))) 센서의 SIG 핀과 프로펠러 I / O 핀 (이 경우에는 P8) 사이에 2.2 kΩ 저항을 사용하십시오.

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


참고: Ping))) 센서 및 서보 포트 : 자신의 프로젝트를 설계할 준비가 되면 Ping)) 센서를 로봇의 다른 곳에 장착할 수 있습니다. 이 작업을 보다 쉽게 수행하려면 P16-P17 서보 포트 전원 점퍼를 5V로 설정한 다음 3 핀 연장 케이블을 사용하여 해당 포트 중 하나에 센서를 연결하십시오. 각 서보 포트에는 Propeller I / O 핀과 직렬로 연결된 3.9 k 옴 저항이 포함되어 있으므로 브레드보드 회로에 필요한 2.2 k 옴 저항을 포함할 필요가 없습니다.


핑))) 테스트

PING)))) 센서의 에코 위치는 최대 3.3 미터 떨어진 센서에서 사운드를 효과적으로 반사할 수 있는 물체에서 작동합니다. 작은 물체는 충분한 소리를 반사하지 않습니다. 단단한 표면을 가진 실린더, 공 모양의 장애물 및 벽이 직접 마주보게 되면 잘 작동합니다. 비스듬한 각도에서 접근한 벽은 PING))) 센서로 소리를 되돌아오게 하지 않고, 사운드를 멀리 반사합니다. 커튼이나 인형이 있는 동물과 같은 부드러운 물건은 소리를 숨기고 반향을 튀기지 않습니다.


그림입니다. 원본 그림의 이름: mem000005a0003e.png 원본 그림의 크기: 가로 571pixel, 세로 303pixel 사진 찍은 날짜: 2013년 09월 02일 오후 6:17


사운드를 되돌아오도록 하는 장애물의 경우, PING))) 센서 및 핑 라이브러리는 3cm ~ 3m 범위의 센티미터 거리 측정을 제공합니다. 공기 온도는 이러한 거리 측정의 정확도에 영향을 줄 수 있습니다. 이 현상이 발생하는 이유에 대해 자세히 알아보려면 사운드 속도 대 공기 온도에 대한 참조 문서를 확인하십시오.


테스트 프로그램은 SimpleIDE 터미널에서 PING))) 거리 측정 값을 표시합니다. PING)) 센서가 다양한 각도에서 다양한 물체와 벽을 감지하여 로봇카(ActivityBot)가 이 센서로 수행할 수 있는 작업과 수행 할 수없는 작업을 잘 파악할 수 있습니다.


그림입니다. 원본 그림의 이름: mem000005a0003f.png 원본 그림의 크기: 가로 546pixel, 세로 212pixel 사진 찍은 날짜: 2013년 09월 02일 오후 5:23     


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

- Test Ping을 ... Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot에서 엽니다.

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

- 손, 컵, 볼까지의 거리를 측정 해보십시오. 모두 쉽게 감지할 수 있어야 합니다.

- 박제된 동물이나 구겨진 천 조각처럼 부드러운 곳으로 거리를 측정해보십시오. PING))) 센서가 에코를 감지할 수 있습니까?

- 벽의 거리를 정면으로 측정해보십시오.

- 다양한 각도로 접근하면서 벽까지의 거리를 측정해보십시오. PING))) 센서는 객체를 계속 볼 수 있습니까?


어떻게 동작하는가?

PING))) 센서는 측정을 시작하기 위해 프로펠러 칩으로부터 시작 펄스라 불리는 짧은 high / low 신호를 필요로 합니다. 그러면 센서가 초음파 클릭을 만들고 SIG 핀을 높게(high) 설정합니다. 에코가 돌아오면 SIG 핀을 로우(low)로 설정합니다. 그러면 프로펠러 칩은 PING)))의 지속 시간을 측정할 수 있습니다. 센서 SIG 핀의 높은 신호는 반향 시간에 해당합니다.


그림입니다. 원본 그림의 이름: mem000005a00040.png 원본 그림의 크기: 가로 573pixel, 세로 242pixel 사진 찍은 날짜: 2013년 08월 30일 오후 11:52     


ping 라이브러리는 에코 리턴 시간 측정을 센티미터 단위 거리로 변환하는 수학을 처리합니다. 모든 코드는 ping_cm 함수를 사용하여 거리를 요청하고 센서에 연결된 프로펠러 I / O 핀 번호를 전달해야 합니다. 테스트 코드에서 함수의 반환 값은 distance 라는 변수에 저장됩니다. 그런 다음 SimpleIDE 터미널에 print ( "% c distance = % d cm % c", HOME, distance , CLREOL) 와 함께 표시됩니다. 이 특정 인쇄 문은 커서를 HOME 과 함께 왼쪽 위 홈 위치에 놓고 거리를 표시한 다음 CLREOL 은 줄 끝까지 문자를 지웁니다.  CLREOL이전 측정값이 현재 측정값보다 많은 경우 유용합니다. (프로그램이 이 단계를 건너 뛴 경우, 이전 측정값보다 1 자리 작을 경우 측정 후 cm 대신 cmm이 표시됩니다. 원한다면 시도하십시오.)     


/*

  Test Ping.c

  Test the PING))) sensor before using it to navigate with the ActivityBot.

*/

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

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

int distance;                                 // Declare distance variable

int main()                                    // main function

{

  while(1)                                    // Repeat indefinitely

  {

    distance = ping_cm(8);                    // Get cm distance from Ping)))

    print("%c distance = %d%c cm",            // Display distance

           HOME, distance, CLREOL);          

    pause(200);                               // Wait 1/5 second

  }

}


알고 계셨습니까?

핑 라이브러리는 마이크로 초 단위로 에코 펄스를 측정한 다음 소리가 실온에서 0.03448 cm / μs로 이동한다는 사실을 사용합니다. 이는 온도가 22.2 ℃ 일 때 1 초당 백만 분의 1 초당 3.448 센티미터입니다. 자동차가 거리 = 속도 x 시간을 여행하는 것처럼 s = ct의 방정식을 사용하여 소리도 그렇게 계산합니다. 여기서 s는 거리, c는 소리의 속도, t는 시간입니다.


그림입니다. 원본 그림의 이름: mem000005a00041.png 원본 그림의 크기: 가로 331pixel, 세로 231pixel 사진 찍은 날짜: 2013년 08월 31일 오후 0:00     


에코의 거리를 계산하려면 시간 측정이 거리의 두 배 (앞뒤)이므로 기억해야합니다. 방정식은 다음과 같습니다.


 그림입니다. 원본 그림의 이름: mem000005a00042.png 원본 그림의 크기: 가로 96pixel, 세로 42pixel 사진 찍은 날짜: 2013년 08월 31일 오후 0:00    


양측을 2로 나누면 시간 측정에서 거리에 대한 방정식을 얻었습니다.


 그림입니다. 원본 그림의 이름: mem000005a00043.png 원본 그림의 크기: 가로 194pixel, 세로 66pixel 사진 찍은 날짜: 2013년 08월 31일 오후 0:01    


0.03448 / 2 = 1/58이므로, 마이크로 초 에코 시간에서 cm 거리에 대한 방정식은 다음과 같습니다.


그림입니다. 원본 그림의 이름: mem000005a00044.png 원본 그림의 크기: 가로 83pixel, 세로 57pixel 사진 찍은 날짜: 2013년 08월 31일 오후 0:01     

 

시도해 보세요!

ping 함수를 호출하여 원시 마이크로 초 측정을 표시할 수 있습니다.

그림입니다. 원본 그림의 이름: mem000005a00045.png 원본 그림의 크기: 가로 549pixel, 세로 215pixel


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

- 아래와 같이 main 함수를 수정하십시오.

- 프로그램을 실행하고 출력을 확인하십시오.

그림입니다. 원본 그림의 이름: mem000005a00046.png 원본 그림의 크기: 가로 471pixel, 세로 306pixel 사진 찍은 날짜: 2013년 09월 04일 오후 11:05     


당신 차례 !

- 계산기를 사용하여 센티미터 거리가 마이크로 초 거리 ÷ 58인지 확인하십시오. C 언어 int 계산은 항상 반올림됩니다.



2) 초음파 주행하기


이제 PING)) 센서로 센티미터 거리를 측정할 수 있고 어떤 종류의 물체인지 감지할 수 있으므로 탐색에 사용하도록 합시다.


모든 코드는 미리 정의된 값, 예를 들어 20cm 미만인 PING))) 센서에서 거리 측정을 받을 때까지 로봇을 앞으로 이동시키는 것입니다. 그런 다음, 천천히 멈추십시오. 그 후, 측정된 거리가 20cm 이상이 될 때까지 제자리에 놓습니다. 그 시점에서, 앞으로 나아가는 것이 안전할 것입니다. 로봇카(ActivityBot)의 탐색 주행을 좀 더 흥미롭게 만들려면 코드에서 임의의 숫자를 사용하여 방향을 결정할 수 있습니다.


그림입니다. 원본 그림의 이름: mem000005a00047.png 원본 그림의 크기: 가로 504pixel, 세로 293pixel 사진 찍은 날짜: 2013년 09월 01일 오후 10:07


센서 감지 테스트, 멈추기, 회전하기

실제로 탐색 주행하기 전에 작은 프로그램을 테스트하여 로봇카(ActivityBot)가 장애물 앞에 멈추고 장애물에서 벗어나게 하는 것이 중요합니다. 이 예제 프로그램은 PING))) 측정된 거리가 20cm 이상인 동안 로봇카(ActivityBot)를 진행시킵니다. 거리가 20cm보다 작거나 같으면 로봇카가 정지합니다. 그런 다음 20cm 이상 측정할 때까지 제자리로 돌아갑니다. 이는 물체가 더 이상 보이지 않을 때까지 로봇카가 돌아왔음을 의미합니다.


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

- Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot 에서 Detect and Turn from Obstacle을 오픈하십시오.

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

- 로봇카를 프로그래밍 케이블에서 분리하십시오.

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

- 리셋 버튼을 눌렀다 놓습니다.

- 벽, 블록, 물병 또는 다른 장애물을 향해 보내십시오.

- 그것이 20cm보다 가깝게 될 때까지 최고 속력을 내고, 속도를 줄이고 멈추고 돌아서는지 확인하십시오.

- 방향을 바꾸기 위해 선택한 방향이 무작위임을 알 수 있도록 여러 번 시도해보십시오.

 

어떻게 동작하는가?

이 프로그램은 distance = ping_cm (8)을 사용하지 않습니다. 대신 ping_cm (8)이 반환하는 값을 취하여 결정에 사용합니다. 따라서 거리 변수를 선언할 필요가 없습니다. 그러나 어떤 방법으로 돌릴지 결정하기 위해 난수를 저장하는 변수가 필요합니다. 그래서 main 함수 앞에 turn 이라는 변수에 대한 선언이 있습니다.


drive_setRampStep (10)으로 프로그램이 시작하고, 1/50 초당 속도가 변경하도록 허용되는 초당 틱의 수를 설정합니다. 함수 호출이 10을 통과하기 때문에, 매 1/50초 마다 상기 속도는 초당 10 틱만큼 변경됩니다. 다음으로, drive_ramp (128, 128 )는 초당 10 틱 단위로 최대 속도까지 램프합니다. 10 의 램프 단계에서 최대 속도로 상승하려면 13 배의 1/50초 = 0.26 초가 걸립니다. 모든 단계는 120에서 128까지의 마지막 단계를 제외하고는 10 단계입니다.


/*

  Detect and Turn from Obstacle.c

  Detect obstacles in the ActivityBot's path, and turn a random direction to avoid them.

*/

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

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

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

int turn;                                     // Navigation variable

int main()                                    // main function

{

  drive_setRampStep(10);                      // 10 ticks/sec / 20 ms

  drive_ramp(128, 128);                       // Forward 2 RPS

  // While disatance greater than or equal

  // to 20 cm, wait 5 ms & recheck.

  while(ping_cm(8) >= 20) pause(5);           // Wait until object in range

  drive_ramp(0, 0);                           // Then stop

  // Turn in a random direction

  turn = rand() % 2;                          // Random val, odd = 1, even = 0

  if(turn == 1)                               // If turn is odd

    drive_speed(64, -64);                     // rotate right

  else                                        // else (if turn is even)

    drive_speed(-64, 64);                     // rotate left


  // Keep turning while object is in view

  while(ping_cm(8) < 20);                     // Turn till object leaves view

  drive_ramp(0, 0);                           // Stop & let program end

}


다음으로 프로그램은 한 줄 짜리 루프를 시작합니다 : while (ping_cm ()> = 20) pause (5) . 이것은 " ping_cm 함수가 20보다 크거나 같은 값을 반환했는지 확인합니다 (객체가 20cm 이내에서 감지되지 않음). 만약 이것이 사실이라면 5ms 동안 일시 중지한 다음 다시 확인하십시오." ping_cm가 20보다 큰 값을 반환받는 한, while 루프가 계속 반복되고, 로봇카(ActivityBot) 계속 전진합니다. 


만약 ping_cm의 함수가 20 이하의 값 (객체가 20cm에서 검출)을 리턴하면, while 조건이 더 이상 참(true)이 아니고, 루프가 반복 멈춥니다. 이렇게 하면 코드가 drive_ramp (0, 0)으로 이동합니다. 그러면 로봇카(ActivityBot)가 멈추는 속도가 느려지며 약 0.26 초가 소요됩니다.


멈추면 로봇카(ActivityBot)는 객체를 피하기 위해 방향을 결정해야합니다. 이 예제는 수학 라이브러리의 rand 함수 (simpletools에 포함)를 사용하여 임의로 왼쪽과 오른쪽 중에서 선택합니다. 랜드의 기능은 0 2,147,483,648까지의 범위에서 어딘가에 의사 랜덤 값을 반환합니다. 코드가 rand를 호출할 때마다 의사 랜덤 시퀀스에 새 값을 반환합니다. 문장 turn = rand () % 2 는 2를 난수로 나눈 다음 나머지 (1이나 0이 될 것임)를 취해 턴 변수에 복사합니다.


이 turn 변수의 무작위 1 또는 0은 어느 방향으로 회전할지 결정하는데 사용됩니다. turn 값이 무작위로 하나 선택되면, (turn == 1) drive_speed (64, -64) 문은 로봇카(ActivityBot)를 오른쪽으로 회전시킵니다. 대신 turn 이 무작위 0을 얻으면, drive_speed (-64, 64) 는 왼쪽으로 회전시킵니다. 그 후, 오브젝트가 여전히 표시되어 있는 동안 (ping_cm (8) <20) 반복을 계속합니다. 로봇카(ActivityBot)가 충분히 멀리 회전하자마자 멈춥니다.


이 모든 것이 작동했다면 main 함수의 대부분의 코드를 while (1) 루프에 넣으면 로봇카(ActivityBot)가 새로운 장애물을 찾게됩니다.



알고 계셨습니까?

라이브러리 목록 - 이 응용 프로그램은 네 개의 라이브러리, simpletools (pause), abdrive ( anything starting with drive), ping ( ping_cm ) 및 math ( rand )의 기능을 사용합니다. simpletools에 이미 포함되어 있기 때문에 수학 라이브러리는 여기에 선언되지 않지만 #include <math.h>를 목록에 쉽게 추가할 수 있습니다. 규칙이 따옴표 대신 <> 기호로 묶인 것은 Propeller GCC의 일부이며 Propeller C Tutorial의 사용자 지정 라이브러리 (simpletools, abdrive and ping)의 일부가 아니기 때문입니다.


 

이것을 시도하십시오 – Ping)))으로 탐색주행

이 프로그램은 다음 장애물을 찾아 계속 진행하고 계속 반복하기 위해 while (1) 루프가 필요합니다. while 루프의 일부일 필요는 없는 유일한 것은 마지막 drive_ramp (0, 0) 입니다.


- 다른 이름으로 프로젝트 저장 버튼을 사용하여 예제 프로그램의 복사본을 내 프로젝트에 저장하십시오. Ping과 함께 Roaming이라는 이름을 사용하십시오 (Try This).

- 아래 예제와 일치하도록 프로그램을 수정하십시오. while (1)에 이어 여는 중괄호 {}를 추가하는 중입니다. 마지막 문장 바로 위에 닫는 중괄호를 추가합니다 } .

- 가독성을 위해 방금 추가한 중괄호 사이의 모든 문장을 들여 쓰십시오. 블록을 음영 처리하고 Tab 키를 누르면 됩니다.

- Load EEPROM & Run 버튼을 사용하여 프로그램을 로봇카(ActivityBot)에 로드하십시오. PWR을 0으로 설정하고 프로그래밍 케이블에서 분리하십시오.

- PWR 스위치를 2로 설정하고 리셋 버튼을 누르고 있습니다.

- 여러 장애물이 있는 빈 공간에 그것을 설정하고 로봇카(ActivityBot)가 다음 장애물을 찾는데 어떻게 변했는지 관찰하십시오.

    

그림입니다. 원본 그림의 이름: mem000005a00048.png 원본 그림의 크기: 가로 489pixel, 세로 531pixel 사진 찍은 날짜: 2013년 09월 13일 오후 3:35

 

당신 차례 !

다음은 세 가지 과제입니다.

- 장애물마다 방향이 바뀌도록 코드를 수정하십시오.

힌트 : turn = rand () % 2 대신 turn = (turn + 1) % 2을 사용하십시오 . 이것은 1을 돌려서 턴 / 2 의 나머지를 취합니다. 1, 0, 1, 0 ...이 됩니다.

- 네 가지 장애물을 발견 한 후에 로봇카(ActivityBot)가 멈추도록 하십시오.

힌트 : 턴이있는 장애물을 세는 변수를 선언하고 while 루프를 시작하기 전에 0으로 초기화 하십시오. while (1) 루프를 통해 매번 count 변수에 1을 더하십시오. 반복을 4로 제한하는 방법은 여러 가지가 있습니다. 하나씩 알아낼 수 있습니까? 

- 미로를 탐험하는 가장 간단한 초기 접근법은 각 벽에서 우회전하는 것입니다. 반드시 최선의 접근 방법은 아니지만 확실히 단순합니다. 장애를 만났을 때 코드가 바뀌도록 코드를 수정하십시오.



3) 초음파 센서로 대상물체 따라 가기


장애물을 찾아 회피하는 대신 로봇카(ActivityBot)를 대상으로 삼는 것이 어떻습니까? 동일한 센서 시스템, 다른 코드. 모든 프로그램은 원하는 거리를 확인하는 것입니다. 객체가 멀리 떨어져 있으면 앞으로 이동하십시오. 물체가 원하는 거리보다 가까운 경우 뒤로 이동하십시오. 물체의 거리가 원하는 거리와 같으면 계속 움직입니다.


그림입니다. 원본 그림의 이름: mem000005a00049.png 원본 그림의 크기: 가로 504pixel, 세로 334pixel 사진 찍은 날짜: 2013년 09월 01일 오후 10:40


 

전방물체 따라가기(추종하기)

이 예제는 로봇카(ActivityBot)가 자신과 그 앞에 있는 객체 사이의 거리가 32cm가 되도록 시도합니다. 어떤 물체도 감지되지 않으면 로봇은 물체가 발견될 때까지 앞으로 나아가고 32cm 거리를 유지합니다. 객체를 로봇카(ActivityBot)에서 멀리 당기면 앞으로 추월됩니다. 마찬가지로, 물체를 향해서 밀면 물체가 복원되어 32cm 거리로 복원됩니다.


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

- Documents \ SimpleIDE \ Learn \ Examples \ Robots \ ActivityBot에서 Follow with Ping)))를 오픈하십시오.

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

- 로봇카를 벽쪽으로 보내고 멈추고 32cm 거리를 유지하는지 확인하십시오.

- 로봇카를 오브젝트쪽으로 보내고, 잠근 후에는 오브젝트를 로봇카(ActivityBot)쪽으로 또는 뒤로 밀어보십시오. 32cm 거리를 유지하려면 응답해야 합니다.

 


어떻게 동작하는가요?

이 프로그램은 distance , setPoint , errorVal , kp 및 speed의 5 가지 변수를 선언합니다.


distance 는 로봇카(ActivityBot) 앞에 있는 객체와의 측정된 거리를 저장합니다.

setPoint 는 로봇카(ActivityBot)가 자신과 그 앞에 있는 객체 사이에서 유지하려고 시도해야하는 목표거리를 저장합니다.

errorVal 은 측정된 거리와 원하는 setPoint 거리 간의 차이를 저장합니다.

kp 는 비례 상수를 저장합니다. errorPoint 는 setPoint 거리를 유지하는데 도움이되는 속도에 대해 kp 로 곱할 수 있습니다.

speed 는 errorVal * kp 의 결과를 저장합니다.


/*

  Follow with Ping.c

  Maintain a constant distance between ActivityBot and object.

*/

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

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

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

int distance, setPoint, errorVal, kp, speed;  // Navigation variables

int main()                                    // main function

{

  setPoint = 32;                              // Desired cm distance

  kp = -10;                                   // Proportional control

  drive_setRampStep(6);                       // 7 ticks/sec / 20 ms

  while(1)                                    // main loop

  {

    distance = ping_cm(8);                    // Measure distance

    errorVal = setPoint - distance;           // Calculate error

    speed = kp * errorVal;                    // Calculate correction speed


    if(speed > 128) speed = 128;              // Limit top speed

    if(speed < -128) speed = -128;


    drive_rampStep(speed, speed);             // Use result for following

  }

}


프로그램은 setPoint 32cm 와 비례 상수 kp -10로 시작합니다. 또한 램프 단계 크기를 6으로 설정하여 갑작스러운 속도 변화를 완충시킵니다. while (1 ) 루프 내부에서, 프로그램은 매우 빠르게 로봇카(ActivityBot) 다섯 단계를 반복하여 자체와 대상 물체 사이의 거리를 유지합니다 :


1. distance = ping_cm (8)으로 측정된 거리를 가져옵니다.

2. errorVal = setPoint - distance를 사용하여 원하는 거리와 측정된 거리의 차이를 계산합니다.

3. speed = kp * errorVal로 원하는 거리와 측정된 거리의 차이를 수정하는데 필요한 속도를 계산하십시오.

4. 두 개의 if 문으로 출력을 +/- 128로 제한하십시오.

5. 보정된 speed 로 두 바퀴를 동작하십시오.

 


알고 계셨습니까?

원하는 물리적 출력 레벨을 유지하는 자동화된 시스템을 제어 시스템이라고 합니다. 로봇카(ActivityBot)의 경우 유지하는 레벨은 앞에 있는 객체와 자신 사이의 거리입니다. 많은 제어 시스템은 레벨을 유지하기 위해 피드백 루프를 사용합니다. 우리의 로봇카(ActivityBot)는 이에 대한 대표적인 예입니다. 측정된 거리는 시스템으로 피드백되고 다음 속도를 계산하기 위한 목표점과 비교되며, 이는 제어 루프라고 하는 프로세스에서 반복적으로 발생합니다.


엔지니어는 컨트롤 루프의 디자인을 생각하고 기술자 및 다른 엔지니어에게 어떻게 작동하는지 전달하기 위해 이와 같은 그림을 사용합니다. 설정점(또는 목표점 : ActivityBot이 유지하려고하는 거리)이 32이고 측정된 거리가 38 인 경우 오류 값이 있습니다. 이 오류 값은 set point – measured distance 입니다. 32 - 38 = -6입니다. 이 오류는 루프에서 오류를 수정하는 속도인 출력의 비례 상수 ( kp )를 곱합니다. speed = kp x errorVal 또는 60 = -10 x -6입니다.  


그림입니다. 원본 그림의 이름: mem000005a0004a.png 원본 그림의 크기: 가로 600pixel, 세로 233pixel 사진 찍은 날짜: 2013년 09월 01일 오후 10:53

 

원을 합계 접합 (덧셈 또는 뺄셈) 이라고 하며 직사각형 블록은 다를 수 있는 연산을 지정합니다. 이 예에서 상위 1은 비례 상수로 오류를 곱하는 비례 제어 블록입니다. System 블록은 우리가 반드시 제어할 필요가 없는 것들을 나타냅니다. 이 예제에서 사용되지 않은 다른 일반적인 컨트롤 블록은 루프 반복을 보정하기 위해 수정을 허용하는 Integral과 갑작스런 시스템 변경에 응답하는 Derivative입니다.

 

시도해 보세요!

다른 측정된 거리에 값이 어떻게 반응하는지 확인하는 것이 좋습니다. 이렇게 하려면 화면에 인쇄값을 추가하기만 하면 됩니다.


그림입니다. 원본 그림의 이름: mem000005a0004b.png 원본 그림의 크기: 가로 597pixel, 세로 287pixel


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

- 아래와 같이 main 함수를 수정하십시오 .

- 전원 스위치를 1로 설정하고 (ActivityBot가 책상에서 벗어나지 않도록) Run with terminal을 클릭하십시오.

- 프로그램을 실행하고 Ping))) 센서와 다른 거리에 있는 대상 개체를 배치할 때 출력 값을 모니터링합니다. 20 ~ 44cm의 거리에 초점을 맞춥니다.

경고 : 이 수정 된 프로그램은 탐색 전용이 아닌 표시 전용입니다. 탐색을 위해서는 Ping으로 다음을 다시여십시오.


그림입니다. 원본 그림의 이름: mem000005a0004c.png 원본 그림의 크기: 가로 600pixel, 세로 395pixel 사진 찍은 날짜: 2013년 09월 01일 오후 11:10


측정된 거리가 40이면 errorVal = setPoint - distance 는 errorVal = 32 - 40 = -8이 됩니다. 그러면 speed = kp * error 는 speed = -10 * -8 = + 80입니다. 따라서 로봇카(ActivityBot)는 초당 80 틱을 시도합니다. 이 값은 +/- 128 범위에 속하므로 로봇카(ActivityBot)는 오브젝트를 따라잡기 위해 절반 속도 이상으로 진행됩니다. 이제 정답은 24의 거리에 대해 이 작업을 시도하십시오. 정답은 로봇카가 후진하는 speed = -80입니다. 거리가 28 인 경우 speed = -49로 로봇카(ActivityBot)가 천천히 후진합니다.


- 30, 32, 34, 36 cm의 거리에 대해 이 계산을 반복하십시오.

 

당신 차례 !

여기에 실험할 가치가 많이 있습니다. 예를 들어, setPoint 변수를 32에서 20으로 변경하면 로봇카(ActivityBot)는 자신과 그 앞에 있는 객체 사이의 거리를 20cm로 유지하려고 시도합니다. kp 의 값은 더 작은 오차 거리로 보정하기 위해 더 빨리 진행하거나 더 큰 오차 거리에 대해보다 느리게 교정하려고 시도할 수 있도록 증가시킬 수 있습니다.


- setPoint 및 kp 값을 조정하면 성능에 어떤 변화가 있는지 확인합니다.

- 당신이 시도했을 때 로봇카가 어떻게 대응했는지 기록하십시오. setPoint 및 kp 의 어떤 값이 최적입니까?


drive_setRampStep 값을 줄이면 변경 사항을 완화하지만 너무 느리게 응답하여 객체로 실행될 수 있습니다. 그것을 증가시키면 갑작스럽게 반응합니다. 너무 크면 방향이 너무 빨리 바뀌어 브레드보드의 Ping)) 센서를 탈출시킬 수도 있습니다!


- drive_setRampStep 값을 아래로 조정하여 움직임을 부드럽게 만들거나 위쪽으로 돌리면 갑작스러운 움직임을 만듭니다.

- 자신에게 가장 적합한 성능을 검색하면서 가치를 실험 해보십시오.

- 다시 시도한 내용과 로봇카(ActivityBot)의 성능이 어떻게 반응했는지 메모하십시오.



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