#申请原创#
前面我们介绍了简单的数字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 采集数据 图2 数据波形(悬空状态) 在A0引脚连接GND时,其采集结果和波形分别如图3和图4所示。 图3 采集数据 图4 数据波形(连接GND) 2)电位模拟 为了进一步观察数据采集的效果,可以外挂的方式为A0引脚连接一个电位器模块,这样提供旋转电位器就可给出模拟的电位,其连接形式见图5所示。 图5电位器调节 使用电位模拟的方式,其数据采集和波形显示效果如图6和图7所示。 图6 采集数据 图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 双通道数据采集 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显示结果 5)光传感器 在Wio 终端,载有一个光敏二极管电路,其连接的引脚为 A13,电路原理图见图10所示。 通过该器件可获取光照的强度,其检测程序很简单,就是通过读取 A13来获取模数转换值并加以输出。 图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 检测结果 图12 数据曲线 其实,介绍到这里该功能并没有多稀奇,但从资料看其后续功能就强大多了,它居然是TinyML研究和学习的基础之一,你相信不? 在相应的机器学习流程配合下,它居然能识别“石头、剪刀、布”之类的手势识别,后面有时间的话再另文介绍。 图13 手势识别 6)模拟传感器 传感器是计算机感知环境状态的关键器件,它主要分为3类,即数字式传感器、模拟式传感器及脉冲类传感器。将A/D数据采集功能与模拟传感器配合就可解决大量的环境状态感知问题,常见的此类传感器有:火焰传感器、气体传感器、气味传感器、温度传感器、湿度传感器、压力传感器及热释传感器等。 以土壤湿度检测为例,其电路连接如图15所示,传感器连接的引脚为A0,由于检测程序与前面的相同,故这里从略。 图14 土壤湿度检测电路 经编译上传,其检测结果及波形曲线分别如图15和图16所示。 图15 土壤湿度采集 图16波形曲线(侵入水中) 注:其它模拟传感器的用法与此相似,指示数值的标度处理不同罢了! 7)麦克风 在Wio 终端,载有一个以麦克风采集音频信号的电路,其原理图如图17所示。通过它可感知外部环境的安静程度,并可根据限制的设置来发出提示或控制信号。此外,若与SD卡的读写功能相配合,还可以实现语音的录制功能等。 图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 采集结果 图19 数据波形 8)波形显示 在Wio 终端,也能显示音频数据的波形,其效果如图20所示。 图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 语音识别 本次主要介绍了模拟I/O及其外设的使用,将对片内的功能及用法加以介绍,期待继续予以关注。
|