ARDUINO从入门到创客带师⑧:利用MPU 9250做个水平仪和指南针
其实大多数时候这样的功能买个20块钱的手机装个软件就都有了,但是不是所有的时候都可以绑着手机上的是吧
前作:
用ESP8266 WIFI模块自制MP3
ARDUINO 6050 9250
首先不同模块之间每个模块规格都不一样的,从命名能看出来。就像CH340/CH341 CP210X一样,MPU6050 6500 6555 9150 9250 9255虽然都是加速度传感器,但是明显的就存在区别 常见的MPU6050是非常便宜的三轴陀螺仪 + 三轴加速度传感器模块,MPU-6000整合了3轴陀螺仪、3轴加速器,并含可藉由第二个I2C端口连接其他厂牌之加速器、磁力传感器、或其他传感器的数位运动处理(DMP: Digital Motion Processor)硬件加速引擎,它的成本通常不超过5块钱:
而这期我们用的MPU9250实际上是MPU6050加了别的传感器的胶水封装,但是价格就贵了很多:
MPU9150是只支持I2C的,MPU
9250
是支持SPI/I2C两种方式。里面的传感器也是不同的,MPU9150里面是MPU
6050
+AK8975,而MPU
9250
里面是MPU6500+AK8963,总之咱一开始出这个教程的动机其实很简单,就是因为咱不小心在插了9250模块的面包板上同时插了一个NODEMCU,结果上电之后NODEMCU炸了,所以咱很方,怕9250也跟着炸了,毕竟面包板里面都是直通的,结果就有了这期教程。事实证明它还行,没炸,所以省下了NODEMCU炸了无所谓,14包邮现在,MPU9250 20不包邮可还行,炸了损失快顶俩NODEMCU了
此外咱在插上之前有系统镜像的SD卡之后,树莓派PI0 W也点亮了,所以下期我们出点亮树莓派的教程的时候选型会有点更改,优先考虑之前有屏幕的3B
总之我们需要这样的一个模块和一个支持I²C的开发板,从51单片机到树莓派都行,这里我们用的还是ARDUINO
按正常的I²C定义把线接上就行了
6500 9205
MPU9250 ---> UNO
vcc-> 5v
接地->接地
SCL-> A5
SDA-> A4
对于其他开发板,请根据引脚定义图检查I²C引脚分配
至于需要的资料可以用全世界最好的搜索引擎去找
基本上商品介绍页的信息都是没啥问题的
MPU9250内部是MPU6050和AK8963两个芯片合并在一起的
MPU9250默认情况下MPU9250用它的I2C主机控制器与AK8963通信,把磁力值读到出放到指定的寄存器中,这需要设置一堆寄存器。好在MPU9250还集成了一个I2C主机控制器。这个模式相当于MPU9250和AK8963共同使用一条I2C总线,它们的通信地址不一样
实际操作上因为我们用的是ARDUINO所有库和项目代码都是开源且打包好的所以各位可以直接上
GITHUB
的项目下载你需要的所有资源,让我看看之前咱的教程的成果怎么样
前作:
ARDUINO环境库的安装和使用GITHUB上的开源项目
如果GITHUB上不去,可以用这个
备用链接
,但是我还是希望各位能会用GITHUB,因为它介绍的很全
总之我们需要安装好一个库,直接用ARDUINO把GUTHUB的ZIP当ZIP库安装就可以,然后打开例程,配置好串口驱动选定开发板所在串口,然后上传程序之后打开串口监视器,配置好波特率就可以看到传感器模块的实时返回信息了,就这么简单:
默认波特率是不对的,换个代码标注的波特率就行了
示例代码:
#include
#ifdef _ESP32_HAL_I2C_H_
#define SDA_PIN 21
#define SCL_PIN 22
#endif
MPU9250_asukiaaa mySensor;
float aX, aY, aZ, aSqrt, gX, gY, gZ, mDirection, mX, mY, mZ;
void setup() {
Serial.begin(115200);
while(!Serial);
Serial.println("started");
#ifdef _ESP32_HAL_I2C_H_ // For ESP32
Wire.begin(SDA_PIN, SCL_PIN);
mySensor.setWire(&Wire);
#endif
mySensor.beginAccel();
mySensor.beginGyro();
mySensor.beginMag();
// You can set your own offset for mag values
// mySensor.magXOffset = -50;
// mySensor.magYOffset = -55;
// mySensor.magZOffset = -10;
}
void loop() {
uint8_t sensorId;
if (mySensor.readId(&sensorId) == 0) {
Serial.println("sensorId: " + String(sensorId));
} else {
Serial.println("Cannot read sensorId");
}
if (mySensor.accelUpdate() == 0) {
aX = mySensor.accelX();
aY = mySensor.accelY();
aZ = mySensor.accelZ();