raspberrypi3 と raspberrypi zero WH を bluetooth で通信し、pi3 側から、zero WH をリモートコントロールすることに挑戦します。
これが可能になると、pi3 で出した指令を、zero WH で受取り、たとえば、モーターを制御して車を走らせるようなことが可能になります。
まずは、bluetooth をインストールして、簡単なプログラムで pi3 – zero WH 間の動き を確認してみましょう。
1.関連パッケージのインストール
(1) 関連パッケージインストール
始めに、bluetooth の関連パッケージを raspberrypi3 と raspberrypi zero WH にイン ストールします。
下記のコマンドで関連パッケージをインストールします。
$ sudo aptitude install libusb-dev
$ sudo aptitude install libdbus-1-dev
$ sudo aptitude install libglib2.0-dev
$ sudo aptitude install libudev-dev
$ sudo aptitude install libical-dev
$ sudo aptitude install libreadline-dev
$ sudo aptitude install libdbus-glib-1-dev
$ sudo aptitude install libbluetooth-dev
(2) トラブルシューティング
① pi3 でのエラー
pi3 の libudev-dev インストールで以下のエラーが発生しました。
pi@raspberrypi:~/py_folder/blue $ sudo aptitude install libudev-dev
以下の新規パッケージがインストールされます:
libudev-dev
更新: 0 個、新規インストール: 1 個、削除: 0 個、保留: 139 個。
23.2 k バイトのアーカイブを取得する必要があります。展開後に 261 k バイトのディスク領域が新たに消費されます。
エラー http://mirrordirector.raspbian.org/raspbian/ jessie/main libudev-dev armhf 215-17+deb8u7
404 Not Found [IP: 93.93.128.193 80]
0% [作業中]E: http://mirrordirector.raspbian.org/raspbian/pool/main/s/systemd/libudev-dev_215-17+deb8u7_armhf.deb を取得できませんでした: 404 Not Found [IP: 93.93.128.193 80]
何だかわからないエラーですね。この pi3 ですが、しばらく、update をしていなかったせいか、以下のコマンドを実行した後やり直したら、問題なくインストールできました。
sudo aptitude update
② zero WH でのエラー
zero WH の libical-dev インストールで以下のエラーが発生しました。
E: いくつかのパッケージを取得することができません。このまま続行するには ‘-o APT::Get::Fix-Missing=true’ を試してみてください
そこで、指定されたオプションを追加してインストールした所、無事インストールできました。
pi@raspberrypi:~ $ sudo aptitude install libical-dev -o APT::Get::Fix-Missing=true

2.pyBluez のインストール
(1) pyBluez インストール
bluetooth 本体である pyBlueZ をインストールします。
$ sudo pip install pybluez
◆ zero WH では、問題なくインストールできました。
(2) トラブルシューティング
① pi3 でのエラー
pi3 で、 pybluez インストール時に、以下のエラーが発生しました。
bluez/btmodule.h:4:20: fatal error: Python.h: そのようなファイルやディレクトリはありません
Qiita のこのページに対応策が書いてあります。
Python.h が見つからない場合
$ sudo apt-get install python-dev
インストール後、問題なく pybluez インストールが出来ました。
3.bluetooth通信開始
(1) ペアリング開始
それでは、ペアリングを開始します。
① zero WH
受け側で、Bluetoothのペアリングが出来るよう検索可能な状態にします。
pi@raspberrypi:~ $ bluetoothctl
[NEW] Controller B8:27:EB:7F:86:7F raspberrypi [default]
[NEW] Device B8:27:EB:A1:29:2E raspberrypi
[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller B8:27:EB:7F:86:7F Discoverable: yes
② pi3
リモコン側でペアリングします。
pi@raspberrypi:~/py_folder/blue $ bluetoothctl
[NEW] Controller B8:27:EB:A1:29:2E raspberrypi [default]
[NEW] Device B8:27:EB:7F:86:7F raspberrypi
[bluetooth]# scan on
Discovery started
[CHG] Controller B8:27:EB:A1:29:2E Discovering: yes
[bluetooth]# pair B8:27:EB:7F:86:7F
Attempting to pair with B8:27:EB:7F:86:7F
Failed to pair: org.bluez.Error.AlreadyExists
[bluetooth]# paired-devices
Device B8:27:EB:7F:86:7F raspberrypi

4.python3 で bluetooth が動かない!
さて、プログラムを書いたので、bluetooth下での実行を行います。
ところが、何故か、こんなエラーが発生です。
pi@raspberrypi:~/py_folder $ python3 out.py
Traceback (most recent call last):
File "out.py", line 3, in
import bluetooth
ImportError: No module named 'bluetooth'
pyblueZ もインストールしたのに、import bluetooth と出ています。これ、python3 で はなく、python out.py だと動くんですよ!what?
いろいろ調べて、Python-izmというページにたどり着きました。次のコマンドで、python3 向けの pyblueZ をインストールできます!
pi@raspberrypi:~/py_folder $ sudo python3 -m pip install pyblueZ
Collecting pyblueZ
Downloading https://www.piwheels.org/simple/pybluez/PyBluez-0.22-cp35-cp35m-linux_armv6l.whl (106kB)
100% |????????????????????????????????| 112kB 147kB/s
Installing collected packages: pyblueZ
Successfully installed pyblueZ-0.22
この対処で、python3 でも動くようになりました!
5.pythonプログラム実行
さて、以下のような python3 プログラムを作成してみました。bluetooth を立ち上げて実行してみましょう。
(1) サーバ側プログラム
クライアントと接続した後、入力された文字をクライアント側に送信します。
始めに、「1から5までの数字を入力してください」との案内を出します。
入力を認めるのは、1から6(6は隠し文字でプログラム終了の場合です)までの数字です。
正しい数字は、クライアントに送信します。
1から6以外の数字は、「指定の数字ではありません」のエラー表示をします。
数字以外の文字は、「入力が数字ではありません」のエラー表示をします。
#!/usr/bin/python3
# coding: UTF-8
import sys
import bluetooth
import time
address = "B8:27:EB:7F:86:7F"
PORT = 1
sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
print('PG Start')
sock.connect( ( address , PORT ) )
print('try before')
try:
while True:
a = input('1 から 5 までの数字を入力してください>>')
if a.isdecimal() == True:
if int(a) > 0 and int(a) < 6:
sock.send( str(a) )
print(a)
else:
if int(a) == 6:
sock.send( str(a) )
print(a)
time.sleep(2)
break
else:
print('指定の数字ではありません')
else:
print('入力が数字ではありません')
except KeyboardInterrupt:
sock.close()
![]() | 新品価格 |

(2) クライアント側プログラム
サーバと接続後、数値を受信し、英語表記にしてディスプレイに表示します。
サーバからの数値は、1から5までですので、それを英語表記(one,two,three,for,five)します。
6を受け取ったら、”THE END”と表示後、プログラムを終了します。
#!/usr/bin/python
# coding: UTF-8
import sys
import time
import bluetooth
address = "B8:27:EB:A1:29:2E"
port = 1
sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.bind( ( "", port ) )
sock.listen( 1 )
while ( True ):
try:
print ("Connect....")
sock_client,address = sock.accept()
print("Connected")
break
except bluetooth.BluetoothError :
print ("Connection Failed")
sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
time.sleep ( 1 )
while( True ):
try:
data_ = sock_client.recv(16)
data = data_.decode("UTF-8")
for i in data:
if( i == "1" ):
print("One")
elif( i == "2" ):
print("Two")
elif( i == "3" ):
print("Three")
elif( i == "4" ):
print("Four")
elif( i == "5" ):
print("Five")
else:
print("THE END")
sock.close()
sock_client.close()
break
except KeyboardInterrupt:
sock.close()
sock_client.close()
break
except:
sock.close()
sock_client.close()
break
![]() | Raspberry Pi Zero WH スターターセット (本体・ケース・ヒートシンク・Mini-HDMIケーブル・OTGアダプター) 新品価格 |

(3) 実行順序
それでは、上記プログラムを、bluetooth通信を使用して動かしてみましょう。
60爺は、sshを使用して、bluetoothを立ち上げてから、pythonプログラムを動かしました。
pi3で2画面(bluetooth用、python用)、zeroで2画面(bluetooth用、python用)が必要になります。以下の手順に従って動かします。
- zero WH の bluetooth を立ち上げます。
- pi3 の bluetooth を立ち上げます。
- zero WH のプログラムを立ち上げます。
- pi3 のプログラムを立ち上げます。
- pi3 のキーボードから入力した1から5までの数字を bluetooth で送信します。
- zero WH で送信結果を受け取り、英語でディスプレイに表示します。
- pi3 のキーボードから6を送ると、pi3 と zero WH のプログラムが終了します。
(4) python3 実行結果
① zero WH bluetooth 立ち上げ

② pi3 bluetooth 立ち上げ

③ zero WH プログラム立ち上げ

④ pi3 プログラム立ち上げ

この時、zero WH のコンソールは以下の表示がなされます。

⑤ ⑥ pi3 から数値入力、 zero WH で英語を出力


続けて数字を入力します。

Four ⇒ Two ⇒ Three ⇒ Five と表示された
⑦ 6を送ってプログラム終了


いかがでしたか、思った通り動きましたね。
これを流用することで、pi3 の指令で、zero WH に設定したモーターなどを制御できることがわかります。
ずっと昔にやろうとしていた、戦車を動かすことが現実味を帯びてきました。少し、時間を頂戴して挑戦してみたいと思います。