【Follow me第二季第4期】一步一步学习Arduino Nano RP2040 Connect
[复制链接]
一、前情介绍
本次活动是DigiKey联合EEWorld发起的Follow me活动的第二季的第四期,本次活动的主角是Arduino® Nano RP2040 Connect搭载功能丰富的Raspberry Pi RP2040微控制器,将其融入到Nano尺寸封装中。充分利用双核32位Arm® Cortex®-M0+处理器,通过U-blox® Nina W102模块实现蓝牙和WiFi连接,集速度计、陀螺仪、RGB LED和麦克风于一体,是物联网应用的不错选择。
二、任务分析
本次必须使用的板卡是Arduino® Nano RP2040 Connect开发板,任务如下:
必做任务一:搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!;
必做任务二:学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据;
必做任务三:学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。
选做任务一(非必做):通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小;
选做任务二(非必做):通过IMU数据结合机器学习算法,识别运动状态,并通过串口打印。
通过自身的情况结合任务的难易程度,本次活动选择必做任务三项,接下来我们进行一下整体的任务分析:
任务一是搭建环境和并控制三色LED和和串口打印,这一部分设计到的硬件是板载的RGB和串口接口,任务二是IMU传感器的调试和串口,任务三是PDM麦克风和串口,综合上面的硬件需求都可以通过一块开发板来实现,具体任务的详细分析在下面具体实现时候进行介绍。
三、硬件连接
本次采购的商品除了一个Arduino® Nano RP2040 Connect还有一个扩展板的底座,这个开发板还是太小了,本开发板使用的是个MicroUSB,这个有点跟不上形势了。
四、任务实现
1、任务一:搭建环境并Blink三色LED / 串口打印
环境搭建:
Arduino的官方推荐开发环境是Arduino IDE,推荐下载最新版本,注意可以下载免安装版本,也可以用网页边进行调试,我这里选择的是免安装版本:
注意版本支持!
硬件情况:
咱们先看一下板载的LED情况:
这个是本次任务控制的三色LED,通过查找发现这个LED的控制引脚连接到的是W102模块上,也就是说不是直接通过RP2040进行控制,不过Arduino内的封装控制还是一样的,我们需要额外调用一个 <WiFiNINA.h>的库文件。
串口情况:
串口打印使用的是USB的虚拟串口,这个在我们连接设备上电的时候就能看到开发板的USB串行设备。
任务目标:
本次实现的任务目标是控制三色LED的blink,如果三个灯同步的话实际上就是一个白灯(RGB混合)的亮灭,这里我们将初始状态改为蓝色,让红绿同步,同时通过串口循环打印Hello DigiKey & EEWorld!
软件实现:
首先我们要添加一下板卡支持:
然后就可以开始我们软件编写了,整体的软件流程如下:
具体测试代码如下:
#include <WiFiNINA.h>
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("Hello DigiKey & EEWorld!");
pinMode(LEDB,OUTPUT);
pinMode(LEDR,OUTPUT);
pinMode(LEDG,OUTPUT);
digitalWrite(LEDB,LOW);
digitalWrite(LEDR,LOW);
digitalWrite(LEDG,LOW);
}
void loop() {
digitalWrite(LEDB, HIGH);
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, LOW);
delay(1000);
digitalWrite(LEDB, LOW);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
delay(1000);
Serial.println("Hello DigiKey & EEWorld!");
}
效果展现:
心得体会:
在初次使用基于RP2040的arduino时,可以感受到其与其他版本的部分差异,就是调试部分,我们下载到开发办的程序并没有直接运行,通过打开串口监视器后才正式运行,目前还不清楚具体原理,不过不影响我们的使用,在下载过程中可以看到像开发板的盘符写文件的操作,这个和我们调试RP2040单片机的效果也很相似的,只不过IDE帮助咱们完成了。初步体验了这款开发板的控制过程,也就是以此开始本次的学习之旅。
2、任务二:调试IMU传感器,通过串口打印六轴原始数据
硬件情况:
IMU,即惯性测量单元(Inertial Measurement Unit),是一种用于测量和报告物体的三个基本线性运动(加速度)和三个基本角运动(角速度)的电子设备,本开发板板载的IMU传感器如下:
这里使用的是ST的 LSM6DSOXTR 6轴惯性测量单元(IMU),IMU 原理是采用惯性定律实现的。本传感器包括一组加速度计和陀螺仪,他们是惯性系统的核心部件,是影响惯性系统性能的主要因素。
任务目标:
本任务主要学习IMU传感器相关知识,并通过arduino的便捷性快速调试IMU传感器,通过串口打印六轴原始数据
软件实现:
需要安装新的库支持:
IMU传感器的应用其实arduino中有详细的例程代码,我们主要学习一下具体的事项方法,软件流程如下:
具体的测试代码:
#include <Arduino_LSM6DSOX.h>
float Ax, Ay, Az;
float Gx, Gy, Gz;
void setup() {
Serial.begin(115200);
while(!Serial);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
Serial.print("Accelerometer sample rate = ");
Serial.print(IMU.accelerationSampleRate());
Serial.println("Hz");
Serial.println();
Serial.print("Gyroscope sample rate = ");
Serial.print(IMU.gyroscopeSampleRate());
Serial.println("Hz");
Serial.println();
}
void loop() {
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(Ax, Ay, Az);
Serial.print(' ');
Serial.print(Ax);
Serial.print(' ');
Serial.print(Ay);
Serial.print(' ');
Serial.println(Az);
}
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(Gx, Gy, Gz);
Serial.print(' ');
Serial.print(Gx);
Serial.print(' ');
Serial.print(Gy);
Serial.print(' ');
Serial.println(Gz);
}
delay(100);
}
效果展现:
串口打印效果:
心得体会:
6轴IMU中包含了两个3轴传感器,由于IDE的绘图功能最多显示三个数据,我们在进行效果测试的时候需要将两个三轴的数据分别进行效果展示,而且对于姿态的解锁这一部分是不太栋的,只能将动作和数据进行简单的关联,效果还是很明显的。
3、任务三:调试PDM麦克风,通过串口打印收音数据和音频波形,对声音的音量进行一下处理
硬件情况:
Arduino Nano RP2040 Connect 板载了 MP34DT06 PDM 数字麦克风,它是一种基于脉冲密度调制(PDM)的麦克风。通过采样 PDM 信号可以获取音频数据,适用于语音识别、音频采集等场景。PDM(Pulse Density Modulation)是一种以高频率表示声音强度的调制方式,相比于传统的模拟麦克风,PDM 麦克风输出的是数字信号,适合直接处理数字音频。
原理图如下:
任务目标:
本次的任务目标主要是看一下PDM麦克风采集到的声音波形,并通过数学方法岁音量进行一下转化,在这里我们将任务四融合的到了任务三中,毕竟都是对声音数据的处理。
软件实现:
本次一共实现两个数据的波形展示,整体的软件流程如下:
具体测试代码如下:
#include <WiFiNINA.h>
#include <PDM.h>
bool LED_SWITCH = false;
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 20000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
void onPDMdata() {
// Query the number of available bytes
int bytesAvailable = PDM.available();
// Read into the sample buffer
PDM.read(sampleBuffer, bytesAvailable);
// 16-bit, 2 bytes per sample
samplesRead = bytesAvailable / 2;
}
int16_t getMaxAmplitude(short *buffer, int length) {
int16_t maxAmplitude = 0;
for (int i = 0; i < length; i++) {
int16_t amplitude = abs(buffer[i]);
if (amplitude > maxAmplitude) {
maxAmplitude = amplitude;
}
}
return maxAmplitude; // 返回最大振幅
}
void setup() {
Serial.begin(115200);
while (!Serial);
pinMode(LEDR, OUTPUT); // 设置红色 LED 引脚为输出
pinMode(LEDG, OUTPUT); // 设置绿色 LED 引脚为输出
digitalWrite(LEDG,LOW);
digitalWrite(LEDR,LOW);
// Configure the data receive callback
PDM.onReceive(onPDMdata);
if (!PDM.begin(channels, frequency)) {
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop() {
int16_t maxAmplitude = 0;
// Wait for samples to be read
if (samplesRead) {
// Print samples to the serial monitor or plotter
for (int i = 0; i < samplesRead; i++) {
maxAmplitude = getMaxAmplitude(sampleBuffer, samplesRead);
Serial.print(sampleBuffer[i]);
// Clear the read count
Serial.print(' ');
Serial.println(maxAmplitude);
if(maxAmplitude > 1000)
{
digitalWrite(LEDG,LOW);
digitalWrite(LEDR,HIGH);
}
else
{
digitalWrite(LEDG,HIGH);
digitalWrite(LEDR,LOW);
}
samplesRead = 0;
}
}
}
效果展现:
这里是单声音数据的采集效果展示,IDE自带的显示的不明显。
这是两个数据效果(原始数据+峰值):
心得体会:
可以看到声音波形的效果图,实际上是个类似交流信号的波形,其幅值实际上可以反应音量的大小,原始数据我们用第三方串口工具进行的查看,是在是IDE显示的数据数据量调小的,不过通过两天数据的对比还是效果比较好的。
五、代码合集
六、视频讲解
|