Простой микроконтроллер I2C

SteveBM
Offline
Зарегистрирован: 10.04.2014

Привет друзья. Полтора года назад я, в том числе с помощью этого форума, сделал вот такой ж.д. макет. Внутри сидят две ардуины, на макете три сервопривода, перед тупиками стоят датчики Холла. Подсветка макета тоже управляется программно.

Управляется это все вместе с поездами с android телефона или ПК, через вот такую схемотехнику. 

  

Однако нет предела совершенству (точнее выплыли новые проблемы). И выплыли они там, где их не ждали :(

В текущей версии локомотивы управляются аналогово через ШИМ ардуины посредством L298 по двум каналам, соответственно верх и низ макета (он двухуровневый). Беда в том, что из за достаточно плохого контакта L298 -> БЛОК РЕЛЕ -> РЕЛЬСЫ, РЕЛЬСЫ, РЕЛЬСЫ -> КОНТАКТЫ КОЛЕСНОЙ ПАРЫ тяга моторов непостоянна. Самое противное режимы старта локомотива и медленное движение происходят рывками.

Эта проблема известна и решается DDC управлением - на рельсах постоянное напряжение и по ним же цифровой сигнал, а на локомотиве декодер и драйвер двигателя. Но это не наш метод, не так ли?   

Вторая проблема сам Bluetooth. Всем хорош, его подключение к телефону или компу стандартными драйверами работает, но... весьма странно иногда.

ESP8266 достаточно мал по размерам и влезает вместе с обвязкой в локомотив. Это дает мне возможность управлять каждым локомотивом по отдельности и засунуть туда еще и датчики Холла. а на рельсы ставить магниты (сейчас все наоборот, и это геморрой - так как поезд действительно останавливается перед тупиком, но при этом останавливаются и все остальные). Как это у меня получится, я, если будут вопросы напишу. 

А вот теперь собственно вопрос. Заодно я решил переделать управление самим макетом. Оставить одну Ардуину, она будет крутить сервы привода стрелок, а вот включать/выключать свет в домах, уличное освещение и светофоры хочется вот так:

Вопрос какой контроллер лучше использовать. У Attiny13 насколько я начитался есть сложности с реализацией I2C. Можно вообще взять EEPROM AT24C256 и расставить их к каждому светофору, дому, сети дорожных светильников (и можно ли так сделать?). А может кто знает готовую м/с с обвязкой которая держит около 60mA и висит на I2C. В общем что-либо дешевое, сердитое и универсальное. Буду очен благодарен за идеи и советы

Logik
Offline
Зарегистрирован: 05.08.2014

SteveBM пишет:

Эта проблема известна и решается DDC управлением - на рельсах постоянное напряжение и по ним же цифровой сигнал, а на локомотиве декодер и драйвер двигателя. Но это не наш метод, не так ли?   

Не так! Стандарт DCC весьма не плох. Делать в его рамках чего хочется, и на ардуине тоже, можно, нужно и даже рассово верно. 

SteveBM пишет:

 У Attiny13 насколько я начитался есть сложности с реализацией I2C. Можно вообще взять EEPROM AT24C256 и расставить их к каждому светофору, дому, сети дорожных светильников (и можно ли так сделать?). 

Сложностей особых нет. Аппаратной поддержки, правда тоже нет. Потому ногодрыг и вперед. Но i2c изначально не для таких вещей. Он для внутриплатной, на крайняк внутриприборной, передачи. Строить на нем длинный разветвленный канал, да еще и рядом с силовой искрящей цепю неосмотрительно. Не то чтоб категорически нельзя, а именно не рекомендуется при наличии лучшего, шоб Вы понимали.  Ежели DCC не нравится, то можна 485-й сделать, но уже не по рельсам а отдельно проводами, как i2c. У него и проводов менше и помехостойкость віше.

Причем тут EEPROM AT24C256 я так и не понял. Вам по идее нужны датчики и исполнительные устройства на i2c.

А макет симпатишный! Уважаю красивые и аккуратные поделки. Жаль мне никогда на такое не хватает времени из-за этого программирования.

SteveBM
Offline
Зарегистрирован: 10.04.2014
Спасибо Logik!
Не спорю DDC хорош, но... Делать бустер arduino|блок питания, затем делать отдельно блок управления, затем повторять это-же в локомотивном декодере, и в следующем, и еще в одном  - это длииииинное и дорогое занятие. Я посмотрел OpenDDC решение на Attiny15 -  http://www.g-zi.de/, да работает, да есть код и примеры. Но мне нужна ОБРАТНАЯ связь - не только команды конкретному локу --> вперед --> тяга 10%, но и обратный сигнал к более интеллектуальной штуке, типа PC. Для этого пока магниты на путях и Холл в локе.
Смысл в том, ято я в будущем хочу координатную привязку лока к месту на макете. И псевдосамостоятельную "жизнь" поездов.
 
Сейчас так работает только освещение на макете, в режиме "ночник" оно включает/выключает по 20-ти каналам около сотни светодиодов на макете в RND режиме. Кроме того, использовать Wi-Fi проще, он изначально многоканальный и один погонщик может гонять с планшета, второй с телефона и прочее РАЗНЫЕ локи. Еще раз подписываюсь DDC правильнее, использовать ESP8266 неэффективно, но - ведь удобнее.
 
Что касается I2C и тут соглашусь... Но у меня макет 3 метра длинной, и состоящий из двух частей. Ардуины стоят вот так: 
 
 
И всего по ДВУМ проводам Arduin-ы работают в дуплексном режиме. Никаких сбоев нет, хотя в самописном протоколе обмена команды дублируются трижды. Если предложите что нибудь более простое чем ДВА провода, буду очень благодарен.
 
А раз он работает (а в макете места для проводов не так много), то возникла идея управлять простыми лампочками (светодиодами) как описано выше по общей шине в симплексном режиме. Так как в макете их в каждом доме минимум 5, и они разбросаны по разным местам макета, то возник вопрос данной темы.
 
Что касается  EEPROM AT24C256 есть такая штука : AT24C256 I2C Interface CP09208 D63 256k Bits EEPROM Memory Module D63 256k, и может это "некошерное" ее использование, и так не заработает, но опять таки очень просто и дешево.
 
В общем вопрос прежний, посоветуйте что-нибудь простое для этих целей. Спасибо.
  
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а радиомодули не вариант поставить?

Logik
Offline
Зарегистрирован: 05.08.2014

SteveBM пишет:

 
Что касается I2C и тут соглашусь... Но у меня макет 3 метра длинной, и состоящий из двух частей. Ардуины стоят вот так: 
 
И всего по ДВУМ проводам Arduin-ы работают в дуплексном режиме. Никаких сбоев нет, хотя в самописном протоколе обмена команды дублируются трижды. Если предложите что нибудь более простое чем ДВА провода, буду очень благодарен.
 
Даже 3 метра возле "искрящего" макета много. В i2c нет никаких средств помехоустойчивости. Он просто предназначен для работы в условиях без помех. Несколько повысить устойчивость можна используя резисторы подтяжки меншего сопротивления. Но такое катит если сеть маленькая - мастер да 1-2 слейва. У Вас же масштаб больший, сеть разветвленная. И если максимальный размер 3 метра, то какая суммарная длина проводов в сети?
 i2c использует не 2 а 3 провода - земля, sda, scl.А в реале еще питание надо, потому проводов 4 выходит. Нормальное его применение один мастер пару (ну до 10) слейвов. Мастер спрашивает любого одного в каждый момент, читает или пишет.  Вы я так понимаю хотите несколько мастеров. Мультимастер тоже есть, но с ним все намного хитрей, арбитраж в протоколе не рассматривается, его делать самому прийдется. В общем мультимастер там неудобный, применяют не часто, я за много лет его не встретил на практике.
Альтернативы
1. RS485 Протокол низкого уровня, фактически описана передача состояния канала (0 или 1) но очень помехоустойчевый 2 провода дифференциальной токовой передачи. Обычно служит в качеств асинхронного (как сомпорт компютера) канала между равноправными устройствами. 
2. CAN более высокоуровневый, автомобильный, не плох, арбитраж сделан очень хороше. Лично не использовал, о подводных камнях не знаю.

SteveBM пишет:

 
А раз он работает (а в макете места для проводов не так много), то возникла идея управлять простыми лампочками (светодиодами) как описано выше по общей шине в симплексном режиме. Так как в макете их в каждом доме минимум 5, и они разбросаны по разным местам макета, то возник вопрос данной темы.
 
Что касается  EEPROM AT24C256 есть такая штука : AT24C256 I2C Interface CP09208 D63 256k Bits EEPROM Memory Module D63 256k, и может это "некошерное" ее использование, и так не заработает, но опять таки очень просто и дешево.
 
 Это микросхема памяти! Грубо говоря - жесткий диск. Как её использовать для управления и контроля??? Как жестким диском управлять лампочкой?! Это не "некошерное", это практически невозможно. Куда Вы лампочку подключите?
T.Rook
Offline
Зарегистрирован: 05.03.2016
Logik
Offline
Зарегистрирован: 05.08.2014

T.Rook пишет:

 

 ну тогда уж можно вспомнить и  стандатрную PCF8574 - I2c port expander, в дешевом исполнении для 1602

 

В принципе  да. Только в макете наверно не везде готовую плату сунуть удобно.

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

Лично я в подобных случаях использую гибрид из CAN (аппаратная часть) и UART (программная часть). Если UART нет в контроллере, то можно реализовать его программно. Под аппаратной частью CAN я подразумеваю драйвер приемопередатчика CAN, например, PCA82C250, MCP2551 и так далее, который подключается к выводам UART микроконтроллера (или выводам программно выполняющим эти функции).

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Alex_Ferrum пишет:

Лично я в подобных случаях использую гибрид из CAN (аппаратная часть) и UART (программная часть). Если UART нет в контроллере, то можно реализовать его программно. Под аппаратной частью CAN я подразумеваю драйвер приемопередатчика CAN, например, PCA82C250, MCP2551 и так далее, который подключается к выводам UART микроконтроллера (или выводам программно выполняющим эти функции).

Если я правильно понял - ты используешь  общение между  МК по сериал-протоколу, соеденив МК через CAN трансиверы?

SteveBM
Offline
Зарегистрирован: 10.04.2014

Всем ответившим большое спасибо!

Наверное я плохо донес свои мысли. Ардуина работает в режиме мастер - остальные только слэйвы. Слэйвов, по моим прикидкам не больше 8-ми. С мультимастером я уже набаловался в текущей конфигурации макета. Вопрос в ДЕШЕВОМ "управлятеле" светодиодами. Очень интересная идея с Iic / I2C / интерфейс LCD1602 2004 ЖК, вопрос как ее применять, если можно с примером.

По поводу  AT24C256 - а почему я не могу на логическую единицу, она же высокий уровень, она же +5v повесить светодиод? Ну с ключевым транзистором? На J1-J4? Это же четыре канала!

 

Что касается физической реализации шины I2C, то она выглядит ка 10-проводый шлейф:

и я его, где мне нужно протыкаю разъемом и получаю все что мне нужно - и питание и сигналы SDA и SCL. Еще раз, значимых (замеченных мною) помех по I2C у меня на макете в течении года нет. Скорость срабатывания привода стрелки - полсекунды, то есть мне достаточно 8 бит/с... 

Радиомодули - ну это весьмая дорогая идея.

Отдельно про 485 серию - это PIC, не так-ли. Я с ним не знаком, в качестве программатора у меня только UNO - так что только attiny, или я чего-то не знаю - просветите пожалуйста.

 

Alex_Ferrum
Offline
Зарегистрирован: 04.05.2015

nikolaki пишет:

Alex_Ferrum пишет:

Лично я в подобных случаях использую гибрид из CAN (аппаратная часть) и UART (программная часть). Если UART нет в контроллере, то можно реализовать его программно. Под аппаратной частью CAN я подразумеваю драйвер приемопередатчика CAN, например, PCA82C250, MCP2551 и так далее, который подключается к выводам UART микроконтроллера (или выводам программно выполняющим эти функции).

Если я правильно понял - ты используешь  общение между  МК по сериал-протоколу, соеденив МК через CAN трансиверы?

Совершенно верно. RS485 в этом плане мне кажется не очень надежным в плане возникновения коротких замыканий в случае начала передачи 2 устройствами на линии одновременно (да, я знаю что сейчас есть драйвера устойчивые к коротким замыканиям, но все же), второй момент связан с требованием к смещению.

По поводу арбитража (на "CAN" шине), он нужен в многомастерных системах (в одномастерных я обычно ввожу поочередный опрос мастером всех устройств на шине) и в принципе его несложно организовать программно. В плане надежности передачи данных, на небольшой скорости повреждений данных не происходит, для большей надежности можно ввести передачу контрольной суммы или передачи одного сообщения, команды или пакета несколько раз подряд.

SteveBM
Offline
Зарегистрирован: 10.04.2014

И еще раз, чтобы не запутаться (с радиомодулями). От макета остается только:

ЛОКОМОТИВЫ НЕ СВЯЗАНЫ ТЕПЕРЬ С МАКЕТОМ!!! Если интересно то планируется сделать вот так: 

Спасибо за внимательность :) 

Вопрос прежний про варианты применения ДЕШЕВЕЙШИХ м/с для вот таких целей:

SteveBM
Offline
Зарегистрирован: 10.04.2014

Наверное я некорректно поставил вопрос. Какую шину использовать? И, кстати, еще вопрос - на макете я планирую поставить ESP8266 amica. Может вообще отказаться от Arduino на макете? Поясню картинкой:

И был неправ с  EEPROM, признаю, спасибо Yarik.Yar. И MCP23008 интересная штука, правда дорогая. Но скорее мое решение надо искать по поисковому запросу: led-driver with i2c-bus interface... Всем спасибо!

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

J1...J4 - перемычки на плате. Ими управлять только вручную можно:)

T.Rook
Offline
Зарегистрирован: 05.03.2016

SteveBM пишет:

 Iic / I2C / интерфейс LCD1602 2004 ЖК, вопрос как ее применять, если можно с примером.

Вот тут есть описание со схемой и datasheet-ом (хоть по внешнему виду плата чуть другая).  А тут на русском с примерами. Выходы: Р0...Р7. Правда на одном (Р3) уже транзистор с открытым коллектором. Как для вкл/выкл светодиодов  пойдет. ШИМ через это не реализовать.

Вариант показанный Вами на #12 - ага, вполне можно и без ардуинки обойтись.

SteveBM
Offline
Зарегистрирован: 10.04.2014

T.Rook. То, что надо - большой респект!

T.Rook
Offline
Зарегистрирован: 05.03.2016

SteveBM пишет:

T.Rook. То, что надо - большой респект!

Обратите внимание, что PCF8574 именно расширитель портов, а не просто I2C регистр вывода - т.е. Р0...Р7 можно использовать и как выходы и как входы.

Logik
Offline
Зарегистрирован: 05.08.2014

Alex_Ferrum пишет:

Совершенно верно. RS485 в этом плане мне кажется не очень надежным в плане возникновения коротких замыканий в случае начала передачи 2 устройствами на линии одновременно (да, я знаю что сейчас есть драйвера устойчивые к коротким замыканиям, но все же), второй момент связан с требованием к смещению.

Лбой драйвер 485 это легко выдержует. Главное чтоб програмная часть все это и учитывала колизию. Но если мастер один - то и проблемы нет.

 

Alex_Ferrum пишет:

По поводу арбитража (на "CAN" шине), он нужен в многомастерных системах (в одномастерных я обычно ввожу поочередный опрос мастером всех устройств на шине)

Так в CAN вроде любое устройство может в любой момент при свободной шине начать передачу. Если мне память не изменяет. Потому там и такое внимание к арбитражу.

 

SteveBM
Offline
Зарегистрирован: 10.04.2014

Открылся мой сайт arduinorailmaket.ru, там подробное описание постороения ж.д. макетов с использованием Ардуино. Сначала просто загрузите с него в смартфон программку с сайта и покатайтесь на поезде. Затем, на том же сайте есть и полноценное решение для любого макета. Заходите!.