本帖最后由 云天 于 2021-2-17 23:28 编辑
【项目目的】
该项目使您可以使用micro:bit作为游戏控制器来控制PC射击游戏。
【项目准备】
使用pynput库中mouse库控制电脑鼠标
为了使代码正常工作,您需要在Mind+的Python模式下安装几个额外的Python模块:Pynput,“监视和控制用户输入设备”。 PinPong库,“允许您在PC / Mac / Linux / Raspberry Pi上的Python并直接与micro:bit交互”。
【代码解析】
- import time
- from pinpong.board import Board,MSensor,MScreen,Pin
- from pynput.mouse import Controller,Button
复制代码
我们需要导入模块以供以后使用。我们将使用3个模块;用于控制和读取micro:bit数据的pinpong模块,用于等待特定时间步长的time模块和用于控制键盘的pynput模块(当然还有PC射击游戏——使用网页版小游戏)。
- Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
- #Board("microbit","COM36").begin() #windows下指定端口初始化
- #Board("microbit","/dev/ttyACM0").begin() #linux下指定端口初始化
- #Board("microbit","/dev/cu.usbmodem14101").begin() #mac下指定端口初始化
-
- micro = MSensor()
- microbit = MScreen()
- accelerometer_values=[0,0,0]
- previous_values=[0,0,0]
- btn = Pin(Pin.P0, Pin.IN)
- mouse = Controller()
复制代码
程序初始化,按钮接在Microbit的P0引脚上。
- def btn_rising_handler(pin):#中断事件回调函数
- mouse.click(Button.left,1)
- btn.irq(trigger=Pin.IRQ_RISING, handler=btn_rising_handler) #设置中断模式为上升沿触发,及回调函数
复制代码
使用中断,按钮触发中断模拟鼠标点击左键
- micro.cal_compass() #校准电子罗盘
-
-
- #Set Accelerometer Values
- previous_values[0] = micro.get_accelerometer_X()
- previous_values[1] = micro.get_accelerometer_Y()
- x=previous_values[0]
- y=previous_values[1]
复制代码
校准电子罗盘,获取加速度计X,Y值
-
- while 1:
- #Get Accelerometer Values
- tem=0
- for i in range(40):
- tem=tem+micro.get_accelerometer_X()
- tem=int(tem/40) #使用平均值,滤掉干扰值,X轴
- accelerometer_values[0] = tem
- tem=0
- for i in range(40):
- tem=tem+micro.get_accelerometer_Y()
- tem=int(tem/40) #使用平均值,滤掉干扰值,Y轴
- accelerometer_values[1] = tem
-
- #position=format(mouse.position)
- #print(position)
- if abs(accelerometer_values[0]-previous_values[0])>8:#去除小抖动,X轴
- x = accelerometer_values[0]
- previous_values[0] = accelerometer_values[0]
-
- if abs(accelerometer_values[1]-previous_values[1])>8:#去除小抖动,Y轴
- y = accelerometer_values[1]
- previous_values[1] = accelerometer_values[1]
-
- if x<-700:
- x=-700
- if x>700:
- x=700
- if y<-400:
- y=-400
- if y>400:
- y=400
- xcord=int(((1366-0)/ (700 - (-700))) * (x - (-700)) + 0)#映射到屏幕大小,X轴
- ycord=int(((768-0) / (-400 - 400)) * (y-400 ) + 0) #映射到屏幕大小,Y轴
-
-
- mouse.position=(xcord, ycord)#移动鼠标指针
复制代码
主程序【演示视频】 【完整代码】 -
-
- # -*- coding: utf-8 -*-
-
- import time
- from pinpong.board import Board,MSensor,MScreen,Pin
- from pynput.mouse import Controller,Button
- import math
- Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
- #Board("microbit","COM36").begin() #windows下指定端口初始化
- #Board("microbit","/dev/ttyACM0").begin() #linux下指定端口初始化
- #Board("microbit","/dev/cu.usbmodem14101").begin() #mac下指定端口初始化
-
- micro = MSensor()
- microbit = MScreen()
- accelerometer_values=[0,0,0]
- previous_values=[0,0,0]
- btn = Pin(Pin.P0, Pin.IN)
- mouse = Controller()
-
- def btn_rising_handler(pin):#中断事件回调函数
- mouse.click(Button.left,1)
- btn.irq(trigger=Pin.IRQ_RISING, handler=btn_rising_handler) #设置中断模式为上升沿触发,及回调函数
- micro.cal_compass() #校准电子罗盘
-
-
- #Set Accelerometer Values
- previous_values[0] = micro.get_accelerometer_X()
- previous_values[1] = micro.get_accelerometer_Y()
- x=previous_values[0]
- y=previous_values[1]
-
-
-
- #Start the Loop
- while 1:
- #Get Accelerometer Values
- tem=0
- for i in range(40):
- tem=tem+micro.get_accelerometer_X()
- tem=int(tem/40)
- accelerometer_values[0] = tem
- tem=0
- for i in range(40):
- tem=tem+micro.get_accelerometer_Y()
- tem=int(tem/40)
- accelerometer_values[1] = tem
-
- #position=format(mouse.position)
- #print(position)
- if abs(accelerometer_values[0]-previous_values[0])>8:
- x = accelerometer_values[0]
- previous_values[0] = accelerometer_values[0]
-
- if abs(accelerometer_values[1]-previous_values[1])>8:
- y = accelerometer_values[1]
- previous_values[1] = accelerometer_values[1]
-
- if x<-700:
- x=-700
- if x>700:
- x=700
- if y<-400:
- y=-400
- if y>400:
- y=400
- xcord=int(((1366-0)/ (700 - (-700))) * (x - (-700)) + 0)
- ycord=int(((768-0) / (-400 - 400)) * (y-400 ) + 0)
-
-
- mouse.position=(xcord, ycord)
-
复制代码
|
|
|
|
|
|