2021-10-14 18:42:44

Контроллер освещения для макета железной дороги

В мемориз Хобби Железо

Контроллер освещения

Некоторое время назад мне пришла мысль оживить "темное время" на макете путем переключения отдельных элементов освещения строений. Немного поразмыслив получился следующий алгоритм управления лампочками:


  • на старте включаем 2/3 всех ламп случайным образом,
  • выставляем метку времени через сколько минут каждая лампа должна сменить свое состояние так же случайным образом,
  • при этом интервал, который лампа будет выключена принудительно уменьшаем вдвое,
  • при наступлении метки времени меняем состояние лампы и заново вычисляем интервал смены состояния,
  • интервалы вычисляем таким образом, чтоб они были не менее 1 минуты и не более 15 (или 60) минут.

Логика простая, с ней прекрасно справится самый простой и дешевый микроконтроллер, например, ATtiny13.

Распиновка ATtiny13

Основываясь на опыте платы для подключения диодов, решил дополнить ее микроконтроллером. У ATtiny13 есть 5 ножек, которые можно использовать, 4 под диоды, 1 под переключение режима работы (цикл 15 или 60 минут). Таким образом плата освещения будет иметь все те же 8 выходов, только 4 будут управляться контроллером, а остальные 4 всегда включены, как раньше.

Плата контроллера освещения

Это удобно для комбинирования уличного освещения, например, фонарных столбов, и освещения внутренностей жилых домов. Ну или для здания вокзала, у которого первый этаж всегда включен, а на втором окна могут загораться и гаснуть. Или для церквушки, у которой 3 точки освещения: одна над входом, вторая в башне, третья в основном помещении. Если над входом свет может гореть всегда, то в башне и основном помещении будет логично иногда его выключать.

Начав использовать ATtiny13 столкнулся с неожиданной проблемой получения случайного числа, на основе которого работает алгоритм освещения. Классический арудино подход, когда для инициализации генератора случайных чисел используется чтение с не подключенной аналоговой ножки, использовать не получится т.к. у контроллера остается всего одна свободная ножка, и это ресет. У него имеется внутренняя подтяжка к питанию, поэтому аналоговое чтение с него бесполезно.

Немного углубившись в тему случайных чисел на микроконтроллерах, удалось найти несколько решений.

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

int bootrandom __attribute__ ((section (".noinit"))); ///< random at power up

void setup() { ... }

void loop() { ... } 

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

Еще вариант - использование специальной библиотеки для ATtiny, которая генерит случайные числа и запоминает вектор инициализации в EEPROM, чтоб после каждой перезагрузки не повторять пройденную последовательность.

Более интересный вариант, использовать чтение с аналоговой ножки перед ее инициализацией как выхода. Но для того, чтоб это работало, нагрузку (светодиод) нужно коммутировать не плюсом как обычно, а минусом, т.е. включаться он будет подачей LOW на ножку, а не HIGH. Соответственно и немного другая схемотехника.

Стенд с ATtiny13

В итоге в качестве рабочего решения взял самое простое - неинициализированную переменную при загрузке (первый вариант выше). За время опытной эксплуатации это решение показало себя вполне работоспособным.

Не смотря на простоту алгоритма, с обвеской из аруино он занял 96% памяти маленького ATtiny13. Пока ждал платы, а это почти месяц, контроллер на макетной плате (фото выше) успешно работал сутки напролет. За это время алгоритм и схемотехника решения показали себя хорошо, все работает как задумано. Теперь такие контроллеры буду ставить под макетом для освещения разных зданий.

Тестовый контроллер освещения

Прошивка ATtiny

Разработка контроллера освещения стала для меня первой возможностью на практике поиграться с ATtiny13. Когда приехали микросхемы пришлось параллельно писать софт и осваивать взаимодействие с чипами.

Для заливки прошивки в ATtiny проще всего использовать имеющеюся плату ардуино. Для этого берем в Arduino IDE в меню Файл > Примеры > ArduinoISP и заливаем в ардуино, теперь плата будет работать как программатор.

Подключаем ATtiny к ардуино согласно схеме:

Схема подключения ATtiny к Arduino

Ну или так для наглядности:

Схема подключения ATtiny к Arduino Nano

Теперь нужно объяснить нашей Arduino IDE, что такое ATtiny и как с ним работать. Для этого нужно добавить его в менеджер плат. В меню Файл > Настройки в пункте "Дополнительные ссылки для менеджера плат" добавляем https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json. Я использовал реализацию MicroCore, как наиболее популярную, но есть и другие, например, форк optiboot. Далее в меню Инструменты > Плата > Менеджер плат находим "MicroCore" (или то что вы добавляли) и жмем "Установить".

В меню выбора платы появились новые пункты, нужно выбрать ATtiny13, а в меню "Программатор" выбрать "Arduino as ISP", чтоб использовать подготовленную ардуино как программатор для ATtiny. Помимо этого, после выбора платы в меню появилось несколько специфичных новых элементов, описание "что и зачем" есть по ссылкам выше и зависит от реализации ATtiny, которую добавили. В общем, это настройки (или фьюзы микроконтроллера) которые выставляются при записи загрузчика. Перед первой прошивкой нужно выбрать настройки и записать загрузчик. Я изменил только "Clock" на "1.2 MHz internal oscillator", поскольку скорость для моих целей не нужна, а потребление электричества немного сократится.

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

Полезные ссылки по теме