总览
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 秒
}
最后的串口监视器输出,成功结果: