ARDUINO UNO + BMX055 + PCF8575

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Всем привет, пишу прошивку для опроса датчиков BMX-055, использую мультиплексор PCF8575, подключение стандартное I2C к ардуино uno. Скетч компилируется, но вывод по нулям.

Библиотека для работы с датчиком: https://wiki.iarduino.ru/page/Trema_IMU9/

Библиотека для работы с мультиплексором(I2C расширителем портов): https://github.com/xreef/PCF8575_library

Всегда выводятся нули, причем если использовать этот "мультиплексор" с ESP-WROOM32, то все работает. В чем может быть проблема?

Мой код для опроса всех датчиков и вывода показаний только гироскопа:

#include <Wire.h>
#include <iarduino_Position_BMX055.h>
#include <PCF8575.h>
iarduino_Position_BMX055 sensorA(BMA); // Создаём объект sensorA указывая что ему требуется работать только с акселерометром.
iarduino_Position_BMX055 sensorG(BMG); // Создаём объект sensorG указывая что ему требуется работать только с гироскопом.
iarduino_Position_BMX055 sensorM(BMM);
iarduino_Position_BMX055 sensorALL(BMX);

#define SENSOR_CNT 6
#define SENSORS_ON true

#define I2C_SWITCH_ADDRESS = 0x20;
PCF8575 pcf8575(0x20);

typedef struct{
  float ax;
  float ay;
  float az;
  float gx;
  float gy;
  float gz;
  float mx;
  float my;
  float mz;
} sensor_t;

sensor_t sensors[SENSOR_CNT];
void sensors_select(int senson_number) {
    for (int i = 0; i < SENSOR_CNT; i++) {
      if ( senson_number != i)
        pcf8575.digitalWrite(i, LOW);
    }
    pcf8575.digitalWrite(P1, HIGH);
    delay(10);
}

float q[4] = {1.0f, 0.0f, 0.0f, 0.0f};
float GyroMeasError = PI * (40.0f / 180.0f);
float beta = sqrt(3.0f / 4.0f) * GyroMeasError;
float deltat = 0.0f;
uint32_t Now = 0;   
uint32_t lastUpdate = 0;

void _init(){
  for(int i =0; i<SENSOR_CNT; ++i){
    sensors_select(i);
    sensorA.begin();
    sensorG.begin();
    sensorM.begin();  
  }
}

void sensors_fill(int sensor_number) {
    sensors_select(sensor_number);
    sensorA.read(BMA_M_S);
    sensors[sensor_number].ax = sensorA.axisX;
    sensors[sensor_number].ay = sensorA.axisY;
    sensors[sensor_number].az = sensorA.axisZ;
    sensorG.read(BMG_DEG_S);
    sensors[sensor_number].gx = sensorG.axisX;
    sensors[sensor_number].gy = sensorG.axisY;
    sensors[sensor_number].gz = sensorG.axisZ;
    sensorM.read(BMM_MG);
    sensors[sensor_number].mx = sensorM.axisX;
    sensors[sensor_number].my = sensorM.axisY;
    sensors[sensor_number].mz = sensorM.axisZ;
}

void setToSerial(){
  for(int i =0; i<SENSOR_CNT; ++i){
    Serial.print(i);Serial.print(" ");
    Serial.print(sensors[i].gx);Serial.print(" ");
    Serial.print(sensors[i].gy);Serial.print(" ");
    Serial.print(sensors[i].gz);Serial.println(" ");
  }
}
void setup() {
  Wire.begin();
  Serial.begin(115200);
     while(!Serial){}
     for (int i = 0; i < SENSOR_CNT; i++)
      pcf8575.pinMode(i, OUTPUT);
      pcf8575.begin();
      _init(); 
}
void loop() {
  //Now = micros();
  //deltat = ((Now - lastUpdate)/1000000.0f);
  //lastUpdate = Now;
  for(int i =0;i<SENSOR_CNT;++i){
      sensors_fill(i);
  }
  setToSerial();
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Процедура sensors_select странная. Все невыбранные входы вы выставляете в LOW, вроде выбранный по смыслу должен быть HIGH, но в коде этого нет, вместо этого высокий уровень всегда выставляется на входе P1

SadZhaba
Offline
Зарегистрирован: 06.04.2018

То есть, примерно как то так? 
 

void sensors_select(int senson_number) {
    for (int i = 0; i < SENSOR_CNT; i++) {
        pcf8575.digitalWrite(i, LOW);
      if ( senson_number == i)
        pcf8575.digitalWrite(i, HIGH);
    }
    delay(10);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

SadZhaba пишет:

То есть, примерно как то так? 

вы это у меня спрашиваете? :) Это же "ваш код", как вы написали - вам лучше знать, как должно быть. Я лишь указал вам на возможную ошибку.