- 2025-01-10
-
加入了学习《"感知万物,乐享生活"创意大赛》,观看 “感知万物,乐享生活”AI赋能的智能家居系统
-
加入了学习《led立方体》,观看 led立方体
-
加入了学习《ESP32-S3-LVGL》,观看 自行车智能灯
- 2024-12-30
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 串口工具初尝试
-
回复了主题帖:
【Follow me第二季第4期】串口工具初尝试
秦天qintian0303 发表于 2024-12-29 19:00
因为arduinoIDE 只能显示50个数据,要是能存错多点也会看着比较不错的
原来如此,感谢大佬解答疑惑😁
- 2024-12-29
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 响指控制板载 LED 开或关
-
发表了主题帖:
【Follow me第二季第4期】任务汇总
本帖最后由 garoa 于 2024-12-29 21:00 编辑
活动心得
2024年尾,我有幸参与了 DigiKey 联合 EEWorld 举办的《Follow me》开发板体验活动,并获得了一块 Arduino® Nano RP2040 Connect 开发板。这次活动对我而言不仅是一场实践之旅,更是一段成长历程。
作为硬件开发的小白,虽然此前自学过 Python 并尝试过树莓派,但在硬件开发方面的经验几乎为零。
在我迷茫和手足无措时,我开始了对 ABX00053-datasheet 的翻译。这次翻译不仅让我熟悉了开发板的技术文档,也让我对任务完成有了初步的信心。之后,参考 Arduino 官网的案例资料,一点点探索开发板的使用方法,最终成功实现了 Arduino 开发板的第一次“点灯”。这是一个小小的里程碑,却让我对硬件开发有了更多的信心和热情。
与此同时,我也感谢 EEWorld 论坛中大佬们提交的任务帖,让我在困惑时找到了解决问题的思路。在完成点灯项目后,我开始学习如何更好地呈现任务成果——从最初简单的视频录制,到加入片头、背景音乐、片尾的逐步完善,每一步都让我感受到了创作的乐趣与成就感。
这次活动让我在忙碌的工作之余体验到了学习与成长的快乐。虽然由于年底时间紧张,任务的完成度未达到自己理想中的状态,但整个过程让我学会了更多,收获了信心,也为2024年画上了一个圆满的句号。
最后,衷心感谢 DigiKey 和 EEWorld 举办的这次活动。希望这段经历能够成为我硬件开发学习之路上最重要的起点之一。
任务合集
因为之前任务已经分步提交了,这里就不再赘述。下面是每个任务的链接,点击后可查看帖子详情。
注:源代码在上传的代码合集《FollowMe S2E4_Code》中,表格中有每个任务相对应的代码名称。
序号
项目
文章链接
对应代码名称
1
任务一
Arduino Cloud Editor 环境搭建
——
RGB Blink
TASK1_RGB_BLink
串口打印
TASK1_SerialPrint
2
任务二
IMU 原始数据打印
TASK2_IMU
3
任务三
PDM 数据打印及音频波形
TASK3_PDM
4
选做一
通过响指开/关板载 LED
OPT1_SnapFingerLED
5
分享一
中文版 Datasheet
——
6
分享二
Arduino Cloud Editor 中 Thing 和 Device 的异同
——
7
分享三
串口工具初尝试
——
代码合集
任务源码链接:FollowMe S2E4_Code
注:源代码刚上传,还在审核中,可能暂时无法查看(因 29 号是周天,现在又是晚上 8 点多,不大好意思微信麻烦工作人员加急审核)。
视频合集
视频都已上传 EEWorld 大学堂,视频地址:Follow me第二季第4期任务视频汇总
流程图
任务一、二、三中忘记放流程图了,这里进行补充。
其他
Arduino® Nano RP2040 Connect 中文版 datasheet
-
上传了资料:
FollowMe S2E4_Code
-
回复了主题帖:
【Follow me第二季第4期】串口工具初尝试
秦天qintian0303 发表于 2024-12-29 12:43
这次活动确实得找个好一点得串口工具
感谢大佬回复😁。缘由是自己在做任务时,有点好奇为啥我的音频波形图和大家的都不一样,所以探索了一下,但是时间比较紧,没有太深入
-
发表了主题帖:
【Follow me第二季第4期】通过响指开/关板载 LED
功能介绍
利用麦克风传感器,实现打响指来控制板载 LED 绿灯的开或关。
此任务参考了 Arduino 官方教程示例 Reading Microphone Data on Nano RP2040 Connect。
流程图
演示视频
示例代码
#include <WiFiNINA.h>
#include <PDM.h>
// 声道数量(单通道)
static const char channels = 1;
// PDM 数据的采样率(单位:Hz)
static const int frequency = 20000;
// 用于存储音频样本的缓冲区,每个样本是 16 位
short sampleBuffer[512];
// 读取到的音频样本数量,使用 volatile 修饰以确保线程安全
volatile int samplesRead;
// 用于控制 LED 开关状态的布尔变量
bool LED_SWITCH = false;
// 样本值的阈值(绝对值大于该值时切换 LED 状态)
const int THRESHOLD = 10000;
void setup() {
// 初始化串口,用于调试和打印信息
Serial.begin(9600);
// 设置 LED 引脚为输出模式
pinMode(LEDG, OUTPUT);
// 等待串口连接(仅用于调试模式)
while (!Serial);
// 配置 PDM 麦克风的数据接收回调函数
PDM.onReceive(onPDMdata);
// 初始化 PDM 麦克风
if (!PDM.begin(channels, frequency)) {
Serial.println("PDM 初始化失败!");
while (1); // 如果初始化失败,则进入死循环
}
}
void loop() {
// 检查是否有新的音频样本
if (samplesRead) {
// 遍历读取到的样本数据
for (int i = 0; i < samplesRead; i++) {
// 打印当前样本值到串口监视器(用于调试)
Serial.println(sampleBuffer[i]);
// 如果样本值超过阈值(绝对值大于 THRESHOLD),切换 LED 状态
if (abs(sampleBuffer[i]) > THRESHOLD) {
LED_SWITCH = !LED_SWITCH; // 切换 LED 状态
if (LED_SWITCH) {
digitalWrite(LEDG, HIGH); // 打开绿灯
Serial.println("绿灯已开启!");
} else {
digitalWrite(LEDG, LOW); // 关闭绿灯
Serial.println("绿灯已关闭!");
}
delay(1000); // 延迟 1 秒,避免过于频繁的切换
}
}
// 清除样本读取计数
samplesRead = 0;
}
}
/**
* 回调函数,用于处理 PDM 麦克风采集的数据。
*/
void onPDMdata() {
// 查询缓冲区中可用字节数
int bytesAvailable = PDM.available();
// 从缓冲区读取音频数据到样本缓冲区
PDM.read(sampleBuffer, bytesAvailable);
// 每个样本为 16 位(2 字节),计算样本数量
samplesRead = bytesAvailable / 2;
}
- 2024-12-28
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 RGB Blink
- 2024-12-27
-
发表了主题帖:
【Follow me第二季第4期】串口工具初尝试
本帖最后由 garoa 于 2024-12-27 21:27 编辑
引言
作为一名硬件开发的小白,进入这个领域后常常感到无从下手。最近在使用开发板时,接触到了串口绘图工具。这些工具可以将从串口接收到的数据通过图形的方式直观地展示出来,对调试和分析非常有帮助。
出于好奇,我尝试了五款串口绘图工具,包括:Serial Plot、Better Serial Plotter、Serial Studio、纸飞机调试助手和VOFA+。以下内容完全基于“小白”的视角分享我的使用感受,欢迎和我一样的初学者参考,也希望懂行的大佬们可以多多指正和推荐其他好用的工具!
工具概述
下面是对五款工具的初步总结:
串口工具对比
序号
软件名称
GitHub
官网
易用性
UI外观
是否收费
1
Serial Plot
SP
hackaday.io
高
简洁
免费
2
Better Serial Plotter
BSP
——
高
简洁
免费
3
Serial Studio
SS
serial-studio
高
优雅
免费
4
纸飞机调试助手
——
comassistant
中
简洁
收费(可试用1个月)
5
VOFA+
VOFA+
vofa.plus
—
类mac风
收费(未使用)
工具使用体验详解
1. Serial Plot
特点:
界面简单直观,小白上手无压力。
支持实时绘图,可以自定义曲线颜色和样式,适合快速分析数据变化趋势。
完全免费,无需复杂设置即可开始使用。
使用体验:
作为我的第一款串口绘图工具,Serial Plot给我的印象非常好。从安装到运行,整个过程都非常顺畅。对于初学者来说,它的直观性和易用性让我迅速上手,适合需要快速调试和简单可视化的场景
2. Better Serial Plotter
特点:
支持多通道绘图,可以同时绘制多条曲线,满足复杂场景需求。
同样免费,界面延续了简洁的风格。
使用体验:
BetterSerialPlotter给人的感觉是功能更强大了一些,特别是在多通道数据展示方面,比Serial Plot更适合稍复杂的项目。然而,作为小白的我,初次接触时稍显吃力,花了一些时间熟悉设置。
3. Serial Studio
特点:
界面非常精致优雅,甚至有点“高大上”的感觉。
功能强大,不仅支持绘图,还可以展示文本、仪表盘等多种形式的数据可视化。
使用体验:
Serial Studio让我眼前一亮,尤其是它的UI设计,看起来就很专业。而且它支持多种数据展示方式,可以同时绘图、显示数值和控制开关,几乎可以成为一个小型调试站。然而,对于完全小白来说,初期可能需要耐心研究一下它的文档和功能。
4. 纸飞机调试助手
特点:
主打调试功能,绘图只是其中一部分。
界面简洁,但操作对我来说稍复杂(官网有视频教程)。
收费软件,不过提供一个月的试用期。
使用体验:
纸飞机调试助手更像是一个“综合性调试工具”,适合多种调试场景。作为小白的我,花了一些时间但没有弄明白怎么搞出来音频的波形图,有点小挫败。如果有用过的大佬,请指点一下哈。
5. VOFA+
特点:
支持工业级数据可视化,界面简洁但功能丰富。
收费软件,我暂时没有深入使用,但它在网上口碑不错。
使用体验:
因为VOFA+是收费软件,我只通过官网描述了解了一些基础功能,并没有实际的进行使用。从界面上看,它非常专业,尤其适合需要高频数据采集和复杂可视化需求的场景。
演示视频
结语
这五款工具各有特色,适合不同需求的用户。作为小白,我在体验的过程中最大的感受是:“适合自己的才是最好的。”工具没有绝对的好坏之分,用着顺手,能解决问题就是最棒的。
也希望这篇文章能对其他初学者有所帮助。如果你有更好的工具推荐,或者发现文中有需要改进的地方,请不要吝啬你的建议!感谢各位大佬的指导和支持。
- 2024-12-23
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 PDM 数据打印及音频波形
- 2024-12-21
-
发表了主题帖:
【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!");
}