bluetooth 通信でリモコン操作 pi3 と zero WH で通信を行う

2019年3月25日

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 のインストール

pyBluez インストール

bluetooth 本体である pyBlueZ をインストールします。

$ sudo pip install pybluez

◆ zero WH では、問題なくインストールできました。

トラブルシューティング

pi3 でのエラー

pi3 で、 pybluez インストール時に、以下のエラーが発生しました。

bluez/btmodule.h:4:20: fatal error: Python.h: そのようなファイルやディレクトリはありません

Qiita のこのページに対応策が書いてあります。

Python.h が見つからない場合
$ sudo apt-get install python-dev

インストール後、問題なく pybluez インストールが出来ました。

bluetooth通信開始

ペアリング開始

それでは、ペアリングを開始します。

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 

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用)が必要になります。以下の手順に従って動かします。

  1. zero WH の bluetooth を立ち上げます。
  2. pi3 の bluetooth を立ち上げます。
  3. zero WH のプログラムを立ち上げます。
  4. pi3 のプログラムを立ち上げます。
  5. pi3 のキーボードから入力した1から5までの数字を bluetooth で送信します。
  6. zero WH で送信結果を受け取り、英語でディスプレイに表示します。
  7. pi3 のキーボードから6を送ると、pi3 と zero WH のプログラムが終了します。

python3 実行結果

zero WH bluetooth 立ち上げ

pi3 bluetooth 立ち上げ

zero WH プログラム立ち上げ

pi3 プログラム立ち上げ

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

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

pi3 に1を入力しました。

zero WH のコンソールに One と表示されました。

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

4 ⇒ 2 ⇒ 3 ⇒ 5 と入力しました。

zero WH のコンソールに Four ⇒ Two ⇒ Three ⇒ Five と表示されました。

6を送ってプログラム終了

pi3 に6を入力すると pi3 のプログラムが終了しました。

zero WH のコンソールに THE END と出て zero WH のプログラムが終了しました。

思った通り動きましたね。

これを流用することで、pi3 の指令で、zero WH に設定したモーターなどを制御できることがわかります。

ずっと昔にやろうとしていた、戦車を動かすことが現実味を帯びてきました。少し、時間を頂戴して挑戦してみたいと思います。

スポンサーリンク

モーター制御からリモコン操作に至る過程の記事です。他の記事もぜひ、ご覧ください。

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら