创作立场声明:其实大多数时候这样的功能买个20块钱的手机装个软件就都有了,但是不是所有的时候都可以绑着手机上的是吧 ARDUINO从入门到创客带师⑧:利用MPU 9250做个水平仪和指南针 用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的,MPU9250是支持SPI/I2C两种方式。里面的传感器也是不同的,MPU9150里面是MPU6050+AK8975,而MPU9250里面是MPU6500+AK8963,总之咱一开始出这个教程的动机其实很简单,就是因为咱不小心在插了9250模块的面包板上同时插了一个NODEMCU,结果上电之后NODEMCU炸了,所以咱很方,怕9250也跟着炸了,毕竟面包板里面都是直通的,结果就有了这期教程。事实证明它还行,没炸,所以省下了NODEMCU炸了无所谓,14包邮现在,MPU9250 20不包邮可还行,炸了损失快顶俩NODEMCU了 此外咱在插上之前有系统镜像的SD卡之后,树莓派PI0 W也点亮了,所以下期我们出点亮树莓派的教程的时候选型会有点更改,优先考虑之前有屏幕的3B 总之我们需要这样的一个模块和一个支持I2C的开发板,从51单片机到树莓派都行,这里我们用的还是ARDUINO 按正常的I2C定义把线接上就行了 6500 9205 MPU9250 ---> UNO vcc-> 5v 接地->接地 SCL-> A5 SDA-> A4 对于其他开发板,请根据引脚定义图检查I2C引脚分配 至于需要的资料可以用全世界最好的搜索引擎去找 基本上商品介绍页的信息都是没啥问题的 MPU9250内部是MPU6050和AK8963两个芯片合并在一起的 MPU9250默认情况下MPU9250用它的I2C主机控制器与AK8963通信,把磁力值读到出放到指定的寄存器中,这需要设置一堆寄存器。好在MPU9250还集成了一个I2C主机控制器。这个模式相当于MPU9250和AK8963共同使用一条I2C总线,它们的通信地址不一样 实际操作上因为我们用的是ARDUINO所有库和项目代码都是开源且打包好的所以各位可以直接上GITHUB的项目下载你需要的所有资源,让我看看之前咱的教程的成果怎么样 前作:ARDUINO环境库的安装和使用GITHUB上的开源项目 如果GITHUB上不去,可以用这个备用链接,但是我还是希望各位能会用GITHUB,因为它介绍的很全 总之我们需要安装好一个库,直接用ARDUINO把GUTHUB的ZIP当ZIP库安装就可以,然后打开例程,配置好串口驱动选定开发板所在串口,然后上传程序之后打开串口监视器,配置好波特率就可以看到传感器模块的实时返回信息了,就这么简单: 默认波特率是不对的,换个代码标注的波特率就行了 示例代码: #include <MPU9250_asukiaaa.h> #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(); aSqrt = mySensor.accelSqrt(); Serial.println("accelX: " + String(aX)); Serial.println("accelY: " + String(aY)); Serial.println("accelZ: " + String(aZ)); Serial.println("accelSqrt: " + String(aSqrt)); } else { Serial.println("Cannod read accel values"); } if (mySensor.gyroUpdate() == 0) { gX = mySensor.gyroX(); gY = mySensor.gyroY(); gZ = mySensor.gyroZ(); Serial.println("gyroX: " + String(gX)); Serial.println("gyroY: " + String(gY)); Serial.println("gyroZ: " + String(gZ)); } else { Serial.println("Cannot read gyro values"); } if (mySensor.magUpdate() == 0) { mX = mySensor.magX(); mY = mySensor.magY(); mZ = mySensor.magZ(); mDirection = mySensor.magHorizDirection(); Serial.println("magX: " + String(mX)); Serial.println("maxY: " + String(mY)); Serial.println("magZ: " + String(mZ)); Serial.println("horizontal direction: " + String(mDirection)); } else { Serial.println("Cannot read mag values"); } Serial.println("at " + String(millis()) + "ms"); Serial.println(""); // Add an empty line delay(500); } 用同样的方法可以读取MPU9250磁传感器的绝对值,并且可以利用别的项目来做指南针。至于水平仪可以到正点原子找开源的代码。这里我们也可以提供一个备用连接。 这个模块实际上的功能是异常强悍的,有了这个模块你甚至可以做惯性导航,无人机、火箭之类的都可以造了。总之我不再说了,ARDUINO玩好了未来的潜力是不可限量的,各位自己领会吧。 |
香港服务器多少钱一个月?哪家的香港服务器
4核4g6M50G盘20G防御云服务器价格多少钱?T
特发集团与华为签署全面合作协议
【身边的AI】高空抛物智能追溯解决方案,站
中海&华为签署战略深化合作协议
华为赵博:数字化转型成为地产企业最确定的
这款TCL K6V指纹锁不到千元即可买到?大品
凯迪仕指纹锁哪款好用?买凯迪仕指纹锁选哪