아두이노 코딩-172: 밸런싱 로봇 제어를 위한 라즈베리 블루투스 Processing 코딩

codingart(66)
Published in
#kr
Words
514
Reading
3 min
Listen
Play
8y

noname01.png

요즈음 보급되는 라즈베리파이3 B/B+ 보드에는 Processing이 기본으로 설치되어 있다. Processing 은 계속 사용해 본 결과 그래픽 지원 성능이 대단히 우수한데 아두이노 코딩이 가능할 정도면 얼마든지 코딩이 가능하다.

아직은 라즈베리 파이에서 파이선 3 버전과 함께 설치되어 있는 OpenCV를 사용하여 Color Ball Tracking 이 가능한 밸런싱 로봇을 꾸미고 있으나 한편으로는 파이선 블루투스 코드를 사용하여 셸에서 문자 입력 명령에 의한 밸런싱 로봇이 그다지 큰 문제는 없으나 아무래도 컴퓨터 컨트롤을 성공적으로 해 보려면 그래픽 지원은 불가피해 보여 잠깐 Processing에서 컬러 제어 판을 코딩하여 블루투스와 바인딩 여부를 확인해 보고 HC-06 블루투스 보드가 설치된 아두이노 우노에서 수신 시험을 성공적으로 마쳤다.

리즈베리 파이와 아두이노의 HC-06과의 바인딩

라즈베리 파이 보드에서 파이선을 사용하든 Processing 코드를 사용하든지 아두이노의 HC-06 과 블루투스 바인딩이 이루어져야 한다. Processing 홈페이지를 참조해 봐도 블루투스에 대한 특별한 언급은 없으므로 파이선 코드 사용시와 동일한 방법으로 바인딩 시켰더니 성공적이었다.

즉 다음과 같이 HC-06 의 MAC어드레스를 확인하자. 물론 이때에는 아두이노 우노에 블루투스 코드를 RX, TX 점퍼서선을 제거한 상태에서 미리 컴파일 업로딩 후 RX, TX 점퍼선을 다시 배선해 두어 HC-06 의 LED 가 점멸하고 있는 상태라야 한다.

noname02.png

/device/rfcomm0 디바이스 또는 시리얼 채널을 생성하자.
pi@raspberrypi:~$ sudo rfcomm bind rfcomm0 00:18:E4:5A:CC

pi@raspberrypi:~$ ls /dev/ 명령을 실행해 보면 다음과 같이 rfcomm0 가 생성되어 있음을 알 수 있다. 반드시 MAC 어드레스와 함께 해야 실제 Pairing 이 됨에 유의하자.

noname03.png

Processing 코딩

블루투스에 의해서 바인딩 된 라즈베리 파이 시리얼 포트를 통해 아두이노의 HC-06 과 통신하기 위한 Processing 의 명령은 일반 USB 케이블을 사용하는 시리얼 통신과 별반 차이가 없다. Serial.list() 출력 결과를 살펴보면 /dev/rfcomm0 가 첫 번째에 있으므로 Serial.list()[0] 을 사용하게 된다. baud rate 는 아두이노 HC-06 과 함께 동일한 값을 사용하도록 한다.

noname04.png

그다음 코딩은 그래픽 화면을 size(512,420) 으로 설정하고 커버 그림에서처럼 y 즉 높이 방향으로 140씩 3줄로 나누도록 한다. x축 즉 폭 방향으로는 256 으로 처리하면 된다. STOP 은 긴급히 마우스를 가져다 둘 수 있도록 제일 큰 면적을 부여한다.
RGB 컬러 처리가 가능하도록 color(r,g,b) 명령을 사용하되 대각선에 해당하는 두 점의 좌표 데이터를 사용하여 그 영역을 rect() 명령을 사용하여 처리한다.

아두이노의 loop() 에 해당하는 Processing 의 draw()에서는 마우스를 가져다 주는 위치의 값을 검출하여 해당 영역 별로 “F”, “B”, “L”, “R”, “S” 문자를 바이트 데이터로 출력한다.

마지막으로 delay(1000) 은 아두이노의 HC-06에서 수신하여 시리얼 모니터에 출력하는 루틴이 Broking 의 밸런싱 로봇의 오픈소스에서 가져온 탓에 loop() 주기가 4msec 로 처리되어 있어 이쪽까지도 값을 0.5초로 조절해 주어야 시리얼 모니터에서 실시간으로 확인이 가능하다.
실제 밸런싱 로봇 조종을 위해서는 Processing에서는 거의 delay 없이 송신하고 아두이노에서는 4 msec 로 데이터를 수신해야 한다.

동영상을 통해 Processing 코드와 아두이노와의 통신 성능을 확인해 보자.

#BT_Processing_01
import processing.serial.*;
Serial port;

void setup() {
size(512,420);
println("Available serial ports:");
println(Serial.list());

port = new Serial(this, Serial.list()[0],9600);
//Forward
fill(color( 0,255,0));
rect( 0, 0, 256, 140);
//Backward
fill(color( 0, 0,255));
rect( 256, 0, 512, 140);
//LEFT
fill(color( 255,255,0));
rect( 0, 140, 256, 280);
//RIGHT
fill(color( 0,255,255));
rect( 256, 140, 512, 280);
//STOP
fill(color( 255,0,0));
rect( 0, 280, 512, 420);

//Print Text
textAlign(CENTER, CENTER);
textSize(30);
fill(0,0,0);
text("Forward", 128, 70);
text("LEFT", 128, 210);
text("RIGHT", 384, 210);
text("STOP", 256,350);
fill(color( 255,255,255));
text("Backward", 384, 70);
}

void draw() {

if( mouseX < 256 && mouseY < 140 ) port.write("F");
if( mouseX > 256 && mouseY < 140 ) port.write("B");
if( mouseX < 256 && mouseY > 140 && mouseY <280 ) port.write("L");
if( mouseX > 256 && mouseY > 140 && mouseY <280 ) port.write("R");
if( mouseY > 280 && mouseY <420 ) port.write("S");
delay(1000);
}//End

#Bluetooth_Send_Data
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() {

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 Right");
if(received_byte == B1001100)
Serial.println("Trun Left");
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 += 500000;
}//End