Доброго времени суток!
Моя цепь состоит из четырех акселерометров BMI 160, мультиплексора, SD модуля и cамой Arduino UNO
До определенного момента все работало, однако по неосторожности спалил один из датчиков, который пришлось заменить
После его непосредственной замены на моменте подключения датчиков по указанному адресу стала выводится ошибка init false
Но несмотря на это остальные 3 датчика полностью рабочие
Вот мой код на Arduino
/*
Регистратор данных c 4 акселерометров BMI180 c использованием SD карт и используя мультиплексор
Данные будут сохраняться в файле в виде набора строк с разделителем полей в виде символа ";"
Схема подключения картридера:
* Аналоговые сенсоры подключаются к аналоговым пинам
* Модуль SD карты подключен в SPI по стандартной схеме:
** MOSI - пин 11
** MISO - пин12
** CLK - пин 13
** CS - pin 4
*/
#include <SPI.h>
#include <SD.h>
#include "Wire.h"
#include <DFRobot_BMI160.h>
DFRobot_BMI160 bmi160;
// будем использовать такой адрес
// const int8_t i2c_addr = 0x69;
String filename = "Data000.txt";
#define TCAADDR 0x70
// упрощеный I2C адрес нашего гироскопа/акселерометра BMI180
const int8_t MPU_addr = 0x69;
// переменные для хранения данных возвращаемых прибором.
double AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
void tcaselect(uint8_t i);
void giroscop_setup(uint8_t adr);
void Data_mpu6050(uint8_t adr);
const int PIN_CHIP_SELECT = 4;
void generateFileName()
{
for (int i = 0; i< 1000; i++)
{
filename[4] = i/100 + '0';
filename[5] = (i%100)/10 + '0';
filename[6] = (i%10) + '0';
if (SD.exists(filename)) continue;
// Serial.print("File: ");
// Serial.println(filename);
break;
}
}
void setup() {
Serial.begin(115200);
Serial.println("Initializing SD card...");
// Этот пин обязательно должен быть определен как OUTPUT
pinMode(10, OUTPUT);
// Пытаемся проинициализировать модуль
if (!SD.begin(PIN_CHIP_SELECT)) {
// Serial.println("Card failed, or not present");
// Если что-то пошло не так, завершаем работу:
return;
}
// Serial.println("card initialized.");
generateFileName();
delay(100);
/* Enable I2C */
Wire.begin();
#ifdef ESP8266
Wire.setClockStretchLimit(1000); // Allow for 1000us of clock stretching
#endif
giroscop_setup(1);
giroscop_setup(2);
giroscop_setup(3);
giroscop_setup(4);
}
void loop() {
// Строка с данными, которые мы поместим в файл:
String logStringData = "";
Data_mpu6050(1);
// logStringData += String("\nN1:\n");
logStringData += String(AcX); logStringData += String(";");
logStringData += String(AcY); logStringData += String(";");
logStringData += String(AcZ); logStringData += String(";");
logStringData += String(GyX); logStringData += String(";");
logStringData += String(GyY); logStringData += String(";");
logStringData += String(GyZ); logStringData += String(";");
Data_mpu6050(2);
// logStringData += String("\nN2:\n");
logStringData += String(AcX); logStringData += String(";");
logStringData += String(AcY); logStringData += String(";");
logStringData += String(AcZ); logStringData += String(";");
logStringData += String(GyX); logStringData += String(";");
logStringData += String(GyY); logStringData += String(";");
logStringData += String(GyZ); logStringData += String(";");
Data_mpu6050(3);
// logStringData += String("\nN3:\n");
logStringData += String(AcX); logStringData += String(";");
logStringData += String(AcY); logStringData += String(";");
logStringData += String(AcZ); logStringData += String(";");
logStringData += String(GyX); logStringData += String(";");
logStringData += String(GyY); logStringData += String(";");
logStringData += String(GyZ); logStringData += String(";");
Data_mpu6050(4);
// logStringData += String("\nN4:\n");
logStringData += String(AcX); logStringData += String(";");
logStringData += String(AcY); logStringData += String(";");
logStringData += String(AcZ); logStringData += String(";");
logStringData += String(GyX); logStringData += String(";");
logStringData += String(GyY); logStringData += String(";");
logStringData += String(GyZ);
// logStringData += String("\n");
delay(200);
// Открываем файл, но помним, что одновременно можно работать только с одним файлом.
// Если файла с таким именем не будет, ардуино создаст его.
File dataFile = SD.open(filename, FILE_WRITE);
// Если все хорошо, то записываем строку:
if (dataFile) {
dataFile.println(logStringData);
dataFile.close();
// Публикуем в мониторе порта для отладки
Serial.println(logStringData);
}
else {
// Сообщаем об ошибке, если все плохо
Serial.println("error opening datalog.csv");
}
}
//Функция мультиплексирует/переключает адреса для обмена
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
/////////////////////////////////////////////////////////////////////////
//// Считывание данных с BMI180
/////////////////////////////////////////////////////////////////////////
void Data_mpu6050(uint8_t adr) {
tcaselect(adr); //Выбор переключаемого адреса
int16_t accelGyro[6]={0};
int rslt = bmi160.getAccelGyroData(accelGyro);
AcX = accelGyro[0]/16.4;
AcY = accelGyro[1]/16.4;
AcZ = accelGyro[2]/16.4;
GyX = accelGyro[3]/16384.0;
GyY = accelGyro[4]/16384.0;
GyZ = accelGyro[5]/16384.0;
}
/////////////////////////////////////////////////////////////////////////
/// Запуск гироскопа
/////////////////////////////////////////////////////////////////////////
void giroscop_setup(uint8_t adr) {
tcaselect(adr); //Выбор переключаемого адреса
// инициализация датчика
if (bmi160.softReset() != BMI160_OK){
Serial.println("reset false");
while(1);
}
// подключение к датчику по указанному адресу
if (bmi160.I2cInit(MPU_addr) != BMI160_OK){
Serial.println("init false");
while(1);
}
}