브로클리프롭 로봇카 프로그래밍
Link
Contents
브로클리프롭 로봇카 프로그래밍 실습 세부목차
※ 본 페이지의 내용은 패럴렉스(Learn.Parallax.com)사의 공식 홈페이지에서 제공되는 자료를 참고하여 작성되었습니다.
브로클리프롭(BlocklyProp) 프로그래밍 방법으로 프로펠러 로봇카를 이용하여 실습할 수 있습니다. 로봇카와 브로클리프롭(BlocklyProp) 비주얼 프로그래밍으로 로봇공학, 그래픽 프로그래밍, 전자 공학을 익혀 보십시오!
이 페이지는 가시광센서로 로봇카 주행하기에 관한 내용입니다. 광센서는 모든 종류의 로보틱스, 산업 및 상업용 애플리케이션에 사용됩니다. 다음으로, 로봇카가 가시광선으로 이동하도록 교육해 봅시다. 포토트랜지스터라고 불리는 한 쌍의 작은 빛 센서를 사용하여 로봇카는 오른쪽과 왼쪽에 있는 빛의 레벨을 측정하고 비교할 수 있습니다. 그런 다음 탐색할 때 더 밝은쪽으로 돌아갈 수 있습니다. 이렇게 하면 로봇카를 손전등을 따라 움직이도록 프로그래밍하거나 어두운 방에서 밝은 출입구로 탈출구를 찾을 수 있습니다. 상세한 내용은 아래 연결링크를 사용하여 찾아볼 수 있습니다.
아래 세부 내용들을 살펴볼 수 있습니다.
1) 광 센서 전자회로 구성하기
2) 광센서로 효과적인 측정하기
3) 광센서로 주행하기
포토트랜지스터는 일반적인 유형의 아날로그 광센서로서 야간에는 베란다 조명이 자동으로 켜지는데 도움이 됩니다. 포토트랜지스터를 빛으로 제어되는 전류 밸브라고 생각하십시오. 빛이 장치 바닥에 닿으면 (B), 더 많은 전류가 해당 컬렉터 (C) 리드로 전도되어 이미터 (E) 리드에서 유출됩니다.
이제는 로봇카 포토트랜지스터에 "눈"의 역할을 주기 위해 두 개의 포토트랜지스터 회로를 제작하고 테스트해야 합니다. 피에조 스피커 회로는 제자리에 두십시오.
필요한 부품들
(2) 포토트랜지스터
(2) 0.01μF 커패시터 (103로 표시)
(2) 220 옴 저항 (적 - 적 - 갈색)
광센서 전자회로 구성
아래의 광센서 회로를 제작하십시오.
- 아래 배선도와 같이 포토트랜지스터의 짧은 리드와 플랫 스폿이 접지에 연결되어 있는지 확인하십시오.
- "103"이라고 표시된 0.01μF 커패시터를 사용하십시오. 로봇카 키트의 커패시터는 극성이 아닙니다. 어떤 방법으로 연결해도 문제가 되지 않습니다.
- 포토트랜지스터를 서로 위쪽에서 약 90 °, 수직에서 약 45 ° 위쪽으로 향하게 하십시오.
광센서 회로 테스트
이 테스트는 터미널 창에 원시 광센서 판독 값을 표시합니다. 방안의 전반적인 밝기보다 밝은 전등 또는 램프가 필요합니다.
포토트랜지스터 회로는 형광등이나 백열등과 함께 실내에서 잘 작동하도록 설계되었습니다. 직사광선이나 직접 할로겐 라이트는 피하십시오. 그들은 너무 많은 적외선으로 포토트랜지스터에서 광 홍수상태가 됩니다.
- 로보틱스 영역에서 창 블라인드를 닫아 직사광선을 차단하고 할로겐 램프를 위쪽으로 향하게하여 빛이 천장에 반사되도록 합니다.
- 브로클리프롭(BlocklyProp) 계정에 로그인하여 새 프로젝트를 만드십시오.
- 위의 ActivityBot Light 센서 테스트 프로젝트를 작성하십시오.
- 전원 스위치를 위치 1에 놓습니다.
- Run Once 버튼을 클릭하십시오.
- 터미널에서 값이 변경되는 것을 살펴보면서 하나의 포토트랜지스터 위로 손을 잡은 다음 다른 포토트랜지스터 위를 잡으십시오.
위의 값은 오버 헤드 형광등이 있는 실내에서 촬영한 것입니다. lightLeft 측정이 얼마나 더 큰지 주목하십시오 - 왼쪽 포토 트랜지스터를 손으로 덮어서 발생했습니다.
참고: 일치하지 않는 측정
두 개의 포토트랜지스터 측정값이 정확히 일치하지는 않습니다. 각각의 개별 센서는 제조 프로세스의 자연스러운 부분에 따라 조금씩 다를 수 있으며 밝기 수준은 어떤 환경에서도 거의 정확하지 않습니다. 그러나 동일한 레벨의 빛에 노출되었을 때 다른 것보다 약 100 배 더 큰 측정값을 제공하면 포토트랜지스터가 아마도 뒤쪽으로 막혀있을 것입니다. 회로를 점검하고 다시 시도하십시오.
어떻게 동작하는가?
P9를 위해 회로도를 다시 살펴보십시오. 회로의 0.01μF 커패시터는 매우 작은 배터리라고 생각하고, 광 트랜지스터는 광 제어 전류 밸브로 생각하십시오.
repeat forever 루프의 첫 번째 블록은 make PIN 9 high 입니다. 이것은 캐패시터-배터리에 전류를 공급하고, 충전하는데 1 ms pause 가 소요된다. 그후 즉시 RC discharge PIN 9 블록이 I / O 핀 P9를 출력 하이에서 입력으로 변경한다. 입력으로 P9는 커패시터-배터리가 포토트랜지스터-밸브를 통해 전류를 소모할 때 하이 신호 감지에서 로우 신호로 전환합니다. 프로펠러는 이 논리 전환이 발생하는데 걸리는 시간을 측정하고 있으며 RC 블록은 이 방전 시간을 lightLeft 변수 블록에 저장합니다.
repeat forever 루프의 다음 세 블록은 P5 포토트랜지스터 회로와 동일한 프로세스를 거치고 lightRight 변수에 다른 방전 시간 측정값을 저장합니다.
밝은 빛이 포토트랜지스터에 비치면 밸브가 크게 열리고 전류가 매우 빠르게 흐르므로 측정 된 방전 시간이 짧습니다. 포토트랜지스터가 가려지면 밸브가 약간 열리고 전류가 더 천천히 소모되어 방전 시간 값이 커집니다. 루프의 나머지 블록은 터미널에 있는 두 변수의 방전 시간을 표시합니다. 위의 터미널 화면 캡쳐는 왼쪽 포토트랜지스터가 가려졌을 때 수행되었으므로 lightLeft 값은 lightRight 값보다 큽니다.
알고 계셨습니까?
QT는 전하 이동의 약자입니다. 이 활동에서 각각의 광 저항은 전하 이동 또는 QT 회로에 사용됩니다. 이를 통해 로봇은 일반적으로 이 센서에서 볼 수 있는 아날로그-디지털 변환회로 보다 훨씬 넓은 범위의 광 레벨을 감지할 수 있습니다. 이 QT 회로는 디지털 I / O 핀과 함께 다양한 아날로그 센서를 사용하기 위한 간단한 옵션입니다.
가시 광선과 보이지 않는 빛 : 빛이 너무 작아서 인접한 봉우리 사이의 거리가 나노 미터 (nm) 단위로 측정됩니다 (10 억분의 1 미터). 아래 그림은 자외선 및 적외선과 같이 인간의 눈으로 감지 할 수 없는 일부 색상과 함께 익숙한 색상의 빛을 보여줍니다. 로봇카 키트의 광 트랜지스터는 가시광선을 감지하지만 적외선 범위에 있는 850 nm 파장에 가장 민감합니다.
당신 차례 !
그냥 즐거움을 위해서 포토트랜지스터가 다른 색을 감지할 수 있는지 봅시다.
- 위의 색상 파장 그래프를 확대하십시오.
- 로봇을 화면까지 올려놓고 하나의 포토트랜지스터를 컬러바에 매우 가깝게 배치하십시오.
- 가장 높은 수치는 어떤 색입니까? 어떤 색깔이 가장 낮습니까?
당신의 관찰에 비추어 볼 때, 이것처럼 맑은 포토트랜지스터만이 컬러센서로 사용될 수 있다고 생각합니까? 그 이유는 무엇인가요?
로봇카 주행의 경우 원시 센서 값은 직접적으로 유용하지 않습니다. 중요한 것은 각 센서에 의해 감지된 빛의 양의 차이입니다. 따라서 로봇카는 밝은 빛을 감지하는 쪽으로 회전할 수 있습니다. 또한 서보 모터를 구동하기 위해 보내지는 속도에 쉽게 더하거나 뺄 수 있는 예측 가능한 범위의 값을 갖는 것이 좋습니다.
이 작업을 수행하는데는 몇 단계만 있으면 됩니다. 필요한 방정식을 작성한 다음 방정식을 따르는 블록을 가장 효과적으로 사용하면 됩니다.
이 개념은 두 센서가 감지하는 모든 빛 중 일부 (오른쪽 센서에서 오는 부분)를 상당히 간단하게 나타냅니다 (필요한 경우 오른쪽 센서에서 나오는 부분을 알 수 있습니다). 먼저 하나의 센서 측정값을 두 값의 합계로 나눕니다. 결과는 항상 0에서 1 범위입니다. 이 기술은 정규화 된 차동측정의 한 예입니다. 방정식으로 보이는 것은 다음과 같습니다.
0에서 1까지의 범위는 여전히 유용하지 않습니다. 특히 Blockly에서는 십진수나 소수를 사용할 수 없기 때문에 특히 그렇습니다. 목표는 -100에서 +100 범위 (200 개의 가능한 값 범위)를 갖는 것입니다. 정규화된 차동 측정값에 200을 곱하면 0과 200 사이의 결과가 제공됩니다. 이 결과에서 100을 뺀 값은 -100에서 +100 사이의 범위를 나타냅니다. 포토트랜지스터가 얼마나 밝은지 또는 희미한지에 관계없이 동일한 레벨의 빛을 감지하면 최종 정수는 0이 됩니다. 이것은 zero-justfified 정규화된 차동 측정의 예입니다. 간단히 "ndiff"라고 합시다. 이제 우리 방정식은 다음과 같습니다.
브로클리프롭(BlocklyProp)에 주의해야 합니다. 모든 수학은 정수로 이루어지기 때문에 항상 0이 되는 방정식을 만들 수 있습니다.
참고: 정수 수학에서 값 보존하는 법
좋은 습관은 값을 작게 만들기 전에 값을 크게하는 것입니다. 십진수 또는 분수 값을 사용할 수 있다면 나누기나 곱하기, 나눗셈을 해도 상관없습니다. 정수 수학을 할 때, 그것은 중요합니다.
곱셈을 먼저하면 결과의 가치를 보존할 수 있습니다.
이를 블록 단위로 변환하기 위해 몇 가지 수량을 만듭니다. 분수 (분자)의 윗부분은 다음과 같습니다.
분수의 하단 부분 (분모)은 다음과 같습니다.
nDiff 는 다음과 같습니다. :
아래의 예제 코드는 lightRight 및 lightLeft 측정값을 표시하고 nDiff 값을 별표로 표시합니다. 로봇카 주행 프로그램이 센서값을 사용하여 밝은 빛에 대한 새로운 궤적을 목표로 하는 방법을 보다 쉽게 시각화할 수 있습니다.
그래픽 코드 테스트
- 브로클리프롭(BlocklyProp) 계정에서 새로운 Propeller C 프로그램을 만들고 Light Sensor Test Graphical이라는 이름을 지정하십시오.
- 아래에 표시된 프로젝트를 빌드하고 저장하십시오.
- Run Once (RAM에로드) 버튼을 클릭하십시오.
- 로봇카를 광원쪽으로 그리고 광원에서 멀리 이동하여 별표가 변경된 위치를 확인합니다.
터미널이 열리면 다음과 같은 내용이 표시됩니다.
어떻게 동작하나요?
그래픽 인쇄는 터미널 인쇄 번호(terminal print number)와 문자값(character value) 블록을 사용하여 생성되었습니다.
이 프로그램은 이전 페이지의 테스트 라이트 센서를 기반으로 합니다. 두 개 변수가 추가로 선언됩니다 lightLeft 및 lightRight : nDiff 및 position. nDiff 는 멋진 이름의 등식의 결과를 보유하고, position 은 nDiff 의 값을 그래픽 디스플레이로 나타내는데 사용됩니다.
nDiff 를 계산한 후에는 그 결과를 터미널의 위치로 변환해야 합니다. nDiff 는 -100에서 +100 사이의 숫자일 수 있으며 0에서 50까지의 위치가 필요합니다 (터미널 창의 길이는 몇 글자 정도입니다).
(-100에서 +100)에서 (0-50)까지 얻으려면 먼저 100을 더하고 (0에서 200까지 가져옴) 4로 나누십시오 (0에서 50까지 가져옴).
그런 다음 repeat x times 블록을 사용하여, 터미널 인쇄 번호 및 문자 값 블록을 사용하여 터미널 화면에 있어야하는 곳에 인쇄할 계획인 별표 (*)를 푸시할 충분한 공간을 인쇄합니다.
알고 계셨습니까?
정수 수학, 중첩 및 연산 순서는 모두 중요합니다. 실생활의 정상적인 수학 연산과 마찬가지로 곱셈과 나눗셈 연산은 더하기와 빼기 이전에 수행됩니다. 그러나 Blockly이 "inside-out"에서 각 블록을 평가한다는 사실을 이미 알고 있을 수도 있습니다. 따라서 올바른 결과를 얻으려면 그에 맞게 계획해야 합니다.
정수 수학을 다루는 것은 까다로울 수 있습니다. 대부분의 최신 마이크로 컨트롤러는 프로펠러 멀티 코어 마이크로 컨트롤러를 포함하여 부동 소수점 연산을 수행할 수 있습니다. 그러나 브로클리프롭(BlocklyProp)은 블록을 지원하지 않으므로 블록 자체가 변수의 정수 또는 부동 소수점을 알 수 없습니다. 또한 부동 소수점 연산은 정수 연산보다 느리고 메모리를 많이 차지합니다.
몇 가지 트릭을 알게되면 이 제한을 극복하는 것이 쉽습니다.
시도해 보세요!
센서 값을 백분율로 바꾸려는 경우가 있습니다. 센서 값을 백분율로 변경하려면 최소값과 최대값이 무엇인지 알아야 합니다. 이 값의 차이는 센서의 범위입니다. 그다음 다음 수식을 사용하여 센서 값을 백분율로 변환할 수 있습니다.
실생활에서는 곱셈과 나눗셈이 동일한 연산자의 정확성을 갖기 때문에 다음 계산 단계 중 하나에서 같은 결과를 얻습니다.
* sensorValue 로부터 sensorMinimum을 빼고, 그 다음 sensorRange 로 나누고 100을 곱하시오.
* sensorValue 로부터 sensorMinimum을 빼고, 그 다음 100을 곱하고, sensorRange 로 나누시오.
연산의 순서가 정수 연산의 최종 결과에 미칠 수 있는 차이점을 확인하려면 다음 예제를 시도하십시오.
- 테스트 라이트 센서 그래픽 프로젝트를 닫습니다.
- New Project를 클릭하고 Integer Math Operator Order와 같은 이름을 지정하십시오.
- 아래 표시된 코드를 입력하고 Run Once (RAM에로드)를 클릭하십시오.
- 터미널 창을 클릭하고 다른 값을 입력해보십시오.
- 결과 비교 - 무슨 일이 일어나고 있는가?
이유는 다음과 같습니다.
200의 몇 퍼센트가 150입니까? 알아내려면 150을 200으로 나누고 0.75를 얻은 다음 그 값을 100으로 곱하면 75가됩니다.
그러나 정수 0.75는 무엇입니까? 여기에 힌트가 있습니다. 그것은 1이 아닙니다. 정수 수학에서 십자리수는 잘립니다. 이것은 숫자가 십자리수에서 잘려서 0 만 남기고 있음을 의미합니다. 100을 곱하여 백분율로 변환하려는 경우 0은 여전히 0입니다.
같은 숫자를 사용하지만 이번에는 200으로 나누기 전에 먼저 100을 곱하면 150 배의 100 = 15000, 그 다음 15000을 200 으로 나눈 값은 75가 됩니다.
당신 차례 !
- 정수 수학에 대해 알고 있는 것을 사용하고 터미널에 그래픽 디스플레이를 구축하려면 각 센서의 결과를 자체 마커로 보여주는 그래픽 디스플레이를 만들어보십시오. 왼쪽 빛 센서는 "x"를, 오른쪽 센서는 "o"를 사용할 수 있습니다.
- 숫자를 10 진수로 터미널에 인쇄하려고 합니다. 예를 들어, 정수만 허용되는 경우 브로클리프롭(BlocklyProp)을 사용하여 터미널에서 1562 밀리미터를 1.562 미터로 인쇄하는 방법은 무엇입니까? 여기에 힌트가 있습니다 : 1562를 1000으로 나누면, 1. 왼쪽으로 1. 1은 1000이고, 빼기를 사용하면 나머지 숫자를 찾을 수 있습니다.
이제 로봇카가 빛을 따라 가도록 합시다! 다음 코드는 로봇이 손전등을 따라 가거나 조명이 밝은 출입구를 통해 어두운 방을 주행할 수 있게 합니다.
광센서 주행 코드
- 손전등을 찾으면 더 밝을수록 좋습니다.
- 브로클리프롭(BlocklyProp)에서 마지막 페이지 광 센서 테스트 그래픽 프로젝트를 찾습니다.
- Light by Navigation과 같은 새 이름으로 프로젝트를 저장하십시오.
- 프로그램의 시작과 끝에서 터미널로 인쇄하는 블록을 삭제하고 아래와 같이 로봇카에 대한 블록을 추가하십시오.
- 전원 스위치를 1로 설정한 다음 로드 및 실행 (EEPROM에 저장)을 클릭하십시오.
- 프로그래밍 케이블에서 로봇을 분리하고 열린 공간에 로봇을 놓습니다.
- 전원 스위치를 2로 설정한 다음 리셋 버튼을 눌렀다 놓습니다.
- 로봇카 앞 바닥에 손전등을 비추십시오. 그러면 로봇카가 밝은 지점으로 향해야 합니다. 손전등이 그다지 강하지 않다면 직접 센서를 향해야 합니다.
- 방의 조명을 끄고 외부 조명이 밝은 영역의 문을 여십시오. 로봇카가 방 밖으로 나가는 길을 찾아야 합니다.
어떻게 동작하는가?
이 프로그램은 로봇 블록을 사용합니다. 로봇카를 초기화한 후, 프로그램은 포토트랜지스터로부터 값을 받아서 더 밝은 빛을 감지하는 쪽으로 움직이기 위해 서보의 속도를 조정하는 repeat forever 루프로 구성됩니다.
먼저, 친숙한 변수인 lightLeft , lightRight 및 nDiff 가 센서 측정을 수행하고 사용하기 위해 설정됩니다. 그런 다음, speedLeft 및 speedRight 변수는 나중에 Robot drive speed 블록 과 함께 사용하도록 설정됩니다.
repeat forever 루프의 처음 두 부분은 이전 테스트 프로그램과 동일합니다. 라이트 센서 측정 값을 가져와 lightLeft 및 lightRight에 값을 저장합니다.
다음 라인은 Test Light Sensor Graphical 프로젝트에서 사용된 것과 동일한 nDiff 방정식입니다. nDiff 값을 계산하면 -100과 100 사이의 값을 갖습니다. 양의 nDiff 값은 왼쪽 포토 레지스터가 밝은 빛을 감지하고 음수 nDiff 값이 오른쪽 포토 레지스터가 밝은 빛을 감지한다는 것을 의미합니다. 값이 0 에서 멀어질수록 두 개의 포토트랜지스터가 감지하는 빛의 양의 차이가 커집니다.
변수 speedLeft 와 speedRight 는 64로 초기화됩니다. 다음에 오는 if ... else 블록을 볼 때 이것을 명심하십시오.
첫 번째 조건은 " nDiff 가 0보다 크거나 같으면 (왼쪽의 밝은 빛), speedLeft 를 64 빼기 nDiff × 4로 만듭니다." speedLeft에 대한 새로운 값은 64 미만이지만 speedRight 는 64로 유지됩니다. 이러한 변수는 if ... else 블록 다음에 Robot 드라이브 속도 블록에서 사용됩니다. 예를 들어 nDiff = 32 인 경우 이 명령문은 speedLeft = 64 - (32 x 4)와 동일하며 -64와 같습니다. 결과는 로봇카가 빛 방향으로 왼쪽으로 회전하게 하는 로봇 구동 속도 (왼쪽 = -64, 오른쪽 = 64) 입니다.
그러나 nDiff 가 양수가 아니면 코드는 if ... else 블록의 else 부분으로 떨어지며 speedRight 는 (nDiff × 4)와 같습니다. 이것은 " speedRight 를 64 plus nDiff × 4 와 동일하게 만드는 것"으로 해석됩니다. 이것은 여전히 64보다 작은 숫자입니다. 여기서 nDiff 는 음수라는 것을 기억 하십시오. 예를 들어, nDiff = -16 인 경우 이 문은 speedRight가 64 + ( -16x4) 와 같기 때문에 speedReft 는 여전히 64 이지만 speedRight 는 0과 같이 끝납니다. 이렇게 하면 더 밝은 빛 방향으로 우회전하도록 로봇 드라이브 속도(왼쪽 = 64, 오른쪽 = 0)가 됩니다.
알고 계셨습니까?
광택 (Phototaxis) - 빛의 자극에 직접 반응하여 몸 전체를 움직이는 유기체를 말합니다. 밝은 빛쪽으로 이동하는 것은 양성 광택이라고 부르며, 밝은 빛을 피하면 음성 광택이 됩니다. 빛으로 주행하는 프로그램이 로봇카를 양성 광택과 유사하게 만드는 반면, 자연에서는 이 현상이 보통 현미경으로 관찰되는 생물체에서 발견되는 것 같습니다. 나방들은 빛에 끌립니다. 그러나 가로등 주변의 다양한 비행선들은 항법 시스템이 훨씬 더 복잡하다는 것을 보여줍니다.
시도해 보세요!
로봇카를 음성 광택과 유사하게 만드시겠습니까? 빛으로 주행하는 프로젝트에서 하나의 변수를 대체하여 수행할 수 있습니다.
- 다른 이름으로 저장을 클릭하고 Navigate by dark 라는 이름을 지정합니다.
- nDiff의 수식에서, lightRight의 첫 번째 사용을 lightLeft 로 아래와 같이 바꾸시오.
- 위치 1의 전원 스위치로 로드 및 실행 (EEPROM에 저장)을 클릭하십시오.
- 로봇카를 바닥에 놓고 스위치를 위치 2로 이동시킨 다음 리셋 버튼을 누릅니다.
- 로봇카에서 손전등을 비춥니다. 로봇카는 불빛에서 멀어지고 테이블 아래 또는 어두운 구석에 있는 피난처를 찾아야 합니다.
당신 차례 !
로봇카에 광센서를 사용하면 어떤 다른 행동을 할 수 있습니까?
- if ... else 블록에서 추가 조건을 사용하여 "많은 빛이 있는 경우 중지"와 같은 동작을 추가하십시오.
- 추가 변수를 사용하거나 30 초 후에 잠자기 상태가 되도록 다른 프로세서를 설정하고 변경된 불빛이 감지되면 다시 켜십시오.