Nano 33 BLE Senseをデータ入力に使う<BLE>③近接センサ<BLEペリフェラル>
前回、複数搭載されているセンサのうち温湿度センサのHTS221を使いました。ここでは、近接センサ APDS9960を扱います。光センサがあって、ジェスチャ機能などを実装されています。
●APDS9960のおもなスペック
- 動作電圧 2.4~3.6V
- 消費電流 待機時38uA、動作時790uA
- 光による近接接近検知(Proximity detection)
- ジェスチャ検知( Gesture detection)
- 環境光感知(Ambient Light Sense)
- 色感知(Color Sense (RGBC))
- インターフェース I2C
●接続
USBケーブルで、PCと接続します。
●APDS9960のライブラリ
ライブラリ管理でAPDS9960を検索して出てきたArduino_APDS9960をインストールします。
ライブラリと同時にサンプル例もインストールされています。
●サンプルColorSensor
color RGB (red, green, blue) valuesを読み取るスケッチです。反射光でも、直接発光するLEDでも読み取りました。黒は全部の値が'1'になりました。赤色7セグメント LEDの前にもっていくと、rが'50'前後になりました。
実行例です。
●サンプルGestureSensor
写真の位置関係で、指を左右に動かすと、
- LEFT: from analog pins side towards digital pins side
- RIGHT: from digital pins side towards analog pins side
指を横に寝せて上下に動かすと、
- UP: from USB connector towards antenna
- DOWN: from antenna towards USB connector
のジェスチャを把握します。
シリアルモニタの様子です。
●サンプルProximitySensor
近接センサ( Proximity Sensor )は、センサから、何らかの物体までの距離を表示しています。10cmぐらいで0、30cmぐらいで255、リニアな動きではないようです。
●スケッチ
BLEペリフェラルのスケッチを追加します。このセンサで送るのは、近接センサ( Proximity Sensor )の値、RGB それぞれの値です。いずれも整数値です。R、G、Bはカンマで区切って一つの文字列データにしました。
#include <Arduino_APDS9960.h>
#include <ArduinoBLE.h>
// BLE Service
#define Nano33BLESense_Service2_UUID "F000AA40-0451-4000-B000-000000000000"
BLEService Nano33BLESense_Service2(Nano33BLESense_Service2_UUID);
// BLE Characteristic
#define APDS9960_RGB_Characteristic_UUID "F000AA41-0451-4000-B000-000000000000"
#define APDS9960_Proximity_Characteristic_UUID "F000AA42-0451-4000-B000-000000000000"
BLEStringCharacteristic APDS9960_RGB(APDS9960_RGB_Characteristic_UUID, BLERead | BLENotify, 24);
BLEIntCharacteristic APDS9960_Proximity(APDS9960_Proximity_Characteristic_UUID, BLERead | BLENotify);
// BLE Descriptor
#define APDS9960_RGB_Descriptor_UUID "2901"
#define APDS9960_Proximity_Descriptor_UUID "2901"
BLEDescriptor APDS9960_RGB_Descriptor(APDS9960_RGB_Descriptor_UUID, "color RGB");
BLEDescriptor APDS9960_Proximity_Descriptor(APDS9960_Proximity_Descriptor_UUID, "Proximity");
#define localNAME "APDS9960"
#define DeviceNAME "APDS9960BLE"
float previousMillis = 0; // last time value was checked, in ms
void setup() {
Serial.begin(9600);
while (!Serial);
Serial.println("APDS9960 test");
if (!APDS.begin()) {
Serial.println("Failed to initialize APDS9960 sensor!");
while (1);
}
if (!BLE.begin()) {
Serial.println("starting BLE failed!");
while (1);
}
BLE.setLocalName(localNAME);
BLE.setDeviceName(DeviceNAME);
//// set the service1
BLE.setAdvertisedService(Nano33BLESense_Service2);
// add characteristic
Nano33BLESense_Service2.addCharacteristic(APDS9960_RGB);
Nano33BLESense_Service2.addCharacteristic(APDS9960_Proximity);
// add descriptor
APDS9960_RGB.addDescriptor(APDS9960_RGB_Descriptor);
APDS9960_Proximity.addDescriptor(APDS9960_Proximity_Descriptor);
// add service
BLE.addService(Nano33BLESense_Service2);
// start advertising
BLE.advertise();
Serial.println("\nBluetooth device active, waiting for connections...");
}
void loop() {
// wait for a BLE central
BLEDevice central = BLE.central();
// if a central is connected to the peripheral:
if (central) {
delay(100);
Serial.print("\nConnected to central: ");
// print the central's BT address:
Serial.println(central.address());
// check data every 200ms
// while the central is connected:
while (central.connected()) {
long currentMillis = millis();
// if 200ms have passed, check value:
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateValue();
delay(1000);
}
}
// when the central disconnects
Serial.print("Disconnected from central: ");
Serial.println(central.address());
goto brout;
}
brout: ;
}
void updateValue() {
// check if a color reading is available
while (! APDS.colorAvailable()) {
delay(5);
}
int r, g, b;
// read the color
APDS.readColor(r, g, b);
// check if a proximity reading is available
while (! APDS.proximityAvailable()) {
delay(5);
}
int proximity = APDS.readProximity();
Serial.println("");
Serial.print("r,g,b = ");Serial.println(String(r)+","+String(g)+","+String(b));
Serial.println(proximity);
String valueof_APDS9960_RGB = String(r)+","+String(g)+","+String(b);
int valueof_APDS9960_proximity = proximity;
// update characteristic
APDS9960_RGB.writeValue(valueof_APDS9960_RGB);
APDS9960_Proximity.writeValue(valueof_APDS9960_proximity);
}