2014年4月26日土曜日

ArduinoとAndroid間でシリアル通信

Twitterでも言ったのですが(現在フォロワ―0人の垢で)、大学のイベント等で出動しゴミ拾いをするロボットを作ろうかと思っています。

人通りのあるところでやるので、全自動だといろいろ危険らしいのでラジコンにしました。

今回は通信方法をどうしよっか編です。

用意するもの

・Arduino UNO
USBホストシールド
iBUFFALO Bluetooth4.0+EDR/LE対応 USBアダプター(BSBT4D09BK)

方法としてはBluetoothでAndroid端末とシリアル通信してArduinoを制御する感じです。

恥ずかしながら、自分はBluetoothとか初めて使うのでバージョンとかよくわかりません。
なので調べました。→Bluetoothのバージョンによる違いについて
見てみるとバージョン同士の互換性とかいろいろめんどそうですが、自分が使ってるAndroidのバージョンは4.0で、モデル番号でも調べてみたところちゃんとBluetooth4.0に対応してました。まあ同じ4.0同士なら問題ないでしょうということで。


プロファイルについてBluetoothには「プロファイル」なるものがあるようで、双方の機器が同じものに対応している場合に限って、そのプロファイルの機能を利用した通信ができるそうです。今回はSPP (Serial Port Profile)を使うのですが、双方共に大丈夫っぽいです。

BSBT4D09BKの対応プロファイル
A2DP、AVRCP、DI、DUN、FAX、FTP、GAP、GAVDP、GOEP、HCRP、HSP、HFP、HID、OPP、PAN、PBAP、SDAP、SPP、SYNC、BIP、BPP、HOGP

(自分の)Androidの対応プロファイル
SDAP、GAP、SPP、A2DP、AVRCP、HFP、OPP、HSP、HID、PAN、PBAP、HDP、DUN


Arduino側

初めはここの方のように、Bluetoothモジュールを買おうとも思ったのですが、なんか高かったので断念しました。結局、ArduinoのUSBホストシールドにBluetoothドングルつけてやることに。
シールドとかドングルとかなら別のことに使えるしいいなあと。


まず、これ→USB_Host_Shield_2.0-master.zipをダウンロードさせてもらい、arduino/libraries以下に展開します。(USBホストシールドを使うためのライブラリのようです。)「USB_Host_Shield_20」という名前で保存しました。

そしてArduino IDEのメニューから
「ファイル」 → 「スケッチの例」 → 「USB_Host_Shield_20」 → 「Bluetooth」 → 「SPP」
とSPP.inoファイルを開きます。

そしてloop()内の
if (SerialBT.available())
      Serial.write(SerialBT.read());
ここのif内をいろいろ変更していい感じにします。setup()内でpinModeで初期化するのも忘れずに。(これを忘れてめっちゃ悩んだ)

変更後のスケッチ全体
/*
 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

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(7,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 c = SerialBT.read();
      if(c != -1){
        switch (c){
            case '1':
              digitalWrite(7, HIGH);
              break;
            case '0':
              digitalWrite(7, LOW);
              break;
        }
      }
    }
  }
  else
    firstMessage = true;
}
1を送信するとLEDが光り、0で消灯。
8~13はUSBホストシールド側で使っているようですが、8と9はちゃんとLチカできました。
でも怖いので使いません。10~13は常にLEDが光ってしまうから使ってるんだなあと。

Android側

S2 Terminal for Bluetooth Free
というアプリをインストールします。
(Android端末とBluetoothデバイス間でSPPを利用してシリアル通信をすることができる。)

あとはペアリングして、アプリを開いて今回使うBTアダプタを選びます。
そしたら1やら0やらを送ってLチカ!楽しい!




ArduinoUNO+USBHostShield+Bluetoothドングルで、iPadにつながるインプットデバイスを作る
↑今回はAndroidでやりましたが、使うものが似ているのでいつかこれもやってみたいです。

参考サイト(http://sunnyone41.blogspot.jp/2013/09/arduino-usb-btbluetooth-l.html

0 件のコメント:

コメントを投稿