Предисловие


С каждым годом на улице, в переходах, в магазинах появляется всё большее рекламных светодиодных панелей, на которых текст бегает и вверх, и вниз, и влево, и вправо, и выводятся всякие разноцветные картинки. Всё это само собой привлекает внимание прохожих и меня в том числе. И часто я задумывался, как же это сделано и можно ли что-то подобное повторить в домашних условиях. А как раз в этом семестре у нас была намечена курсовая работа по Схемотехнике, и одной из предлагавшихся тем была «Электронная бегущая строка». Я подумал: «Чем чёрт не шутит? Попробую».

Поиск необходимых материалов и первые шаги


Раньше как-то пробовал баловаться со светодиодами, точнее со светодиодной лентой, но это была простая светомузыка с использованием одного транзистора. А тут нужно же как-то и матрицу светодиодную сделать, и текст где-то хранить, и как-то его выводить. На «рассыпухе» просто так не сделать, по крайней мере с моим опытом.

Моя светомузыка:



Услышал, что можно делать на платформе Arduino. Раньше слышал, что есть такая крутая программируемая плата, что проект этот был стартапом, собравшим немалое количество денег, но в подробности не вдавался. А тут пришлось. Посмотрел несколько видео с примерами проектов, реализованных на Arduino, понравилось, купил.

В моей работе использовалась Arduino Uno R3, но не оригинальная, а копия. Как я почитал, особой разницы между копией и оригиналом нет. Плата Arduino имеет 14 цифровых входов/выходов, 6 аналоговых, входы внешнего питания, выходы +5 В, +3.3 В, GND. К компьютеру подключается с помощью USB. Для программирования микроконтроллера используется собственная IDE, которая распространяется бесплатно на официальном сайте Arduino.

С Arduino понятно, теперь надо решить, как сделать саму светодиодную матрицу. Изначально за основу разработки проекта была выбрана статья, в которой предлагалось использовать готовые модули со светодиодными матрицами и сдвиговыми регистрами. Схема представлена на рисунке 1. Использование готовых модулей, а именно MAX7219, значительно упростило бы разработку, так как необходимо было бы только всё правильно подключить и написать программу для корректной работы и вывода информации.

image

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

Разработка


Размер матрицы был выбран 8х10. Изначально планировалось для выбора столбца матрицы светодиодов использовать сдвиговый регистр 74HC595, который идёт в наборе с Arduino, а он имеет восемь выходов. Вот каждый бы и отвечал за определённый столбец. Однако в процессе пайки случайно была испорчена ножка регистра, отвечающая за выход Q0, поэтому от него пришлось отказаться. В этой схеме регистр по сути мог бы только сократить количество выходов Arduino, используемых для управления матрицей. При его использовании задействовалось бы только три выхода, а так пришлось пожертвовать 8-ю (со 2 по 9). Благо, что их там достаточно.

Схема регистра:

image

Для выбора строки матрицы был использован десятичный счётчик с дешифратором К176ИЕ8. Выбор пал на эту микросхему по причине её популярности, а также, потому что она имеет 10 выходов, как раз для управления 10-ю строками матрицы. Управляется счётчик с помощью микроконтроллера Arduino через входы сброса, счёта и выхода на 5 В.

Выходы счётчика подключаются к блоку транзисторов для управления светодиодной матрицей. Подключение будет рассмотрено в блоке транзисторов.

Схема счётчика:

image

В результате функциональная схема получилась следующего вида:

image

Блок транзисторов


Для управления светодиодами кроме сигнала, подаваемого на аноды со 2 по 9 портов Arduino, необходимо также подавать напряжение на катоды светодиодов. Делается это с помощью блока транзисторов.

Все катоды светодиодов каждой строки соединены между собой и подключены к коллекторам 10 транзисторов. Эмиттеры транзисторов подключены к «земле», а на базу приходят сигналы с выходов счётчика.

В этом проекте используются биполярные транзисторы npn типа 2N3904. Так как каждый транзистор подключён к своей строке матрицы, то всего в схеме их используется 10 штук. Выбор пал на этот вид транзисторов из-за их популярности, а также соответствия условиям разработанной схемы. Этот транзистор применяется в схемах с небольшим напряжение. Общий вид и УГО данного транзистора:

image

Теперь можно описать, как происходит загорание светодиода. С определённого порта Arduino подаётся сигнал на анод светодиода. В то же самое время на счётчика с определённого выхода подаётся сигнал на базу эмиттера. И с коллектора транзистора идёт напряжение на катоды светодиодов. Так как в матрице соединены последовательно аноды светодиодов соседних строк, а также последовательно соединены катоды светодиодов соседних столбцов, то в одно время происходит загорание нескольких светодиодов матрицы.

Важный момент! Ардуино на выходе выдаёт около 5 В, поэтому для подсоединения анодов светодиодов к Ардуино нужно использовать резисторы номиналом 220 Ом, а для подсоединения базы транзисторов к выходам счётчика – номиналом 1 КОм. Найти эти резисторы не составляет труда, тем более они идут в стартовом наборе Ардуино.

От мысли к действию, или от схемы к реализации


В результате пайки получилась следующее устройство.

imageimage

Программная часть


Теперь всё это дело нужно было подключить к Ардуино. Код само-собой писался на 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 выглядит следующим образом:

image

Подробности подключения к Arduino и соединения со смартфоном описаны в этой статье: Блютуз модуль HC-06 подключение к Arduino. Соединение с телефоном и компьютером
В соответствии с этим код был изменён. И решил добавить ускоренное пролистывание текста, инверсное зажигание светодиодов и пролистывание текста с мерцанием. Ссылки на код для Android и Arduino будут ниже. В результате получилась вот такая штука:



Заключение


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

А общие выводы заключаются в том, что Arduino – действительно классная штука, с помощью которой в домашних условиях можно сделать множество полезных и просто крутых штук, которые раньше могли сделать люди, посвятившие электронике не один год. Тем более, что есть множество примеров различных устройств на Ардуино в Интернете в открытом доступе. Уже есть даже множество книг по Ардуино, одну из которых я точно советовал бы для рассмотрения в качестве руководства для начинающих и продвинутых разработчиков: Arduino CookBook.

Ссылки на код:
Scrolling Text
ScrollingText(Bluetooth)
Часть Android

Комментарии (16)


  1. IronHead
    29.12.2015 15:08
    +3

    Сразу дам тебе подсказку, так как тоже занимался подобными вещами.
    1) Таблицу знакогенератора лучше всего формировать через специальное ПО для LCD дисплеев, например:GLCD FontCreator так в дальнейшем проще править алфавит.
    2) Лучше сразу работать с юникодом
    3) Вывод в К176ИЕ8 сделать через аппаратный SPI


    1. artvlad96
      29.12.2015 16:14
      +1

      Спасибо, приму к сведению.


  1. Alexeyslav
    30.12.2015 09:31

    176-я серия фигово работает на 5 вольтах, она вообще рассчитана исключительно на 9 вольт. Тут бы лучше применить 561ИЕ8, которая и является более близким аналогом импортной микросхемы.
    И счётчик ИЕ8 — это так называемый счётчик джонсона — не совсем полноценный счетчик а весьма хитрая схема из 5-ти триггеров которая работает своеобразно(зато сэкономили на количестве транзисторов и соответственно площади кристалла). И из-за своей сути обладает неприятными спецэффектами — если его не сбрасывать при подаче питания состояние выходов может быть неадекватным. В какой-то момент времени сигнал может появится на 2-х и более выходах одновременно.
    И кстати, пока пишете программу на ардуине медленность переключения счётчика остаётся незаметной, а как только будете выводить данные аппаратно надо будет учитывать ещё и время переключения этого счетчика.


  1. Speccyfan
    30.12.2015 09:42

    В целом не плохо, но это пока не строка, а чуть больше одного знакоместа, надо подумать как ее удлинить, хотя бы до 50x8.


    1. IronHead
      30.12.2015 09:57

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


      1. Speccyfan
        30.12.2015 10:21

        Все же 5x8 мало (буквы Д, Щ например плохо влезут, еще пиксель на разделитель), надо 6x8, тогда получается 48x8, по 8 символов в строке. Может курсач перерастет в диплом и тогда все получится.


        1. IronHead
          30.12.2015 10:55

          Можно динамическую ширину символа, некоторые по 5 столбцов, другие по 6, 7 и 8. Я так делал в одном из своих проектов. Просто после каждой буквы добавляется пустой столбец для разделения. Получается, что знак "!" занимает в ширину 3 столбца + 1 столбец разделителя, а буква «Щ» — 8 столбцов + столбец разделителя.


          1. Speccyfan
            30.12.2015 11:10

            Да, это называется пропорциональный шрифт.


            1. IronHead
              30.12.2015 11:15

              Не совсем, пропорциональный шрифт может еще и по высоте изменяться.


  1. Rumlin
    30.12.2015 09:58

    Думаю следующим шагом надо заказать у китайцев мешочек SMD светодиодов и сделать длинную строку-часы.


  1. diller61
    30.12.2015 10:58

    Приятно видеть отечественную микросхему в проекте.

    Заметил одну особенность на видео — два крайних левых столбца дублируют зажженые светодиоды зажиганием в пол силы светодиодов над ними. Это баг или фича?


    1. diller61
      30.12.2015 12:04

      кажется я понял в чем проблема: счетчик не успевает переключиться на следующий выход и первые два бита слоя(строки) выводятся на короткое время не в тот слой, потом счетчик все-таки переключается и остальные биты выводятся сразу в свой слой.
      решение

         				digitalWrite(clock,HIGH);
          				delayMicroseconds(5); // нужно поставить хотя бы 7
           				digitalWrite(clock,LOW);
      


      1. artvlad96
        30.12.2015 12:11

        Спасибо за совет, попробую исправить.


        1. diller61
          30.12.2015 12:24

          если не сложно по результатам отпишитесь, мне интересно


          1. IronHead
            30.12.2015 12:31

            Со ссылочкой на видео. Посмотреть тоже интересно


  1. GrakovNe
    30.12.2015 18:55

    Хо-хо-хо, светодиодные матрицы это всегда классно) Я в начале года развлекался такими делами — часы до сих пор стоят на столе и показывают время/температуру/влажность. Кстати, 80 отдельных светодиодов вместо готовой светодиодной сборки, но 8*8 — требования курсовика или у вас какие-то личные мотивы?