基于树莓派rp2040实现控制电脑鼠标和LCD鼠标
通过树莓派控制电脑鼠标,实现和鼠标相同的功能,在树莓派lcd显示屏上显示鼠标,并能进行菜单选择和参数控制
标签
嵌入式系统
RP2040
2022寒假在家练
鼠标
电脑鼠标
Mewtwo
更新2022-03-03
东北林业大学
1428

1、项目介绍:

  能控制LCD和电脑界面的‘鼠标’:

  (1)利用板上的四向摇杆和按键设计一款‘鼠标’。

  (2)在240*240的LCD屏幕内可以通过该鼠标进行菜单选择和参数控制。

  (3)通过USB端口可以控制PC屏幕的光标移动和点击操作,行使电脑鼠标的功能。

2、设计思路:

FpT65Iwx1oMsaK0-2W6gkRse7AeS

主要设计思路为把所有功能集成到菜单中,在树莓派上显示,并用树莓派控制,在树莓派上可以进行控制设备的切换,从而实现控制电脑鼠标或者是树莓派上的LCD鼠标。在树莓派上的显示界面,可以进行菜单选择和参数调节。

对于LCD鼠标,实现思路是在屏幕上显示一个大小为20*20的鼠标图片,当移动鼠标时,改变图片的显示坐标,在新的坐标下重新显示即可。当需要进行参数调节时,此时获取图片坐标,而屏幕上会显示可调节的参数,以选项菜单的形式展示,各选项会占据一定的空间,此时比较坐标在哪个区域来确定选择哪个菜单,进而改变参数。

对于电脑鼠标控制,在uf2文件中内置usb_hid固件,树莓派需要刷入工程文件中的uf2文件,此时可通过调用usb_hid中的一些函数即可实现电脑鼠标的控制。

3、硬件介绍:

     使用树莓派RP2040

  • 采用树莓派Pico核心芯片RP2040:
    • 双核Arm Cortex M0+内核,可以运行到133MHz
    • 264KB内存
    • 性能强大、高度灵活的可编程IO可用于高速数字接口
    • 片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度
    • 支持MicroPython、C、C++编程
  • 板上功能:
    • 240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789
    • 四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制
    • 一个红外接收管 + 一个红外发射管
    • 一个三轴姿态传感器MMA7660
    • 一个蜂鸣器
    • 双排16Pin连接器,有SPI、I2C以及2路模拟信号输入
    • USB Type C连接器用于供电、程序下载

4、实现功能:

LCD鼠标:在树莓派lcd屏幕上显示一个图形化的鼠标形状,并能通过摇杆实现鼠标移动,从而进行菜单选择。

Fo17PRdqU3pSEwddZgvbBvgJkzcQ

菜单选择:程序最开始显示主菜单,最上方显示当前的菜单名称,最下方为当前的控制设备,主菜单上有两个选项,分别为mode和speed,移动鼠标,当鼠标移动到一个选项上时会高亮显示该选项,表示鼠标已选择,可按A键进入该选项的菜单,在子菜单界面中按B键返回主菜单。

FjTk1Bfz6IsQkBwI_VgXTBD0RGT_

参数调节:在主菜单界面上显示两个可调参数,移动鼠标到要调节的参数选项上,使其高亮显示,然后按A键进入该选项的子菜单界面。

mode选项为选择树莓派控制对象,RP为树莓派鼠标,PC为电脑鼠标,在主菜单最下方显示当前的控制设备,树莓派同时只能控制一个设备,当控制电脑鼠标时,长按select键可重新进入mode菜单,重新选择控制设备。

speed选项为调节鼠标的移动速度,改变速度时会同时改变电脑鼠标速度和树莓派鼠标速度,有两个备选速度可选择,快速和慢速,鼠标速度默认为slow。

Fh-yjzt-OVEkmS-rhqJdGJpObCyl

Fv2ywut-qNgiiUXy8DjcQhdL8D9n

控制电脑鼠标:需要先进入电脑模式,此时主菜单最下面会显示为PC,移动摇杆可以控制电脑鼠标移动,A按钮为鼠标右键,B按钮为鼠标左键,start按键为鼠标滚轮向上,select为鼠标滚轮向下,长按select键可进入mode子菜单,此时可以重新选择控制设备。

5、代码解释:

程序主要由四个文件组成:main.py、display.py、hid.py和joystick.py

display.py中以函数形式定义了所有菜单界面和显示方式

以主菜单为例,用一个函数来定义主菜单的样式,函数参数为控制选项是否高亮显示。

def mainmenu(highlight):
    display.text(font2, "MENU", 85, 0, st7789.BLACK, st7789.WHITE)
    display.text(font1, "CurrentMode:", 10, 200, st7789.BLACK, st7789.WHITE)
    display.hline(0, 41, 240, st7789.BLACK)
    display.hline(0, 81, 240, st7789.BLACK)
    display.hline(0, 121, 240, st7789.BLACK)
    if highlight == 1:
        display.fill_rect(65, 42, 175, 38, st7789.CYAN)
        display.text(font2, "Mode", 1, 45, st7789.BLACK, st7789.CYAN)
    else:
        display.fill_rect(65, 42, 175, 38, st7789.WHITE)
        display.text(font2, "Mode", 1, 45, st7789.BLACK, st7789.WHITE)
    if highlight == 2:
        display.fill_rect(80, 82, 160, 38, st7789.CYAN)
        display.text(font2, "Speed", 1, 85, st7789.BLACK, st7789.CYAN)
    else:
        display.fill_rect(80, 82, 160, 38, st7789.WHITE)
        display.text(font2, "Speed", 1, 85, st7789.BLACK, st7789.WHITE)

在主程序(main.py)中通过调用showback函数来显示各种菜单,通过提供backmode参数来选择在屏幕上要显示哪个菜单。

def showback(backmode, highlight):
    if backmode == 'main':
        display.text(font2, mode, 110, 185, st7789.BLACK, st7789.WHITE)
        mainmenu(highlight)
    if backmode == 'mode':
        modemenu(highlight)
    if backmode == 'speed':
        speedmenu(highlight)

joystick.py是用来读取树莓派上的摇杆和按钮。

get_xy函数用来获取摇杆的移动方向,通过读取adc的值并与摇杆静止时的值进行比较,来确定摇杆的移动方向,函数返回两个整数,正数表示正方向,负数表示负方向。

def get_xy():
    x=0
    y=0
    xValue1 = 31900
    yValue1 = 32500
    utime.sleep(0.01)
    xValue2 = xAxis.read_u16()
    yValue2 = yAxis.read_u16()
    if xValue2-xValue1>2000:
        x=1
    if xValue2-xValue1<-2000:
        x=-1
    if yValue2-yValue1>2000:
        y=1
    if yValue2-yValue1<-2000:
        y=-1
    return y, x

get_button函数用来获取按键是否被按下,当某按键被按下时返回0,否则返回1

def get_button():
    utime.sleep(0.01)
    return buttonA.value(), buttonB.value(), buttonSelect.value(), buttonStart.value()

hid.py用于控制电脑鼠标,该文件定义了一个类,该类中有所有控制电脑鼠标的方法

main.py为树莓派执行的文件,程序的核心。程序运行流程为在while循环中不断获取树莓派摇杆和按键的状态,然后通过if语句执行相应的操作。

获取摇杆和按钮值

    x_, y_ = get_xy()
    a, b, select, start = get_button()

根据摇杆的移动方向确定鼠标的移动方向,mode参数来判断当前的控制设备,当树莓派上的鼠标移动时,会先清除上一时刻的鼠标,然后重新显示菜单和新的鼠标。鼠标是以图片的形式显示的,因此当鼠标移动时,只需改变图片的显示坐标即可,而每次坐标改变的幅度就是鼠标的移动速度。

 if x_>0:
        if mode=='RP':
            display.blit_buffer(buffer_white, x, y, w, h)
            x += dx
            if x>220:
                x=220
            highlight = check()
            showback(backmode, highlight)
            display.blit_buffer(buffer_mouse, x, y, w, h)
        if mode=='PC':
            pcmouse.move(pcdx, 0, 0, 0)  

6、建议

当前树莓派LCD屏幕上显示的鼠标是一个鼠标图片,在非白背景上会显示出整个图片,使得鼠标不美观,因此需要改变鼠标的显示方式。

鼠标移动时,屏幕刷新太慢,鼠标闪烁严重,因此需提高刷新率,使得鼠标移动更流畅。

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