前回に引き続き,Bluetooth制御型LED電球のマイコンからの制御にチャレンジします.今回はプログラム言語(Python)から制御を行ってみます.
やりたいこと
- 1stステップ : マイコンからコマンドを打って制御(前回)
- 2ndステップ : マイコン上でプログラムを動かして制御
この記事では2ndステップに取り組みます.
環境
- Intel Edison
- MiPow PLAYBULB color Smart LED
- Python 3.5.3
- bluepy 1.0.5
制御までの手順
マイコン(Intel Edison)の設定,およびBluetooth制御型LED電球(PLAYBULB)との接続,gatttoolsを用いた電球の制御まではできているものとします(前回).
本記事では,gatttoolsでやったこと(Bluetooth LE GATTプロトコルを通じての機器制御)を,プログラミング言語にてやれるようにします.言語は「Edison上での環境・情報が充実している」という理由からPythonを使いました.GATTを制御できるプログラミング言語であればほかの言語でも可能と思います.
[1] Python,Pipのインストール(Optional)
※初期インストール済みの2.7系で実施する場合は不要
単体のPython(3.5.3),Pipをソースからインストールしました(本件とは別の理由からです).
やり方はIntelの公式サイトを参考にしました.
[2] BluePyのインストール
Pythonを通じてGATTの機能を使うのにはいくつか方法があります.今回はBluepyを使いました.
- Pexpect(Edison公式ページに記事あり)
- PyGatt(gatttoolsのラッパー ※手元の環境ではうまく動作せず)
- Bluepy(gatttoolsのラッパー)
$ pip3 install bluepy
[3] GATTを扱うプログラムの実装・実行
準備が済んだので実装に入ります.ここでは3秒ごとに繰り返し色を変更するプログラムを作成してみます.
# -*- coding: utf-8 -*-
from bluepy import btle
from bluepy.btle import BTLEException
import time
LIGHT_MAC_ADDR="DB:22:4B:13:AC:E6"
if __name__ == '__main__':
# connect to device
tPeripheral = btle.Peripheral(deviceAddr=LIGHT_MAC_ADDR)
# find characteristic
tCharList = tPeripheral.getCharacteristics()
tChar = next(tChar for tChar in tCharList if tChar.getHandle()==0x001b)
while (True):
tChar.write(bytes([0, 255, 0, 0])) # red
time.sleep(3)
tChar.write(bytes([0, 0, 255, 0])) # green
time.sleep(3)
tChar.write(bytes([0, 0, 0, 255])) # blue
time.sleep(3)
キャラクタリスティック(私は「ある機能をつかさどるオブジェクト」という形で理解しています)の取得方法はいくつかありますが,全キャラクタリスティックを取得したうえでハンドルが一致する方法をとりました.ハンドル,制御コマンドについては前回の記事に掲載した表を参照ください.
プログラムが完成したら以下のコマンドで実行してみます
$ python3 light_controll.py
LED電球の色が3秒ごとに変わりましたか?
まとめ
自作のプログラム(Python)とライブラリ(bluepy)を使い,LED電球(PLAYBULB)を制御することができました.応用として
- 時刻によって色を変える (マイコンの時計と連携)
- 明日の天気によって色を変える (天気APIと連携)
- 家族が自宅近くまできたら色を変える (スマートフォンGPSと連携)
などが実現できそうです.小型のIntel Edisonと一緒にリビングに設置し,家族間のインフォメーションライトに,でもよいかもしれません."こんな面白い応用がある"というのをご存知でしたら知らせていただけば幸いです.
2回にわたりLED電球の電球機能を使ってみましたが,次回はもう一つのスピーカー機能を使ってみたいと思います.