Raspberry Pi: управление светодиодом

Так сложилось, что первая программа, которую человек пишет при изучении программирования называется «Hello World!». Суть этой программы сводится к тому, чтобы после запуска на экране появилась указанная простая фраза. Обычно для этого используется всего несколько строк кода.

В мире микроэлектроники, аналогичной задачей можно считать управление светодиодом. А именно, периодическое включение и выключение — мигание. В этом уроке мы как раз займемся подключением светодиода к Raspberry Pi и составлением программы на языке python, заставляющей этот светодиод мигать.

1. Выводы общего назначения Raspberry Pi (GPIO)

Одно из главных преимуществ Raspberry Pi — это наличие выводов общего назначения (General Purpose Iinput/Outputs). GPIO — это группа контактов, которыми можно управлять с помощью программы. Причем управление это может быть совсем простым, например, включение/выключение светодиода. Либо весьма сложным — обмен данными с периферийными устройствами по специализированным протоколам.

В терминах цифровой электроники, управлять — значит менять на выводе уровень напряжения. Другими словами, все что мы можем сделать с помощью программы — это соединить желаемый вывод либо с контактом питания (+3.3 В), либо с землей (Gnd). Изобразим это на принципиальной схеме.

Схема вывода общего назначения

На схеме имеется резистор, соединенный справа с землей — это наша нагрузка. Вместо резистора может быть светодиод, реле, зуммер, и т.п. Вывод GPIO23 и переключатель прямо за ним символизируют внутреннее устройство каждого вывода общего назначения. Работает это следующим образом.

Если мы в программе подаем на вывод №23 истину True, то Raspberry Pi соединит этот вывод с питанием +3.3В, и через резистор побежит ток. Если же мы передадим ложь — False, то контроллер соединит вывод №23 с землей, и с обоих концов от резистора окажутся равные потенциалы — ток никуда не побежит. То есть, с помощью программы мы как бы щелкаем невидимым переключателем, то вверх, то вниз!

Когда мы коснемся составления программы для мигания светодиодом, то узнаем как передавать истину и ложь на выводы общего назначения Raspberry Pi.

2. Устройство светодиода

Светодиод — это устройство, которое представляет собой полупроводниковый прибор, способный излучать свет при пропускании через него электрического тока в прямом направлении (от анода к катоду). Ниже приведена схема типичного светодиода с линзой.

Устройство светодиода

Для того чтобы правильно включить светодиод в электрическую цепь, необходимо отличать катод от анода. Сделать это можно по двум признакам:

  • анод светодиода имеет более длинный проводник;
  • со стороны катода, корпус светодиода немного срезан.

А вот так выглядят светодиоды «вживую».

Светодиоды

Это обычные одноцветные светодиоды. А бывают еще двух, и даже трехцветные. Так, например, выглядит трехцветный (RGB) светодиод:

Светодиод трехцветный

У этого светодиода сразу четыре ноги. Одна — катод, а три другие — аноды для трех разных цветов.

В современной микроэлектронике применяются миниатюрные светодиоды для поверхностного монтажа. Такие индикаторы, например, имеются на Raspberry Pi для информирования пользователя о состоянии системы.

3. Схема включения

Чтобы зажечь светодиод, нам потребуется подключить его к одному из цифровых выводов Raspberry Pi. Пусть это будет вывод №23.

Принципиальная схема

Подключение светодиода к Raspberry Pi

Внешний вид макета

Подключение светодиода к Raspberry Pi. Макетная плата

В схеме, помимо самого светодиода присутствует резистор. Зачем он нужен? Дело в том, что если подключить светодиод напрямую к источнику напряжения 3.3 Вольт (а именно такое рабочее напряжение у Raspberry Pi), то светодиод непременно выйдет из строя!

Для правильной работы светодиода необходимо строго выдерживать рабочий ток и напряжение. Например, обычный красный светодиод имеет рабочий ток 20 мА, при напряжении от 1.8 до 2 Вольт. Резистор позволяет нам снизить напряжение в цепи и установить нужный ток. Такой резистор еще называют токозадающим.

Чтобы рассчитать номинал нашего токозадающего резистора воспользуемся законом Ома. Не стоит пугаться, это всё очень просто!

I = U/R;

Сила тока, протекающая через некий элемент равна отношению напряжения, приложенного к этому элементу на его сопротивление.

Выразим из этой формулы сопротивление R:

R = U/I

Как уже было замечено, Raspberry Pi работает с напряжением 3,3 Вольта. Значит, чтобы на светодиоде осталось 2 Вольта, нам нужно куда-то убрать лишние 1,3 Вольта. Заставим резистор съесть их!

Получается, нам нужно подобрать сопротивление резистора таким образом, чтоб он убрал лишние 1,3 Вольта, при токе 20 мА. Подставим эти числа в полученную формулу:

R = 1,3В/20мА = 1,3В/0,02ОА = 130/2 = 65 Ом

Таким образом, в Raspberry Pi токозадающий резистор для красного светодиода имеет номинал 65 Ом. Именно его мы и должны установить в схему.

Если под рукой нет резистора именно на 65 Ом, то можно использовать любой другой большего номинала, например, 100 Ом или даже 200 Ом. Просто светодиод будет гореть чуть менее ярко.

4. Программа

Теперь приступим к составлению программы, которая будет управлять включением и выключением светодиода по нужному нам алгоритму. Для примера, включим светодиод на 5 секунд, а затем выключим.

Первое, что нам нужно сделать — это задать тип нумерации выводов общего назначения. Есть два типа. Первый тип — это нумерация разъема, а второй тип — нумерация выводов микропроцессора. На рисунке изображен разъем GPIO.

Raspberry Pi GPIO распиновка нумерация

Слева на право начинается нумерация первого типа: 1,2. За ней не подписано, но идет по порядку: 3,4 — 5,6 — и т.д. В конце разъема — 39,40.

Сверху и снизу идет нумерация процессора (BCM). На нашей схеме мы подключили светодиод к выводу №23 согласно нумерации BCM.

В программе тип нумерации задается с помощью функции setmode:

GPIO.setmode(GPIO.BCM)

Теперь нужно задать режим работы вывода №23. Всего есть два режима: вывод (OUT) и ввод (IN). Мы хотим управлять светодиодом, значит нам нужен режим «вывод». А вот если бы мы хотели прочитать какой-то сигнал, например, с датчика, то следовало бы выбрать режим «ввод».

GPIO.setup(23, GPIO.OUT)

Чтобы подать на вывод №23 истину, используем функцию output:

GPIO.output(23, True)

Помимо этих функций, нам понадобится пауза sleep. Эта функция ставит на паузу выполнение программы. В качестве аргумента указывается количество секунд паузы.

sleep(5)

Наконец, чтобы функции работы с GPIO и sleep работали, в самом начале программы подключим две библиотеки:

from RPi import GPIO
from time import sleep

Итак, вся программа целиком.

from RPi import GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)

GPIO.output(23, True)
sleep(5)
GPIO.output(23, False)

GPIO.cleanup()

В конце программы рекомендуется вызвать функцию cleanup, которая сбросит все настройки GPIO, чтобы они не мешали запуску очередной программы.

5. Мигание светодиодом в цикле

Усовершенствуем программу таким образом, чтоб светодиод мигал непрерывно с частотой 1 Герц (то есть один раз в секунду). Для этого нам нужно будет добавить в программу оператор цикла while.

from RPi import GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)

while True:
    GPIO.output(23, True)
    sleep(0.5)
    GPIO.output(23, False)
    sleep(0.5)

GPIO.cleanup()

Цикл while будет работать пока истинно условие, указанное в нем. Чтобы цикл работал без остановки, в качестве условия мы поставили True.

Составленная нами программа имеет один неприятный изъян. Если мы ее запустим, она войдет в бесконечный цикл и мы не сможем её остановить штатными средствами. А если мы её остановим нештатно, то не выполнится функция cleanup, что нежелательно.

Добавим в программу еще одну конструкцию, которая позволит нам в любой момент прервать работу цикла с помощью комбинации клавиш Ctrl+C. При этом программа завершится в нормальном режиме и выполнит функцию cleanup.

from RPi import GPIO
from time import sleep

GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)

try:
    while True:
        GPIO.output(23, True)
        sleep(0.5)
        GPIO.output(23, False)
        sleep(0.5)

except KeyboardInterrupt:
    print 'program stop'

GPIO.cleanup()

Задания

Наконец, немного поиграем со светодиодами на Raspberry Pi.

  1. Сирена. Подключить два светодиода и мигать ими на манер полицейской сирены — первый гаснет, второй зажигается. Один светодиод оставить на выводе №23, второй можно подключить к соседнему №24.
  2. SOS. Генерировать сигнал SOS с помощью азбуки Морзе. Три раза мигнуть быстро — с периодом 0.5 секунды, затем три раза с периодом 1 секунда, наконец еще три раза опять быстро.


Изменено: