ARDUINO UNO + BMX055 + PCF8575
- Войдите на сайт для отправки комментариев
Вс, 13/06/2021 - 18:57
Всем привет, пишу прошивку для опроса датчиков 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(); }
Процедура sensors_select странная. Все невыбранные входы вы выставляете в LOW, вроде выбранный по смыслу должен быть HIGH, но в коде этого нет, вместо этого высокий уровень всегда выставляется на входе P1
То есть, примерно как то так?
То есть, примерно как то так?
вы это у меня спрашиваете? :) Это же "ваш код", как вы написали - вам лучше знать, как должно быть. Я лишь указал вам на возможную ошибку.