無線ブロック試作

 ライントレースと同じように以前からCube-Dに無線ブロックを追加する構想がありました。このブロックがあると、スマホでCube-Dを遠隔操作したり、Cube-Dのセンサ情報をスマホで受け取ったりでき応用範囲が広がります。今回、秋葉原で購入して眠っていたBLEモジュール(RN4020)をブロック基板に取り付けて(空中配線で見苦しいですが)、スマホとの双方向のデータ転送ができることを確認しました。忘備録を兼ねてまとめておきます。下の写真が試作した無線ブロックです。

光・温度センサブロック基板を流用して、BLEモジュールの端子VDD,GND,RX,TXの4本を基板上のマイコンポートに接続しました。中空にモジュールが浮いている状態ですが今回は動作確認が目的なので目をつぶってください。BLEモジュール基板の上部はアンテナパタンがレイアウトされていてその近くに別の信号線やベタGNDなどが置けないので、今後ブロック化する場合には下の基板に対してモジュールを垂直に立てて固定することになりそうです。

上の図は無線ブロックの構成図です。RN4020内に受信用と送信用の2つのレジスタに相当する1byteのキャラクタリスティックを設けました。スマホからデータを送る場合には受信用のキャラクタリスティックに値を書き込みます。書き込まれたコードがTxから19200bpsの速度で出力されます。マイコン側はUARTのRx1受信割り込みを受けてそのハンドラ内で内部変数に受信コードを書き込みます。Tx0からの出力はCLKの立上がりタイミングで内部変数値を出力します。ブロック同士の通信は750kbpsのボーレートで行います。

INにデータが入力された場合、マイコンのUARTRx0割り込みハンドラ内でTx1からRN4020の送信用のキャラクタリスティックにデータを書き込みます。RN4020は無線でデータをスマホに送信します。

スマホ→Cube-D

この動画では、スマホから送った値が数値表示器に表示されると同時にモータの動きが変わることが分かります。

ブロックの実装は下記を参照ください。カウンタの出力と無線ブロック出力を比較していますが、これによりデューティー比を変えられるパルスになります。スマホから送った数値が0で停止、大きくなると回転が速くなります。Cube-DのCLK周波数は1kHzにしており、カウンタは255の次は0に戻るので1000/256=3.9[Hz]がデューティーパルスの周波数になります。

Cube-D→スマホ

つぎはCube-D側のデータをスマホで読み取る確認です。カウンタブロックの出力を無線ブロックに入力します。NortifyをONにすると7セグLEDの表示とスマホのRead値が同期して(若干遅れますが)読み出せていることが分かります。

BLEについて

BLE(Bluetooth Low Energy)は、ブルートゥースのVer4.0から採用された低消費電力の通信モードです。短い距離で通信速度があまり要求されない用途に特化したものでAndroid端末もiOS端末もほとんどBLEを搭載しています。Cube-Dのような学習用ではそれほど速度を必要としませんし、長距離の通信も不要であるため、BLEを採用しました。スマホ側がセントラル、通信ブロックがペリフェラルとしました。RN4020があらかじめ持っているサービスでも使えるものがあったのかもしれませんが、独自のサービス(R/W可能は1byteキャラクタリスティックを2つ)を作成しました。RN4020の初期設定を記載しておきます。なおUUIDはUUID Generatorで生成しました(RN4020マニュアル参照のこと)。

 

+ //エコーON

SF,1 //工場出荷設定

SB,2 //ボーレート19200pbs

SS,00000001 //プライぺーとサービス

SR,24000000 //再起動、切断後、ボンディング済みでもアドバタイズ

PZ //キャラクタリスティックのクリア

PS,23e992e0aee011e9a2a32a2ae2dbcce4 //プライベートサービスのUUID

PC,23e9952eaee011e9a2a32a2ae2dbcce4,1a,01 //1つ目のキャラクタりスティック設定(R/W/N,1byte)

PC,23e99682aee011e9a2a32a2ae2dbcce4,1a,01 //2つ目のキャラクタりスティック設定(R/W/N,1byte)

R,1 //再起動

 

 

今回こんなに簡単にデジタル無線通信ができるなんて正直驚きました。暗号化や無線プロトコルの難しいところはブラックボックス化されているので、キャラクタリスティックにデータを書き込むこととUART通信の処理だけ作ればできてしまいました。

 

ただし今回使ったモジュールは十分小さいですが、残念ながら現在のCube-Dブロック内に収まりませんので、もっと小型のモジュールを探してみます。今後の展示会では、3Dプリンタで凌ぐことになりそうです。また、スマホ側のアプリは、使い易いものを作り込みたいと思っています(Android Studioはインストール済み)。