Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 13:43:56

Имеется ESP с прошивкой arduino, необходимо организовать опрос нескольких АЦП по I2c.
В сети полно примеров и все работает, пока на шине только один АЦП, стоит подключить еще, вместо данных мусор.
Возможно, кто то разобрался?
Типичный пример из сети :

#include "Wire.h"
int PCF8591=0x48; // I2C bus address
byte ana0, ana1, ana2, ana3;
void setup()
{
Wire.pins(0,2);// just to make sure
Wire.begin(0,2);// the SDA and SCL
}
void loop()
{
Wire.beginTransmission(PCF8591); // wake up PCF8591
Wire.write(0x04); // control byte: reads ADC0 then auto-increment
Wire.endTransmission(); // end tranmission
Wire.requestFrom(PCF8591, 5);
ana0=Wire.read();// throw this one away
ana0=Wire.read();
ana1=Wire.read();
ana2=Wire.read();
ana3=Wire.read();
}

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 14:02:41

необходимо организовать опрос нескольких АЦП по I2c.

Для подключения нескольких I2C устройств к одной шине существуют специальные хабы. Например PCA9516APW.

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 14:04:58

Беглый просмотр документации показал, что у них 3 ножки настройки адреса, то есть можно 8 АЦП подключить на шину (выставив, разумеется, на разных устройствах разные адреса).

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 14:08:36

Мне казалось что I2c сама по себе предназначена для подключения нескольких устройств. Или нет ?

Безусловно, адреса установлены разные.

У меня нет вопросов подцепить все это какому-нибудь PICу.

Но надо вот с ардуинкой на esp, так как конструктив уже собран.

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 14:24:01

А в коде где заданы разные адреса?

У вас в коде только одна строчка int PCF8591=0x48; // I2C bus address, а их должно быть по количеству АЦП (или массив), ну и потом, понятно, в главном цикле при вызове методов beginTransmission и requestFrom надо передавать по очереди адреса всех АЦП.

Проще, наверно, загнать их в массив и в loop инкрементировать номер текущего АЦП (по модулю их количества).

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 14:28:16

Нигде. Просто подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.
Ничего не замыкает. Проверено. Засада либо в коде, либо в библиотеке
У второго устройства другой адрес

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 14:36:55

А, теперь понял, извините за глупые вопросы тогда :roll:

Тогда вообще странно, второй вообще не должен мешать. Пробовали скорость уменьшить? Или (если АЦП в виде собранных модулей) у второго убрать резисторы подтяжки SCL/SDA

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Пн фев 13, 2023 14:46:34

Скорость пробовал. Нет результата.
Чипы голые на плате, подтяжка верная.
Подозреваю что то там не корректно с адресацией в библиотеке или я не разобрался как ее правильно применять, не часто использую ардуинку.

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Вт фев 14, 2023 05:48:38

подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.

Проверьте работоспособность каждого АЦП с контроллером по отдельности.

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Вт фев 14, 2023 06:00:36

По отдельности все корректно, по любому из адресов

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 10:57:38

Так и не понял, что не так, но по одному байту читает корректно. Получилась вот такая конструкция.

Код:
      Wire.beginTransmission(DIVACE); // wake up PCF8591
     
      // control byte:  где то прочитал, что если авто инскримент, то обязательно включить выход аналоговый
      Wire.write(0x44);
      Wire.write(0x00);
      Wire.endTransmission(); // end tranmission

      Wire.requestFrom(DIVACE, 1);               // тут предыдущее измеренное, оно нам не надо. Особенности микросхемы
      AV[0]=Wire.read();


          Wire.requestFrom(DIVACE, 1);            // принять 1 байт из устройства
          AV[0] = Wire.read();

          Wire.requestFrom(DIVACE, 1);            // принять 1 байт из устройства         
          AV[1] = Wire.read();

          Wire.requestFrom(DIVACE, 1);            // принять 1 байт из устройства         
          AV[2] = Wire.read();

          Wire.requestFrom(DIVACE, 1);            // принять 1 байт из устройства         
          AV[3] = Wire.read();


Возможно, комуто пригодится

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:26:12

Ваше устройство имеет напр. 4 шт. PCF8591 ( макс. 8 ). Аппаратно, на плате, с выводами A0, A1, A2 каждому чипу назначаете уникальный адрес.

Напр. будет:
Код:
#define PCF8591_0 0x48
#define PCF8591_1 0x49
#define PCF8591_2 0x4A
#define PCF8591_3 0x4B

Управляйте ИС с кодом как одного чипа, по одному уникальному адресу на чип.
PS функция Wire.pins(0,2); нет. Вероятно автор использовал собственное программное решение для I2C.
Последний раз редактировалось veso74 Чт фев 23, 2023 11:41:08, всего редактировалось 2 раз(а).

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:28:48

Я бы все же рекомендовал прочитать всю ветку, чтобы понять, в чем же все таки был вопрос:)

Пины I2c были заданы ранее.

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:36:17

Повторю вопрос коллеги:
Код:
А в коде где заданы разные адреса?

---
Как вы это сделали? Код?
Код:
Пины I2c были заданы ранее.

А можете подключить ВСЕ микросхемы к одной шине, если они имеют разные адреса.

Запускайте хотя бы сканер I2C, увидите конфликт или работу.
Последний раз редактировалось veso74 Чт фев 23, 2023 11:40:20, всего редактировалось 4 раз(а).

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:37:06

Не совсем понятен итог.
Решение проблемы было найдено или нет?

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:41:35

Извините, не понял, в чем был совет :)

Резюмирую:
В исходном примере библиотеки после команды чтения с указанием количества считаных байт, они все корректно считываются.
При подключении дополнительных устройств(с другими адресами), корректно считывается только один байт.

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:45:25

А зачем вам 1 байт? Какая может быть польза от 1 байта инфы?

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:47:30

Если не устанавливали разные адреса, это нормально: задан первый байт, все устройства отвечают вместе (с разной информацией), и возникает конфликт шины.

Разделите действия каждого по отдельности. I2C может управлять, например. 128 устройств по 2 проводам, если они имеют уникальный адрес.
А как - в сообщениях, советы выше.

Дайте схему (какая микросхема по какому адресу и пину) и полный код для инициализации чипов.

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:53:48

Решение было найдено и проверено. Соберу все в кучку, выложу
Измеритель мощности, 16 каналов с передачей на сервер.
Задачи получить высокую точность не стояло, поэтому дешевые АЦП
Прототип, плата категории "на коленке" :)

Изображение

Добавлено after 2 minutes 39 seconds:
veso74 писал(а):Если не устанавливали разные адреса, это нормально: задан первый байт, все устройства отвечают вместе (с разной информацией), и возникает конфликт шины.


Эх, что же вы раньше то писать не стали :)

Re: ESP8266 + Arduino + несколько PCF8591. Как ?

Чт фев 23, 2023 11:57:35

Фото не очень помогает, куда подключены пины 5, 6, 7 на каждой PCF8591? (GND/VDD)
Ответить