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);
}

前へ

Nano 33 BLE Senseをデータ入力に使う<BLE>②温湿度センサ<BLEセントラル>

次へ

Nano 33 BLE Senseをデータ入力に使う<BLE>④近接センサ<BLEセントラル>