среда, 19 сентября 2018 г.

74НС595 и 7-ми сегментный светодиодный дисплей


         Для проверки какой-либо идеи мне иногда приходится делать отладочные платы (или по-другому модули для Arduino) самому. При разработке очередного регулятора громкости мне понадобился 7ми сегментный двухразрядный дисплей, способный выводить значение громкости (число от 0 до 19) и знак "MUTE". Чтобы уменьшить количество используемых драгоценных выводов Arduino было решено использовать сдвиговый регистр 74HC595.


Китайская промышленность выпускает несколько видов таких индикаторов, как одноразрядных: 
Кстати способных "объединяться" в многоразрядные:

Так и на 2-3-4-8 разрядов:


             Но я решил не ждать месяц заказа из Китая и сделать такую плату самостоятельно.  Мне понадобились:

1) Светодиодный цифровой индикатор. Я использовал оставшийся от старого телевизора LN5241GK. Вот даташит на него. Вообще-то подойдет любой с общим катодом:


2) макетная плата 3х7см. Я покупал на BangGood’e 40 штук за $8.99. Получилось в среднем 22 цента за штуку:


3) 9шт. резисторов 0,125Вт 300 Ом. Цена на ebay.com - $1 за 100шт., т.е. 9 шт. = 9 центов.


4) Разьемы - 14pin. На ebay 10 полосок по 40pin - 1$ (т.е. за 14pin примерно 1 цент).


5) Провода для монтажа и припой.

Итого это удовольствие мне обошлось в:
индикатор (бесплатно) + макетная плата ($0.22) + резисторы ($0.09) + Пины ($0.01) = $0.32. Стоимость потраченного времени я не считаю, так как оно компенсировалось полученным удовольствием от сборки.


Немного теории:

Светодиодный дисплей с общим катодом (ОК) можно представить как 8 светодиодов соединенных в одну точку катодами.  Схематически это выглядит так:


Катод подключается к «минусу» питания (общему проводу, массе), а подавая напряжение на выводы анодов можно засветить сегменты от «a» до «g» или сегмент «dp» (точку). Зажигая разные комбинации сегментов визуально воспринимаются как цифры или знаки. Например, включенный сегмент «g» воспринимается как «-» (минус), одновременно включенные сегменты «abcdef» - «0», «bc» - «1» и т.д.

Сдвиговый регистр 74HC595 представляет собой преобразователь входного последовательного сигнала на входе Ds (выв. 14), в выходной параллельный на выходах Q0-Q7 (выводы 15, 1-7), позволяя этим самым увеличить количество выводов микроконтроллера.

Синхронизация передачи данных происходит при помощи тактирующего пина SHcp (вывод 11). Вход микросхемы STcp (вывод 12) служит своеобразной «защелкой» и позволяет после того как данные будут записаны по входу Ds, передавать сигнал на все 8 выходов одновременно. 
Одна микросхема может преобразовать с последовательного в параллельный 8 бит информации (В нашем случае это значит, что можно управлять не более чем 8-ю сегментами дисплея). Т.е. если нам нужно управлять 2х разрядным индикатором, тогда придется добавить второй сдвиговый регистр и соединить его вход Ds (вывод 14) c выходом Q7’ (вывод 9) первого регистра. Если 3х разрядным, то нужно 3 микросхемы и т.д.


Железо:

Далее составляем принципиальную схему. Для этого открываем datasheet на светодиодный дисплей. Из всех «многа букафф» ценность представляют несколько таблиц и рисунков. Это:

1) электрооптические характеристики:


Из которых следует, что наш дисплей действительно имеет общий катод и зеленый цвет свечения

2) Назначение и нумерация выводов:

Из первого рисунка узнаем про нумерацию выводов, расположение сегментов и разрядов на индикаторе (например, что первый разряд (разряд десятков) имеет обозначение D1, а разряд единиц D2. Из таблицы узнаем, что вывод катода второго разряда – это вывод 13 на индикаторе, а анодам сегментов a, b, c, d, e, f, g соответствуют выводы 11, 10, 8, 6, 5, 12, 7. Вывод первого катода – 14. Но анодов для него всего 2: это сегменты b и c (15 и 3 выводы соответственно). Это значит, что на первом разряде можно засветить только цифру 1. Остальные выводы неподключенные (это немаловажно, т.к. позже я через них буду проводить дорожки, не боясь что-либо закоротить).
3) И напоследок: 

Убеждаемся, что ток 1 сегмента должен быть 20mA (это стандартная величина для подобных дисплеев и обычных светодиодов. На основе этой величины подбираем сопротивления, для ограничения тока.

Далее составляем принципиальную схему:

Кроме светодиодного дисплея и микросхемы сдвигового регистра, которые я описал ранее, в схеме присутствуют 9 резисторов для ограничения тока до 20мА на каждый сегмент. Микросхему я установил на панельку. Также используются два разъема (один 9ми штырьковый для подключения платы напрямую к Arduino при вытянутой с панельки микросхеме и один 5ти штырьковый для подключения через микросхему сдвигового регистра.
Также из-за особенности дисплея выводить в первом разряде только единицу и чтобы не использовать вторую микросхему 74HC595 я вместо «точки» подключил сегменты «b» и «c» первого разряда дисплея. Теперь при появлении на выходе Q7 сигнала высокого уровня будет зажигаться в разряде десятков цифра «1».
Номера выводов дисплея я в схеме не указывал, т.к. для каждой модели дисплея они разные и брать их надо с даташита.

Чтобы легче было собирать - по-быстрому в sprint layout выбрал шаг сетки 2.54мм и набросал плату.  

Скачать ее можно тут.


Вот как выглядит готовая плата:

К Arduino она подключается следующим образом:



Программная часть:

Основой управления сдвиговым регистром в Arduino является команда shiftOut(), которая выводит на заданный пин байт информации побитно. Использует 2 пина: Пин данных – dataPin и тактовый пин синхронизации clockPin. Для того, чтобы сдвиговый регистр принял данные, на его вывод STcp (Latch) на время передачи должен быть подан сигнал «0».
Синтаксис команды ShiftOut() следующий:
shiftOut(dataPin, clockPin, bitOrder, value), где:
dataPin, clockPin – выводы Arduino, к которым подключены 14(data) и 11(latch) выводы сдвигового регистра 74HC595. Как видно из таблицы, которая была приведена ранее, это 9 и 10 выводы Arduino.
bitOtder – может принимать 2 значения и указывает направление вывода бит: слева (MSBFIRST) или справа (LSBFIRST).
value – однобайтовое число (0-255) которое нужно вывести на индикатор побитно.
Например, нужно вывести на дисплей цифру 3. Для этого сегменты a,b,c,d,g – нужно засветить (подать на них «1»), а сегменты f, e -погасить (подать на них «0»). Схематически это выглядит так : 

Другими словами, в сдвиговый регистр нужно записать число 0b11110010 (0b обозначает, что число в двоичной системе исчисления). 
Делается это так:

digitalWrite(8, LOW); // Устанавливаем Latch в «0»
shiftOut(9, 10, LSBFIRST, 0b11110010); // Записываем побитно число 11110010 в двоичной системе
digitalWrite(8, HIGH); // Устанавливаем Latch в «1»

Все! На дисплее должна засветиться цифра 3. 
Если нужно засветить единицу в первом разряде (он подключен вместо точки «DP») – тогда к коду цифры нужно добавить 1:
0b11110010 + 1 = 0b11110011
0b11110010 – это «3»
0b11110011 – это «13»

И напоследок в качестве примера привожу тестовый скетч, который высвечивает на дисплее числа от 0 до 19 с задержкой в 1 секунду:


int latchPin = 8; //STcp
int clockPin = 10; // SHcp
int dataPin = 9; //Ds
// Массив в котором указано, какие сегменты должны зажигаться
// например, в "0" должны светиться сегменты abcdef (0b11111100)
int num[11] = { 0b11111100, //цифра 0
                0b01100000, //цифра 1
                0b11011010, //цифра 2
                0b11110010, //цифра 3
                0b01100110, //цифра 4
                0b10110110, //цифра 5
                0b10111110, //цифра 6
                0b11100000, //цифра 7
                0b11111110, //цифра 8
                0b11110110, //цифра 9
                0b00001101, //знак ||
              };
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
 
   for (int i=0; i<=19; i++){
    digitalWrite(latchPin, LOW);  // установка синхронизации "защелки" на LOW
 if (i<10)  shiftOut(dataPin, clockPin, LSBFIRST, num[i]);   // передаем последовательно на вход данных
      else shiftOut(dataPin, clockPin, LSBFIRST, num[i%10]+1);
   digitalWrite(latchPin, HIGH);  //"защелкиваем" регистр, устанавливаем значения на выходах
    delay(1000);}
  
}

Скачать его можно здесь

На вопросы отвечу в комментариях

Комментариев нет:

Отправить комментарий