用树莓派RP2040制作鼠标
该项目基于树莓派RP2040的嵌入式系统,使用micropython编写,实现鼠标的功能。
标签
嵌入式系统
显示
USB
2022寒假在家练
maozi
更新2022-03-04
1005

项目总结报告 一、项目介绍

该项目基于树莓派RP2040的嵌入式系统,使用micropython编写,实现鼠标的功能。其功能如下:

  • 实现LCD交互页面,有速度调整页面,显示当前按键状态,模拟鼠标移动方向界面
  • 利用摇杆控制鼠标的移动方向,按键A、B来模拟鼠标的左右键的功能,以及不同的按键下不同的灯效
  • 通过usb端口实现与电脑的连接,映射板上的按键实现信息的传递

 

二、设计思路

  • 通过ADC来获取摇杆的电位变化来决定鼠标的位移量,通过映射来使鼠标进行移动
  • 通过按键触发后电位的变化来决定左右键的触发,通过映射实现鼠标的左右键
  • 通过LCD的打印函数来实现交互界面的设计

 

三、硬件介绍

树莓派Pico核心芯片RP2040:

  • 双核Arm Cortex M0+内核,可以运行到133MHz
  • 264KB内存
  • 性能强大、高度灵活的可编程IO可用于告诉数字接口
  • 片内温度传感器、并支持外部4路模拟信号输入,内部ADC采样率高达500Ksps、12位精度

板上功能:

1、240*240分辨率的色彩IPS LCD

  • 四向摇杆+2个轻触按键+一个三轴姿态传感器MMA7660用做输入控制
  • 有红外接受管+一个红外发射器
  • 一个三轴姿态传感器MMA7660
  • 一个蜂鸣器
  • 双排16Pin连接器,有SPI、I2C以及两路模拟信号输入

四、实现功能 1、主菜单

Fmsq25adgtRgxG2FtKiI1l01aQcn

def M():
    display.fill_rect(195,66,29,29,st7789.WHITE)
    time.sleep_ms(200)
    display.fill_rect(195,66,29,29,st7789.BLACK)
    time.sleep_ms(200)

def S():
    display.fill_rect(133,136,29,29,st7789.WHITE)
    time.sleep_ms(200)
    display.fill_rect(133,136,29,29,st7789.BLACK)
    time.sleep_ms(200)

def main():
    global b
    b = 1
    display.fill(st7789.BLACK)
    display.fill_rect(17,63,164,36,st7789.BLUE)
    display.text(font2, "MOUSE MODE",20,65,st7789.WHITE,st7789.BLUE)
    display.fill_rect(17,133,102,36,st7789.RED)
    display.text(font2, "SELECT",20,135,st7789.WHITE,st7789.RED)
    while True :
        x = joy_x.read_u16()
        a=int ((x - 32000)/28000)
        print(a)
        if a<0 :
            b = 1
        if a>0 :
            b = -1
        if b == 1 :
            M()
        if b == -1:
            S()
        if key_a.value() == 0 :
            if b == 1:
                mousemode_simple()
            if b == -1:
                SELECT()

这是主界面的函数,以及闪烁待选的两个函数,通过摇杆来更改b的值来进行对上下两项进行选中,按键a用来确定

2、速度选择

FrM5XTbfsSfFQUBSZOXykx7zRSeI

def SELECT():
    global b
    global speed
    b = speed
    display.fill(st7789.BLACK)
    display.text(font1, "SELECT",20,20,st7789.WHITE)
    display.text(font2, "speed",77,50,st7789.WHITE)
    display.text(font2, "1",30,100,st7789.WHITE)
    display.text(font2, "2",30,145,st7789.WHITE)
    display.text(font2, "3",30,190,st7789.WHITE)
    display.text(font2, "4",100,100,st7789.WHITE)
    display.text(font2, "5",100,145,st7789.WHITE)
    display.text(font2, "6",100,190,st7789.WHITE)
    display.text(font2, "7",170,100,st7789.WHITE)
    display.text(font2, "8",170,145,st7789.WHITE)
    display.text(font2, "9",170,190,st7789.WHITE)
    while True:
        x = joy_x.read_u16()
        y = joy_y.read_u16()
        a=int ((x - 32000)/28000)
        c=int ((y - 32000)/28000)
        if b<=0:
            b=1
        if b>=9:
            b=9
        if a>0:
            b=b+1
        if a<0:
            b=b-1
        if c>0:
            b=b+3
        if c<0:
            b=b-3
        select_speed(b)
        if key_a.value() == 0:
            speed = b
            display.text(font1, "SUCCESSFUL",150,20,st7789.WHITE)
            time.sleep_ms(400)
            display.fill_rect(80,20,150,20,st7789.BLACK)
        if key_b.value() == 0 :
            main ()

通过摇杆来改变b、c的值进行对速度的待选

def select_speed(num):
    numbers = {
        1 : one,
        2 : two,
        3 : three,
        4 : four,
        5 : five,
        6 : six,
        7 : seven,
        8 : eight,
        9 : nine
    }
    
    method = numbers.get(num)
    if method:
        method()

这个选择函数,通过传入的数值,进行对几个待选闪烁函数的调用

def nine():
    display.fill_rect(197,190,29,29,st7789.WHITE)
    time.sleep_ms(200)
    display.fill_rect(197,190,29,29,st7789.BLACK)
    time.sleep_ms(200)

这个大致的闪烁待选函数

3、显示模式

FqKQUk-oPMU36gndElqJwdeFZU-8

def mousemode_simple():
    global b
    b = 0
    display.fill(st7789.BLACK)
    display.text(font2, "Mode:",80,80,st7789.WHITE)
    display.text(font2, "CLICK",77,130,st7789.WHITE)
    while True:
        x = joy_x.read_u16()
        y = joy_y.read_u16()
        dx = int (speed * (x - 32000)/28000)
        dy = int (speed * (y - 32000)/28000)
        mouse.move(dy,dx,0,0)
        if key_a.value () == 0:
            global flag1
            time.sleep_ms(200)
            if key_a.value() == 1:
                if flag1 == 0 :
                    led.toggle()
                    display.text(font2, "CLICK",77,130,st7789.WHITE)
                    mouse.click(mouse.BUTTON_LEFT)
                    time.sleep_ms(100)
                    led.toggle()
                if flag1 == 1 :
                    tim1.init(mode=machine.Timer.ONE_SHOT, period=70, callback=Hold)
                    display.text(font2, "CLICK",77,130,st7789.WHITE)
            if key_a.value() == 0 :
                mouse.press(mouse.BUTTON_LEFT)
                led.toggle()
                display.fill_rect(75,130,100,35,st7789.BLACK)
                display.text(font2, "HOLD",85,130,st7789.WHITE)
                time.sleep_ms(200)
        if key_b.value () == 0:
            time.sleep_ms(200)
            if key_b.value () == 0:
                global flag2
                flag2=1
                led.toggle()
                display.text(font2, "SLIDE",77,130,st7789.WHITE)
                while key_b.value () == 0 :
                    x = joy_x.read_u16()
                    y = joy_y.read_u16()
                    dh = int ((x - 32000)/30000)
                    dv = int ((y - 32000)/30000)
                    mouse.move(0,0,dh,dv)
                tim2.init(mode=machine.Timer.ONE_SHOT, period=70, callback=Slide)
                display.text(font2, "CLICK",77,130,st7789.WHITE)
            if key_b.value () == 1 and flag2 == 0:
                led.toggle()
                display.text(font2, "CLICK",77,130,st7789.WHITE)
                mouse.click(mouse.BUTTON_RIGHT)
                time.sleep_ms(100)
                led.toggle()
        if key_select.value () == 0:
            SELECT()
        if key_star.value () == 0:
            mousemode_super()

这是显示模式下的整个函数,其中用adc来获取电位的变化,从而使鼠标进行移动,然后是模式上,单击a,b键是单击模式,映射鼠标的左右键,然后长按一段时间的a键然后松开,会进入hold模式,相当于鼠标左键的长按,这时可以进行拖动选择,再次单击a键可以回到点击模式,然后是长按b键会进入slide模式,相当于鼠标滚轮的作用,这时可以进行上下的滚动,松开b键回到单击模式,select键会快速进入到速度的选择模式,然后star键会进入鼠标模拟模式

 

4、模拟模式

FmkvUKLiwd7MZtye1CS0PrAW8Zxb

def mousemode_super ():
    display.fill(st7789.BLACK)
    while True :
        x = joy_x.read_u16()
        y = joy_y.read_u16()
        dx = int (speed * (x - 32000)/28000)
        dy = int (speed * (y - 32000)/28000)
        display.fill_rect(115+dy*12,115+dx*12,10,10,st7789.WHITE)
        mouse.move(dy,dx,0,0)
        time.sleep_ms(10)
        display.fill_rect(115+dy*12,115+dx*12,10,10,st7789.BLACK)
        dx=0
        dy=0
        if key_a.value () == 0:
            global flag1
            time.sleep_ms(200)
            if key_a.value() == 1:
                if flag1 == 0 :
                    led.toggle()
                    mouse.click(mouse.BUTTON_LEFT)
                    time.sleep_ms(100)
                    led.toggle()
                if flag1 == 1 :
                    tim1.init(mode=machine.Timer.ONE_SHOT, period=70, callback=Hold)
            if key_a.value() == 0 :
                led.toggle()
                mouse.press(mouse.BUTTON_LEFT)
                time.sleep_ms(200)
        if key_b.value () == 0:
            time.sleep_ms(200)
            if key_b.value () == 0:
                global flag2
                flag2=1
                led.toggle()
                while key_b.value () == 0 :
                    x = joy_x.read_u16()
                    y = joy_y.read_u16()
                    dh = int ((x - 32000)/30000)
                    dv = int ((y - 32000)/30000)
                    mouse.move(0,0,dh,dv)
                tim2.init(mode=machine.Timer.ONE_SHOT, period=70, callback=Slide)
            if key_b.value () == 1 and flag2 == 0:
                led.toggle()
                mouse.click(mouse.BUTTON_RIGHT)
                time.sleep_ms(200)
                led.toggle()
        if key_select.value () == 0:
                SELECT()
        if key_star.value () == 0:
                mousemode_simple()

模拟模式与显示模式的代码大致相同,将显示模式的代码部分进行了删除,添加了闪烁的光标,通过摇杆的电位变化,鼠标移动的同时,lcd上会显示鼠标移动的方向,伪模拟鼠标的移动

五、遇到的问题

  • 不熟悉python编程语言

解决方法:去学习了一些相关的基础知识

  • 对单片机原理和编程不太了解

解决方法:简单了学习51单片机的一些基础

  • 对于一些设计的想法没法实现

解决方法:在已有能力与基础上转换可以实现的方案

六、未来设计

  • 完善界面设计
  • 通过学习将之前的方案实现
附件下载
main.py
项目总结报告.docx
mouse.rar
团队介绍
戴雨豪 河北科技大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号