2Подключение 7-сегментного индикатора непосредственно к Arduino
Мы можем подключить индикатор прямо к выводам Arduino. Для этого придётся задействовать сразу 7 ножек (или 8, если нужна десятичная точка)
Обратим внимание, что индикатор 3361AS не имеет токоограничивающих резисторов. Необходимо обеспечить наличие сопротивления номиналом около 180…220 Ом на каждый вывод индикатора (т.к
питание подаём +5 В от Arduino).
Электрическая схема 7-сегментного индикатора 3361AS
Расположение выводов индикатора показано на иллюстрации:
Размеры корпуса и расположение выводов 7-сегментного индикатора 3361AS
Подключать индикатор будем в соответствии с таблицей. Будет выбран первый разряд, остальные два пока не будем трогать.
Вывод индикатора 3361AS | Назначение | Вывод Arduino |
---|---|---|
1 | Сегмент E | D6 |
2 | Сегмент D | D5 |
3 | DP | D9 |
4 | Сегмент C | D4 |
5 | Сегмент G | D8 |
7 | Сегмент B | D3 |
8 | Выбор 3-го разряда | 5V |
9 | Выбор 2-го разряда | 5V |
10 | Сегмент F | D7 |
11 | Сегмент A | D2 |
12 | Выбор 1-го разряда | GND |
Напишем скетч, который последовательно выводит числа от 0 до 9 на первом разряде индикатора.
Скетч управления индикатором 3361AS (разворачивается)
const int A = 2; const int B = 3; const int C = 4; const int D = 5; const int E = 6; const int F = 7; const int G = 8; const int DP = 9; void setup() { pinMode(A, OUTPUT); pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(E, OUTPUT); pinMode(F, OUTPUT); pinMode(G, OUTPUT); pinMode(DP, OUTPUT); } void loop() { for (int i=0; i<=9; i++){ printNumber(i); delay(1000); } } // зажигает на 7-сегментном индикаторе заданную цифру void printNumber(int num){ int numbers = { // многомерный массив, в котором описаны состояния сегментов A…G и DP для цифр от 0 до 9 {1,1,1,1,1,1,0,0}, // 0 {0,1,1,0,0,0,0,0}, // 1 {1,1,0,1,1,0,1,0}, // 2 {1,1,1,1,0,0,1,0}, // 3 {0,1,1,0,0,1,1,0}, // 4 {1,0,1,1,0,1,1,0}, // 5 {1,0,1,1,1,1,1,0}, // 6 {1,1,1,0,0,0,0,0}, // 7 {1,1,1,1,1,1,1,0}, // 8 {1,1,1,1,0,1,1,0} // 9 }; lightSegments(numbers); } // зажигает заданные сегменты void lightSegments(int segments[]){ digitalWrite(A, segments); digitalWrite(B, segments); digitalWrite(C, segments); digitalWrite(D, segments); digitalWrite(E, segments); digitalWrite(F, segments); digitalWrite(G, segments); digitalWrite(DP, segments); }
Небольшое пояснение по поводу массива numbers[] в функции printNumber(). Этот массив состоит из 10-ти подмассивов, каждый из которых определяет одну цифру от 0 до 9. В свою очередь подмассивы состоят из 8-ми элементов, которые задают состояния сегментов от A до G и DP. Например, первый подмассив описан как {1,1,1,1,1,1,0,0} и он отвечает за вывод на индикатор нуля. Это означает, что сегменты A,B,C,D,E,F должны гореть, а сегменты G и DP – нет.
В результате получаем примерно следующее:
Управление 7-сегментным индикатором с помощью Arduino Nano
И вот так в динамике:
https://youtube.com/watch?v=ISyG6WyE-MA
Это самый простой способ управления сегментным индикатором, но, как мы видим, он задействует почти все цифровые ножки Arduino. Особенно если мы решим использовать все разряды индикатора. Тогда кроме ножек для управления сегментами придётся дополнительно использовать столько выводов, сколько разрядов у индикатора. Получится, что для управления 7-сегментным индикатором с 3-мя разрядами необходимо 11 ножек (7 сегментов + 1 десятичная точка + 3 ножки для выбора разряда). Это расточительно, и не всегда можно такое себе позволить.
1Описание сегментного светодиодного индикатора
Индикатор называется 7-сегментным из-за того, что он состоит из семи светодиодов, которые расположены в форме цифры «8». Зажигая определённые сегменты, можно изображать разные цифры. Это похоже на цифры индекса на почтовом конверте: закрашивая определённые участки, мы пишем разные индексы. Зачастую дополнительно к 7-ми сегментам, индикатор содержит десятичную точку. Также индикатор может иметь несколько цифр – разрядов. Обычно от одного до 4-х. Сегменты индикатора обозначаются латинскими буквами от A до G, а DP – это десятичная точка (decimal point).
Обозначение сегментов 7-, 9-, 14- и 16-сегментных индикаторов
К слову, существуют сегментные индикаторы, число сегментов которых отличается от 7-ми. Так, например, существуют 14- и 16-сегментные индикаторы. Кроме цифр от 0 до 9 они также позволяют выводить буквы. Принцип их работы и управления обычно идентичны таковым для 7-сегментных индикаторов.
Мы в качестве индикатора будем использовать семисегментный индикатор 3361AS-1. Он построен по принципу индикатора с общим катодом. Это значит, что индикатор состоит из нескольких светодиодов в одном корпусе, у которых общая земля, а питание на каждый светодиод подаётся отдельно.
Как не трудно догадаться, существуют индикаторы с общим анодом. У них всё наоборот: общее питание, а для зажигания отдельного светодиода необходимо подать на него нулевой уровень.
Устройство
В настоящее время для отображения информации всё чаще используются графические дисплеи, однако, семисегментные индикаторы также не утратили своего значения. Если требуется лишь отображение чисел, то они могут стать более предпочтительным вариантом, т.к. просты в управлении и могут использоваться совместно с любым микроконтроллером с достаточным количеством выводов. Жидкокристаллические семисегментные индикаторы обладают сверхнизким энергопотреблением (например, в электронных часах, вместе со схемой управления работают от одной батарейки в течении нескольких лет).
Рассмотрим пример разработки схемы дешифратора из двоичного кода в десятичный. Десятичный код обычно отображается одним битом на одну десятичную цифру. В десятичном коде десять цифр, поэтому для отображения одного десятичного разряда требуется десять выходов дешифратора. Сигнал с этих выводов можно подать на десятичный индикатор. В простейшем случае над светодиодом можно просто подписать индицируемую цифру.Таблица истинности десятичного дешифратора приведена ниже.
На этой странице будем вести речь о светодиодных семисегментных индикаторах. Они имеют предельно простую конструкцию, дёшевы, надёжны. Обеспечивают высокую яркость и контрастность отображаемой информации. Существует большое разнообразие индикаторов: с разным цветом свечения сегментов, разного размера, отличающиеся схемой подключения светодиодов (с общим катодом или общим анодом). При необходимости отображения нескольких разрядов можно установить несколько одноразрядных индикаторов рядом на печатной плате либо выбрать нужный вариант многоразрядного индикатора.
Своё название семисегментные индикаторы получили в связи с тем, что изображение символа формируется с помощью семи отдельно управляемых (подсвечиваемых светодиодом) элементов – сегментов. Эти элементы позволяют отобразить любую цифру 0..9, а также некоторые другие символы, например: ‘-‘, ‘A’, ‘b’, ‘C’, ‘d’, ‘E’, ‘F’ и другие.
Это даёт возможность использовать индикатор для вывода положительных и отрицательных десятичных и шестнадцатеричных чисел и даже текстовых сообщений. Обычно индикатор имеет также восьмой элемент – точку, используемую при отображении чисел с десятичной точкой. Сегменты индикатора обозначают буквами a, b, …, g (a – верхний элемент, далее буквы присваиваются сегментам по часовой стрелке; g – центральный сегмент; dp – точка). 8 независимых элементов, каждый из которых может находиться в одном из двух состояний – горит или не горит, дают всего 2**8=256 возможных комбинаций. Или 128 комбинаций, каждая из которых может быть с горящей точкой или без неё.
Семисегментный индикатор из четырех элементов
Семисегментные индикаторы
С появлением светодиодов ситуация кардинально изменилась в лучшую сторону. Светодиоды сами по себе потребляют маленький ток. Если расставить их в нужном положении, то можно высвечивать абсолютно любую информацию. Для того, чтобы высветить все арабские цифры, достаточно всего семь светящихся светодиодных полос – сегментов, выставленных определенным образом:
Почти ко всем таким семисегментным индикаторам добавляют также и восьмой сегмент – точку, для того, чтобы можно было показать целое и дробное значение какого-либо параметра
По идее у нас получается восьми сегментный индикатор, но по-старинке его также называют семисегментным.
Что получается в итоге? Каждая полоска на семисегментном индикаторе засвечивается светодиодом или группой светодиодов. В результате, засветив определенные сегменты, мы можем вывести цифру от 0 и до 9, а также буквы и символы.
Исходный код программы на Python
В результате исполнения данной программы на семисегментном индикаторе будут последовательно высвечиваться цифры от 0 до 9.
Python
import RPi.GPIO as IO # подключение библиотеки для работы с контактами ввода/вывода
import time # подключение библиотеки для работы с задержками
DISPLAY = # строка с шестнадцатеричными кодами, которые используются для отображения цифр на семисегментном индикаторе
IO.setwarnings(False) # отключаем показ любых предупреждений
IO.setmode (IO.BCM) # мы будем программировать контакты GPIO по их функциональным номерам (BCM), то есть мы будем обращаться к PIN29 как ‘GPIO5’
IO.setup(13,IO.OUT) # инициализируем контакты GPIO в качестве цифровых выходов
IO.setup(6,IO.OUT)
IO.setup(16,IO.OUT)
IO.setup(20,IO.OUT)
IO.setup(21,IO.OUT)
IO.setup(19,IO.OUT)
IO.setup(26,IO.OUT)
IO.setup(12,IO.OUT)
def PORT(pin): # функция для передачи значения ‘pin’ на выходные контакты
if(pin&0x01 == 0x01):
IO.output(13,1) # если bit0 из 8bit ‘pin’ is true, на PIN13 устанавливаем high
else:
IO.output(13,0) # если bit0 из 8bit ‘pin’ is false, на PIN13 устанавливаем low
if(pin&0x02 == 0x02):
IO.output(6,1) # если bit1 из 8bit ‘pin’ is true, на PIN6 устанавливаем high
else:
IO.output(6,0) # если bit1 из 8bit ‘pin’ is false, на PIN6 устанавливаем low
if(pin&0x04 == 0x04):
IO.output(16,1)
else:
IO.output(16,0)
if(pin&0x08 == 0x08):
IO.output(20,1)
else:
IO.output(20,0)
if(pin&0x10 == 0x10):
IO.output(21,1)
else:
IO.output(21,0)
if(pin&0x20 == 0x20):
IO.output(19,1)
else:
IO.output(19,0)
if(pin&0x40 == 0x40):
IO.output(26,1)
else:
IO.output(26,0)
if(pin&0x80 == 0x80):
IO.output(12,1) # если bit7 из 8bit ‘pin’ is true, на PIN12 устанавливаем high
else:
IO.output(12,0) # если bit7 из 8bit ‘pin’ is false, на PIN12 устанавливаем low
while 1:
for x in range(10): # цикл, который исполняется 10 раз, в нем переменная x инкрементируется от 0 до 9
pin = DISPLAY # присваиваем значение переменной ‘pin’ для каждой цифры
PORT(pin); # показываем каждую цифру на семисегментном индикаторе
time.sleep(1)
1 |
importRPi.GPIO asIO# подключение библиотеки для работы с контактами ввода/вывода importtime# подключение библиотеки для работы с задержками DISPLAY=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67# строка с шестнадцатеричными кодами, которые используются для отображения цифр на семисегментном индикаторе IO.setwarnings(False)# отключаем показ любых предупреждений IO.setmode(IO.BCM)# мы будем программировать контакты GPIO по их функциональным номерам (BCM), то есть мы будем обращаться к PIN29 как ‘GPIO5’ IO.setup(13,IO.OUT)# инициализируем контакты GPIO в качестве цифровых выходов IO.setup(6,IO.OUT) IO.setup(16,IO.OUT) IO.setup(20,IO.OUT) IO.setup(21,IO.OUT) IO.setup(19,IO.OUT) IO.setup(26,IO.OUT) IO.setup(12,IO.OUT) defPORT(pin)# функция для передачи значения ‘pin’ на выходные контакты if(pin&0x01==0x01) IO.output(13,1)# если bit0 из 8bit ‘pin’ is true, на PIN13 устанавливаем high else IO.output(13,)# если bit0 из 8bit ‘pin’ is false, на PIN13 устанавливаем low if(pin&0x02==0x02) IO.output(6,1)# если bit1 из 8bit ‘pin’ is true, на PIN6 устанавливаем high else IO.output(6,)# если bit1 из 8bit ‘pin’ is false, на PIN6 устанавливаем low if(pin&0x04==0x04) IO.output(16,1) else IO.output(16,) if(pin&0x08==0x08) IO.output(20,1) else IO.output(20,) if(pin&0x10==0x10) IO.output(21,1) else IO.output(21,) if(pin&0x20==0x20) IO.output(19,1) else IO.output(19,) if(pin&0x40==0x40) IO.output(26,1) else IO.output(26,) if(pin&0x80==0x80) IO.output(12,1)# если bit7 из 8bit ‘pin’ is true, на PIN12 устанавливаем high else IO.output(12,)# если bit7 из 8bit ‘pin’ is false, на PIN12 устанавливаем low while1 forxinrange(10)# цикл, который исполняется 10 раз, в нем переменная x инкрементируется от 0 до 9 pin=DISPLAYx# присваиваем значение переменной ‘pin’ для каждой цифры PORT(pin);# показываем каждую цифру на семисегментном индикаторе time.sleep(1) |
Цепь для сегмента ‘а’
Из таблицы истинности видно, что сегмент а должен быть включен всегда, кроме цифры 1 и 4. Для упрощения можно сделать так, чтобы логическая единица была только в этих 2 состояниях, и на выход добавить логическое НЕ. Тогда у нас всегда будет 1, кроме 2-ух состояний. Вот схема:
Я добавил дополнительную инвертированную шину для удобства и наглядности.
На выходе должен быть логический при входных значениях 0 0 0 1 и 0 1 0 0 (на линиях 3, 2, 1, 0 соответственно). Поэтому я взял не инвертированную первую линию, а все остальные инвертированные, и получилось, что 0 0 0 1 трансформируется в 1′ 1′ 1′ 1 ( ‘ — инвертированный сигнал), после все эти сигналы группируются в один общий, который идет в вентиль ИЛИ-НЕ, который на конце и инвертирует логическую 1 в 0, чтобы при этих входных параметрах сегмент а не был включен. То же самое проделывается для другого случая: 0 1 0 0 преобразуется в 1′ 1 1′ 1’ и также идет в тот же вентиль ИЛИ-НЕ, как и при первом случае.
По такой схеме делаются остальные модули для других сегментов индикатора. В итоге у вас должно получиться нечто подобное:
Элементы платы
Семисегментный индикатор
За отображения информации отвечает семисегментный индикатор SA40-19, который состоит из семи отдельных светодиодов плоской формы , , , , , , и точки . Светодиоды расставлены на плате в виде арабской восьмёрки, такой способ даёт при включении определённых сегментов отображать цифры и некоторые буквы.
Светодиоды индикатора SA40-19 подключены к плате управления SegM8, которая получает команды от внешнего микроконтроллера и транслирует их на семисегментный экран.
Силовой клеммник
На задней панели индикатора расположены два винтовых силовых клеммника для питания устройства в штатном режиме на полную яркость. Группа контактов Input служит для подключения к модулю источника питания, а контакты Output — для прабрасывания питания к следующему модулю в цепочке. Каждый модуль при всех зажженных сегментах потребляет ток в штатном режиме до 300 мА.
Контакт | Назначение | Подключение |
---|---|---|
+12V | Силовое питание | Силовое питания 5–12 В |
GND | Земля | Общая земля |
Сигнальный клеммник
На задней панели индикатора расположены два винтовых сигнальных клеммника. Группа контактов Input служит для подключения к модулю внешнего контроллера, а контакты Output — для прабрасывания данных к следующему модулю в цепочке. Каждый модуль при всех зажженных сегментах потребляет ток в эконом режиме до 50 мА.
Контакт | Назначение | Подключение |
---|---|---|
VCC | Питание | Питание 3,3–5 В |
GND | Земля | GND |
CS / SS | Выбор модуля на шине SPI | CS / SS |
DI / MISO | Вход ведомого устройства на шине SPI | DO / MOSI |
CLK / SCK | Тактовый сигнал на шине SPI | CLK / SCK |
Преобразователь напряжения силовой части
На плате модуля расположен универсальный преобразователь питания TPS63060, который при низком входном напряжении поднимет питание до 10,4 вольт, а при высоком — понизит до 10,4 вольт. В итоге вы можете использовать широкий выбор источников питания.
Преобразователь напряжения цифровой части
Понижающий регулятор напряжения L78L05AB с выходом 5 вольт, обеспечивает питание микросхем и другой логики модуля. Максимальный выходной ток составляет 100 мА.
Выходной сдвиговый регистр
За логику управления индикатором отвечает микросхема выходного сдвигового регистра 74HC595, которая является преобразователем последовательного интерфейса в параллельный. Чип получает команды по SPI от внешнего микроконтроллера и выдаёт разом отдельные сигналы на каждый сегмент.
Т.к. каждый сегмент в модуле достаточно прожорливый по току и напряжению, то выходные сигналы с микросхемы сдвигового регистра сначала поступают на , а затем уже на .
Выходные каналы питания сегментов
На модуле расположено восемь выходных каналов для питания : семь каскадов предназначены для плоских сегментов и один — на точку. Каждый канал состоит из управляющего полевого транзистора с N-каналом и токоограничивающего резистора.
В свою очередь всеми каналами управляет один драйвер в виде .
5Управление 7-сегментным индикатором с помощью драйвера TM1637 и Arduino
Существуют и другие драйверы для подключения 7-сегментных дисплеев. Один из них – TM1637. Есть готовые модули, в которых уже присутствует и индикатор, и драйвер, и вся необходимая «обвязка» (резисторы, конденсаторы). Пример – модуль HW-069. В качестве семисегментного индикатора здесь 4-разрядный индикатор 3642BS-1.
Модуль HW-069 с драйвером TM1637 и четырёхразрядным семисегментным индикатором
Подключение модуля к Arduino предельно простое, т.к. для обмена с драйвером используется интерфейс, очень похожий на I2C. Т.е. необходимо подключить питание от 5 В Arduino, а данные передаются по DIO и тактируются по CLK. Но тем не менее, интерфейс не эквивалентен полностью I2C, т.к. у дисплея нет своего адреса.
Модуль HW-069 с драйвером TM1637 и четырёхразрядным семисегментным индикатором
Как всегда, есть множество готовых библиотек для управления индикатором через драйвер TM1637. Например, библиотека Gyver TM1637 или библиотека Avishay TM1637.
Модуль с драйвером TM1637 работает с Arduino UNO
Эти библиотеки работают прекрасно, и рассказывать, как загружать и устанавливать библиотеку для Arduino не буду: мы это делали уже миллион раз. Мы же не ищем лёгких путей, поэтому попробуем разобраться в работе драйвера TM1637 самостоятельно, верно?
Продолжение следует …
Программирование одноразрядного семисегментного индикатора
Использование в конструкции одноразрядного индикатора может потребоваться в разных случаях. К примеру, собираем кодовый замок и есть необходимость высвечивать цифру соответствующую нажатой кнопки, или в охранной сигнализации высвечивать номер сработавшего датчика. Так что сфера применения одноразрядных индикаторов приличная.
Организацию вывода цифр на одноразрядный индикатор мы оформим в виде подпрограммы: «Вывод информации на одноразрядный семисегментный светодиодный индикатор», так, чтобы затем эту подпрограмму с минимальными изменениями можно было использовать в любой программе.
Алгоритм подпрограммы:
1. Инициализация индикатора (подпрограмма)
— настройка порта, к которому подключен индикатор на вывод информации
— запись кодов семисегментного индикатора, соответствующих десятичным цифрам в определенные ячейки памятиДанная подпрограмма должна вызываться отдельно из основной программы2. Вход в основную подпрограмму3. Основная часть
— считываем текущую цифру
— определяем какой код семисегментного индикатора соответствует текущей десятичной цифре
— записываем определенный код индикатора в порт микроконтроллера4. Выход из подпрограммы
Для оформления программы в виде подпрограммы нам необходимо проделать ряд действий:1. Присваиваем имя подпрограмме инициализации индикатора — Ini_Indiкator_1 (к примеру)2. Присваиваем имя основной подпрограмме — Indicator_13. Присваиваем имена переменным SRAM в которых будут храниться коды семисегментного индикатора, к примеру:
— D0 (для цифры 0, и так далее), D1, D2, D3, D4, D5, D6, D7, D8, D9
— присваиваем имя переменной в которой будет хранится адрес ячейки памяти (D0) с кодом первой цифры (0) — D0_94. Присваиваем имя переменной, в которой будет хранится текущая цифра, которую необходимо вывести на индикатор. В эту переменную основная программа будет записывать вычисленные данные (цифры), которые мы выводим на индикатор — Data (к примеру).
Вот как, к примеру, в Algorithm Builder (остальные примеры тоже для этой программы), объявляются имена переменных в памяти программ (ОЗУ, SRAM):
В графе «Name» перечислены все имена переменных. В графе «Adress» запись «@D0_9» означает, что в переменной D0_9 хранится адрес первой переменной (D0)
Подпрограмма инициализации индикатора (подпрограмма вызывается из основной программы до обращения к подпрограмме вывода информации на индикатор):
А теперь давайте посмотрим основную часть программы и расшифруем ее:
Основная программа записала в назначенную нами переменную Data текущую цифру (для примера — цифра 6) и для вывода ее на индикатор вызвала подпрограмму Indikator_1.
Работа подпрограммы:
— Содержимое переменной Data записывается в рабочий регистр R20, теперь в регистре число 6 (рабочий регистр может быть любой)
— Допустим, первая переменная с кодом цифры у нас находится в ячейки памяти по адресу 100. На самом деле мы не знаем адреса ячеек памяти где хранятся значения D0…D9, но они точно следуют друг за другом. Поэтому была назначена переменная D0_9, в которой, как мы назначили, хранится адрес ячейки памяти D0 (в данный момент адрес =100).- Следующей командой:@D0_9 —> Y мы загружаем в двойной регистр Y адрес переменной D0 и получаем, что в регистре Y записалось число — 100.- Следующей командой:Y + R20 мы складываем число 100 с числом 6, результат = 106 при этом сохраняется в двойном регистре Y.- Следующей командой: —> R20 мы записываем содержимое ячейки памяти, расположенной по адресу, который записан в двойном регистре Y (106), а по этому адресу у нас расположена ячейка памяти переменной D6. Теперь в рабочем регистре R20 записано число 7Dh — код семисегментного индикатора для вывода цифры 6.- Следующей командой:R20 —> PortB мы выводим содержимое R20 в порт PB — высвечиваем цифру 6- Возвращаемся из подпрограммы
Надеюсь, что материал изложен доступно, если что-то не понятно, спрашивайте.
Часть 1: Семисегментный светодиодный индикатор: описание, подключение к микроконтроллеруЧасть 3: Многоразрядный семисегментный индикатор: организация динамической индикации, алгоритм работы, программа индикации
Семисегментный индикатор: программированиеСемисегментный индикатор: подключение, программирование, перевод двоичного кода числа в код семисегментного индикатора
Published by: Мир микроконтроллеров
Date Published: 10/02/2015
Программирование
- 7segment.pde
-
#define CLOCK_PIN 2 #define RESET_PIN 3 /* * Функция resetNumber обнуляет текущее значение * на счётчике */ void resetNumber() { // Для сброса на мгновение ставим контакт // reset в HIGH и возвращаем обратно в LOW digitalWrite(RESET_PIN, HIGH); digitalWrite(RESET_PIN, LOW); } /* * Функция showNumber устанавливает показания индикаторов * в заданное неотрицательное число `n` вне зависимости * от предыдущего значения */ void showNumber(int n) { // Первым делом обнуляем текущее значение resetNumber(); // Далее быстро «прокликиваем» счётчик до нужного // значения while (n--) { digitalWrite(CLOCK_PIN, HIGH); digitalWrite(CLOCK_PIN, LOW); } } void setup() { pinMode(RESET_PIN, OUTPUT); pinMode(CLOCK_PIN, OUTPUT); // Обнуляем счётчик при старте, чтобы он не оказался // в случайном состоянии resetNumber(); } void loop() { // Получаем количество секунд в неполной минуте // с момента старта и выводим его на индикаторы showNumber((millis() 1000) % 60); delay(1000); }
Пример использования с Arduino
Пример работы через Hardware SPI
Для подключения модуля к Arduino удобно использовать Troyka Shield. На плате уже предусмотрена отдельная группа пинов для работы по протоколу SPI.
Для примера выведем на индикатор несколько значений.
- qdTest.ino
-
// Подключаем библиотеку для работы с дисплеем #include <QuadDisplay2.h> // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(9); void setup() { qd.begin(); } void loop() { // можно выводить целые числа qd.displayInt(123); delay(1000); // и отрицательные тоже qd.displayInt(-123); delay(1000); // можно показывать ведущие нули (0012) qd.displayInt(12, true); delay(1000); // можно показывать вещественные числа // с заданной точностью, например 2 знака после запятой qd.displayFloat(-1.23, 2); delay(1000); // можно показывать температуру в °C qd.displayTemperatureC(-5); delay(1000); // можно показывать нехитрый текст (on/off, например) или // произвольную графику qd.displayDigits(QD_O, QD_f, QD_f, QD_NONE); // off delay(1000); qd.displayDigits(QD_O, QD_n, QD_NONE, QD_NONE); // on delay(1000); // и, конечно, всё очищать qd.displayClear(); delay(1000); }
Пример работы через Software SPI
Вы так же можете подключить дисплей к обычным пинам Troyka Shield. Пример подключения приведён на рисунке ниже.
Для примера выведем на индикатор несколько значений.
- qdTest2.ino
-
// Подключаем библиотеку для работы с дисплеем #include <QuadDisplay2.h> // создаём объект класса QuadDisplay и передаём номера пинов CS, DI и ⎍ QuadDisplay qd(9, 5, 7); void setup() { qd.begin(); } void loop() { // можно выводить целые числа qd.displayInt(123); delay(1000); // и отрицательные тоже qd.displayInt(-123); delay(1000); // можно показывать ведущие нули (0012) qd.displayInt(12, true); delay(1000); // можно показывать вещественные числа // с заданной точностью, например 2 знака после запятой qd.displayFloat(-1.23, 2); delay(1000); // можно показывать температуру в °C qd.displayTemperatureC(-5); delay(1000); // можно показывать нехитрый текст (on/off, например) или // произвольную графику qd.displayDigits(QD_O, QD_f, QD_f, QD_NONE); // off delay(1000); qd.displayDigits(QD_O, QD_n, QD_NONE, QD_NONE); // on delay(1000); // и, конечно, всё очищать qd.displayClear(); delay(1000); }
Элементы платы
На верхней стороне платы смонтированы четыре семисегментных светодиодных индикатора, а на нижней стороне — управляющая этими индикаторами логика.
Troyka контакты
Модуль подключается к управляющей электронике по SPI-интерфейсу при помощи двух трёхпроводных шлейфов.
DI | ⎍ | |
CS | V | G |
Назначение контактов 3-проводных шлейфов:
SPI
- Вход приёма данных () — соедините с пином микроконтроллера, выполняющим функцию вывода данных ().
- не используется
- Вход строба () — соедините с пином микроконтроллера, выполняющим функцию строба ().
- Выбор чипа, или защёлка () — модуль отображает принятые данные при изменении уровня сигнала на этом контакте с низкого на высокий. Соедините с любым цифровым пином микроконтроллера.
- Питание () — соедините с питанием микроконтроллера;
- Земля () — соедините с землёй микроконтроллера;
Семисегментные индикаторы
Семисегментный индикатор — это восемь светодиодов, составляющие символ: 7 сегментов + точка. Четырёхразрядный индикатор состоит из четырёх таких символов.
Управляющая логика
Управление всеми сегментами по отдельности потребовало бы 8×4=32 выходов микроконтроллера. Больше, чем предоставляют многие из них.
Для экономии выводов семисегментные индикаторы подключены через цепочку сдвиговых регистров. По одному регистру 74HC595 на каждый из четырёх индикаторов.
Сдвиговые регистры управляются через SPI-интерфейс, а следовательно для связи с микроконтроллером требуются линии MOSI, SCK, СS, Vcc и GND. Всего 5 линий.
Улучшение
Данная схема полностью рабочая, но в ней много повторяющихся элементов, и она будет занимать слишком много места, даже если делать отдельную интегральную схему. Поэтому ее стоит доработать.
Для начала, взглянем на таблицу истинности. Можно заметить, что для сегмента е больше логических , так что для него, можно не инвертировать выход (!! — двойное отрицание, то есть ничего не меняем). Также использование одного и того же модуля для цифры 1 происходит 4 раза! А для цифры 9 можно не делать модуль вообще (количество повторений одного модуля для цифры вынесено в последнюю колонку). Это существенная трата пространства и логических вентилей. После реинжинеринга, на выходе будет примерно такая схема:
Двухразрядные модификации
Двухразрядные модификации на сегодняшний день являются довольно распространенными. Светодиоды в данном случае чаще всего используются красного типа. Однако на рынке можно найти и другие варианты. Сила свечения у данных индикаторов зависит от производителя. Как правило, контакты у них устанавливаются медного типа.
При этом резисторы используются в основном импульсные. Для того чтобы понять, как сделать часы на практике, необходимо заранее подготовить модулятор, а также преобразователь для устройства. В первую очередь для часов подбирается корпус
При этом семисегментные индикаторы важно устанавливать на модулятор. Непосредственно регулятор должен располагаться в стороне
Соединяется он с блоком питания через тетрод. Также для лучшей проводимости многие специалисты рекомендуют использовать усилитель. В данном случае блок питания подойдет на 15 В. В конце работы останется лишь зафиксировать проводник.