云天 发表于 2021-2-15 17:35:12

【智控万物】Microbit USB控制赛车游戏

本帖最后由 云天 于 2021-2-15 17:35 编辑





【项目目的】

该项目使您可以使用micro:bit作为游戏控制器来控制PC游戏。
【项目准备】



为了使代码正常工作,您需要在Mind+的Python模式下安装几个额外的Python模块:Pynput,“监视和控制用户输入设备”。 PinPong库,“允许您在PC / Mac / Linux / Raspberry Pi上的Python并直接与micro:bit交互”。
【代码解析】


from pinpong.board import Board,MSensor,MScreen我们需要导入模块以供以后使用。我们将使用3个模块;用于控制和读取micro:bit数据的pinpong模块,用于等待特定时间步长的time模块和用于控制键盘的pynput模块(当然还有游戏)。
Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
#Board("microbit","COM36").begin()   #windows下指定端口初始化
#Board("microbit","/dev/ttyACM0").begin()   #linux下指定端口初始化
#Board("microbit","/dev/cu.usbmodem14101").begin()   #mac下指定端口初始化

micro = MSensor() #Microbit板载传感器
microbit = MScreen()#Microbit屏幕
accelerometer_values=
previous_values=初始化
def changeKeyState(key, value):
    global keyboard_keys

    #Change Only Neccessary
    if value!=keyboard_keys.get(key, False):
      if value:
            keyboard.press(key)
      else:
            keyboard.release(key)

    keyboard_keys = valuechangeKeyState 是一项功能,它将帮助我们控制键盘键-例如,如果车把向左移动,它将按向左箭头键。
micro.cal_compass()                                     #校准电子罗盘

keyboard = Controller()
#Set Accelerometer Values
previous_values = micro.get_accelerometer_X()
previous_values = micro.get_accelerometer_Y()
previous_values = micro.get_accelerometer_Z()
keyboard_keys = {}校准电子罗盘,获取加速度计的X,Y,Z值。

while 1:
    #Blink
    microbit.show_shape("heart")
    time.sleep(0.5)
    microbit.hide_all_lights()

    #Start the Program if a Button is Pressed
    if micro.buttonA_is_pressed() or micro.buttonB_is_pressed():
      break
    time.sleep(0.5)
这是第一个循环。它将一直闪烁,直到用户按下A或B按钮。按下按钮后,控制器将开始运行。

while 1:
    #Get Accelerometer Values
    accelerometer_values = micro.get_accelerometer_X()
    accelerometer_values = micro.get_accelerometer_Y()
    accelerometer_values = micro.get_accelerometer_Z()
    x = micro.get_accelerometer_X()
    y = micro.get_accelerometer_Y()
    z = micro.get_accelerometer_Z()

    #Calculate Avarege Motion in X,Y,Z Directions
    motion = sum(map(lambda i:abs(accelerometer_values-previous_values),range(3)))/3

这是主循环。我们将从获取所需的值并计算运动开始。
    changeKeyState(Key.up, y>400)
    changeKeyState(Key.right, x>60)
    changeKeyState(Key.left, x<-60)
    changeKeyState(Key.shift, motion>500)
    previous_values = accelerometer_values

然后,我们将使用之前获得的信息来控制游戏。当Microbit向右或向左旋转高于特定值时,将触发键盘键。
【演示视频】
https://v.youku.com/v_show/id_XNTEwNDI0Nzc4MA==.html
【完整代码】

import time
from pinpong.board import Board,MSensor,MScreen
from pynput.keyboard import Key, Controller
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=
previous_values=
def changeKeyState(key, value):
    global keyboard_keys

    #Change Only Neccessary
    if value!=keyboard_keys.get(key, False):
      if value:
            keyboard.press(key)
      else:
            keyboard.release(key)

    keyboard_keys = value
#changeKeyState 是一项功能,它将帮助我们控制键盘键-例如,如果车把向左移动,它将按向左箭头键。


micro.cal_compass()                                     #校准电子罗盘


keyboard = Controller()
#Set Accelerometer Values
previous_values = micro.get_accelerometer_X()
previous_values = micro.get_accelerometer_Y()
previous_values = micro.get_accelerometer_Z()
keyboard_keys = {}

while 1:
    #Blink
    microbit.show_shape("heart")
    time.sleep(0.5)
    microbit.hide_all_lights()

    #Start the Program if a Button is Pressed
    if micro.buttonA_is_pressed() or micro.buttonB_is_pressed():
      break
    time.sleep(0.5)
#这是第一个循环。它将一直闪烁,直到用户按下A或B按钮。按下按钮后,控制器将开始运行。
#Start the Loop
while 1:
    #Get Accelerometer Values
    accelerometer_values = micro.get_accelerometer_X()
    accelerometer_values = micro.get_accelerometer_Y()
    accelerometer_values = micro.get_accelerometer_Z()
    x = micro.get_accelerometer_X()
    y = micro.get_accelerometer_Y()
    z = micro.get_accelerometer_Z()

    #Calculate Avarege Motion in X,Y,Z Directions
    motion = sum(map(lambda i:abs(accelerometer_values-previous_values),range(3)))/3
    #Change Direction

    changeKeyState(Key.up, y>400)
    changeKeyState(Key.right, x>60)
    changeKeyState(Key.left, x<-60)
    changeKeyState(Key.shift, motion>500)

    #Set Current Accelerometer Values to Previous
    previous_values = accelerometer_values




帅猫 发表于 2021-2-15 19:27:48

完美漂移!童年回忆(

w-l 发表于 2022-7-8 17:18:01

图形化编程可以做这个效果吗?Python代码还不会

云天 发表于 2022-7-11 21:14:56

w-l 发表于 2022-7-8 17:18
图形化编程可以做这个效果吗?Python代码还不会

暂时,我只能用Python实现

还的影子 发表于 2022-11-12 06:47:41

Traceback (most recent call last):
File "D:\编程\ptthon\shouping.py", line 3, in <module>
    from pinpong.board import Board,MSensor,MScreen
ImportError: cannot import name 'MSensor'
>>>

还的影子 发表于 2022-12-7 13:19:32

还的影子 发表于 2022-11-12 06:47
Traceback (most recent call last):
File "D:\编程\ptthon\shouping.py", line 3, in
    from pinpong ...

老师我运行报这个错误
页: [1]
查看完整版本: 【智控万物】Microbit USB控制赛车游戏