【Arduino】ATmega328PB 连接 LSM6DS3 姿态传感器,并读数据(不确定 ESP 系列是否可行,但大概率是可行的)

总览

1.初始化 ATmega328PB,默认大家已经完成了 328 的配置准备工作,已经直接能够向里面写入程序
2.接线,然后验证 mega328 的 I2C 设备接口能否扫描到 LSM6DS3
3.编写代码,上传,查看串口数据。完成。

一、初始化 ATmega328 单片机

1.请看我的另一篇博客

https://blog.csdn.net/qq_43768851/article/details/141290010?spm=1001.2014.3001.5501

二、接线并验证 I2C 设备(LSM6DS3 姿态传感器)存在

1.接线

引脚图如下:

在这里插入图片描述

接线逻辑(请注意,有坑!):

LSM6DS3(SDA)-> mega328(SDA / A4)
LSM6DS3(SCL)-> mega328(SCL / A5)
LSM6DS3(VCC)-> 3.3V
LSM6DS3(GND)-> GND
LSM6DS3(SA0)-> GND

重点 !!!
重点 !!!
重点 !!!

为什么 SA0 引脚要接入 GND,具体原因本人不太清楚。
这个接线并非是必选项,而是根据大家单品机型号的不同来决定。
比如说,在 ESP32 上,就没必要连接 SA0 引脚(当然,你也可以试一试,如果不好用的话就连一下试试)
但如果使用 mega328PB 来连接 LSM6DS3,那就必须让 LSM6DS3 的 SA0 引脚接地。

2.验证 lsm6ds3 的 I2C 地址在哪里

验证程序(Arduino版本。请写入下面的程序到 328):

#include <Wire.h>

void setup() {
    Wire.begin();
    Serial.begin(9600);
    while (!Serial);
    Serial.println("\nI2C Scanner");
}

void loop() {
    byte error, address;
    int nDevices;

    Serial.println("Scanning...");

    nDevices = 0;
    for (address = 1; address < 127; address++) {
        Wire.beginTransmission(address);
        error = Wire.endTransmission();

        if (error == 0) {
            Serial.print("I2C device found at address 0x");
            if (address < 16) Serial.print("0");
            Serial.print(address, HEX);
            Serial.println("  !");
            nDevices++;
        } else if (error == 4) {
            Serial.print("Unknown error at address 0x");
            if (address < 16) Serial.print("0");
            Serial.println(address, HEX);
        }
    }
    if (nDevices == 0) {
        Serial.println("No I2C devices found\n");
    } else {
        Serial.println("done\n");
    }
    delay(5000);  // 延迟 5 秒钟重新扫描
}

串口监视器输出应该如下,说明找到了 I2C 设备(lsm6ds3)地址为 0x6B:
如果你找到的地址是别的,那么你就需要把后续代码中的 0x6B 换成你找到的地址。

在这里插入图片描述

三、编写代码,尝试读取数据

1.下载必要的依赖库

库管理器搜索 “LSM6DS3”,下载这个:

在这里插入图片描述

2.编写代码

因为调用了库,所以程序优雅且简单

#include <Wire.h>
#include <Arduino_LSM6DS3.h>

void setup() {
    Serial.begin(9600);
    Wire.begin();
    Wire.setClock(100000); // 设置 I2C 速度为 100kHz

    // 初始化 LSM6DS3 传感器,不指定地址
    if (!IMU.begin()) {  // 使用默认的初始化方式
        Serial.println("Failed to initialize LSM6DS3!");
        while (1); // 如果初始化失败,停止程序
    }

    Serial.println("LSM6DS3 initialized successfully!");
}

void loop() {
    float x, y, z;
    float temperature;

    // 读取加速度数据
    if (IMU.accelerationAvailable()) {
        IMU.readAcceleration(x, y, z);
        Serial.print("Acceleration X: ");
        Serial.print(x);
        Serial.print(" Y: ");
        Serial.print(y);
        Serial.print(" Z: ");
        Serial.println(z);
    }

    // 读取陀螺仪数据
    if (IMU.gyroscopeAvailable()) {
        IMU.readGyroscope(x, y, z);
        Serial.print("Gyroscope X: ");
        Serial.print(x);
        Serial.print(" Y: ");
        Serial.print(y);
        Serial.print(" Z: ");
        Serial.println(z);
    }

    // 读取温度数据
    if (IMU.temperatureAvailable()) {
        IMU.readTemperature(temperature);
        Serial.print("Temperature: ");
        Serial.print(temperature);
        Serial.println(" °C");
    }

    delay(1000); // 延时 1 秒
}

最后的串口监视器输出,成功结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MicroLindb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值