NCVCの作者のページ

Zumo Zumo32U4 BLEserial3 Bluetooth Python

Zumo32U4 を BLEserial3 でリモートコントロール

はじめに

 浅草ギ研さんの BLEserial3 を用いて,Bluetooth 通信を行いたいと思います. 技適マーク付きの数少ない製品ですが,執筆時点(2020/12)でスイッチサイエンスさんからは販売中止でした. 浅草ギ研さんから直接買えるのかな?

試作回路とサンプルスケッチ

 Bluetooth(BLE) 規格を使いますが,ペリフェラル(スレーブ)側は通常のシリアル通信として認識します. したがって XBee と同様に, BLEserial3 の RX を Zumo の TX1(D1:PD3) に,BLEserial3 の TX を Zumo の RX1(D0:PD2) につなぎ, Serial1 で通信を行います.

サンプルスケッチは,シンプルにコードを受信したらモータを回すようにしています.

BLEtestZumo.ino

iPhone を使ってみる

 赤外線XBeeを試作しましたが,多くの学生に体験してもらうにはコストも手間もかかります. そこでセントラル(マスタ)側として学生自身が持つスマートフォン(iPhone)を利用しようと考えました. しかし,それっぽいアプリをいろいろ試しますが,いずれも BLEserial3 と通信できませんでした. GATT プロファイルに対応していないと思われます. 唯一通信できたのが LightBlue というアプリでした(これは浅草ギ研さんでも紹介されています). 一覧に出てくる BLEserial3 に接続すると,BLEserial3 の LED が点滅から点灯にかわります. とりあえず TX の Write new value から 1 バイトの送信が可能なので送信すると,Zumo のモータが動くことを確認できました.

 本当はゲームパッド風のアプリで動かしたかった. たとえばこういうのとか. 残念.

GamePad App

PC(Windows10)を使ってみる

 一旦 iPhone の利用はあきらめ,PC の Bluetooth を使えないか検証してみました. まずデバイスマネージャで,その PC の Bluetooth が BLE に対応しているかを確認します. Microsoft Bluetooth LE Enumerator があれば OK です. 次にスタートメニューから[設定]→[デバイス]で BLEserial3 のペアリングを行います. おそらくペアリングしなくても通信できると思いますが念のため.

 iPhone で試したように,Windows でも LightBlue 的なアプリで通信のテストをしてみます. Microsoft Store から Bluetooth LE Lab を入手し,BLEserial3 と接続します. BLEserial3 の LED が点滅から点灯にかわり,接続できたことがわかります. Unknown service の Unknown characteristic から Writing に値を入れ Write ボタンを押すと,Zumo のモータが動くことを確認できました. やったー!

Python

 PC からの BLE 通信に光が差したので,Python を使ってプログラミングができないかと調査を開始. Bleak というライブラリを候補にインストールを開始するも,Bleak がバックエンドで使用する pythonnet でインストールエラーが発生.どうやら原稿執筆時点で Python 3.9 には対応しておらず,3.8 にダウングレードしてインストールできました.

> python --version
Python 3.8.6

> pip list
Package Version
---------- -------
bleak 0.10.0
pip 20.3.3
pycparser 2.20
pythonnet 2.5.1
setuptools 51.1.0

 Bleak のサンプルコード discover.py を実行すると,アドバタイズ情報が取れました.

> python discover.py
C4:42:29:32:79:2D: BLESerial_0

 これらの情報から,以下の Python サンプルコードで Zumo のモータが動くことを確認できました.

BLEserial3.py

 PyGame ライブラリをインストールし,キー入力に対応させます.以下のコードにより,矢印キーで Zumo を前後左右に動かせました. Zumo 側のスケッチは普通です.

Python コード BLEkey.py
Zumo スケッチ BLEkey.ino

 PyGame ライブラリはゲームパッド(ゲームコントローラ)にも対応しています.USB 接続の PC 用ゲームパッドにて VS-C1 と同等の操作性で Zumo を動かすことに成功しました. アナログ値を取得し,上位 4 ビットに左スティック情報を,下位 4 ビットに右スティック情報を送信しています. 当然 Zumo 側のプログラムもそれ用に書き換えました.

Python コード BLEjoy.py
Zumo スケッチ BLEjoy.ino

Raspberry Pi を使ってみる

 最近手に入れたオモチャ Raspberry Pi 3 Model B+ で PC と同様の BLE 通信を試してみます. 以下のコマンドで BLESerial が見えればOK.自動で止まらないので Ctrl + C で停止させます. 当初 Windows10 と同様にペアリングを試みましたが,bluez から Authentication Failed で怒られました. 結果論ですがペアリングしなくても通信できるようです. Windows でも(OS 操作の)ペアリングは不要かもしれない.

$ sudo hcitool lescan
LE Scan ...
C4:42:29:32:79:2D: BLESerial_0

 Python コードを試すため,不足分のライブラリ(bleak)をインストールしておきます.pygame もお忘れなく.

$ python3 --version
Python 3.7.3

$ sudo pip3 install bleak
... 省略...
$ pip3 list | grep pygame
pygame 1.9.4.post1

 Windows のときと同様に,discover.py を試してみます. Warning は出ますが Windows と同様に BLESerial が見えました.

$ python3 discover.py
:0: UserWarning: You do not have a working installation of the service_identity module:
... 省略...
C4:42:29:32:79:2D: BLESerial_0

 Windows で使ったのと同じゲームパッドを Raspberry Pi の USB ポートに接続し, これまた Windows と同じ Python コード BLEjoy.py を実行すると, 何の問題もなくBLESerial と通信することができ,Zumo を動かすことに成功しました.

$ python3 BLEjoy.py
Joystick Name: HOLTEK JC-U1012F
button num: 12
BLE Connected: True

試してみた感想

 iPhone のゲームパッドアプリで動かす作戦は失敗しましたが,PC(Raspberry Pi) のゲームパッドで動かすことに成功しました. これで XBee(赤外線はXBeeと共用),VS-C1,BLEserial3 の計 3 台の Zumo ラジコンを動かしています.

<< 前のページに戻る