ZigBEE無線モジュールを使い光音共演コンピュータをワイヤレス化する

デジタル屏風では、音楽に光が連動する光音共演コンピュータの開発を行っています。この光音共演コンピュータは、音声の解析を行うPCとその音の波長をほぼリアルタイムに対応する色の光を照らすLED(Arduinoが制御)がUSBケーブルでつながれ、シリアル通信でデータのやり取りを行っています。この通信をワイヤレス化する試みを行っています。目指すのは魔法の水晶玉のように光る物体です。

使用する無線モジュールは、切手サイズのZigBEEです。秋月電子で1個2,500円から3,000円で購入しました。ローカルサイトとリモートサイトのZigBEEをそれぞれコーディネーターとルーターに設定して、X-CTUを使いTransparentモードで問題なく通信できることを確認しました。あとは光音共演コンピュータのプログラムの通信先を、ZigBEEのシリアルポートにするだけ、と安易に考えていました。実際にはいくつかの障害に直面し、くじけそうになりながらもようやく乗り越えたというのが実情です。ZigBEEに取り組みたいという方の参考に情報を共有します。

◆直面した問題

1.PC上のシリアルポート番号が10以上になった場合の対処が必要

2.PC側から送信したメッセージが正しく受け取られない

3.リモートサイトからのメッセージがローカルのPCに送られてこないことがある

4.Arduinoの電源供給の考慮漏れにより、LEDの点灯が瞬時に終わってしまう

1.PC上のシリアルポート番号が10以上になった場合の対処が必要

光音共演コンピュータでは、プログラム中でMicrosoft社が提供するCreateFile()を使ってシリアル通信を行っています。ZigBEEを使う場合、使用したシリアルポート番号が10以上となっていました(環境に依存します)。光音共演コンピュータのプログラム実行時に、CreateFile()でINVALID_HANDLE_VALUEが返されてしまいました。このCreateFile()では、シリアルポート番号が10以上の場合、特別な配慮が必要です。詳しくはこちら。この修正を行うことでZigBEEの使うシリアルポートを使って通信ができるようになしました。

2.PCから送信したメッセージが正しく受け取れない

光音共演コンピュータでは、0.1秒ごとに音の波長を解析し、その結果をシリアルインタフェースでArduino側に送っています。2つのX-CTUで互いに通信できることを確認したときは、完璧な動作をしていましたが、そのときは人手で入力していました。今回はごく短い時間間隔でメッセージを送信しています。ZigBEEを使う場合は、あまり頻繁にメッセージを送信するとZigBEE側でオーバーフローを起こすとのこと。こちらのサイトでは0.01秒以上間隔を開けることが言及されていますが、環境依存の部分から少し大きめの値を設定し、解決しました。

3.リモートサイトからのメッセージがローカルPCに送られてこないことがある

PCとArduinoが無線でつながれているときには全く発生しませんでしたが、ZigBEEの処理で時間がかかっているためでしょうか。リモートサイトからのメッセージがPC側に届かないことがあります。ワイヤレス通信なので、信号のやりとりでエラーが発生することも結構あるのでしょう。このためArduino側でメッセージの再送ロジックを組み込み、対応しました。

4.Arduinoの電源供給の考慮漏れにより、LEDの点灯が瞬時に終わってしまう

光音共演コンピュータではPCとArduinoをUSBケーブルで接続し、USBから5Vの電源を供給しています。ワイヤレス化に際しては9Vの乾電池を使いました。LEDの電源はどちらもArduinoの5Vのピンから取っていますが、乾電池から電源を供給したときに限りLEDの点灯が短時間で終わってしまうことに気がつきました。電池から電源を供給した場合LEDが過電流となり、瞬時に点灯を終わらせていたのです。USBバスパワーで電源を供給した場合には結果的に流れる電流が少なくなっていたのでしょう。流れる電流の違いでLEDが点灯する、点灯しないの差が現れていたのです。LEDの回路に抵抗を差し込むことで解消しました。

色々な問題に直面し、仮説と検証を繰り返しながらようやく光音コンピュータのワイヤレス化が実現しました。魔法の水晶玉の実現に向けて進みます。

Follow me!