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

简介:

上篇文章中,关于九轴传感器(MPU6050),学习其如何对其生成的数据偏移进行校准,这节课我们来将其中的一个问题来进行解决。关于MPU6050地址问题,我们如何学习并判断是否是MPU6050


1、看其MPU6050的数据手册,发现下面这段文字

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWR1XzM5NjAzMjQ3,size_16,color_FFFFFF,t_70#pic_center

能够发现参数WHO_AM_I 是包含了MPU6050的6为I2C地址的,而其I2C地址是储存在0x75寄存器中。

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

图一:MPU6050实物图

 

对于MPU6050来说,I2C地址是判断AD0是悬空还是接VCC。接VCC时,地址是0X69,悬空或者接地时,地址是0X68。


代码程序:

# @Time    : 2022.4.20
# @Author  : Xa_L
# @FileName: I2C_MPU6050.py

from  machine  import I2C,Pin
#初始化I2C通道1 ,使用GPIO6和GPIO7 分别作为SDA 和SCL 引脚,频率为10KHZ
i2c = I2C(id = 1 ,scl = Pin(7) ,sda = Pin(6), freq = 1000000)
#扫描I2C总线下所有设备地址,并返回对应的列表
addr_list = i2c.scan()
print(addr_list)
print(addr_list[0])
if len(addr_list) == 1:
    #尝试读取该设备的0x75寄存器
    who = i2c.readfrom_mem(addr_list[0],0x75,1)
    print(who[0])
    #如果读取数值为0x68
    if  who[0] == 0x68:
        print("Just a MPU6050  connected")
    else:
        print("Have a device connected but it is not MPU6050")
elif  len(addr_list) == 0:
        print("Nothing connected")
else:
        print("More than one device is conneted ")

运行结果:

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

 这里我只写了连接的地址为0x68,读者可以自行重写程序看是否为其他设备。

也许有的读者会问为什么是104,不是0x68,其实这是因为十进制和十六进制的关系,所以这里对于进制不做讲解,可以去其他地方仔细进行了解。

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

 

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,需要将MPU6050连接到Arduino板上,并使用I2C通信协议读取传感器数据。然后,将Arduino与Unity连接,将传感器数据传递到Unity中。 以下是一些基本的步骤: 1. 连接MPU6050到Arduino 使用以下代码将MPU6050连接到Arduino: #include<Wire.h> const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); Tmp=Wire.read()<<8|Wire.read(); GyX=Wire.read()<<8|Wire.read(); GyY=Wire.read()<<8|Wire.read(); GyZ=Wire.read()<<8|Wire.read(); Serial.print("Accelerometer: "); Serial.print("X="); Serial.print(AcX); Serial.print(" Y="); Serial.print(AcY); Serial.print(" Z="); Serial.println(AcZ); Serial.print("Gyroscope: "); Serial.print("X="); Serial.print(GyX); Serial.print(" Y="); Serial.print(GyY); Serial.print(" Z="); Serial.println(GyZ); Serial.println(); delay(500); } 2. 将传感器数据发送到Unity 使用以下代码将传感器数据发送到Unity: #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX const int MPU_addr=0x68; int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup(){ Wire.begin(); Wire.beginTransmission(MPU_addr); Wire.write(0x6B); Wire.write(0); Wire.endTransmission(true); Serial.begin(9600); mySerial.begin(9600); } void loop(){ Wire.beginTransmission(MPU_addr); Wire.write(0x3B); Wire.endTransmission(false); Wire.requestFrom(MPU_addr,14,true); AcX=Wire.read()<<8|Wire.read(); AcY=Wire.read()<<8|Wire.read(); AcZ=Wire.read()<<8|Wire.read(); Tmp=Wire.read()<<8|Wire.read(); GyX=Wire.read()<<8|Wire.read(); GyY=Wire.read()<<8|Wire.read(); GyZ=Wire.read()<<8|Wire.read(); String data = "Accelerometer:" + String(AcX) + "," + String(AcY) + "," + String(AcZ) + "; Gyroscope:" + String(GyX) + "," + String(GyY) + "," + String(GyZ) + ";"; mySerial.println(data); Serial.println(data); delay(500); } 3. 在Unity中接收传感器数据 使用以下代码在Unity中接收传感器数据: using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO.Ports; public class Arduino : MonoBehaviour { public SerialPort serialPort = new SerialPort("COM4", 9600); public string[] sensorData; void Start () { serialPort.Open(); } void Update () { if (serialPort.IsOpen) { string data = serialPort.ReadLine(); sensorData = data.Split(';'); } } } 以上是一些基本的步骤,你可以根据自己的需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xa_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值