- 2024-12-21
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 PDM 数据打印及音频波形
-
发表了主题帖:
【Follow me第二季第4期】PDM 数据打印及音频波形
本帖最后由 garoa 于 2024-12-21 11:58 编辑
PDM 简介
PDM(Pulse Density Modulation:脉冲密度调制)是一种数字信号调制方式,通过调整脉冲的密度来表示模拟信号的幅度。与常见的 PWM(脉宽调制)相比,PDM 的工作原理更加精简,它是通过不同的 “1” 和 “0” 信号密度来表示音频信号的强度。
PDM 的工作原理
在 PDM 中,音频信号被转换为一系列的脉冲,脉冲的数量和频率对应音频信号的强弱。举个例子,如果音频信号的幅度较大,那么 PDM 信号中 “1” 的脉冲会比较频繁;如果音频信号的幅度较小,则 “1” 的脉冲密度较低。
与传统的模拟信号相比,PDM 信号优点
易于数字化处理:PDM 信号本身已经是数字信号,可以直接送入数字处理器进行后续处理。
抗噪能力强:由于信号是通过高频率的脉冲来传输,PDM 对噪声的抗干扰能力较强。
低功耗:通常,PDM 麦克风的功耗较低,适合于便携式设备。
MP34DT06JTR 简介
Arduino Nano RP2040 Connect 板载的麦克风 ST MP34DT06JTR 是一颗单声道麦克风,由意法半导体(STMicroelectronics)生产。详细资料见 ST 官方数据手册 Datasheet - MP34DT06J 。
特点
传感器类型:基于MEMS(微机电系统)技术,拥有高灵敏度和低功耗。
输出格式:提供PDM(脉冲密度调制)信号输出,这种格式适合直接接入微控制器的PDM解码接口。
频率范围:能够捕捉20Hz到20kHz的声音,非常适合用于语音识别、音频采集等场景。
供电电压:支持 1.8V 到 3.6V 的宽电压范围。
方向性:全向(Omnidirectional),意味着它能够均匀捕捉来自各方向的声音。
工作原理
MP34DT06JTR 通过拾取声波振动,生成对应的数字PDM信号。微控制器通过解码PDM信号,转换为音频样本。
在 Arduino 平台上使用 PDM 麦克风
Arduino Nano RP2040 Connect 提供了对 PDM 麦克风的支持,Arduino 官方有专门的 PDM 库,文档参考 PDM Library。
初始化
:PDM初始化
注:channels 为通道数量,1 为单声道,2 为立体声;sampleRate 为采样率。
获取数据:
:获取可读字节数
:接收 PDM 数据
注:buffer 为用于存储 PDM 数据的数组;size 为读取的字节数。
演示视频
示例代码
因为板载的麦克风是一颗单声道麦克风,所以 channels = 1。PDM 采样率为 20000 Hz。
#include <PDM.h>
// 声道数量(仅支持单声道,固定为 1)
static const char channels = 1;
// PDM 数据的采样率(单位:Hz)
static const int frequency = 20000;
// 用于存储音频样本的缓冲区,每个样本是 16 位
short sampleBuffer[512];
// 读取到的音频样本数量,使用 volatile 修饰以确保线程安全
volatile int samplesRead;
void setup() {
// 初始化串口,用于调试和打印信息
Serial.begin(9600);
// 等待串口连接(仅用于调试模式)
while (!Serial);
// 配置 PDM 麦克风的数据接收回调函数
PDM.onReceive(onPDMdata);
// 初始化 PDM 麦克风
if (!PDM.begin(channels, frequency)) {
Serial.println("PDM 初始化失败!");
while (1); // 如果初始化失败,则进入死循环
}
}
void loop() {
// 检查是否有新的音频样本
if (samplesRead > 0) {
// 遍历并打印读取到的样本数据
for (int i = 0; i < samplesRead; i++) {
Serial.println(sampleBuffer[i]); // 打印单声道样本值
}
// 清除样本读取计数
samplesRead = 0;
}
}
/**
* 回调函数,用于处理 PDM 麦克风采集的数据。
* 注意:该函数在中断服务程序(ISR)中执行,必须保持简洁高效。
*/
void onPDMdata() {
// 查询缓冲区中可用字节数
int bytesAvailable = PDM.available();
// 从缓冲区读取音频数据到样本缓冲区
PDM.read(sampleBuffer, bytesAvailable);
// 每个样本为 16 位(2 字节),计算样本数量
samplesRead = bytesAvailable / 2;
}
- 2024-12-20
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 串口打印
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 IMU 原始数据打印
-
加入了学习《直播回放: DigiKey FollowMe 第二季 第4期 Arduino Nano RP2040 Connect 任务讲解》,观看 Arduino Nano RP2040 Connect 任务讲解
- 2024-12-18
-
发表了主题帖:
【Follow me第二季第4期】IMU 原始数据打印
IMU 基础
Arduino® Nano RP2040 Connect 使用的 IMU 传感器为:LSM6DSOXTR。
LSM6DSOXTR 简介
LSM6DSOXTR 是由意法半导体(STMicroelectronics)推出的一款 6轴惯性测量单元(IMU),包含了加速度计和陀螺仪的功能。是一款小型、低功耗的传感器。
加速度计:3轴,测量物体的加速度变化。
陀螺仪:3轴,测量物体的角速度(旋转速度)
LSM6DSOXTR 集成了这两种传感器,因此是一个 6轴 IMU。
LSM6DSOXTR 的主要特点
加速度计范围:±2g、±4g、±8g、±16g(可配置)
陀螺仪范围:±125°/s、±250°/s、±500°/s、±1000°/s、±2000°/s(可配置)
低功耗模式:适用于电池供电设备,具备多个省电模式。
内置FIFO缓存:用于存储加速度和角速度数据,可以减少主机的读取频率。
传感器输出接口:通过 I²C 或 SPI 接口与外部设备(如微控制器)进行通信。
运动检测:支持运动检测、步数计数、自由落体检测、休眠模式等多种功能。
LSM6DSOXTR 的工作原理
加速度计通过内部的微机械传感器测量加速度。当物体加速时,传感器的质量块会在微小的弹簧中发生位移,根据位移的大小可以计算出加速度。
单位:加速度的单位是 g(重力加速度,1g = 9.8 m/s²)。
测量方向:LSM6DSOXTR 的加速度计是三轴的,因此可以测量沿 X、Y、Z 轴的加速度。
作用:可以用来判断物体的倾斜角度、运动方向、加速度大小等。
陀螺仪使用 MEMS 技术(微电子机械系统),通过微型的振荡结构测量物体围绕各轴旋转的速度。
单位:角速度的单位是 °/s(每秒旋转度数)。
测量方向:与加速度计类似,陀螺仪也是三轴的,可以测量绕 X、Y、Z 轴的角速度。
作用:可用于姿态估算,特别是在无外部定位信息的情况下。
读取 IMU 数据
在 Arduino® Nano RP2040 Connect 中,由图1 可知 LSM6DSOXTR 通过 I²C 与 RP2040 进行连接。
图1 Arduino Nano RP2040 Connect 框图
Arduino 官方有一个处理 LSM6DSOXTR 的库:Arduino_LSM6DSOX
初始化
:初始化库
作用:初始化是开发嵌入式程序中不可或缺的一步,其核心是为硬件和软件环境做好准备,确保系统运行的稳定性和正确性。
采样率
:读取加速度采样率(Hz)
:读取陀螺仪采样率(Hz)
作用:采样率决定了数据更新的频率。比如,采样率越高,数据更新越快,反应越灵敏,适用于高速运动的应用;采样率越低,数据更新越慢,适用于低速稳定的应用。
读取数据
:检查 IMU 是否有可用的加速度数据
:读取加速度计,并返回 x、y 和 z 轴的加速度值
:检查 IMU 是否有可用的陀螺仪数据
:读取陀螺仪,并返回 x、y 和 z 轴的角速度值
演示视频
示例代码
#include <Arduino_LSM6DSOX.h>
// 存储加速度和陀螺仪数据
float Ax, Ay, Az;
float Gx, Gy, Gz;
// 时间间隔参数(非阻塞式输出控制)
unsigned long previousMillis = 0;
const long interval = 500; // 每500毫秒输出一次数据
void setup() {
// 初始化串口通信
Serial.begin(9600);
while (!Serial) {
; // 等待串口准备好
}
Serial.println("串口初始化完成,开始读取IMU数据...");
// 初始化IMU传感器
if (!IMU.begin()) {
Serial.println("错误:IMU 初始化失败,请检查硬件连接!");
while (1); // 如果初始化失败,程序停留在这里
}
Serial.println("IMU 初始化成功!");
Serial.println();
}
void loop() {
// 获取当前时间
unsigned long currentMillis = millis();
// 每隔500毫秒读取并输出一次数据
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // 更新上一次的时间
// 读取加速度数据
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(Ax, Ay, Az);
} else {
Serial.println("警告:未能读取到加速度数据!");
}
// 读取陀螺仪数据
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(Gx, Gy, Gz);
} else {
Serial.println("警告:未能读取到陀螺仪数据!");
}
// 串口输出加速度和陀螺仪数据
Serial.print("Accel:Ax=");
Serial.print(Ax, 2); // 保留两位小数
Serial.print(" m/s², Ay=");
Serial.print(Ay, 2);
Serial.print(" m/s², Az=");
Serial.print(Az, 2);
Serial.print(" m/s² | ");
Serial.print("Gyros:Gx=");
Serial.print(Gx, 2); // 保留两位小数
Serial.print(" dps, Gy=");
Serial.print(Gy, 2);
Serial.print(" dps, Gz=");
Serial.print(Gz, 2);
Serial.println(" dps");
// 在不同数据组之间添加空行,便于查看
Serial.println();
}
}
-
回复了主题帖:
【Follow me第二季第4期】串口打印
本帖最后由 garoa 于 2024-12-18 09:38 编辑
Jacktang 发表于 2024-12-18 07:32 视频的配音是AI生成的,还是楼主配音
感谢老哥回复。正如老哥所料,配音是AI生成的,具体的可以参考下“剪映文字朗读使用操作”
- 2024-12-17
-
发表了主题帖:
【Follow me第二季第4期】串口打印
本帖最后由 garoa 于 2024-12-17 14:29 编辑
关于串口
串口(Serial Port)是一种用于设备间串行通信的接口,通过一根数据线和一根地线在设备之间传输数据。与并行通信相比,串口的特点是以按位传输数据,虽然速度较慢,但具有成本低、硬件简单的优点。
特点:
异步通信:无需共享时钟信号。
双向通信:可以发送和接收数据。
常用协议:UART(通用异步收发器)是最常用的串口通信协议之一。
串口作用
设备间通信:串口允许计算机与嵌入式设备(如 Arduino、传感器、机器人)之间进行数据交换。例如,可以从传感器读取数据并通过串口传输给主机。
程序调试:串口是一种非常直观的调试工具。通过输出变量的值或状态信息,可以快速发现代码中的问题。
控制外部设备:通过串口向开发板发送命令,可以远程控制硬件设备。例如,向 Arduino 发送“打开”或“关闭”命令来控制 LED 灯的状态。
操作串口
初始化串口
:设置串口波特率。波特率需要与通信设备一致。
发送数据
:发送数据但不换行。
:发送数据并自动换行。
接收数据
:检查是否有数据可读。
:读取一个字节的数据。
:读取字符串数据。
使用工具
在 Arduino Cloud Editor 中打开串口监视器(Serial Monitor:在网页右上角)或使用第三方串口工具(如 PuTTY)查看数据。
演示视频
示例代码
代码中,先进行串口初始化,初始化成功后输出信息“串口连接成功!初始化完成”。然后每隔 1000 ms 打印“Hello DigiKey & EEWorld!”。
void setup() {
// 初始化串口
Serial.begin(9600);
// 等待串口连接
while (!Serial) {
delay(100);
}
// 串口连接成功后,打印提示信息
Serial.println("串口连接成功!");
Serial.println("初始化完成!");
}
void loop() {
// 打印任务信息
delay(1000);
Serial.println("Hello DigiKey & EEWorld!");
}
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 RGB Blink
-
发表了主题帖:
【Follow me第二季第4期】RGB Blink
本帖最后由 garoa 于 2024-12-17 11:16 编辑
RGB 型号
根据官方文档 ABX00053-schematics.pdf,从图1 可知 RGB LED 的型号为:SMLP34RGB2W3;连接方式为:公共阳极。
图1 SMLP34RGB2W3 在 Arduino Nano RP2040 Connect 中的电路原理图
SMLP34RGB2W3 简介:这款 LED 是一种小型的 RGB LED,通常用于指示灯、显示、状态指示等场景。这款 LED 通常是通过调节不同颜色的亮度来显示不同的颜色。具体来说,SMLP34RGB2W3 是一个三合一的RGB LED 组件,它包含了红色(R)、绿色(G)和蓝色(B)三个颜色的LED,可以根据输入的控制信号调节每个 LED 的亮度,从而混合成不同的颜色。具体元器件特性可以查看官方文档 SMLP34RGB series : LEDs。
RGB LED 在 Arduino® Nano RP2040 Connect 中的工作原理
根据官方文档 ABX00053-datasheet.pdf,从图2 可知 RGB LED 是连接在 Nina W102 Wi-Fi/Bluetooth 模块上的。RP 2040 通过 SPI 与 UART 控制 NINA W102 WiFi/BT,来实现 RGB LED 的点亮/熄灭。 从图3 可知 RGB LED 在数字信号为高时熄灭,在数字信号为低时点亮。
图2 Arduino® Nano RP2040 Connect 框图
U-blox Nina W102 简介:这款模块是一款低功耗的 Wi-Fi 和蓝牙无线通信模块,集成了 Wi-Fi 和蓝牙的功能。支持 802.11b/g/n 标准,并且具备蓝牙4.2(低能耗蓝牙,BLE)功能。Wi-Fi功能主要用于与局域网(LAN)或者互联网连接,而蓝牙功能则常用于短距离的设备对设备通信。具体元器件特性可以查看官方文档(文档链接)。
图3 Wi-Fi®/Bluetooth® 的工作原理
演示视频
闪烁功能演示视频
示例代码
代码中 RGB 灯光闪烁的顺序为红色、绿色、蓝色。灯光亮起维持 500 ms,两种灯光间隔为 500 ms。
#include <WiFiNINA.h>
// 定义闪烁的延时时间(单位:毫秒)
const int delayTime = 500; // 每个颜色闪烁的时间为500ms
void setup() {
// 将三色LED灯的引脚设置为输出模式
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
// 确保LED初始状态为熄灭
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, LOW);
}
void loop() {
// 依次点亮红色、绿色和蓝色LED灯
// 红色LED闪烁
digitalWrite(LEDR, HIGH); // 点亮红色LED
delay(delayTime); // 等待500ms
digitalWrite(LEDR, LOW); // 熄灭红色LED
delay(delayTime); // 等待500ms
// 绿色LED闪烁
digitalWrite(LEDG, HIGH); // 点亮绿色LED
delay(delayTime); // 等待500ms
digitalWrite(LEDG, LOW); // 熄灭绿色LED
delay(delayTime); // 等待500ms
// 蓝色LED闪烁
digitalWrite(LEDB, HIGH); // 点亮蓝色LED
delay(delayTime); // 等待500ms
digitalWrite(LEDB, LOW); // 熄灭蓝色LED
delay(delayTime); // 等待500ms
}
- 2024-12-15
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 Arduino Cloud Editor 环境配置
-
回复了主题帖:
【Follow me第二季第4期】Arduino Cloud Editor 中 Thing 和 Device 的异同
Jacktang 发表于 2024-12-15 09:36
总结的到位,Thing 和Device 就是一虚一实,,,,
感谢老哥的认可
- 2024-12-13
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 Arduino Cloud Agent 安装
-
发表了主题帖:
【Follow me第二季第4期】Arduino Cloud Editor 中 Thing 和 Device 的异同
本帖最后由 garoa 于 2024-12-15 19:40 编辑
在 Arduino Cloud Editor 中,其中有 Thing 和 Device 两个概念。
1-Thing
在 Arduino Cloud 中,Thing 是一个虚拟的容器,用来表示硬件设备的集合和它与云平台之间的交互。一个 Thing 可以包含多个 Device,并且可以配置多个功能(比如传感器、开关、按钮等)。实际上,Thing 是对硬件的抽象,它代表项目或物联网系统。
Thing 是在 Arduino Cloud 中进行编程和配置的单位。
它将硬件设备和传感器的数据传输与 Arduino 云之间的通信进行关联。
Thing 可以在云平台上控制和监视设备,同时还可以连接其他服务,处理来自设备的数据。
2-Device
Device 是具体的硬件设备,是在 Arduino Cloud 中注册的物理设备。每个 Device 都是一个实际的、具体的 Arduino 或兼容的硬件(比如 Arduino Nano RP2040 Connect、Arduino Uno、Arduino MKR1000 等)。Device 是 Thing 的一部分,它们用于执行代码并通过物联网进行通信。
Device 是在云平台中配置和操作的实际硬件设备。
每个 Device 都具有唯一的标识符(ID),并且可以与其他设备、传感器或服务进行交互。
在 Device 上执行的程序(sketch)通常会和 Thing 进行同步,以实现云端的功能和控制。
3-Thing 与 Device 的区别
虚拟 vs 物理:
Thing 是一个虚拟的概念,代表了你物联网项目的核心,通常是指一组设备和它们的管理。
Device 是实际存在的硬件设备,它是在物理世界中工作的设备,执行代码并发送数据。
功能 vs 硬件:
Thing 可以管理多个 Device,并在云端进行数据分析、控制和交互。
Device 是硬件设备本身,它将传感器数据发送到 Thing 并执行来自 Thing 的控制命令。
配置 vs 执行:
Thing 是在 Arduino Cloud 中进行配置、控制和监控的主要对象。
Device 是实际执行任务的对象,它会执行在 Arduino Cloud 中上传的程序(sketch),并与 Thing 进行数据通信。
举例:
假设有一个智能温控系统,可能包含的设置有:
Thing:代表整个智能温控系统,包含多个设备(温度传感器、加热器等)。可以通过 Thing 来查看系统的状态、控制加热器或获取传感器数据。
Device:具体的硬件设备,如 温度传感器 和 加热器,它们是物理设备,负责采集温度数据并响应控制指令。
总结
Thing 是虚拟的表示,它可以包含多个 Device 和它们的配置。
Device 是实际的硬件设备,执行具体的物理操作,发送或接收数据。
-
发表了主题帖:
【Follow me第二季第4期】Arduino Cloud Editor 环境搭建
本帖最后由 garoa 于 2024-12-15 09:14 编辑
在参与“Follow me”活动的过程中,第一个任务中有关于开发环境搭建的内容。经过对不同开发环境的了解和对比,我最终选择了使用 Arduino Cloud Editor 作为我的开发工具。
之所以选择它,是因为在翻译 Arduino® Nano RP2040 Connect 的数据手册时,我发现这款开发板的官方资料中推荐了 Arduino Cloud Editor。这引起了我的兴趣:作为 Arduino 提供的在线开发环境,它不仅可以通过浏览器轻松访问,还支持与云平台的无缝集成。我想通过这次实践,探索这个工具的便捷性和功能性,并感受它是否能为像我这样的“硬件小白”提供更高效的开发体验。
搭建步骤:
注册 Arduino 账号
账号注册网址:create an Arduino account
安装 Cloud Agent
软件下载网址:cloud.arduino.cc/download-agent/
注:Arduino Cloud Agent 是一个安装在电脑上的插件,用于在开发板与 Arduino 云平台之间建立串行通信。通过该插件,我们可以通过网络浏览器上传代码(Sketch),并能够读取和写入开发板的串行数据。
登录 Arduino Cloud
登录网址:cloud.arduino.cc/download-agent/
配置 Arduino® Nano RP2040 Connect
添加设备(根据页面提示进行操作,详细步骤参考视频)
设置WiFi(可选设置,如果不配置 WiFi,电脑可以通过 USB 来访问开发板。如果配置 WiFi,电脑可以通过网络来访问开发板,但需要在代码中进行设置)
-
加入了学习《Follow me 第二季第3期成果视频》,观看 成果展示
- 2024-12-10
-
回复了主题帖:
【Follow me第二季第4期】Arduino® Nano RP2040 Connect 中文版 Datasheet
ly87802541 发表于 2024-12-8 22:27
这个文档很不错鸭
哈哈,感谢老哥认可
- 2024-12-07
-
回复了主题帖:
【Follow me第二季第4期】Arduino® Nano RP2040 Connect 中文版 Datasheet
qwqwqw2088 发表于 2024-12-7 10:16
不知道如何上传图片
上传图片时,可以点开高级模式
好嘞,感谢老哥指点
- 2024-12-06
-
发表了主题帖:
【Follow me第二季第4期】Arduino® Nano RP2040 Connect 中文版 Datasheet
首先,衷心感谢“得捷电子”和“EEWORLD电子工程世界”联合举办的 《Follow me》 活动,正是因为这个活动,我才有机会接触到 Arduino® Nano RP2040 Connect 开发板。
作为一名硬件“小白”,在收到这款开发板后,我的第一反应是:该从哪里开始呢?面对各种技术资料和英文文档,我感到有些迷茫。尤其是去官网查找资料时,看到的全是英文,虽然能理解一些基本术语,但整体还是有些吃力。更糟糕的是,当我使用浏览器插件进行翻译时,翻译结果常常断断续续,而且因为语言上的差异,读起来显得生硬,不符合中文的阅读习惯,这让我倍感困难。
经过一番思考,我决定将这份官方的英文 Datasheet 翻译成中文,既是为了自己更好地理解这款开发板的基本功能和性能,也希望能够帮助和我一样的“硬件小白”们,在遇到类似情况时,能够有一份更加通俗易懂的中文参考资料。
通过这次翻译,我不仅加深了对 Arduino® Nano RP2040 Connect 开发板性能的理解,也学到了如何在官网查找资料,并且对后续如何完成任务有了更清晰的规划。
说明:由于自己第一次在 EEWORLD论坛 中发帖,好多规则还没有熟悉,不知道如何上传 PDF 文档,暂时以照片的形式展现文档(不知最终展现效果如何)。