2021/12/15 よりサイトリニューアルしました

Raspberry Pi ZERO W 同士でBluetoothシリアル通信Lチカをやってみる

bluetooth uart

 

前回、Raspberry PiとWindows PCの間で、ターミナルのコマンドを使ってBluetooth シリアル通信を行う方法についてまとめました。↓

 

今回はRaspberry Pi同士でのluetoothシリアル通信についてまとめようかと思います。前回のようなコマンドではなく、一応pythonで通信させる仕組みになっています。

下記のサイトを参考にさせていただきました。↓

RaspberryPi同士でbluetooth通信

上記サイトでは、ペアリング後にpythonプログラムを走らせて任意の文字列をサーバー側からクライアント側に送り続けるといった内容だったので、そこを少し下記のように変更致しました。

ブラウザ→Raspberry pi(html/js/python CGI)→bluetooth→Raspberry Pi(GPIOでLチカ)

Raspberry PiにWEBサーバーを立てて、そこにhtmlで作った簡単なボタンを設置し、ブラウザからそのボタンを押せばもう片方のRaspberry Piに任意の文字列がbluetoothシリアル通信で転送され、文字列に応じてGPIOピンの制御を行いLチカさせるといった流れです。

ブラウザで操作するのがとても無駄に感じますが、とりあえずやってみたかったのでやってみました。

 

 

初めに

作業環境

Raspberry Piの操作にはVNCのリモートデスクトップを使います。SSHだと何故かペアリング時にエラーが発生しうまくいきませんでした。SSHもしくはVNCを使います。

PCからRaspberry Pi2つに接続し、ターミナルを開いておきます。

必要なライブラリのインストール

Raspberry Piにbluezがインストールされていなければ、bluezをインストールします。bluetooth 本体であるpybluezは必須。

サーバー側のRaspberry Piのシリアルポート設定

今回Raspberry Pi ZERO W を2つ使うので(以後デバイスA,B)、片方をBluetooth接続時のサーバーとします。

デバイスAをサーバーにするとすれば、デバイスAの方のSDPサーバーの仮想シリアルポートの設定が必要になります。設定は以下の通り。

チャンネルは1とします。これでサーバー側にrfcomm0のチャンネル1のシリアルポートが設定されます。

 

ペアリング

どちらか片方をアドバタイズに(ペリフェラル側)

デバイスA、Bの両方で下記コマンドを入力し、Bluetooth設定モードに入ります。

デバイスA、Bどちらでも構わないので、片方で下記コマンドを入力し、ペアリングの接続待ち(アドバタイズ)にさせます。この時、接続待ちしている側のMACアドレスが表示されます。

もう片方のデバイスからペアリング要求(セントラル側)

もう片方のデバイスから以下のコマンドでスキャンをかけます。スキャン後、周囲のbluetoothデバイスがぱらぱらと表示されていきますので、その中に接続待ちのアドレスが出てくれば、スキャンをOFFして接続のコマンドを入力します。

Pairing successfulと表示されればOKです。なお、ペリフェラル側で「ペアリング許可しますか」の表示がでるので、OKを選択します。

これでペアリングまでは終了です。

 

シリアル接続

サーバー側プログラム

server.py

シリアル接続からはpythonプログラムで制御します。デバイスA、Bのどちらでも構わないので、サーバー側のプログラムを書き込みます。server.pyとします。

python3 server.py でプログラムを開始させておきます。

rfcomm0 のポート1で接続を待ち受けます。recieveした文字列によって、GPIOの出力を制御しています。

接続が切れても、再度 rfcomm0 のポート1で接続を待ち続けます。

 

クライアント側プログラム

もう片方のデバイスに、クライアント側のプログラムを書き込みます。

なお、今回はブラウザからbluetoothを操作しているので、過去に作成したラジコンコントローラーのpython CGIスクリプトのプログラムの構成(html/js/python cgi)を応用して、python cgiの中にbluetooth接続の記述を埋め込みました。こちらの過去記事の応用になります。↓

 

プログラムはrecieve.pyと、通信部をまとめたRN42.pyになります。

recieve.py

 

RN42の変数に、サーバーのMACアドレスと待ち受けポートを指定しています。

jsからpostされた文字列をそのままsendでサーバー側へ転送しています。

その後、cgiファイルの設計上やむなく接続を切断しています。

 

RN42.py

 

動作確認

CGIスクリプトを呼び出す度に接続、切断を繰り返しているので遅延がえげつないですが、冒頭の流れの通りに動いています。↓

https://twitter.com/ketunorobio/status/1481442492536942594

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です