基于树莓派pico状态机的模拟鼠标
用状态机实现了一个菜单,基于树梅派pico的模拟鼠标,较好的实现了长按双击右键等功能,同时可以在树梅派pico的st7789的屏幕上流畅显示出鼠标的运动
标签
嵌入式系统
MicroPython
树梅派pico
2022寒假在家练
分享类
zzc
更新2022-03-07
北京理工大学
1910

基于树梅派pico的模拟鼠标,较好的实现了长按双击右键等功能,同时可以在树梅派pico的st7789的屏幕上显示出鼠标的运动,用状态机较好的实现了菜单的功能,通过菜单在PICO屏幕和PC屏幕之间转换

一 项目需求:

1利用板上的四向摇杆和按键设计一款“鼠标”

2在240*240的LCD屏幕内可以通过该鼠标进行菜单选择和参数控制(在屏幕上要有上图中图形化的箭头形状)

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

二 完成的功能及达到的性能

2.1 简易菜单显示

       上电后通过上下移动摇杆来选择菜单中的选项,目前设置了在PC上控制光标和在PICO上控制光标两个选项,包括按select键返回菜单初始页。

2.2 在PC上控制光标

       在PC上控制光标,实现了鼠标的功能,通过摇杆控制上下左右,通过B键模拟鼠标左键,可以实现双击,鼠标长按,多次点击以及拖拽,通过A键模拟鼠标右键

2.3 在PICO屏幕上控制光标

       插入了鼠标光标的图片,较为顺畅的实现了鼠标光标在小屏幕上的移动。

三 实现思路

3.1 状态机

       定义了status为0,1,2三种状态,

       当status为0,控制列表的选项并且控制仅在表单选项变化时刷屏:即所选择的色块变红,上一个色块则变回原来的蓝色。并且仅在status == 0 时允许转换到status1和status2。

       当status为1时,在PC屏幕上模拟鼠标。

       当status为2时,在PICO屏幕上显示鼠标光标。

四 实现过程

4.1 程序流程图:

FpG-Vg_AO1g1G4DOxo0BsmTg1EOi

4.2 刷屏控制

       不能在while循环里反复刷,这样会极大地占用板卡资源导致想完成的任务变得极卡。

       正确的刷屏方式是:仅在所控制变化发生的瞬间允许刷屏,即仅在if条件打成的瞬间刷屏。

       因此对于菜单来说:

if status == 0 :
        if (monitor_axis()[1]/1000-32.5) >1:
            exturn = turn
            turn += 1
            turn = turn%5
            exturn = exturn%5
            print(turn)
            Fturn()
            Fexturn()
        elif (monitor_axis()[1]/1000-32.5) < -2:
            exturn = turn
            turn -= 1
            turn = turn %5
            exturn = exturn%5
            print(turn)
            Fturn()
            Fexturn()
    if status == 0 and turn == 0 and monitor_axis()[3] == 0:
        status = 1
        display.fill(st7789.WHITE)
        display.text( font2, "WatchThePC", 20, 13, color=st7789.BLACK, background=st7789.RED)

对于PICO光标来说:

    if ball.prex != ball.x or ball.prey != ball.y:
        qingchu(int(ball.prex),int(ball.prey))
        xiehanshu(int(ball.x),int(ball.y))
def xiehanshu(x1,y1):               
    f_image = open(image_file0, 'rb')
    for column in range(y1,y1+10):
                buf=f_image.read(20)
                display.blit_buffer(buf, x1, column, 10, 1)

def qingchu(x1,y1):
    display.fill_rect( x1, y1, 10, 10, st7789.WHITE)

在pico光标中,我们储存了PICO光标的前一个位置

可以看到pico光标仅仅刷屏了光标刚刚移走的那一小块区域,将前一个位置对应的那一小块区域刷回了原来的颜色。

4.3 摇杆控制

       摇杆传感器本身有很大的数据零漂,返回值会在32800上下以1000的幅度摆动,因此我们必须对摇杆的返回值进行滤波:

def dxy_filter(x1,y1):
    if abs(x1/1000-32.5)+abs(y1/1000-32.5) >0.4:
        return [x1/1000-32.5,y1/1000-32.3]
    else:
        return [0,0]

 五 遇到的主要难题

5.1 中断

起初尝试自己写中断来捕获按键的状态,发现根本没有按照自己预想的工作,后来发现在button库中已经封装了相应的中断。

5.2 刷屏

       刷屏是在后期遇到的最大困难,起初我把整个刷屏放在while循环中,发现屏幕会像这样很卡而且很闪,而且问题在于我上传的鼠标的图片带有一个白边,由于PICO不支持显示透明度,因此无法把白边隐去。而且由于刷屏占用了很大一部分板卡资源,所以一切变得很卡。

FpAC0an-jaxz6jFXzKmS5MB0xbEr

解决方法:

1自己画线条画出一个鼠标,即st7789库中的line函数,刷屏前判定区域,仅刷屏该区域对应的小块。

 2 研究st7789的缓存,当鼠标移走后,用缓存中该区域对应的原有图像刷回原区域。

六 未来的计划建议

目前已经基本完成了鼠标对应项目一基本要求,达到了预期指标,然而在算法上还有许多可以提升和拓展的地方:

1 在PICO屏幕上增加小菜单界面。

2 通过多线程提升鼠标运动的流畅度以及菜单转换的流畅度。、

3 在菜单中添加其他功能如姿态传感器的屏幕显示

4 实现刷新率可控

软硬件
元器件
RP2040
树莓派基金会推出的双核Arm Cortex M0+微控制器,133MHz时钟速率,264KB SRAM,支持C/C++、MicroPython编程
MMA7660
重力感应传感器 - 3-Axis Orientation/Motion Detection Sensor
XT3406AFMR
XT3406 是一款由基准电压源、振荡电路、比较器、PWM/PFM 控制电路等构成的 CMOS 降压 DC/DC 调整器。利用 PWM/PFM 自动切换控制电路达到可调占空比,具有全输入电压范围(1.8-5.5V)内的低纹波、高效率和大输出电流等特点。
FJ08K-N
游戏摇杆电位计
Buzzer -蜂鸣器
一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
VSMB10940
高速红外发射二极管, 940 nm, GaAlAs, MQW
IRM-H638T
台湾亿光/EVERLIGHT公司的红外线接收头,贴片小尺寸压膜圆头封装,主要应用于遥控器的光检测部分
附件下载
MouseFinal.py
主文件
final.zip
文件包
团队介绍
张兆岑 北京理工大学信息与电子学院
团队成员
zzc
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号