[Day 26] Edge Impulse + BLE Sense也能感受彩色的人生

[Day 20],[Day 21],[Day 22] 介绍了「Edge Impulse + BLE Sense实现唤醒词辨识」,在[Day 24],[Day 25] 「Edge Impulse + BLE Sense实现手势动作辨识」,相信大家初步已了解如何使用Arduino Nano 33 BLE Sense(以下简称BLE Sense)上的麦克风和加速度计了,但在Edge Impulse的开发平台上资料撷取页面上的感测器型态好像只看到「Build-in microphone」和「Build-in accelerometer」,那其它的感测器要如何连接呢?

俗话说「肝若不好,人生是黑白的,肝若好,人生是彩色的」。所以如果只能接两种感测器,那这样的平台是黑白的,这里就和大家介绍一下如何将其它BLE Sense其它的感测器连接到Edge Inpulse的tinyML开发平台上。主要有下列两大步骤。

  • 感测器资料产生
  • 感测器资料上传

感测器资料产生

先前的实验都是直接将Edge Impusle提供的「arduino-nano-33-ble-sense.ino.bin」透过「flash_windows.bat」(Windows用)将MCU韧体程序烧录到BLE Sense开发板上,然後就能自动将麦克风和运动感测器(IMU)的加速度计值(不含陀螺仪和地磁计)不断上传,且还可设定取样时间长度和频率。所以如果想要将其它感测器甚至多个感测器的数值一口气上传,就要自己写一段MCU程序,令开发板透过虚拟序列埠(Virtual COM Port)将数值转成文字串定时送出。接下来就以BLE Sense板上的APDS-9960(近接、环境光、色彩及手势多合一感测器)中的色彩感测器来作示范。如图Fig. 26-1所示。

ps.这里选用色彩感测器是因容易操纵外界光源变化,数值容易变动,方便观察,其它如温湿度、气压都不容易展示其变化。若改选陀螺仪或地磁计也不错,只是前面章节有介绍过IMU了,所以换个感测器来介绍。

Arduino Nano 33 BLE Sense APDS-9960 近接、环境光、色彩及手势测器
Fig. 26-1 Arduino Nano 33 BLE Sense APDS-9960 近接、环境光、色彩及手势测器。(OmniXRI整理绘制, 2021/10/11)

首先要利用Arduino IDE来写一段发送色彩感测器资料的程序,由於先前已安装过BLE Sense相关函式库,所以这里点击主选单[档案]-[范例]-[Arduino_APDS9960]-[ColorSensor]就能产生一段范例程序。这段原始范例程序经编译上传後已可以独立运作,如图Fig. 26-2所示。

Arduino Nano 33 BLE Sense APDS-9960 色彩感测器资料上传结果
Fig. 26-2 Arduino Nano 33 BLE Sense APDS-9960 色彩感测器资料上传结果。(OmniXRI整理绘制, 2021/10/11)

但这和Edge Impulse要求的传送格式及定时传送的方式略有不同,所以程序略微调整如下所示。再重新编译、上传到BLE Sense中即可。上传前请记得把Edge Impulse相关命令列视窗关闭,以免占住虚拟序列埠,导致程序无法上传到开发板。完成上传後,可点选主选单[工具]-[序列埠监控视窗]就能检查资料是否有正确输出。此时可在萤幕上产生一些色块再将板子上的感测器靠到对应色块位置观察输出数值是否变动。不过这里实验的结果,全红、全绿、全蓝或全白得到的最大数值好像只有60到70间,并非理论最大值的255,但全黑RGB读值皆能降到10以下。所以想透过色彩感测器应用前,须要观察一下在不同类样本间数值变化是否够大,不然就算模型再厉害也英雄无用武之地。

/*
  由 Arduino BLE Sense APDS9960 - Color Sensor 范例修改而得  
*/

#include <Arduino_APDS9960.h> // 导入APDS9960函式库头文件
#define FREQUENCY_HZ        50 // 设定取样频率,受色彩感测器限制,不宜超过200Hz
#define INTERVAL_MS         (1000 / (FREQUENCY_HZ + 1)) // 转换单位变成ms,设定时略小於原始取样频率倒数

static unsigned long last_interval_ms = 0; // 存放最後一次取样系统时间(ms)

// 设定脚位用途及模组初始化(只在电源启动或重置时执行一次)
void setup() {
  Serial.begin(115200); // 设定虚拟序列埠传输速度为115,200bps
  while (!Serial); // 若开启不成功就一直等待

  if (!APDS.begin()) { // APDS感测器初始化
    Serial.println("Error initializing APDS9960 sensor."); // 若失败则印出讯息
  }
}

// 设定无穷循环程序 (会一直依序重覆执行)
void loop() {  
  // 若色彩感测器资料备妥
  while (! APDS.colorAvailable()) { 
    delay(5); // 延时5ms
  }  
  
  int r, g, b; // 宣告色彩感测器读值储放空间
  
  // 若目前时间距离上次最後取样时间大於设定取样间隔时间
  if (millis() > last_interval_ms + INTERVAL_MS) {
    last_interval_ms = millis();  // 把目前时间记录到最後取样时间
    
    APDS.readColor(r, g, b); // 读取色彩值
    
    // 将多个感测资料(R,G,B色彩值)以逗号或TAB('\t')区隔,最後加上换行符号('\n'),输出到序列埠。
    // 资料字串格式: r值,g值,b值\n 
    Serial.print(r);
    Serial.print(',');
    Serial.print(g);
    Serial.print(',');
    Serial.println(b);
  }
}

感测器资料上传

有了源源不绝的信号源之後,再来要建立开发板和Edge Impulse平台的连结。首先创建一个新专案(假设命名为Sensor_Test),接着开始命令列视窗,执行「edge-impulse-data-forwarder --clean」,输入使用者帐号、密码,选择新创建的专案名称「Sensor_Test」(以上下键移动),最後输入资料栏位的名称,以逗号分隔,如「R,G,B」,注意输入的内容一定要和资料栏位数量相符。再来可以回到Edge Impulse「连线装置(Device)」面页检查是否已出现装置名称「Sensor with 3axes(R,G,B)」且连线状态为绿灯,若没有则再重新刷新一次网页直到OK。再来切换到「资料撷取(Data Acquisition)」页面,此时右侧录制新资料最下方的栏位就会出现「Sensor with 3axes(R,G,B)」,且取样频率也更新成MCU指定输出的频率。原先MCU程序写的是50Hz,但由於MCU端会产生一些延迟,所以Edge Impulse端会以系统实测出来的频率(46Hz)为主,若很在意取样频率要很准确的人,则需微调MCU的数值,可能要提高到几Hz来弥补速度的损失。完整步骤可参考图Fig. 26-3所示。

完成上述步骤就能像先前章节介绍的操作模式,按下「开始取样(Strat sampling)」就可以开始建立资料集了。

Edge Impulse接收色彩感测器上传资料
Fig. 26-3 Edge Impulse接收色彩感测器上传资料。(OmniXRI整理制作, 2021/10/11)

小结

有了这项功能,不管是否为开发板上的感测器,一次要传送多少个感测器接收到的数值,多久要传送一次,反正只要能将其数位化并定时送出就能连接到Edge Impulse来建模、训练、推论及产生布署程序,相信这样就能满足更多tinyML的应用。

参考连结

Edge Impulse CLI - Data forwarder资料上传说明文件
ArduinoAPDS9960 library说明文件
Avago APDS-9960资料手册


<<:  使用 Python 实作网路爬虫

>>:  [Day 29] 使用 Python Flask 架设 API 吧!

【领域展开 08 式】 WordPress 布景主题选择 (彷佛发现无底洞

有时寂寞太沉重,身边彷佛只是观众 Study 後必须套用一下 Tanya 无底洞的歌词,选完使用 W...

DAY 7- 《区块密码1》DES(1)- 加密过程

そうですね。 今天来介绍过去被广泛使用,甚至被定为标准的区块加密演算法, DES(Data Encr...

[Day17]Love Calculator

上一篇介绍了Basically Speaking,这题有用到比较常见的写法,Integer.pars...

【Day 29】函式(下)

昨天我们讨论的函式,是没有返回数值的函式,只是单纯传入参数做运算後,直接输出。但我们更多时候会需要把...

ISO 27001 资讯安全管理系统 【解析】(三)

参、管理系统概述 品质管理系统应该是所有管理系统的基础,ISO/TC 176在制订品质管理系统的标准...