一.项目介绍:
该项目是基于树莓派RP2040制作的能控制LCD和电脑界面的“鼠标”,使用micropython开发。实现的功能有:
1.利用版上的四向摇杆和按键,通过USB端口可以控制PC屏幕上的光标移动和点击操作,行使电脑鼠标的功能
2.菜单的选择:速度控制并显示参数,模式转换
3.在LCD屏幕上显示鼠标的移动
4.灯效的改变
(p.s.视频里的MENU和wheel拼写有误,我已在附件的代码里更正)
二.设计思路:
要先刷有usb_hid的固件。
LCD上显示菜单,默认是PC上的鼠标模式,按下select键改变模式,可使用滚轮,此模式为“wheel”,并有呼吸灯灯效。并且LCD屏幕上会显示鼠标图案和它的移动情况,摇杆的运动会引起电位器数值的变化,用ADC采集点位,通过对它数值的判断,用hid库里的move函数让鼠标发生相对位移。我改变了这个相对位移的大小,所以它的速度可以变化;按下start键暂时显示主菜单,可以发现绿色框框移至下方change speed,让后出现该界面,改变了鼠标移动速度,相应参数会显示在LCD屏上。A或B按键按下时,灯会亮起;
三.硬件介绍:
- 使用ADC读取摇杆数值
- 使用SPI驱动显示屏
- 使用GPIO读取按键AB
- 使用240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789
- USB Type C连接器用于供电、程序下载
四.主要难题及解决方法:
主要难题 | 解决方法 |
刚入门,看不懂代码 | 学习python的基础知识,看micropython的库 |
对于官方仓库给出的函数不知道如何调用 | 问同学,查看hid,st7789等文件,查看群消息记录获取零碎知识 |
程序总是不安我的思路跑,比如我想让start键按下的时候返回MENU界面,但它总是卡在那儿 |
把自己想要达成的目的从主函数中抽取出来,再另开一个测试程序,写一个简单的print(“…”)或别的什么来测试,当自己想要的效果达到后,再按照同样的思路写到正式的代码里。这个思路帮了我很多,它使一些困难的事情变得更容易了。有时候程序报错我回去网上查找原因,基本上都能得到解决 |
如何让鼠标在LCD屏幕上显示并移动 |
我原先是想导入图片,然后再不断刷新背景,但这样发现它一直在闪。后来研究贪吃蛇的代码,想通过类似的移动方式来控制,但是它的代码比较多,修改对我这个新手来说也比较困难,所以我打算在st7789里自己添加一个由三角形和长方形组成的“鼠标”图形,然后局部刷新,但是效果不太好。后来还是采取了最初的方案...... |
五.未来的规划:
- 优化程序逻辑
- 让鼠标运动地更加自然;
- 检查有没有bug并改正。比如呼吸灯一开始不明显,过个几秒才正常
- 完善完鼠标的项目之后,我希望有时间能把所有的项目过一遍,看看别人是怎么写的代码,学习学习,提升自我。
- 值得一提的是,群里的很多大佬讨论的东西我都看不懂,希望能在将来的学习中弄懂那些知识,扩展自己的视野。
通过这次寒假练的活动,我接触到了python,在B站找到了很多相关资源,了解了行业行情,觉得学习python是前途宽广的,因此我将来会把重心放在学习python的更多知识上。
六,主要代码展示
用到的库函数
import usb_hid, uos, utime
import st7789 as st7789
from hid import Mouse
from machine import Pin, ADC, PWM
from fonts import vga1_16x32 as font1
from fonts import vga2_8x8 as font2
屏幕初始化
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)
#spi参数参考micropython官方介绍
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)
用官方提供的例程joystick.py,设置临界值
#可实现鼠标移动
#获取ADC摇杆上的数据
xValue = xAxis.read_u16()#^ dec,v inc
yValue = yAxis.read_u16()#<-dec,->inc
x=y=0
if xValue<15000:
y = -13
elif xValue>45000:
y = +13
elif yValue < 15000:
x = -13
elif yValue > 45000:
x = +13
m.move(x,y)
改变direction的大小可改变呼吸灯频率
#呼吸灯
duty += direction
if duty > 255:
duty = 255
direction = -10
elif duty < 0:
duty = 0
direction = 10
pwm.duty_u16(duty*duty)
鼠标图片的显示
mouse_image = open(image, 'rb')
buf = mouse_image.read(1152)
display.blit_buffer(buf, 110+h*80, 120-v*80, 24,24)
utime.sleep(0.01)
display.fill_rect(110+h*80,120-v*80,30,30,st7789.BLACK)
按键设为上拉模式,没有按下的时候是1,按下的时候是0
if buttonValueB==0:
m.press(m.BUTTON_LEFT)
elif buttonValueB==1:
m.release(m.BUTTON_LEFT)
if buttonValueA==0:
m.press(m.BUTTON_RIGHT)
elif buttonValueA==1:
m.release(m.BUTTON_RIGHT)