4-разрядный 7-сегментный индикатор и Arduino
В сегодняшней статье поговорим о 7-сегментных индикаторах и о том, как их «подружить» с Ардуино. Есть несколько вариантов. Самый простой, безусловно, это зайти на arduino-kit.com.ua/seriynyy-displey-opensegment-20-mm-zelenyy.html и купить готовый индикатор с интегрированным шилдом (это платка согласования так называется), но мы не ищем лёгких путей, поэтому пойдем путем чуть более сложным. Новички – не пугайтесь, эта статья, как и предыдущие мои статьи (arduino-kit.com.ua/arduino-i-labview-ili-vizualizacija-dannyh.html и arduino-kit.com.ua/chasy-ds1302-dlya-rduino-uno.html) именно для вас. Пусть гуру пишут для таких же умудренных опытом гуру, а я новичок – пишу для новичков.
Почему именно 7-сегментный индикатор? Ведь существует столько всяких экранов, с большим количеством символов, строк, разнообразных диагоналей и разрешений, черно-белых и цветных, самые доступные из которых стоят пару долларов… А тут: «старенький», до безобразия простой, но требующий огромного количества пинов 7-сегментный индикатор, но все-таки преимущество есть и у этого «старичка». Дело в том, что пользуясь приведенными здесь скетчами можно оживить не только индикатор с высотой цифр 14 мм, но и более серьезные (правда уже самодельные) проекты, и метровые цифры в данном случае далеко не предел. Жителям столиц это может быть не так интересно, а вот население Новокацапетовки или Нижней Кедровки очень порадуется, если на клубе или сельсовете появятся часы, которые еще могут и дату отображать, и температуру, а о создателе этих часов будут говорить очень долго. Но, подобные часы тема отдельной статьи: будет желание у посетителейarduino-kit.com.ua/ – напишу. Всё выше написанное можно считать вступлением. Как и прошлая моя статья эта будет состоять из частей, на этот раз из двух. В первой части мы просто «по управляем» индикатором, а во второй – попробуем приспособить его для чего-то хоть немного полезного. Итак, продолжим:
Часть первая. Экспериментально – познавательная
За основу данного проекта взят нам уже хорошо знакомый по предыдущим статьям ARDUINO UNO. Напомню, что приобрести его легче всего можно здесь: arduino-kit.com.ua/uno-r3-new.html или здесь:arduino-kit.com.ua/arduino-leonardo-original-italiya-new-rev3.html , кроме этого понадобится 4-разрядный, 7-сегментный индикатор. У меня, в частности GNQ-5641BG-11. Почему именно этот? Да просто потому, что лет 5 назад купил его по ошибке, идти менять было лень, вот он и валялся все это время, ожидая своего часа. Думаю, что подойдет любой с общим анодом (и с общим катодом можно, но придется данные массива и остальные значения портов инвертировать – т.е. менять на обратные), лишь бы не был слишком мощным, чтобы не сжечь Ардуинку. Кроме этого – 4 токоограничивающих резистора, примерно 100 Ом каждый и кусок шлейфа (мне хватило 10 см) на 12 пин (жил) можно «оторвать» от более широкого, что я и сделал. А можно вообще отдельными проводочками подпаяться, проблем не будет. Еще понадобятся штыри на плату (11 шт.) хотя, если аккуратно можно и без них. Эскиз индикатора можно увидеть на рисунке 1, а его схему на рисунке 2. Также отмечу, что на каждый сегментик этого индикатора лучше подавать не более 2.1В (ограничивается 100-Омными резисторами), и в этом случае он будет потреблять не более 20 мА. В случае, если загорится цифра «8» потребление не превысит 7х20=140 мА, что вполне допустимо для выходов Ардуино. Любознательный читатель задаст вопрос: «Но ведь 4 разряда по 140 мА это уже 4х140=560 мА, а это уже многовато!» Отвечу – останется 140. Каким образом? Читайте дальше! Расположение пинов на индикаторе видно на рисунке 3. А подключение делаем согласно таблице 1.
Рис. 1 - Эскиз индикатора
Рис. 2 - Схема индикатора
Рис. 3 - Расположение пинов
Таблица 1
Пин Ардуино Уно |
Пин индикатора |
Примечание |
1 |
5 |
Сегмент G |
2 |
10 |
Сегмент F |
3 |
1 |
Сегмент E |
4 |
2 |
Сегмент D |
5 |
4 |
Сегмент C |
6 |
7 |
Сегмент B |
7 |
11 |
Сегмент A |
8 |
12 |
Общий анод сегмента № 1, подключать через резистор 100 Ом. |
9 |
9 |
Общий анод сегмента № 2, подключать через резистор 100 Ом. |
10 |
8 |
Общий анод сегмента № 3, подключать через резистор 100 Ом. |
11 |
6 |
Общий анод сегмента № 6, подключать через резистор 100 Ом. |
Заливаем простенький скетч, который представляет собой простенькую «считалочку» от 0 до 9:
sketch-6-1.txt
А теперь немного пояснений. DDRD это регистр порта D (DDRB – соответственно порта В) за «страшным» словом «регистр» всего лишь «спряталась» функция, которая указывает, будет порт своим пином читать что-то (принимать информацию), либо наоборот туда можно будет что-то писать (отдавать информацию). В данном случае строчка DDRD=B11111111; указывает, что все пины порта D выходные, т.е. информация из них будет выходить. Буквочка «В» обозначает, что в регистр записано двоичное (бинарное) число. Нетерпеливый читатель тут же спросит: «А десятичное можно!?!». Спешу успокоить – можно, но об этом чуть позже. Если бы мы хотели половину порта задействовать на вход, а половину на выход можно было бы указать так: DDRD=B11110000; единицы показывают те пины, которые будут отдавать информацию, а нули – те, которые будут эту самую информацию принимать. Основное удобство регистра заключено еще и в том, что не надо прописывать 8 раз все пины, т.е. мы экономим в программе 7 строк. А теперь разберем следующую строку:
PORTB=B001000; // устанавливаем высокий уровень 11 пина порта В
PORTB это регистр данных порта В, т.е. записав в него какое-либо число мы указываем на каком пине порта будет единица, а на каком – ноль. В добавление к комментарию скажу, если взять Ардуино Уно таким образом, чтобы видеть контроллер и цифровые пины были сверху - будет понятна запись в регистр, т.е. какой «ноль» (или «единица»)отвечает за какой пин, т.е. крайний правый ноль порта В отвечает за 8-й пин, а крайний левый – за 13-й (у которого встроенные светодиод). Для порта D соответственно правый за пин 0, левый за пин 7.
Надеюсь после таких развёрнутых пояснений все понятно, а раз понятно предлагаю вернуться к известной нам и горячо любимой с детства десятичной системе счисления. И еще – скетч в 25 строк вроде и небольшой, но для новичка все-таки несколько громоздок. Будем уменьшать.
Заливаем еще более простой скетч, та же самая «считалочка»:
sketch-6-2.txt
Работу скетча можно посмотреть на Видео 1.
Всего 11 строчек! Вот это по-нашему, «по-новичковски»! Прошу обратить внимание вместо двоичных чисел в регистры записаны десятичные. Естественно, для десятичных чисел никаких букв впереди не нужно. Думаю, не лишним будет свести все числа в таблицы.
Знак |
Общий анод |
Общий катод |
||
Двоичная система |
Десятичная система |
Двоичная система |
Десятичная система |
|
«0» |
00000011 |
3 |
11111100 |
252 |
«1» |
10011111 |
159 |
01100000 |
96 |
«2» |
00100101 |
37 |
11011010 |
218 |
«3» |
00001101 |
13 |
11110010 |
242 |
«4» |
10011001 |
153 |
01100110 |
102 |
«5» |
01001001 |
73 |
10110110 |
182 |
«6» |
01000001 |
65 |
10111110 |
190 |
«7» |
00011111 |
31 |
11100000 |
224 |
«8» |
00000001 |
1 |
11111110 |
254 |
«9» |
00001001 |
9 |
11110110 |
246 |
Таблица 3. Соответствие отображаемого разряда данным порта
Разряд |
Общий анод |
Общий катод |
||
Двоичная система |
Десятичная система |
Двоичная система |
Десятичная система |
|
1 |
001000 |
8 |
110111 |
55 |
10 |
000100 |
4 |
111011 |
59 |
100 |
000010 |
2 |
111101 |
61 |
1000 |
000001 |
1 |
111110 |
62 |
Внимание! Данные таблиц 2 и 3 справедливы только при распайке согласно таблице 1.
А теперь зальем скетч со «считалочкой» от 0 до 9999:
sketch-6-3.txt
Рис. 4 - Считалочка
Работу скетча можно посмотреть на Видео 2.
В этом скетче комментариев больше, чем самого кода. Вопросов возникнуть не должно…. Кроме одного, что это за «цикл мерцания» такой, что, собственно говоря, там мерцает и для чего? А еще переменная для этого какая-то…
А все дело в том, что одноименные сегменты всех четырех разрядов у нас соединены в одной точке. А1, А2, А3 и А4 имеют общий катод; А1, В1,…..G1 общий анод. Так, что подав одновременно на 4 разрядный индикатор «1234» мы получим «8888» и очень удивимся по этому поводу. Чтобы этого не произошло нужно сначала зажечь «1» в своем разряде, потом отключить её, зажечь «2» в своем и т.д. Если делать это очень быстро, то мерцание цифр сольётся, как кадры на киноплёнке и глаз его практически не будет замечать. А максимальное значение переменной мерцания в данном случае управляет скоростью смены цифр на индикаторе. Кстати, именно благодаря этому «мерцанию» и максимальное потребление тока всего 140 мА, вместо 560. А теперь предлагаю перейти к чему-то более полезному.
Часть вторая. Хоть немного полезная
В этой части мы выведем символы с персонального компьютера на 7-сегментный индикатор при помощи ARDUINO MEGA. Почему вдруг возникла идея «поменять лошадей на переправе»? Причин две: первая – до этого в своих статьях я ни разу не рассматривал ARDUINO MEGA; и вторая – в ARDUINO UNO я так и не разобрался, как мне динамически менять местами СОМ порт и порт D. Но я новичок – мне простительно. Приобрести данный контроллер, естественно можно здесь: arduino-kit.com.ua/arduino-mega-2560-adk-new.html . Для реализации задуманного пришлось взять паяльник и перепаять шлейф со стороны Ардуино, а также написать новый скетч. Как перепаян шлейф можно посмотреть на Рисунке 5. Все дело в том, что ARDUINO MEGA и ARDUINO UNO имеют разную распиновку портов, да и в Меге портов гораздо больше. Соответствие использованных пинов видно из Таблицы 4.
Рис. 5 - Новая распайка шлейфа
Таблица 4
Пин Уно |
Порт Уно |
Пин Мега |
Порт Мега |
1 |
D |
23 |
A |
2 |
D |
24 |
A |
3 |
D |
25 |
A |
4 |
D |
26 |
A |
5 |
D |
27 |
A |
6 |
D |
28 |
A |
7 |
D |
29 |
A |
8 |
B |
37 |
C |
9 |
B |
36 |
C |
10 |
B |
35 |
C |
11 |
B |
34 |
C |
Внимание! Данная таблица справедлива только для данного проекта!
Также следует обратить внимание, что порт С у Ардуино Мега «начинается» с 37 пина и далее по убывающей, а порт А – с 22 пина и далее по возрастающей.
Рис. 6 - Общий вид
Небольшие особенности реализации: выводить будем 4 символа. Символы должны быть цифрами. Если ввели «1234» и увидим «1234», если ввели «123456» все равно увидим «1234», если ввели «йцук», «фыва1234», «отиог485909оапоьм» - не увидим ничего. Если ввели «рр2345мм» увидим « 23» т.е. небольшая, встроенная «защита от дурака».
Собственно скетч:
sketch-6-4.txt
А как работает данная программа можно посмотреть на Видео 3.
Обзор подготовил Павел Сергеев