赞
踩
【注】部分模块可以在Pypi网站上下载
- import threading
- import Adafruit_PCA9685
- from mpu6050 import mpu6050
- import time,math,queue
- import MPU6050filter
-
- my_queue = queue.Queue()
-
-
-
- def t_mpu6050():
- sensor = mpu6050(address=0x68) # 设备地址
- sensor.set_accel_range(mpu6050.ACCEL_RANGE_16G) # 设置加速度计的量程
- sensor.set_gyro_range(mpu6050.GYRO_RANGE_2000DEG) # 设置陀螺仪的量程
-
- while 1:
- accel_data = sensor.get_accel_data() # 读取加速度计x,y,z ,返回是字典
- gyro_data = sensor.get_gyro_data() # 读取陀螺仪的x,y,z, 返回是字典
-
- # 四元素转欧拉角
- rotation = MPU6050filter.IMUupdate(accel_data['x'],accel_data['y'],accel_data['z'],
- gyro_data['x'],gyro_data['y'],gyro_data['z'])
-
- # 如果队列为空,则存入一个角度(我想用偏航角来控制舵机),保证只存一个角度在队列里
- if my_queue.empty():
- my_queue.put(rotation['Yaw'])
- print(rotation['Yaw'])
-
- time.sleep(0.1) # 设置一个延时,可以让它不那么灵敏
-
-
- def t_servo():
- pwm = Adafruit_PCA9685.PCA9685() # 创建一个实例
- pwm.set_pwm_freq(50) # 设置pwm的周期频率
-
- # 将输入的角度,转换成PCA9685的数值(12位精度)
- def set_servo_angle(channel, angle):
- date = 4096 * ((angle * 11) + 500) / 20000
- pwm.set_pwm(channel, 0, int(date))
-
- #循环接收队列里的角度
- while 1:
- if not my_queue.empty():
- get_x = my_queue.get()
- get_x = 90 + get_x # 90度为基础角,为了可以左右摆动
- set_servo_angle(0, get_x) # 设置通道0的舵机转向
-
-
- def main():
- # 创建线程
- Tmpu6050 = threading.Thread(target=t_mpu6050)
- Tservo = threading.Thread(target=t_servo)
-
- # 开始线程
- Tmpu6050.start()
- Tservo.start()
-
-
- Tmpu6050.join()
- Tservo.join()
-
-
-
- if __name__ == "__main__":
- main()
-
-
-
如果只想简单地获取 翻滚角和俯仰角
可以使用如下程序:
- def dist(a, b):
- return math.sqrt((a*a) + (b*b))
-
- def get_x_rotation(x,y,z):
- try:
- radians = math.atan(x / dist(y,z))
- return math.degrees(radians)
- except ZeroDivisionError:
- print("error!")
- return -1
-
- def get_y_rotation(x,y,z):
- try:
- radians = math.atan(y/dist(x,y))
- return math.degrees(radians)
- except ZeroDivisionError:
- print("error!")
- return -1
-
-
-
- # 如获取翻滚角
- accel_data = sensor.get_accel_data()
- x = get_x_rotation(accel_data['x'],accel_data['y'],accel_data['z'])
1、读取的角度
2、舵机接入5V, 最大电流的峰值为1.4A
3、频繁移动MPU6050时,突然读取的数据全为0....我怀疑是杜邦线的问题,出现了很多次这种情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。