Genuino101Lチカに引き続き、今回はBLE機能を使ってみました!
1. BLEとは?
1.1 IoTとは?
最近話題のIoT(アイオーティー、Internet of Things、モノのインターネット)とは、パソコンやプリンター等のIT関連機器とは異なり、従来はインターネットに接続されることが無かったモノをインターネットに接続する事を言います。
1.2 無線通信規格の色々
※規格同士の熱いせめぎ合いを感じます
表1:主な無線通信規格と性能
ZigBee | Bluetooth | Wi-Fi | |
読み | ジグビー | ブルートゥース | ワイファイ |
IEEE規格名 | IEEE802.15.4 | IEEE 802.15.1 | IEEE 802.11ac |
帯域 | 2.4GHz | 2.4GHz | 5GHz |
通信距離 | 数百m~数km程度 | 数mから数十m程度 | 数m~数百m程度 |
同時使用可ch数 | 16ch | 79ch | 実質3ch(11ch) |
通信速度 | 最大250kbps | 最大24Mbps | 最大6.9Gbps |
電力消費 | 極小(1.5μA~30mA) | 小 | 大 |
※2016.09.06 NOBのArduino日記!調べ
2. 接続
Genuino101のD4ピンにプッシュボタンを接続しD4がHighかLowかを読み取ることでプッシュボタンが押された(3.3VでHigh)か押されていないか(0VでLow)を確認します。
10kΩの抵抗を使用していますが、これはプッシュボタンが押されていない限りD4のレベルを低く保つ為のプルダウン抵抗です。
図1:実験回路図
図2:実際の回路図
3. プログラム
プログラムは以下の通りです。
このプログラムをGenuino101で実行することで、図2プッシュボタンを使用すると、ピン13のオンボードLEDをオン/オフすることができます。またスマートフォンからも同じ操作を実行でき、スマートフォンはLEDの状態(ONかOFFか)を読み取ることができます。
この双方向通信は、BLE中央(iPadmini)と周辺機器(Genuino101)の間で行われます。
#include <CurieBLE.h> const int ledPin = 13; // ledPinをオンボードLEDに設定する const int buttonPin = 4; // buttonPinをデジタルピン4に設定する BLEPeripheral blePeripheral; // 周辺インスタンスを作成する BLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214"); // サービスを作成する // スイッチ特性を作成し、リモートデバイスに読み書きを許可する BLECharCharacteristic ledCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite); // ボタン特性を作成し、リモートデバイスが通知を受け取れるようにする BLECharCharacteristic buttonCharacteristic("19B10012-E8F2-537E-4F6C-D104768A1214", BLERead | BLENotify); // リモートデバイスが通知を受け取れるようにする void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); // ピン13のLEDを出力として使用する pinMode(buttonPin, INPUT); // ボタンのピン4を入力として使用する // 周辺機器のローカル名を設定する blePeripheral.setLocalName("ButtonLED"); //この周辺機器がアドバタイズ(経路広告)するサービスのUUIDを設定する blePeripheral.setAdvertisedServiceUuid(ledService.uuid()); // サービスと特性を追加する blePeripheral.addAttribute(ledService); blePeripheral.addAttribute(ledCharacteristic); blePeripheral.addAttribute(buttonCharacteristic); ledCharacteristic.setValue(0); buttonCharacteristic.setValue(0); // サービスを開始する blePeripheral.begin(); Serial.println("Bluetooth device active, waiting for connections..."); } void loop() { // 周辺機器とポーリング(競合の回避・送受信の準備・処理の同期等)する blePeripheral.poll(); // 現在のボタンが接続されたピンの状態を読み込む char buttonValue = digitalRead(buttonPin); // 最後の読み取り以降に値が変更されているか確認する boolean buttonChanged = (buttonCharacteristic.value() != buttonValue); if (buttonChanged) { // ボタン状態の変更、特性の更新 ledCharacteristic.setValue(buttonValue); buttonCharacteristic.setValue(buttonValue); } if (ledCharacteristic.written() || buttonChanged) { // LEDを更新する。特性またはボタン状態に書き込まれたいずれかの値が変更された if (ledCharacteristic.value()) { Serial.println("LED on"); digitalWrite(ledPin, HIGH); } else { Serial.println("LED off"); digitalWrite(ledPin, LOW); } } }
図1:プログラム例
※CurieBLE.hは、101ボードのBLEモジュールのすべてのパラメータ、機能、および機能にアクセスできるライブラリです。 Bluetooth Low Energyでは、この規格をサポートするスマートフォン、タブレット、および周辺機器に接続して通信することができます。
4. 実験!
※nRF Connectは、Bluetooth low energy(BLE)(Bluetooth SmartまたはBluetooth 4.0.0以降)デバイスをスキャンして探索し、それらと通信することを可能にする強力な汎用ツールです。またAndroid用ではnRF Master Control Panel(BLE)が有ります。
4.1 nRF ConnectのインストールとBLEの接続
iOSアプリに「nRF Connect」と言う物が有りましたのでインストールしました。
図3の様に「ButtonLE」と言う名前が表示されるので、右の「CONNECT」ボタンを押すと「Unknown Service」「UUID 19B10010-E8F2-537E-4F6C-D104768A1214」と表示されますのでこれをタップします。
図3:BLE接続
4.2 Genuino101からiPadminiへの通知を許可
2行目の「Unknown Service」をタップし、右端の小さなアイコン(複数の下矢印を持つアイコン)をタップすると図4の様に「X」が付き、Genuino101からの通知が有効になります。
これにより、Genuino101に接続したプッシュボタンを押しているのか離しているのかをiPadminiの画面上で確認する事が出来る様になります。
図4:通知を許可
4.3 iPadminiからGenuino101を操作してLEDを点灯する
図5:LEDを点灯
図6:LEDを消灯
4.5 実験!
実際に実験している所の写真です。
図7:BLEによるLチカの実験!
5. まとめ
励みになりますのでよければクリック下さい(^o^)/