查看: 124|回复: 1

[项目分享] 【智控万物】Microbit控制PC射击游戏

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

IMG_20210217_141303.jpg


【项目目的】

WedFebruary-202102177638..png

该项目使您可以使用micro:bit作为游戏控制器来控制PC射击游戏。

2.gif

【项目准备】

WedFebruary-202102174248..png

使用pynput库中mouse库控制电脑鼠标

WedFebruary-202102174175..png

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

【代码解析】

  1. import time
  2. from pinpong.board import Board,MSensor,MScreen,Pin
  3. from pynput.mouse import Controller,Button
复制代码
我们需要导入模块以供以后使用。我们将使用3个模块;用于控制和读取micro:bit数据的pinpong模块,用于等待特定时间步长的time模块和用于控制键盘的pynput模块(当然还有PC射击游戏——使用网页版小游戏)。

  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()
  6. microbit = MScreen()
  7. accelerometer_values=[0,0,0]
  8. previous_values=[0,0,0]
  9. btn = Pin(Pin.P0, Pin.IN)
  10. mouse = Controller()
复制代码
程序初始化,按钮接在Microbit的P0引脚上。

  1. def btn_rising_handler(pin):#中断事件回调函数
  2.     mouse.click(Button.left,1)
  3. btn.irq(trigger=Pin.IRQ_RISING, handler=btn_rising_handler) #设置中断模式为上升沿触发,及回调函数
复制代码
使用中断,按钮触发中断模拟鼠标点击左键

  1. micro.cal_compass()                                     #校准电子罗盘
  2. #Set Accelerometer Values
  3. previous_values[0] = micro.get_accelerometer_X()
  4. previous_values[1] = micro.get_accelerometer_Y()
  5. x=previous_values[0]
  6. y=previous_values[1]
复制代码
校准电子罗盘,获取加速度计X,Y值


  1. while 1:
  2.     #Get Accelerometer Values
  3.     tem=0
  4.     for i in range(40):
  5.         tem=tem+micro.get_accelerometer_X()
  6.     tem=int(tem/40)                                          #使用平均值,滤掉干扰值,X轴
  7.     accelerometer_values[0] = tem
  8.     tem=0
  9.     for i in range(40):
  10.         tem=tem+micro.get_accelerometer_Y()
  11.     tem=int(tem/40)                                        #使用平均值,滤掉干扰值,Y轴
  12.     accelerometer_values[1] = tem
  13.     #position=format(mouse.position)
  14.     #print(position)
  15.     if abs(accelerometer_values[0]-previous_values[0])>8:#去除小抖动,X轴
  16.        x = accelerometer_values[0]
  17.        previous_values[0] = accelerometer_values[0]
  18.     if abs(accelerometer_values[1]-previous_values[1])>8:#去除小抖动,Y轴
  19.        y = accelerometer_values[1]
  20.        previous_values[1] = accelerometer_values[1]
  21.     if x<-700:
  22.        x=-700
  23.     if x>700:
  24.        x=700
  25.     if y<-400:
  26.        y=-400
  27.     if y>400:
  28.        y=400   
  29.     xcord=int(((1366-0)/ (700 - (-700))) * (x - (-700)) + 0)#映射到屏幕大小,X轴
  30.     ycord=int(((768-0) / (-400 - 400)) * (y-400 ) + 0)       #映射到屏幕大小,Y轴
  31.     mouse.position=(xcord, ycord)#移动鼠标指针
复制代码
主程序
【演示视频】
【完整代码】
  1. # -*- coding: utf-8 -*-
  2. import time
  3. from pinpong.board import Board,MSensor,MScreen,Pin
  4. from pynput.mouse import Controller,Button
  5. import math
  6. Board("microbit").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
  7. #Board("microbit","COM36").begin()   #windows下指定端口初始化
  8. #Board("microbit","/dev/ttyACM0").begin()   #linux下指定端口初始化
  9. #Board("microbit","/dev/cu.usbmodem14101").begin()   #mac下指定端口初始化
  10. micro = MSensor()
  11. microbit = MScreen()
  12. accelerometer_values=[0,0,0]
  13. previous_values=[0,0,0]
  14. btn = Pin(Pin.P0, Pin.IN)
  15. mouse = Controller()
  16. def btn_rising_handler(pin):#中断事件回调函数
  17.   mouse.click(Button.left,1)
  18. btn.irq(trigger=Pin.IRQ_RISING, handler=btn_rising_handler) #设置中断模式为上升沿触发,及回调函数
  19. micro.cal_compass()                                     #校准电子罗盘
  20. #Set Accelerometer Values
  21. previous_values[0] = micro.get_accelerometer_X()
  22. previous_values[1] = micro.get_accelerometer_Y()
  23. x=previous_values[0]
  24. y=previous_values[1]
  25. #Start the Loop
  26. while 1:
  27.     #Get Accelerometer Values
  28.     tem=0
  29.     for i in range(40):
  30.         tem=tem+micro.get_accelerometer_X()
  31.     tem=int(tem/40)
  32.     accelerometer_values[0] = tem
  33.     tem=0
  34.     for i in range(40):
  35.         tem=tem+micro.get_accelerometer_Y()
  36.     tem=int(tem/40)
  37.     accelerometer_values[1] = tem
  38.     #position=format(mouse.position)
  39.     #print(position)
  40.     if abs(accelerometer_values[0]-previous_values[0])>8:
  41.        x = accelerometer_values[0]
  42.        previous_values[0] = accelerometer_values[0]
  43.     if abs(accelerometer_values[1]-previous_values[1])>8:
  44.        y = accelerometer_values[1]
  45.        previous_values[1] = accelerometer_values[1]
  46.     if x<-700:
  47.        x=-700
  48.     if x>700:
  49.        x=700
  50.     if y<-400:
  51.        y=-400
  52.     if y>400:
  53.        y=400   
  54.     xcord=int(((1366-0)/ (700 - (-700))) * (x - (-700)) + 0)
  55.     ycord=int(((768-0) / (-400 - 400)) * (y-400 ) + 0)
  56.     mouse.position=(xcord, ycord)
复制代码



hnyzcj  版主

发表于 2021-2-18 06:31:38

这枪做的真gun
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail