아두이노 코딩-171: Raspberry Bluetooth Controlled Balancing Robit

in #kr6 years ago (edited)

본 동영상 데모는 OpenCV 버전 3을 설치한 라즈베리 파이 보드에서 무선 즉 Bluetooth 기능을 사용하여 밸런싱 로빗을 제어하기 위해 개발된 데모 코드이다. 라즈베리 파이에서는 터미널에서 블루투스를 Pairing 하기 위한 기본 적인 작업에 관해서는 며칠 전에 포스팅을 마쳤으니 다음의 주소를 참조하기 바란다.

PiCamera OpenCV 컬러오브젝트 tracking 밸런싱 로봇 디자인
https://steemit.com/kr/@codingart/1-188-168-picamera-opencv-tracking

동영상에서처럼 라즈베리로부터 HC-06 블루투스 보드를 장착한 밸런싱 로봇을 제어해야 할 필요성은 곧 라즈베리에서 PiCamera 로 컬러 볼을 학습 시킨 후 카메라 앞에서 움직일 경우 Tracking 정보를 분석하여 아두이노 보드로 구동되는 밸런싱 로봇의 좌우 모터를 제어 할 수 있도록 블루투스를 이용하여 전송할 필요가 있다.

아두이노 밸런싱 로봇은 Broking 의 Open 소스를 다운 받아 제작하였으나 차이점이 Nunchuck 이라는 블루투스 조종 시스템을 사용하나 여기서는 국내 여건에 맞춰 아두이노에서 흔하게 사용하는 HC-06 블루투스 보드로 수정하였다. 일단 라즈베리 컴퓨터 컨트롤 이전에 앱 인벤터 조종을 통해 충분히 연습을 했으며 이제 라즈베리 파이 보드와 인터페이스를 할 단계가 서서히 다가오고 있다.

물론 밸런싱 로봇 한 대에 라즈베리와 아두이노를 함께 탑재할 RC카 차체는 디자인 및 설계를 마치고 제작을 진행 중이다.

하지만 그 전에 데스크 톱 라즈베리에서 밸런싱 로봇을 보며 본 동영상에서처럼 성공적으로 주행이 가능해야 한다.

그 다음 단계는 데스크에 설치된 라즈베리와 PiCamera 앞에서 컬러 공을 움직여 밸런싱 로봇을 제어하는 것이다. 이 task 가 성공되면 라즈베리와 아두이노를 함께 탑재해서 블루투스로 통신하며 밸런싱 로봇에 설치된 카메라가 컬러 볼을 캐치하면 쫓아다닐 수 있는 초보적인 수준의 지능형 로봇이 될 것이다.

라즈베리 파이 코딩

sudo rfcomm bind rfcomm0 HC-06 MAC address 명령을 실행하고
ls /dev/ 명령에 의해 rfcomm0 가 생성되어 있음을 확인해 두어야 한다.

라즈베리 파이 보드에서 사용할 제어 코드를 살펴보자.

noname01.png

이번에 사용하는 파이선3 버전 코드는 지난 번에 그림으로 올렸던 파이선 코드를 약간 수정하였다.
라즈베리 파이선3 IDLE에서 코드를 실행 시키면 그 때에 Pairing 이 이루어진다.
파이선3 셸에서 “Command String:“이 출력되면 ”F“,”B“,”L“,”R“,”S“ 중에 하나를 반드시 대문자로 입력 후 엔터키를 누르면 for loop 에 의해 30번 동일 명령이 발신된다. 한 번에 한 문자씩 보내니 Balancing Robot 의 실시간 입력 코드 요구속도에 맞지 않는다. 25∼30번 출력해서 보내는 것이 최적인 듯하다. 그래도 동영상에서 보면 한번 회전을 시키려면 서너번 명령을 쏘아 보내야 한다.

다음 Task는 데스크탑 라즈베리에 설치된 컬러 볼 Tracking OpenCV 코드에 위 코드를 집어넣어서 데스크 탑에 PiCamera 앞에서 컬러 볼을 움직여 밸런싱 로봇을 제어 하는 단계이다. 확인이 되면 라즈베리 파이와 아두이노를 함께 동작시킬 수 있도록 리튬 폴리머 배터리 전원 장치를 개조하여 주행시킬 계획이다.

아두이노 코딩

아두이노에 HC-06을 설치한다. 하지만 블루투스 수신 코드를 컴파일 업로딩 하기 전에는 반드시 아두이노 RX, TX 핀 에 점퍼선을 빼 두도록 하고 완료 후 다시 점퍼선을 설치하도록 하자.
아울러 라즈베리 파이에서 블루투스를 통해 송신하는 문자 “F”,“B”,“S”,“L”,“R”을 수신하여 시리얼 모니터에 출력해보는 테스트 프로그램만 작성해서 제대로 동작하는지만 체크해 보기로 한다.

noname02.png

블루투스 테스트용 아두이노 코드의 구조는 다음과 같은 형태를 취하기로 하자. 즉 입력버퍼에서 수신하는 문자를 received_byte 라는 변수명으로 둔다. setup()에서 현재까지 경과된 시간을 micros() 명령을 사용하여 체크하고 loop()문 실행주기를 4000 마이크로 세컨드를 더해 loop_timer 라는 변수로 설정한다.
4000 마이크로 세컨드는 Broking 의 오픈 소스 드론 비행제어 코드와 밸런싱 로봇에서 loop() 문이 한번씩 실행되는 주기에 해당한다.

noname03.png

아두이노 블루투스 테스트를 위한 loop() 문의 코드 구조는 다음과 같다. 이 코드는 Broking 의 밸런싱 로봇 아두이노 코드의 Loop() 문에서 블루투스 통신 부분만 뽑아내어 시리얼 프린터에 출력하는 부분만 약간 수정하였다. 라즈베리와 블루투스를 통해 문자 명령을 하나싹 보내 보면 아두이노에서 제대로 수신하는 지 여부를 확인할 수 있다.

noname04.png

한편 라즈베리에서 블루투스를 통해 문자 하나를 입력 전송하면서 위와 같은 코드 구조를 가지는 밸런싱 로봇의 거동을 체크해 본 결과 제대로 동작을 하지 않았다.
즉 라즈베리에서 문자 출력 속도와 아두이노에서의 문자를 수신하여 반응하는 솎도가 제대로 튜닝되지 못한 까닭이라 보인다. 그래서 라즈베리 보드에서 아예 한번 문자 명령 입력 전송 시 같은 문자를 25∼30개 함꺼번에 출력하도록 수정허여 밸런싱 로봇의 아두이노 코드를 테스트한 결과가 커버에 올려둔 동영상이다. 코드 구조가 상당히 간단하면서도 밸런싱 로봇을 효율적으로 부드럽게 조종할 수 가 있었다.

//Bluetooth_FBRL
byte received_byte = 0; //Variable for storing received data
int receive_counter;
unsigned long loop_timer;

void setup() {
Serial.begin(9600); //Sets the baud for serial data transmission
loop_timer = micros() + 4000;
}

void loop() {
// Serial.begin(57600);
if(Serial.available() > 0){
received_byte = Serial.read();
receive_counter = 0;
}
if(receive_counter <= 25)
receive_counter ++;
else
received_byte = 0x00;
Serial.println(received_byte, BIN);
if(received_byte == B1010010)
Serial.println("Trun Left");
if(received_byte == B1001100)
Serial.println("Trun Right");
if(received_byte == B1000110)
Serial.println("Move Forward");
if(received_byte == B1000010)
Serial.println("Move Backword");
if(received_byte == B1010011)
Serial.println("STOP");
while(loop_timer > micros());
loop_timer += 1000000;
}

Sort:  

jjm.jpeg
짱짱맨 호출에 응답하여 보팅하였습니다.

짱짱맨은 저자응원 프로그램입니다. 더 많은 저자 분들에게 더 큰 혜택을 드리고자 스파임대 스폰서를 받고 있습니다. 스폰서 참여방법과 짱짱맨 프로그램에 관해서는 이 글을 읽어 주세요. 기업형 예비증인 북이오(@bukio)가 짱짱맨 프로그램을 운영하고 있습니다. 여러분의 증인 보팅은 큰 힘이 됩니다. Vote for @bukio

밸런싱 로봇 한번쯤 해보고 싶었는데 못만들어봤네요 ㅎㅎ 재밌을거같아요

Coin Marketplace

STEEM 0.18
TRX 0.15
JST 0.028
BTC 63177.41
ETH 2439.37
USDT 1.00
SBD 2.58