![](https://habrastorage.org/webt/u0/ey/pl/u0eypljyu3ectes4ijqbvayaiae.jpeg)
Однажды, просматривая объявления на Avito, я наткнулся на очень любопытную вещь — блинкерное табло или flip-dot display по-английски. Такие табло используются для отображения информации в аэропортах, вокзалах, стадионах или маршрутоуказателях на общественном транспорте.
Я подумал, что с дисплеем такого типа можно сделать много всего интересного.
Где был установлен мой экран, можно только догадываться по остатку надписи (“АГАЗИН”). Возможно, это был информационный стенд на вокзале или остановке ОТ — пишите ваши идеи в комментариях.
Экран представлял собой матрицу ячеек размером 7 строк на 30 столбцов. Каждая ячейка содержала круглую, вращающуюся двухцветную пластину и светодиод зеленого свечения. На плате имелось некоторое количество логических элементов серии 74HCххx и других микросхем, которых, как выяснилось позже, было почти достаточно для управления экраном через нехитрый последовательный интерфейс.
После покупки я потратил немного времени на поиски информации о том, как работать с такими экранами, учитывая, что в моем распоряжении была только часть, непосредственно выводящая изображение, а обычно присутствует еще и контроллер, которым можно управлять клавиатурой либо через порт UART софтом с PC.
По надписям на плате установить принадлежность к производителю не удалось, но, возможно, я не сильно и старался, т. к. интереснее было самому разобраться, как оно работает, нарисовать схему устройства и разработать модуль сопряжения с типовым микроконтроллером.
Но сначала надо было поставить себе конкретную цель, для чего можно применить этот экран в быту. Первой идеей были часы с отображением расширенной информации о погоде на улице и дома, времени, даты, коротких мотивирующих посланий ;) и т. д. Потом я подумал, что, если повернуть экран на 90о, он здорово напоминает стакан для Тетриса, поэтому было решено сделать Тетрис, а дальше будет видно.
Как же работают электромеханические экраны
Очень просто: каждая ячейка экрана (флажок) состоит из диска — плоского постоянного магнита, окрашенного с одной стороны в желтый, а с другой — в черный цвет, и электромагнита, расположенного под диском. При подаче электрического импульса на катушку электромагнита флажок переворачивается и, что важно, фиксируется в одном положении. При смене направления тока и подачи повторного импульса флажок поворачивается и фиксируется другой стороной. Для переключения достаточно импульса длительностью в 1 миллисекунду, напряжением 12 вольт.
Сопротивление катушки электромагнита примерно равно 18 Ом.
![]() Устройство ячейки, источник: Eldi datasheet |
![]() Как происходит поворот диска, источник: Flip-Disc Display |
Для удобства управления катушки через два диода объединены в матрицу строк и столбцов. Для переключения любой точки экрана нужно активировать источник тока (current source) на строке и сток тока (current sink) на ряду, на пересечении которых находится катушка электромагнита или, наоборот, для переключения в другую сторону. По сути, это аналогично управлению двигателями постоянного тока через Н-мост, только в импульсном режиме.
![](https://habrastorage.org/webt/kc/ng/xn/kcngxnu3wzbtfv04krl7-g2tz8w.png)
С тем, как управлять флажками в теории, мы разобрались. Пора переходить к практический реализации.
Реверс-инжиниринг экрана
Вооружившись мультиметром и Kicad, я стал перерисовывать схему экрана, начав с управления светодиодами. Оказалось, что эта часть самодостаточна, и при подаче питания и управляющих сигналов можно зажечь любой светодиод в любом ряду экрана через довольно простой интерфейс. В каждый момент времени активной может быть только одна строка, поэтому вывод изображения должен быть динамическим.
![](https://habrastorage.org/webt/sc/ae/qi/scaeqi7xqndyyb2yl0bcqyok1ou.png)
Схема модуля состоит из матрицы светодиодов, катоды которых подключены к LED драйверам Toshiba TB62705. С точки зрения логики управления это обычные 8-битные сдвиговые регистры, соединенные в цепочку. Аноды светодиодов в каждой строке соединены и подключены к стокам MOSFET транзисторов. Истоки подключены к выходу DC-DC преобразователя, а затворы всех 7 транзисторов соединены с выходами дешифратора 3:8 74HC238.
Таким образом, для управления светодиодами нужно выбрать строку экрана, подав ее номер на вход дешифратора, потом загрузить 32 бита данных через SERIAL и CLOCK входы первого LED-драйвера. Затем подать лог. “1” на вход LATCH, и соответствующие светодиоды загорятся на время удержания LATCH в “1”.
Чтобы поморгать светодиодами, я использовал лежащую под рукой arduino-совместимую плату Teensy 3.5. Пример кода управления светодиодами можно найти на GitHub
Вторая часть схемы, ответственная за управление блинкерами, немного сложнее.
![](https://habrastorage.org/webt/_m/uo/wq/_muowqoyj09am1uwpde0hjt_obk.png)
Силовая часть управления колонками состоит из пары микросхем источника/стока тока (current source/sink), выходы которых соединены через защитные диоды с первым выводом каждой катушки в колонке. В качестве источника тока использована микросхема Toshiba TBD62783, а в качестве стока — любимая многими ULN2803 от TI. Вторые выводы катушек объединены в строки и подключены к разъему на плате экрана. По всей видимости, это было сделано для того, чтобы вынести управление строками в отдельный модуль, так как несколько экранов могут объединяться в один длинный экран. Однако немного непонятно, почему для управления светодиодами разработчики разместили все необходимые компоненты на каждой плате экрана.
Логика состоит из восьми 3:8 дешифраторов 74HC238, управляющие входы которых соединены параллельно. Выходы четных дешифраторов подключены к управляющим входам источников тока, а нечетных — к входам стоков. Разрешающие входы 74HC238 подключены к еще одному 3:8 дешифратору, что позволяет полностью исключить ситуацию, когда одновременно активны микросхемы источника и стока тока. Вход разрешения общего дешифратора подключен к микросхеме компаратора и активируется только при совпадении значений на его входе. Эта часть схемы, скорее всего, также отвечает за объединение нескольких модулей в один большой экран.
Таким образом, для выбора конкретной колонки нужно подать ее номер (0-7) в группе на шину COL_A0-A2, а затем активировать выходы конкретной 74HC238 путем подачи ее номера на входы COL_EN_A0-A2 общего дешифратора. Причем вход A0 можно использовать как признак источник/сток, а оставшиеся 2 бита — как номер группы (0-3).
Входы управляющей логики и питания выведены на два 50-контактных IDC разъема. Распайка одного из них показана на схеме.
![](https://habrastorage.org/webt/gm/i6/a0/gmi6a0shydrp3-ytp-ny97ej8p8.png)
После анализа схемы я понял, что поморгать флажками без помощи Kicad и паяльника, не получится и приступил к созданию модуля выбора строк и сопряжения.
Модуль адаптера и управление строками
![](https://habrastorage.org/webt/rj/dh/ga/rjdhgar8v54f6or4fmvujcobf58.png)
Для упрощения конструкции я решил повторить реализацию выбора колонки и поместил на схему TBD62783 и ULN2803 в паре с дешифраторами 74HC238 для выбора нужной строки, а также одну микросхему логики 74HC00 (4хNAND) для четкого разделения режимов SET, RESET и входа PULSE, непосредственно активирующего подачу напряжения на выбранный электромагнит. Для экономии выводов микроконтроллера было решено подключить сигналы выбора строк и столбцов к выходам одного сдвигового регистра.
В итоге для управления флажком нужно:
- послать и зафиксировать его координаты в последовательном коде через SERIAL/CLOCK/LATCH
- выбрать желаемое состояние SET/RESET
- на короткое время активировать PULSE
Расшифровка байта координат:
![](https://habrastorage.org/webt/1i/xc/8t/1ixc8tueue6tdrzvs6vj_wsdsve.png)
Первая версия схемы без сдвигового регистра была собрана на беспаечной макетной плате. После проверки и небольшого волнения, что все сгорит, я включил питание и подал вручную импульс PULSE быстрым нажатием на кнопку. Ток, протекающий через катушку электромагнита, был на всякий случай ограничен на лабораторном источнике питания. Флажок переключился успешно, и при изменении уровня SET/RESET, переключился обратно. “Это успех”, ? подумал я и начал переносить схему на обычную макетную плату, используя любимый МГТФ-0.07 и одножильный kynar-wire для шин питания/земли.
Для подключения к экрану через 50-контактный разъем на плате нужно было задействовать 22 контакта + питание, поэтому возиться с отдельными проводками не хотелось. Напрашивалось использование плоского шлейфа, как для IDE или, скорее, старых SCSI устройств.
Немного гугления навело меня на специальный инструмент для обжима IDC коннекторов, который было решено незамедлительно купить: Кримпер ProsKit 6PK-214 для IDC коннекторов. Потренировавшись на небольших коннекторах, я с первого раза сделал себе 20-сантиметровый шлейф с IDC-50F разъемами на концах.
Пишем управляющую программу
Как я упоминал выше, в качестве управляющего контроллера использовался TEENSY 3.5, средой разработки для которого является Arduino IDE, поэтому программа была написана на arduino диалекте C.
void update_dot(bool state, byte row, byte col) {
byte cmd=0;
// set 7-5 cmd bits to row 2-0 bits
cmd=(row&B111)<<5;
// set 4-0 cmd bits to col 4-0 bits
cmd=cmd|(col&B11111);
// write to Register
digitalWriteFast(DOT_LATCH,LOW);
for (byte i=0;i<8;i++) {
byte onebit=bitRead(cmd,7-i);
digitalWriteFast(DOT_CLOCK,LOW);
digitalWriteFast(DOT_SERIAL_DATA,onebit);
digitalWriteFast(DOT_CLOCK,HIGH);
}
digitalWriteFast(DOT_LATCH,HIGH);
delayMicroseconds(10);
digitalWriteFast(DOT_LATCH,LOW);
// set set/reset pin
if (state) {
digitalWriteFast(DOT_SET_RESET,HIGH);
}
else {
digitalWriteFast(DOT_SET_RESET,LOW);
}
// pulse
digitalWriteFast(DOT_PULSE,HIGH);
delay(1);
digitalWriteFast(DOT_PULSE,LOW);
}
Я провел несколько экспериментов, чтобы определить оптимальное напряжение источника питания и время подачи импульса. Получилось, что 12В и 1мс достаточно для стабильной фиксации флажка в одном из положений.
После тестовых заливок одним цветом я заметил, что один «пиксель» битый и не переворачивается. Замер мультиметром сопротивления катушки показал несколько мегаом, а детальный осмотр выявил, что один вывод оторвался. Очень повезло, что нерабочий «пиксель» был с краю экрана, поэтому мне удалось припаять провод. Проблема была решена.
![](https://habrastorage.org/webt/4h/tt/dh/4httdhuvrvu6qhucdovtma-sdfg.jpeg)
Вот что получилось после первых экспериментов с заливками и выводом текста:
![](https://habrastorage.org/webt/zi/ka/rp/zikarpu8i2ymdexejetsuinnu4y.gif)
Тетрис
Написать реализацию Тетриса на C оказалось проще, чем я думал. Спасибо Javier Lopez и его руководству Tetris tutorial in C++ for beginners. Я переписал основные функции так, как я их понял, и адаптировал код к особенностям моего экрана (отсутствие границ и низкое разрешение). Не буду утомлять подробностями работы, в руководстве все подробно описано.
Для управления использовался модуль аналогового джойстика, поэтому пришлось написать функцию для преобразования значений на выходе АЦП в цифровые константы. Тут возникла сложность с тем, чтобы, с одной стороны, не допустить ложных срабатываний, а с другой — обеспечить правильный геймплей. Если положение джойстика не меняется после очередного считывания состояния, добавляется задержка.
Поиграв минут 10, я понял, что мне скучно, потому что скорость падения фигур не меняется и счет никак не отображается. Отсутствует элемент соревнования.
Выводить счет флажками было некрасиво из-за нехватки места на экране, так что было решено задействовать светодиоды для создания альтернативной плоскости вывода информации. Я нашел в интернете битовое представление шрифта 3x5 для цифр от 0 до 9 и написал функцию отображения счета по количеству убранных линий. Для пущей красоты решил добавить моргание заполненной строки при ее исчезновении.
Динамический характер отображения подтолкнул к идее вызывать функцию обновления LED-части экрана в таймерном прерывании. Частота прерывания и время удержания строки светодиодов в активном состоянии определяют яркость свечения.
Еще я сделал так, что скорость падения фигурок тетрамино увеличивается по мере очищения линий. В первой версии фигурки смещались на одну строку вниз каждые 200 мсек. Если отнимать от этого числа 40 мсек каждые 10 удаленных линий, то темп игры сильно ускоряется, и появляется интерес. Мой рекорд 38 линий!
Тот редкий случай, когда вертикальное видео подходит как нельзя лучше.
Код проекта, схемы экрана и модуля сопряжения выложены на GitHub.
Если у вас есть идей, что еще можно сделать с таким экраном, пишите, пожалуйста, в комментарии.
Полезные ссылки:
1. Hackaday: Flip-Dot Display & DIY Controller.
2. Tetris tutorial in C++ platform independent focused in game logic for beginners.
3. Репозиторий проекта на GitHub.
Комментарии (47)
alexhott
03.05.2019 15:02+2часы зачетные будут
хоть домой хоть в офисtormozedison
03.05.2019 15:18И малопотребляющие. Можно взять два БП, один для «мозгов», другой для блинкеров. И второй включать на пару секунд раз в минуту. Ночью не обновлять, чтобы не шумело.
Javian
03.05.2019 21:47+1Судя по видео с тетрис — сильный шум при переключении. Для дома не очень хороший вариант. Особенно ночью.
Sun-ami
03.05.2019 22:36+1Этот тип блинкеров, со стопором — более шумный, чем свободно вращающиеся блинкеры. Здесь слыщен щелчок от удара пластины блинкера о стопор, а шум свободно вращающиеся блинкеров мягче, он похож на быстрые взмахи крыльев — это блинкеры около секунды с затуханием колеблются в магнитном поле после переворачивания. Зато блинкеры со стопором быстрее останавливаются, переключение выглядит красивее.
yurybx
03.05.2019 15:59Интересно, а зачем здесь светодиоды?
sintech Автор
03.05.2019 16:08Хороший вопрос. Сначала я подумал, что они для подсветки флажков ночью, но когда выяснилось, что светодиоды яркие и зеленые, эта версия отпала.
ukt
03.05.2019 16:58Если посмотреть внимательно на одну гифку, то видно, что блинкер стоит под некоторым углом к светодиоду, и, при включении светлого пятна он будет подсвечивать это пятно. При включении темного пятна, свет будет частично поглощен и отражен вглубь устройства.
Эдакая подсветка.
GennPen
03.05.2019 17:34+3Скорее всего для дублирования включенных флажков при недостаточной освещенности.
Заголовок спойлераtormozedison
03.05.2019 18:18Это точно для дублирования, во всяком случае, на электричках сделано именно так.
cmyksoft
04.05.2019 21:57Как уже ответили другие люди, для дублирования информации при недостаточной внешней освещённости. При ярком солнечном свете свечение светодиодов совсем не различимо, зато блинкеры ярко отражают солнечный свет и ещё вдобавок флуоресцируют от сине-фиолетовой части спектра Солнца. В темноте же информация читается только благодаря светодиодам. Такое универсальное табло под все случаи внешней освещённости.
shiru8bit
03.05.2019 16:12+1Офигенный дисплей. Особенно прикольно то, что звуковые эффекты к игре на нём создаются сами собой. В тетрисе не хватило только эффекта завешения падения блока (помигать им короткое время, чтобы прозвучал треск).
super-guest
03.05.2019 16:39Очень лампово ) А сколько такие дисплеи стоят и где купить?
Ambal
04.05.2019 13:51У нас с Беларуси во многих автопарках залежи таких модулей. Раньше все мазовские автобусы оснащались блинкерами.
lbv
03.05.2019 17:01Классика:
1. Автогонки по двухполосной дороге, односторонней с разными скоростями, либо с одной полосой встречной.
2. Стрелялка — истребитель стреляет по движущимся навстречу мишеням и обходит препятствия.
igormich88
03.05.2019 18:09+1Как думаете насколько сложно воспроизвести такое табло на 3д принтере?
Выглядит как неплохая альтернатива светодиодным панелям.
PS кстати при поворотах панели диски сохраняют своё положение?sintech Автор
03.05.2019 18:16+3Думаю будет непросто. Детали довольно мелкие, и мотать катушки электромагнитов, то еще удовольствие. Есть проекты DIY 7-сегментных экранов, но это уже не то.
Да, сохраняют, даже отклонить диск вручную, то он возвращается в последнее зафиксированное состояние.tormozedison
03.05.2019 18:20Значит, сердечник электромагнита перемагничивается и остаётся в таком состоянии.
igormich88
03.05.2019 19:05+1Я вот как раз и надеялся минимизировать число деталей за счёт 3д печати, ну то есть в идеале делать модуль за один проход с отверстиями под магниты и катушки, ну и с пазами для соединения с соседями.
Sun-ami
03.05.2019 20:02+4Для безопасности экспериментов в схему неплохо бы добавить аппаратную защиту от остановки программы в состоянии со включённым силовым током блинкера — катушки сгорают быстро, где-то за 5 секунд.
sintech Автор
03.05.2019 20:17+1Спасибо, можно добавить в схему одновибратор на той-же 7400 и RC цепочке для генерирования единичного импульса.
sim2q
03.05.2019 20:49+1Можно обойтись одним кондёром, примерно при R=18 Ом и 1мс — порядка 0.1 мкф.
Но надо ставить для каждой катушки последовательно, что расточительно. Если ставить на линию, надо подумать, надеюсь кто-то продолжит:)
DjPhoeniX
04.05.2019 00:57+1Для защиты от остановки программы есть (обычно, должен быть) WDT, а при (пере)загрузке относительно опытные программисты МК пишут STOP/OFF/RST всей периферии независимо от исходного состояния. Просто так, на всякий случай, чтобы было. Даже если следующим тактом пишется «всё включенО». Потому что никто не знает, что там соберут «эти… китайцы».
Sun-ami
04.05.2019 02:09+1В рабочей прошивке WDT достаточно, а при отладке — нет. Ведь можно остановить программу отладчиком, думая, что в этот момент ток на блинкер не подаётся, а вдруг оказыватся, что таки подавался. А разобрать для перемотки блинкер из середины поля очень непросто, и купить на замену — тоже не очень быстро, это не очень распространённый компонент.
Yury_SB
03.05.2019 20:09+4Круче может быть только тетрис из реального освещения офисов в небоскребе )
SignallerK
03.05.2019 22:25+1Когда-то знакомый работал на обслуживании подобных штук на вокзале. И увы выходили из строя они довольно часто. Конечно там они находились на платформах и страдали от перепадов температур и вибраций, но, боюсь, в режиме динамической индикации этот модуль долго не протянет.
Sun-ami
03.05.2019 22:50+3Насколько я понимаю, основная причина износа — отсутствие какого-либо подобия нормального подшипника скольжения в блинкерах — там прямоугольный выступ пластины вращается в круглом пластмассовом отверстии, в результате через какое-то время это отверстие перестаёт быть круглым. Другая проблема — чуствительность к загрязнению длинными волокнами, летающими в воздухе. Они приклеиваются к двум соседним лепесткам, не давая обоим переворачиваться. А бывают ещё некачественные блинкеры, у которых желтая сторона — это самоклеющаяся плёнка, наклееная на выкрашенный в черный цвет лепесток. По краям выступает клей, и склеивание лепестков волокнами становится почти неизбежным. А производитель, если мне не изменяет память, пишет о ресурсе 500000 переворотов.
sintech Автор
03.05.2019 22:54+1У меня есть пара дисков на которых с желтой стороны вспучилась прозрачная пленка, похоже на некачественную наклейку.
SignallerK
04.05.2019 10:20-1Ну пол миллиона переворотов, это 5-6 часов игры (при развёртке 24 раза в сёк).
Негусто как-то.sintech Автор
04.05.2019 10:49+1Не все так грустно. Флажки поворачиваются только при изменениях а не каждый цикл.
garageman
03.05.2019 23:00+1Я под такое табло, только с семисегментными индикаторами контроллер писал. Для остановок общественного транспорта решение. А еще такие наизаправках в колонках стоят.
WinPooh73
04.05.2019 00:25+1В "Разностной машине" Стерлинга/Гибсона идея механических дисплеев хорошо развита, вплоть до показа на них видео.
Вспоминается ещё байка студенческих лет про игру в тетрис окнами какого-то многоэтажного общежития, а также попытки на 1-е апреля организовать таким образом бегущую строку…tormozedison
04.05.2019 09:50Ещё в одной советской детской книге дети построили «из спичек и желудей» несколько шаговых искателей, соединили их в счётчик, но он очень быстро сломался.
lonelymyp
04.05.2019 12:06Вероятно им можно и музыку проигрывать, заставляя вибрировать в звуковом диапазоне.
tormozedison
04.05.2019 21:45Конечно, достаточно один блинкер подключить к маломощному усилителю вместо динамической головки. Предварительно прозвонив, чтобы там не менее 4 Ом было.
tormozedison
Такие комбинированные дисплеи — светодиоды плюс блинкеры — на головных вагонах электричек до сих пор ездят. Классная штука получилась, респект!
Ещё у некоторых таких дисплеев пиксели светятся под ультрафиолетом.