自宅エクスプローラの続き。
Arduinoでモーターを制御できるようになったので、
まずはArduinoとタンクだけで遊んでみました。
ついでなのでWebカメラもテープで固定してつけてみることに。
もちろんまだ有線です。
タンク用のプレートだけだとギアボックスで半分埋まっているため、
タンクの上にユニバーサルプレート(大)を取り付けて設置面積を増やしました。
Arduino、電池ボックス、カメラ、ブレッドボードを置くといっぱいいっぱいになりました。
|
ユニバーサルプレート(大)が込み合っています
BeagleBoardはどこに置こうかな・・ |
|
メインカメラ。こんな感じの仕事ばっかりさせられてます |
まだ有線式なので動ける範囲に限りはありますが、
モニタでメインカメラの画像を見ながら操作するのは楽しいです。
無線LANをつんだBeagleBoard-xmとバッテリーをつければ、家の中をいろいろと探検できそうな感じです。
Youtubeに車載カメラと固定カメラの動画を載せました。
下の動画を再生しはじめた直後に上の動画を再生し始めると、ほぼ同じタイミングの
映像になります。
(箱が転がっていますが、撮影用に転がしたものです)
メインカメラだけでも操作はできますが、後方や側方も確認したくなりました。
360度カメラが安く売っていれば、つけてみたいと思います。
Arduinoのコードは以下のようになります。
結構簡単なコードで、上記のようなラジコンができます。
/*
自宅エクスプローラ用
タンクコントローラ
TA7291Pを2個使って、タンクを操作します
TA7291PのVRefにanalogWriteで電圧を与えると、
モーターにかける電圧を変えることができます。
*/
//後でキーアサインを変更できるようにしておく
#define GO '8' //前進
#define STOP '5' //停止
#define LEFT '4' //左旋回
#define RIGHT '6' //右旋回
#define BACK '2' //後ろ
#define LEFTIN1 2
#define LEFTIN2 3
#define RIGHTIN1 4
#define RIGHTIN2 5
#define VREF 9 //出力電圧のリファレンス PWMが使えるポートにしてください
void setup()
{
Serial.begin(9600);
pinMode(LEFTIN1, OUTPUT);//左側のモータードライバのIN1
pinMode(LEFTIN2, OUTPUT);//左側のモータードライバのIN2
pinMode(RIGHTIN1, OUTPUT);//右側の(以下同文)
pinMode(RIGHTIN2, OUTPUT);
Serial.println("MOTOR");
//出力電圧のリファレンス用
pinMode(VREF,OUTPUT);
//モーターは1.5V~3Vが動作電圧
analogWrite(VREF,128);//とりあえず2.5V
//最初は停止している状態
setLeftMotor(LOW,LOW);
setRightMotor(LOW,LOW);
}
//左側のモータを制御します。
void setLeftMotor(int in1,int in2)
{
digitalWrite(LEFTIN1,in1);
digitalWrite(LEFTIN2,in2);
//デバッグ用
Serial.println('LightMOTOR'+ in1 +' '+ in2);
}
void setRightMotor(int in1,int in2)
{
digitalWrite(RIGHTIN1,in1);
digitalWrite(RIGHTIN2,in2);
//デバッグ用
Serial.println('RightMOTOR'+ in1 +' '+ in2);
}
void loop()
{
delay(100);
char r=Serial.read();
if(r== GO)
{ //全速前進
setLeftMotor(HIGH,LOW);
setRightMotor(HIGH,LOW);
Serial.println("GO");
}
if(r==STOP)
{
setLeftMotor(LOW,LOW);
setRightMotor(LOW,LOW);
Serial.println("STOP");
}
if(LEFT==r)
{
//左方向へ旋回
setLeftMotor(LOW,HIGH);
setRightMotor(HIGH,LOW);
Serial.println("LEFT");
}
if(RIGHT==r)
{
//右方向へ旋回
setLeftMotor(HIGH,LOW);
setRightMotor(LOW,HIGH);
Serial.println("RIGHT");
}
if(BACK==r)
{
//退却。後方確認はできません
setLeftMotor(LOW,HIGH);
setRightMotor(LOW,HIGH);
Serial.println("BACK");
}
}
ではまた。