[Из песочницы] Бегущая строка на Arduino + управление со смартфона 29.12.2015 19:38
С каждым годом на улице, в переходах, в магазинах появляется всё большее рекламных светодиодных панелей, на которых текст бегает и вверх, и вниз, и влево, и вправо, и выводятся всякие разноцветные картинки. Всё это само собой привлекает внимание прохожих и меня в том числе. И часто я задумывался, как же это сделано и можно ли что-то подобное повторить в домашних условиях. А как раз в этом семестре у нас была намечена курсовая работа по Схемотехнике, и одной из предлагавшихся тем была «Электронная бегущая строка». Я подумал: «Чем чёрт не шутит? Попробую».
Поиск необходимых материалов и первые шаги
Раньше как-то пробовал баловаться со светодиодами, точнее со светодиодной лентой, но это была простая светомузыка с использованием одного транзистора. А тут нужно же как-то и матрицу светодиодную сделать, и текст где-то хранить, и как-то его выводить. На «рассыпухе» просто так не сделать, по крайней мере с моим опытом.
Услышал, что можно делать на платформе Arduino. Раньше слышал, что есть такая крутая программируемая плата, что проект этот был стартапом, собравшим немалое количество денег, но в подробности не вдавался. А тут пришлось. Посмотрел несколько видео с примерами проектов, реализованных на Arduino, понравилось, купил.
В моей работе использовалась Arduino Uno R3, но не оригинальная, а копия. Как я почитал, особой разницы между копией и оригиналом нет. Плата Arduino имеет 14 цифровых входов/выходов, 6 аналоговых, входы внешнего питания, выходы +5 В, +3.3 В, GND. К компьютеру подключается с помощью USB. Для программирования микроконтроллера используется собственная IDE, которая распространяется бесплатно на официальном сайте Arduino.
С Arduino понятно, теперь надо решить, как сделать саму светодиодную матрицу. Изначально за основу разработки проекта была выбрана статья, в которой предлагалось использовать готовые модули со светодиодными матрицами и сдвиговыми регистрами. Схема представлена на рисунке 1. Использование готовых модулей, а именно MAX7219, значительно упростило бы разработку, так как необходимо было бы только всё правильно подключить и написать программу для корректной работы и вывода информации.
Однако возникли трудности с поиском соответственно этого модуля в нашей стране, поэтому было решено искать другой способ реализации. Да и как-то просто было бы совсем. Поэтому решил, что надо делать матрицу самому на светодиодах, благо в интернете достаточно информации, как это сделать.
Разработка
Размер матрицы был выбран 8×10. Изначально планировалось для выбора столбца матрицы светодиодов использовать сдвиговый регистр 74HC595, который идёт в наборе с Arduino, а он имеет восемь выходов. Вот каждый бы и отвечал за определённый столбец. Однако в процессе пайки случайно была испорчена ножка регистра, отвечающая за выход Q0, поэтому от него пришлось отказаться. В этой схеме регистр по сути мог бы только сократить количество выходов Arduino, используемых для управления матрицей. При его использовании задействовалось бы только три выхода, а так пришлось пожертвовать 8-ю (со 2 по 9). Благо, что их там достаточно.
Для выбора строки матрицы был использован десятичный счётчик с дешифратором К176ИЕ8. Выбор пал на эту микросхему по причине её популярности, а также, потому что она имеет 10 выходов, как раз для управления 10-ю строками матрицы. Управляется счётчик с помощью микроконтроллера Arduino через входы сброса, счёта и выхода на 5 В.
Выходы счётчика подключаются к блоку транзисторов для управления светодиодной матрицей. Подключение будет рассмотрено в блоке транзисторов.
В результате функциональная схема получилась следующего вида:
Блок транзисторов
Для управления светодиодами кроме сигнала, подаваемого на аноды со 2 по 9 портов Arduino, необходимо также подавать напряжение на катоды светодиодов. Делается это с помощью блока транзисторов.
Все катоды светодиодов каждой строки соединены между собой и подключены к коллекторам 10 транзисторов. Эмиттеры транзисторов подключены к «земле», а на базу приходят сигналы с выходов счётчика.
В этом проекте используются биполярные транзисторы npn типа 2N3904. Так как каждый транзистор подключён к своей строке матрицы, то всего в схеме их используется 10 штук. Выбор пал на этот вид транзисторов из-за их популярности, а также соответствия условиям разработанной схемы. Этот транзистор применяется в схемах с небольшим напряжение. Общий вид и УГО данного транзистора:
Теперь можно описать, как происходит загорание светодиода. С определённого порта Arduino подаётся сигнал на анод светодиода. В то же самое время на счётчика с определённого выхода подаётся сигнал на базу эмиттера. И с коллектора транзистора идёт напряжение на катоды светодиодов. Так как в матрице соединены последовательно аноды светодиодов соседних строк, а также последовательно соединены катоды светодиодов соседних столбцов, то в одно время происходит загорание нескольких светодиодов матрицы.
Важный момент! Ардуино на выходе выдаёт около 5 В, поэтому для подсоединения анодов светодиодов к Ардуино нужно использовать резисторы номиналом 220 Ом, а для подсоединения базы транзисторов к выходам счётчика — номиналом 1 КОм. Найти эти резисторы не составляет труда, тем более они идут в стартовом наборе Ардуино.
От мысли к действию, или от схемы к реализации
В результате пайки получилась следующее устройство.
Программная часть
Теперь всё это дело нужно было подключить к Ардуино. Код само-собой писался на C. Первым делом нужно проинициализировать используемы порты платы Arduino. Это делается в функции setup () следующим образом:
clock и reset — порты 11 и 10 Arduino соответственно.
Первым делом идёт указание, что порты со 2 по 9 используются в качестве выходных. Делается это в цикле с помощью метода pinMode (i, OUTPUT), где i –номер порта, OUTPUT — флаг, указывающий, что этот порт выходной.
Далее аналогичным образом инициализируются порты clock и reset. С помощью функции digitalWrite (reset, HIGH) происходит подача высокого уровня напряжения на порт reset, что тем самым делает сброс счётчика. После 5 мс задержки (delayMicroseconds (5)) на порт reset подаётся низкий уровень напряжения.
После инициализации портов нужно разработать алгоритм включения светодиодов для вывода тестовой информации и имитации их движения, т.е. сделать алгоритм бегущей строки.
Для этого была создана отдельная функция display_symbol (int loops), которая принимает в качестве аргумента значение задержки для имитации движения текста. Опытным путём было установлено, что лучше всё информация воспринимается, если значение задержки находится в промежутке от 15 до 25.
Рассмотрим внутреннюю реализацию функции display_symbol (int loops).
void display_symbol(int loops) < for(x=0;x-1;y--)< byte temp = symbols[x][y]; byte temp_2=symbols[x+1][y]; byte val = (temp<>7-z); for(int i =0; i>i)&B00000001); delayMicroseconds(800); digitalWrite(clock,HIGH); delayMicroseconds(5); digitalWrite(clock,LOW); > > > > >
Сначала видно четыре вложенных цикла. Самый наружный цикл, проходит по всем элементам байтового массива, т.е. по выводимым символам. Байтовым массив и его размерность задаётся разработчиком вручную выглядит наподобие следующего:
byte symbols[numsymbols][10]=; const int numsymbols = 13;
Каждый символ разложен на 10 байт, что соответствует количеству строк, а каждый байт, как известно, состоит из 8 бит. Каждый бит отвечает за определённый светодиод на схеме. Пример разбитого на биты символа:
Например, 0 и 9 байты выглядят как B00000000, это значит, что в 1 и 10 строках светодиоды гореть не будут. Сделано это для удобного чтения информации пользователем. А вот, например, 1-й байт со значением B01000010 указывает, что во второй строке для данного символа должны загораться 2 и 7 светодиоды. Таким образом из всех этих байт выстраивается символ буквы «И».
Вот, что получилось в результате:
А где же обещанное управление со смартфона?
В принципе результатом я остался доволен, как-никак первый раз так много паял и всё сразу заработало. Но захотелось большего, и я подумал добавить управление с Android смартфона по Bluetooth. Для Arduino есть готовый модуль HC-06. Схема его подключения к Arduino выглядит следующим образом:
Подробности подключения к Arduino и соединения со смартфоном описаны в этой статье: Блютуз модуль HC-06 подключение к Arduino. Соединение с телефоном и компьютером
В соответствии с этим код был изменён. И решил добавить ускоренное пролистывание текста, инверсное зажигание светодиодов и пролистывание текста с мерцанием. Ссылки на код для Android и Arduino будут ниже. В результате получилась вот такая штука:
Заключение
Сначала, что касается разработанного курсового. Главным достоинством разработанного устройства является его универсальность. Благодаря использованию программируемой платы Arduino проект можно расширять использованием различных датчиком и написанием соответствующих прошивок. В результате кроме функционала бегущей строки можно добавить и функционал вывода состояния погоды, используя соответственно датчики температуры, влажности, атмосферного давления. Если добавить какой-нибудь датчик звука, то можно доработать схему до музыкального эквалайзера.
А общие выводы заключаются в том, что Arduino — действительно классная штука, с помощью которой в домашних условиях можно сделать множество полезных и просто крутых штук, которые раньше могли сделать люди, посвятившие электронике не один год. Тем более, что есть множество примеров различных устройств на Ардуино в Интернете в открытом доступе. Уже есть даже множество книг по Ардуино, одну из которых я точно советовал бы для рассмотрения в качестве руководства для начинающих и продвинутых разработчиков: Arduino CookBook.
Ссылки на код:
Scrolling Text
ScrollingText (Bluetooth)
Часть Android