前回、raspberry Pi同士でのblutoothシリアル通信をやってみました。↓
今回はシンプルにスマートフォンからRaspberry Piにbluetoothシリアル通信を通してみます。これはスマートフォンがラジコン等のコントローラー替わりに出来たりするので非常に実用的です。
しかし、ペアリング後の動作についてはスマートフォン側にもプログラムを作成しなければいけないので、そこが少々厄介でした。(自分で作る場合)
pythonでプログラムを作成しようにも、メジャーなbluetoothのライブラリが使えないっぽいです。かといって変わりになるひな形みたいなのもググってもヒットしない。
ならいっそのことスマートフォンのアプリを作ってみようか、とも思いましたが、どうやらAndroidアプリの基本的な開発言語はjavaみたいですので、かなり厳しいです。(丸1日チャレンジしましたが気分が乗らず挫折しました。。)
という事で、結局は偉大な先人様が作ったアプリを使用する事にしました。初めからそうしておけばよかったですが、まあ回り道したぶん色々知る事が出来たので良しとします。
それでは、Raspberry Piとスマートフォン間(Android)でBlutoothシリアル通信について、まとめたいと思います。
初めに
Blutoothシリアル通信 の流れ
ペアリングまでは過去記事に書いたPC~Raspberry pi間のbluetooth通信と同じになります。↓
Raspberry Piでアドバタイズし、スマートフォン側からPaspberry piとペアリングさせます。
ペアリング後は、Raspberry Pi 側でプログラムを走らせて仮想ポートconnect待ちのサーバーとして待機させます。
スマートフォンでbluetoothシリアル接続のアプリを立ち上げて、connectすれば、Raspberry Piにシリアル通信が可能になります。
使わせてもらった神アプリ
以下リンクにあるアプリを使わせてもらいました。恐らくロボット等のbluetooth制御コントローラーとして開発されたものですので、そういった目的であればめちゃくちゃ使い勝手が良いです。任意の文字列を転送できます。(ボタンの配置が容易、押しっぱなし判定も出来る、そしてシンプル)
https://play.google.com/store/apps/details?id=nextprototypes.BTSerialController&hl=ja&gl=US
英語表記ですが、中学英語すら危うい筆者でも扱えるので分かりやすいです。
プログラム
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# -*- coding: utf-8 -*- import time import bluetooth import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) MOTOR_A1 = 13 MOTOR_A2 = 19 MOTOR_A3 = 26 GPIO.setup(MOTOR_A1, GPIO.OUT) GPIO.setup(MOTOR_A2, GPIO.OUT) GPIO.setup(MOTOR_A3, GPIO.OUT) while(True): PORT = 1 server_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM) print("connect...") server_socket.bind(("",PORT )) server_socket.listen(1) client_socket,address = server_socket.accept() print("connection success!!") while 1: try: data = client_socket.recv(1024) data = data.decode() print(data) print('\n') #except KeyboardInterrupt: #client_socket.close() #server_socket.close() #break except: print("error") print('\n') client_socket.close() server_socket.close() break if data == "hhhhh": GPIO.output(MOTOR_A1, GPIO.HIGH) elif data == "kkkk": GPIO.output(MOTOR_A2, GPIO.HIGH) elif data == "jjjj": GPIO.output(MOTOR_A3, GPIO.HIGH) elif data == "ssss": GPIO.output(MOTOR_A1, GPIO.LOW) GPIO.output(MOTOR_A2, GPIO.LOW) GPIO.output(MOTOR_A3, GPIO.LOW) |
前回の流れでwhile処理が2つ(クライアント側で都度接続が切れてもconnect待ちを維持する為)になっています。修正がめんどいのでそのままにしています。(-_-;)
今回はrecieveでスマートフォンから受け取った文字列に応じてGPIOポートを操作してLチカしています。
操作確認
こんな感じになります。↓