Мир микроконтроллеров
Популярное
Часы на Arduino и 4-х разрядном семисегментном индикаторе
В настоящее время во встраиваемой электронике (и не только) достаточно широкое применение находят часы на семисегментных дисплеях (индикаторах). Ранее на нашем сайте мы уже рассматривали подключение семисегментного дисплея к плате Arduino Uno, также у нас представлены проекты различных часов на основе Arduino:
В этой же статье мы рассмотрим создание часов на основе платы Arduino и четырех семисегментных дисплеях. Управление семисегментными дисплеями мы будем осуществлять с помощью технологии мультиплексирования.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- 4-х разрядный семисегментный дисплей (индикатор) (4-Digit 7 Segment Display) (купить на AliExpress).
- Микросхема 74HC595 (регистр сдвига) (купить на AliExpress).
- Модуль часов реального времени DS3231 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
4-х разрядный семисегментный дисплей (4-Digit 7 Segment Display)
4-х разрядный семисегментный дисплей состоит из четырех семисегментных дисплеев, объединенных в единое устройство. Иногда говорят, что эти дисплеи “мультиплексированы вместе”, поэтому для управления ими можно использовать технологию мультиплексирования. Этот дисплей можно использовать для отображения цифр, а также некоторых букв. Дисплей можно использовать в обоих направлениях. 4 символа удобно использовать для изготовления электронных часов или счетчика от 0 до 9999.
На следующем рисунке показана внутренняя схема соединений 4-х разрядного семисегментного дисплея.
Каждый сегмент дисплея имеет собственный светодиод и им можно индивидуально управлять. Светодиоды таким образом скомпонованы в составе дисплея, что каждый из них освещает только свой сегмент (к которому он относится). Семисегментные дисплеи могут быть с общим катодом и общим анодом, как показано на следующем рисунке.
В семисегментном дисплее с общим катодом (ОК) отрицательные выводы всех светодиодов соединены вместе и образую общую землю. В схеме с общим анодом (ОА) положительные выводы всех светодиодов соединены вместе и они образуют общий вывод напряжения постоянного тока (VCC).
На нашем сайте есть достаточно подробные статьи про устройство семисегментных дисплеев и их программированию – они написаны для микроконтроллеров семейства AVR, но я думаю провести аналогию с Arduino вам будет не трудно:
Использование технологии мультиплексирования
Так каким образом мы можем на подобном 4-х символьном семисегментном дисплее отобразить, к примеру, число 1234? Это возможно сделать с использованием технологии мультиплексирования. Смысл этой технологии достаточно прост – в каждый момент времени мы отображаем только один символ (из 4-х возможных) на данном дисплее. Переключение между отображением всех 4-х символов происходит достаточно быстро – поэтому человеческий глаз воспринимает их непрерывно горящими.
Регистр сдвига 74HC595
Микросхема 74HC595 представляет собой 8-битовый регистр сдвига, работающий по принципу Serial IN – Parallel OUT (последовательный вход – параллельный выход). То есть данный регистр сдвига принимает входные данные последовательно и обеспечивает параллельный вывод этих данных на своих 8 контактах. С его помощью можно значительно уменьшить количество используемых контактов микроконтроллера (в нашем случае платы Arduino). Более подробно о подключении регистра сдвига 74HC595 к платы Arduino можно прочитать в этой статье.
Микросхема 74HC595 использует 3 контакта (Clock, Data & Latch) для подключения к микроконтроллеру и позволяет контролировать 8 своих выходных контактов. Контакт Clock используется для непрерывной подачи синхронизирующих импульсов, а контакт Data предназначен для подачи на него необходимых данных. Регистр сдвига 74HC595 работает по интерфейсу SPI, подробную информацию по использованию данного интерфейса в платах Arduino вы можете почерпнуть в этой статье. Назначение контактов микросхемы 74HC595 приведено на следующих двух рисунках.
Расшифровка обозначений контактов регистра сдвига74HC595 на русском языке выглядит следующим образом.
Q0-Q7 – восемь параллельных выходов общего назначения. Данные выходы нужны для того, чтобы мы могли как-то воспользоваться пришедшими данными по SPI – подключить линейку светодиодов, либо сегменты какого-то индикатора, либо дешифратор и т.д.
VCC – напряжение питания.
GND – общий провод.
Q7′ – последовательный выход данных. По сути — это MISO.
DS – последовательный вход данных или MOSI.
MR – это master reset. Сбрасывает все выходы в 0. Для нормального функционирования регистра сдвига на нем должна быть логическая 1.
SH_CP – в нашем случае это будет chip select.
ST_CP – это контакт управления регистром хранения, в нашем случае это будет контакт синхронизации, на который необходимо подавать тактовые импульсы. Но Arduino будет делать для нас это автоматически при использовании соответствующей команды.
OE – задействования выхода. При отрицательном значении последовательный выход включен, при положительном – выключен.
Модуль часов реального времени DS3231
Внешний вид данного модуля представлен на следующем рисунке.
Модуль предназначен для хранения времени и даты даже когда общее питание схемы выключено – для этой цели в его состав входит элемент питания CR2032. В состав модуля DS3231 входит также датчик температуры, поэтому его можно использовать в различных встраиваемых устройствах, например, в цифровых часах с индикатором температуры и т.д. Модуль работает по интерфейсу I2C. На нашем сайте вы можете посмотреть следующие проекты с использованием данного модуля:
Назначение контактов (распиновка) модуля DS3231 приведена в следующей таблице.
Наименование контакта | Назначение контакта |
VCC | напряжение питания |
GND | общий провод (земля) |
SDA | контакт последовательной передачи данных (I2C) |
SCL | контакт синхронизации (тактирования) (I2C) |
SQW | выход прямоугольного сигнала (программируемый меандр) |
32K | выход меандра с частотой 32.768кГц |
Теперь перейдем непосредственно к схеме нашего проекта.
Схема проекта
Схема часов на Arduino и 4-х разрядном семисегментном индикаторе представлена на следующем рисунке.
В следующей таблице представлены необходимые соединения между модулем часов реального времени и платой Arduino Uno.
DS3231 | Arduino Uno |
VCC | 5V |
GND | GND |
SDA | A4 |
SCL | A5 |
В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595 и платой Arduino Uno.
Регистр сдвига 74HC595 | Arduino Uno |
11-SH_CP (SRCLK) | 6 |
12-ST_CP (RCLK) | 5 |
14-DS (Data) | 4 |
13-OE(Latch) | GND |
8-GND | GND |
10-MR(SRCLR) | +5V |
16-VCC | +5V |
В следующей таблице представлены необходимые соединения между регистром сдвига 74HC595, 4-х разрядным семисегментным дисплей и платой Arduino Uno.
4-х разрядный семисегментный дисплей | Регистр сдвига 74HC595 | Arduino Uno |
A | Q0 | — |
B | Q1 | — |
C | Q2 | — |
D | Q3 | — |
E | Q4 | — |
F | Q5 | — |
G | Q6 | — |
D1 | — | 10 |
D2 | — | 11 |
D3 | — | 12 |
D4 | — | 9 |
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Объяснение программы для Arduino
Полный код программы и видео, демонстрирующее работу проекта, приведены в конце статьи. Здесь же мы рассмотрим основные фрагменты кода программы.
В программе мы должны считывать время (часы и минуты в 24-часовом формате) с модуля часов реального времени и конвертировать их в формат для отображения на 4-х символьном семисегментном дисплее.
Для подключения модуля часов реального времени DS3231 к плате Arduino используется шина I2C. Для работы с данным модулем (считывания даты, времени, температуры и т.д.) мы в программе будем использовать библиотеку . Скачайте ее по следующей ссылке — DS3231 RTC module Arduino Library. Поскольку мы используем интерфейс I2C нам в программе необходимо будет подключить и библиотеку .
В нашем проекте часы и минуты считываются с модуля часов реального времени и они потом объединяются вместе, например, 0930 – это будет 09:30 pm. Затем мы выделяем индивидуальные цифры из этого считанного числа. Далее эти индивидуальные цифры преобразуются в двоичный формат и передаются на регистр сдвига, а с него на семисегментный дисплей. Для отображения всех четырех символов мы используем технологию мультиплексирования – то есть в каждый момент времени мы отображаем только один символ, но переключение между символами происходит с высокой частотой, поэтому человеческий глаз этого не замечает.
Итак, первым делом в программе подключим необходимые библиотеки.
Источник
Arduino: 7-сегментный индикатор
Если вы научились пользоваться «световой шкалой», то следующий шаг в освоении нового компонента «7-сегментный индикатор» дастся вам легко. Он попадается практически во всех стартовых наборах.
Одноразрядный 7-сегментный индикатор
Мы имеем дело опять с набором светодиодов, только на этот раз их 8 (семь полосок и один кружочек) и они расположены не друг за другом, а в определённом порядке, которые позволяют вам выводить цифры от 0 до 9.
Важная отличительная черта — у индикатора имеются общие ножки для катода (ножки 3 и 8). Всего их две и они равноценны. Это удобно, вам не нужно будет от каждого катода вести отдельный провод на землю. Достаточно выбрать один из общих катодов и от неё соединиться с GND. Аноды у всех отдельные.
Также при желании вы можете установить несколько таких индикаторов подряд для вывода больших двухзначных, трёхзначных и т.д. чисел. Но существуют готовые компактные наборы для этих целей.
На 7-сегментный индикатор распространяются те же правила, что и на стандартные светодиоды — у каждого должен быть свой резистор. Поэтому для опытов приготовьте 8 резисторов.
Схематично можно изобразить следующим образом.
Собираем на макетной плате. Соединяем провода по порядку, начиная с первой ножки, которая идёт на второй порт. На землю идёт восьмая ножка индикатора.
Для проверки можно запустить стандартный пример Blink, только установите в качестве проверочного светодиода любой из ваших используемых портов. Я выбрал пятый порт, чтобы помигать точкой.
Если мы хотим помигать цифрой 1, то нам надо использовать светодиоды 4 и 6, которые идут на порты 4 и 6 платы микроконтроллера.
Если мы захотим вывести цифру 5, то понадобится работать с пятью светодиодами, цифру 8 — уже семь светодиодов. При сложных проектах работать с таким количеством становится затруднительно. Придётся каждый раз смотреть на схему, что вспомнить, какие светодиоды нужно включить для отображения каждой цифры.
Но можно пойти другим путём. А поможет нам единица информации — байт. Байт в своём двоичном представлении состоит из 8 бит. Каждый бит может принимать значения 0 или 1. А наш светодиодный индикатор как раз и состоит из восьми светодиодов. Таким образом мы можем представить цифру на индикаторе в виде набора байт, где единица будет отвечать за включённый диод, а ноль — за выключенный диод.
Число в двоичном виде записывается следующим образом:
Первые два символа 0b дают понять, что речь идёт о двоичном счёте. Все нули означают, что все светодиоды будут выключены.
У нас задействованы порты от 2 по 9. Второй порт записывается в самую правую позицию. Чтобы его включить, поставим единицу.
Можно самостоятельно включать по отдельности каждый диод, перемещая единицу в представленном байте. Поняв принцип, можно, например, заметить, что за точку отвечает четвёртый бит справа. Если мы его не будем использовать, то он всегда будет равен 0. За чёрточку посередине индикатора отвечает самый последний байт (или первый слева).
Комбинируя набор нулей и единиц, можно создать нужные нам цифры. Например, цифра 0 будет представлена как 0b01110111.
Давайте напишем пример вывода цифры 0.
Код немного избыточен, переменная mask здесь лишняя, но она нам пригодится в следующем примере. Здесь важно, что мы пробегаемся в цикле по числу светодиодов и устанавливаем у всех режим OUTPUT. Затем также в цикле проходим через все светодиоды и узнаём, комбинацию бит с помощью метода bitRead(). Полученная информация помогает нам подсветить нужные светодиоды и получить цифру 0 на выходе.
Для остальных цифр можно также подготовить нужные наборы бит.
Но мы пойдём другим путём. Все эти значения мы поместим в массив. И будем вытаскивать по индексу. А индексом для примера нам послужит метод millis. С его помощью мы можем получить число секунд, прошедших с запуска скетча, но выводить будем только последнюю цифру прошедших секунд.
Запустив пример, мы получим реальный секундомер. За точность не ручаюсь, но для простых задач подойдёт.
На видео некоторые цифры отображаются коряво, видимо из-за особенностей записи. В реальности все цифры работают как положено.
Позже я добавил на плату ещё один светодиод, который загорался при значении 0. При других значениях он был выключен.
На Амперке есть упоминания о двух компонентах, которые можно использовать для светодиодного индикатора. Я пока ими не пользовался:
Четырёхразрядный 7-сегментный индикатор
У четырёхразрядного 7-сегментного индикатора двенадцать выводов: 8 для каждого разряда с точкой и 4 для выбора нужного разряда. Чтобы разобраться в подключении, желательно иметь картинку перед глазами.
Если индикатор держать точкой вниз, то отсчёт идёт против часовой стрелки от нижнего левого угла.
Выводы 6, 8, 9 и 12 отвечают за конкретные разряды. Это могут быть общие катоды или общие аноды.
Выводы 1, 2, 3, 4, 5, 7, 10, 11 отвечают за конкретные сегменты. Например, самая верхняя полоска обозначена буквой A и имеет номер вывода 11. Таким образом, если подключить выводы 11 и 12 индикатора к выводу 11 и 12 на плате Arduino, то можем управлять этой полоской стандартным способом, например, помигать светодиодом.
Соедините все двенадцать выводов индикатора с выводами на плате. В своих примерах я использовал следующую схему.
При необходимости используйте резисторы, хотя во многих примерах в интернете встречал схемы без них.
Включаем букву H на всех разрядах.
Работа с индикатором показалась мне слишком муторной и сложной. Дополнительные материалы можно посмотреть на сайте, с которого я взял часть примеров.
Библиотека fDigitsSegtPin
К счастью есть библиотека fDigitsSegtPin, которую можно установить через менеджер библиотек. Подключаем библиотеку, указываем все двенадцать выводов по порядку и выводим нужное число.
Модули 7-сегментных дисплеев
Большое количество выводов у 7-сегментных дисплеев не слишком удобно использовать. Поэтому появились дисплеи в виде готовых модулей. Например, популярна модель TM1637.
Источник
Схема подключения 7-сегментных индикаторов к Arduino
В этой статье описывается схема подключения пары светодиодных семисегментных индикаторов к Arduino Uno с помощью микросхем-драйверов CD4026. При таком подходе, для вывода числа с любым количеством разрядов используется всего 2 цифровых выхода Arduino.
Для примера будем выводить на индикаторы количество секунд, прошедших с момента старта работы.
Исходные компоненты
Для эксперимента нам понадобятся:
Принцип работы
Семисегментный индикатор — это просто набор обычных светодиодов в одном корпусе. Просто они выложены восьмёркой и имеют форму палочки-сегмента. Можно подключить его напрямую к Arduino, но тогда будет занято 7 контактов, а в программе будет необходимо реализовать алгоритм преобразования числа из двоичного представления в соответствующие «калькуляторному шрифту» сигналы.
Для упрощения этой задачи существует 7-сегментный драйвер. Это простая микросхема с внутренним счётчиком. У неё есть 7 выходов для подключения всех сегментов (a, b, c, d, e, f, g pins), контакт для сбрасывания счётчика в 0 (reset pin) и контакт для увеличения значения на единицу (clock pin). Значение внутреннего счётчика преобразуется в сигналы (включен / выключен) на контакты a-g так, что мы видим соответствующую арабскую цифру.
На микросхеме есть ещё один выход, обозначенный как «÷10». Его значение всё время LOW за исключением момента переполнения, когда значение счётчика равно 9, а его увеличивают на единицу. В этом случае значением счётчика снова становится 0, но выход «÷10» становится HIGH до момента следующего инкремента. Его можно соединить с clock pin другого драйвера и таким образом получить счётчик для двузначных чисел. Продолжая эту цепочку, можно выводить сколь угодно длинные числа.
Микросхема может работать на частоте до 16 МГц, т.е. она будет фиксировать изменения на clock pin даже если они будут происходить 16 миллионов раз в секунду. На той же частоте работает Arduino, и это удобно: для вывода определённого числа достаточно сбросить счётчик в 0 и быстро инкрементировать значение по единице до заданного. Глазу это не заметно.
Подключение
Сначала установим индикаторы и драйверы на breadboard. У всех них ноги располагаются с двух сторон, поэтому, чтобы не закоротить противоположные контакты, размещать эти компоненты необходимо над центральной канавкой breadboard’а. Канавка разделяет breadboard на 2 несоединённые между собой половины.
Далее, подключим один из драйверов в соответствии с его распиновкой
Контакты 3 и 8 на индикаторе обозначены как «катод», они общие для всех сегментов, и должны быть напрямую соединены с общей землёй.
Далее следует самая кропотливая работа: соединение выходов микросхемы с соответствующими анодами индикатора. Соединять их необходимо через токоограничивающие резисторы как и обычные светодиоды. В противном случае ток на этом участке цепи будет выше нормы, а это может привести к выходу из строя индикатора или микросхемы. Номинал 220 Ом подойдёт.
Соединять необходимо сопоставляя распиновку микросхемы (выходы a-g) и распиновку индикатора (входы a-g)
Повторяем процедуру для второго разряда
Теперь вспоминаем о контакте «reset»: нам необходимо соединить их вместе и притянуть к земле через стягивающий резистор. В последствии, мы подведём к ним сигнал с Arduino, чтобы он мог обнулять значение целиком в обоих драйверах.
Также подадим сигнал с «÷10» от правого драйвера на вход «clock» левого. Таким образом мы получим схему, способную отображать числа с двумя разрядами.
Стоит отметить, что «clock» левого драйвера не стоит стягивать резистором к земле, как это делалось для правого: его соединение с «÷10» само по себе сделает сигнал устойчивым, а притяжка к земле может только нарушить стабильность передачи сигнала.
Железо подготовленно, осталось реализовать несложную программу.
Программирование
Результат
Подключаем контакт 2 с Arduino к контакту clock младшего (правого) драйвера, контакт 3 — к общему reset’у драйверов; разводим питание; включаем — работает!
Источник