2016年10月22日土曜日

Arduino で IMBLE を試してみた

概要

IMBLE は interplan が提供する Bluetooth Low Energy 用の無線通信モジュールです
シリアル通信を代用できる無線モジュールがほしかったので、試してみました
Arduino で拾った信号を IMBLE に送信して、それを Bluetooth で飛ばしてみます

環境

組み立ておよびハンダ

まず組み立てです
今回はブレッドボード上で使用したかったので、2.54mm ピッチの変換基板を使います
本体と変換基板を組み立てます
組み立ては簡単ではめるだけになります
わかりやすいように線が引かれているのと、固定するためのスペーサのくぼみがあるので、それに合わせてピンヘッダの部分をはめ込めば OK です
imble_and_arduino_assemble1.jpg

合体するとこんな感じになります
imble_and_arduino_assemble2.jpg

あとはハンダ付けです
これは必須ではないです
というのも、変換基板にすでに 26 ピンのソケットがついておりこれを使っても全然問題ないからです
自分はブレッドボード上で使いたかったのでピンヘッダをつけました
が、実はブレッドボードにもちょっと工夫しないとはめ込むことができません
先ほど紹介した 26 ピンのソケットが邪魔をするためのブレッドボードの先頭部分でないと挿すことができませんでした
実際にピンヘッダをハンダ付けしてブレッドボードに挿した図は以下の通りです
imble_and_arduino_handa.jpg

写真だと見えないですが、出っ張っている右側のちょうど裏側に 26 ピンのソケットが飛び出しているためこの場所でないとブレッドボードに挿せませんでしえた

配線

今回の配線の全体図は以下の通りです
基本は Arduino 側で拾ったスイッチの情報をシリアル通信を使って IMBLE 側に送信する回路になります
imble_and_arduino_circuit.jpg

ちょっと複雑に見えるので簡単に説明します
まず上部はブレッドボードは Arduino pro mini でスイッチの情報をアナログピン 6 番で読み込んでいるだけなので、それほど重要ではありません

ポイントは下部のブレッドボードになります
配線は以下のとおり

  • IMBLE VCC (上の段の左から 3 ピン目) -> Arduino VCC
  • IMBLE GND (下の段の左から 3 ピン目) -> Arduino GND

まずこの 2 つの配線で IMBLE に電源を入れています
これだけでもアドバタイズは始まるので、スマホで見つけることができます
※下の段の配線はブレッドボードギリギリだったので、IMBLE の下からジャンパワイヤを引いて、右側に出しています
残りの IMBLE の配線は以下の通り

  • IMBLE MODE (下の段左から 4 ピン目) -> Arudino GND
  • IMBLE RxD (下の段右から 2 ピン目) -> Arduino TX0
  • IMBLE CTS (下の段右から 1 ピン目) -> Arduino GND

という感じです
あとで詳細にも説明しますが CTS は SLEEP REQUEST というピンでスリープ状態を無効にするために GND に接続しています
MODE はデータ通信モードにするために GND に接続します
RxD で Arduino からのシリアル情報を受け取っています

とりあえずここまで配線にしてから起動するとこの後もうまくいきます

IMBLE の変換基板のピンアサインの詳細は以下の通りです
下の写真を横にして使っています
imble_and_arduino_pins_info.png

imble_and_arduino_pins_info2.png

スケッチ

アナログピンで拾った値 (今回の場合スイッチが押されたという値) が 0 以上の場合に Serial.print と Serial.println を使ってコマンドと送信したいデータを 16 進数で送信しています

スケッチ自体は非常に簡単なものになっています

void setup() {
  Serial.begin(19200);
}

void loop() {
  int val = analogRead(6);
  if (val > 0) {
    Serial.print("TXDT ");
    Serial.println(10, HEX);
  }
  delay(1000);
}

スケッチの書き込みをするときは Arduino TX0 と IMBLE RxD の接続は解除してから行ってください

説明詳細

スケッチと配線の説明をちょっと詳細に行います

IMBLE へのデータや命令の送信は基本的にコマンドを通して行われます
※各種コマンドの詳細は公式ドキュメントが参考になると思います
今回スイッチが押されたときに 10 (0x0B) を送信しましたが、その前にデータを送信するという「TXDT」という命令を送っています
ただ 10 を送信しただけだと IMBLE 側はデータを受け取ってくれません

また、コマンドの区切り文字として改行が必要なので、Serial.println を使ってデータを送信しています
Serial.write を使う場合は、別途改行コードを最後に送信する必要があります

配線時に GND に入れた SLEEP REQUEST (2 ピン) と MODE (14 ピン) というピンなのですが、デフォルトで電源を入れるとこれが High (有効) の状態で上がってきます
SLEEP REQUEST は読んで時のごとく High の場合スリープ状態となり一切のコマンドを受け付けなくなります
MODE は予約モード (High) とデータモード (Low) があり、データのやり取りを行う場合は Low に入れる必要があります
なので、どちらも GND (Low) につないだ状態で起動してあげると起動した直後でもデータのやり取りが行えるようになります
本来は Arduino の別のデジタルピンを使って Low にしてあげてスリープモードを解除してからコマンドを送ったほうが省電力な使い方にはなると思います

動作確認

では、動作確認しましょう
スケッチを書き込んで配線しましょう
今回は LightBlue という iOS アプリを使って動作確認します
スマホの Bluetooth を ON にしてアプリを起動すると IMBLE がアドバタイズしていると思います (IMBLE029C)
見つかったら選択しましょう
imble_and_arduino_ret1.png

あとは、Arduino から送信される信号を Notify で待ち受けます
Services の一覧になったら Properties に Read, Notify を持つ Characteristics が下の方にあるので選択します
そしたら、Listem for notifications をタップして Arduino からの信号を待ち受ける状態にします
そしてたら Arduino 側のスイッチを押してみましょう
以下のようにスマホ側でデータが受信できるのを確認できると思います
imble_and_arduino_ret2.png

最後に

IMBLE と Arduino で Bluetooth でのデータのやり取りを試してみました
最大のポイントは IMBLE の MODE と SLEEP REQUEST ピンを GND に入れる必要があったのと、送信したいデータをシリアル通信される前にコマンドを送信する必要があることでした

あとちょっと感じたのは、スマホとペアリングするときに若干時間がかかる印象でした
他の BLE モジュールだとペアリングに 1 秒程度しかかからないのが、IMBLE だと 3 秒くらいかかる感じでした

一番辛かったのは全くドキュメントがなかったことでしょうか
Arduino と連携するくらい基本かと思ったのでドキュメントもたくさんあるだろうと思ったのですが全くなく公式のドキュメントとにらめっこしながらやるのは、ちょっと素人には厳しかったです

参考サイト

0 件のコメント:

コメントを投稿