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

Демо


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





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

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 26

    +25
    Конечно гвозди микроскопом забиваются лучше чем голыми руками, но все же)
      +1
      Совершенно согласен, уже при прочтении названия думал, что парень как минимум весь дом гирляндой обмотал и выводит с помощью нее код написанной программы.
        0
        Оно-таки верно, но все же суть таких платформ изначально была в том, чтобы далекие от электроники люди могли делать подобные штуки. И плевать, что тут танком проехали, главное удовольствие получил и другим приятно сделал.
        0
        Всего 6 светодиодов? Откройте для себя сдвиговые регистры и/или мультиплексоры и ваша елка замигает десятками светодиодов!
        0
        Я очень надеюсь что у тебя есть котик :)
          –1
          Я коненчно когда делал realtime логи на монитор с распбери, догадывался, что это для него тяжелая ноша… Но для герлянды… Вы просто обязаны как минимум расширить количество светодиодов(закажи ws2812 что ли), а так же написать софт управления эффектами. Вот это было бы по фану. И чтоб с андройда можно было управлять, обязательно.
            0
            Это только начало. Я думаю развиваться в этом направлении. Про Андроид тоже думал.
              0
              Можно сделать плагин к какому-нибудь плееру, и как-то завязать эффекты с частотами и/или нотами играемой музыки
                0
                Ах-ха-ха. Да я забил на это.
              +2
              вот и наступило будущее
              • UFO just landed and posted this here
                  0
                  Выглядит хорошо, но на Raspberry? Та же Arduino легко перекрывает минимальные требования для Вашей задачи
                    0
                    А еще ардуина может светодиодными лентами управлять, которые на елке выглядят поинтереснее :-)
                    • UFO just landed and posted this here
                        0
                        Attiny85 — тоже гвозди микроскопом
                        Мультивибраторы — вполне себе, если хочется поизвращаться)
                          0
                          Никто еще не делал контроллер гирлянд на FPGA?)
                        +2
                        Согласен. Но я делал это из подручных средств. То есть был Raspberry Pi и захотелось что-то с ним замутить. :)
                        +2
                        Нужно больше бессмысленных поделок на Raspberry!
                        Кстати, почему именно Raspberry? Почему не NI'шный CompactRIO? Или еще чего?
                          +3
                          Потому что у меня был Raspberry Pi. Я делал из подручных средств. Я в начале описал как всё начиналось. :)
                            +1
                            Вы будете смеяться, но я делал гирлянду для уличной ёлки возле офиса нефтестанции на шнайдеровском контроллере 984 серии. В лаборатории стоял шкаф с контроллером и модулями. Электрики через форточку заводят кабель, расключаем его на самодельный блок реле и цепляем к модулю. Софт написан на ModSoft. Выглядит забавно, стоит промышленный шкаф и мигает ёлкой :) Треск стоит дикий, когда режим «бегущие огни» включается :) Но в моём случае было задание от начальника в стиле — вы чего, не программисты что-ли, у вас целый шкаф рабочий стоит, щас электрики дюралайта навешают и мигайте им. Советы купить готовую моргающую гирлянду не принимались.
                            В данном же случае чувствуется какой-то чёс рук. Я дома обошелся тремя 6-метровыми гирляндами по 100р каждая :)
                            +1
                            Для такого дела и пару серверов заюзать можно, благородная задача — лампочками мигать :)
                              +2
                              Главное — не останавливаться на достигнутом, и двигаться дальше.
                              А вообще на Хабре аудитория более подкованная, чем на других ресурсах, поэтому, если бы вы сделали гирлянду, которая мигает в такт/показывая спектр музыки, проигрываемой Raspberry откуда-нибудь (да хотя бы с флеш-карты) + простенький веб-интерфейс для смартфона, это воспринялось бы аудиторией совсем по-другому. На самом деле, это не сильно усложнит систему, но гирлянда будет намного оригинальнее.

                              Желаю дальнейшего роста!
                                0
                                Спасибо.
                                0
                                Не плохая идея для новогоднего стартапа.

                                Only users with full accounts can post comments. Log in, please.