【Follow me第二季第4期】汇总提交帖:全部任务
[复制链接]
本帖最后由 lb8820265 于 2024-12-29 15:33 编辑
项目演示视频
物料展示
整个学习的过程只需要一个Arduino RP2040 开发板即可,开发板上自带有许多的传感器。
前期准备工作
Arduino® Nano RP2040 Connect这个开发板是Arduino公司生产的产品,用的是树莓派Pico中的RP2040,树莓派有针对该芯片有专门的专门的SDK,是用C语言写的,我之前有学习过,但这次Arduino公司有对其进行封装,让其上手变得特别简单,使用Arduino IDE可以非常简单的完成一些简单的任务,完全不需要关注底层的驱动和相关的配置。但是也有许多不便的地方,比如定时器需要另外的安装库,PIO的功能甚至连库也没找到,而且许多的库也没法看到源码。最后还是决定用Arduino IDE来完成本次的任务。
先在Arduino官网上将IDE软件下载下来然后安装,使用USB线连接好电脑与开发板,正常情况会默认识别出硬件与端口号,如下图所示。
而且提示安装对应的库文件,没安装也可以在后期搜索Arduino Mbed OS Nano Boards安装,如下图所示。
任务成果展示
任务一:
搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!;
三色LED灯的原理是通过三个引脚来控制的,引脚拉低,对应颜色的灯就发光。
但是,三个引脚是从Wifi芯片上引出的,这点和官方树莓派Pico的做法一样。
因此,需要安装WiFi芯片的库文件,在库文件搜索处,搜索WifiNINA,然后安装,如下图所示。
程序全部源码如下:
#include "WiFiNINA.h"
void setup() {
Serial.begin(9600);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {
Serial.println("Hello DigiKey & EEWorld!");
// Red
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
delay(500);
// Green
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, HIGH);
delay(500);
// Blue
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, LOW);
delay(500);
}
代码是然后LED三色闪烁,同时串口发送"Hello DigiKey & EEWorld!"。
可以先点击IDE的“√”按钮,看看语法有没有错误,然后点击“->”按钮进行程序烧录。
看到提示”Done uploading”就说明烧录成功了,如下图。
串口可以使用IDE软件自带的串口工具,在Tools->Serial Monitor中,设置好波特率后,就可以看到打印的字符。
任务二:
学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据;
板子上有ST公司的陀螺仪加速度计芯片,叫做LSM6DSOX,Arduino IDE有IMU的库函数,但是需要额外安装,在库中搜索安装如下。
可以去Arduino官网中查看该库的详细介绍:Arduino_LSM6DSOX | Arduino Documentation,这个库函数写的非常的简单,而且限制了数据的跟新频率为104Hz,详细的源码可以去官方Github库中查看: 。
程序全部源码如下:
#include <Arduino_LSM6DSOX.h>
float Ax, Ay, Az;
float Gx, Gy, Gz;
float data[6];
char tail[] = {0x00, 0x00, 0x80, 0x7f};
void setup() {
Serial.begin(115200);
while(!Serial);
if (!IMU.begin()) {
Serial.println("Failed to initialize IMU!");
while (1);
}
}
void loop() {
if (IMU.accelerationAvailable()) {
IMU.readAcceleration(Ax, Ay, Az);
data[0]=Ax;
data[1]=Ay;
data[2]=Az;
}
if (IMU.gyroscopeAvailable()) {
IMU.readGyroscope(Gx, Gy, Gz);
data[3]=Gx;
data[4]=Gy;
data[5]=Gz;
}
Serial.write((char *)data, sizeof(float) * 6);
Serial.write(tail, 4);
}
程序是在loop中不断的查询数据是否准备好,然后获取数据并发送出来。烧录程序后数据的展示使用的是一个叫做VOFA+的软件,这是一个免费的数据波形展示软件,设定两个波形显示控件,左边是加速度计的值,右边是陀螺仪的值,配置好数据引擎为JustFloat,配置好串口参数,打开DTR,如下图所示。
然后转动开发板,显示的结果如下图所示。
任务三:
学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形。
该任务在库例程中有一个直接可用的例程,在File->Examples->PDM,这个例子可以直接烧录运行,然后在IDE自带的数据显示工具中显示波形数据,但是波形显示的数据量太少,不太直观,这里仍然用VOFA+软件进行波形的展示,稍微修改一下例程中的代码,将波特率改为115200,数据按照通信协议进行发送。
程序全部源码如下:
#include <PDM.h>
float data[2];
char tail[] = {0x00, 0x00, 0x80, 0x7f};
// default number of output channels
static const char channels = 1;
// default PCM output frequency
static const int frequency = 16000;
// Buffer to read samples into, each sample is 16-bits
short sampleBuffer[512];
// Number of audio samples read
volatile int samplesRead;
void setup() {
Serial.begin(115200);
while (!Serial);
// Configure the data receive callback
PDM.onReceive(onPDMdata);
// Optionally set the gain
// Defaults to 20 on the BLE Sense and 24 on the Portenta Vision Shield
// PDM.setGain(30);
// Initialize PDM with:
// - one channel (mono mode)
// - a 16 kHz sample rate for the Arduino Nano 33 BLE Sense
// - a 32 kHz or 64 kHz sample rate for the Arduino Portenta Vision Shield
if (!PDM.begin(channels, frequency)) {
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop() {
// Wait for samples to be read
if (samplesRead) {
for (int i = 0; i < samplesRead; i++) {
data[0] = sampleBuffer[i];
Serial.write((char *)data, sizeof(float) * 1);
Serial.write(tail, 4);
}
samplesRead = 0;
}
}
/**
* Callback function to process the data from the PDM microphone.
* NOTE: This callback is executed as part of an ISR.
* Therefore using `Serial` to print messages inside this function isn't supported.
* */
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;
}
烧录后对着板子说话,就可以在波形上位机中看到变化的声音波形数据了,如下图所示。
项目总结
这次使用Arduino® Nano RP2040 Connect开发板结合Arduino IDE确实体验到了开发的便利性,但是如果想要更好的发挥出这个板子的全部性能,做出有意思的东西,则还需要进行探索,期望后期能用这块板子做更多有意思的东西。
|