2473| 2
|
【试用测评】pinpong板——MPU6050控制pgzero角色 |
本帖最后由 云天 于 2021-4-29 17:18 编辑 【pinpong板】 拿到这块板子,挺喜欢,板子做工比较精致。布局紧凑,合理。各种常用传感器都有,如按键,光线、声音、陀螺仪、红外发发射接收、电位器、温湿。还有RGB灯、OLED显示屏。集成了2路电机驱动、WIFI,引出了Arduino所有端口,还有两IIC接口,一个UART接口。一个7.4V供电口。 【编辑环境】 基于Python编程,提供PinPong使用教程及大量的example,方便学习使用Python驱动硬件。我使用了Mind+的Python模式。 需要把Mind+的pinpong库更新到“pinpong-0.3.5-20210328”。 【测试准备】 1、在Mind+的python模式中安装pgzero库Pygame Zero ,是一个基于 Pygame 的游戏编程框架,他可以更容易的编辑游戏,无需模板,不用编写事件循环,也无需学习复杂的 Pygame API。 2、测试代码pgzero游戏代码 先了解一下常见的项目结构。pgzero的使用过程中,往往直接引用某些对象名称,而不给出全部的路径,那是因为它默认执行的脚本**.py所在目录具有固定的结构,典型的案例如下: 当程序需要创建一个以alien.png图片为对象的游戏角色时,ball = Actor("ball") 这个命令就会直接去找images文件夹,然后将它下面的ball.png图片导入进来,所以如果你的目录结构不符合这样的结构,就会报错喽。完整的游戏代码(测试用)
3、测试MPU6050代码
【完整代码】 其中,对于从MPU6050采集的数据进行一阶滤波。
【演示视频】 |
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("测试完成") |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed