15 августа 2017
Кравченко Виктор

Аппаратная индикация состояния пинов Arduino/Raspberry Pi при помощи светодиодов

Цифровые устройства Arduino Датчики, модули Raspberry
01

Иногда возникает необходимость внешней индикации состояния пинов. Такая необходимость может возникать для контроля работоспособности схемы без наличия специализированных контрольно-измерительных приборов. Примером применения такой индикации могут служить линии обмена данными с датчиками в готовом устройстве. Такая индикация поможет определить неисправность узла, так как визуально будет видно, какими модулями данные отправляются и какими принимаются. А поскольку цифровые данные передаются посредством смены логических уровней, то, если они не будут отправляться — индикатор своим состоянием это покажет.

02
03 На заметку:
Все информация, представленная в данной статье, справедлива и для Raspberry Pi 3
04

В данной статье будет показано, как сделать индикацию состояния при помощи светодиодов, подобную индикации RX/TX (прием/отправка данных по UART) платы Arduino.

Проверено — автор рекомендует:
Постоянная ссылка

Транзистор 2N5551 (NPN, TO-92)

Транзистор 2N5551 (NPN, TO-92)

Биполярный, высокочастотный, 0.6А, 160В

Постоянная ссылка

Транзистор BC548 (NPN, TO-92)

Транзистор BC548 (NPN, TO-92)

Биполярный, высокочастотный, 0.1А, 5B, 30В

Постоянная ссылка

Транзистор ВС557 (PNP, TO-92)

Транзистор ВС557 (PNP, TO-92)

Биполярный, высокочастотный, 0.1А, 5B, 30В

Как покупать на Aliexpress со скидкой от 5,5%

Видео-инструкция о покупке со скидками на Aliexpress


Даташит на NPN-транзистор BC548 — BC548.pdf (25,9 KB)


05

Система проста и состоит из двух ключевых элементов — непосредственно светодиода с резистором, которые обеспечивают визуальную обратную связь и NPN-транзистора BC548 (даташит — BC548.pdf (25,9 KB)). Схема подключения выглядит следующим образом:

06
В данной схеме, когда на пине будет присутствовать логическая единица HIGH, то светодиод будет гореть
В данной схеме, когда на пине будет присутствовать логическая единица HIGH, то светодиод будет гореть
07

Резистор R1 не дает всему току «утечь» к земле через транзистор, оставляя его на основное предназначение (To Module) — например, передача данных модулю или управление чем-либо.

08

Работоспособность схемы легко проверить, если собрать её на макетной плате:

09
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)



Постоянная ссылка

Транзистор 2N5551 (NPN, TO-92)

Транзистор 2N5551 (NPN, TO-92)

Биполярный, высокочастотный, 0.6А, 160В

Постоянная ссылка

Транзистор BC548 (NPN, TO-92)

Транзистор BC548 (NPN, TO-92)

Биполярный, высокочастотный, 0.1А, 5B, 30В

Постоянная ссылка

Транзистор ВС557 (PNP, TO-92)

Транзистор ВС557 (PNP, TO-92)

Биполярный, высокочастотный, 0.1А, 5B, 30В

14
15

Испытательный стенд:

16
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:

21
22

Таким образом можно организовать индикацию на любом пине Arduino / Raspberri Pi:

23
24

Для демонстрации работы можно собрать следующую схему:

25
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 В — этого как раз достаточно.

Постоянная ссылка

74HC14N Инвертирующий триггер Шмитта (DIP-14)

74HC14N Инвертирующий триггер Шмитта (DIP-14)

6 инверторов с триггерами Шмитта на входах.

32

А поскольку сигнал будет инвертирован, то после этого нужно использовать уже первый вариант схемы:

33
34

Наглядная схема подключения модуля в этом случае будет выглядеть так:

35
37

Похожие запросы:

  • Can i put leds on serial line to show activity
  • Help with serial blinking led
comments powered by HyperComments