Паралельное подклюение по шине i2c

sssnek
Offline
Зарегистрирован: 20.07.2019

Прошу помочь разобраться с проблемой работоспособности 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);
 }

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Адрес по умолчанию у ADS1015 -0x48 a вас стоит 0х4А (8я строка) Вы ему перемычками адрес меняли чтоли?

И вообще попробуйте, сначала добиться работоспособности 1015 когда он только один подключен

sssnek
Offline
Зарегистрирован: 20.07.2019

Да менял адрес. Отдельно работает!

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

У Вас когда пропадает работоспособность: при аппаратном подключении или при программном?

Т.е. когда восстанавливается работоспособность, когда физически отключаете от контактов или когда убираете include соответствующей библиотеки в коде?

 

PS. И на будущее: чтобы не нужно было задавать дополнительных вопросов, не забывайте приводить не только скетч, но и схему.

sssnek
Offline
Зарегистрирован: 20.07.2019

Я так понимаю что проблема в коде. Я думаю что связь по шине i2c как то надо реализовать по другому. Например библиотекой Wire.h

Не могу проследить когда именно связь пропадает, думаю что ее просто нет (на плате все работает токи есть)

Борюсь уже неделю силы и мысли иссякли. 

Вот схема подключения:

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Вот вы утверждаете что когда подключен только один АДС модуль то он работает. Как вы его проверяли? Далее пусть он работает, если вы подключите все нужные провода и к РСА тоже, но запустите скетч для проверки АДС то что происходит?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sssnek пишет:

Не могу проследить когда именно связь пропадает

А что Вам мешает?

sssnek
Offline
Зарегистрирован: 20.07.2019

НУ потому что связи вообще нет

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sssnek пишет:

Да менял адрес. Отдельно работает!

sssnek пишет:

НУ потому что связи вообще нет

Как может быть "отдельно работает", если "связи вообще нет".