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

シェアする

Pocket

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()

ABOX Raspberry Pi 3 Model b ラズベリーパイ 3 b+【2018新型】 MicroSDHCカード32G/NOOBSシステムプリインストール/カードリーダ /5V/3A スイッチ付電源/高品質HDMIケーブルライン/ヒートシンク /簡単に取り付けケース /日本語取扱説明書

新品価格
¥9,999から
(2019/2/19 21:36時点)

(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アダプター)

新品価格
¥2,980から
(2019/2/19 21:38時点)

(3) 実行順序

それでは、上記プログラムを、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 のプログラムが終了します。

(4) python3 実行結果

① zero WH bluetooth 立ち上げ

② pi3 bluetooth 立ち上げ

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

④ pi3 プログラム立ち上げ

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

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

pi3 に1を入力
zero WH のコンソールにOneと表示

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

4⇒2⇒3⇒5と入力

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

6入力でプログラムが終了した
THE END と出てプログラムが終了した

いかがでしたか、思った通り動きましたね。

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

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

スポンサーリンク

シェアする

フォローする