Если цифровых выходов на плате Arduino не хватает, то можно увеличить их количество микросхемой 74HC595.
Использование сдвигового регистра позволит получить дополнительно 8 выхода, за действуя всего 3 выхода на Arduino. Причем это не предел, добавив еще одну микросхему получим на выходе уже 16 выходов, и так добавлять микросхемы можно до бесконечности, а на Arduino будут заняты всё те же 3 выхода.
Содержание:
Познакомимся со сдвиговым регистром 74HC595 и логикой его работы
- Q0…Q7 – выходы для управления, это те самые новые выходы. Могут быть только HIGH или LOW
- GND – земля
- Q7′ – выход предназначенный для последовательного соединения регистров.
- MR – сброс регистра.
- SH_CP – вход для тактовых импульсов
- ST_CP – вход «защёлкивающий» данные
- OE – вход переводящий выходы из HI-Z в рабочее состояние
- DS – вход данных
- VCC – питание 5 вольт
Логика работы с регистром
Вот как это работает сдвиговый регистр 74HC595:
Теперь перейдем к подключению к Arduino
Подключаем микросхему с Arduino по рисунку выше. На Q0-Q7 цепляем светодиоды.
В итоге получаем что-то похожее на это:
Переходим к самому интересному — загружаем скетч.
int latchPin = 12; int clockPin = 11; int dataPin = 13; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { byte c = B10000011; // формируем байт информации из 8 бит для 8 светодиодов digitalWrite(latchPin, LOW);// открываем защелку для ввода информации shiftOut(dataPin, clockPin, LSBFIRST, c );// побитово закружаем байт информации digitalWrite(latchPin, HIGH);// закрываем защелку }
Как уже стало понятно из логики работы микросхемы, мы побитово вводим байт информации. Логический ноль «0» работает как LOW, логическая «1» как HIGH и задается это строчкой byte c = B10000011;
Так на мой взгляд получается наглядно, но можно и задать значение байта от 0 до 255.
void loop() { int c = 131; digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, c ); digitalWrite(latchPin, HIGH); }
Еще один пример для наглядности — бегущая строка.
int latchPin = 12; int clockPin = 11; int dataPin = 13; int currentLED = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { leds = 0; if (currentLED == 7) { currentLED = 0; } else { currentLED++; } bitSet(leds, currentLED); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); delay(250); }
Несложными манипуляциями подключаем вторую микросхему.
Как видно, выходов стало уже 16, а на ардуине заняты все те же 3. Загружаем скетч такого вида
int latchPin = 12; int clockPin = 11; int dataPin = 13; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { byte c = B10000000; // формируем байт информации из 8 бит для 8 светодиодов byte q = B00000001; // формируем байт информации из 8 бит для 8 светодиодов digitalWrite(latchPin, LOW);// открываем защелку для ввода информации shiftOut(dataPin, clockPin, LSBFIRST, q );// побитово закружаем байт информации shiftOut(dataPin, clockPin, LSBFIRST, c );// побитово закружаем байт информации digitalWrite(latchPin, HIGH);// закрываем защелку }
Вот таким способом можно расширить выходы Arduino и подключить например несколько сегментных индикаторов, чем мы и займемся в следующей статье.