1 项目需求:能控制LCD和电脑界面的“鼠标”
利用板上的四向摇杆和按键设计一款“鼠标”
在240*240的LCD屏幕内可以通过该鼠标进行菜单选择和参数控制(在屏幕上要有上图中图形化的箭头形状)
通过USB端口可以控制PC屏幕上的光标移动和点击操作,行使电脑鼠标的功能
2 完成的功能及达到的性能
2.1 摇杆控制电脑鼠标
控制鼠标时,摇杆向上下左右四个方向之一移动时电脑鼠标与摇杆保持同步移动,当游戏机按动a键时,对应的电脑鼠标做出了单击右键的操作,当游戏机按动b键时,对应的电脑鼠标做出了单击左键的操作。
通过对代码的调试,目前已经可以较为流畅的通过摇杆去对电脑鼠标进行控制,并且可以成功用摇杆替代电脑实体鼠标。
2.2 鼠标图片导入以及菜单显示
通过预先保存鼠标的图片并且用image2lcd软件将鼠标的图片转换为pin格式,将其放到logo.bin的位置并录入板子,通过函数导入到板子中,菜单此次由于时间问题只做出了left和right。通过display.text函数来输出left与right。
2.3摇杆对lcd屏幕的控制
通过read读取事先转换好的的鼠标图片,并且建立循环,用joystick例程中反馈的数据为基础去构建if条件,判定摇杆的运动来实现图片不同位置的读取。在屏幕中来看则是摇杆控制屏幕鼠标的位置。(由图可见屏幕中鼠标的位置发生了移动)
3 实现思路
借助lcd例程导入鼠标的图片
通过joystick例程读取出摇杆与按键对应的值
通过if判断按动的摇杆方向或按键的值并作出对应操作
同时对lcd读取位置进行对应更改以达到在lcd屏幕与电脑屏幕同时移动鼠标的效果
判断读取的图片在lcd显示的位置,如果在left或right时鼠标对应向左或右移动
4 实现过程
4.1 程序流程图
4.2
import uos
import machine
import st7789 as st7789
from fonts import vga2_8x8 as font1
from fonts import vga1_16x32 as font2
import random
import framebuf
image_file0 = "shubiao.bin" #图片文件地址
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
print(uos.uname())
spi_sck=machine.Pin(2)
spi_tx=machine.Pin(3)
spi0=machine.SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
#
print(spi0)
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)
f_image = open(image_file0, 'rb')
for column in range(1,240):
buf=f_image.read(480)
display.blit_buffer(buf, 1, column,40, 1)
这段代码是将鼠标的图片导入lcd显示屏,用lcdtest的例程来导入,将图片转成pin格式并且存储到logo.bin文件,从而读取bin文件并输出到lcd屏幕上
import usb_hid
from machine import Pin, ADC
import utime
from hid import Mouse
Mouse=Mouse()
xAxis = ADC(Pin(28))
yAxis = ADC(Pin(29))
buttonB = Pin(5,Pin.IN, Pin.PULL_UP) #B
buttonA = Pin(6,Pin.IN, Pin.PULL_UP) #A
buttonStart = Pin(7,Pin.IN, Pin.PULL_UP)
buttonSelect = Pin(8,Pin.IN, Pin.PULL_UP)
while True:
xValue = xAxis.read_u16()
yValue = yAxis.read_u16()
buttonValueA = buttonA.value()
buttonValueB = buttonB.value()
buttonValueStart = buttonStart.value()
buttonValueSelect = buttonSelect.value()
if buttonValueA==0:
Mouse.click(Mouse.BUTTON_LEFT)
if buttonValueB==0:
Mouse.click(Mouse.BUTTON_RIGHT)
if 30000<xValue<40000&30000<yValue<40000:
_send_no_move(self)
if xValue<10000&30000<yValue<40000:
Mouse.move(x=0, y=-5, v=0, h=0)
if yValue<10000:
Mouse.move(x=-5, y=0, v=0, h=0)
if 60000<xValue:
Mouse.move(x=0, y= 5, v=0, h=0)
if 30000<xValue<40000&60000<yValue<70000:
Mouse.move(x= 5, y=0, v=0, h=0)
这段代码是对电脑鼠标的控制,用joystick的反馈值来判断具体移动的是哪个按键或摇杆从而根据不同按键的差异来进行不同的操作
i=10
j=10
k=10
while (k<10000):
xValue = xAxis.read_u16()
yValue = yAxis.read_u16()
buttonValueA = buttonA.value()
buttonValueB = buttonB.value()
buttonValueStart = buttonStart.value()
buttonValueSelect = buttonSelect.value()
if buttonValueA==0:
Mouse.click(Mouse.BUTTON_LEFT)
if buttonValueB==0:
Mouse.click(Mouse.BUTTON_RIGHT)
if xValue<10000:
Mouse.move(x=0, y=-15, v=0, h=0)
i=i-k
j=j
for column in range(1,240):
display.blit_buffer(buf,j, i,20, 40)
display.fill(st7789.BLACK)
display.text(font2, "left right", 20, 50)
if 40<j<60:
Mouse.move(x=-15, y=0, v=0, h=0)
if 170<j<190:
Mouse.move(x= 15, y=0, v=0, h=0)
if yValue<10000:
Mouse.move(x=-15, y=0, v=0, h=0)
j=j-k
i=i
for column in range( 1,240):
display.blit_buffer(buf,j , i,20, 40)
display.fill(st7789.BLACK)
display.text(font2, "left right", 20, 50)
if 40<j<60:
Mouse.move(x=-15, y=0, v=0, h=0)
if 170<j<190:
Mouse.move(x= 15, y=0, v=0, h=0)
if xValue>60000:
Mouse.move(x=0, y=15, v=0, h=0)
i=i+k
j=j
for column in range( 1,240):
display.blit_buffer(buf,j, i,20, 40)
display.fill(st7789.BLACK)
display.text(font2, "left right", 20, 50)
if 40<j<60:
Mouse.move(x=-15, y=0, v=0, h=0)
if 170<j<190:
Mouse.move(x= 15, y=0, v=0, h=0)
if yValue>60000:
Mouse.move(x= 15, y=0, v=0, h=0)
j=j+k
i=i
for column in range(1,240):
display.blit_buffer(buf,j, i,20,40)
display.fill(st7789.BLACK)
display.text(font2, "left right", 20, 50)
if 40<j<60:
Mouse.move(x=-15, y=0, v=0, h=0)
if 170<j<190:
Mouse.move(x= 15, y=0, v=0, h=0)
if 40000>yValue>30000:
for column in range(1,240):
display.blit_buffer(buf,j, i,20,40)
display.fill(st7789.BLACK)
display.text(font2, "left right", 20, 50)
if 40<j<60:
Mouse.move(x=-15, y=0, v=0, h=0)
if 170<j<190:
Mouse.move(x= 15, y=0, v=0, h=0)
这一段是对lcd以及电脑的鼠标进行判断操作的代码。
5 遇到的主要难题
由于对python不熟悉以及对项目库函数理解不到位,对于很多基本函数都没能做到很好的使用,在开始时由于不知道实例化调用等基本的功能写的代码漏洞百出,但在lucia老师认真负责的讲解下以及群中许多热心的大佬的帮助下,我渐渐理解了这个作业的真正意图以及如何去实现功能,后来在一次次调试与老师不厌其烦的讲解中完成了这个作业的大部分功能,也成功克服了对python的恐惧。
其次是由于判定条件写的过于冗余,导致程序执行起来很慢,并且很容易出现跳过某部分的情况,这时候我使用print逐步判断函数的执行情况,并最终锁定部分有问题的代码,简化了判定条件从而成功实现对鼠标的控制。
6 未来的计划建议
此次通过对rp2040的编码,实现了预定的大部分功能,但由于我个人对python的不熟练。lcd显示器菜单显示与参数选择的部分做的并不是很理想,在以后的改进中,我可以再对python进行学习,对我的lcd菜单显示以及参数选择部分进行完善,争取能实现更多的功能。
另外我的代码结合以后对鼠标的控制没有一开始流畅了,我做了两个代码的对比,但由于水平有限,并未发现原因,初步推断可能和刷新率有关但并未证实想法(目前暂未找到证明的办法),两个代码我会附在代码提交处