親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

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側でドットをタップして点滅を停止できると便利なのですが、それにはもう少し高度なプログラミングが必要なので、今のところはここまでにしておきましょう。ご興味のある方はスラックでご連絡ください。

自習プロジェクトの目次に戻る