汨羅網(wǎng)站建設(shè)交換鏈接營銷案例
總覽
1.初始化 ATmega328PB,默認(rèn)大家已經(jīng)完成了 328 的配置準(zhǔn)備工作,已經(jīng)直接能夠向里面寫入程序
2.接線,然后驗證 mega328 的 I2C 設(shè)備接口能否掃描到 LSM6DS3
3.編寫代碼,上傳,查看串口數(shù)據(jù)。完成。
一、初始化 ATmega328 單片機
1.請看我的另一篇博客
https://blog.csdn.net/qq_43768851/article/details/141290010?spm=1001.2014.3001.5501
二、接線并驗證 I2C 設(shè)備(LSM6DS3 姿態(tài)傳感器)存在
1.接線
引腳圖如下:
接線邏輯(請注意,有坑!):
LSM6DS3(SDA)-> mega328(SDA / A4)
LSM6DS3(SCL)-> mega328(SCL / A5)
LSM6DS3(VCC)-> 3.3V
LSM6DS3(GND)-> GND
LSM6DS3(SA0)-> GND
重點 !!!
重點 !!!
重點 !!!
為什么 SA0 引腳要接入 GND,具體原因本人不太清楚。
這個接線并非是必選項,而是根據(jù)大家單品機型號的不同來決定。
比如說,在 ESP32 上,就沒必要連接 SA0 引腳(當(dāng)然,你也可以試一試,如果不好用的話就連一下試試)
但如果使用 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 秒鐘重新掃描
}
串口監(jiān)視器輸出應(yīng)該如下,說明找到了 I2C 設(shè)備(lsm6ds3)地址為 0x6B:
如果你找到的地址是別的,那么你就需要把后續(xù)代碼中的 0x6B 換成你找到的地址。
三、編寫代碼,嘗試讀取數(shù)據(jù)
1.下載必要的依賴庫
庫管理器搜索 “LSM6DS3”,下載這個:
2.編寫代碼
因為調(diào)用了庫,所以程序優(yōu)雅且簡單
#include <Wire.h>
#include <Arduino_LSM6DS3.h>void setup() {Serial.begin(9600);Wire.begin();Wire.setClock(100000); // 設(shè)置 I2C 速度為 100kHz// 初始化 LSM6DS3 傳感器,不指定地址if (!IMU.begin()) { // 使用默認(rèn)的初始化方式Serial.println("Failed to initialize LSM6DS3!");while (1); // 如果初始化失敗,停止程序}Serial.println("LSM6DS3 initialized successfully!");
}void loop() {float x, y, z;float temperature;// 讀取加速度數(shù)據(jù)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);}// 讀取陀螺儀數(shù)據(jù)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);}// 讀取溫度數(shù)據(jù)if (IMU.temperatureAvailable()) {IMU.readTemperature(temperature);Serial.print("Temperature: ");Serial.print(temperature);Serial.println(" °C");}delay(1000); // 延時 1 秒
}
最后的串口監(jiān)視器輸出,成功結(jié)果: