一.项目需求:
基于树莓派RP2040的嵌入式系统学习平台建立能控制LCD和电脑界面的“鼠标”
1.利用板上的四向摇杆和按键设计一款“鼠标”
2.在240*240的LCD屏幕内可以通过该鼠标进行菜单选择和参数控制(在屏幕上要有上图中图形化的箭头形状)
3.通过USB端口可以控制PC屏幕上的光标移动和点击操作,行使电脑鼠标的功能
软件:thonny(内置micro python)
硬件:rasberry pi RP2040 Game Kit
- 设计思路:
模拟鼠标分别需要在电脑端和树莓派上实现,创建开场动画病署名,在电脑端adc采样用摇杆电位差来实现鼠标移动,用接口函数实现左右键,用方向传感器实现滚轮,在树莓派端,用像素作图实现鼠标移动。
具体实现思路:
鼠标移动:摇杆位置由adc采集的电位与设定的中值电位的比较来判断,关联鼠标位置即给dx、dy赋值,其中使用函数是。
鼠标滚轮:通过机器自带水平仪输出的数据调整滚轮。
图形化显示:首先用新旧x、y坐标,用新坐标显示鼠标前,用旧坐标覆盖前一个坐标来达到刷新的效果。鼠标用正方形显示,,通过改变前后两矩形的色域参数来达到鼠标上色效果。
具体功能对应代码段:
- 创建开场动画病署名
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)
display.fill(st7789.BLACK)
display.text(font2, "easy mouse", 10, 50)
display.text(font2, "ZRH", 50, 100)
utime.sleep(1)
display.fill(st7789.BLACK)
- 电脑端用摇杆电位差来实现鼠标移动
if 30000<=xValue<= 35000:
dx = 0
else:
dx = int(speed * (xValue -32400)/32400)
if 30000<=yValue <= 35000:
dy = 0
else:
dy = int(speed * (yValue -32400)/32400)
用新旧图像位置刷新鼠标移动并去除轨迹。
def m_display():
global dplay_1
global dplay_2
display.fill_rect(dplay_1[0]*2, dplay_1[1]*2, 8, 8, st7789.color565(0, 0, 0))
display.fill_rect(dplay_2[0]*2, dplay_2[1]*2, 8, 8, st7789.color565(250, 0, 0))
display.fill_rect(dplay_2[0]*2+8, dplay_2[1]*2+8, 8, 8, st7789.color565(0, 0, 0))
dplay_1 = dplay_2[:]
return dplay_1
3.用方向传感器实现滚轮
for i in range(3):
r[i] = twos_compliment(d[i], 6)
if r[0] >= 20:
dv = 2
utime.sleep(0.01)
elif r[0] <=-20:
dv = -2
utime.sleep(0.01)
else:
dv = 0
dh=0
mouse.move(dx,dy,v=dv,h=dh)
4.实现鼠标左右键及选取
if buttonValue == 0:
mouse.press(2)
else:
mouse.release(2)
if button_b.value() == 0:
mouse.press(1)
else:
mouse.release(1)
- 遇到的主要难题:
1电脑与树莓派鼠标关联。不会调用库函数,不会刷固件,后明白usb_hid的固件及函数调用,利用hid驱动实现了鼠标的移动。
2 对python语言的学习。对于python的运用缺乏熟练度,经过反复尝试实现编写。
3 鼠标移动轨迹也显示。新旧鼠标地址中,新的赋值给后者,后者则显示为背景色消去轨迹。
- 未来的计划建议:
深入对pico的了解,学习各模块工作原理,从而在编译时能够得心应手。
更加深入学习python以及更多的代码,来加强自己的计算机语言的语感,减少编译时的错误和改善代码的计算速度和简洁性。
运用rp2040来做更多的项目以及拓展与一些功能,发挥出它应有的性能。