基于树莓派PICO电压表
基于rp2040电压表,通过内部adc读取电位器电压值,在OLED显示屏上显示电压值
标签
嵌入式系统
Arduino
RP2040
OLED显示
2023寒假在家练
llzx
更新2023-03-29
553

1.硬件简介

   这次用到的硬件是 双核 Arm Cortex-M0 的rp2040主频133MHz并且可以超频,芯片内置 264KB SRAM 和 2MB 的板载闪存,这款核心板还带有4颗ws2818灯珠,可以实现不同的功能,typec接口,相对于官方的板子使用更加的方便。由于rp2040自带usb接口,所以板子上并不需要usb转串口芯片,本身就能烧录程序。这次使用的arduino编程,而不是micropython。本身arduino的库支持更全,但是实际应用中,还是出现了比较多的问题,后面会描述。

2.硬件原理图

2.1系统框图

    系统供电3.3V,电压表用到的硬件有电位器和OLED显示屏,系统框图如下。

FnqOaHJTd2m-PF64PZKnBVYjBOy2

2.2ADC输入电路

    ADC的输入是直接连接到电位器,通过调节点位器,就可以实现0-3.3V电压变化。输入的通道是ADC2,GPIO28。这里如果没有电压基准,需要测量电源电压,再进行计算。

Fqd0bxdel1_U_lk8J97u_TLTFD0I

2.3 olde屏幕电路

    这里用到第二个模块是oled显示屏,连线分别如下,电源电压3.3v,需要注意的是这里用的是spi接口,调用库的时候使用spi的例程。这里连接到没有MISO。只需要定义四个引脚。

rts   ---   GPIO8

DC   ---   GPIO9

SCK   ---   GPIO10

MOSI   ---   GPIO11

FntRuZ-1JdCPIDoky1_8UzieEojB

3.程序

3.1程序流程图

   上电后初始化ADC和OLED,初始化之后每隔1S采集一次电位器电压值,采集完成后转换为电压值并显示在OLED上。

Fh4oQW5GGkY0qlakNMo6ux__Z4Ji

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显示。

FmHYys66vbPRddMCH02-qsKhl4G6

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平台开发,库的例程丰富,开发的时间相对其他平台更短。

附件下载
ssd1306_128x64_spi-demo.zip
团队介绍
个人
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号