Как сделать светофор js

Обновлено: 05.07.2024

Очередной CI светофор. На этот раз attiny2313 и Node.js

2014-09-16 в 14:53, admin , рубрики: attiny2313, diy или сделай сам, Jenkins, node.js, светофор, электроника, метки: attiny2313, c++, diy или сделай сам, Jenkins, node.js, светофор, электроника

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

Очередной CI светофор. На этот раз attiny2313 и Node.js

Под катом светофор из цветомузыки и пластиковых бутылок, USB модуль управления светофором на attiny2313 за доллар, а так же софт для опроса Jenkins и управления USB модулем на Node.js.

Проект был разделен на 3 части

Светофор

Светофор решили делать из старой цветомузыки, ровный корпус и хорошие стекла — это то, что нужно. Козырьки были вырезаны из пластиковых бутылок и покрашены вместе с корпусом в чёрный цвет. От внутренней начинки избавились, ведь он работал от сетевого напряжения, а нам нужно переделать на 5в от USB.

Вместо ламп я использовал светодиоды, которые предварительно выпаял из светодиодной ленты. Для большей яркости решил сделать сборки по 4 светодиода, соединенных параллельно и ограничил протекающий через них ток резисторами по 100ом, порты attiny2313 нормально справляются с нагрузкой около 20мА.

Очередной CI светофор. На этот раз attiny2313 и Node.js

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

Очередной CI светофор. На этот раз attiny2313 и Node.js

Светодиодные сборки я прикрепил к крышкам от бутылок при помощи болтов М3 и трубок с внутренним диаметром 2мм, сделал это для того, чтобы была возможность отрегулировать расстояние для большей яркости.

Очередной CI светофор. На этот раз attiny2313 и Node.js

Очередной CI светофор. На этот раз attiny2313 и Node.js

Очередной CI светофор. На этот раз attiny2313 и Node.js

Электроника

В наличии у меня были два AVR микроконтроллера: более дешевый attiny13 с 1kB памяти и чуть дороже attiny2313 c 2kB памяти. Для того, чтобы устройство могло работать с USB протоколом, я не собирался усложнять схему дополнительными USB модулями так как это можно сделать прямо на MK при помощи прекрасной библиотеки V-USB.

Минимальный размер памяти, необходимый этой библиотеке, равен около 1.3kB — поэтому выбор пал на attiny2313. Цена этого микроконтроллера 1-2 доллара, купить его тоже не составит никакого труда, так как это очень популярная модель.

Схема электроники

Схема устройства очень простая, для наглядности покажу свою, но в качестве руководства советую изучить возможные варианты, так как здесь предложены 3 варианта схем, описаны их достоинства и недостатки:

Очередной CI светофор. На этот раз attiny2313 и Node.js

Основная часть схемы — это обвязка, необходимая для корректного определения компьютером устройства как USB. Она необходима для изменения напряжения на контактах D+ и D- USB. Дело в том, что напряжение на контактах питания USB и питание моей схемы равно 5в, но для сигналов на D+ и D- напряжение должно быть 3.3в, для этого на них стоят стабилитроны. Подключение светодиодов у меня расположено так только потому, что я паял без предварительной трассировки, по этой же причине я не выкладываю чертежи платы. Так же на схеме присутствует динамик, он необходим для воспроизведения мелодии из этой статьи, когда падает билд.

Очередной CI светофор. На этот раз attiny2313 и Node.js

Очередной CI светофор. На этот раз attiny2313 и Node.js

Принцип работы:

USB модуль умеет совсем чуть-чуть. Либо светить одним светодиодом, либо моргать одним из них. Звучание мелодии на упавший билд не было задумано изначально, а было добавлено в уже работающее устройство модификацией прошивки.

Запуск мелодии происходит только при падении билда, в общем у меня там хардкод, я не планировал конфигураций для него.

Прошивка

Код прошивки я всегда пишу на C в Eclipse, компилятор gcc из набора WinAVR, прошивку заливаю программатором USBasp, купленном на алиекспресс за 4.5$, прошиваю фьюзы программой Khazama.

Начать стоит с прошивки фьюзов. В схеме используется 12MHz кварц и для его использования фьюзы должны быть установлены на кварц с частотой больше 8MHz (CKSEL=1110). Кроме того, нужно не забыть убрать деление частоты на 8 (CKDIV8=1), если я не ошибаюсь, в attiny2313 делитель установлен по дефолту, повторюсь, его нужно отключить (установить единицу). Кварц на 12MHz — не единственный возможный вариант, о возможных вариантах почитайте внизу этой страницы. С таким малым количеством памяти мне стоило выбрать 16MHz, но я решил остановиться на 12MHz.

Первым делом необходимо воспользоваться шаблонным кодом USB библиотеки. Папка usbdrv библиотеки должна быть в папке проекта.

Здесь стоит отметить, что есть возможность использовать любые ноги МК, но USB_CFG_DPLUS_BIT должен указывать на ногу, поддерживающую внешние прерывания, так как по этой ноге будут приходить сигналы с USB порта.

Метод, обрабатывающий пришедшие данные, выглядит так:

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

Чтение данных происходит из значения wValue, не самый правильный вариант передачи данных, но я посчитал его вполне уместным в моем случае.

В моей схеме для зеленого сигнала светофора используется порт D, а для желтого и красного порт B, поэтому мне пришлось объявить указатель на используемый порт и добавить условие для использования порта D, если пришел сигнал об успешном билде. Если для всех сигналов использовать разные пины одного порта, то от этого условия можно отказаться.

Метод main():

Кроме инициализации USB библиотеки необходимо настроить порты на output, в моем случае нельзя настраивать весь порт D, т.к. порт D будет использоваться USB библиотекой. Я выставил единички только на пинах, которые буду использовать:

Main loop:

Главный цикл начинается с необходимых для работы USB:

Дальше идет логика, отвечающая за свечение/моргание одного из светодиодов:

Если флаг моргания не установлен, то просто пишется единица в необходимый бит

. Иначе необходимый бит инвертируется

, таким образом получается моргание светодиодом. Задержка в цикле всего 100us, поэтому для более редкого моргания добавлена искусственная задержка в виде переменной-счетчика blinkDelay.

Дальше идет блок отвечающий, за воспроизведение мелодии:

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

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

После того, как схема собрана, а микроконтроллер прошит (как и чем прошивать ищите в интернетах вашего города), можно перейти к компьютерному софту.

Вариантов здесь предостаточно. Для работы с DIY USB большой популярностью пользуется виртуальный COM порт, та же Arduino создает виртуальный COM порт, работать с которым довольно просто, с ним можно работать даже обычным bat файлом. Но мне очень хотелось попробовать работу именно с USB, поэтому моя прошивка настроена как HID устройство, и софт должен уметь работать именно с USB.

Пишем в USB

Здесь число 30 отсылается параметром wValue на устройство, а то в свою очередь подаст напряжение на третий пин порта B и начнет проигрывание мелодии.

Узнаем статус джобы у Jenkins

С опросом Jenkins у Node.js тоже никаких проблем, подключаем пакет jenkins-api и пишем:

В консоли увидим: SUCCESS, FAILURE или null (в процессе сборки).

Драйвер для Windows

Для работы с USB модулем необходимо установить драйвер libUSB, это можно сделать либо вручную, либо воспользоваться программой zadig, взятой со страницы пакета USB из пункта Installation; за подробностями — туда, там же инструкции для Linux и OSX.

Всё вместе

Читайте также: