基于树梅派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 程序流程图:
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不支持显示透明度,因此无法把白边隐去。而且由于刷屏占用了很大一部分板卡资源,所以一切变得很卡。
解决方法:
1自己画线条画出一个鼠标,即st7789库中的line函数,刷屏前判定区域,仅刷屏该区域对应的小块。
2 研究st7789的缓存,当鼠标移走后,用缓存中该区域对应的原有图像刷回原区域。
六 未来的计划建议
目前已经基本完成了鼠标对应项目一基本要求,达到了预期指标,然而在算法上还有许多可以提升和拓展的地方:
1 在PICO屏幕上增加小菜单界面。
2 通过多线程提升鼠标运动的流畅度以及菜单转换的流畅度。、
3 在菜单中添加其他功能如姿态传感器的屏幕显示
4 实现刷新率可控