Подключение семисегментного индикатора (1 разряд) к arduino по spi

Содержание

Схема подключения 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’у драйверов; разводим питание; включаем — работает!

Семисегментный индикатор Ардуино

Семисегментный индикатор Ардуино ► подключить можно через макетную плату, главное знать распиновку индикатора, чтобы управлять индикатором от Arduino.

Одноразрядный семисегментный индикатор подключить к Ардуино можно через макетную плату, самое главное знать распиновку (цоколевку индикатора), чтобы управлять сегментами от Arduino Uno. Рассмотрим, как подключить семисегментный индикатор к Ардуино и сделать простую программу с таймером. Будем управлять индикатором напрямую от микроконтроллера, используя тактовую кнопку.

Семисегментный индикатор распиновка

На картинке выше представлена распиновка одноразрядного семисегментного индикатора с общим катодом (минусом). Модуль представляет из себя небольшую led индикатор в котором находится семь светодиодов (благодаря этому индикатор и получил свое название) и восьмой светодиод в виде точки. Включая светодиоды в разной последовательности от Ардуино Уно, можно выводить различные цифры.

Обратите внимание, что панель не имеет резисторов, поэтому при подключении светодиодов используйте внешние резисторы. Если цоколевка семисегментного индикатора с общим анодом, вам непонятна, то можно опытным путем установить распиновку, подключая питание к разным выводам. При неправильном включении ничего страшного не произойдет, а вот без резистора светодиоды могут сгореть.

Как подключить семисегментный индикатор

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • одноразрядный семисегментный индикатор 5161as / hdsp 7503;
  • тактовая кнопка;
  • резисторы 220 Ом;
  • макетная плата (breadboard);
  • провода «папа-папа».

Схема подключения семисегментного индикатора к Ардуино

Для использования модуля 5161as / hdsp 7503 без сдвигового регистра потребуется использовать большое количество пинов Arduino Uno для включения светодиодов на индикаторе. В первом примере мы будем просто поочередно включать / мигать светодиодами для индикации на панели различных чисел. Соберите схему, как на представленной выше картинке и загрузите следующий скетч в микроконтроллер.

Скетч. Вывод чисел на 7-сегментный индикатор Ардуино

Пояснения к коду:

  1. скетч получается большим, поэтому мы ограничились тремя числами. Вывод других чисел на семисегментный индикатор Arduino не составит труда.

Управление семисегментными индикаторами

В следующем примере переключение чисел на индикаторе будет происходить только при нажатии тактовой кнопки. Дойдя до числа 3, таймер вновь обнулится и будет ожидать повторного нажатия на кнопку. Это довольно простые программы для Ардуино и семисегментного индикатора, для более сложных и интересных программ необходимо уже использовать сдвиговый регистр 74hc595 для Ардуино.

Читайте также:  Токсичность флюсов для пайки. меры предосторожности

Скетч. Одноразрядный семисегментный индикатор и кнопка

Пояснения к коду:

  1. переменная byte v = 0; используется в программе для перехода одного цикла while к другому. При нажатии на кнопку значение переменной v меняется;
  2. в программе поставлена небольшая задержка в каждом условии для защиты от быстрого перехода от одного цикла while в другой.

Заключение. Мы ограничились лишь знакомством с данным модулем и его применением с платой Ардуино. Используя несколько панелек или четырехразрядный семисегментный индикатор можно уже сделать полноценный таймер на Ардуино или часы реального времени. Эти схемы мы разместили в разделе Проекты на Ардуино для начинающих, где любой может найти по своему вкусу проект на микроконтроллере.

Подключение семисегментного индикатора (1 разряд) к Arduino по SPI

Наверняка у многих валяется вот такая светодиодная панелька:

Правильное название: семисегментный индикатор

Он получил такое названия благодаря тому, что в его корпусе находится 7 сегментов – светодиодов (часто добавляют ещё 8-й – точку).

Сейчас они не актуальны. Проще LCD экран подключить, он меньше выводов занимает, да и работать с ним проще. Однако иногда такие индикаторы могут быть полезен. Например, когда нужно отобразить только какую-либо цифру и ничего более. Плюс, они дешевле экранчиков.

Работать с семисегментом надо как со сборкой светодиодов (с общим катодом или анодом). Распиновку можно узнать, прозванивая ножки мультиметром. У меня получилось так: ( общий катод)

Каждый сегмент – это отдельный светодиод (красный или зелёный). Если подключаем к источнику 5V, то последовательно с каждым из них нужно подключить по резистору (150-300 ом) – чтобы не перегорели.

А соединять с Arduino я предлагаю через сдвиговый регистр 74HC595N (интерфейс SPI)

схема на BreadBoard:

Принципиальную схему не смог нарисовать в sPlan (нет 28-пиновой Atmega), так-что сделал в Fritzing:

Описание схемы:

– ноги 15,1,2,3,4.5,6,7 – это выходы регистра. Их подключаем к соответствующим ногам индикатора (A к Q0, B к Q1, C к Q3, ну и т. д.. Главное, чтобы было по порядку – тогда часть программирования будет проще)
– ноги 8 и 16 – это питание микросхемы (подключаем к GND и +5V Arduino)
– 10 ногу к +5V
– 13 ногу к GND
– Ноги 14, 12, 11 – управляющие пины шины SPI .
11 (SH_CP) – тактовая шина (clock) к 13 контакту Arduino (не принципиально)
12 (ST_CP) – защёлка (latch) к 12 контакту Arduino (не принципиально)
14 (DS) – данные (data) к 8 контакту Arduino (не принципиально)

Прошивка

Код очень простой. Мы даже не будем использовать библиотеку SPI. Посылать данные будем функцией shiftOut()

Она будет отправлять регистру 1 байт (8 бит). Каждый сегмент – это 1 бит. ( Если отправить вот такой байт: 0b10000000, то получим такую вот картину: (зажжётся первый сегмент – А)

Суть: Зажигая определённую комбинацию сегментов, мы получаем на экране цифру. Так, например, если зажечь сегменты B и С то загорится единичка. A, B, C – семёрка, и т. д..

Сам код: SevSeg1_SPI.ino

Список радиоэлементов

ОбозначениеТипНоминалКоличествоПримечаниеМагазинМой блокнот
Плата Arduino1Поиск в AliexpressВ блокнот
Сдвиговый регистр1Поиск в AliexpressВ блокнот
Резистор100-300 Ом8Поиск в AliexpressВ блокнот
Семисегментный индикатор1Поиск в AliexpressВ блокнот
Добавить все

Прикрепленные файлы:

Оценить статью

  • Техническая грамотность

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (4) | Я собрал ( 0 ) | Подписаться

Для добавления Вашей сборки необходима регистрация

#define CLOCK 13 //SH_CP
#define DATA 12 //DS
#define LATCH 8 //ST_CP
int val = 0;

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);

//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
>

0b12345678
*/
switch (val) <
case -1: //точка
shiftOut(DATA, CLOCK, LSBFIRST, 0b00000001);
break;
case 0: //0
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 1: //1
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 2: //2
shiftOut(DATA, CLOCK, LSBFIRST, 0b11011010);
break;
case 3: //3
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110010);
break;
case 4: //4
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100110);
break;
case 5: //5
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 6: //6
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111110);
break;
case 7: //7
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100000);
break;
case 8: //8
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111110);
break;
case 9: //9
shiftOut(DATA, CLOCK, LSBFIRST, 0b11110110);
break;
case 10: //A
shiftOut(DATA, CLOCK, LSBFIRST, 0b11101110);
break;
case 11: //b
shiftOut(DATA, CLOCK, LSBFIRST, 0b00111110);
break;
case 12: //C
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011100);
break;
case 13: //d
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111010);
break;
case 14: //E
shiftOut(DATA, CLOCK, LSBFIRST, 0b10011110);
break;
case 15: //F
shiftOut(DATA, CLOCK, LSBFIRST, 0b10001110);
break;
case 16: //G
shiftOut(DATA, CLOCK, LSBFIRST, 0b10111100);
break;
case 17: //H
shiftOut(DATA, CLOCK, LSBFIRST, 0b01101110);
break;
case 18: //I
shiftOut(DATA, CLOCK, LSBFIRST, 0b01100000);
break;
case 19: //J
shiftOut(DATA, CLOCK, LSBFIRST, 0b01110000);
break;
case 20: //L
shiftOut(DATA, CLOCK, LSBFIRST, 0b00011100);
break;
case 21: //n
shiftOut(DATA, CLOCK, LSBFIRST, 0b00101010);
break;
case 22: //O
shiftOut(DATA, CLOCK, LSBFIRST, 0b11111100);
break;
case 23: //P
shiftOut(DATA, CLOCK, LSBFIRST, 0b11001110);
break;
case 24: //q
shiftOut(DATA, CLOCK, LSBFIRST, 0b11100110);
break;
case 25: //S
shiftOut(DATA, CLOCK, LSBFIRST, 0b10110110);
break;
case 26: //U
shiftOut(DATA, CLOCK, LSBFIRST, 0b01111100);
break;
//некоторые буквы невозможно отобразить. их нет в списке
>

//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, HIGH);
if(val==26) <
val=-2;
>
delay(1000);
val=val+1;
>

#define CLOCK 13 //SH_CP 11 74СН
#define DATA 12 //DS 14 74СН
#define LATCH 8 //ST_CP 12 74СН

// – распиновка сегментов
byte numberSegments[10] = <
0b11111101, 0b01100000, 0b11011010, 0b11110010, 0b01100110,
0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110,
>;

//настраиваем контакты на выход
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(LATCH, OUTPUT);

//отключаем LATCH (чтобы регистр не ждал данных)
digitalWrite(LATCH, HIGH);
>

void loop() <
for (int i = 0; i

Подключение 7-сегментного индикатора к Ардуино

Семисегментный индикатор, как говорит его название, состоит из семи элементов индикации (сегментов), включающихся и выключающихся по отдельности. Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр. Часто семисегментные индикаторы делают в курсивном начертании, что повышает читаемость.

Цифры, 6, 7 и 9 имеют по два разных представления на семисегментном индикаторе. В ранних калькуляторах Casio и Электроника цифра 0 отображалась в нижней половине индикатора.

Сегменты обозначаются буквами от A до G; восьмой сегмент — десятичная запятая, предназначенная для отображения дробных чисел.
Изредка на семисегментном индикаторе отображают буквы.

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

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

На самом деле, при выборе стоит учитывать, что индикаторы могут быть с общим катодом или с общим анодом. По сути – это просто полярность. А вот при подключении, меньше заморочек если общий всё-таки катод.

Если общий – катод, то его обычно цепляют на землю, и можно регулировать яркость каждого сегмента отдельно, изменяя ток на каждом отдельном аноде. А если общий – анод, то на него подают напряжение, и приходится включать сегменты, инвертируя подачу сигнала на катоды. Так, сегмент будет включен, если на ножку не подаётся сигнал.

В общем, этим можно и пренебречь, подключая к Ардуине. Обычно яркость отдельного сегмента совершенно не обязательно.

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

Перерыв интернет, и не найдя описания подключения конкретно этого индикатора, решил определить всё сам:

Сам процесс оказался интересным и совсем не сложным.

Так, из 14 ножек, мне понадобилось только 9 (7 на сегменты, 1 на запятую и 1 на общее питание +3.3v). Проверял, подключая сегменты на землю (в ардуине это будет отсутствие сигнала на ноге).

Чтобы выводить цифры, надо комбинировать включение-выключение сегментов. Так, например, для цифры семь, надо включить сегменты A, B и C. Или, с Ардуины подать на их выводы LOW, а на остальные HIGH (для общего катода – наоборот, а сам катод нужно подключить на землю).

Вот, собственно табличка, соответствий для цифер от 0 до 9:

ЦифраСегменты
ABCDEF
1BC
2ABDEG
3ABCDG
4BCFG
5ACDFG
6ACDEFG
7ABC
8ABCDEFG
9ABCDFG

// список выводов Arduino для подключения к разрядам a-g
// семисегментного индикатора

int pins[ 7 ]=< 2 , 3 , 4 , 5 , 6 , 7 , 8 >;
// значения для вывода цифр 0-9
byte numbers[ 10 ] = < B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110>;
// переменная для хранения значения текущей цифры
int number= 0 ;
void setup ()
<
// Сконфигурировать контакты как выходы
for ( int i= 0 ;i 7 ;i++)
pinMode(pins[i],OUTPUT);
>
void loop ()
<
showNumber(number);
delay( 1000 );
number=(number+ 1 )% 10 ;
>
// функция вывода цифры на семисегментный индикатор
void showNumber ( int num)
<
for ( int i= 0 ;i 7 ;i++)
<
if (bitRead(numbers[num], 7 -i)==HIGH) // зажечь сегмент
digitalWrite(pins[i],HIGH);
else // потушить сегмент
digitalWrite(pins[i],LOW);
>
>

Купить сегментные индикаторы можно на Алиэкспресс

Arduino.ru

Подключение семисегментного индикатора

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Прошу помочь в такой ситуации. Нужно подключить семисегментный двухразрядный индикатор к ардуино уно через 74HC595.

Код, который я взял за основу, рассчитан на два четырехразрядных индикатора. В результате корректно отображаются цифры, только если они одинаковые. Схема подключения и код прилагаю.

Прошу помочь разобраться. Заранее благодарен.

#include //подключаем библиотеку SPI

const int RCK = 7; //pin7 запись в вых.регистр 74НС595
char datr[9] = “1834 790”; //выводимые на индик. знаки
int i;
byte razr = 0;

void setup() <
pinMode(RCK, OUTPUT); // строб записи в парал.регистр
digitalWrite(RCK, LOW);
SPI.begin(); //иниц. SPI: “по умолчанию” нам подходит
SPI.transfer(0); //очистим регистр разрядов
SPI.transfer(0xff); //очистим регистр сегментов
digitalWrite(RCK, HIGH); //запись в вых.парал.регистр
digitalWrite(RCK, LOW);
>

void loop() <
for (i=0; i Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

2. Надеюсь, что это неполная схема. Не сажаете же Вы целый разряд на один выход 595-го регистра? Там у Вас ещё где-то должны быть у левого (по схеме) регистра резисторы, а у правого – транзисторы.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

вполне рабочий код на первый взгляд. собирал по подобной схеме, тоже рабочая, но она не учитывает ток светодиода, а тупо подает все напряжение питания на светодиод, мало того что светодиод не выдержит со временем, так и сам регистор такие токи не тянет, цифры разной яркости получаются

я просто напряжение питания регистров понизил до 3.3В через стабилизатор ams1117. светодиоды были белые и как раз с напряжением в районе 3,5В

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Код, который я взял за основу, рассчитан на два четырехразрядных индикатора. В результате корректно отображаются цифры, только если они одинаковые. Схема подключения и код прилагаю.

А теперь осталось взять за основу код прилагающий к этой схеме. Но выводить не 8 разрядов , а только 2 нужные вам.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

да забыл сказать. аноды разрядов я подключал через полевики irlml2502 чтобы не перегружать регистр разрядов

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

аноды разрядов я подключал через полевики irlml2502 чтобы не перегружать регистр разрядов

Вот и я ж про то же 🙂

Можно и биполярники, но не “в лоб” же.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

мне нужна была яркость. для семисегментного если устроит небольшая яркость можно и без транзисторов, а чтобы не перегрузить регистр разрядов ток не должен превышать 35ма. значит делим на 8 =4.375ма, округляем до 4. подать на светодиод 4ма и посмотреть достаточно ли будет такой яркости, яркость изза динамической индикации еще немного визуально уменьшится. если достаточно измерить какое напряжение было на светодиоде и питать таким регистры. но не менее 2В. как то так. мало яркости значит ставить транзисторы. но тут есть оговорка. регулируя напряжение питания регистров можно увеличить яркость и поднять ток, так как 35ма это максимальный постоянный ток, а импульсный и больше держит

Как подключить 7-сегментный индикатор к Arduino

Для проекта понадобятся:

  • 3-разрядный 7-сегментный индикатор 3361AS или аналогичный;
  • двоично-десятичный преобразователь CD4511;
  • 7 резисторов по 220 Ом (рекомендую набор резисторов с номиналами от 10 Ом до 1 МОм);
  • модуль HW-069;
  • Arduino UNO или иная совместимая плата;
  • соединительные провода (например, вот такой набор);
  • макетная плата;
  • персональный компьютер со средой разработки Arduino IDE.

1 Описание сегментного светодиодного индикатора

Индикатор называется 7-сегментным из-за того, что он состоит из семи светодиодов, которые расположены в форме цифры “8”. Зажигая определённые сегменты, можно изображать разные цифры. Это похоже на цифры индекса на почтовом конверте: закрашивая определённые участки, мы пишем разные индексы. Зачастую дополнительно к 7-ми сегментам, индикатор содержит десятичную точку. Также индикатор может иметь несколько цифр – разрядов. Обычно от одного до 4-х. Сегменты индикатора обозначаются латинскими буквами от A до G, а DP – это десятичная точка (decimal point).

Обозначение сегментов 7-, 9-, 14- и 16-сегментных индикаторов

К слову, существуют сегментные индикаторы, число сегментов которых отличается от 7-ми. Так, например, существуют 14- и 16-сегментные индикаторы. Кроме цифр от 0 до 9 они также позволяют выводить буквы. Принцип их работы и управления обычно идентичны таковым для 7-сегментных индикаторов.

Мы в качестве индикатора будем использовать семисегментный индикатор 3361AS-1. Он построен по принципу индикатора с общим катодом. Это значит, что индикатор состоит из нескольких светодиодов в одном корпусе, у которых общая земля, а питание на каждый светодиод подаётся отдельно.

Как не трудно догадаться, существуют индикаторы с общим анодом. У них всё наоборот: общее питание, а для зажигания отдельного светодиода необходимо подать на него нулевой уровень.

2 Подключение 7-сегментного индикатора непосредственно к Arduino

Мы можем подключить индикатор прямо к выводам Arduino. Для этого придётся задействовать сразу 7 ножек (или 8, если нужна десятичная точка). Обратим внимание, что индикатор 3361AS не имеет токоограничивающих резисторов. Необходимо обеспечить наличие сопротивления номиналом около 180…220 Ом на каждый вывод индикатора (т.к. питание подаём +5 В от Arduino).

Электрическая схема 7-сегментного индикатора 3361AS

Расположение выводов индикатора показано на иллюстрации:

Размеры корпуса и расположение выводов 7-сегментного индикатора 3361AS

Подключать индикатор будем в соответствии с таблицей. Будет выбран первый разряд, остальные два пока не будем трогать.

Вывод индикатора 3361ASНазначениеВывод Arduino
1Сегмент ED6
2Сегмент DD5
3DPD9
4Сегмент CD4
5Сегмент GD8
7Сегмент BD3
8Выбор 3-го разряда5V
9Выбор 2-го разряда5V
10Сегмент FD7
11Сегмент AD2
12Выбор 1-го разрядаGND

Напишем скетч, который последовательно выводит числа от 0 до 9 на первом разряде индикатора.

Скетч управления индикатором 3361AS (разворачивается)

Небольшое пояснение по поводу массива 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

И вот так в динамике:

Это самый простой способ управления сегментным индикатором, но, как мы видим, он задействует почти все цифровые ножки Arduino. Особенно если мы решим использовать все разряды индикатора. Тогда кроме ножек для управления сегментами придётся дополнительно использовать столько выводов, сколько разрядов у индикатора. Получится, что для управления 7-сегментным индикатором с 3-мя разрядами необходимо 11 ножек (7 сегментов + 1 десятичная точка + 3 ножки для выбора разряда). Это расточительно, и не всегда можно такое себе позволить.

3 Драйвер для управления 7-сегментным индикатором

Чтобы сократить число задействованных выводов микроконтроллера обычно на практике используются различные решения. Например, популярным способом управления 7-сегментным индикатором является применение микросхемы CD4511 – двоично-десятичного преобразователя. Он переводит двоичный код числа в напряжение на соответствующих цифре сегментах индикатора. Такой преобразователь будет использовать всего 4 ножки Arduino. То есть, например, если необходимо отобразить на индикаторе десятичное число 7, необходимо выставить на входе преобразователя двоичное 0111 (“LOW HIGH HIGH HIGH”). Микросхема CD4511 выполняется в разных типах корпусов. Назначение выводов в исполнении с 16-тью ножками, такое:

Выводы двоично-десятичного преобразователя CD4511

Отечественными аналогами данного преобразователя являются микросхемы серий ИД1…ИД7. Кстати, отечественные преобразователи изображают цифры “6” и “9”, используя 6 сегментов, а зарубежные CD4511 – только 5 сегментов.

Разница в выводе цифр CD4511 и ИД7

4 Управление 7-сегментным индикатором с помощью драйвера CD4511 и Arduino

При подключении двоичного декодера будем руководствоваться следующей таблицей:

Вывод CD4511НазначениеПримечание
A0. A3Входы двоичного преобразователяСоответствуют разрядам двоичного числа.
a. gВыходы на сегменты индикатораПодключаются через токоограничивающие резисторы к соответствующим сегментам светодиодного индикатора.
Lamp Test#Тест индикатора (включает все сегменты)Подключим к питанию, не использовать его.
Blanking#Очистка индикатора (отключает все сегменты)Подключим к питанию, чтобы не использовать его.
Latch Enabled#Выход активенБудет подключен к земле, чтобы выход был всегда активен.
VDDПитание микросхемы и индикатораОт 3 до 15 В.
GNDЗемляОбщая у CD4511, Arduino, 7-сегментного индикатора.

Желательно также подключить керамический конденсатор ёмкостью примерно 1 мкФ между землёй и питанием микросхемы CD4511.

Подключение 7-сегментного индикатора к Arduino с двоичным декодером CD4511B

Теперь напишем простой скетч, чтобы проверить работоспособность 7-сегментного индикатора 3361AS-1 в связке с двоично-десятичным декодером, а также получить опыт работы с ними. Данный скетч будет поочерёдно перебирать числа от 0 до 9, перемещаясь по циклу от одного разряда индикатора к следующему.

Скетч для управления 7-сегментным индикатором (светится 1 разряд) (разворачивается)

Загрузим скетч в Arduino и посмотрим результат.

В один момент времени светится только один разряд индикатора. Как же задействовать одновременно сразу три разряда индикатора? Это будет немного сложнее. Сложность заключается в том, что нам одновременно нужно управлять тремя разрядами десятичного число, используя только один преобразователь CD4511. Но чисто физически это невозможно. Однако можно добиться иллюзии постоянного свечения всех разрядов светодиодного индикатора. Для этого придётся быстро переключаться между разрядами, постоянно обновляя показание каждого разряда. Мы будем поочерёдно активировать каждый из разрядов индикатора 3361AS, выставлять на нём с помощью двоичного преобразователя CD4511 нужную цифру, а затем переключаться на следующий разряд.

Для человеческого глаза такое переключение между разрядами будет незаметно, но если результат снять на видео, то его можно увидеть.

Также перепишем функцию setNumber() отправки двоичного кода на вход микросхемы преобразователя CD4511. Вместо использования оператора switch, используем массив массивов.

Скетч для управления трёхразрядным 7-сегментным индикатором (разворачивается)

Получится вот такая картина.

Управление трёхразрядным семисегментным индикатором с помощью преобразователя CD4511 и Arduino

В динамике это выглядит так. Тут как раз временами видны мерцания сегментов светодиодного индикатора.

Можно попробовать поиграть значением задержек в функции setDigit(). Если сделать задержки меньше, то мерцание станет меньше заметно. Но начнут сильнее засвечиваться соседние сегменты на выбранном разряде индикатора. Тут необходимо выбрать какое-то компромиссное решение.

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 самостоятельно, верно?

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector