R2D2を作りたい!その3
とりあえず、最低限の動きを実現しよう。
DROID INOVENTOR KID のメインの動力はDCモータ、前輪の制御にサーボモーターを使用している。
今回は無線で動かすことができるように赤外線センサをつけて、適当なリモコンで一通りの動きができるところまでやってみたい。
前回作成したマウントにArduino、ブレッドボードを載せてベースに装着。
ArduinoにはLCDシールドを装着。
以前、購入した東芝のモータドライバーTA7291Pを使って付属のDVモータを接続。
赤外線センサも以前購入したものを使用。
サーボモータは付属の線輪用のものと、頭と腕の動作で3つ必要だが、手持ちが1つしかないので、とりあえず、前輪と頭の制御用として2つを接続。
配線図はこんな感じ。
頭用の手持ちのサーボは大きいものなのでバッテリーから給電するようにした。
腕用のものと一緒にマイクロサーボを買ったら変更する予定。
こんな感じでスケッチした。
赤外線センサー制御は東芝製のテレビリモコン用にスケッチした。
左右ボタンで前輪サーボモータ、頭のサーボモータ。
前後ボタンでモータドライバーの制御を行っている。
サーボモータの制御はライブラリを使用したが、なぜかライブラリを読み込んだ時点で赤外線センサーが読み込まなくなってしまった。
ライブラリの説明をよくよく読んだら「Mega以外のボードでは、ピン9と10のPWM機能が無効になります。」だそうだ。
別のピンで使用するようにしたら正常に動作した。
9番10番ピンをサーボ用としたとしても最終的にもう一つ必要となるので、前輪の制御はアナログピンを使用して制御した。
とりあえず、前輪、後輪、頭の制御が赤外線センサーで制御できるまでできたので、筐体に取り付けた。
サーボモータなどをちゃんと取り付けたいが、仮組なのでマスキングテープで貼り付け。
配線が邪魔でカバーを付けるまではできないが、ちゃんと動いたのでOK。
ブレッドボードを使用している部分は、いずれ自作シールドにするつもりなので、問題ないだろう。
次はラズパイと連携に挑戦する予定。
DROID INOVENTOR KID のメインの動力はDCモータ、前輪の制御にサーボモーターを使用している。
今回は無線で動かすことができるように赤外線センサをつけて、適当なリモコンで一通りの動きができるところまでやってみたい。
前回作成したマウントにArduino、ブレッドボードを載せてベースに装着。
ArduinoにはLCDシールドを装着。
以前、購入した東芝のモータドライバーTA7291Pを使って付属のDVモータを接続。
赤外線センサも以前購入したものを使用。
サーボモータは付属の線輪用のものと、頭と腕の動作で3つ必要だが、手持ちが1つしかないので、とりあえず、前輪と頭の制御用として2つを接続。
配線図はこんな感じ。
頭用の手持ちのサーボは大きいものなのでバッテリーから給電するようにした。
腕用のものと一緒にマイクロサーボを買ったら変更する予定。
こんな感じでスケッチした。
#include#include // 赤外線センサ int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; // モーター制御 出力ピンの定義 const int motor1A = 7; const int motor1B = 8; const int motor1P = 6; // サーボモーター Servo servo; Servo servoH; const int PIN_SERVO = 16; const int PIN_SERVOH = 9; String getIR(){ if (!irrecv.decode(&results)) { return ""; } //Serial.println(results.value, HEX); String ret; String val = String(results.value, HEX); // ↑ if(val.equals("2fd7c83") || val.equals("4324a3bf")) { ret = "Fw"; } // → else if(val.equals("2fdda25") || val.equals("d85e479f")) { ret = "Rt"; } // ↓ else if(val.equals("2fdfc03") || val.equals("3409de43")) { ret = "Dw"; } // ← else if(val.equals("2fdfa05") || val.equals("76707863")) { ret = "Lf"; } // ↑↑ else if(val.equals("27d04fb") || val.equals("29a08847")) { ret = "UU"; } // ↓↓ else if(val.equals("27d847b") || val.equals("834de04b")) { ret = "DD"; } // << else if(val.equals("27d44bb") || val.equals("226fd0eb")) { ret = "LL"; } // >> else if(val.equals("27dc43b") || val.equals("72b68ae7")) { ret = "RR"; } // 決定 else if(val.equals("2fdbc43") || val.equals("ef24b227")) { ret = "Ct"; } else { ret = ""; } // Receive the next value irrecv.resume(); return ret; } void motorAction(String act){ static int level; static String beforeAct; if(level < 100){ level = 100; } if(level > 225){ level = 225; } if(act.equals(beforeAct)){ level += 25; } beforeAct = act; if(act.equals("Fw")){ Serial.println("select Fw"); digitalWrite(motor1A,HIGH); digitalWrite(motor1B,LOW); analogWrite(motor1P,level); Serial.println("Moter : " + String(level, DEC)); }else if(act.equals("Dw")){ Serial.println("select Dw"); digitalWrite(motor1A,LOW); digitalWrite(motor1B,HIGH); analogWrite(motor1P,level); Serial.println("Moter : " + String(level, DEC)); }else if(act.equals("Ct")){ Serial.println("select Ct"); digitalWrite(motor1A,LOW); digitalWrite(motor1B,LOW); level = 0; } } void servoAction(String act){ static int level; if(act.equals("Lf")){ Serial.println("select Lf"); level -= 1; }else if(act.equals("Rt")){ Serial.println("select Rt"); level += 1; }else if(act.equals("Ct")){ Serial.println("select Ct"); level = 0; } else { return; } if(level < -2){ level = -2; } if(level > 2){ level = 2; } int vl = 67 + level * 10; Serial.println("Servo : " + String(vl, DEC)); servo.write( vl ); } void servoActionH(String act){ static int level; if(act.equals("LL")){ Serial.println("select LL"); level -= 1; }else if(act.equals("RR")){ Serial.println("select RR"); level += 1; } else { return; } if(level < -2){ level = -2; } if(level > 2){ level = 2; } int vl = 90 + level * 16; Serial.println("ServoH : " + String(vl, DEC)); servoH.write( vl ); } void setup() { // シリアル初期化 Serial.begin(9600); Serial.println("setup"); // 赤外線センサ irrecv.enableIRIn(); // モーター初期化 pinMode(motor1A,OUTPUT); // 信号用ピン pinMode(motor1B,OUTPUT); // 信号用ピン // サーボモーター servo.attach( PIN_SERVO ); servo.write( 67 ); // サーボモーター servoH.attach( PIN_SERVOH ); servoH.write( 90 ); } void loop() { String ir = getIR(); if(ir.equals("")){ return; } motorAction(ir); servoAction(ir); servoActionH(ir); }
赤外線センサー制御は東芝製のテレビリモコン用にスケッチした。
左右ボタンで前輪サーボモータ、頭のサーボモータ。
前後ボタンでモータドライバーの制御を行っている。
サーボモータの制御はライブラリを使用したが、なぜかライブラリを読み込んだ時点で赤外線センサーが読み込まなくなってしまった。
ライブラリの説明をよくよく読んだら「Mega以外のボードでは、ピン9と10のPWM機能が無効になります。」だそうだ。
別のピンで使用するようにしたら正常に動作した。
9番10番ピンをサーボ用としたとしても最終的にもう一つ必要となるので、前輪の制御はアナログピンを使用して制御した。
とりあえず、前輪、後輪、頭の制御が赤外線センサーで制御できるまでできたので、筐体に取り付けた。
サーボモータなどをちゃんと取り付けたいが、仮組なのでマスキングテープで貼り付け。
配線が邪魔でカバーを付けるまではできないが、ちゃんと動いたのでOK。
ブレッドボードを使用している部分は、いずれ自作シールドにするつもりなので、問題ないだろう。
次はラズパイと連携に挑戦する予定。

コメント
コメントを投稿