- 2025-06-30
-
回复了主题帖:
【回帖赢50元京东卡】无线技术盛宴第三趴(6月新活动)
蓝牙低能耗气象站 - 一般 - DigiKey 技术论坛 - 电子物料和组件方案的专业技术论坛
- 2025-06-18
-
回复了主题帖:
【Raspberry Pi Pico 2W】板载资源-wifi测试
Jacktang 发表于 2025-6-18 07:42
蓝牙功能还无法使用是为何
不好意思,DS说不支持,没有考证;应该是可以使用的,已修正。找到官网的手册上有例程
-
发表了主题帖:
【Raspberry Pi Pico 2W】扩展板 外挂模块 测试
焊接使用了扩展板,使用Grove接口,连接几个对应接口的模块进行功能 性测试。
一、外挂数码管测试
这里的IIC连接使用了引脚12、13
#include "TM1650.h" //导入TM1650的库文件
#include <Wire.h>
const int ledPin = LED_BUILTIN; // 定义LED连接的引脚
int item = 0; //要显示的值
TM1650 d;
int count=0;
void setup() {
Wire.setSDA(12); // Pico 的 I2C0 SDA
Wire.setSCL(13); // Pico 的 I2C0 SCL
Wire.begin();
d.init();
pinMode(ledPin, OUTPUT); // 将引脚设置为输出模式
}
void loop() {
char line[4] ={0};// "1234";
sprintf(line, "%4d", count);
d.displayOff();
d.displayString(line);
d.setBrightness(TM1650_MIN_BRIGHT);
d.displayOn();
digitalWrite(ledPin, HIGH); // 点亮LED
delay(100); // 等待1秒
digitalWrite(ledPin, LOW); // 熄灭LED
delay(100);
count++; // 再等待1秒
}
二、RGB灯测试
使用36个灯的圆环。
#include "FastLED.h"
#include <Wire.h>
int item = 0; //要显示的值
#define NUM_LEDS 36 // LED数量
#define DATA_PIN 22 // 数据引脚
#define BRIGHTNESS 64 // 亮度(0-255)
uint8_t gHue = 0; // 全局色调值
uint8_t gPattern = 0; // 当前模式
CRGB leds[NUM_LEDS];
int LED= 3;
int sensorPin = A1; // 定义模拟输入引脚A0
int sensorValue = 0; // 存储读取的模拟值
void setup() {
Wire.begin();
FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
Serial.begin(9600); // 初始化串口通信
}
// 彩虹+流水组合效果
void comboEffect() {
// 彩虹背景
fill_rainbow(leds, NUM_LEDS, gHue, 7);
// 在彩虹背景上添加流水效果
static uint8_t runnerPos = 0;
leds[runnerPos] = CRGB::White; // 白色光点
runnerPos = (runnerPos + 1) % NUM_LEDS;
gHue++;
}
// 另一种流水效果 - 彩色跑马灯
void colorRunningLights() {
fadeToBlackBy(leds, NUM_LEDS, 20);
static uint8_t startPos = 0;
for(int i = 0; i < 3; i++) { // 3个连续的光点
leds[(startPos + i) % NUM_LEDS] = CHSV(gHue + (i * 85), 255, 255);
}
startPos = (startPos + 1) % NUM_LEDS;
gHue += 3;
}
void loop() {
colorRunningLights();
FastLED.show();
delay(50);
}
三、雨水传感器测试
在没有水时,ADC的输出为0,当滴上水后,ADC开始有值 。
ADC值由串口输出到电脑上。
#include "FastLED.h"
#include "TM1650.h" //导入TM1650的库文件
#include <Wire.h>
const int ledPin = LED_BUILTIN; // 定义LED连接的引脚
int sensorPin = 26; // 定义模拟输入引脚A0
int sensorValue = 0; // 存储读取的模拟值
void setup() {
pinMode(ledPin, OUTPUT); // 将引脚设置为输出模式
Serial.begin(9600); // 初始化串口通信
}
void loop() {
sensorValue = analogRead(sensorPin); // 读取A0引脚的模拟值(0-1023)
Serial.println(sensorValue);
digitalWrite(ledPin, HIGH); // 点亮LED
delay(100); // 等待1秒
digitalWrite(ledPin, LOW); // 熄灭LED
delay(100);
}
- 2025-06-17
-
发表了主题帖:
【Raspberry Pi Pico 2W】板载资源-wifi测试
本帖最后由 jinyi7016 于 2025-6-18 15:15 编辑
板载LED的测试在第一次开发环境篇已经测试过了,剩下的还有Flash与Wifi了。
那么,就还剩下wifi这个外设了。
开发板上的wifi模块是使用的CYW43439KUBG,这是一个高度集成的 2.4GHz WiFi + Bluetooth 5.0 双模无线芯片,集成PCB天线。
其与rp2350的连接如下图所示
使用arduino进行wifi测试的代码:
这里的wifi名称与密码,填写自己的。
#include <WiFi.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const int ledPin = LED_BUILTIN; // 定义LED连接的引脚
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.print("Pico W is connected to WiFi network ");
Serial.println(WiFi.SSID());
// Print IP Address
Serial.print("Assigned IP Address: ");
Serial.println(WiFi.localIP());
pinMode(ledPin, OUTPUT); // 将引脚设置为输出模式
}
void loop() {
delay(1000);
// Print IP Address
Serial.print("Assigned IP Address: ");
Serial.println(WiFi.localIP());
digitalWrite(ledPin, HIGH); // 点亮LED
delay(100); // 等待1秒
digitalWrite(ledPin, LOW); // 熄灭LED
delay(100); // 再等待1秒
}
烧写程序后,需要等一段时间,由路由器来分析IP地址:
连接后如下,获取了IP地址:
-
发表了主题帖:
【Raspberry Pi Pico 2W】扩展板设计与开源
由于手头上有很多小的模块,大多都是Grove接口的,于是设计一个Grove接口标准的扩展板,方便连接各个模块。省去每次都要对引脚连接杜邦线了。
正面串口与IIC接口,与IO接口。
并增加了复位按键,方便更新程序后的复位操作,避免重复上电。
背面引出所有IO,SPI接口,通过开发板底部的贴片焊盘,把USB引出到下方的typec接口上。
为天线位置开窗,避免信号质量不佳。
通过开发板底板焊盘引出SWD接口,方便底层调试设计。
预留有电池接口,增加电池充放电转换芯片电路。
还没有实物,开源无法审核,以下是打样文件,可以先打样试试。
等验证通过了,立创那边就通过开源审核了。
打板文件如下:
-
发表了主题帖:
【Raspberry Pi Pico 2W】三种开发方式
本帖最后由 jinyi7016 于 2025-6-17 17:43 编辑
一、Raspberry Pi Pico 2W基本概述
定位:Raspberry Pi基金会推出的低成本、高性能微控制器开发板,是原版Pico的升级型号(2023年发布)。
核心芯片:搭载 RP2040 双核ARM Cortex-M0+ 处理器(主频133MHz),与Pico相同。
最大升级:内置 2.4GHz WiFi(基于Infineon CYW43439芯片),支持无线连接(但无蓝牙)。
价格:约6美元(性价比极高)。
二、开发方式
使用vscode 安装Raspberry Pi Pico 扩展。
通过扩展来新建C语言与python的工程。
1、C、C++
通过扩展来新建C语言与python的工程。
C语言开发方式的LED闪烁程序:
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
int main() {
stdio_init_all();
if (cyw43_arch_init()) {
printf("Wi-Fi init failed");
return -1;
}
while (true) {
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 1);
sleep_ms(250);
cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, 0);
sleep_ms(250);
}
}
2、python
首先,按下boot按键烧写python固件。
烧写固件后,电脑会识别出一个串口,这个串口是连接开发板用的。
插件会自动连接开发板,只要点Run(Stop的位置)就可以运行python代码了。
from machine import Pin
from utime import sleep
pin = Pin("LED", Pin.OUT)
print("LED starts flashing...")
while True:
try:
pin.toggle()
sleep(1) # sleep 1sec
except KeyboardInterrupt:
break
pin.off()
print("Finished.")
3、arduino
打开arduino IDE 中文件下的首选项,填写上开发板地址:https://github.com/earlephilhower/arduino-pico/releases/download/4.5.2/package_rp2040_index.json
在开发板管理器中搜索“pico”,并进行安装。
第一次连接开发板时,要先按boot,再插上开发板,并在端口上选择 UF2 Board
如下图所示
写入代码
const int ledPin = LED_BUILTIN; // 定义LED连接的引脚
void setup() {
pinMode(ledPin, OUTPUT); // 将引脚设置为输出模式
}
void loop() {
digitalWrite(ledPin, HIGH); // 点亮LED
delay(100); // 等待1秒
digitalWrite(ledPin, LOW); // 熄灭LED
delay(100); // 再等待1秒
}
注意,2W的开发板的板载的LED与非W版本的是不同的,非W版本的GPIO连接的是25引脚,而W版本,连接到的是WL_GPIO0
所以,LED引脚的设置,要设置成LED_BUILTIN。
至此,Raspberry Pi Pico 2W的三种开发方式都已经测试完成。都是可以工作,看自己习惯哪种了,三种方式都有相应的例程可以参考的。
[localvideo]8b2e38311237e32355070f4e9cf55d9a[/localvideo]
python固件:
- 2025-06-04
-
回复了主题帖:
测评入围名单: Raspberry Pi Pico 2W(RP2350无线版本)
已查看我的测评计划,可在活动期间内完成并发帖分享
- 2025-05-27
-
回复了主题帖:
【行空板k10评测】测评行空板K10板载传感器与执行器
这个IIC的引脚网络,号P19、P20,原理图中,连接到了IO47、IO48,具体到底连接的是哪个引脚啊,楼主能用万用表测下不,感谢。
- 2025-04-27
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术第二趴(4月新活动)
如何确定元件是否具有极性 - 常见问答 - DigiKey 技术论坛 - 电子物料和组件方案的专业技术论坛
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术第二趴(4月新活动)
本帖最后由 jinyi7016 于 2025-4-27 16:05 编辑
高手支招:教你利用裸露焊盘为芯片散热 - 工程小贴士 - DigiKey 技术论坛 - 电子物料和组件方案的专业技术论坛
-
回复了主题帖:
【获奖名单】回帖赢好礼 | 电源解决方案和技术
已提交
- 2025-04-22
-
回复了主题帖:
【行空板K10评测】01简介
用的是哪个ESP32的模块 啊,有个清楚点的照片吗
- 2025-04-14
-
回复了主题帖:
【FireBeetle 2 ESP32 C6】下载 micropython 固件的几种方法
刷了micropython固件后,再想刷回arduino的固件,可以吗?提供arduino的固件吗?
- 2025-03-28
-
发表了主题帖:
【树莓派Pico 2 RP2350开发板】双核通讯FIFO分析与测试
关于fifo的函数,在C语言的SDK中有如下几个:
SIO模块包含两个FIFO(先进先出队列),用于在两个核心之间传递数据、消息或有序事件。每个FIFO的位宽为32位,深度为4个条目。其中一个FIFO只能由核心0写入、核心1读取,另一个FIFO则只能由核心1写入、核心0读取。
在例程中使用的是:
multicore_fifo_push_blocking,入栈操作
multicore_fifo_pop_blocking,出栈操作
1、multicore_fifo_push_blocking内部调用的是multicore_fifo_push_blocking_inline,实际是把数据,写入sio_hw->fifo_wr寄存器、
该函数会阻塞当前核心,直到目标 FIFO 有空间可写入数据。若 FIFO 已满,调用线程会暂停执行,直到另一个核心通过 multicore_fifo_pop_blocking 读取数据腾出空间
这是一个32位的寄存器
类似的,multicore_fifo_pop_blocking读取 寄存器sio_hw->fifo_rd中的数值。
阻塞读取:该函数会阻塞当前核心,直到目标 FIFO 中有数据可读取。若 FIFO 为空,调用线程会暂停执行,直到另一个核心通过 multicore_fifo_push_blocking 写入数据
若需避免阻塞,可先用 multicore_fifo_rvalid() 检查 FIFO 是否有数据
if (multicore_fifo_rvalid()) {
uint32_t data = multicore_fifo_pop_blocking();
}
这样一入一出,就可以让数据在两个核心之间传输,传输一些标志,设计一些信号量,实现互锁机制就没有问题。
需要注意,这个函数是阻塞的,就是在运行这两个函数后,其下面的代码是无法运行的。
当然,这种检查FIFO的方式还是效率低一些,芯片还支持了FIFO 的中断方式、门铃方式,都是可以比较快速的进行核间的通讯,可以两种方式进行配置使用,增加实时性。
整个测试代码如下:
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pio.h"
#include "hardware/timer.h"
#include "hardware/clocks.h"
#include "hardware/pll.h"
#include "pico/multicore.h"
void pico_set_led(bool led_on)
{
gpio_put(PICO_DEFAULT_LED_PIN, led_on);
}
#ifndef LED_DELAY_MS
#define LED_DELAY_MS 250
#endif
#define LED_FLAG 1
#define FLAG_VALUE 123
int pico_led_init(void)
{
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
return PICO_OK;
}
void core1_entry()
{
multicore_fifo_push_blocking(FLAG_VALUE);
uint32_t g = multicore_fifo_pop_blocking();
while (1)
{
pico_set_led(true);
sleep_ms(LED_DELAY_MS);
pico_set_led(false);
sleep_ms(LED_DELAY_MS);
}
}
int main()
{
int flag1,flag2;
flag1=0;
flag2=0;
stdio_init_all();
pico_led_init();
multicore_launch_core1(core1_entry);
uint32_t g = multicore_fifo_pop_blocking();
if (g != FLAG_VALUE){
printf("Hmm, that's not right on core 0!\n");
flag1=1;
}
else {
multicore_fifo_push_blocking(FLAG_VALUE);
printf("It's all gone well on core 0!");
flag2=1;
}
while (true)
{
printf("flag1=%d, flag2=%d!\n",flag1,flag2);
sleep_ms(1500);
}
}
主main函数的串口输出 :
如果把multicore_fifo_push_blocking注释一个,那么整个程序就会卡在multicore_fifo_pop_blocking()上了。
-
回复了主题帖:
【树莓派Pico 2 RP2350开发板】双核程序运行
秦天qintian0303 发表于 2025-3-28 12:21
双核需要分别下载吗?模式有什么不同?
不需要分别下载,RISC的主程序相当于一个函数而已。只烧写一次就行
-
发表了主题帖:
【树莓派Pico 2 RP2350开发板】双核程序运行
与TI的多核处理器芯片的开发方式不同,RP2350的多核开发,并不是为每个内核新建独立的一个工程,而是在一个工程中包含所有代码 ,通过SDK中的API来启动并支行另一个内核的程序。
tight_loop_contents 是一个在树莓派 Pico 的 SDK 中常用的宏,通常用于在程序中创建一个空的循环体,以防止程序直接退出,同时允许调试器暂停程序。
启动第二个核心的函数为multicore_launch_core1 ();
修改CMakeLists.txt文件,添加pico_multicore支持
如下所示:
源文件中,增加头文件:#include "pico/multicore.h"
先写一个在risc-v内核中运行的一个主函数。
这个函数类似于main函数,只是运行于另一个内核中。
例如,在另一个内核 中去翻转LED灯
void core1_entry()
{
pico_led_init();
while (1)
{
pico_set_led(true);
sleep_ms(LED_DELAY_MS);
pico_set_led(false);
sleep_ms(LED_DELAY_MS);
}
}
而真正的main函数中,用于周期输出 Hello
int main()
{
stdio_init_all();
multicore_launch_core1(core1_entry);
while (true)
{
printf("Hello, world!\n");
sleep_ms(1000);
}
}
可以看到,外设的初始化工作,都是在core1_entry函数中进行配置的,
main中进行串口输出,risc中进行LED闪烁。
这种方式与很多多核异构芯片的运行方式是差不多的,一个主核在启动后,动态加载另一个或多个内核的程序再分别单独进行。
内核控制的函数比较少,有4个,分别是:
void multicore_reset_core1 (void)
void multicore_launch_core1 (void(*entry)(void))
void multicore_launch_core1_with_stack (void(*entry)(void), uint32_t *stack_bottom, size_t stack_size_bytes)
void multicore_launch_core1_raw (void(*entry)(void), uint32_t *sp, uint32_t vector_table)
在没有核间通讯时,两个核心是单各自运行。两个内核之间的通讯,可以通过fifo、queue、中断等方式。
这里开发时,如果没有通讯与互锁机制,会出现外设的竞争,导致程序错乱。
- 2025-03-13
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术
本帖最后由 jinyi7016 于 2025-3-13 11:29 编辑
-
回复了主题帖:
【回帖赢50元京东卡】电源解决方案和技术
- 2025-03-06
-
发表了主题帖:
【树莓派Pico 2 RP2350开发板】功耗测试
经过查看C SDK的文档,发现并没有相应进入低功耗模式的函数。只能是通过降低芯片的主频来达到降功耗的目的。
这里测试时,把LED关了,也把定时器、串口等外设关了,只是在while中有一个sleep的延时函数。
于是测试了50、100、150MHz下,在关闭定时器、IO情况下的电流。
如下图所示:
修改主频的代码如下:
#define PLL_SYS_KHZ (150 * 1000)
set_sys_clock_khz(PLL_SYS_KHZ, true);
clock_configure(
clk_peri,
0, // No glitchless mux
CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS, // System PLL on AUX mux
PLL_SYS_KHZ * 1000, // Input frequency
PLL_SYS_KHZ * 1000 // Output (must be same as no divider)
);
需要另外注意的是,在使用VS code的扩展进行开发时,每次烧写程序,并不需要单独按下BOOT后上电,可以直接点VS Code的 RUN直接进行代码 的下载。
但如果把主频设置的过低的话,这里使用Run也可能无法烧写程序,这时,需要按下BOOT来操作烧写了。
RP2350看来是以高性能为特点的,低功耗并不是她的赛道。