当前位置:   article > 正文

Micropython——九轴传感器(MPU6050)的使用及算法(一)_9轴传感器

9轴传感器

简介:

MPU-60X0是全球首例9轴运动处理传感器。集成了三轴加速度,三轴角速度,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor:数字运动处理器),能够通过I2C协议进行获取数据,并返回到电脑或者显示在OLED屏幕上,直观地表现出来。

MPU6050将使用I2C协议进行通讯,获取角速度、加速度以及温度数据,使用串口显示在电脑上。


 

1、硬件原理图以及实物图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

图一:硬件原理图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

 

图二:实物图MCU6050

2、如何连接及使用

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

 这里的XDA 和 XCL 作为次I2C接口,可以接磁力计等器件。这里我们未使用。

3、驱动文件

  • 使用I2C通信。
  • 检测到设备。
  • 定时读取加速度、角速度及温度数据。
  • 返回数据到单片机上。

陀螺仪数据输出寄存器(共6个寄存器,地址为0x43-0x48)

加速度传感器数据输出寄存器(6个,地址为0x3B-0x40)

温度传感器数据输出寄存器(0x41-0x42)

温度换算公式为    :Tem = 36.53  +  regval  /340

  1. import machine
  2. class accel():
  3. def __init__(self, i2c, addr=0x68):
  4. self.iic = i2c
  5. self.addr = addr
  6. self.iic.start()
  7. self.iic.writeto(self.addr, bytearray([107, 0]))
  8. self.iic.stop()
  9. def get_raw_values(self):
  10. self.iic.start()
  11. a = self.iic.readfrom_mem(self.addr, 0x3B, 14)
  12. self.iic.stop()
  13. return a
  14. def get_ints(self):
  15. b = self.get_raw_values()
  16. c = []
  17. for i in b:
  18. c.append(i)
  19. return c
  20. def bytes_toint(self, firstbyte, secondbyte):
  21. if not firstbyte & 0x80:
  22. return firstbyte << 8 | secondbyte
  23. return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)
  24. def get_values(self):
  25. raw_ints = self.get_raw_values()
  26. vals = {}
  27. vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1])
  28. vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3])
  29. vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5])
  30. vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53
  31. vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9])
  32. vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])
  33. vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])
  34. return vals # returned in range of Int16
  35. # -32768 to 32767
  36. def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC
  37. from time import sleep
  38. while 1:
  39. print(self.get_values())
  40. sleep(0.05)

关于程序的一些解释说明:

  • 0X68是I2C从机地址,0x69也是I2C从机地址,判断需要那个地址的时候是根据MPU_AD0时是悬空还是接VCC。接VCC时,地址是0X69,悬空或者接地时,地址是0X68


 


主程序:

  1. import mpu6050
  2. from machine import SoftI2C,Pin
  3. import utime
  4. i2c = SoftI2C(scl=Pin(7), sda=Pin(6))
  5. accel = mpu6050.accel(i2c)
  6. while True:
  7. accel_dict = accel.get_values()
  8. print(accel_dict)
  9. utime.sleep(3)

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAWGFfTA==,size_20,color_FFFFFF,t_70,g_se,x_16

今天只是简单地实现功能,下一篇文章将详细地讲解参数以及如何设置。 

 

 

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号