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 ラジコンを動かしています.

Raspberry Pi 追記

 オープンキャンパス等のイベントでは,上記のPythonスクリプトを自動起動にしておき,本体とゲームパッドだけで運用します. キーボードもディスプレイも不要なので楽チンですが,これだとシャットダウンのタイミングに困ることになります.現にブチ切りしてSDカードがお亡くなりになりました. わざわざSSHでリモート接続してshutdownコマンドを,というのも面倒なので, たとえばゲームパッドのXと〇の同時押しでshutdownコマンドが発行される的なPythonコードを追加し,この問題を解決しています. ラズパイ本体にシャットダウンボタンを追加するというアイデアもありますが, ボタンでいえば,もうすでにありますからねww

 もう1つ.自動起動に関連する記事も掲載しているのでよかったらどうぞ.PS4コントローラ(番外編)

Windows版 追記

 現在 Windows版でこの構成が動きません. 詳細は こちら の末尾を参照してください. Raspberry Pi では動いているので,そのバージョンに合わせようとたとえば pygame 1.9.6 をインストールしたいのですが,下図のようなエラーでインストールできない状態です. 弱りました...

<< 前のページに戻るZumoインデックスへ