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


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

Принципиальные схемы, фотографии и видео под катом

Введение

Некоторое время назад узнал о существовании платформы arduino. И сразу захотелось что-то сделать на ней. Уже лет 10-12 занимаюсь чистым программированием, впрямую с системами автоматизированного управления не связанным. А до этого проектировал специализированные вычислительные устройства, т.е. был, как у нас говорилось, «железячником». В общем захотелось вспомнить старое и сделать что-то несложное, но руками.

Взгляд упал на детскую железную дорогу Piko… Сразу решил, что буду делать светофорчики, автоматическую стрелку, и, чтобы все это само крутилось, датчики положения поезда. Управлять этим хозяйством будет arduino. Электромоторы поезда и стрелки — через плату управления двигателями motor shield.

Arduino (в версии Freeduino 2009), motor shield и комплект макетных плат proto shield были заказаны на freeduino.ru наложенным платежом. Как и обещали на сайте, платы дошли до Москвы где-то за неделю.

Плата расширения

Сразу стало очевидно, что свободных цифровых входов/выходов arduino будет недостаточно. Поэтому была поставлена задача разработать плату расширения для увеличения количества цифровых входов и, главное, выходов.

Плата должна была:
а) иметь как минимум по 16 цифровых входов и выходов, чтобы ее можно было использовать в будущем и для других целей;
б) занимать минимальное число портов arduino;
в) по возможности не использовать порты 0 и 1, чтобы оставить возможность связи arduino по последовательному каналу с другими платами (когда-нибудь) или с PC;
г) быть совместимой по входам/выходам с motor shield (не пересекаться или пересекаться безопасным образом).

Идея была почерпнута из схемы motor shield’а: последовательная передача данных из/в плату расширения с помощью сдвиговых регистров.

Принципиальная схема того, что получилось:
image
Последовательно включенные регистры DD1 и DD2 служат для приема данных с цифрового выхода arduino #8 со сдвигом по положительному фронту на выходе #4. Защелкивание выходов регистров производится по положительному фронту на выходе #9. Выходы регистров выведены на собственные разъемы платы XS1 и XS2.
Регистры DD3 и DD4 выполняют функцию чтения цифровых входов платы с разъемов XS3 и XS4. Запись в регистры осуществляется отрицательным фронтом на выходе arduino #10. Сдвиг производится одновременно с DD1 и DD2 по положительному фронту на выходе #4. Данные выталкиваются в arduino на цифровой вход #2.
Для питания платы и подключаемых устройств используется стабилизатор DD5, чтобы не нагружать собственный стабилизатор arduino.
Итого задействовано 5 цифровых портов arduino. Пересекаемся с motor shield по порту #4 (он там также используется для сдвига данных во внутреннем регистре, поэтому параллельное использование безопасно), по порту #8 (он также используется для вывода последовательных цифровых данных), по портам #9 и #10 (они используются в motor shield для подключения сервоприводов, что мной не планируется).

Алгоритм опроса/записи данных в общем очевиден: отрицательным импульсом на порту #10 защелкиваем входные данные в DD3 и DD4; далее в цикле читаем очередной бит входных данных с порта #2, выставляем очередной бит выходных данных на порт #8, подаем сдвиговый положительный импульс на порт #4; после завершения цикла положительным импульсом на порту #9 защелкиваем выходы DD1 и DD2. Длина цикла — по максимальному количеству из подключенных входов и выходов.

Плата собрана на приобретенной макетной плате proto shield.
Фотография платы расширения (радиатор поставлен на стабилизатор DD5):
image

Вся этажерка в сборе, включая (снизу вверх): arduino, motor shield, плата расширения, кросс плата (служит как переходник между разъемами платы расширения и разъемами внешних устройств, резисторы на плате для подтяжки кнопок к питанию):
image

Светофоры

Светофоры было решено выполнить на обычных индикаторных светодиодах. Приобретены в требуемом количестве в Митино. Марка неизвестна.

Принципиальная схема светофора:
image
Светодиоды включены в коллекторные цепи транзисторов VT1 и VT2 различной полярности, что позволило управлять светофором одним сигналом. Можно было бы обойтись и без транзисторов и включить светодиоды через сопротивления напрямую к выходам платы расширения, но тем самым число используемых выходов платы увеличилось бы вдвое. Не хотелось.
Марка транзисторов выбрана по принципу «какие были»
Светофоры собраны в количестве 6-ти штук на кусочках макетной платы. Больше сказать о них в общем нечего.
image

Стрелка

Для переключения стрелки использован шаговый двигатель из старого 3.5» FDD дисковода. Двигатель подключен к motor shield через токопонижающие резисторы 220 Ом, 0.5 Вт по одному на обмотку (собственное сопротивление обмоток оказалось малым).
image

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

Датчики положения

Чтобы замкнуть контур системы управления потребовалось сделать датчики положения поезда (вернее будет их назвать датчиками пересечения). Был рассмотрен вариант емкостных/индуктивных датчиков т.к. чувствительный элемент в виде кусочка текстолита с металлизацией или плоской катушки, укладываемый под рельсы, легко и просто реализуем. Однако все найденные в сети схемы оказались или простыми, но чувствительными к окружающей обстановке (температуре/влажности/предметам), или сложными по числу деталей и настройке. Разрабатывать свою схему не решился, т.к. аналоговая схемотехника давно и прочно мной забыта.
В общем остановился на другом очевидном варианте: оптический датчик пересечения на паре инфракрасных свето- и фотодиоде. Была разобрана старая шариковая мышка и из нее вынуты три пары.

Принципиальная схема датчика:
image
Тут требуются пояснения. Сначала была собрана правая часть схемы с фотодиодом. Светодиод изначально предполагалось запитать постоянным током, транзистор VT2 заставить работать в ключевом режиме, и его выход завести на цифровой вход платы расширения. Однако оказалось, что настроить рабочую точку транзистора VT2 не получается: в зависимости от окружающей освещенности (солнце через окно) сигнал на коллекторе транзистора плавает в очень широких пределах вне зависимости от того, открыт ли светодиод или нет. Можно было бы сделать маскирующий чехольчик на фотодиод, максимально прикрывающий его от окружающего света, но мне это решение показалось не надежным.
В результате было решено сделать управляемый светодиод. Сигналом «CTRL» на входе схемы производится периодическое включение и выключение светодиода. Выход схемы «SIGNAL» подключен к аналоговому входу arduino. Решение о том, есть ли пересечение светового луча, принимается на основе сравнения выходного сигнала в полупериоды с включенным и выключенным светодиодом (не превышает ли разница заданный порог). Данный вариант получился стабильным при любом окружающем освещении от полной темноты до яркого солнца.

Датчики собраны в количестве 3-х штук на кусочках макетной платы. На фотографии слева — приемная часть с фотодиодом, справа — передающая.
image

Звук

Решил, что сделать гибко программируемую собственную плату звукогенератора будет сложновато. Можно было бы выполнить ее на основе ПЗУ, в котором записаны звуковые семплы, однако для записи этих семплов потребуется как минимум программатор. Кроме того, на плату придется установить некоторый набор логики для адресации ПЗУ вместе со звуковым усилителем.
В общем было решено пойти по пути наименьшего сопротивления. Воспроизведением звука в моей системе занимается персональный компьютер. Arduino по последовательному интерфейсу посылает на PC наборы символов. На PC запущена программа, которая слушает COM-порт, и, при обнаружении одной из заданных последовательностей символов, воспроизводит соответствующей ей wav файл. Просто, гибко и, главное, звук отличный.

Программное обеспечение

Программное обеспечение arduino состоит из:
1. Библиотека низкоуровневого управления платой расширения, реализующая описанный выше алгоритм опроса/записи данных из/в плату.
2. Выше уровнем — библиотека управления внешними устройствами. Выполняет:
a) управление плавным разгоном и торможением поезда с заданным ускорением (через библиотеку motor shield);
б) управление двигателем стрелки (через библиотеку motor shield);
в) переключение светофоров;
г) опрос датчиков пересечения (переключение светодиодов датчиков, определение разницы сигналов на выходах датчиков при включенных и выключенных светодиодах);
д) опрос кнопок с программным антидребезгом.
3. Выше уровнем — библиотека, реализующая перепрограммируемый конечный автомат. Ее задачей является выполнение заданных последовательности действий с управляемым оборудованием по сигналам с датчиков, кнопок, по таймеру и т.п.
4. Собственно скетч arduino выполняет программирование данного конечного автомата.
5. Упомянутая выше программа на PC для воспроизведения звука.
Исходники

Что получилось

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

Прямая ссылка на видео

Заключение

На реализацию всего этого ушло примерно 2 недели по вечерам.
В заключении можно сказать о дальнейших планах. На плате motor shield пока остались не задействованы выводы для подключения еще одного двигателя. Есть мысль сделать ж/д переезд со шлагбаумом и мигающими красными светодиодами.


0 комментариев на «“Автоматизация детской железной дороги”»

  1. класс!!! голубее мечты в моем детстве небыло никогда)))!!! кстати по каталогу pico все это по моему есть в стоке но по финансам укомплектовать дорогу оригиналом — просто неподъемно…
    и на помощ как всегда приходит Arduin-ка… лично я её обожаю)))

  2. класс!!! голубее мечты в моем детстве небыло никогда)))!!! кстати по каталогу pico все это по моему есть в стоке но по финансам укомплектовать дорогу оригиналом — просто неподъемно…
    и на помощ как всегда приходит Arduin-ка… лично я её обожаю)))
    АФФтор Молодчага!!!

  3. Пожалуйста, выложите исходники, для ленивых и плохо знакомых с кодингом. Иначе статья только пооблизываться. ^_^ А вообще забавная идея — автору респект.

  4. Всем спасибо. Доброе слово и кошке приятно 🙂
    Хотел выложить на хабр, но там посчитали статью недостойной. Обидеться на них, что-ли. У них там про arduino в основном ерунда всякая.
    По просьбам трудящихся выложил исходники. Кому интересно — берите, пока лежат.
    Комментировать их сейчас, к сожалению, времени нет, но там, вроде, ничего особенно сложного нет (в самих исходниках есть комментарии).

    • Спасибо! Хорошая статья и хороший код!
      К сожалению, у меня на хабре пока недостаточно кармы, чтобы инвайт выслать, иначе уже выслал бы 🙂
      Если хотите могу разместить статью с указанием авторства и электропочтой для инвайта 😉

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

      Александр Воробьев
      alexander ТЧК alexanderav ТЧК vorobiev НА gmail.com

    • Спасибо!
      Только что-то хабр не коннектится у меня сегодня
      Поглядеть не могу пока

    • итог: статью-ссылку администрация переместила в черновики, а меня забанили на месяц :))))

    • Прошу прощения за невольно причиненные неудобства
      Они хоть объяснили за что?
      Детский сад какой-то

    • ерунда 🙂
      нет — мне ничего не написали, просто обнаружил что статья оказалась в черновиках, подумал, что может сам случайно её туда поместил, попробовал опубликовать, а мне выскакивает надпись:

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

      Никак не пойму что им не понравилось в железной дороге О_о
      Впрочем, как я уже сказал — это ерунда — лишний повод побольше писать на этом сайте :)))

    • Да уж. У них там столько всякой фигни публикуют.

    • Спасибо за исходники. А с Хабром забейте — там в основном чисто софтверные решения и гаджеты популярны, самодельные железки там не в фаворе. Лучше пишите тут, удобный сайт и как раз про хардварную автоматизацию процессов.

    • А исходники выложите еще раз, удалили за нарушение авторских прав 🙂

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение