前回のやり方で、Arduinoとブレッドボードのマウントを作成したので、今回から駆動系を作っていく。

初めに最低限の動きを実現させよう。

DROID INOVENTOR KID のメインの動力はDCモータ、前輪の制御にサーボモーターを使用しているので、今回は無線で動かすことができるように赤外線センサをつけて、適当なリモコンで一通りの動きができるところまでやってみたい。

前回作成したマウントにArduino、ブレッドボードを載せてベースに装着。

ArduinoにはLCDシールドを装着。

以前、購入した東芝のモータドライバーTA7291Pを使って付属のDVモータを接続。

赤外線センサも以前購入したものを使用。

サーボモータは付属の線輪用のものと、頭と腕の動作で3つ必要だが、手持ちが1つしかないので、とりあえず、前輪と頭の制御用として2つを接続。

配線図はこんな感じ。

fritzing

頭用の手持ちのサーボは大きいものなのでバッテリーから給電するようにした。

腕用のものと一緒にマイクロサーボを買ったら変更する予定。

こんな感じでスケッチした。

#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。

ブレッドボードを使用している部分は、いずれ自作シールドにするつもりなので、問題ないだろう。

次はラズパイと連携に挑戦する予定。