LEDのON/OFFをAndroidとBluetoothで行う
LEDを使う(点灯、消灯、点滅など)Pythonのプログラムを書いたら、そのプログラムをラズパイの上で実行しなければなりません(当たり前ですが)。つまり、ラップトップやデスクトップのコンピュータからVNC経由でラズパイの画面を見て、ThonnyでPythonのプログラムを開いて、実行ボタンをクリックします。ラップトップやデスクトップではなく、タブレットやスマートフォンでVNCを使うこともできますが、いずれにせよ、ラズパイの画面上でThonnyの実行ボタンをタップする必要はあります。
LEDを使いたいだけなのに、VNCのあの「もったり」した動作に付き合い、Thonnyを動かして。。。というのは面倒なときもありますよね。もっと手軽にLEDを使いたいというニーズに応えるには、Blue Dotというツールが便利です。これはAndroidアプリで、タブレットやスマートフォンに表示されるアイコン(デフォルトでは青くて丸いアイコン)をタップすると、Bluetoothでラズパイと通信し、ラズパイ側のPythonプログラムと連携してLEDを使えるようになります。以下の動画のような使用感です。
残念ながら、Blue DotのiOS版はありません。ただし、iOSからラズパイ上のプログラムを実行する方法はあります(LEDのON/OFFをiOSのショートカットを使って行うを参照)。
セットアップ
「Blue DotはAndroidアプリ」と書きましたが、実際には、Android側とラズパイ側の両方でセットアップが必要です。
まずは、Blue Dotをラズパイ側にインストールします。Terminalを開いて以下コマンドを実行:
sudo apt-get -y update
続いて、以下のコマンドを実行:
sudo apt-get -y upgrade
場合によっては、上記コマンドの実行が終了するのに30分くらいかかるかもしれません(ラズパイOSのアップデートをしています)。
そして、いよいよBlue Dotをラズパイへインストールします。Terminalで以下コマンドを実行:
sudo pip3 install bluedot
次に、Blue DotをAndroidマシン(タブレットかスマートフォン)にインストールします。Google Play Storeのリンクはこちら。
最後に、AndroidマシンとラズパイをBluetoothで接続(ペアリング)します。まずは、ラズパイ画面の右上にあるBluetoothのアイコンをクリックし、「Make Discoverable」を選択します。その後、Androidの「Settings」の中のBluetoothを設定する部分を開きます。Bluetooth通信がONになっていることを確認してください。これをAndroid上で開いたままラズパイに戻り、Bluetoothのアイコンをクリックして「Add Device」を選択。「Add New Device」というウィンドウが開いて、ラズパイ周囲にあるBluetooth機器のリストが表示されるので、使いたいAndroidマシンを選択して「Pair」ボタンをクリック。
最初の動作確認
Blue Dotを使うには、まずラズパイの上で動くPythonのプログラムを書いて、実行します。そして、Android上のBlue DotのアプリからPythonプログラムに(Bluetooth経由で)アクセスします。
ここでは、Blue Dotの動作確認を兼ねて最も簡単なプログラムを実行します。bd-first.pyをラズパイ上のThonnyにコピーして保存してください。
Blue Dotを使うには、Pythonプログラムの先頭部分に必ず以下の一行を入れる必要があります。「おまじない」のようなものだと思ってください。
from bluedot import BlueDot
そして、以下のようにして、Blue Dotを使う準備をします。
bdot = BlueDot()
BlueDot()を実行することにより、Android上で「ドット」(丸いアイコン)がタップされたことを検知する検知器(detector)を作っていると考えてください。この検知器が変数「bdot」に格納されています。この変数の名前(変数名)はbdotである必要はなく、別の名前でも構いません(好きな変数名を使えます)。
Blue Dotを使う準備が終わったら、Android上で「ドット」(丸いアイコン)がタップされたことを検知し、それに対応するプログラムが続きます。
bdot.wait_for_press()
print("You just pressed the blue dot on your Android!")
最初の行では、検知器「bdot」に対して、Android上でのタップを検知するまで待つように指示しています。Android上のドット(丸いアイコン)が実際にいつタップされるかはラズパイ側(Pythonプログラム)には予測不可能です。3秒後かもしれないし、30分後かもしれません。したがって、検知器「bdot」はAndroid上のドットがタップされるまでひたすら待ちます。ここで「待つ」というのは、プログラムの実行がそこで一旦止まり、何もしないということです。つまり、Android上でドットがタップされるまで、プログラムの次の行以降は実行されません。
Android上でドットがタップされると、検知器「bdot」がそれを認識し、「待ち状態」を解除します。これにより、wait_for_press()の次の行以降がようやく実行されます。このプログラムでは、print()という機能を使って、「You just pressed the blue dot on your Android」という確認メッセージを出力します。
では、Thonnyの中でbd-first.pyを実行してください。ウィンドウの下の部分にある「Shell」という部分に以下のようなメッセージが出力されれば、プログラムが正常に動作を開始しています。
Server started B8:27:EB:A4:06:AF
Waiting for connection
ここで「Waiting for connection」というのは、(ラズパイ上で)Pythonプログラムが動作中で、Android上のドットがタップされるのを待っている状態だということです。
もし、ウインドウ下部の「Shell」に、エラーメッセージが出てプログラムが実行できない場合は、Thonnyのメニュー「Run」をクリックし、「Run current script in terminal」を選択してください。Terminalが別ウインドウで開いて、そこに上記のようなメッセージが出力されるはずです。
ラズパイ上でPythonプログラムが動作中で、Android上のドットがタップされるのを待っている状態になったら、いよいよAndroidのBlue Dotアプリを動かします。最初に接続先のラズパイの名前が表示されるので、それをタップすると、Bluetooth経由でラズパイに接続し、画面に青いドットが表示されます。そして、ラズパイ側に
Client connected 5C:CB:99:1E:54:71
というようなメッセージが出力されます。これは、AndroidのBlue Dotアプリがラズパイ上のPythonプログラムと接続に成功したということを意味しています。
最後に、Android上のドットをタップすると、ラズパイ上のThonny(のShell)、あるいはTerminalの中に、
You just pressed the blue dot on your Android!
というメッセージが出力されます。これで、Blue Dotとbd-first.pyが正しく動作していることが確認できました。
ループを使って、複数回のタップを検知する
上記のプログラム(bd-first.py)は、Android上のドットを一度タップすると終了し、Androidとラズパイ間のBluetooth接続は切断されます。以下では、タップの検知を一度だけするのではなく、何回も検知し続けるプログラムを書きます。
bd-first-loop.pyをラズパイ上のThonnyにコピーして保存してください。このプログラムは、bd-first.pyとほとんど同じですが、唯一の違いは無限ループを使って、何度も何度もタップの検知を繰り返すことです。
while True:
try:
bdot.wait_for_press()
print("You just pressed the blue dot on your Android!")
except KeyboardInterrupt:
break
このプログラムをラズパイ上で動かし、Androidから接続してドットをタップしてみてください。タップしたら確認メッセージがラズパイ側に出力されます。これは先のプログラムと同じですが、今回のプログラムは確認メッセージを出力した後終了するのではなく、ドットが次にタップされるのを待ちます(ループでwait_for_press()を繰り返す)。
ドットのタップによってLEDを点灯、消灯する
さてここからが本題です。bd-first-loop.pyをもとに、LEDのON/OFFをBlue Dotから行うプログラムを書きます。
まずは、以下の回路を作ってください。この回路は「複数のLEDを点滅させる(複数のGPIOピンを使う)」で作ったものと同じです。
そして、bd-led2-on-off.pyをラズパイ上のThonnyにコピーして保存、実行してください。続いて、Androidからラズパイに接続してドットをタップしてください。最初のタップでLEDがONになり、次のタップでOFFになり、その次のタップでまたONになり・・・を繰り返します。
このプログラムのポイントは、最初のwait_for_press()でドットのタップを検知したらLEDをONにし、2回目のwait_for_press()でドットのタップを検知したらLEDをOFFにするようにして、これをループで繰り返すことです。
while True:
try:
bdot.wait_for_press()
GPIO.output(redPin, GPIO.HIGH)
GPIO.output(bluePin, GPIO.HIGH)
bdot.wait_for_press()
GPIO.output(redPin, GPIO.LOW)
GPIO.output(bluePin, GPIO.LOW)
except KeyboardInterrupt:
break
このプログラムは無限ループを実行するので、Ctrl-cしてプログラムを終了させます(Ctrl-cしないと永遠にプログラムが終了しません)。上記ループの最後の2行(exceptから始まる部分)は、Ctrl-cされた時にプログラムを正常に終了させるためのものです。
ドットのタップによってLEDを連続点滅させる
次に、ドットをタップしたら複数のLEDが連続点滅するようにしましょう。まずは、以下の回路を作ってください。この回路は「複数のLEDを点滅させる(複数のGPIOピンを使う)」で作ったものと同じです。そして、led8-on-off-random.pyを改良して、Blue Dotを使えるようにします。
改良したプログラムは、bd-led8-on-off-random.pyです。Android側でドットをタップすると、8個のLEDがランダムに連続点滅を開始します。プログラムを終了させるには、Ctrl-cします(Ctrl-cしないと永遠にプログラムが終了しません)。
Android側でドットをタップして点滅を停止できると便利なのですが、それにはもう少し高度なプログラミングが必要なので、今のところはここまでにしておきましょう。ご興味のある方はスラックでご連絡ください。