1.硬件简介
这次用到的硬件是 双核 Arm Cortex-M0 的rp2040主频133MHz并且可以超频,芯片内置 264KB SRAM 和 2MB 的板载闪存,这款核心板还带有4颗ws2818灯珠,可以实现不同的功能,typec接口,相对于官方的板子使用更加的方便。由于rp2040自带usb接口,所以板子上并不需要usb转串口芯片,本身就能烧录程序。这次使用的arduino编程,而不是micropython。本身arduino的库支持更全,但是实际应用中,还是出现了比较多的问题,后面会描述。
2.硬件原理图
2.1系统框图
系统供电3.3V,电压表用到的硬件有电位器和OLED显示屏,系统框图如下。
2.2ADC输入电路
ADC的输入是直接连接到电位器,通过调节点位器,就可以实现0-3.3V电压变化。输入的通道是ADC2,GPIO28。这里如果没有电压基准,需要测量电源电压,再进行计算。
2.3 olde屏幕电路
这里用到第二个模块是oled显示屏,连线分别如下,电源电压3.3v,需要注意的是这里用的是spi接口,调用库的时候使用spi的例程。这里连接到没有MISO。只需要定义四个引脚。
rts --- GPIO8
DC --- GPIO9
SCK --- GPIO10
MOSI --- GPIO11
3.程序
3.1程序流程图
上电后初始化ADC和OLED,初始化之后每隔1S采集一次电位器电压值,采集完成后转换为电压值并显示在OLED上。
3.2初始化程序
arduino初始化程序一般都非常简单,直接按照例程即可,这样用户可以把更多的时间集中在主程序和功能上,减少驱动调试的时间,但是rp2040现在使用的用户比较少,实际上用到的adafruit ssd1306库,只有2.5版本能正常编译,如果大家发现编译出错,一个个更换即可,较早的版本有一些是能用的,arduino ide不支持go to defination,所以这里没有花费太多时间去修改库的问题。
这里要注意,按照要求,ADC要设置成12位的模式。SPI的io也要设置成和扩展版相对应的IO。
#define OLED_MOSI 11
#define OLED_CLK 10
#define OLED_DC 9
#define OLED_CS 12
#define OLED_RESET 8
Serial.begin(9600);
analogReadResolution(12);
if(!display.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
display.clearDisplay();
3.3屏幕显示程序和电压转换
屏幕显示和电压转换放到一个程序里了,因为本次例程比较简单,采取这种简单粗暴的方法。arduino本身是有浮点转字符串函数的,不知道这里为什么报错,所以简单的写了一个转换打印到屏幕的函数,因为电压范围固定了,这里也是简单粗暴的去处理。
void testdrawchar(void) {
float a2;
int a3=666;
a2=3.3*a3/4096;
char s[]="t.est";
s[0]=a2+48;
s[2]=(int)(a2*10)%(10)+48;
s[3]=(int)(a2*100)%(10)+48;
s[4]=(int)(a2*1000)%(10)+48;
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(20, 20); // Start at top-left corner
display.cp437(true); // Use full 256 char 'Code Page 437' font
display.write(s);
}
display.display();
delay(2000);
}
3.4主函数
主函数就很简单,调用上面的函数,并且延时,1s采集并显示一次数据。
void loop() {
int sensorValue = analogRead(A2);
testdrawchar2(sensorValue);
delay(1000);
}
4.实物演示
实物演示如下图,ADC将电位器采集到数值转换后通过OLED显示。
5.遇到的问题
因为使用的是arduino编程所以一切准备好之后,开发工作是很简单的。但是准备过程中遇到不少的问题,这款芯片类似之前用过的wio terminal,是通过usb 虚拟串口烧录。但是我之前用的系统是win8,较早版本的系统,会存在一个问题,虽然能正确识别u盘,能烧录程序,但是arduino ide只能在下载的模式烧录一次,不能自动烧录。这里要参考arduino的方法,通过以下网址可以安装驱动。
https://arduino-pico.readthedocs.io/en/latest/serial.html
除了驱动的问题,还有不同的库之间,编译不一定能通过,这是我第三次使用arduino,之前使用的是esp32这类应用很广的的开发板,所以支持非常好,基本不会出问题。如果长期使用,还是需要通过vscode等工具,开发,官方ide并不方便,尤其是修改库文件方面。
6.总结
通过arduino平台开发,库的例程丰富,开发的时间相对其他平台更短。