[Из песочницы] Гирлянда на Raspberry Pi

719289aed4594aeda16e9b2b0fbe2467.jpgПриближаются новогодние праздники, и было решено сделать что-то новогоднее с использованием имеющегося Raspberry Pi B-модели. До этого я использовал его в качестве веб-сервера. Затем немного игрался с GPIO на Python заставляя светиться светодиоды.

Что ж, небольшая искусственная елка подсказала мне как можно совместить мое желание с моими навыками. Гирлянда на светодиодах! 7e5a3064c5e042a59c9e3caa0117bb9a.jpg

Гирлянда? Хм… Я же смогу сам заставить ее мигать как захочу! Я сразу решил заложить возможность легко добавлять различные эффекты ее «мигания». Сделать расширяемое приложение.

Что нужноНе буду рассказывать как включать и устанавливать ОС на Raspberry Pi. По это написано немало статей. Скажу, что имелся Raspberry Pi Model B с установленной ОС Arch Linux. Думаю, большинство тут описанного будет справедливо и для других GNU/Linux дистрибутивов. Например, Raspbian.Итак, из харда понадобится: Raspberry Pi, разноцветные светодиоды, резисторы номиналом от 100 Ом до 1 КОм, кнопка, клеммы для GPIO, провода.

fc7f20e78487472ab3f2756cfd4e13fe.jpg

Количество светодиодов может быть различным. В моем случае их задействовано было 6. Подключать к GPIO выходам светодиоды необходимо через резисторы. Из-за того, что светодиоды были совершенно разного происхождения, пришлось индивидуально подбирать номинал резисторов чтобы добиться оптимальной яркости. В целом можно обойтись номиналом 330 Ом.

Кнопка нужна чтобы можно было с её помощью переключать эффекты гирлянды.

Подключаем Схема подключения: 33caa5a9fb6444c1a025c33b20b6fa04.jpg

Обратите внимание на порты с пометкой GND. Это земля, их нельзя использовать как вход или выход. Для кнопки резистор не нужен. Защита от замыкания уже предусмотрена в Raspberry Pi.

Вот так это выглядело:

b2e76163ad2f4606bd812a91ba7a1cdb.jpg

e4601c8bfcd4435aad278e1c19c3f1e7.jpg

40c1f235e16047c2b2ca13818e8990c1.jpg

С подключением светодиодов можно экспериментировать. На некоторые порты у меня подключено парралено два светодиода для большего разнообразия.

Подготавливаем программное обеспечение Нам понадобится Python 3. На Arch Linux я ставил так: sudo pacman -S python Возможно на других дистрибутивах пакет будет называться python3.Также необходим Python-модуль RPi.GPIO. Я устанавливал с помощью easy_install:

sudo easy_install RPi.GPIO Возможно на других дистрибутивах этот модуль есть в репозитории, так что можете поискать.После подключения хорошо бы протестировать как работают наши светодиоды и кнопка. Вот небольшой пример как это можно сделать:

#gpio_test.py import RPi.GPIO as GPIO import sys

GPIO.setmode (GPIO.BOARD)

led = 8 button = 5

# Устанавливаем порты светодиода и кнопки GPIO.setup (led, GPIO.OUT) GPIO.setup (button, GPIO.IN)

# Зажигаем светодиод GPIO.output (led, 1)

# Ждём пока кнопка не нажата while GPIO.input (button): pass # Как нажали — тушим светодиод if GPIO.input (button) == False: GPIO.output (led, 0) print («Button pressed»)

GPIO.cleanup () Здесь устанавливаем порт с номером из переменной led как выход, а порт с button как вход. Затем подаём на порт led сигнал 1 (зажгись!) и ждём пока кнопка не нажата. Как только кнопку нажали, тушим светодиод и зачищаемя.В примере выше тестируем светодиод, подключённый к 8-му порту и кнопку, подключённую к 5-му. Запустить скрипт можно так:

sudo python3 gpio_test.py Обратите внимание, что выполнять скрипт нужно с root-правами. Например, используя sudo. После запуска светодиод, подключённый к 8-му порту должен зажечься. После нажатия кнопки — потухнуть, и скрипт завершит свою работу.Меняя значение переменной led в скрипте на номер нужного порта можно протестировать работу всех светодиодов.

Моё ПО Не буду подробно останавливаться на коде, который я написал далее для нужного мне функционала. Дам ссылку на github: https://github.com/jhekasoft/raspberry-led-garland.Расскажу как настраивать и писать свои эффекты.

Установка Поместите приложение в /opt/raspberry-led-garland или создайте симлинк. Например: sudo ln -s /home/jheka/raspberry-led-garland /opt/raspberry-led-garland Конечно, размещатся оно может в любом месте, но дальше я буду рассчитывать, что оно лежит именно там.Настройка Конфиг находится в JSON-формате в файле settings.json. Если Вы подключили светодиоды и кнопку по схеме, котороя приводилась ранее, то в конфиге можно ничего не менять. Пример файла settings.json: { «leds»: [ {«num»: 8, «state»: 0}, {«num»: 11, «state»: 0}, {«num»: 12, «state»: 0}, {«num»: 13, «state»: 0}, {«num»: 15, «state»: 0}, {«num»: 16, «state»: 0} ], «button»: {«num»: 5}, «effects»: [«static», «blink», «slow_blink», «fast_blink», «run», «fast_run», «off»], «logfile»:»/var/log/raspberry-led-garland.log» } Здесь в leds перечислены порты подключённых светодиодов (num) и их первоначально состояние (state, 0 — выключен). Количество светодиодов может быть произвольным, главное чтобы портов хватило у GPIO.Далее в button установлен номер порта кнопки (num).

В effects перечислены имена эффектов в том порядке, в котором они будут переключаться кнопкой. Все эффекты лежат в дирректории effects в виде файла с Python-классом.

Логируется всё в файл, указанный в logfile.

Эффекты По сути сейчас есть три основных эффекта: статика, мигание и бегущий светодиод.Как упомянул выше, эффекты расположены в директории effects. Вы может добавлять туда свои эффекты. Также не забудьте добавить их в конфиг. Давайте разберём эффект blink. Вот его содержимое:

#blink.py import RPi.GPIO as GPIO

class GarlandEffect (object): delay = 1.0 ledstate = 0

def __init__(self, garland): self.garland = garland self.ledstate = 1

def iterate (self): if not self.garland.checkIterationDelay (self.delay): return False

self.garland.setLedsState (self.ledstate) self.garland.gpioOutSetState () self.ledstate = 1 — self.ledstate

return True При инициализации (функция __init__) устанавливаем ему объект гирлянды (garland). Это должно происходить практически в каждом эффекте. Далее указываем начальное состояние для всех светодиодов 1 (включены).При каждой итерации (функция iterate) проеряем, а не прошло ли время, равное установленной задержки в 1 секунду (delay = 1.0). Если нет, то ничего не делаем (return False). Если прошло, то устанавливаем состояние ledstate всем светодиодам и меняем значение переменной состояния на обратное чтобы на следующей итерации оно было другим.

Взглянем ещё на эффект fast_blink:

#fast_blink.py import effects.blink

class GarlandEffect (effects.blink.GarlandEffect): delay = 0.1 Как видим, он наследуется от blink и у него установлена задержка в 0.1 секунду. То есть это всё тот же blink, просто с меньшей задержкой между итерацией — светодиоды быстрее мигают.Обратите внимание на эффект с именем off. В нём при инициализации тушаться все светодиоды и ничего не происходит при итерации. Таким образом реализовано затухание гирлянды.

systemd сервис Чтобы гирлянда была автономной и работала после старта системы я написал небольшой конфиг для запуска нашего скрипка как сервиса. Файл systemd/garland.service необходимо скопировать в /etc/systemd/system/. Затем выполнить: sudo systemctl enable garland.service Скрипт запустится при старте системы. Для немедленного запуска можно выполнить это: sudo systemctl start garland.service Надеюсь, не обидетесь за использование systemd. Она на Arch Linux уже давно и я к ней привык. В своё время тоже холиварили по этому поводу.Демо Вот как это выгладит:[embedded content]

[embedded content]

Надеюсь вы также подключитесь к этому делу и сделаете свои гирлянды с большим количеством светодиодов, а также напишите свои интересные эффекты! С наступающими!

© Habrahabr.ru