Предисловие
С каждым годом на улице, в переходах, в магазинах появляется всё большее рекламных светодиодных панелей, на которых текст бегает и вверх, и вниз, и влево, и вправо, и выводятся всякие разноцветные картинки. Всё это само собой привлекает внимание прохожих и меня в том числе. И часто я задумывался, как же это сделано и можно ли что-то подобное повторить в домашних условиях. А как раз в этом семестре у нас была намечена курсовая работа по Схемотехнике, и одной из предлагавшихся тем была «Электронная бегущая строка». Я подумал: «Чем чёрт не шутит? Попробую».
Поиск необходимых материалов и первые шаги
Раньше как-то пробовал баловаться со светодиодами, точнее со светодиодной лентой, но это была простая светомузыка с использованием одного транзистора. А тут нужно же как-то и матрицу светодиодную сделать, и текст где-то хранить, и как-то его выводить. На «рассыпухе» просто так не сделать, по крайней мере с моим опытом.
Моя светомузыка:
Услышал, что можно делать на платформе 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() следующим образом:
void setup(){
int i;
for(i = 2; i < 10; i++)
pinMode(i,OUTPUT);
pinMode(clock,OUTPUT);
pinMode(reset,OUTPUT);
digitalWrite(reset,HIGH);
delayMicroseconds(5);
digitalWrite(reset,LOW);
}
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<numsymbols-1;x++){
for (int z=0;z<8;z++){
for(int t=0;t<loops;t++){
for(y=9;y>-1;y--){
byte temp = symbols[x][y];
byte temp_2=symbols[x+1][y];
byte val = (temp<<z)+(temp_2>>7-z);
for(int i =0; i<8; i++)
digitalWrite(i+2, (val>>i)&B00000001);
delayMicroseconds(800);
digitalWrite(clock,HIGH);
delayMicroseconds(5);
digitalWrite(clock,LOW);
}
}
}
}
}
Сначала видно четыре вложенных цикла. Самый наружный цикл, проходит по всем элементам байтового массива, т.е. по выводимым символам. Байтовым массив и его размерность задаётся разработчиком вручную выглядит наподобие следующего:
byte symbols[numsymbols][10]={C, X, E, M, O, T, E, X, H, I_RUS, K, A };
const int numsymbols = 13;
Каждый символ разложен на 10 байт, что соответствует количеству строк, а каждый байт, как известно, состоит из 8 бит. Каждый бит отвечает за определённый светодиод на схеме. Пример разбитого на биты символа:
#define I_RUS {B00000000,B01000010,B01000010,B01000110,B01001010,B01010010,B01010010,B01100010,B01000010,B00000000}
Например, 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
Комментарии (16)
Alexeyslav
30.12.2015 09:31176-я серия фигово работает на 5 вольтах, она вообще рассчитана исключительно на 9 вольт. Тут бы лучше применить 561ИЕ8, которая и является более близким аналогом импортной микросхемы.
И счётчик ИЕ8 — это так называемый счётчик джонсона — не совсем полноценный счетчик а весьма хитрая схема из 5-ти триггеров которая работает своеобразно(зато сэкономили на количестве транзисторов и соответственно площади кристалла). И из-за своей сути обладает неприятными спецэффектами — если его не сбрасывать при подаче питания состояние выходов может быть неадекватным. В какой-то момент времени сигнал может появится на 2-х и более выходах одновременно.
И кстати, пока пишете программу на ардуине медленность переключения счётчика остаётся незаметной, а как только будете выводить данные аппаратно надо будет учитывать ещё и время переключения этого счетчика.
Speccyfan
30.12.2015 09:42В целом не плохо, но это пока не строка, а чуть больше одного знакоместа, надо подумать как ее удлинить, хотя бы до 50x8.
IronHead
30.12.2015 09:57Можно повернуть на бок, шрифт высотой 8 точек отлично читается, тогда будет 10 точек по горизонтали, а это уже 2 буквы одновременно.
А вообще у автора это курсовой проект, поэтому мне кажется развития не будет.Speccyfan
30.12.2015 10:21Все же 5x8 мало (буквы Д, Щ например плохо влезут, еще пиксель на разделитель), надо 6x8, тогда получается 48x8, по 8 символов в строке. Может курсач перерастет в диплом и тогда все получится.
IronHead
30.12.2015 10:55Можно динамическую ширину символа, некоторые по 5 столбцов, другие по 6, 7 и 8. Я так делал в одном из своих проектов. Просто после каждой буквы добавляется пустой столбец для разделения. Получается, что знак "!" занимает в ширину 3 столбца + 1 столбец разделителя, а буква «Щ» — 8 столбцов + столбец разделителя.
Rumlin
30.12.2015 09:58Думаю следующим шагом надо заказать у китайцев мешочек SMD светодиодов и сделать длинную строку-часы.
diller61
30.12.2015 10:58Приятно видеть отечественную микросхему в проекте.
Заметил одну особенность на видео — два крайних левых столбца дублируют зажженые светодиоды зажиганием в пол силы светодиодов над ними. Это баг или фича?diller61
30.12.2015 12:04кажется я понял в чем проблема: счетчик не успевает переключиться на следующий выход и первые два бита слоя(строки) выводятся на короткое время не в тот слой, потом счетчик все-таки переключается и остальные биты выводятся сразу в свой слой.
решение
digitalWrite(clock,HIGH); delayMicroseconds(5); // нужно поставить хотя бы 7 digitalWrite(clock,LOW);
GrakovNe
30.12.2015 18:55Хо-хо-хо, светодиодные матрицы это всегда классно) Я в начале года развлекался такими делами — часы до сих пор стоят на столе и показывают время/температуру/влажность. Кстати, 80 отдельных светодиодов вместо готовой светодиодной сборки, но 8*8 — требования курсовика или у вас какие-то личные мотивы?
IronHead
Сразу дам тебе подсказку, так как тоже занимался подобными вещами.
1) Таблицу знакогенератора лучше всего формировать через специальное ПО для LCD дисплеев, например:GLCD FontCreator так в дальнейшем проще править алфавит.
2) Лучше сразу работать с юникодом
3) Вывод в К176ИЕ8 сделать через аппаратный SPI
artvlad96
Спасибо, приму к сведению.