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

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение 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();
}
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4651
Зарегистрирован: Ср сен 30, 2020 16:51:47
Откуда: РФ

Сообщение electroget »

[uquote="Alexey1969",url="/forum/viewtopic.php?p=4371536#p4371536"]необходимо организовать опрос нескольких АЦП по I2c.[/uquote]
Для подключения нескольких I2C устройств к одной шине существуют специальные хабы. Например PCA9516APW.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Сообщение azhel12 »

Беглый просмотр документации показал, что у них 3 ножки настройки адреса, то есть можно 8 АЦП подключить на шину (выставив, разумеется, на разных устройствах разные адреса).
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение Alexey1969 »

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

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

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

Но надо вот с ардуинкой на esp, так как конструктив уже собран.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Сообщение azhel12 »

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

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

Проще, наверно, загнать их в массив и в loop инкрементировать номер текущего АЦП (по модулю их количества).
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение Alexey1969 »

Нигде. Просто подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.
Ничего не замыкает. Проверено. Засада либо в коде, либо в библиотеке
У второго устройства другой адрес
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Сообщение azhel12 »

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

Тогда вообще странно, второй вообще не должен мешать. Пробовали скорость уменьшить? Или (если АЦП в виде собранных модулей) у второго убрать резисторы подтяжки SCL/SDA
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение Alexey1969 »

Скорость пробовал. Нет результата.
Чипы голые на плате, подтяжка верная.
Подозреваю что то там не корректно с адресацией в библиотеке или я не разобрался как ее правильно применять, не часто использую ардуинку.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4651
Зарегистрирован: Ср сен 30, 2020 16:51:47
Откуда: РФ

Сообщение electroget »

[uquote="Alexey1969",url="/forum/viewtopic.php?p=4371551#p4371551"]подключаю к шине еще одно устройство и этот код перестает работать с первым устройством.[/uquote]
Проверьте работоспособность каждого АЦП с контроллером по отдельности.
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение Alexey1969 »

По отдельности все корректно, по любому из адресов
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение 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();
Возможно, комуто пригодится
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1924
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение 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.
Последний раз редактировалось veso74 Чт фев 23, 2023 11:41:08, всего редактировалось 2 раза.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение Alexey1969 »

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

Пины I2c были заданы ранее.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1924
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Повторю вопрос коллеги:

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

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

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

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

Запускайте хотя бы сканер I2C, увидите конфликт или работу.
Последний раз редактировалось veso74 Чт фев 23, 2023 11:40:20, всего редактировалось 4 раза.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4651
Зарегистрирован: Ср сен 30, 2020 16:51:47
Откуда: РФ

Сообщение electroget »

Не совсем понятен итог.
Решение проблемы было найдено или нет?
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение Alexey1969 »

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

Резюмирую:
В исходном примере библиотеки после команды чтения с указанием количества считаных байт, они все корректно считываются.
При подключении дополнительных устройств(с другими адресами), корректно считывается только один байт.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4651
Зарегистрирован: Ср сен 30, 2020 16:51:47
Откуда: РФ

Сообщение electroget »

А зачем вам 1 байт? Какая может быть польза от 1 байта инфы?
Поставщик валерьянки для Кота
Сообщения: 1924
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

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

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

Дайте схему (какая микросхема по какому адресу и пину) и полный код для инициализации чипов.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 622
Зарегистрирован: Чт мар 05, 2009 05:31:16
Откуда: г. Кемерово

Сообщение Alexey1969 »

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

Изображение

Добавлено after 2 minutes 39 seconds:
veso74 писал(а):Если не устанавливали разные адреса, это нормально: задан первый байт, все устройства отвечают вместе (с разной информацией), и возникает конфликт шины.
Эх, что же вы раньше то писать не стали :)
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1924
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

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

Вернуться в «Arduino»