文章目录
- 1 前言
- 2 参考文章
- 3 硬件介绍
- 4 安装库
- 5 未找到设备
- 6 查看SDA/SCL设置
- 7 测试结果
1 前言
硬件:掌控板2.0
平台:arduino
驱动:Adafruit_MSA301
本章介绍如何通三轴传感器的I2C。
2 参考文章
MicroPython动手做(11)——搭建掌控板IDE环境
【Arduino】168种传感器模块系列实验(158)—QMC5883L三轴罗盘
超低成本的三轴数字加速计MSA300应用资料
3 硬件介绍
三轴传感器的型号为MSA300
信号为SDA/SCL
SDA和SCL对应的IO口为23,22
数据口为IO23,时序口为IO22
此外可能还需要了解一下MSA300的I2C地址为0x26,即38
由于未找到msa300的驱动,使用MSA301的驱动试试。
4 安装库
掌控板2.0使用的三轴加速度计MSA300,查看库看起来只有301
提示下载出错,网站无法访问
尝试在github中直接搜
https://github.com/adafruit/Adafruit_MSA301
直接下载zip包来安装。
可能需要安装Adafruit_Sensor库
https://github.com/adafruit/Adafruit_Sensor
5 未找到设备
参考示例acceldemo
#include <Wire.h>
#include <Adafruit_MSA301.h>Adafruit_MSA301 msa;void setup(void) {
Serial.begin(115200);while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opensSerial.println("Adafruit MSA301 test!");// Try to initialize!//38,msa301_wireif (! msa.begin()) {
Serial.println("Failed to find MSA301 chip");while (1) {
delay(10); }}Serial.println("MSA301 Found!");//msa.setDataRate(MSA301_DATARATE_31_25_HZ);Serial.print("Data rate set to: ");switch (msa.getDataRate()) {
case MSA301_DATARATE_1_HZ: Serial.println("1 Hz"); break;case MSA301_DATARATE_1_95_HZ: Serial.println("1.95 Hz"); break;case MSA301_DATARATE_3_9_HZ: Serial.println("3.9 Hz"); break;case MSA301_DATARATE_7_81_HZ: Serial.println("7.81 Hz"); break;case MSA301_DATARATE_15_63_HZ: Serial.println("15.63 Hz"); break;case MSA301_DATARATE_31_25_HZ: Serial.println("31.25 Hz"); break;case MSA301_DATARATE_62_5_HZ: Serial.println("62.5 Hz"); break;case MSA301_DATARATE_125_HZ: Serial.println("125 Hz"); break;case MSA301_DATARATE_250_HZ: Serial.println("250 Hz"); break;case MSA301_DATARATE_500_HZ: Serial.println("500 Hz"); break;case MSA301_DATARATE_1000_HZ: Serial.println("1000 Hz"); break;}//msa.setPowerMode(MSA301_SUSPENDMODE);Serial.print("Power mode set to: ");switch (msa.getPowerMode()) {
case MSA301_NORMALMODE: Serial.println("Normal"); break;case MSA301_LOWPOWERMODE: Serial.println("Low Power"); break;case MSA301_SUSPENDMODE: Serial.println("Suspend"); break;}//msa.setBandwidth(MSA301_BANDWIDTH_31_25_HZ);Serial.print("Bandwidth set to: ");switch (msa.getBandwidth()) {
case MSA301_BANDWIDTH_1_95_HZ: Serial.println("1.95 Hz"); break;case MSA301_BANDWIDTH_3_9_HZ: Serial.println("3.9 Hz"); break;case MSA301_BANDWIDTH_7_81_HZ: Serial.println("7.81 Hz"); break;case MSA301_BANDWIDTH_15_63_HZ: Serial.println("15.63 Hz"); break;case MSA301_BANDWIDTH_31_25_HZ: Serial.println("31.25 Hz"); break;case MSA301_BANDWIDTH_62_5_HZ: Serial.println("62.5 Hz"); break;case MSA301_BANDWIDTH_125_HZ: Serial.println("125 Hz"); break;case MSA301_BANDWIDTH_250_HZ: Serial.println("250 Hz"); break;case MSA301_BANDWIDTH_500_HZ: Serial.println("500 Hz"); break;}//msa.setRange(MSA301_RANGE_2_G);Serial.print("Range set to: ");switch (msa.getRange()) {
case MSA301_RANGE_2_G: Serial.println("+-2G"); break;case MSA301_RANGE_4_G: Serial.println("+-4G"); break;case MSA301_RANGE_8_G: Serial.println("+-8G"); break;case MSA301_RANGE_16_G: Serial.println("+-16G"); break;}//msa.setResolution(MSA301_RESOLUTION_14 );Serial.print("Resolution set to: ");switch (msa.getResolution()) {
case MSA301_RESOLUTION_14: Serial.println("14 bits"); break;case MSA301_RESOLUTION_12: Serial.println("12 bits"); break;case MSA301_RESOLUTION_10: Serial.println("10 bits"); break;case MSA301_RESOLUTION_8: Serial.println("8 bits"); break;}
}void loop() {
msa.read(); // get X Y and Z data at once// Then print out the raw dataSerial.print("X: "); Serial.print(msa.x); Serial.print(" \tY: "); Serial.print(msa.y); Serial.print(" \tZ: "); Serial.print(msa.z); delay(100); /* Or....get a new sensor event, normalized */ sensors_event_t event; msa.getEvent(&event);/* Display the results (acceleration is measured in m/s^2) */Serial.print("\t\tX: "); Serial.print(event.acceleration.x);Serial.print(" \tY: "); Serial.print(event.acceleration.y); Serial.print(" \tZ: "); Serial.print(event.acceleration.z); Serial.println(" m/s^2 ");Serial.println();delay(100);
}
此时可以编译完成,但是打开串口监视器,然后按下reset键(掌控板后面白色的那个)。
发现未找到msa301芯片,地址是对的,但是没有找到,这时候就要看sda和scl是否配对了。
6 查看SDA/SCL设置
我们可以直接重定义SDA/SCL,这就会报错。
#include <Wire.h>
#include <Adafruit_MSA301.h>Adafruit_MSA301 msa;#define uint8_t unsigned char
static const uint8_t SDA=23;
static const uint8_t SCL=22;void setup(void) {
}void loop() {
}
这样我们就可以找到SDA/SCL定义的文件位置了
C:\Users\XXX\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\variants\esp32/pins_arduino.h
根据我们自己板子的定义修改,参见硬件介绍那章。
7 测试结果
修改完sda/scl后,再运行上述的示例代码,注意不要重复定义SDA/SCL。
这时候就会发现MSA300找到了,并且数据获取正常。
后续再分析这些数据如何理解及使用。