Страница 1 из 2

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

Добавлено: Пн фев 13, 2023 13:43:56
Alexey1969
Имеется 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
electroget
[uquote="Alexey1969",url="/forum/viewtopic.php?p=4371536#p4371536"]необходимо организовать опрос нескольких АЦП по I2c.[/uquote]
Для подключения нескольких I2C устройств к одной шине существуют специальные хабы. Например PCA9516APW.

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

Добавлено: Пн фев 13, 2023 14:04:58
azhel12
Беглый просмотр документации показал, что у них 3 ножки настройки адреса, то есть можно 8 АЦП подключить на шину (выставив, разумеется, на разных устройствах разные адреса).

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

Добавлено: Пн фев 13, 2023 14:08:36
Alexey1969
Мне казалось что I2c сама по себе предназначена для подключения нескольких устройств. Или нет ?

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

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

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

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

Добавлено: Пн фев 13, 2023 14:24:01
azhel12
А в коде где заданы разные адреса?

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

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

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

Добавлено: Пн фев 13, 2023 14:28:16
Alexey1969
Нигде. Просто подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.
Ничего не замыкает. Проверено. Засада либо в коде, либо в библиотеке
У второго устройства другой адрес

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

Добавлено: Пн фев 13, 2023 14:36:55
azhel12
А, теперь понял, извините за глупые вопросы тогда :roll:

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

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

Добавлено: Пн фев 13, 2023 14:46:34
Alexey1969
Скорость пробовал. Нет результата.
Чипы голые на плате, подтяжка верная.
Подозреваю что то там не корректно с адресацией в библиотеке или я не разобрался как ее правильно применять, не часто использую ардуинку.

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

Добавлено: Вт фев 14, 2023 05:48:38
electroget
[uquote="Alexey1969",url="/forum/viewtopic.php?p=4371551#p4371551"]подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.[/uquote]
Проверьте работоспособность каждого АЦП с контроллером по отдельности.

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

Добавлено: Вт фев 14, 2023 06:00:36
Alexey1969
По отдельности все корректно, по любому из адресов

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

Добавлено: Чт фев 23, 2023 10:57:38
Alexey1969
Так и не понял, что не так, но по одному байту читает корректно. Получилась вот такая конструкция.

Код: Выделить всё

      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
veso74
Ваше устройство имеет напр. 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.

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

Добавлено: Чт фев 23, 2023 11:28:48
Alexey1969
Я бы все же рекомендовал прочитать всю ветку, чтобы понять, в чем же все таки был вопрос:)

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

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

Добавлено: Чт фев 23, 2023 11:36:17
veso74
Повторю вопрос коллеги:

Код: Выделить всё

А в коде где заданы разные адреса?
---
Как вы это сделали? Код?

Код: Выделить всё

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

Запускайте хотя бы сканер I2C, увидите конфликт или работу.

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

Добавлено: Чт фев 23, 2023 11:37:06
electroget
Не совсем понятен итог.
Решение проблемы было найдено или нет?

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

Добавлено: Чт фев 23, 2023 11:41:35
Alexey1969
Извините, не понял, в чем был совет :)

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

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

Добавлено: Чт фев 23, 2023 11:45:25
electroget
А зачем вам 1 байт? Какая может быть польза от 1 байта инфы?

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

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

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

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

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

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

Изображение

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

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

Добавлено: Чт фев 23, 2023 11:57:35
veso74
Фото не очень помогает, куда подключены пины 5, 6, 7 на каждой PCF8591? (GND/VDD)