阳光明媚的雨天

  • 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期

最近访客

< 1/1 >

统计信息

已有1人来访过

  • 芯积分:51
  • 好友:--
  • 主题:2
  • 回复:3

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言