基于树莓派RP2040制作能控制LCD和电脑界面的“鼠标”
1.利用版上的四向摇杆和按键,通过USB端口可以控制PC屏幕上的光标移动和点击操作,行使电脑鼠标的功能 2.菜单的选择:速度控制并显示参数,模式转换 3.在LCD屏幕上显示鼠标的移动 4.灯效的改变 完整代码见附件
标签
嵌入式系统
MicroPython
2022寒假在家练
树莓派RP2040
thonny
cyz
更新2022-03-04
华北电力大学
785

一.项目介绍:

该项目是基于树莓派RP2040制作的能控制LCD和电脑界面的“鼠标”,使用micropython开发。实现的功能有:

1.利用版上的四向摇杆和按键,通过USB端口可以控制PC屏幕上的光标移动和点击操作,行使电脑鼠标的功能

Fmk75AvqUgeKU9Ea4dMyRGByDmQq

2.菜单的选择:速度控制并显示参数,模式转换

FoAdWPvNJvCxkk_zhMV02LRGXB6s

3.在LCD屏幕上显示鼠标的移动

FoTku4nIcvHZME9hfhQ1okkP0SD3

4.灯效的改变

Ft8-2oQDg3vJwaRiBDIPLy9Z9MtU

(p.s.视频里的MENU和wheel拼写有误,我已在附件的代码里更正)

二.设计思路:

Fuwl3W6mvV8ICL-gdoE2G6myOfSR

要先刷有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)
附件下载
mouse.py
项目报告.docx
mouse.zip
项目用到的库函数和鼠标图案的bin文件。包括mouse.py。
团队介绍
柴运泽 ,华北电力大学 大一,能源动力与机械工程专业。佛系摸鱼玩家
团队成员
cyz
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号