2024年得捷电子和eeworld论坛联合举办的Follow me活动第二季已经进行到第4期,有幸再次参见,趁着这次周末有时间,将任务做了。
对于Arduino,并不是很陌生,之前也是用ESP32、ESP8266做了不少好玩的东西。但对于主控为树莓派系列的MCU,但使用Arduino开发还是第一次接触,虽然我也有树莓派4
本次任务除了申请官方指定的Arduino® Nano RP2040 Connect,还申请了另外一块开发板RASPBERRY PI PICO 2,帮助更好的完成任务,并碰撞出更多的灵感。
开发板简介
Arduino Nano RP2040 Connect开发板集成了 Raspberry Pi Foundation 开发的 RP2040 微控制器与 u-blox NINA-W102 Wi-Fi 和蓝牙无线电模块,以及一个丰富的先进传感器甚至能够支持人工智能算法。事实上,该板包括一个支持语音激活功能的数字麦克风、一个六轴惯性运动传感器 (IMU)、一个小型 RGB LED 和广泛可用的闪存 (16 MB),甚至能够满足最苛刻的要求应用程序。
新板从 Raspberry Pi RP2040 继承了对 MicroPython 和 C/C++ 语言的编程支持,两者均基于为 Raspberry Pi Pico 板开发的 SDK。与 Arduino 系列中的所有其他板一样,最新添加的产品支持本地编程环境,例如著名的 Arduino IDE(现在为 2.0 版)。
开发板框图如图 1 所示。核心由 RP2040 微控制器表示,能够通过经典的 USB 连接与主机开发和调试环境进行通信,并通过四通道 SPI 串行高速存储器与 16-MB 外部闪存进行通信。速度接口。3.3V 电源由 MP2322 稳压器提供,输入源可从 USB 端口 (V USB ) 或外部电源 (V IN ) 中选择。NINA W102 Wi-Fi/蓝牙模块通过 I 2连接到 microC、SPI、UART接口,连接RGB LED。至于其他传感器,MEMS麦克风通过脉冲密度调制(PDM)数字音频接口连接到micro,而六轴运动传感器和认证模块通过I 2 C总线连接。以 12 MHz 运行的外部 MEMS 振荡器提供时钟脉冲。
图 1:开发板框图
该板的主要组件在图 2 中突出显示。首先,我们有 RP2040 芯片,这是一个基于 ARM Cortex M0+ 的 32 位双核微控制器,工作频率为 133 MHz,并配有一个集成的 264-KB SRAM 存储器。该 MCU 的卓越性能和高效率使其能够支持使用 TinyML、TensorFlow Lite 或 Edge Impulse 开发的机器学习算法。除了对 MicroPython 的全面支持(从 2021 年 7 月开始提供)外,该板还为机器视觉项目提供免费的 OpenMV 许可证。RP2040 微控制器提供的功能包括:
在 MCU 之后,此卡的第二个优势无疑是连接性,它通过 u-blox NINA W102 无线电模块实现,这是一种廉价且易于适应的设备。该模块还增加了四个模拟 GPIO(RP2040 只有四个模拟引脚),使总数达到八个,与其他 Arduino Nano 板一致。配备集成天线的无线电模块基于双核 Xtensa LX6 CPU,可以使用 SWD 接口和位于板背面的特殊焊盘独立于 RP2040 进行编程。在实践中,NINA W102 模块使用与 ESP32 模块相同的 CPU,ESP32 模块是最受创客欢迎的硬件平台之一,还有 Arduino 和 Raspberry Pi。RGB LED 连接到无线电模块,可以使用为模块本身开发的相同库 (WiFiNINA) 驱动。物联网应用中使用的连接需要高度的安全性,以便在所有操作条件下保持传输数据的一致性,并防止来自外部的潜在攻击。为此,设计人员采用了功能强大的加密协处理器,即已在 Arduino MKR 系列板上使用的 Microchip ATECC608A。加密协处理器的特点是功耗特别低,提供对安全启动的支持、对非对称签名的硬件支持、验证、密钥协商、对对称算法(SHA-256 和 HMAC、AES-128)的硬件支持以及网络关键管理支持。物联网应用中使用的连接需要高度的安全性,以便在所有操作条件下保持传输数据的一致性,并防止来自外部的潜在攻击。为此,设计人员采用了功能强大的加密协处理器,即已在 Arduino MKR 系列板上使用的 Microchip ATECC608A。加密协处理器的特点是功耗特别低,提供对安全启动的支持、对非对称签名的硬件支持、验证、密钥协商、对对称算法(SHA-256 和 HMAC、AES-128)的硬件支持以及网络关键管理支持。物联网应用中使用的连接需要高度的安全性,以便在所有操作条件下保持传输数据的一致性,并防止来自外部的潜在攻击。为此,设计人员采用了功能强大的加密协处理器,即已在 Arduino MKR 系列板上使用的 Microchip ATECC608A。加密协处理器的特点是功耗特别低,提供对安全启动的支持、对非对称签名的硬件支持、验证、密钥协商、对对称算法(SHA-256 和 HMAC、AES-128)的硬件支持以及网络关键管理支持。设计人员包括一个功能强大的加密协处理器,即已在 Arduino MKR 系列板上使用的 Microchip ATECC608A。加密协处理器的特点是功耗特别低,提供对安全启动的支持、对非对称签名的硬件支持、验证、密钥协商、对对称算法(SHA-256 和 HMAC、AES-128)的硬件支持以及网络关键管理支持。设计人员包括一个功能强大的加密协处理器,即已在 Arduino MKR 系列板上使用的 Microchip ATECC608A。加密协处理器的特点是功耗特别低,提供对安全启动的支持、对非对称签名的硬件支持、验证、密钥协商、对对称算法(SHA-256 和 HMAC、AES-128)的硬件支持以及网络关键管理支持。
传感器设备包括 ST LSM6DSOX 六轴 IMU,它将 3D 加速度计和 3D 陀螺仪与专用机器学习核心相结合。该组件主要用于“永远在线”操作要求特别低功耗的移动市场,具有以下技术特性:
该设备可以使用专用的 Arduino LSM6DSOX 库轻松编程。
另一个相关的传感器是全向数字麦克风,可用于声音激活、音频控制,甚至人工智能语音识别。MP34DT05 麦克风实时捕捉和分析声音,可用于为任何项目创建语音界面。ST MP34DT05-A 是一款超紧凑、低功耗、全向、数字 MEMS 麦克风,内置电容感应元件和 I2C 接口。能够检测声波的传感元件采用 MEMS 工艺制造,而 IC 接口采用 CMOS 工艺制造,可在外部以 PDM 格式提供数字信号。MP34DT05-A 是一款低失真数字麦克风,具有 64-dB 的信噪比和 –26-dBFS ±3-dB 的灵敏度。可以使用专用的 Arduino PDM 库对该设备进行编程。
关于可编程 I/O 引脚,该板提供 8 个模拟输入引脚和 22 个数字 I/O 引脚(其中 20 个可配置为 PWM 发生器或外部中断)。引脚 13 上还提供了一个内置用户 LED。图 3显示了 Arduino Nano RP2040 连接板的完整引脚排列,该板也可提供预安装的插头引脚。引脚布局井井有条,所有模拟和电源引脚都在左侧接头上,数字引脚在右侧接头上。如图 1 所示,RP2040 MCU 支持 UART、SPI 和 I 2 C 通信。
图 3:电路板引脚排列
Raspberry Pi Pico 2是一款树莓派官方设计的低成本,高性能的微控制器开发板,具有灵活数字接口。硬件上,采用 Raspberry Pi 官方自主研发的 RP2350 微控制器芯片,搭载了双ARM Cortex M33或Hazard3处理器,高达 150MHz 的运行频率,内置了 520KB 的 SRAM 和 4MB 的内存,还板载有多达 26 个多功能的 GPIO 引脚。软件上,可选择树莓派提供的 C/C++ SDK,或者使用 MicroPython 进行开发。
其主要特点包括:
RP2350 微控制器芯片
双 Cortex-M33 或 Hazard3 处理器,最高频率可达 150MHz
520KB 的 SRAM 和 4MB 的板载闪存
USB 1.1,支持设备和主机模式
低功耗睡眠和休眠模式
通过 USB 大容量存储进行拖放编程
26× 多功能 GPIO 引脚,其中 3 个可用于 ADC
2× SPI, 2× I2C, 2× UART, 3× 12 位 500ksps 模数转换器(ADC),24× 可控 PWM 通道
2× 定时器,带 4 个警报,1× AON 定时器
温度传感器
3 × 可编程 IO (PIO) 块,总共 12 个状态机,用于自定义外设支持
灵活、用户可编程的高速 IO
可以模拟 SD 卡和 VGA 等接口
开发环境搭建
话不多说,开始进行开发环境搭建。
在arduino IDE中配置RP2040开发环境
2.1】打开arduino IDE,点击File,然后点击首选项
2.2】将链接 javascript:; 复制到其他开发板管理器地址中
单击“确定”
2.3】进入开发板管理器中 安装RP2040。在搜索框中搜索RP2040,点击IN STALLED,弹出的窗口,点击OK,等待安装完成(我这个示先安装过)
3】安装完成之后就可以使用Arduino® Nano RP2040 Connect与RASPBERRY PI PICO 2了。
任务一基础:
搭建环境并开启第一步Blink三色LED / 串口打印Hello DigiKey & EEWorld!
首先了解一下硬件资源,板子上自带了5颗LED灯,包括一颗电源灯,还有一颗RGB灯,最后一颗为通信指示灯。本次任务我适用RGB灯,其电路如下图,但是这几个脚直接接到内置的wifi模块上,查看资料后发现,可以直接通过封装好的库函数WiFiNINA调用其控制函数控制其RGB灯。
串口部分基础任务中直接走虚拟串口与PC直接通信。这部分和软件调试使用同一个usb口,因此不需要额外增加电路。
基础代码:
#include <WiFiNINA.h>
//#include <Arduino.h>
void setup() {
Serial.begin(115200);
pinMode(LEDB, OUTPUT);
pinMode(LEDR,OUTPUT);
pinMode(LEDG,OUTPUT);
digitalWrite(LEDB,LOW);
digitalWrite(LEDR,LOW);
digitalWrite(LEDG,LOW);
Serial.println("The task began!!!");
Serial.println();
}
void loop() {
delay(2000);
digitalWrite(LEDB, HIGH);
digitalWrite(LEDG, LOW);
Serial.println("Hello DigiKey & EEWorld!");
delay(2000);
digitalWrite(LEDB, LOW);//状态翻转
digitalWrite(LEDG, HIGH);
}
任务一进阶:
任务一进阶适用PICO2开发板与Arduino Nano RP2040 Connect,其主要原理是PICO2的按键通过串口控制Arduino Nano RP2040 Connect开发板上的RGB 灯,其系统架构图如下图所示:
其主要代码如下:
PICO2代码:
int val;
const int BUTTON_PIN = 21; // the number of the pushbutton pin
const int SHORT_PRESS_TIME = 500; // 500 milliseconds
// Variables will change:
int lastState = LOW; // the previous state from the input pin
int currentState; // the current reading from the input pin
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
char key_flag = 0;
void setup() {
Serial1.setRX(17);
Serial1.setTX(16);
Serial1.begin(115200); // opensserial port, sets data rate to 9600 bps
while(Serial.read()>= 0){}//clear serialbuffer
pinMode(25,OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
Serial1.write(49);
}
void Key(void) {
delay(1);
}
void loop() {
delay(10);
// read the state of the switch/button:
currentState = digitalRead(BUTTON_PIN);
if(lastState == HIGH && currentState == LOW) // button is pressed
pressedTime = millis();
else if(lastState == LOW && currentState == HIGH) { // button is released
releasedTime = millis();
long pressDuration = releasedTime - pressedTime;
if( pressDuration < SHORT_PRESS_TIME )
Serial.println("A short press is detected");
key_flag = !key_flag;
if(key_flag) {
Serial1.write(49);
Serial.println("49");
digitalWrite(25,LOW);
} else {
Serial1.write(50);
Serial.println("50");
digitalWrite(25,HIGH);
}
}
// save the the last state
lastState = currentState;
}
Arduino Nano RP2040 Connect代码:
#include <WiFiNINA.h>
int val;
void setup() {
Serial.begin(115200); // opensserial port, sets data rate to 9600 bps
Serial1.begin(115200); // opensserial port, sets data rate to 9600 bps
while(Serial1.read()>= 0){}//clear serialbuffer
while(Serial.read()>= 0){}//clear serialbuffer
pinMode(LEDB, OUTPUT);
pinMode(LEDR,OUTPUT);
pinMode(LEDG,OUTPUT);
digitalWrite(LEDB,LOW);
digitalWrite(LEDR,LOW);
digitalWrite(LEDG,LOW);
Serial.println("The pro task began!!!");
Serial.println();
}
void loop() {
if (Serial1.available() > 0) {
delay(100); // 等待数据传完
int numdata = Serial1.available();
val=Serial1.read();
Serial1.println(val);
if(val==49)
{
Serial.println("Test OK");
Serial.println(val);
// delay(2000);
digitalWrite(LEDB, HIGH);
Serial.println("Hello DigiKey & EEWorld!");
digitalWrite(LEDG, HIGH);
}
if(val==50)
{
Serial.println("Test OK!!!");
Serial.println(val);
// delay(2000);
digitalWrite(LEDB, LOW);
Serial.println("Turn off the lights!");
digitalWrite(LEDG, LOW);
}
while(Serial1.read()>=0){} //清空串口缓存
}
}
总结:
树莓派的MCU,通过arduino来开发难度降低了很多,用户只需要调动封装好的库函数即可。但是有一点要吐槽一下,本来是个及其简单的程序,适用arduino IDE开发却需要很长的编译时间,实在不敢恭维,后期有时间尝试一下VS Code。
任务视频: