BITalinoで光センサー
BITalinoとは
BITalinoは, 医療などを目的として用いられる生体信号をリアルタイムに取得するためのハードウェア(プラットフォーム)です. BITalinoを始めるには,「Plugged Kit」「Board Kit」「Freestyle Kit」の3種類のスタータキットが存在しますが, ここでは,メインボードと各種センサーが切り離された「Plugged Kit」を用いることにします. 2019年8月現在,医療機器のオンラインショップのCreactでは34,700円で販売されています. BITalinoでは,センサーから取得した値をBluetoothを経由して,PCに送信することが可能です. このとき,提供されるAPIを利用することになりますが,Python,Java,Unityなど様々なプログラミング言語が利用可能です. ここでは,Pythonを利用してすることにしましょう.
まずは,BITalinoで何が出来るか確認してみましょう. 下記はBITalinoで筋電位を計測することで,ドローンのコントローラとして用いています. 生体信号を用いることで,これまでには存在しなかった,新しいインターフェースの開発が可能です.
下記は,マウスの代わりに筋電位を用いてPCの決定操作を行っています. 生体信号をトリガーとして用いることで, 四肢障害を抱えた人でもPCを操作することが可能となります.
初期設定
それでは,BITalinoの初期設定を行いましょう. まずは,メインボードにバッテリーと光センサー(LUC)を下図のように接続してください. メインボードはバッテリー以外にも,USB Type Bの端子からも給電が可能です. また,光センサーは,メインボードの A1 に接続します(アナログ入力の1番).
次に,BITalinoのメインボードのスイッチを入れます. ボード上のLEDが白く点灯します. この状態で,PCとBluetoothで接続します. 検出されたBITalinoの追加には,PINコードが必要となりますが, これはウェブで公開されているように 1234 を入力します.
オープンシグナルズ
OpenSignalsは,BITalinoが公式に提供している取得したデータの可視化ソフトウェアです. 様々なプラグインも提供されており,OpenSignals単体だけでも,様々な分析が可能です.
OpenSignalsを起ち上げると,下記のようにBuetoothで接続されたBITalinoが検出されます. ここで,表示されるMACアドレス( 20:16:12:21:35:82 )は,後述のAPIでも利用しますのでメモしておきましょう. 加えて,メインボードに接続されているセンサーを設定します. ここでは,A1 に 光センサー(LUX) が接続されていることを指定します.
計測を開始すると,下図のように折れ線グラフでセンサーから取得された値が表示されます. 今回使用しているのは,光センサーであるため,通常は部屋の照明により 30% の照度となっています. このセンサーを手で覆うと,ほぼ 0% の照度となることがわかります.
Python APIを利用した照度の取得
それでは,APIを利用してBITalinoからデータを取得してみましょう. 使用するプログラミング言語は Python です. 対応するPythonのバージョンは 3.7以降 とされています(検証では 3.7.9 を利用しました).
APIの導入はPython APIを参考にします.
必要なライブラリは,numpy,pyserial,PyBluez-bitalino,bitalinoの4種類です.
いずれも pipコマンド で簡単にインストールできます.
必要なライブラリは,numpy, pyserial, PyBluez, bitalino です.
このうち,PyBluzが必要なプラットフォームは,Windows 10のみですが,
Visual Studioのインストールも必要なことに注意してください.
pip install numpy
pip install pyserial
pip install PyBluez-bitalino
pip install bitalino
それでは,コードを確認していきましょう. BITalinoとの接続の際には,デバイスのMACアドレスが必要になります. MACアドレスは,OpenSignalsで確認することができます.
from bitalino import BITalino
macAddress = "20:16:12:21:35:82" # MACアドレス
device = BITalino(macAddress) # デバイスの取得
print(device.version()) #バージョンの表示
次に,サンプリングレート(1000Hz),取得チャネル(A1),取得サンプル数(10)を設定します. ここで,取得サンプル数は,一度のリクエストでデバイスから取得されるサンプルの数です. この値を 1 にすると計算負荷が高くなるため,10 または 100 に設定するのが好ましいとされています.
samplingRate = 1000 # サンプリングレート
acqChannels = [0] # 取得チャネル(A1)
nSamples = 100 # 取得サンプル数
device.start(samplingRate, acqChannels) # データ取得開始
data = device.read(nSamples)
print(data)
device.stop()
device.close()
まずは,部屋の照明下でデータサンプルを取得してみます. サンプルは,シークエンス番号,デジタルチャネル0,デジタルチャネル1,デジタルチャネル2,デジタルチャネル3に加え, 上記の AcqChannels で指定したアナログチャネルで構成された配列となっています. ここでは,配列の最後にある 210 , 211 などが取得された照度です.
$ python BITalinoLUC.py
BITalino_v5.1
[[ 0. 1. 1. 0. 0. 210.]
[ 1. 1. 1. 0. 0. 211.]
[ 2. 1. 1. 0. 0. 211.]
[ 3. 1. 1. 0. 0. 211.]
[ 4. 1. 1. 0. 0. 210.]
[ 5. 1. 1. 0. 0. 208.]
[ 6. 1. 1. 0. 0. 208.]
[ 7. 1. 1. 0. 0. 208.]
[ 8. 1. 1. 0. 0. 209.]
[ 9. 1. 1. 0. 0. 211.]]
次に,センサーを手で覆ってデータサンプルを取得してみます. アナログチャネルのデータは 30,29 などの値となっており, 照度が小さくなったことがわかります.
$ python BITalinoLUC.py
BITalino_v5.1
[[ 0. 1. 1. 0. 0. 30.]
[ 1. 1. 1. 0. 0. 30.]
[ 2. 1. 1. 0. 0. 29.]
[ 3. 1. 1. 0. 0. 30.]
[ 4. 1. 1. 0. 0. 31.]
[ 5. 1. 1. 0. 0. 31.]
[ 6. 1. 1. 0. 0. 31.]
[ 7. 1. 1. 0. 0. 31.]
[ 8. 1. 1. 0. 0. 30.]
[ 9. 1. 1. 0. 0. 31.]]