RP2040项目总结报告
一、项目介绍
本项目是基于树莓派RP2040设计的一款鼠标和lcd画板,可以正常驱动电脑鼠标,以及可以在lcd屏幕上画画,写字等。
二、设计思路
图 1设计流程图
三、硬件介绍
(1)采用树莓派Pico核心芯片RP2040:
双核Arm Cortex M+内核,可以运行到133MHz。
264KB内存。
性能强大、高度灵活的可编程IO可用于高速数字接口。
片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度。
支持MicroPython、C、C++编程。
(2)板上功能:
240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789。
四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制
板上外扩2MB Flash,预刷MicroPython的UF2固件。
一个红外接收管 + 一个红外发射管。
一个三轴姿态传感器MMA7660。
一个蜂鸣器。
双排16Pin连接器,有SPI、I2C以及2路模拟信号输入。
可以使用MicroPython、C、C++编程。
USB Type C连接器用于供电、程序下载。
图 2 RP2040实物图
四、实现功能
- 作为鼠标接入电脑(具体操作详见视频)
图 3 鼠功能示意图
- 作为lcd画板
图 4开机界面
图 5 lcd画板
五、主要代码
import uos
import machine
import st7789 as st7789
from fonts import vga2_8x8 as font1
from fonts import vga1_16x32 as font2
import random
import framebuf
from machine import Pin
import time
import hid
import usb_hid
move_left=-4
move_right=4
move_up=-4
move_down=4
stop = 0
control = machine.ADC(28) //选取通道
contro2 = machine.ADC(29) //选取通道
my=hid.Mouse() //实例化
h_value=1
w_value=1
high=110
wegiht=110
PB = Pin(5, Pin.IN, Pin.PULL_UP)//选取通道
PA = Pin(6, Pin.IN, Pin.PULL_UP)//选取通道
sta = Pin(7, Pin.IN, Pin.PULL_UP)//选取通道
while True:
adc = contro2.read_u16()
x_value = int(adc * (6553-3276)/0xffff) + 3276 //读取adc值
time.sleep(0.001)
adc = control.read_u16()
y_value = int(adc * (6553-3276)/0xffff) + 3276 //读取adc值
time.sleep(0.001)
my.__init__
//阈值判断
if(x_value<4900):
high=high-h_value
high=int (high)
my.move(move_left,stop)
if(x_value>5000):
high=high+h_value
high=int (high)
my.move(move_right,stop)
if(y_value<4800):
wegiht=wegiht-w_value
wegiht= int (wegiht)
my.move(stop,move_up)
if(y_value>4950):
wegiht=wegiht+w_value
wegiht= int (wegiht)
my.move(stop,move_down)
//画线
display.fill_rect(high,wegiht,5,5,st7789.BLACK)
if (PA.value()==0):
my.press(6)
while (PA.value()==0):
time.sleep(0.5)
my._send_no_move()
my.release(6)
if (PB.value()==0):
my.press(5)
while (PA.value()==0):
time.sleep(0.5)
my._send_no_move()
my.release(5)
//清屏
if (sta.value()==0):
display.fill(st7789.WHITE)
设置引脚进行模拟量采集,实现遥感对鼠标的控制,通过读取的模拟量值来判断不同的状态方向,引用usb_hid的库,实现鼠标的模拟。根据阈值判断和移动距离的设置,对鼠标进行操作。使能按键的引脚,调用usb_hid库对按键的操作进行处理,从而实现鼠标的操作。
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
print(uos.uname())
spi_sck=machine.Pin(2)
spi_tx=machine.Pin(3)
spi0=machine.SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
#
print(spi0)
display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)
display.fill(st7789.BLACK)
display.text(font2, "DRAWING", 40, 10)
display.text(font2, "READY?", 40, 50)
display.text(font2, "LET'S GO", 40, 120)
display.text(font2, "====>", 140, 180)
for i in range(2500):
display.pixel(random.randint(0, disp_width),
random.randint(0, disp_height),
st7789.color565(random.getrandbits(8),random.getrandbits(8),random.getrandbits(8)))
使用显示屏的驱动,然后设置一个界面,使能reset的端口,通过代码实现清屏函数,lcd画板的原理和鼠标一样,使用adc模拟采取,遥感控制,不断刷新屏幕实现画板的功能。
六、未来建议以及反思
可以使用键盘的函数,遥感控制特殊键值,例如crtl+c,crtl+v,做一个简易的小键盘。遇到困难,micropython编译不熟,语句使用经常出错。还是很高兴能参加这次寒假一起学活动,板卡也是不错的。