【Follow me第二季第4期】Arduino Nano Connect 作业提交
[复制链接]
本帖最后由 我的学号 于 2024-12-30 00:07 编辑
一.视频展示
1.1 物料展示
1 |
ARDUINO NANO RP2040 CONNECT |
|
2 |
RASPBERRY PI PICO 2 RP2350 |
|
3 |
64 MBIT FLASH MODULE |
|
4 |
MICROSD MODULE |
|
1.2 视频演示
Total
二.任务实现详情
2.1 入门任务(必做):搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!
2.1.1 物料准备
Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线
设计思路
初始化 RGB 模块和串口模块,在loop 中用状态机切换不同颜色显示;通过串口打印上传 Hello DigiKey & EEWorld!
硬件详解:【Follow me第二季第4期】1.Nano RP2040 Connect 硬件分析
任务详解:【Follow me第二季第4期】2.必做任务之点灯+串口打印
2.1.2 软件流程
2.1.3 代码片段
#include "WiFiNINA.h"
//宏定义数据
#define LED1 LEDR
#define LED2 LEDG
#define LED3 LEDB
//全局变量
byte u8RedColor_i =0;
byte u8GreenColor_i =0;
byte u8BlueColor_i =0;
byte u8Step =1;
// the setup function runs once when you press reset or power the board
void setup()
{
//LED 初始化
pinMode(LED_BUILTIN, OUTPUT);
//RGB 初始化
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
//串口初始化
Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop()
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(500); // wait for a second
Serial.println("Hello DigiKey & EEWorld!");
//状态机形式点灯
switch(u8Step)
{
case 1:
{
u8RedColor_i =255;
u8GreenColor_i =0;
u8BlueColor_i =0;
u8Step =2;
break;
}
case 2:
{
u8RedColor_i =0;
u8GreenColor_i =255;
u8BlueColor_i =0;
u8Step =3;
break;
}
case 3:
{
u8RedColor_i =0;
u8GreenColor_i =0;
u8BlueColor_i =255;
u8Step =4;
break;
}
case 4:
{
u8RedColor_i =0;
u8GreenColor_i =255;
u8BlueColor_i =255;
u8Step =5;
break;
}
case 5:
{
u8RedColor_i =255;
u8GreenColor_i =0;
u8BlueColor_i =255;
u8Step =6;
break;
}
case 6:
{
u8RedColor_i =255;
u8GreenColor_i =255;
u8BlueColor_i =0;
u8Step =1;
break;
}
default:
{
u8RedColor_i =0;
u8GreenColor_i =0;
u8BlueColor_i =0;
}
}
RgbSetColor(u8RedColor_i,u8GreenColor_i,u8BlueColor_i);
}
//////////////////////////////////////////////////////////
//函数名称:RgbSetColor
//函数功能:设置RGB 颜色亮度
//传入参数:红色数值, 绿色数值, 蓝色数值
//传出参数:无
//特别说明:数据范围 0~255
//////////////////////////////////////////////////////////
void RgbSetColor(byte u8RedValue, byte u8GreenValue, byte u8BlueValue)
{
analogWrite(LEDR, (255-u8RedValue));
analogWrite(LEDG, (255-u8GreenValue));
analogWrite(LEDB, (255-u8BlueValue));
}
2.2 入门任务(必做):学习IMU基础知识,调试IMU传感器,通过串口打印六轴原始数据
2.2.1 物料准备
Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线
设计思路
setup 函数中初始化串口模块和 IMU 模块,然后在 loop 函数中查询 IMU 是否有新数据产生,通过串口打印
2.2.2 软件流程
2.2.3 代码片段
#include "WiFiNINA.h"
#include "Arduino_LSM6DSOX.h"
//宏定义数据
#define LED1 LEDR
#define LED2 LEDG
#define LED3 LEDB
//全局变量
byte u8RedColor_i =0;
byte u8GreenColor_i =0;
byte u8BlueColor_i =0;
byte u8Step =1;
float Ax, Ay, Az;
float Gx, Gy, Gz;
// the setup function runs once when you press reset or power the board
void setup()
{
//LED 初始化
pinMode(LED_BUILTIN, OUTPUT);
//RGB 初始化
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
//串口初始化
Serial.begin(9600);
//IMU 初始化
if(!IMU.begin())
{
Serial.println("Fail to initialize IMU!");
}
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.println("Accelerometer data: ");
Serial.print(Ax);
Serial.print('\t');
Serial.print(Ay);
Serial.print('\t');
Serial.println(Az);
Serial.println();
}
//打印陀螺仪数据
if (IMU.gyroscopeAvailable())
{
IMU.readGyroscope(Gx, Gy, Gz);
Serial.println("Gyroscope data: ");
Serial.print(Gx);
Serial.print('\t');
Serial.print(Gy);
Serial.print('\t');
Serial.println(Gz);
Serial.println();
}
delay(500);
}
2.3 入门任务(必做):学习PDM麦克风技术知识,调试PDM麦克风,通过串口打印收音数据和音频波形
2.3.1 物料准备
Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线
设计思路
setup 函数中初始化串口模块和 PDM 模块,然后在 loop 函数中查询 PDM 新数据,通过串口打印
2.3.2 软件流程
2.3.3 代码片段
#include <WiFiNINA.h>
#include <PDM.h>
bool LED_SWITCH = false;
// 设置输出通道数, 1 为单声道, 2 为立体声
static const char channels = 1;
// 设置采样频率, 单位 Hz
static const int frequency = 20000;
// 缓存采样数据,数据长度为 16bit
short sampleBuffer[512];
// 读取个数
volatile int samplesRead;
void setup()
{
//串口初始化
Serial.begin(9600);
//LED 灯初始化
pinMode(LEDB, OUTPUT);
// 设置 PDM 检测到新数据时的回调函数
PDM.onReceive(onPDMdata);
// 设置 PDM 增益,数据在 0 到 255 之间,默认为 20
PDM.setGain(30);
// 初始化 PDN 模块:
// - 单声道模式
// - 采样率 20KHz
// 等待 PDM 初始化完成
if (!PDM.begin(channels, frequency))
{
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop()
{
// 有新数据产生
if (samplesRead)
{
// 串口打印接收数据
for (int i = 0; i < samplesRead; i++)
{
Serial.println(sampleBuffer[i]);
if (sampleBuffer[i] > 5000 || sampleBuffer[i] <= -5000) //数据大于 5000 或小于 -5000, 闪灯
{
LED_SWITCH = !LED_SWITCH;
if (LED_SWITCH)
{
digitalWrite(LEDB, HIGH);
delay(1000);
}
else
{
digitalWrite(LEDB, LOW);
delay(1000);
}
}
}
// 清零数据,等待下一次数据
samplesRead = 0;
}
}
// 处理 PDM 模块的回调函数,底层用 ISR 实现,因此不可在其中使用串口打印数据
void onPDMdata()
{
// 读取 PDM 缓存数据
int bytesAvailable = PDM.available();
// 将 PDM 缓存数据存入定义数组中
PDM.read(sampleBuffer, bytesAvailable);
// 每次采样 2Byte 数据
samplesRead = bytesAvailable / 2;
}
2.3 选做任务:通过RGB LED不同颜色、亮度显示PDM麦克风收到的声音大小
2.3.1 物料准备
Arduino IDE /Arduino Nano Connect 开发板/ USB 连接线
设计思路
setup 函数中初始化 RGB 模块、串口模块和 PDM 模块,然后在 loop 函数中查询 PDM 新数据,通过 map 函数映射为 RGB 数值
2.3.2 软件流程
2.3.3 代码片段
#include <WiFiNINA.h>
#include <PDM.h>
//宏定义数据
#define LED1 LEDR
#define LED2 LEDG
#define LED3 LEDB
// 设置输出通道数, 1 为单声道, 2 为立体声
static const char channels = 1;
// 设置采样频率, 单位 Hz
static const int frequency = 20000;
// 缓存采样数据,数据长度为 16bit
short sampleBuffer[512];
// 读取个数
volatile int samplesRead;
byte PDM_DataRemap =0;
void setup()
{
//串口初始化
Serial.begin(4800);
//LED 灯初始化
pinMode(LEDB, OUTPUT);
// 设置 PDM 检测到新数据时的回调函数
PDM.onReceive(onPDMdata);
// 设置 PDM 增益,数据在 0 到 255 之间,默认为 20
PDM.setGain(30);
// 初始化 PDN 模块:
// - 单声道模式
// - 采样率 20KHz
// 等待 PDM 初始化完成
if (!PDM.begin(channels, frequency))
{
Serial.println("Failed to start PDM!");
while (1);
}
}
void loop()
{
// 有新数据产生
if (samplesRead)
{
PDM_DataRemap =map(sampleBuffer[0],-500, 500, 0, 255);
RgbSetColor(0, 0, PDM_DataRemap);
// Serial.println(sampleBuffer[0]);
delay(100);
// 清零数据,等待下一次数据
samplesRead = 0;
}
}
// 处理 PDM 模块的回调函数,底层用 ISR 实现,因此不可在其中使用串口打印数据
void onPDMdata()
{
// 读取 PDM 缓存数据
int bytesAvailable = PDM.available();
// 将 PDM 缓存数据存入定义数组中
PDM.read(sampleBuffer, bytesAvailable);
// 每次采样 2Byte 数据
samplesRead = bytesAvailable / 2;
}
//////////////////////////////////////////////////////////
//函数名称:RgbSetColor
//函数功能:设置RGB 颜色亮度
//传入参数:红色数值, 绿色数值, 蓝色数值
//传出参数:无
//特别说明:数据范围 0~255,数值越小,亮度越小
//////////////////////////////////////////////////////////
void RgbSetColor(byte u8RedValue, byte u8GreenValue, byte u8BlueValue)
{
analogWrite(LEDR, (255-u8RedValue));
analogWrite(LEDG, (255-u8GreenValue));
analogWrite(LEDB, (255-u8BlueValue));
}
三.可下载代码
四.心得体会
感谢 EE和 DigiKey 再一次提供的玩板子的机会。很久前就有听过 RP2040 的高i性价比,特别是今年官方还出了升级版本的 2350;本次的 Nano 板卡也称得上是麻雀虽小五脏俱全,尤其板载 ST 的 MESE 加速度和陀螺仪传感器,以及 PDM 录音模块,可联动机器学习和语音引擎,加上小尺寸体积,十分适合用在可穿戴设备上。遗憾的一点是年尾事多时间有限,本次活动只能匆匆掠过,更出彩的玩法还得补课学学机器学习和惯性导航内容,毕竟学无止境,趁年轻,多折腾。
|