BluetoothモジュールRBT-001をArduinoで使う その②
- 2017/10/09
- 22:32
BluetoothモジュールRBT-001をArduinoで使う その②
こんにちはRoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。
以前紹介したBluetoothモジュールRBT-001ですが、実際にArduinoに接続して簡単二足歩行ロボットをBluetooth経由でコントロールしたいと思います。

スペック等は以前のブログ記事を参照してください。
ロボットの説明についてはこちらの過去の記事を参照してください。
Arduinoとの結線
まずArduinoとの結線は下図のようにしました。


VccはArduinoから3.3Vもらうことにしました。
仕様上はMax3.3VなのでギリギリOKです。ただしマニュアルを見ると3.0Vを推奨しています。通信性能が悪くなるようですが、一応通信できているのでこのままとしました。
いつかちゃんと分圧か何かして比較したいと思います。
RBT-001のRXはArduinoからそのまま入力してしまう過電圧となってしまうので抵抗で分圧しました。
RBT-001のTXはPCからスケッチを書き込む時は干渉してしまうのでスイッチで入りきりできるようにしておきます。
ペアリング
Bluetoothなのでペアリングが必要です。
Arduinoに電源を投入するとRBT-001にも通電されて起動します。
PC側から探すと今回はI-Droid01として認識されました。
これはこの部品が「週刊マイロボット」の付録だったためです。
ペアリングをクリックすれば接続されます。
Arduino IDEでもシリアルポートをcu.I-Droid01-COM1として認識できます。

スケッチ
今回は試しに簡単二足歩行ロボットをシリアルモニターでコントロールしてみます。
シリアルモニターで以下の文字を送信すればそちらの方向に進みます。
F 前進
R 右回転
L 左回転
B 後進
#include
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;
// RU,RB,LU,LB
int ang0[4]={90,89,85,87};
int ang[8][4]={
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}};
int stp[7][4]={
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}};
int fw[7][4]={
{18,0,18,0},
{18,-15,18,-15},
{-18,-15,-18,-15},
{-18,0,-18,0},
{-18,15,-18,15},
{18,15,18,15},
{18,0,18,0}};
int rh[7][4]={
{18,0,8,0},
{18,-13,8,-13},
{-15,-13,-5,-13},
{-15,0,-5,0},
{-15,16,-5,13},
{18,16,8,13},
{18,0,8,0}};
int lh[7][4]={
{8,0,18,0},
{8,-13,18,-13},
{-5,-13,-15,-13},
{-5,0,-15,0},
{-5,16,-15,13},
{8,16,18,13},
{8,0,18,0}};
int bw[7][4]={
{-10,0,-10,0},
{-10,-13,-10,-13},
{10,-13,10,-13},
{10,0,10,0},
{10,20,10,13},
{-10,20,-10,13},
{-10,0,-10,0}};
int delection = 0;
int ts=300;
int td=10;
int a[4],b[4];
int n;
void setup()
{
myservo2.attach(2);
myservo3.attach(3);
myservo4.attach(4);
myservo5.attach(5);
Serial.begin(9600);
}
void loop()
{
delection = Serial.read();
switch (delection) {
case 70: // F FWD
Serial.println("FWD") ;
forward();
walk();
break;
case 76: // L Left
Serial.println("Left") ;
left();
walk();
break;
case 82: // R Right
Serial.println("Right") ;
right();
walk();
break;
case 66: // B back
Serial.println("Back") ;
back();
walk();
break;
default: // S Stay
Serial.println("Stay") ;
stay();
walk();
break;
}
delay(100);
}
void forward()
{
for (int j=0; j <=3; j++){
ang[0][j] = ang[7][j];
}
for (int i=1; i <=7; i++){
for (int j=0; j <=3; j++){
ang[i][j] = fw[i-1][j];
}
}
}
void left()
{
for (int j=0; j <=3; j++){
ang[0][j] = ang[7][j];
}
for (int i=1; i <=7; i++){
for (int j=0; j <=3; j++){
ang[i][j] = lh[i-1][j];
}
}
}
void right()
{
for (int j=0; j <=3; j++){
ang[0][j] = ang[7][j];
}
for (int i=1; i <=7; i++){
for (int j=0; j <=3; j++){
ang[i][j] = rh[i-1][j];
}
}
}
void back()
{
for (int j=0; j <=3; j++){
ang[0][j] = ang[7][j];
}
for (int i=1; i <=7; i++){
for (int j=0; j <=3; j++){
ang[i][j] = bw[i-1][j];
}
}
}
void stay()
{
for (int j=0; j <=3; j++){
ang[0][j] = ang[7][j];
}
for (int i=1; i <=7; i++){
for (int j=0; j <=3; j++){
ang[i][j] = stp[i-1][j];
}
}
}
void walk()
{
for (int i=0; i <=7; i++){
for (int j=0; j <=3 ; j++){
if (i == 7) n = 7;
else n = i+1;
a[j] = ang[n][j] - ang[i][j];
b[j] = ang[i][j];
}
for (int k=0; k <=td-1 ; k++){
myservo2.write(ang0[0]+a[0]*k/td+b[0]);
myservo3.write(ang0[1]+a[1]*k/td+b[1]);
myservo4.write(ang0[2]+a[2]*k/td+b[2]);
myservo5.write(ang0[3]+a[3]*k/td+b[3]);
delay(ts/td);
}
}
}
テスト
実際に動かしてみるとBluetooth経由でロボットをコントロール出来ました。

備考:動画のロボットには超音波距離センサがついてますが、今回は動かしていません。
それでは今回はこの辺で失礼します!ありがとうございました。
スポンサードリンク