Алс334б1 подключение семисегментного индикатора к ардуино

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

Подключение семисегментного индикатора (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

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

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

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

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

Средний балл статьи: 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);
>

Читать еще:  Huawei mate 10 pro размеры

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 <=9; i++)
<
//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, LSBFIRST, numberSegments[i]);
//включаем LATCH (Начинаем общение)
digitalWrite(LATCH, HIGH);
delay(1000);
>
>

Ссылка на основную публикацию
Adblock
detector