• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом ESP8266 Wemos и расширитель цифровых портов Trema iArduino

rashn

New member
После разнотипных арудин - от MINI PRO до MEGA2560 случайно столкнулся с ESP8266 и был впечатлён миниатюрностью и кучей возможностей, большим объемом памяти, частотой и вайфай на борту, но при всём при этом страшно разочарован в количестве цифровых вводов/выводов. После того же UNO, один аналоговый и три (которые можно нормально использовать без последствий) цифровых никак не устраивало.

Недавно наткнулся на модуль Trema iArduino:
Расширитель на 8 Входов/Выходов (Trema-модуль) - Wiki iarduino

Который за небольшие деньги по шине I2C добавляет целых 8!! цифровых вводов/выводов. К сожалению у продавца библиотека только для ARM процессоров и не компилируется под ESP, но немного поковырявшись на просторах интернета, нашел библиотеку, чуток её переделал и цепляю к теме. Пользуйтесь на здоровье. Полезная фишка библиотеки - порт входа можно делать инвертированным.

Для меня эта находка оказалась буквально спасением всего проекта. Я применил модуль для управления моторами постоянного тока 12В через драйвер - которые закрывают окна в кровле на мансарде при поступлении данных с датчика дождя. Я также могу управлять окнами через Blynk, находясь в любой точке планеты. Четыре порта используются в режиме OUTPUT для управления двумя окнами, ещё два порта INPUT для считывания датчиков окна (герконы).

Драйвер использую вот этот:
Двойной драйвер модуль двигателя доска Н моста постоянного тока MOSFET IRF3205 3 36 В 10A пик 30A купить на AliExpress

Несмотря на то что на плате у него указано входное напряжение +5V, он прекрасно работает от от 3.3 ESP-шных.

Если нужны подробности - обращайтесь. Среда программирования Arduino IDE.

P.S. Не знаю на сколько этот модуль нужен для плат Ардуино, где есть MEGA2560, а вот для ESP он точно незаменим.
 

Вложения

Последнее редактирование:

enjoynering

Well-known member
"Который за небольшие деньги по шине I2C добавляет целых 8!! цифровых вводов/выводов."

I2C для ESP8266 Arduino IDE очень глючный. попробуйте к вашему раширителю подключить еще пару устройств. например HTU21D и часы DS3231 и наслаждаться глюками, зависаниями и перезагрузками.
 

AndrF

Active member
"Который за небольшие деньги по шине I2C добавляет целых 8!! цифровых вводов/выводов."

I2C для ESP8266 Arduino IDE очень глючный. попробуйте к вашему раширителю подключить еще пару устройств. например HTU21D и часы DS3231 и наслаждаться глюками, зависаниями и перезагрузками.
Ну у меня на I2C висело три устройства. Глюков не заметил...
 

enjoynering

Well-known member
enjoynering, добрый ты... лучше бы сказал ка этого избежать.
я работаю над этим. как закончу, поделюсь со всеми. мне не жалко. глюки и зависания на запись в slave я победил. работает быстрее стандартной. а вот чтение со slave никак не идет. где то ошибка. может кто из вас поможет? вот кусок чтения бита:

Код:
static uint8_t twi_read_bit(void)
{
  bool rxBit = 0;

  /* start SCL & SDA routine */
  SDA_HIGH();                                           //becomes input & release the SDA line, so slave can send bit or ack/nack answer
  SCL_LOW();                                            //becomes output & pulls the line low
  twi_delay(twi_dcount - 5);                            //tLOW >= 4.7usec, LOW period of the SCL (real time - 4.875usec)

  /* continue SCL routine */
  SCL_HIGH();                                           //release the SCL bus, so we can read a bit or ack/nack answer from slave
  if (clockStretch() == false) return I2C_SCL_HELD_LOW; //returns 3

  /* continue SDA routine, read the data */
  twi_delay(1);                                         //tSU;DAT >= 250nsec, data set-up time
  rxBit = SDA_READ();                                   //read 7..0 data bit or 8-th NACK/ACK = 1/0 bit, 9 bits in total
  twi_delay(twi_dcount - 4);                            //tHIGH >= 4.0usec, HIGH period of the SCL (real time - 4.125usec)
  SCL_LOW();
  SDA_LOW();                                            //during "twi_write_byte()" removes spike after reading 9-th NACK/ACK bit

  return rxBit;                                         //return bit!!!
}
потом эта функция используется в другой где добавляется nack/ack, start и stop импульсы. подробнее можно посмотреть как это происходит в Arduino библиотеке - "core_esp8266_si2c.c"
стандарт на I2C шину тут.
 

Вложения

rashn

New member
я работаю над этим. как закончу, поделюсь со всеми. мне не жалко. глюки и зависания на запись в slave я победил. работает быстрее стандартной. а вот чтение со slave никак не идет. где то ошибка. может кто из вас поможет? вот кусок чтения бита:
Да, сталкивался с глюками. Сейчас мне кажется что их нет. Возможно вам поможет инфа по этой ссылке:
Reliable Startup for I2C Battery Backed RTC Why the Arduino Wire library is not enough.

Также я подправил функцию инициализации в библиотеке, на вот эту:

Код:
void PCA9534::begin(uint8_t i2caddr) {
  _i2caddr = i2caddr;
  Wire.begin();
  Wire.setClock(1000*((F_CPU/(100*1000))-16)/2);
  //Wire.setClock(100000);
}
 

enjoynering

Well-known member
Wire.setClock(1000*((F_CPU/(100*1000))-16)/2);
в "core_esp8266_si2c.c" : #define FCPU80 80000000UL

если я все правильно посчитал то Wire.setClock = 392000 Hz

теперь смотрим на функцию:
Код:
void twi_setClock(uint32_t freq)
{
  #if F_CPU == FCPU80
  if     (freq <= 100000UL) twi_dcount = 19; //~100KHz
  else if(freq <= 200000UL) twi_dcount = 8;  //~200KHz
  else if(freq <= 300000UL) twi_dcount = 3;  //~300KHz
  else if(freq <= 400000UL) twi_dcount = 1;  //~400KHz
  else                      twi_dcount = 1;  //~400KHz
  #else
  if     (freq <= 100000UL) twi_dcount = 32; //~100KHz
  else if(freq <= 200000UL) twi_dcount = 14; //~200KHz
  else if(freq <= 300000UL) twi_dcount = 8;  //~300KHz
  else if(freq <= 400000UL) twi_dcount = 5;  //~400KHz
  else if(freq <= 500000UL) twi_dcount = 3;  //~500KHz
  else if(freq <= 600000UL) twi_dcount = 2;  //~600KHz
  else                      twi_dcount = 1;  //~700KHz
  #endif
}
те базовая задежка twi_dcount = 3 что приблизительно равно скости I2C 300KHz. PCA9534 нормально перемалывает пакеты до 400KHz, а сенсоры типа HTU21D просто не успеют, у них редел 100KHz. так что ваша библиотека для PCA9534 только для PCA9534 :). ни о какой универсальности речи не идет. это противочит идеологии Arduino - где скорость и оптимизация кода пренебрегается в угоду универсальности.

статью читал и описанный костыль использую. но чтение со slave так и не победил. бьюсь уже месяц.
 
Последнее редактирование:

AndrF

Active member
те базовая задежка twi_dcount = 3 что приблизительно равно скости I2C 300KHz. PCA9534 нормально перемалывает пакеты до 400KHz, а сенсоры типа HTU21D просто не успеют. и них редел 100KHz. так что ваша библиотека для PCA9534 только для PCA9534 :). ни о какой универсальности речи не идет. это противочит идеологии Arduino - где скорость и оптимизация кода пренебрегается в угоду универсальности.
Так скорость можно по ходу менять, если это действительно необходимо. Причем тут Arduino?
 

enjoynering

Well-known member
Так скорость можно по ходу менять, если это действительно необходимо.
понимаете в чем дело ваша библиотека то не одна. люди например еще используют HTU21D и часы DS3231 или еще что. и вот после инициализации всего это зоопарка ваш костыль выставляет 300KHz на шине. остальные билиотеки об этом не знают. чайники которые их используют дальше примеров не лазят. угадайте что произойдет? все встанет колом из-за ваших 300KHz. :)

Причем тут Arduino?
потому что в вашей библиотеке синтаксис Arduino IDE у Espressif ESP8266 SDK друой набор команд для I2C. и уж если вы пишите либы для Arduino IDE и ВЫКЛАДЫВАЕТЕ ЭТО ДЛЯ ВСЕХ то их надо стараться делатьУНИВЕРСАЛЬНЫМИ. вот если для себя тода - вопросов нет. для себя можно из овна и палок.
 
Последнее редактирование:

rashn

New member
так что ваша библиотека для PCA9534 только для PCA9534 :). ни о какой универсальности речи не идет
Перечитал свой ОП и не понял где вы прочитали про универсальность? Я четко указал что библиотека для работы с РСА9534 и не обещал совместимости с другими модулями. Согласен, моя добавленная строчка может создать кому-то проблем, именно поэтому в библиотеке которая прицеплена её нет, она есть только у меня.

У меня первые 4 порта задействованы как output, вторые 4 как input. С них читаю нормально всё. Второй модуль параллельно не ставил, не пробовал. Экранов и SD кард ридеров тоже не цеплял - нет такой задачи.

Если победите глюк - скиньте обязательно решение. Спасибо!
 

enjoynering

Well-known member
извините отредактировал после вашего ответа. поэтому процитирую свои ответ

если вы пишите либы для Arduino IDE и ВЫКЛАДЫВАЕТЕ ЭТО ДЛЯ ВСЕХ то их надо стараться делатьУНИВЕРСАЛЬНЫМИ. вот если для себя тода - вопросов нет. для себя можно из овна и палок.
нуи как пример проекции.
изобретатель: ребята смотрите что я изобрел - вечные батарейки АА!
ребята: ура! щас мы их в плеер!
изобретатель: в плеер нельзя
ребята: как нельзя?
изобретатель: ну там так не получится, там частота не та и вот тут подпилить надо и тут добавить
ребята: ну ты же сказал что они АА
изобретатель: да сказал, но я неговорил что они для плеера.

антракт :)

кому-то проблем, именно поэтому в библиотеке которая прицеплена её нет, она есть только у меня.
извините не заметил. претензия снимается.
 

Antynik

Member
А не проще ардуину micro или nano подцепить к ESP?
Портов гораздо больше, возможностей тоже. И дешевле.
 

enjoynering

Well-known member
А не проще ардуину micro или nano подцепить к ESP?
Портов гораздо больше, возможностей тоже. И дешевле.
чето у меня феррари не едит. хм, не знаю. но у меня есть жигули. могу твою феррари на крышу к ней поставить. а че класс дверей то больше и дешевле.
 

rashn

New member
А не проще ардуину micro или nano подцепить к ESP?

Сосед по ветке юморит сарказмами, а я попробую объяснить. Дело в том что у ардуин (кроме Меги2560) очень мало памяти. Тот же сервис BLYNK с трудом влезет на Микру/Нано/Уно, с одним-двумя виджетами и без функционала - памяти не хватит. Скорость 16 МГц, против 80, ну и тд.
 

Antynik

Member
Дело в том что у ардуин (кроме Меги2560) очень мало памяти.
Так я же не призываю логику на ардуине организовать.
Использовать её точно так же, как расширитель портов. Можно и предобработку простую навесить, но вовсе не обязательно.
Просто не понимаю, чем хуже. Портов больше, цена меньше.
 
Сверху Снизу