7299浏览
查看: 7299|回复: 5

[项目分享] 【智控万物】Microbit USB控制赛车游戏

[复制链接]
本帖最后由 云天 于 2021-2-15 17:35 编辑

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




【项目目的】

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

该项目使您可以使用micro:bit作为游戏控制器来控制PC游戏。
【项目准备】
【智控万物】Microbit USB控制赛车游戏图4


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


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


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

  1. def changeKeyState(key, value):
  2.     global keyboard_keys
  3.     #Change Only Neccessary
  4.     if value!=keyboard_keys.get(key, False):
  5.         if value:
  6.             keyboard.press(key)
  7.         else:
  8.             keyboard.release(key)
  9.     keyboard_keys[key] = value
复制代码
changeKeyState 是一项功能,它将帮助我们控制键盘键-例如,如果车把向左移动,它将按向左箭头键。
  1. micro.cal_compass()                                     #校准电子罗盘
  2. keyboard = Controller()
  3. #Set Accelerometer Values
  4. previous_values[0] = micro.get_accelerometer_X()
  5. previous_values[1] = micro.get_accelerometer_Y()
  6. previous_values[2] = micro.get_accelerometer_Z()
  7. keyboard_keys = {}
复制代码
校准电子罗盘,获取加速度计的X,Y,Z值。
  1. while 1:
  2.     #Blink
  3.     microbit.show_shape("heart")
  4.     time.sleep(0.5)
  5.     microbit.hide_all_lights()
  6.     #Start the Program if a Button is Pressed
  7.     if micro.buttonA_is_pressed() or micro.buttonB_is_pressed():
  8.         break
  9.     time.sleep(0.5)
复制代码
这是第一个循环。它将一直闪烁,直到用户按下A或B按钮。按下按钮后,控制器将开始运行。
  1. while 1:
  2.     #Get Accelerometer Values
  3.     accelerometer_values[0] = micro.get_accelerometer_X()
  4.     accelerometer_values[1] = micro.get_accelerometer_Y()
  5.     accelerometer_values[2] = micro.get_accelerometer_Z()
  6.     x = micro.get_accelerometer_X()
  7.     y = micro.get_accelerometer_Y()
  8.     z = micro.get_accelerometer_Z()
  9.     #Calculate Avarege Motion in X,Y,Z Directions
  10.     motion = sum(map(lambda i:abs(accelerometer_values[i]-previous_values[i]),range(3)))/3
复制代码
这是主循环。我们将从获取所需的值并计算运动开始。
  1.     changeKeyState(Key.up, y>400)
  2.     changeKeyState(Key.right, x>60)
  3.     changeKeyState(Key.left, x<-60)
  4.     changeKeyState(Key.shift, motion>500)
  5.     previous_values = accelerometer_values
复制代码
然后,我们将使用之前获得的信息来控制游戏。当Microbit向右或向左旋转高于特定值时,将触发键盘键。
【演示视频】

【完整代码】

  1. import time
  2. from pinpong.board import Board,MSensor,MScreen
  3. from pynput.keyboard import Key, Controller
  4. Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
  5. #Board("microbit","COM36").begin()   #windows下指定端口初始化
  6. #Board("microbit","/dev/ttyACM0").begin()   #linux下指定端口初始化
  7. #Board("microbit","/dev/cu.usbmodem14101").begin()   #mac下指定端口初始化
  8. micro = MSensor()
  9. microbit = MScreen()
  10. accelerometer_values=[0,0,0]
  11. previous_values=[0,0,0]
  12. def changeKeyState(key, value):
  13.     global keyboard_keys
  14.     #Change Only Neccessary
  15.     if value!=keyboard_keys.get(key, False):
  16.         if value:
  17.             keyboard.press(key)
  18.         else:
  19.             keyboard.release(key)
  20.     keyboard_keys[key] = value
  21. #changeKeyState 是一项功能,它将帮助我们控制键盘键-例如,如果车把向左移动,它将按向左箭头键。
  22. micro.cal_compass()                                     #校准电子罗盘
  23. keyboard = Controller()
  24. #Set Accelerometer Values
  25. previous_values[0] = micro.get_accelerometer_X()
  26. previous_values[1] = micro.get_accelerometer_Y()
  27. previous_values[2] = micro.get_accelerometer_Z()
  28. keyboard_keys = {}
  29. while 1:
  30.     #Blink
  31.     microbit.show_shape("heart")
  32.     time.sleep(0.5)
  33.     microbit.hide_all_lights()
  34.     #Start the Program if a Button is Pressed
  35.     if micro.buttonA_is_pressed() or micro.buttonB_is_pressed():
  36.         break
  37.     time.sleep(0.5)
  38. #这是第一个循环。它将一直闪烁,直到用户按下A或B按钮。按下按钮后,控制器将开始运行。
  39. #Start the Loop
  40. while 1:
  41.     #Get Accelerometer Values
  42.     accelerometer_values[0] = micro.get_accelerometer_X()
  43.     accelerometer_values[1] = micro.get_accelerometer_Y()
  44.     accelerometer_values[2] = micro.get_accelerometer_Z()
  45.     x = micro.get_accelerometer_X()
  46.     y = micro.get_accelerometer_Y()
  47.     z = micro.get_accelerometer_Z()
  48.     #Calculate Avarege Motion in X,Y,Z Directions
  49.     motion = sum(map(lambda i:abs(accelerometer_values[i]-previous_values[i]),range(3)))/3
  50.     #Change Direction
  51.     changeKeyState(Key.up, y>400)
  52.     changeKeyState(Key.right, x>60)
  53.     changeKeyState(Key.left, x<-60)
  54.     changeKeyState(Key.shift, motion>500)
  55.     #Set Current Accelerometer Values to Previous
  56.     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 ...

老师我运行报这个错误
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail