- 2024-12-30
-
发表了主题帖:
【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 视频演示
[localvideo]7c84be440f3413cc0e23b6f097fd80ce[/localvideo]
二.任务实现详情
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 录音模块,可联动机器学习和语音引擎,加上小尺寸体积,十分适合用在可穿戴设备上。遗憾的一点是年尾事多时间有限,本次活动只能匆匆掠过,更出彩的玩法还得补课学学机器学习和惯性导航内容,毕竟学无止境,趁年轻,多折腾。
- 2024-12-29
-
发表了日志:
【Follow me第二季第4期】Arduino Nano Connect 作业提交
- 2024-12-24
-
回复了主题帖:
【测评入围名单】RainbowLink USB 协议转换器(RS485 / RS232 / TTL)
个人信息无误,确认可以完成测评分享计划
- 2024-12-19
-
加入了学习《直播回放: DigiKey FollowMe 第二季 第4期 Arduino Nano RP2040 Connect 任务讲解》,观看 Arduino Nano RP2040 Connect 任务讲解
- 2024-12-18
-
加入了学习《Arduino? Nano RP2040 Connect 任务视频》,观看 IMU 原始数据打印
- 2024-12-17
-
发表了主题帖:
【Follow me第二季第4期】2.必做任务之点灯+串口打印
本帖最后由 我的学号 于 2024-12-17 22:23 编辑
之前参加过 FM 第二期活动,对 Arduino 开发有了一定的认识,本次的点灯和串口打印任务还是比较容易上手的,下边对开发过程做简要记录。
一.环境搭建
本次活动选择的开发环境是 Arduino 2.3.2。使用新板卡需要在 Arduino IDE 添加对应型号,具体过程:
左侧选择“”开发板管理器“,上方内容输入 ”RP2040“, 选择 Arduino Mbed OS Nano Boards 并安装
安装完毕在 ”文件“ 下可见 ”示例“
二. 初次上电准备
初次上电,发现 Nano RP2040 Connect 虽然 LED 灯 和RGB 灯在闪烁,但PC 上的设备管理器并没有显示新的串口设备
猜测需要恢复出厂设置,参考官方示例,先用USB线连接电脑,使用镊子或剪刀短路 板卡的 REC 和GND,
按板载白色复位键后松开,此时在 我的电脑 里会出现一个大容量存储设备
将从官网下载的测试程序 blink.ino.elf.uf2 拖入设备中,可见设备管理器已出现新的串口号
三.点灯
硬件设计上板载 RGB 灯是由 WIFI 模块 ESP32 直接控制的,因此 RP2040 只能通过库间接使用
左侧选择 库管理, 输入 WiFiNINA 并安装
添加 #include "WiFiNINA.h" 头文件便可操作 RGB, 通过该 .h 文件还能操作从 ESP32 出来的 SPI 和 IIC
三色 RGB 已经被命名为 LEDR LEDG 和 LEDB, 直接调用即可
四.串口打印
开启串口打印功能,需要在 setup 函数里用 Serial.begin( ) 指定通信波特率
loop 循环中便可使用 Serial.println( ) 打印相关内容
五.点灯和串口打印代码如下:
#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));
}
六,实现效果如下:
[localvideo]e81ecad1b82b8db215b3375d87835c41[/localvideo]
-
发表了日志:
【Follow me第二季第4期】2.必做任务之点灯+串口打印
- 2024-11-29
-
加入了学习《嵌入式c语言进阶》,观看 课程内容和理念介绍
-
加入了学习《2021_Digikey KOL系列:亲手教你转起一台无刷电机》,观看 Digi-Key_KOL_BLDC
-
加入了学习《电机控制》,观看 电机控制应用(上)
-
加入了学习《【Follow me第二季第3期】扩展任务---EK_RA6M5函数信号发生器》,观看 【Follow me第二季第3期】扩展任务---EK_RA6M5函数信号发生器
- 2024-11-21
-
回复了主题帖:
【Follow me第二季第4期】1.Nano RP2040 Connect 硬件分析
yilonglucky 发表于 2024-11-21 13:38
所以三色灯由wifi芯片控制,那怎么通知wifi芯片?i2c还是spi,还是uart?怎么感觉都有呢?
这个WIFI 芯片其实就是ESP32;从原理图上看RGB 灯接线从它来,A6 A7的端口也是它;看了官方例程,通信方式是SPI; 这几个GPIO 感觉像是设置了透传,RP2040 可以间接使用
-
发表了主题帖:
【Follow me第二季第4期】1.Nano RP2040 Connect 硬件分析
本帖最后由 我的学号 于 2024-11-21 11:20 编辑
本次 EEWORLD 和 DIGILEY 联合举办的 Follow Me 第二季第四期指令的板卡为 Nano RP2040 Connect, 这是一款搭载了 树莓派 RP2040 芯片, 板载加速计,陀螺仪,RGB LED 和 MESN 麦克风等模块,同时可以通过 MINA-W102 设备进行 WIFI 和蓝牙通信,十分适合物联网 AI 项目的学习和开发。下边结合官方给出的硬件原理图对板卡进行简要分析:
官网地址: Nano RP2040 官方资料
查看规格说明,板卡框架如下:
一,供电情况
板子的供电由 USB 接口而来;接上USB 线后,电源经过一个 肖特基二极管 来到 电源管理芯片 MP2322GQH,这是一款来自 MPS 的宽输入范围 (3V~22V),持续输出电流可达 1A 的同步降压芯片,QFN 的尺寸十分适合在小型设备上使用
电源芯片 MP2322GQH
外部输入电源经过降压后得到 3v3 电压,供给后续板块主芯片和各个模块使用
二. 主芯片 RP2040
树莓派基金会在 21 年 1月份推出的 Cortex-m0+ 芯片 RP2040, 以丰富可拓展的外设, 价格上的优势和丰富的生态开发,在创客圈中颇受欢迎。开发资料可参考:树莓派 PICO 中文
芯片规格参数如下:
如需要复用引脚,可以参考:
回到 Nano RP2040 最小系统,输入3v3 电源为高速外设的运行供电,芯片内部转换出 1.1v 电压供电,无需添加额外降压线路。
VCC 和GND 之间需要放置 104 电容,越靠近芯片越好
为芯片提供频率的是来自微芯的12Mhz 有源晶振 DSC6111HI2B
三.麦克风模块
RP2040 通过 PDM 接线和来自 ST 的 MEMS音频传感器全向立体声数字麦克风芯片 MP34DT06JTR,其低功耗小尺寸十分适合在可穿戴设备上使用
四 IIC 接线
RP2040 的 IIC 接口连接有四:
1 为 来自微芯的安全加密芯片 ATECC608A-MAHDA-T, 独特的硬件加密算法保证传输的数据只有通过特定密钥才能解析出原数据
2 为来自 ST 的加速度陀螺仪六轴传感器 LSM6DSOXTR, 同样属于低功耗高性能芯片,具机器学习内核极大丰富了设备的使用场合
3 为对外 IIC 接口引出,注意板上已添加上拉电阻
4.和WIFI 蓝牙芯片连接
五, FLASH 模块
FLASH 芯片使用的是来自瑞萨的 128Mbit NorFlash AT25SF128A-MHB-T, 充分利用了 RP2040 的QSPI 四线通信
六,无线通信模块
WIFI 蓝牙芯片使用 UBLOX 的 NINA-W102-00B , 其内置MCU 支持 UART/SPI/IIC 等各种通信接口
三色 RGB 可用于反映无线通信芯片的工作情况
7.用户指示灯,给高电平灯亮
8.SWD 接口和复位按键
按树莓派官方说法,可以通过一个PICO 对另一个PICO 进行调试
9. 排针引出基本为空余引脚,可拓展使用
Nano RP2040 原理图:
- 2024-11-16
-
加入了学习《直播回放: FollowMe 4 W5500-EVB-Pico 使用入门》,观看 W5500-EVB-Pico 使用入门
-
发表了日志:
【Follow me第二季第4期】1.Nano RP2040 Connect 硬件分析
- 2024-11-11
-
回复了主题帖:
免费申请: 极海APM32M3514电机通用评估板,测评赢极小海大礼包
这块板没有硬件原理图?也没有官方 demo 可以参考?
- 2024-11-01
-
加入了学习《【Follow me第二季第2期】Arduion UR4 作业提交》,观看 【Follow me第二季第2期】Arduion UR4 作业提交
-
加入了学习《【Follow me第二季第2期】 进阶任务 智能家居3 MQTT接入HA》,观看 Follow me第二季第2期】 基础任务:用DAC生成正弦波;用OPAMP放大DAC信号
-
加入了学习《【Follow me第二季第2期】 进阶任务 智能家居3 MQTT接入HA》,观看 【Follow me第二季第2期】 进阶任务 智能家居3 MQTT接入HA
- 2024-10-28
-
回复了主题帖:
【Follow me第二季第2期】Arduion UR4 作业提交
补充:Follow me第二季第2期】6.进阶任务之 ST25DV16 NFC 模块的使用