Паралельное подклюение по шине i2c
- Войдите на сайт для отправки комментариев
Сб, 18/01/2020 - 02:16
Прошу помочь разобраться с проблемой работоспособности 2 подключенных устройств к шине i2c.
Я использую ESP32 к которой подключил модуль PCA9685 и модуль ADS1015. На модуле PCA9685 использую 4 выхода как дополнительные GPIO для ESP. ADS1015 использую для чтения напряжения от 0 до 5 вольт.
Конструктивно ADS1015 подключена к контактам PCA9685 (SDA, SCL, VCC, GND). В свою очередь PCA9685 подключена к ESP32.
PCA9685 полноценно работает с ESP32 по шине i2c (использую библиотеку Adafruit_PWMServoDriver.h)
ADS1015 не работает. Всегда, при любых манипуляциях с кодом, выдает 4095 (использую библиотеку Adafruit_ADS1015.h)
#include <Wire.h> #include <WiFi.h> #include <Arduino.h> #include <Adafruit_PWMServoDriver.h> #include <esp32-hal-adc.h> #include <Adafruit_ADS1015.h> Adafruit_ADS1015 ads(0x4a); Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); const int pin_p[] = {13,12,14,23,19,18,17,16,15,27,26,25}; //масив с номерами пинов / 12 штук int i = 0; uint8_t pin = 8; //номер пина на PCA9685 int16_t VRS; // на выходе преобразования АЦП мы получаем 12-разрядное знаковое целое int16_t vrs_; //переменная для расчета напряжения void setup(){ Serial.begin(115200); pwm.begin(); //включаем PCA9685 pwm.setPWMFreq(1000); // Частота следования импульсов 1000 Гц ads.begin(); //включаем АЦП for (int i=0; i <= 11; i++) { pinMode(pin_p[i],OUTPUT); //Задаем пинам из масива, OUTPUT } void loop(){ unsigned long now_time = millis(); //---------------------------------------------Задержка------------------------------------------ if( now_time - next_time >= 20000) // если текущее время превысило намеченное время, то { if (i >= 12) { pin++; pwm.setPWM(pin-1, 0, 4096); // turns pin fully on Serial.print("OFF- "); next_time = now_time; // вычисляем время следующего переключения if (pin >=12) { pin = 8; } } else { digitalWrite(pin_p[i],LOW); } i++; //Следующий пин if (i >= 16) { i = 0; } if (i >= 12) { pwm.setPWM(pin, 4096, 0); // turns pin fully off } else { digitalWrite(pin_p[i],HIGH); // Пуск } next_time = now_time; // вычисляем время следующего переключения } if( now_time - next_time1 >= 5000) { detektor(); // Визов функции - считываем данные с детектора next_time1 = now_time; // вычисляем время следующего переключения } } void detektor(){ VRS = ads.readADC_SingleEnded(0); // читаем результат единичного преобразования vrs_ = VRS; // расчитываем напряжение delay(1000); }
Адрес по умолчанию у ADS1015 -0x48 a вас стоит 0х4А (8я строка) Вы ему перемычками адрес меняли чтоли?
И вообще попробуйте, сначала добиться работоспособности 1015 когда он только один подключен
Да менял адрес. Отдельно работает!
У Вас когда пропадает работоспособность: при аппаратном подключении или при программном?
Т.е. когда восстанавливается работоспособность, когда физически отключаете от контактов или когда убираете include соответствующей библиотеки в коде?
PS. И на будущее: чтобы не нужно было задавать дополнительных вопросов, не забывайте приводить не только скетч, но и схему.
Я так понимаю что проблема в коде. Я думаю что связь по шине i2c как то надо реализовать по другому. Например библиотекой Wire.h
Не могу проследить когда именно связь пропадает, думаю что ее просто нет (на плате все работает токи есть)
Борюсь уже неделю силы и мысли иссякли.
Вот схема подключения:
Вот вы утверждаете что когда подключен только один АДС модуль то он работает. Как вы его проверяли? Далее пусть он работает, если вы подключите все нужные провода и к РСА тоже, но запустите скетч для проверки АДС то что происходит?
Не могу проследить когда именно связь пропадает
НУ потому что связи вообще нет
Да менял адрес. Отдельно работает!
НУ потому что связи вообще нет