专栏名称: 失传技术研究所
失传技术研究所官方账号,专注各种技术原理讲解,科技制作
目录
相关文章推荐
成都本地宝  ·  成都居住证积分落户需要多少分?怎么申请? ·  昨天  
成都本地宝  ·  成都20个老年人免费的景点! ·  2 天前  
成都发布  ·  市十八届人大三次会议闭幕 ... ·  3 天前  
成都本地宝  ·  从成都坐高铁直达香港,需要港澳通行证吗? ·  4 天前  
51好读  ›  专栏  ›  失传技术研究所

ARDUINO从入门到创客带师8:水平仪与指南针

失传技术研究所  · 公众号  ·  · 2020-02-15 15:38

正文

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();







请到「今天看啥」查看全文