2014年4月27日日曜日

ArduinoとAndroidでラジコンカー

大学構内でイベントが開催される際、ゴミ拾いロボットを走らせよう的な企画のお話の続きです。

前回はArduinoとAndroid間で通信させることができたので今回はそれとモーター周りを繋げる編です。


用意するもの

・Arduino UNO R3
USBホストシールド
iBUFFALO Bluetooth4.0+EDR/LE対応 USBアダプター(BSBT4D09BK)
ダブルギヤボックス
スポーツタイヤ 56mm径
モータードライバー TA7291P(2個入)
・10KΩ抵抗 4個
・10KΩ可変抵抗 2個

配線



理想と現実
USBホストシールドを付けているので、デジタルピンの8~13、0、1は避けます。


モータ-の線が片方左右入れ替わっているのは、ギアボックスの配置されてる感じが左右対称じゃなかったからなのですがそこはお好みで。モータードライバーのロジック側電源にはArduinoの5Vから、モーター出力側電源は電池で6V(モーターの電圧は1.5~3.0Vまでらしいのですがなんか回転が遅かったので…)。あと、4番ピンVrefにかける電圧によって出力側電圧を制御できますが、もちろんVsを越えない範囲です。可変抵抗はそのVrefの値を調節しています。

スケッチ

前進や後進などの数字の割り振りは、場所的に覚えやすいように
1 2 3
4 5 6
7 8 9
この並びに向きを設定しています。
/*
 Example sketch for the RFCOMM/SPP Bluetooth library - developed by Kristian Lauszus
 For more information visit my blog: http://blog.tkjelectronics.dk/ or
 send me an e-mail:  kristianl@tkjelectronics.com
 */

#include <SPP.h>
#include <usbhub.h>
// Satisfy IDE, which only needs to see the include statment in the ino.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#define M1_for 4
#define M1_back 5
#define M2_for 6
#define M2_back 7

USB Usb;
//USBHub Hub1(&Usb); // Some dongles have a hub inside

BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
/* You can create the instance of the class in two ways */
SPP SerialBT(&Btd); // This will set the name to the defaults: "Arduino" and the pin to "0000"
//SPP SerialBT(&Btd, "Lauszus's Arduino", "1234"); // You can also set the name and pin like so

boolean firstMessage = true;

void setup() {
  Serial.begin(115200);
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
  Serial.print(F("\r\nSPP Bluetooth Library Started"));
  pinMode(M1_for,OUTPUT);
  pinMode(M1_back,OUTPUT);
  pinMode(M2_for,OUTPUT);
  pinMode(M2_back,OUTPUT);
}
void loop() {
  Usb.Task(); // The SPP data is actually not send until this is called, one could call SerialBT.send() directly as well

  if (SerialBT.connected) {
    if (firstMessage) {
      firstMessage = false;
      SerialBT.println(F("Hello from Arduino")); // Send welcome message
    }
    if (Serial.available())
      SerialBT.write(Serial.read());
      //以下変更部分
    if (SerialBT.available()){
      char input = SerialBT.read();
      if(input != -1){
        switch (input){
          case '2'://前進
            digitalWrite(M1_for,HIGH);
            digitalWrite(M1_back,LOW);
            digitalWrite(M2_for,HIGH);
            digitalWrite(M2_back,LOW);
            Serial.println(input - 48);
            break;
          case '8'://後進
            digitalWrite(M1_for,LOW);
            digitalWrite(M1_back,HIGH);
            digitalWrite(M2_for,LOW);
            digitalWrite(M2_back,HIGH);
            Serial.println(input - 48);
            break;
          case '0'://停止
            digitalWrite(M1_for,LOW);
            digitalWrite(M1_back,LOW);
            digitalWrite(M2_for,LOW);
            digitalWrite(M2_back,LOW);
            Serial.println(input - 48);
            break;
          case '6'://右回転
            digitalWrite(M1_for,HIGH);
            digitalWrite(M1_back,LOW);
            digitalWrite(M2_for,LOW);
            digitalWrite(M2_back,HIGH);
            Serial.println(input - 48);
            break;
          case '4'://左回転
            digitalWrite(M1_for,LOW);
            digitalWrite(M1_back,HIGH);
            digitalWrite(M2_for,HIGH);
            digitalWrite(M2_back,LOW);
            Serial.println(input - 48);
            break;
          case '3'://右前進
            digitalWrite(M1_for,HIGH);
            digitalWrite(M1_back,LOW);
            digitalWrite(M2_for,LOW);
            digitalWrite(M2_back,LOW);
            Serial.println(input - 48);
            break;
          case '1'://左前進
            digitalWrite(M1_for,LOW);
            digitalWrite(M1_back,LOW);
            digitalWrite(M2_for,HIGH);
            digitalWrite(M2_back,LOW);
            Serial.println(input - 48);
            break;
          case '7'://左後進
            digitalWrite(M1_for,LOW);
            digitalWrite(M1_back,HIGH);
            digitalWrite(M2_for,LOW);
            digitalWrite(M2_back,LOW);
            Serial.println(input - 48);
            break;
          case '9'://右後進
            digitalWrite(M1_for,LOW);
            digitalWrite(M1_back,LOW);
            digitalWrite(M2_for,LOW);
            digitalWrite(M2_back,HIGH);
            Serial.println(input - 48);
            break;
        }
      }
    }
  }
  else
    firstMessage = true;
}


無事スマヒョからの指示で様々な回転をさせることができました。
もっとコントローラーっぽくしたいのですが、今回は初めてということでとりあえずこれでいきます。アプリ側の勉強をしたらそこからまた挑戦してみます。
あとは、ゴミを集める機構をどうするかが課題です。

0 件のコメント:

コメントを投稿