bluetooth 通信でリモコン操作 pi3 と zero WH で通信を行う
raspberrypi3で色々遊んできたわけですが、そろそろ、新しいことに挑戦してみたくなりました。
そこで、raspberrypi3 と raspberrypi zero WH を bluetooth で通信し、pi3 側から、zero WH をリモートコントロールしてみます。
これが可能になると、pi3 で出した指令を、zero WH で受取り、たとえば、モーターを制御して車を走らせるようなことが可能になります。
これが出来ると、可能性がぐんと増えますよね。
まずは、bluetooth をインストールして、簡単なプログラムで pi3 – zero WH 間の動きを確認してみましょう。
ご一緒に、内容をご覧ください。
関連パッケージのインストール
始めに、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
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 バイトのディスク領域が新たに消費されます。
エラー https://mirrordirector.raspbian.org/raspbian/ jessie/main libudev-dev armhf 215-17+deb8u7
404 Not Found [IP: 93.93.128.193 80]
0% [作業中]E: https://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
pyBluez のインストール
bluetooth 本体である pyBlueZ をインストールします。
$ sudo pip install pybluez
◆ zero WH では、問題なくインストールできました。
pi3 でのエラー
pi3 で、 以下のエラーが発生しました。
bluez/btmodule.h:4:20: fatal error: Python.h: そのようなファイルやディレクトリはありません
Qiita のこのページに対応策が書いてあります。
Python.h が見つからない場合
$ sudo apt-get install python-dev
インストール後、問題なく pybluez インストールが出来ました。
bluetooth通信開始
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/bluetooth1.jpg)
それでは、bluetoothの通信を開始しましょう。これをペアリングというんですね。
zero WH
受け側である「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
リモコン側ある「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
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 でも動くようになりました!
pythonプログラム実行
さて、以下のような python3 プログラムを作成してみました。bluetooth を立ち上げて実行してみましょう。
サーバ側プログラム
次の作業を行います。
- クライアントと接続した後、入力された文字をクライアント側に送信します。
- 始めに、「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()
クライアント側プログラム
受け手のプログラムの機能です。
- サーバと接続後、数値を受信し、英語表記にしてディスプレイに表示します。
- サーバからの数値は、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
実行順序
それでは、上記プログラムを、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 のプログラムが終了します。
python3 実行結果
zero WH bluetooth 立ち上げ
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_241_1.png)
pi3 bluetooth 立ち上げ
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_219_1.png)
zero WH プログラム立ち上げ
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_241_2.png)
pi3 プログラム立ち上げ
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_219_2.png)
この時、zero WH のコンソールは以下の表示がなされます。
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_241_4.png)
pi3 から数値入力、zero WH で英語を出力
pi3 に1を入力しました。
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_219_4.png)
zero WH のコンソールに One と表示されました。
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_241_5.png)
続けて pi3 に数字を入力します。
4 ⇒ 2 ⇒ 3 ⇒ 5 と入力しました。
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_219_5.png)
zero WH のコンソールに Four ⇒ Two ⇒ Three ⇒ Five と表示されました。
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_241_6.png)
6を送ってプログラム終了
pi3 に6を入力すると pi3 のプログラムが終了しました。
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_219_6.png)
zero WH のコンソールに THE END と出て zero WH のプログラムが終了しました。
![](https://www.mizutan.com/wordpress/wp-content/uploads/2019/02/blue_241_7.png)
思った通り動きましたね。
これを流用することで、pi3 の指令で、zero WH に設定したモーターなどを制御できることがわかります。
最後に
bluetooth通信を使って、リモコン操作、具体的にはpi3とzero WHの間で通信を行ってみました。
必要な環境設定から、簡単なプログラムの作成、その実行順序を決めて実行しました。
それなりのエラーが出たものの、何とか動かすことが出来ました。
ずっと昔にやろうとしていた、戦車を動かすことが現実味を帯びてきました。少し、時間を頂戴して挑戦してみたいと思います。
■思えば「リモコンタンク」の記事も増えてきました。
ディスカッション
コメント一覧
まだ、コメントがありません