2473浏览
查看: 2473|回复: 2

【试用测评】pinpong板——MPU6050控制pgzero角色

[复制链接]
本帖最后由 云天 于 2021-4-29 17:18 编辑

【pinpong板】
拿到这块板子,挺喜欢,板子做工比较精致。布局紧凑,合理。各种常用传感器都有,如按键,光线、声音、陀螺仪、红外发发射接收、电位器、温湿。还有RGB灯、OLED显示屏。集成了2路电机驱动、WIFI,引出了Arduino所有端口,还有两IIC接口,一个UART接口。一个7.4V供电口。
【试用测评】pinpong板——MPU6050控制pgzero角色图1

【编辑环境】

基于Python编程,提供PinPong使用教程及大量的example,方便学习使用Python驱动硬件。我使用了Mind+的Python模式。

需要把Mind+的pinpong库更新到“pinpong-0.3.5-20210328”。

【测试准备】

1、在Mind+的python模式中安装pgzero库Pygame Zero ,是一个基于 Pygame 的游戏编程框架,他可以更容易的编辑游戏,无需模板,不用编写事件循环,也无需学习复杂的 Pygame API。
【试用测评】pinpong板——MPU6050控制pgzero角色图2

2、测试代码pgzero游戏代码
先了解一下常见的项目结构。pgzero的使用过程中,往往直接引用某些对象名称,而不给出全部的路径,那是因为它默认执行的脚本**.py所在目录具有固定的结构,典型的案例如下:
  1. .
  2. ├── images/
  3. │   └── ball.png
  4. └── main.py
复制代码
当程序需要创建一个以alien.png图片为对象的游戏角色时,ball = Actor("ball") 这个命令就会直接去找images文件夹,然后将它下面的ball.png图片导入进来,所以如果你的目录结构不符合这样的结构,就会报错喽。
【试用测评】pinpong板——MPU6050控制pgzero角色图3

完整的游戏代码(测试用)
  1. import pgzrun
  2. WIDTH = 1300
  3. HEIGHT = 600
  4. NUM = 3
  5. balls = []
  6. for i in range(NUM):
  7.     ball = Actor("ball")
  8.     ball.x = 50 * i + 100
  9.     ball.y = 100
  10.     ball.dx = 5 + i
  11.     ball.dy = 5 + i
  12.     balls.append(ball)
  13. def draw():
  14.     screen.fill((255,255,255))
  15.     for ball in balls:
  16.         ball.draw()
  17.    
  18. def update():
  19.     for ball in balls:
  20.         ball.x += ball.dx
  21.         ball.y += ball.dy
  22.         if ball.right > WIDTH or ball.left < 0:
  23.             ball.dx = - ball.dx
  24.         if ball.bottom > HEIGHT or ball.top < 0:
  25.             ball.dy = -ball.dy
  26.         
  27. pgzrun.go()
复制代码

【试用测评】pinpong板——MPU6050控制pgzero角色图4


3、测试MPU6050代码
  1. # -*- coding: utf-8 -*-
  2. #效果:打印检测到的加速度与角速度
  3. #接线:使用windows电脑连接一块arduino主控板
  4. import time
  5. from pinpong.board import Board
  6. from pinpong.libs.dfrobot_mpu6050 import MPU6050
  7. Board("PinPong Board").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
  8. accelgyro = MPU6050()
  9. accelgyro.init()
  10. if accelgyro.connection():
  11.     print("MPU6050 connection successful")
  12. else:
  13.     print("MPU6050 connection failed")
  14. while True:
  15.     buf = accelgyro.get_motion6()
  16.     print("ax:{} ay:{} az:{} gx:{} gy:{} gz:{}".format(buf[0], buf[1], buf[2],buf[3],buf[4],buf[5]))
  17.     time.sleep(0.5)
复制代码

【试用测评】pinpong板——MPU6050控制pgzero角色图5


【完整代码】
其中,对于从MPU6050采集的数据进行一阶滤波。
  1. # -*- coding: utf-8 -*-
  2. #效果:打印检测到的加速度与角速度
  3. #接线:使用windows电脑连接一块arduino主控板
  4. import time
  5. from math import *
  6. from pinpong.board import Board
  7. from pinpong.libs.dfrobot_mpu6050 import MPU6050
  8. import pgzrun
  9. K1 =0.05   # 对加速度计取值的权重
  10. dt=20*0.001  #注意:dt的取值为滤波器采样时间
  11. angle1=0.0
  12. Board("PinPong Board").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别
  13. accelgyro = MPU6050()
  14. accelgyro.init()
  15. if accelgyro.connection():
  16.     print("MPU6050 connection successful")
  17. else:
  18.     print("MPU6050 connection failed")
  19. WIDTH = 1300
  20. HEIGHT = 600
  21. ball = Actor("ball")
  22. ball.x = 650
  23. ball.y = 300
  24. def draw():
  25.     screen.fill((255,255,255))
  26.     ball.draw()
  27.    
  28. def update():
  29.     global K1 ,dt,angle1
  30.     buf = accelgyro.get_motion6()
  31.     ax=buf[0]
  32.     az=buf[2]
  33.     gy=buf[4]
  34.     angleAx=atan2(ax,az)*180/3.1415926 #加速度计算角度
  35.     gyroGy=-gy/131.00 #陀螺仪角速度,注意正负号与放置有关
  36.     #一阶互补滤波
  37.     angle1 = K1 * angleAx +(1-K1) * (angle1 +gyroGy * dt)
  38.     #print("ax:{} ay:{} az:{} gx:{} gy:{} gz:{}".format(buf[0], buf[1], buf[2],buf[3],buf[4],buf[5]))
  39.     print(angle1)
  40.     ball.x -= angle1
  41.     time.sleep(20*0.001)
  42. pgzrun.go()
复制代码

【演示视频】




云天  初级技神
 楼主|

发表于 2021-4-29 19:28:56

from pyphysicssandbox import *
# -*- coding: utf-8 -*-

#效果:打印检测到的加速度与角速度
#接线:使用windows电脑连接一块arduino主控板

import time
from math import *
from pinpong.board import Board
from pinpong.libs.dfrobot_mpu6050 import MPU6050

K1 =0.05   # 对加速度计取值的权重
dt=20*0.001  #注意:dt的取值为滤波器采样时间
angle1=0.0
Board("PinPong Board").begin()#初始化,选择板型和端口号,不输入端口号则进行自动识别

accelgyro = MPU6050()

accelgyro.init()

if accelgyro.connection():
    print("MPU6050 connection successful")
else:
    print("MPU6050 connection failed")


window("Python物理沙盒测试程序", 1024, 600)
gravity(0.0, 500.0)                     #  设定重力参数


floor       = static_rounded_box((0,570), 1024, 25, 3) # 最下面的地板,静止的
floor.color = Color('brown')
floor.friction=1.0 #摩擦力
floor.elasticity=0.5 #弹性

box2 = static_rounded_box((974,320), 50, 250, 5 ) # 右下品红色的圆角正方形
box2.color = Color('magenta')
box3 = static_rounded_box((0,320), 50, 250, 5 ) # 左下品红色的圆角正方形
box3.color = Color('magenta')

wheel1                 = ball((500, 130), 30)        
wheel1.color           = Color('green')
wheel1.draw_radius_line=True
wheel1.friction        = 0.25 #摩擦力
wheel1.elasticity=0.5 #弹性
wheel1.wrap  = False

wheel2                 = ball((600, 130), 30)        
wheel2.color           = Color('green')
wheel2.draw_radius_line=True
wheel2.friction        = 0.25 #摩擦力
wheel2.elasticity=0.5 #弹性
wheel2.wrap  = False

chassis=box((470,0),160,100)
chassis.color=Color("blue")

wheel2.elasticity=0.0 #弹性
pin((500,130),wheel1,(470,0),chassis)
pin((500,130),wheel1,(470,100),chassis)
pin((600,130),wheel2,(630,0),chassis)
pin((600,130),wheel2,(630,100),chassis)
while True:

    buf = accelgyro.get_motion6()
    ax=buf[0]
    az=buf[2]
    gy=buf[4]
    angleAx=atan2(ax,az)*180/3.1415926 #加速度计算角度
    gyroGy=-gy/131.00 #陀螺仪角速度,注意正负号与放置有关
    #一阶互补滤波
    angle1 = K1 * angleAx +(1-K1) * (angle1 +gyroGy * dt)
    #print("ax:{} ay:{} az:{} gx:{} gy:{} gz:{}".format(buf[0], buf[1], buf[2],buf[3],buf[4],buf[5]))
    print(angle1)
   
    motor(wheel1,angle1)
    motor(wheel2,angle1)
    time.sleep(20*0.001)
run()

print("测试完成")
回复

使用道具 举报

修远  见习技师

发表于 2021-5-7 12:37:08

赞,想法好新颖
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail