基于树莓派RP2040嵌入式系统开发板制作的鼠标项目
本项目是在硬禾学堂上”2022年寒假在家一起练活动平台”上选择的“能控制LCD和电脑界面的‘鼠标’任务,经过一段时间的认真学习和努力,已经可以做到使用开发板上的功能键控制LCD屏幕上的鼠标指针并进行选择,并且可以控制电脑的鼠标指针。
标签
嵌入式系统
RP2040
2022寒假在家练
制作鼠标
Elegy
更新2022-03-02
北京理工大学
818

一、项目介绍

本项目是基于硬禾学堂发布的“2022寒假一起在家练“活动的“基于树莓派RP2040的嵌入式系统学习平台”,使用了推荐的MicroPython编程环境,经过认真学习和编写测试,最终完成了平台上的第一个任务,制作一款鼠标。本项目较为简单,只用到了摇杆方向键和A、B按键就可实现,项目是现过程中用到了鼠标图案的bin文件,以及驱动屏幕的文件st7789,同时还用到了用于显示文字的文件vga1_16x32,同时需要刷固件mpy-sge-pmrn-v20220118.uf2,最终成功完成。本次任务具体要求如下:

  1. 利用板上的四向摇杆和按键设计一款“鼠标”
  2. 在240*240的LCD屏幕内可以通过该鼠标进行菜单选择和参数控制(在屏幕上要有上图中图形化的箭头形状)
  3. 通过USB端口可以控制PC屏幕上的光标移动和点击操作,行使电脑鼠标的功能

上述功能均已通过代码实现。

二、硬件介绍

在此项目中,我使用了基于树莓派RP2040的嵌入式系统学习平台,没有外接插件,使用到的硬件为LCD屏幕,摇杆方向键,按键A和B,使用开源代码中的st7789驱动LCD屏幕,通过项目joystick中的方法,使用ADC和Pin分别读取摇杆方向键和A、B键的数据。

buttonA = Pin(6,Pin.IN,Pin.PULL_UP) 
buttonB = Pin(5,Pin.IN,Pin.PULL_UP) 
xAxis = ADC(Pin(29)) 
yAxis = ADC(Pin(28)) 

三、项目设计思路

在控制LCD屏幕上的鼠标指针时,首先要对LCD屏幕进行驱动,使其可以成功的显示想要的结果和选项菜单,然后采集摇杆方向键和A、B键的信息用来控制指针在LCD屏幕上的位置,同时通过判断鼠标指针所处的位置信息以及采集到的按键信息来决定是否选择菜单中的选项。在控制电脑指针时,如果摇杆方向键或A、B键的状态发生改变时,先采集对应硬件的信息,然后将变化的状态信息通过USB发送给电脑,当需要进行滚轮滑动操作时,同时按下A、B键进行切换。具体设计流程框图如下:

FkdR8_M5UmB6hoQGYtoxbkMBKANl

四、具体实现的功能

1、首先运行项目时,会载入硬禾学堂的logo,0.2秒后会载入测试界面

Fq7l-xax7selVQsgGpTHGXALYHhH

载入测试界面时,会检验方向摇杆键,A、B是否正常,只有A、B都被按下至少一次时,才会进入下一个界面,

if buttonA.value() == 0:
        testA = testA + 1
    if buttonB.value() == 0:
        testB = testB + 1
    if testA > 0 and testB > 0:
        testA = 0
        tsetB = 0
        break

效果如图:

FhIwKF3I4O7trEAQw3WbNZuuvmC2

2、确认功能键都正常后,会进入电脑端指针移动速度选择界面,此处具体是根据判断指针所处的位置信息来决定是否选择,在此处,我将整个屏幕分成了上、中、下三个区域,上部为指针速度为高速,中部为中速,下部为低速,进入此页面时默认指针选择中部区域,也就是中速,在此处及实现在LCD屏幕内可以通过鼠标进行菜单选择和参数控制

if buttonA.value() == 0 or buttonB.value() == 0:
        if i_y >= 40:
            spd = 5
            i_y = dety
            i_x = detx
            break
        if i_y <= -40:
            spd = 40
            i_y = dety
            i_x = detx
            break
        spd = 15
        i_y = dety
        i_x = detx
        break

效果如图:

FqFPNRCvcj5wyTeKEqUmJYdqgwFg

3,选择一个鼠标速度后,就可以通过板卡上的功能键来操纵电脑的鼠标,其中,摇杆方向键控制鼠标指针的移动,B、A键分别对应鼠标的左、右键,当A、B键同时按下时,可以通过摇杆方向键的上下来进行鼠标滚轮的滑动操作,而且,在对应鼠标操作时,LCD屏幕上会显示此时鼠标所处的状态。

三个状态效果分别如下:

单击:

FgeqzL7yNcR7xZ9ZcG_pBTOQWZOj

长按:

Fgr8AOfY5vur7R3-CnAJxuFDlvge

滚轮滑动:

FvW__vPEZ0XrUaSLhDaD1il6SSyN

具体效果请参照视频,照片所展现的效果有限,故此处仅展示部分效果图片,更多作说明。

五、遇到的主要问题以及解决办法

1,在项目开发时,我发现在LCD显示菜单并进行选择时,单纯的将摇杆方向发生的位移量作为鼠标指针的显示位置的话会使得松开方向键后让指针回到原来的初始位置,并且如果偏移量过大还会使得指针移出屏幕外,后来我将摇杆方向键的相对位移量改为对于LCD屏幕左边中部的一个点的相对位移量作为指针的显示位置,并且对其设定了范围,这样就解决了这个问题。

设定指针边界:

    if i_y >= 105:
        i_y = 105
    if i_y <=-105:
        i_y = -105
    if i_x >= 240:
        i_x = 240
    if i_x <= 0:
        i_x = 0

显示指针:

display.blit_buffer(shubiao_jpg, 0+i_x, 108+i_y, 24, 24)
utime.sleep_ms(20)
display.fill_rect(0+i_x,108+i_y,24,24,st7789.BLACK)

在指针显示后,经过20ms,在原本指针的位置显示一个可以包括指针且颜色与背景相同的像素块来刷新指针位置,避免指针移动后留下痕迹,i_x、i_y均是指针相对于屏幕一点的位移量。

2,在控制电脑指针时,我设计让鼠标的状态(单击、长按、滑动)显示在LCD屏幕上,但是将其放在判定鼠标状态的循环里时会导致电脑鼠标指针移动卡顿,询问群友得知这是由于在LCD屏幕显示文字的函数高频率刷新导致的,最后经过指点在循环外使用时间回调函数设定了一个定时器,在一定的时间内对鼠标状态进行判断,然后再打印状态信息,这样就避免了高刷新的问题,从而让鼠标移动和显示变得流畅。

def REFRESH(refresh):
     if buttonA.value() == 1 and buttonB.value() == 1:
        display.text(font, "click  ", 120, 100, st7789.RED, st7789.BLACK)
        refresh.deinit()
refresh = Timer()

六、自我总结以及未来的计划

1、本次项目的不足以及可以进一步开发之处

本人所作的项目还有更多可以开发完善的地方,比如可以外接一个距离传感器,通过完善代码可以做到像真正鼠标那样通过移动来控制指针而非摇杆方向,此外在移动鼠标指针时虽然已经可以做到较为流畅,但仔细发现还是会有些许卡顿,以后有时间可以进一步优化完善代码。

2、未来的计划

此次寒假在家一起练活动让我第一次接触了嵌入式系统以及树莓派开发板,这其中包含着许多的乐趣,让我十分着迷,看到交流群中的大佬们积极的交流着自己的思路和想法,让我也有了努力学习制作开发板项目的想法,未来我计划在正常课程学习之余投入一部分的时间和精力来制作一款掌机游戏在这个开发板上,让我体验游戏开发的乐趣以及制作开发板项目快乐。

(注:项目所用代码文件较多,附件中只上传三个主要文件,完整文件放在了百度网盘中,连接如下:链接:https://pan.baidu.com/s/1hr3e2-KBfChwepv4EP2XBA
提取码:y0cg)

附件下载
shubiao.py
主要代码
mouse.bin
光标文件
团队介绍
常文家,北京理工大学
团队成员
常文家
北京理工大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号