프로펠러 로봇카
Link
Contents
프로펠러 로봇카 실습 세부목차
2. 소프트웨어 프로그래밍
4. 더듬이센서로 주행하기
5. 초음파센서로 주행하기
6. 가시광선 탐색 주행하기
※ 본 페이지의 내용은 패럴렉스(Learn.Parallax.com)사의 공식 홈페이지에서 제공되는 자료를 참고하여 작성되었습니다.
본 자료의 원문을 참조하려면 프로펠러 C-프로그래밍 ActivityBot 홈페이지를 방문할 수 있습니다. 프로펠러 로봇카는 아두이노 로봇카와 달리 C-언어 문법을 사용합니다. C-언어에 익숙해지려는 목적이라면 이 자료를 조금 더 자세히 살펴보기 바랍니다.
비접촉 센서로 광센서를 산업현장에서 많이 사용합니다. 이전 학습내용인 초음파 센서 방식과 비슷하게 비접촉방식으로 물체를 감지할 수 있습니다. 초음파 센서는 초음파를 물체로 보내서 반향되는 초음파 음을 수신하는 원리인 것처럼 광센서는 광신호를 물체에 비추어서 물체를 감지할 수 있습니다. 다만, 초음파음의 전파속도보다 빛의 속도가 매우 빠르기 때문에 초음파 센서의 거리측정 원리처럼 활용하는 것은 쉽지 않습니다. 그렇지만, 광센서 고유의 또 다른 감지 특성이 있다는 것에 유의해서 아래 내용들을 살펴보기 바랍니다.
아래 세부 내용들을 살펴볼 수 있습니다.
1) 광센서 전자회로 구성하기
2) 유용한 광센서 감지신호 만들기
3) 광센서로 탐색 주행하기
광센서는 모든 종류의 로보틱스, 산업 및 상업용 애플리케이션에 사용됩니다. 다음으로, 가시광선으로 주행하는 방법을 살펴보겠습니다. 포토트랜지스터라고 불리는 한 쌍의 작은 빛 센서를 사용하여 로봇카(ActivityBot)는 오른쪽과 왼쪽에 있는 빛의 레벨을 측정하고 비교할 수 있습니다. 그런 다음 탐색할 때 더 밝은쪽으로 돌아갈 수 있습니다. 이렇게 하면 로봇카(ActivityBot)를 손전등을 따라 프로그래밍하거나 어두운 방에서 밝은 출입구로 탈출구를 찾을 수 있습니다.
본 실습에는 포토트랜지스터 광센서를 사용합니다. 만약 사용해본적이 없다면 포토트랜지스터 부품에 대해 학습을 참고하기 바랍니다. 소개된 링크 페이지에는 로봇카(ActivityBot) 키트에 포함되어있는 것과 동일한 포토트랜지스터에 대한 페이지가 있습니다.
본 실습을 사용하기 전에 SimpleIDE 소프트웨어가 설치되어 있는지 확인하십시오. 만약 설치되어 있지 않다면 이전으로 돌아가서 설치하기 바랍니다.
이제는 로봇카(ActivityBot) 포토트랜지스터에 "눈"을 만들어 주기 위해 두 개의 포토트랜지스터 회로를 제작하고 테스트해야 합니다. 피에조 스피커 회로는 제자리에 두십시오.
필요한 부품들
(2) 포토트랜지스터
(2) 0.01μF 커패시터 (103로 표시)
(2) 220 옴 저항 (적 - 적 - 갈색)
광센서 전자회로 구성
아래에 표시된 회로를 구축하십시오.
- 아래 배선도와 같이 포토트랜지스터의 짧은 리드와 플랫 스폿이 접지에 연결되어 있는지 확인하십시오.
- "103"이라고 표시된 0.01μF 커패시터를 사용하십시오. 로봇카(ActivityBot) 키트의 커패시터는 극성이 없습니다. 어떤 방법으로 연결해도 문제가 되지 않습니다.
- 포토트랜지스터를 서로 위쪽에서 약 90 °, 수직에서 약 45 ° 위쪽으로 향하게 하십시오.
광센서 회로 테스트
이 테스트는 SimpleIDE 터미널에 원시 광센서 판독 값을 표시합니다. 방안의 전반적인 밝기보다 밝은 전등 또는 램프가 필요합니다.
포토트랜지스터 회로는 형광등이나 백열등과 함께 실내에서 잘 동작하도록 설계되었습니다. 직사광선이나 직접 할로겐 라이트는 피하십시오. 그들은 너무 많은 적외선으로 포토트랜지스터를 넘치게 할 것입니다.
- 로보틱스 영역에서 창 블라인드를 닫아 직사광선을 차단하고 할로겐 램프를 위쪽으로 향하게 하여 빛이 천장에 반사되도록 합니다.
- SimpleIDE의 프로젝트 열기 단추를 클릭하십시오.
- Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot에서 Test Light Sensors.side를 엽니다.
- 전원 스위치를 위치 1에 놓습니다.
- 터미널 버튼으로 실행을 클릭하십시오.
- 하나의 포토트랜지스터 위로 손을 잡고 다른 하나는 값이 변하는 것을 지켜보십시오.
위의 값은 오버 헤드 형광등이 있는 실내에서 촬영한 것입니다. lightRight 측정값이 얼마나 큰지 주목하십시오. 이는 오른쪽 포토트랜지스터 위로 손을 가져가면 발생합니다.
참고: 일치하지 않는 측정
두 개의 포토트랜지스터 측정값이 정확히 일치하지는 않습니다. 각각의 개별 센서는 제조 공정의 자연스러운 부분에 따라 조금씩 다를 수 있으며, 어떤 환경에서도 밝기 수준이 정확하지는 않습니다. 그러나 같은 수준의 빛에 노출되었을 때 다른 센서보다 약 100 배 큰 측정값을 제공하면 포토트랜지스터는 아마도 거꾸로 설치된 것입니다. 회로를 점검하고 다시 시도하십시오.
어떻게 동작하는가?
이 간단한 프로그램은 두 개의 int 변수인 lightLeft 와 lightRight 를 선언하여 왼쪽과 오른쪽의 포토트랜지스터 회로에서 반환된 값을 유지하기 시작합니다.
이 동작은 while (1) 루프 내에서 발생합니다. 이 루프는 두 개의 광센서 측정을 받아 반복하여 결과를 표시합니다.
포토트랜지스터 측정이 두 가지 과정이라는 것을 기억하십시오. 첫째, high (9) 는 포토트랜지스터 회로를 3.3V에 연결하여 회로의 커패시터가 작은 배터리처럼 충전되도록 합니다. 그렇게하는데는 잠깐의 시간이 걸립니다. pause (1) 은 충분한 시간을 허용합니다. 회로를 충전한 직후, 다음 코드 행은 rc_time 함수를 호출하여 I / O 핀 9에서 측정을 수행하고 결과를 lightLeft에 저장합니다. lightRight 에서 센서 측정값을 저장하는 동일한 단계가 수행됩니다.
그 후, print 문은 각 변수의 이름 뒤에 10 진수 값을 인쇄합니다. 제어 문자 HOME 은 매 순간 SimpleIDE 단말기의 왼쪽 상단 모서리로 커서를 되돌리고 CLREOL 은 이전 측정에서 남은 문자를 지웁니다.
/*
Test Light Sensors.c
*/
#include "simpletools.h"
int lightLeft, lightRight;
int main()
{
while(1)
{
high(9);
pause(1);
lightLeft = rc_time(9, 1);
high(5);
pause(1);
lightRight = rc_time(5, 1);
print("%clightLeft = %d, lightRight = %d%c",
HOME, lightLeft, lightRight, CLREOL);
pause(250);
}
}
당신은 알고 있었습니까?
빛이 너무 작아서 인접한 봉우리 사이의 거리가 나노 미터 (nm) 단위로 측정됩니다. 이는 nm 단위로 측정됩니다. 아래 그림은 자외선 및 적외선과 같이 인간의 눈으로 감지할 수 없는 일부 색상과 함께 익숙한 색상을 보여줍니다. 로봇카(ActivityBot) 키트의 광 트랜지스터는 가시광선을 감지하지만 적외선 범위에 있는 850 nm 파장에 가장 민감합니다.
당신 차례 !
그냥 즐거움을 위해서 포토트랜지스터가 다른 색을 감지할 수 있는지 봅시다.
- 위의 색상 휘도 그래프를 확대하십시오.
- 테스트 라이트 센서를 다시 실행하십시오.
- 로봇을 화면까지 올려놓고 하나의 포토트랜지스터를 컬러바에 매우 가깝게 배치하십시오.
- 가장 높은 수치는 어떤 색입니까? 어떤 색깔이 가장 낮습니까?
당신의 관찰에 비추어 볼 때, 이것처럼 맑은 포토트랜지스터 만이 컬러 센서로 사용될 수 있다고 생각합니까? 그 이유는 무엇일까요?
로봇카(ActivityBot) 탐색의 경우 원시 센서값은 중요하지 않습니다. 중요한 것은 각 센서에 의해 감지된 빛의 양의 차이입니다. 따라서 로봇카(ActivityBot)는 더 밝아진 빛을 감지하는쪽으로 향할 수 있습니다. 서보 모터를 구동하기 위한 코드와 쉽게 통합할 수 있는 예측가능한 범위의 값을 갖는 것도 좋습니다.
이것을 달성하는 것은 놀랍도록 간단합니다. 먼저, 하나의 센서 측정값을 두 값의 합계로 나누십시오. 결과는 항상 0에서 1 범위입니다. 이 기술은 정규화된 차동 측정의 한 예입니다. 방정식으로 보이는 것은 다음과 같습니다.
두 가지 더 간단한 조작으로 결과를 더 쉽게 사용할 수 있습니다. 먼저 결과에 200을 곱하면 결과가 정수가 됩니다. 둘째, 100에서 100을 뺀 값은 항상 -100에서 100 사이의 값을 반환합니다. 광 트랜지스터가 밝거나 어둡지 않더라도 동일한 수준의 빛을 감지하면 최종 정수는 0이 됩니다. 이것은 제로 - justified 정규화된 차동 측정의 예입니다, 그것을 "ndiff"라고 짧게 부르겠습니다. 이제 우리 방정식은 다음과 같습니다.
아래의 예제 코드는 lightRight 및 lightLeft 측정값을 표시하고 ndiff 값을 숫자 라인에 별표로 표시합니다. 로봇카(ActivityBot) 탐색 프로그램이 센서값을 사용하여 밝은 빛에 대한 새로운 궤적을 목표로 하는 방법을 보다 쉽게 시각화할 수 있습니다.
그래픽 코드 테스트
- SimpleIDE의 프로젝트 열기 단추를 클릭하십시오.
- Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot에서 Test Light Sensors Grapgical.side를 엽니다.
- 터미널 버튼으로 실행(RUN)을 클릭하십시오.
- 광원쪽으로 그리고 광원에서 반대 방향으로 별표위치 변화를 볼 수 있도록 로봇카를 회전하세요.
참고: 문제 표시?
SimpleIDE 터미널 창 크기를 이 예제 프로그램보다 작게 변경하면 왜곡된 결과가 나타날 수 있습니다. 터미널의 크기를 더 넓게 조정한 다음 터미널로 다시 실행을 클릭하십시오.
어떻게 동작하는가요?
오랫동안 읽었지만, 그래픽 디스플레이가 simpletools 라이브러리로 print 문을 사용하여 생성된다는 것을 이해하고 싶다면 흥미롭습니다.
이 프로그램은 테스트 라이트 센서를 기반으로 합니다. lightLeft 와 lightRight 외에도 두 개의 변수가 추가로 선언됩니다. ndiff 는 fancy-named 방정식의 결과를 보유하고 위치는 별표를 SimpleIDE 터미널에 배치하는데 사용됩니다.
main 내부에는 SimpleIDE 터미널의 표시 레이아웃을 정의하는 세 개의 print 문이 있습니다.
첫 번째 print 에는 나열된 변수의 값이 표시되고 \n (새 줄) 형식 지정자는 세 줄의 빈 줄을 만들어 번호 줄 위에 표시할 별표가 있는 자리를 만듭니다.
두 번째 print 는 숫자 행을 표시한 다음 \ n 형식자를 표시합니다.
세 번째 print 는 숫자 행에 대한 레이블을 표시한 다음 \ n 형식자를 표시합니다.
그런 다음 s 라는 char 배열을 선언하고 51 개의 공백 문자로 초기화합니다. 이 공백 문자는 별표를 숫자 줄 위에 배치하는데 사용됩니다.
그런 다음 코드는 while (1) 루프를 시작합니다. 원시 phototransistor 측정을 얻는 다음 8 라인은 지금 친숙해야 합니다.
ndiff 로 시작하는 다음 행은 위에 표시된 ndiff 방정식과 같습니다.
ndiff 식 아래에 있는 세 개의 print 문은 (1) 커서를 위치시키고, (2) lightRight , lightLeft 및 ndiff 의 업데이트된 십진수 값을 표시하고 마지막으로 남은 문자를 지우고 (3) 커서를 별표가 사용할 줄로 옮깁니다.
다음으로, position = (ndiff + 100) / 4; ndiff 를 +100 으로 오프셋하여 양수인지 확인한 다음 / 4 를 사용하여 숫자 줄의 크기에 맞춥니다. 결과는 SimpleIDE 터미널에 별표를 배치하는데 유용한 숫자이며 position 변수에 할당됩니다.
다음과 같이 별표가 표시됩니다. s [position] = '*'; s 배열의 "position-th"요소를 공백 대신 별표로 재정의합니다. 그런 다음 별표가 print (s)로 적절한 위치에 표시됩니다. 이것은 S 배열내의 모든 요소를 표시합니다.
즉시, s[position] = ' '; "position-th"요소를 빈 공간으로 다시 정의하므로 별표는 루프를 통해 다음 실행시 재배치될 수 있습니다. 이 줄이 없으면 디스플레이에 별표가 누적되기 시작합니다.
루프는 pause (350)로 끝납니다. 반복하기 전에. 당신이 이것을 멀리 읽으면, 당신의 인내심에 감사드립니다!
/*
Test Light Sensors Graphical.c
*/
#include "simpletools.h"
int lightLeft, lightRight, ndiff, position;
int main()
{
print("lightLeft lightRight ndiff\n\n\n\n");
print("|------------------------|------------------------|\n");
print("-100 0 100\n");
char s[51] = {" "};
while(1)
{
high(9);
pause(1);
lightLeft = rc_time(9, 1);
high(5);
pause(1);
lightRight = rc_time(5, 1);
ndiff = 200 * lightRight / (lightRight + lightLeft) - 100;
print("%c%c", HOME, CRSRDN);
print("%d %d %d", lightLeft, lightRight, ndiff);
print("%c%c%c", CLREOL, CRSRDN, CR);
position = (ndiff + 100) / 4;
s[position] = '*';
print(s);
s[position] = ' ';
pause(350);
}
}
알고 계셨습니까?
괄호는 중요합니다. C 언어 수학적 표현에서, 예제 프로그램의 수학식과 같이, 더하기와 빼기 전에 곱셈과 나눗셈 연산이 먼저 수행됩니다. 그러나 괄호를 사용하여 연산을 둘러싼 후 중첩된 괄호의 경우 가장 안쪽의 연산부터 먼저 계산됩니다. 이러한 규칙은 연산자 우선순위라는 더 큰 규칙 집합의 일부입니다. 각 프로그래밍 언어에는 고유한 연산자 우선순위 규칙 집합이 있습니다.
시도해 보세요!
괄호 집합의 차이를 확인하려면 위의 프로그램과 동일한 수학 표현식을 사용하는 이 작은 프로젝트를 만듭니다.
- 테스트 라이트 센서 그래픽 프로젝트를 닫습니다.
- New Project를 클릭하고 Simple Operator Precedence와 같은 이름을 지정하고 SimpleIDE> My Projects에 저장하십시오.
- 아래 표시된 코드를 입력하고, 터미널에서 실행을 클릭한 다음, 표시되는 답변을 적어 두십시오.
- 다음과 같이 분자 주위에 괄호를 추가하십시오. (200 * 300)
- 프로그램을 다시 실행하십시오. 그 대답이 바뀌었습니까 ?
- 이제 300 + 187 주변의 괄호를 제거하고 프로그램을 다시 실행하십시오. 지금 답변이 무엇인가요?
- 위의 문장에 괄호를 다시 넣은 다음 두 번째 세트를 다음과 같이 전체 분모에 배치합니다. ((300 + 187) - 100)
- 마지막으로 프로그램을 다시 실행하십시오. 지금 답변은 무엇입니까?
당신은 괄호가 차이를 만들었다고 확신합니까?
이제 로봇카(ActivityBot)가 빛을 따라가도록 가자! 다음 코드는 로봇카가 손전등을 따라 가거나 조명이 밝은 출입구를 통해 어두운 방을 탐색 할 수 있게합니다.
빛으로 탐색 주행하기
- 손전등을 찾으면 더 밝을수록 좋습니다.
- SimpleIDE의 프로젝트 오픈 단추를 클릭하십시오.
- Documents \ SimpleIDE \ Learn \ Examples \ ActivityBot에서 Navigate by Light.side를 오픈하세요.
- EEPROM 로드 및 실행 버튼을 클릭하십시오.
- 로봇을 프로그래밍 케이블에서 분리하고 열린 공간에 설치하십시오.
- 전원 스위치를 2로 설정한 다음 리셋 버튼을 눌렀다 놓습니다.
- 로봇카(ActivityBot) 앞 바닥에 손전등을 비추십시오. 그러면 로봇카(ActivityBot)가 밝은 지점쪽으로 향해야 합니다. 손전등이 그다지 강하지 않다면 직접 센서를 향해야 합니다.
- 방의 조명을 끄고 외부 조명이 밝은 영역의 문을 여십시오. 로봇카(ActivityBot)가 방 밖으로 나가는 길을 찾아야 합니다.
어떻게 동작하는가?
이 프로그램은 simpletools 및 abdrive 라이브러리를 사용합니다. 일부 변수를 초기화한 후, 프로그램은 포토트랜지스터로부터 값을 수신하고 서보의 속도를 조정하여 더 밝은 빛을 감지하는 쪽으로 이동하는 무한 루프로 구성됩니다.
먼저, 친숙한 int 변수 lightLeft , lightRight 및 ndiff 가 센서 측정을 가져오고 사용하기 위해 선언됩니다. 그런 다음 int 변수 speedLeft 와 speedRight 가 나중에 drive_speed 함수 와 함께 사용되도록 선언됩니다.
main 함수의 while (1) 루프의 처음 6 줄 은 테스트 프로그램에서 바로 나옵니다. 라이트 센서 측정값을 가져와 lightLeft 및 lightRight에 값을 저장합니다.
다음 행은 Test Light Sensor Graphical에서 사용된 것과 동일한 ndiff 방정식입니다. 그것은 lightRight을 lightRight + lightLeft로 분할합니다. 결과에 200을 곱한 다음 100을 뺍니다. 이 값은 -100과 100 사이의 값을 가지며 ndiff에 할당됩니다. 양의 ndiff의 값은 좌측 포토레지스터가 광을 더 밝게 센싱하는 것을 의미하고, 음의 ndiff의 값은 우측 포토레지스터가 더 밝게 빛을 감지하는 것을 의미합니다. 값이 0에서 멀어질수록 두 개의 포토트랜지스터가 감지하는 것의 차이가 커집니다.
변수 speedLeft 와 speedRight 는 100으로 초기화됩니다. 다음에 오는 if 코드 블록을 볼 때 이것을 명심하십시오 .
첫 번째 조건은 " ndiff 가 0보다 크거나 같으면 (왼쪽의 밝은 빛), speedLeft 를 100 빼기ndiff * 4로 만듭니다." speedLeft에 대한 새로운 값은 100보다 작을 것이며 speedRight 는 if 블록 바로 아래의 drive_speed 함수 호출에서 해당 변수가 사용될 때 100으로 유지됩니다. 예를 들어, ndiff = 50 인 경우 이 명령문은 speedLeft = 100 - (50 * 4)과 같으며 -100과 같습니다. 결과는 로봇카(ActivityBot)를 불빛쪽인 왼쪽으로 회전시키는 drive_speed (-100, 100) 입니다.
그러나 ndiff 가 양수가 아니면 코드는 else speedRight + = (ndiff * 4)로 떨어집니다. 이것은 " speedRight 를 100 plus ndiff * 4 와 같게 만드는 것"으로 해석됩니다. 이것은 여전히 100보다 작은 수를 산출합니다. 여기서 ndiff 는 음수라는 것을 기억 하십시오. 예를 들어, ndiff = -25, 이 사항은 speedRight = 100 + (-25 * 4)와 동일합니다. 따라서 speedRight가
완전히 0과 같습니다. 반면에 speedLeft 는 여전히 100입니다. 이것은 로봇카(ActivityBot)가 밝은 빛쪽인 오른쪽으로 피벗하도록 우리에게 drive_speed (100, 0) 제공합니다.
/*
Navigate by Light.c
*/
#include "simpletools.h"
#include "abdrive.h"
int lightLeft, lightRight, ndiff;
int speedLeft, speedRight;
int main()
{
while(1)
{
high(9);
pause(1);
lightLeft = rc_time(9, 1);
high(5);
pause(1);
lightRight = rc_time(5, 1);
ndiff = 200 * lightRight / (lightRight + lightLeft) - 100;
speedLeft = 100;
speedRight = 100;
if(ndiff >= 0) speedLeft -= (ndiff * 4);
else speedRight += (ndiff * 4);
drive_speed(speedLeft, speedRight);
}
}
알고 계셨습니까?
광택 (Phototaxis) - 빛의 자극에 직접 반응하여 몸 전체를 움직이는 유기체를 말합니다. 밝은 빛쪽으로 이동하는 것은 양성 광택이라고 부르며, 밝은 빛에서 벗어나면 부정적인 광택이됩니다. Navigate by Light 프로그램이 로봇카(ActivityBot)을 긍정적인 광택성과 유사하게 만드는 반면 자연에서는 이 현상이 대개 미세한 생물체에서 발견되는 것 같습니다. 나방들은 빛에 끌립니다. 그러나 가로등 주변의 다양한 비행선들은 항법 시스템이 훨씬 더 복잡하다는 것을 보여줍니다.
시도해 보세요!
로봇카(ActivityBot)를 부정적인 광택과 유사하게 만드시겠습니까? Navigate by Light 코드에서 하나의 변수를 바꾸면 됩니다.
- 다른 이름으로 프로젝트 저장을 클릭하고 Navigate By Dark라는 이름으로 프로젝트 사본을 만듭니다.
- ndiff 식에서, lightRight의 첫번째 용도를 lightLeft로 변경하세요.
- 전원 스위치를 위치 1에 두고 코드를 EEPROM에 로드하십시오.
- 로봇카(ActivityBot)을 바닥에 놓고 스위치를 위치 2로 이동시킨 다음 리셋 버튼을 누릅니다.
- 로봇카(ActivityBot)에서 손전등을 비춥니다. 그것은 빛에서 멀어지고 테이블 아래 또는 어두운 구석에 있는 피난처를 찾아야 합니다.