- 2024-12-30
-
回复了主题帖:
【得捷电子Follow Me第二季第4期】作品提交综合
Jacktang 发表于 2024-12-30 07:31
就是关于任务三,调试PDM麦克风,通过串口打印收音数据和音频波形,这个波形图标是怎么输出的
下载程序后,点击arduino ide右上角工具就行了
- 2024-12-29
-
发表了主题帖:
【得捷电子Follow Me第二季第4期】作品提交综合
本帖最后由 阳光明媚的雨天 于 2025-1-11 13:56 编辑
视频:
https://training.eeworld.com.cn/video/42218
1、全部物料清单
本次活动使用的开发板是Arduino® Nano RP2040 Connect,芯片是树莓派的RP2040,可以解锁很多的开发方式,之前就很想买一块,参加这个活动直接获得,很赞!
实物图
二、任务完成
必做任务一:搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!;
打开 Multiple Blinks 例程进行修改
三色灯需要使用NINA-W102-00B模块,进行控制,因此控制是通过RP2040通过I2C协议进行控制,arduino对其进行了封装。
程序流程框图
使用串口输入2,就可以输出DigiKey & EEWorld!
必做任务二:学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据;
LSM6DSOXTR IMU 基础知识
LSM6DSOXTR 是由 意法半导体(STMicroelectronics) 生产的一款 六轴惯性测量单元(IMU),它结合了 三轴加速度计 和 三轴陀螺仪,用于检测设备的 加速度 和 角速度。该芯片广泛应用于运动检测、姿态估计、导航、虚拟现实(VR)和增强现实(AR)等领域。
LSM6DSOXTR 基于 MEMS(微机电系统) 技术,并支持多种数据输出模式,适用于低功耗应用和要求高精度的嵌入式系统。作为 IMU(惯性测量单元),它能够实时感知设备的动态行为和空间定位。
主要特点和规格
传感器类型:
加速度计:测量物体在三维空间中的加速度。
陀螺仪:测量物体的旋转角速度。
加速度计(Accelerometer):
三轴加速度计,能够测量沿 X、Y、Z 三个轴的加速度。
测量范围通常为 ±2g、±4g、±8g 和 ±16g,可以根据应用的需求选择。
输出数据为数字信号,可通过 I2C 或 SPI 接口读取。
陀螺仪(Gyroscope):
三轴陀螺仪,能够测量设备绕 X、Y、Z 轴的旋转角速度。
测量范围通常为 ±125°/s、±250°/s、±500°/s、±1000°/s 和 ±2000°/s。
输出数据为数字信号,支持 I2C 或 SPI 接口。
数据输出接口:
I2C 和 SPI 两种接口方式,灵活选择,适合各种应用。
支持高数据传输速率和低功耗模式,适应不同需求的应用场景。
低功耗特性:
LSM6DSOXTR 提供多种低功耗模式,适合嵌入式、可穿戴设备和物联网应用,能够在功耗和性能之间做出平衡。
具有高性能、低延迟的特性,适用于实时运动检测和控制应用。
内置传感器融合功能:
支持 传感器融合,能够提供加速度和角速度数据的组合输出,进而实现 运动检测、步态识别、方向估计 和 姿态控制。
集成硬件功能:
嵌入式数字运动引擎:提供内置的运动检测和活动监测功能,例如步态识别、摔倒检测、自由落体检测等。
自检和校准功能:LSM6DSOXTR 包含自动自检和校准功能,可以提升传感器的稳定性和准确性。
温度传感器:
LSM6DSOXTR 配备了温度传感器,用于测量芯片的温度,并可用于温度补偿,提高数据的精确度。
这个开发板中使用的是I2C协议进行通讯的
下载安装Arduino_LSM6DS3库,里面例程可以读取到加速度、角速度、还有温度
直接可以跑起来,驱动很简单
必做任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。
下面是来自GPT对PDM麦克风的介绍MP34DT06JTR是I2C协议的,之前用过I2S的麦克风。
1. PDM的工作原理
脉冲密度调制:PDM是一种将模拟信号转换为数字信号的技术。它使用固定的采样频率,通过调节脉冲的密度(即脉冲之间的间隔)来编码模拟信号的幅度。每个脉冲表示一个样本,而脉冲的密度(即出现的频率)则表示原始模拟信号的幅度。
音频数据的编码:PDM麦克风的输出信号是一个连续的脉冲流,表示音频信号的强度。通过解码(通常是通过微控制器上的硬件或软件解码器),可以恢复出原始的音频数据。
相比PCM:PDM信号比PCM(脉冲编码调制)更简洁,因为它不需要传输每个样本的多位数据,而只需要一个单比特(0或1)来表示样本的信息。因此,PDM信号需要的传输带宽较低。
2. PDM麦克风的优缺点
优点:
低功耗:PDM麦克风的输出信号是数字信号,因此它们比传统的模拟麦克风消耗的功率更少。
抗噪声性强:由于输出的是数字信号,PDM麦克风对电磁干扰的抵抗力较强。
简化设计:在某些应用中(如使用单片机或微控制器的音频应用),数字输出使得系统设计更简单,因为不需要额外的模拟到数字转换器(ADC)。
缺点:
较高的采样率要求:由于PDM使用的是单比特数据,通常需要比PCM更高的采样率来获得高质量的音频。
需要解码:PDM信号需要解码(通常通过滤波器或DSP),以还原为标准的音频格式(如PCM),这可能增加计算负担。
3. PDM与其他数字音频技术的对比
PDM vs PCM:
PDM是通过改变脉冲的密度来编码音频数据,而PCM则使用固定的脉冲时长并通过不同的幅度表示样本值。PDM是单比特的,而PCM通常是多比特(如16位、24位等)。
PDM信号相对于PCM来说,数据量更小,但需要更高的采样频率。
PDM vs I2S:
I2S(Inter-IC Sound)是另一种常用的数字音频接口协议,通常用于传输音频数据。I2S协议通过多个数据线传输音频数据(通常是多个通道,16位或更高),而PDM麦克风使用单比特的信号流。
PDM麦克风的数据通常是通过专门的硬件(如Arduino的PDM接口或I2S接口)处理并转换成PCM数据,以便后续处理。
2、打开例程 PDMSerialPlotter 编译下载后就可以得到采集的数据,
观察到void onPDMdata()函数是工作在中断中的,arduino确实封装的太好了,底层一点都看不到,不知道中断运行的周期。
通过图标可以看到声音的波形。
选做任务一(非必做):通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小;
根据声音大小可以获取一段时间的声音数据,获取声音,音量的最大值,或者平均值来反映声音的大小。相对来说获取音量最大值简单但并不是很准确。
因此,用一段时间声音的平均值来反映声音的大小。根据上面例程进行修改,我直接丢给了chartGPT。
#include <PDM.h>
#include <Scheduler.h>
#include "WiFiNINA.h"
// 定义 RGB LED 引脚
#define redPin LEDR
#define greenPin LEDG
#define bluePin LEDB
// PDM 麦克风数据缓冲区
short sampleBuffer[512];
volatile int samplesRead;
// 音频强度(RMS 值)
float rmsValue = 0.0;
// 定义 RMS 历史值的大小(用于滑动平均)
#define RMS_HISTORY_SIZE 10
float rmsHistory[RMS_HISTORY_SIZE]; // 用来存储历史 RMS 值
int rmsIndex = 0; // 当前 RMS 值的索引
// EMA 参数
float alpha = 0.05; // 滤波器的平滑系数,越接近 0,越平滑
float lastRMS = 0; // 上次的 RMS 值,初始化为 0
void setup() {
Serial.begin(9600);
// 初始化 PDM 麦克风
PDM.onReceive(onPDMdata);
if (!PDM.begin(1, 16000)) { // 单通道,采样频率为16kHz
Serial.println("Failed to start PDM!");
while (1);
}
// 设置 RGB LED 引脚为输出
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
// pinMode(bluePin, OUTPUT);
// 初始化 `lastRMS` 为一个合理的值,例如 0
lastRMS = 0.0;
// 初始化 rmsHistory 数组,避免历史值为空
for (int i = 0; i < RMS_HISTORY_SIZE; i++) {
rmsHistory[i] = 0.0; // 可以初始化为零或其他合理值
}
}
void loop() {
// 每次读取到音频数据后计算 RMS 值
if (samplesRead > 0) {
if(samplesRead>512)
samplesRead = 512;
rmsValue = calculateRMS(sampleBuffer, samplesRead);
// 更新 RMS 历史值(用于滑动平均)
rmsHistory[rmsIndex] = rmsValue;
rmsIndex = (rmsIndex + 1) % RMS_HISTORY_SIZE; // 更新索引,循环使用历史值
// 获取平滑后的 RMS 值
float smoothedRMS = smoothRMS();
// 使用 EMA 对 RMS 值进行平滑
float smoothedRMSWithEMA = smoothRMSWithEMA(rmsValue);
// 打印平滑后的 RMS 值
Serial.print("Smoothed RMS Value (MA): ");
Serial.println(smoothedRMS);
Serial.print("Smoothed RMS Value (EMA): ");
Serial.println(smoothedRMSWithEMA);
// 根据平滑后的 RMS 值更新 RGB LED 颜色和亮度
updateRGBLED(smoothedRMSWithEMA);
// 清空数据
samplesRead = 0;
}
delay(100); // 每100毫秒读取一次
}
// 回调函数,处理 PDM 数据
void onPDMdata() {
int bytesAvailable = PDM.available();
PDM.read(sampleBuffer, bytesAvailable);
samplesRead = bytesAvailable / 2; // 每个样本占2字节
}
// 计算 RMS(均方根值)
float calculateRMS(short *buffer, int numSamples) {
long sum = 0;
for (int i = 0; i < numSamples; i++) {
sum += buffer[i] * buffer[i]; // 平方每个样本的值
}
// 计算 RMS 并返回
return sqrt(sum / (float)numSamples);
}
// 定义最大EMA 值
#define MAX_EMA 4000.0 // 你可以根据实际需求调整这个值
// 平滑 RMS 值(使用滑动平均)
float smoothRMS() {
float sum = 0;
for (int i = 0; i < RMS_HISTORY_SIZE; i++) {
sum += rmsHistory[i]; // 累加所有 RMS 历史值
}
if (RMS_HISTORY_SIZE > 0) {
// 限制最大值
int lastEMA = sum / RMS_HISTORY_SIZE;
lastEMA = min(MAX_EMA, lastEMA);
return lastEMA; // 返回平均值
} else {
return 0.0; // 防止除以零
}
}
// 定义最大 RMS 值
#define MAX_RMS 2000.0 // 你可以根据实际需求调整这个值
// 使用指数加权移动平均(EMA)平滑 RMS 值
float smoothRMSWithEMA(float currentRMS) {
// 计算加权平均(EMA)
lastRMS = alpha * currentRMS + (1 - alpha) * lastRMS;
// 限制最大值
lastRMS = min(lastRMS, MAX_RMS);
return lastRMS;
}
// 根据 RMS 值更新 RGB LED 的颜色和亮度
void updateRGBLED(float rms) {
// 映射 RMS 值到颜色和亮度
int brightness = map(rms, 0, 3000, 0, 255); // 映射到 0-255 的亮度范围
// 设置 RGB LED 的颜色和亮度
int red = map(rms, 0, 3000, 0, 255); // 声音强度较强时显示红色
int green = map(rms, 0, 3000, 255, 0); // 声音强度较弱时显示绿色
// int blue = 1; // 只使用红色和绿色通道
// 更新 RGB LED 的亮度
analogWrite(redPin, red);
analogWrite(greenPin, green);
// analogWrite(bluePin, blue);
}
基本实现功能,但有bug当声音突然很大时,滤波输出的数值会溢出,修改的话应该是加一些限制。
选做任务二(非必做):通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印
查找了相关的,找到一个类似的,做到最后一步,arduino编译一次要四五分钟很崩溃,platformIO也出问题打不开了,崩溃~~~,这套流程真的不适合工作开发不稳定。
后面看看其他方式的实现,看到B站大佬的魔杖是stm32实现的,后面看看在这个这个板子上跑一下
三:对本活动的心得体会
Arduino® Nano RP2040 Connect开发板搭载的传感器很全面体积还很小,适合用在集成度高的产品中,有很大的应用场景。但在开发复杂的项目中使用arduino IDE进行开发真的不稳定,只适合学习,后面我尝试其他的开发环境,本次学习我也收获了RP2040的烧录方式,和使用网络模块间接控制LED灯的骚操作。
链接:
RP2040 + Arduino + TinyML 进行手势动作识别 - 知乎
GitHub - lyg09270/Cyberry_Potter_Electromagic_Wand: This is a magic wand which can record and transmit infrated & 433Mhz RF signal. It is controlled by draw different shapes in air (like real wizards).
-
加入了学习《得捷电子专区》,观看 Arduino Nano RP2040 Connect 坐姿检测应用
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 响指控制板载 LED 开或关
- 2024-12-25
-
加入了学习《【Follow me第二季第4期】ARDUINO NANO RP2040 CONNECT》,观看 利用IMU实现鼠标控制-ARDUINO NANO RP2040 CONNECT
-
加入了学习《【Follow me第二季第4期】ARDUINO NANO RP2040 CONNECT》,观看 Arduino NANO RP2040演示合集
- 2024-12-07
-
加入了学习《直播回放: DigiKey FollowMe 第二季 第4期 Arduino Nano RP2040 Connect 任务讲解》,观看 Arduino Nano RP2040 Connect 任务讲解
-
加入了学习《【Follow me第二季第4期】任务汇报》,观看 【Follow me第二季第4期】任务汇报
- 2024-10-08
-
回复了主题帖:
Follow me第二季第2期】所有任务提交
秦天qintian0303 发表于 2024-10-2 11:47
无法安装开发板解决方案:挂梯子(安装库时候很好用),感觉还好,中国受众还是挺多的,也没有禁止
是的
- 2024-10-01
-
发表了主题帖:
Follow me第二季第2期】所有任务提交
本帖最后由 阳光明媚的雨天 于 2024-10-1 00:57 编辑
一、开箱硬件介绍
[localvideo]83a21f3dbf224bbb5b44f55d60dd48db[/localvideo]
硬件选择了Arduino UNO R4 WiFi开发板和SHT40温湿度传感器扩展板还有一根Qwiic缆线硬件选择了Arduino UNO R4 WiFi开发板和SHT40温湿度传感器扩展板还有一根Qwiic缆线硬件选择了Arduino UNO R4 WiFi开发板和SHT40温湿度传感器扩展板还有一根Qwiic缆线
二、入门任务
1.搭建环境
进入官网下(Software | Arduino)载对应自己电脑的版本安装即可进入官网下(Software | Arduino)载对应自己电脑的版本安装即可
可能遇到问题,无法安装开发板
解决方案:
挂梯子(安装库时候很好用)
打开梯子,在首选项中,点击网络 手动配置代理 主机号:localhost 端口号:7890(梯子的设置的端口)
2.换网络,使用手机流量进行下载,手机使用USB共享网络(亲测好用)
3.手动下载安装包,然后放到arduino的文件目录下(ESP32等型号单片机常用)
三. Blink / 串口打印
在例程bink基础上增加一下 串口初始化和串口输出即可。
[localvideo]380fb19501b61dd38da664c3e327c594[/localvideo]
四、基础任务
1.驱动12x8点阵LED
之前不经常使用arduino,在没有拿到板子时看到LED矩阵想到显示图案是不是要写一个上位机,结果回来发现官方已经封装好了,真的太好,就这一点我就觉得arduino NB!
1.1显示图案
使用如下两个示例
Using the Arduino UNO R4 WiFi LED Matrix | Arduino Documentation
如何使用的网址。
LivePreview例程下载后,使用网页进行绘制时,板子Led会实时显示绘制团,然后把绘制的团点击下载,替换 Matrix Frame Buffer工程中的.h文件即可。
[localvideo]5f0b851c3af7018c0981209249238d8d[/localvideo]
1.2显示文字
下载例程LED——Matri —> TexWithArduinoGraphics ,即可显示文字(需要安装ArduinoGraphics库)
[localvideo]5f0b851c3af7018c0981209249238d8d[/localvideo]
2. 用DAC生成正弦波;用OPAMP放大DAC信号
参考大佬视频中的讲解,直接几行代码即可实现正弦波的生成,很方便(方便程度甩STC、STM32几条街)。
OPAMP放大输出,参考官方文档。内部为一个运放,顺便复习了一下运放的知识。根据下边的公式与官方的图连接即可。如果电阻选择相同,Vout=2*Vin
参考:
Arduino UNO R4 Wi-Fi 及任务讲解-FollowMe 第二季:2 - Arduino UNO R4 Wi-Fi 及任务讲解-EEWORLD大学堂
docs.arduino.cc/tutorials/uno-r4-wifi/opamp
电子小白学不会运放?一开始掌握这两个用法就够了!_哔哩哔哩_bilibili
3. 用ADC采集并且打印数据到串口等其他接口可上传到上位机显示
在上面的基础上只需要配置一下ADC的采集,并连接对应的引脚到输出后,把数据通过串口打印出来即可。
五、扩展任务:通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
Ha平台使用的是玩客云改装的(淘宝50左右会直接装好CasaOS和Home Assistant)然后安装hacs,但是无法安装MQTT服务器,只能放弃,采用在电脑上安装。
参考:如何在HA中通过Mosquitto安装MQTT服务器_哔哩哔哩_bilibili
安装docker,
CPU没有开启虚拟化,进入bios开启虚拟化即可
配置后,HA连入MQTT,接下来开发板接入即可,代码如下
参考:
【Follow me第二季第2期】任务三,Home Assistant +EMQX+Arduino mqtt - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【Follow me第二季第2期】Arduino Uno R4 WiFi 通过MQTT连入Home Assistant(容器版) - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
【Follow me第二季第2期】 进阶任务 智能家居3 MQTT接入HA(homeassistant) - DigiKey得捷技术专区 - 电子工程世界-论坛 (eeworld.com.cn)
六、心得体会
第一次参加这个活动,让我体会到arduino的方便,开发速度快。还让我学到了HA的搭建,让我了解到了其他的朋友的一些思路和代码,让我学到了很多。很感谢大佬的讲解!
代码
-
加入了学习《【Follow me 第二季第2期任务】 各个任务实现的展示效果》,观看 【Follow me 第二季第2期任务】MQTT接入到HomeAssistant
- 2024-09-30
-
加入了学习《【Follow me第二季第1期】全部任务演示》,观看 全部任务演示2.0
-
加入了学习《【Follow me 第二季第2期任务】 各个任务实现的展示效果》,观看 【Follow me 第二季第2期任务】通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
- 2024-09-29
-
加入了学习《FollowMe 第二季:2 - Arduino UNO R4 Wi-Fi 及任务讲解》,观看 Arduino UNO R4 Wi-Fi 及任务讲解
- 2024-09-24
-
加入了学习《FollowMe 第二季: 1 Adafruit Circuit Playground Express及任务讲解》,观看 Adafruit Circuit Playground Express 及任务讲解
-
加入了学习《【Follow me第二季第2期】+开发板硬件介绍和实现任务一 LED灯闪烁和串口打印》,观看 【Follow me第二季第2期】+开发板硬件介绍和实现任务一 LED灯闪烁和串口打印
- 2024-09-13
-
回复了主题帖:
每个电子工程师都应该有一本的免费引脚电子书(The Pinouts Book)
感謝分享。
- 2024-08-31
-
加入了学习《Follow me第二季第1期》,观看 创意任务三:触摸钢琴
-
加入了学习《Follow me第二季第1期》,观看 创意任务二:章鱼哥
- 2024-08-14
-
加入了学习《Follow me第二季第1期》,观看 Follow me第二季第1期