[IDE]

TinyML研究和学习的小精灵 之六

[复制链接]
3103|0
手机看帖
扫描二维码
随时随地手机跟帖
jinglixixi|  楼主 | 2021-8-1 16:20 | 显示全部楼层 |阅读模式
#申请原创#

前面我们介绍了简单的数字I/O及其外设的使用,这次再讲一讲模拟I/O及其外设的使用。
2.模拟 I/O
1)A/D数据采集
在Wio 终端,提供了非常便捷的A/D数据采集功能,并被归入模拟 I/O中来使用。通过扩展接口,可供使用的引脚为:A0~A8。
以引脚A0为例,其数据采集的程序为:
void setup() {
Serial.begin(115200);
pinMode(A0, INPUT);
}
void loop() {
int loudness = analogRead(A0);
Serial.print("Loudness: ");
Serial.println(loudness);
delay(50);
}
因此可见,它的使用还是很简单的。
除了借助串行通讯来显示数据采集值之外,所用到的关键函数是analogRead(),它能直接对指定的引脚进行读取。因是从外部读取信号,故在初始化函数中,需把指定的读取引脚配置为输入模式。
经程序的编译与上传,在使用串行监视器的情况下,就可观察到数据采集的结果。
图1是引脚处于悬空状态下所输出的结果,若打开串口绘图器,则可对数据波形进行观察,见图2所示。
1.jpg
图1 采集数据
2.jpg
图2 数据波形(悬空状态)
在A0引脚连接GND时,其采集结果和波形分别如图3和图4所示。
3.jpg
图3 采集数据
4.jpg
图4 数据波形(连接GND)
2)电位模拟
为了进一步观察数据采集的效果,可以外挂的方式为A0引脚连接一个电位器模块,这样提供旋转电位器就可给出模拟的电位,其连接形式见图5所示。
5.jpg
图5电位器调节
使用电位模拟的方式,其数据采集和波形显示效果如图6和图7所示。
6.jpg
图6 采集数据
7.jpg
图7 数据波形
3)双通道采集
除了进行单通道数据采集,我们还可以十分方便地进行双通道采集,甚至是多通道采集。
以双通道采集为例,其程序如下:
void setup() {
Serial.begin(115200);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
}

void loop() {
int loudness = analogRead(A0);
int loudnessp = analogRead(A1);
Serial.print("A0: ");
Serial.println(loudness);
Serial.print("A1: ");
Serial.println(loudnessp);
delay(500);
}

经程序的编译上传,其采集结果如图8所示,当然若是打开串口绘图器的话,你是见不到2条曲线的,因为它是一个单通道的绘图器,它会将2个通道的采集数据,一视同仁地来看待,波形自然也就只有一条了!
8.jpg
图8 双通道数据采集
4)屏幕显示
前面我们已介绍过Wio 终端的各种显示功能,这里也可以用来显示采集结果,其程序为:
#include"TFT_eSPI.h"
TFT_eSPI tft;
#define LCD_BACKLIGHT (72Ul)
void setup() {
tft.begin();
tft.setRotation(3);
tft.fillScreen(TFT_RED);
tft.setTextColor(TFT_WHITE);
pinMode(A0, INPUT);
}

void loop() {
tft.fillScreen(TFT_RED);
tft.drawChar('A',20, 60, 2);
tft.drawChar('D',40, 60, 2);
tft.drawChar('C',60, 60, 2);
tft.drawChar(':',80, 60, 2);
int loudness = analogRead(A0);
tft.drawNumber(loudness, 100, 60, 4);
delay(1000);
}

在程序编译上传后,其显示效果如图9所示。
9.jpg
图9显示结果
5)光传感器
在Wio 终端,载有一个光敏二极管电路,其连接的引脚为 A13,电路原理图见图10所示。
通过该器件可获取光照的强度,其检测程序很简单,就是通过读取 A13来获取模数转换值并加以输出。
10.jpg
图10检测电路
光强检测的程序为:
void setup() {
pinMode(WIO_LIGHT, INPUT);
Serial.begin(115200);
}

void loop() {
int light = analogRead(WIO_LIGHT);
Serial.print("Light value: ");
Serial.println(light);
delay(200);
}

在程序编译上传后,通过串口监视器可得到图11所示的检测结果,其检测的数据波形则如图12所示。
11.jpg
图11 检测结果
12.jpg
图12 数据曲线
其实,介绍到这里该功能并没有多稀奇,但从资料看其后续功能就强大多了,它居然是TinyML研究和学习的基础之一,你相信不?
在相应的机器学习流程配合下,它居然能识别“石头、剪刀、布”之类的手势识别,后面有时间的话再另文介绍。
13.jpg
图13 手势识别
6)模拟传感器
传感器是计算机感知环境状态的关键器件,它主要分为3类,即数字式传感器、模拟式传感器及脉冲类传感器。将A/D数据采集功能与模拟传感器配合就可解决大量的环境状态感知问题,常见的此类传感器有:火焰传感器、气体传感器、气味传感器、温度传感器、湿度传感器、压力传感器及热释传感器等。
以土壤湿度检测为例,其电路连接如图15所示,传感器连接的引脚为A0,由于检测程序与前面的相同,故这里从略。
  
14.jpg
图14 土壤湿度检测电路
经编译上传,其检测结果及波形曲线分别如图15和图16所示。
15.jpg
图15 土壤湿度采集
16.jpg
图16波形曲线(侵入水中)
注:其它模拟传感器的用法与此相似,指示数值的标度处理不同罢了!
7)麦克风
在Wio 终端,载有一个以麦克风采集音频信号的电路,其原理图如图17所示。通过它可感知外部环境的安静程度,并可根据限制的设置来发出提示或控制信号。此外,若与SD卡的读写功能相配合,还可以实现语音的录制功能等。
17.jpg
图17音频信号采集电路
音频信号的采集程序为:
void setup() {
pinMode(WIO_MIC, INPUT);
Serial.begin(115200);
}

  void loop() {
int val = analogRead(WIO_MIC);
Serial.println(val);
delay(200);
}

该功能接口的引脚定义为:
#defineWIO_MIC (39ul)
经编译上传,其数据采集结果和波形图分别如图18和图19所示。
18.jpg
图18 采集结果
19.jpg
图19 数据波形
8)波形显示
在Wio 终端,也能显示音频数据的波形,其效果如图20所示。
20.jpg
图20 波形显示
要实现波形显示,需有LCD库和Linechart库的支持,其数据采集与波形绘制的程序为:
#include"seeed_line_chart.h"      //引入支持库
#include <math.h>
TFT_eSPI tft;
#define max_size 50              //数据大小
doubles data;                    //数据类型
TFT_eSprite spr = TFT_eSprite(&tft);
void setup() {
pinMode(WIO_MIC, INPUT);
tft.begin();
tft.setRotation(3);
spr.createSprite(TFT_HEIGHT,TFT_WIDTH);
}

void loop() {
spr.fillSprite(TFT_DARKGREY);
int val = analogRead(WIO_MIC);
if (data.size() == max_size) {
data.pop();      //读取堆栈数据
}
data.push(val);   //数据压入堆栈
//设置图线标题
auto header = text(0, 0)
.value("Microphone Reading")
.align(center)
.color(TFT_WHITE)
.valign(vcenter)
.width(tft.width())
.thickness(2);
header.height(header.font_height() * 2);
header.draw();                           //标题高度是字体高度的2倍
//设置图线
auto content = line_chart(20, header.height());  //图线起点
content
.height(tft.height() - header.height() * 1.5)     //图线区域高度
.width(tft.width() - content.x() * 2)           //图线区域宽度
.based_on(0.0)                           //y轴起点
.show_circle(true)                        //数据点绘制圆点
.y_role_color(TFT_WHITE)                  //设置坐标轴为白色
.x_role_color(TFT_WHITE)
.value(data)                             //图线数据
.color(TFT_RED)                          //设置曲线颜色为红色
.draw();
spr.pushSprite(0, 0);
delay(50);
}

除了光传感器具有识别功能外,基于麦克风的音频模块也具有识别处理功能,且可以同SD卡的读写功能相配合来进行语音的记录与播放等。
21.jpg
图21 语音识别
本次主要介绍了模拟I/O及其外设的使用,将对片内的功能及用法加以介绍,期待继续予以关注。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

36

粉丝