当前位置: 代码迷 >> 综合 >> 【掌控板-arduino】4.1 msa300三轴加速器介绍
  详细解决方案

【掌控板-arduino】4.1 msa300三轴加速器介绍

热度:66   发布时间:2023-12-05 20:37:03.0

文章目录

  • 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找到了,并且数据获取正常。

后续再分析这些数据如何理解及使用。

  相关解决方案