Гирлянда на Raspberry Pi



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

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



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

Что нужно



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

Итак, из харда понадобится: Raspberry Pi, разноцветные светодиоды, резисторы номиналом от 100 Ом до 1 КОм, кнопка, клеммы для GPIO, провода.



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

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

Подключаем



Схема подключения:



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

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





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

Подготавливаем программное обеспечение



Нам понадобится 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 уже давно и я к ней привык. В своё время тоже холиварили по этому поводу.

Демо



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









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

Источник

15.11.2017 в 23:24, Просмотров: 642

новый год,

ID: 26



Поиск



По всему сайту
По тэгам
По тэгам и заголовкам

Облако тэгов

raspberry pi 3, raspbian, raspberry pi zero w, windows 10, osmc, python, windows, ubuntu, raspberry pi zero, установка ос, raspberry pi 2, ос, libreelec, dietpi, fedora, freebsd, risc, volumio, telegram, lua, медиацентр, фоновая подсветка, ambilight, livolo, siri

Форум

RSS-канал
Карта сайта
Обратная связь


Рейтинг@Mail.ru

Рубрики

  • Статьи
  • Модели
  • Мысли