[Из песочницы] Бегущая строка на Arduino + управление со смартфона
Предисловие
С каждым годом на улице, в переходах, в магазинах появляется всё большее рекламных светодиодных панелей, на которых текст бегает и вверх, и вниз, и влево, и вправо, и выводятся всякие разноцветные картинки. Всё это само собой привлекает внимание прохожих и меня в том числе. И часто я задумывался, как же это сделано и можно ли что-то подобное повторить в домашних условиях. А как раз в этом семестре у нас была намечена курсовая работа по Схемотехнике, и одной из предлагавшихся тем была «Электронная бегущая строка». Я подумал: «Чем чёрт не шутит? Попробую».
Поиск необходимых материалов и первые шаги
Раньше как-то пробовал баловаться со светодиодами, точнее со светодиодной лентой, но это была простая светомузыка с использованием одного транзистора. А тут нужно же как-то и матрицу светодиодную сделать, и текст где-то хранить, и как-то его выводить. На «рассыпухе» просто так не сделать, по крайней мере с моим опытом.
Моя светомузыка:
Услышал, что можно делать на платформе 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-1;y--){
byte temp = symbols[x][y];
byte temp_2=symbols[x+1][y];
byte val = (temp<>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