Зачастую при работе с электроникой и электрическими приборами необходимо проверять цепи на разрыв. Для этого необходим надежный и простой в обращении прибор для контроля целостности проводов и токопроводящих дорожек. Иногда для таких целей покупать многофункциональный мультиметр довольно затратно. Но такое устройство можно сделать своими руками.

В данной статье описывается простой тестер непрерывности цепи, основанный на микроконтроллере ATtiny85 и пьезо-зуммере и предназначенный для проверки схемной проводки или прослеживания дорожек на печатной плате.
Данный тестер имеет низкое пороговое сопротивление 50 Ом, чтобы избежать ложных срабатываний, и пропускает менее 0.1 мА через тестируемую цепь, чтобы избежать воздействия на чувствительные компоненты. Он питается от маленькой батарейки типа «таблетка» и автоматически отключается, когда он не используется. Светодиод в составе прибора показывает, когда цепь замкнута. Для звукового оповещения о целостности цепи служит зуммер. На первый взгляд, использование микроконтроллера для этого приложения кажется излишним; однако для удовлетворения требований, реализованных в данном тестере, потребуется довольно сложная схема из дискретных компонентов.
Итак, как же работает этот тестер целостности цепи? Для определения напряжения на щупе данный прибор использует аналоговый компаратор в составе ATtiny85. Эквивалентная схема участка с компаратором показана ниже.

Когда напряжение на положительном контакте AIN0 выше напряжения на отрицательном контакте AIN1, устанавливается сигнал на выходе компаратора ACO. При питании 5 В напряжение на AIN1 удерживается на уровне 5 В подтягивающим резистором, а напряжение на AIN0 удерживается на уровне 5 мВ резисторным делителем. Если сопротивление между датчиками становится меньше 50 Ом, напряжение на AIN1 будет ниже, чем напряжение на AIN0, что переведет выход компаратора в высокое логическое состояние. Это используется, чтобы включить генератор, управляющий пьезо-динамиком. На самом деле два подтягивающих резистора не нужны, так как мы можем использовать внутренние подтягивающие элементы на входах, соответствующих AIN0 и AIN1. Это имеет два преимущества; во-первых, данный шаг экономит два резистора, но что более важно, он позволяет отключить подтягивание на AIN0, когда процессор переходит в спящий режим, избегая токового прохода через резистор 51 Ом. Полная схема самодельного тестера для проверки цепи на обрыв показана ниже.

На макетной плате это может выглядеть следующим образом:

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

Код программы для микроконтроллера ATtiny85, позволяющий реализовать тестер целостности проводки схемы, приведен ниже.
#include <avr/sleep.h>
#include <avr/power.h>
const int LED = 2;
const int Reference = 0; // линия AIN0
const int Probe = 1; // линия AIN1
const int Speaker = 4;
const unsigned long Timeout = (unsigned long)60*1000; // Одна минута
volatile unsigned long Time;
// Подпрограмма обслуживания прерывания при изменении сигнала на линии - сбрасывает таймер отключения
ISR (PCINT0_vect) {
Time = millis();
}
void Beep () {
TCCR1 = TCCR1 | 3; // Счетчик = (тактовая частота)/4
}
void NoBeep () {
TCCR1 = TCCR1 & ~3; // Остановка счетчика
}
void setup () {
pinMode(Reference, INPUT_PULLUP);
pinMode(Probe, INPUT_PULLUP);
pinMode(LED, OUTPUT);
pinMode(Speaker, OUTPUT);
pinMode(3, OUTPUT);
// Настройка бипера
TCCR1 = 1<<CTC1 | 0<<COM1A0 | 0<<CS10; // Режим CTC mode, остановка счетчика
GTCCR = 1<<COM1B0; // Переключение OC1B (PB4)
OCR1C = 119; // Звучание на частоте 1042 Гц (C6)
// Прерывание при измеении сигнала на щупе
PCMSK = 1<<Probe; // Прерывание при измеении сигнала на щупе
GIMSK = GIMSK | 1<<PCIE; // Разрешить прерывание при измеении сигнала на щупе
// Энергосбережение
ADCSRA &= ~(1<<ADEN); // Отключить АЦП для экономии энергии
PRR = 1<<PRUSI | 1<<PRADC; // Выключение неиспользуемых часов
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// Начать работу основной программы
digitalWrite(LED, true);
Time = millis();
}
void loop() {
bool Sense = ACSR>>ACO & 1;
if (Sense) Beep(); else NoBeep();
// Переключиться в режим сна?
if (millis() - Time > Timeout) {
digitalWrite(LED, false); // Выключение светодиода
pinMode(Reference, INPUT); // Отключить подтягивающий резистор для экономии энергии
sleep_enable();
sleep_cpu();
// Продолжить здесь, когда будет выход из режима сна
pinMode(Reference, INPUT_PULLUP);
digitalWrite(LED, true); // Включение светодиода
}
}