Пожалуй, наиболее востребованными микросхемами стандартной логики во времена Arduino и микроконтроллеров являются сдвиговые регистры 74HC595 и 74HC164. Они позволяют расширить количество выходов МК. Принципиальным отличием этих двух чипов является наличие защелки и промежуточного буфера в 74HC595. Обе микросхемы я часто использую в своих проектах, при этом 74HC595 лучше подходит для схем на Arduino, а более простая 74HC164 — для проектов без микроконтроллера.
Заказываю я их обычно на AliExpress и других маркетплейсах, поэтому бывает повод сомневаться в их качестве. Недавно купил десять штук 74HC164 и задумался, как их быстро проверить. Конечно, можно собрать схему с кнопками и светодиодами на каждый выход, но захотелось создать устройство, обладающее простотой, универсальностью и автоматизацией. Главное требование — не занимать лишнего места: быстро собрал на беспаечной макетке, проверил микросхемы и разобрал.
Возникла идея использовать Arduino Nano, которая сама будет имитировать всевозможные режимы работы, считывать состояние выходов и сообщать о пригодности или браке. Дополнительных деталей, кроме макетки и проводов, не требуется. Индикация результата производится светодиодом на плате Arduino: горит постоянно — микросхема исправна, моргает — брак или неправильное подключение.
Алгоритм работы такой: мы проводим серию проверок одну за другой, и если хотя бы одна из них не совпадает с эталоном — сразу выставляем флаг ошибки. Финальный вывод делается после завершения всего цикла. Эталоном служат значения массива, которые сравниваются со считанными данными. Для этого используется весь порт D микроконтроллера (пины D0–D7 на плате Arduino).
Программа:
// Массив эталонных состояний для проверки всех битов и замыканий
const byte testPatterns[] = {
0x00, // Состояние после сброса (все выключены)
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // Бегущая единица
0xAA, // 10101010 (тест через один)
0x55 // 01010101 (инверсия теста через один)
};
const int pCount = sizeof(testPatterns);
void setup() {
// Настройка ПОРТА D (пины 0-7) на ВХОД без подтяжки
DDRD = 0x00;
PORTD = 0x00;
// Настройка ПОРТА B (пины 8-12) на ВЫХОД
// Пины: 8(Latch), 9(Reset), 11(Data), 12(Clock)
DDRB |= 0b00011011;
// Пин 9 (Reset) в HIGH для нормальной работы регистра
PORTB |= (1 << 1);
pinMode(13, OUTPUT); // Светодиод индикации
}
void loop() {
bool isOk = true;
// 1. АППАРАТНЫЙ СБРОС (через пин 9)
PORTB &= ~(1 << 1); // Reset в LOW
delayMicroseconds(10);
PORTB |= (1 << 1); // Reset в HIGH
// "Проталкиваем" сброс на выходы (Latch)
digitalWrite(8, LOW); digitalWrite(8, HIGH);
// 2. ЦИКЛ ПРОВЕРКИ ПО МАССИВУ
for (int i = 0; i < pCount; i++) {
byte target = testPatterns[i];
// Отправка текущего шаблона в регистр
digitalWrite(8, LOW);
shiftOut(11, 12, MSBFIRST, target);
digitalWrite(8, HIGH);
delayMicroseconds(30); // Время на установку уровней
// Сравнение считанного байта с порта D с эталоном
if (PIND != target) {
isOk = false;
break;
}
}
// 3. ОТОБРАЖЕНИЕ РЕЗУЛЬТАТА
if (isOk) {
digitalWrite(13, HIGH); // Постоянный свет - чип исправен
} else {
// Быстрое мигание - чип поврежден или плохой контакт
digitalWrite(13, HIGH); delay(80);
digitalWrite(13, LOW); delay(80);
}
}
Вот как это происходит пошагово:
Сброс: Обнуляем регистр. Считываем PIND. Если там не 0 — всё, брак (выходим из проверки). Цикл (Массив): Берем первый шаблон (например, 00000001). Записываем в регистр. Сравниваем PIND с шаблоном. Если не совпало — брак (прерываем цикл через break). Берем второй шаблон... и так до конца массива. Вердикт: Если мы дошли до конца массива и ни разу не споткнулись — зажигаем светодиод (ОК). Если сработал break — начинаем мигать (Брак).
Схема подключения для макетки универсальная, в соответствии с цоколевкой микросхемы, просто в случае с 74HC164 не подключаем пин ардуино предназначенный для защелки (D8 Latch), в программе ничего не меняем.
Так как мы используем Port D (0–7), перед тестом надо отключить кабель USB и подать питание (5V или Vin), либо просто закрыть Монитор порта в Arduino IDE. Линии RX/TX (пины 0 и 1) могут «мусорить» в порт, если компьютер будет пытаться что-то отправить или принять во время теста.
Для большей наглядности нарисовал схемы подключения обоих микросхем к ардуино.
Всё-таки без дополнительных деталей не обошлось, поставил защитные резисторы (270 Ом), на случай, если один из входов испытуемой микросхемы окажется замкнутым на землю, или питание.
Вот как выглядит собранная схема на макетке. Светодиод горит — значит, тесты проходят непрерывно и микросхема исправна.
Теперь имитируем неисправность, выдернув один из проводов, идущих с выхода сдвигового регистра. Светодиод начинает мигать — брак обнаружен.
Аналогичный тест для 74HC595, кстати здесь я поленился воткнуть защитные резисторы, так можно, если есть уверенность, что в микросхеме нет короткого замыкания.
Если вам часто требуется подобное устройство, лучше спаять его на постоянной плате с панельками. Для элегантности Arduino Nano можно заменить «голым камнем» (например, ATmega8 или ATtiny2313).