01 |
Иногда возникает необходимость внешней индикации состояния пинов. Такая необходимость может возникать для контроля работоспособности схемы без наличия специализированных контрольно-измерительных приборов. Примером применения такой индикации могут служить линии обмена данными с датчиками в готовом устройстве. Такая индикация поможет определить неисправность узла, так как визуально будет видно, какими модулями данные отправляются и какими принимаются. А поскольку цифровые данные передаются посредством смены логических уровней, то, если они не будут отправляться — индикатор своим состоянием это покажет. |
|
03 | На заметку: |
Все информация, представленная в данной статье, справедлива и для Raspberry Pi 3
|
|
04 |
В данной статье будет показано, как сделать индикацию состояния при помощи светодиодов, подобную индикации RX/TX (прием/отправка данных по UART) платы Arduino. |
Проверено — автор рекомендует: Видео-инструкция о покупке со скидками на Aliexpress Даташит на NPN-транзистор BC548 — BC548.pdf (25,9 KB) |
05 |
Система проста и состоит из двух ключевых элементов — непосредственно светодиода с резистором, которые обеспечивают визуальную обратную связь и NPN-транзистора BC548 (даташит — BC548.pdf (25,9 KB)). Схема подключения выглядит следующим образом: |
|
06 |
В данной схеме, когда на пине будет присутствовать логическая единица HIGH, то светодиод будет гореть
|
|
07 |
Резистор R1 не дает всему току «утечь» к земле через транзистор, оставляя его на основное предназначение (To Module) — например, передача данных модулю или управление чем-либо. |
|
08 |
Работоспособность схемы легко проверить, если собрать её на макетной плате: |
|
10 |
И залить скетч: |
|
11 | Arduino (C++) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int pinSignal1 = 10; // Первый сигнальный пин
int pinSignal2 = 11; // Второй сигнальный пин
void setup() {
pinMode(pinSignal1, OUTPUT); // Режим работы пинов
pinMode(pinSignal2, OUTPUT); // Режим работы пинов
}
void loop() {
for (int i = 0; i < 10; i++) { // Мигаем 10 раз подряд одним светодиодом
blinkLed(pinSignal1, 5);
}
for (int i = 0; i < 10; i++) { // Затем сразу мигаем 10 раз подряд другим светодиодом,
blinkLed(pinSignal2, 5);
}
delay(1000); // Поочереди раз в секунду
}
void blinkLed(int pin, int _delay) { // Общая функция для мигания светодиодами
digitalWrite(pin, HIGH);
if (_delay > 0) delay(_delay);
digitalWrite(pin, LOW);
} |
|
12 | На заметку: |
Одной из главных особенностей транзистора BC548 (NPN), так же как и его комплиментарной пары ВС558 (PNP), является очень низкое напряжение открытия транзистора — 0,7 В. Это позволяет использовать схемы индикации с различными уровнями логической единицы — от 1 В.
|
|
13 |
Ну а если нужно, например, сделать индикацию Serial-порта? Как известно, у протокола UART, в состоянии покоя, обе линии данных — и RX, и TX по умолчанию притянуты к единице. Получается, что если использовать предыдущую схему, индикаторные светодиоды будут постоянно гореть, затухая только во время передачи данных. Эту ситуацию можно изменить при помощи комплементарной пары транзистора BC548 (NPN) — ВС558 (PNP) (даташит — BC558.pdf (43,7 KB)). Он работает наоборот, и схема с использованием этого транзистора примет вид: |
Комплементарная пара — пара транзисторов, сходных по абсолютным значениям параметров, но имеющих разные типы проводимостей (PNP — NPN).
Даташит на PNP-транзистор ВС558 — bc556_bc557_bc558_bc559_bc560.pdf (43,7 KB) |
15 |
Испытательный стенд: |
|
17 |
Для демонстрации этого примера достаточно выводить в Serial различные данные с заданной периодичностью: |
|
18 | Arduino (C++) |
1 2 3 4 5 6 7 8 void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(micros());
delay(1000);
} |
|
19 |
Два светодиода, управляемые транзисторами, в собранной схеме будут дублировать индикацию светодиодов RX/TX на плате Arduino. |
|
20 |
Для того, чтобы «ожил» индикатор TX, можно отправить что-нибудь в Serial: |
|
22 |
Таким образом можно организовать индикацию на любом пине Arduino / Raspberri Pi: |
|
24 |
Для демонстрации работы можно собрать следующую схему: |
|
26 |
И залить скетч, представленный ниже: |
|
27 | На заметку: |
На время заливки скетча необходимо отключать провода от пинов RX/TX Arduino.
|
|
28 | Arduino (C++) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 int pin1 = A4; // Пины отвечающие за 1 способ - светодиод горит при наличии HIGH
int pin2 = A5; // Пины отвечающие за 1 способ - светодиод горит при наличии HIGH
// 0 и 1 пины Arduino RX и TX - пины отвечающие за 2 способ - светодиод горит при наличии LOW
// Во время заливки скетча - их необходимо отсоединять от платы
// Тестовая строка, которая будет выводиться в Serial, таким образом оживляя пин TX
String outstr = "If it is important for a sequence of values generated to differ, on subsequent executions of a sketch, use to initialize the random number generator with a fairly random input";
void setup() {
Serial.begin(9600);
pinMode(pin1, OUTPUT);
pinMode(pin2, OUTPUT);
}
void loop() {
blinkLed(pin1, random(100)); // Мигаем заданным светодиодом, имитируя передачу данных
delay(random(20, 1000)); // Каждый раз случайная задержка
blinkLed(pin2, random(100)); // Мигаем заданным светодиодом, имитируя передачу данных
delay(random(20, 1000)); // Каждый раз случайная задержка
int strlength = random(10, outstr.length() - 1);
String tmpstr = outstr.substring(0, strlength); // Каждый раз произвольно обрезаем строку, чтобы каждый раз передавалось разное количество данных
Serial.println(tmpstr);
delay(random(20, 2000)); // Каждый раз случайная задержка
}
void blinkLed(int pin, int delayms) { //Функция мигания светодиодом
digitalWrite(pin, HIGH);
delay(delayms);
digitalWrite(pin, LOW);
} |
|
29 |
Светодиод подключенный к 0 пину (RX) будет загораться, только когда будут отправляться данные из поля монитора порта. |
|
30 |
Бонус — логическая единица меньше 5 вольт В случае, если необходимо сделать индикацию логической единицы номиналом менее 5 вольт (например 3,3 В) на 5-вольтовой логике, при попытке реализации её по второй схеме (BC557), всплывет досадная проблема — индикатор будет гореть постоянно. Такая ситуация может возникнуть при индикации TX-пина модуля SIM800L. Напряжение покоя этого пина, подтянутого к внутренней логической единице модуля — 2,8 В. При таком напряжении светодиод будет гореть в обоих случаях. |
|
31 |
Для того, чтобы схема нормально заработала, нужно сигнальную линию в состоянии логической единицы 2.8 В подтянуть до логической единицы схемы — 5 В. Сделать это можно при помощи инвертирующего триггера Шмитта. Дело в том, что минмимальный уровень напряжения для срабатывания триггера до логической единицы составляет 2,25 В — этого как раз достаточно. |
|
32 |
А поскольку сигнал будет инвертирован, то после этого нужно использовать уже первый вариант схемы: |
|
34 |
Наглядная схема подключения модуля в этом случае будет выглядеть так: |
|
36 |
Что почитать: |
|
37 |
Похожие запросы:
|
|