Цветомузыка в люминесцентном светильнике
Я уже публиковал ранее статью о светодиодной цветомузыке на Arduino. Некоторое время та конструкция проработала у меня на полке, а затем была разобрана по причине необходимости использовать Arduino в других поделках. Также большим минусом было то, что использовалось аж 10 цифровых портов микроконтроллера. Прошёл год, у меня появилась Raspberry Pi и я стал искать различные варианты её применения. А так как это миникомпьютер с настоящей операционной системой и поддержкой многозадачности, то и не составляет большого труда совмещать множество различных функций в одном устройстве. Так родилась идея сделать вторую версию цветомузыки с управлением от Raspberry Pi. Также была решена проблема с корпусом — светодиоды я решил разместить в люминисцентном светильнике, которые обычно висят во всяких учреждениях на потолке (у меня же он висит на стене 🙂 ).

Управлять светодиодами будем по шине I2C. Это позволит обойтись всего двумя парами проводов. Для реализации задумки понадобятся следующие компоненты:
- Raspberry Pi (модель B);
- 10 светодиодов;
- 2 микросхемы PCF8574;
- 10 резисторов по 470 Ом;
- макетная плата.
Из всего этого необходимо собрать следующую схему:

Так как Raspberry Pi уже имеет подтягивающие резисторы на шине I2C, то в нашей схеме они не нужны.
Микросхема PCF8574 является расширителем шины I2C на 8 портов. Ниже представлена её распиновка:


Обязательно надо подключать светодиоды к ней по схеме с общим катодом (как на рисунке)! Так как по даташиту максимальная сила тока на выводе составляет всего 0.1 мА по высокому уровню, и 20 мА по низкому. То есть светодиоды у нас будут светиться когда на выводах присутствует логический 0. Это обязательно необходимо учесть при разработке программы управления.
Резисторы R11 и R12 нужны для подтягивания шины I2C и должны присутствовать в единственном экземпляре. Т.е. если у вас к I2C подключены ещё несколько устройств, то резисторы должны быть только в одном.
Контакты A0, A1, A2 определяют адрес микросхемы на шине:
Вход | Адрес на шине I2C | |||
---|---|---|---|---|
A2 | A1 | A0 | DEC | HEX |
0 | 0 | 0 | 32 | 0x20 |
0 | 0 | 1 | 33 | 0x21 |
0 | 1 | 0 | 34 | 0x22 |
0 | 1 | 1 | 35 | 0x23 |
1 | 0 | 0 | 36 | 0x24 |
1 | 0 | 1 | 37 | 0x25 |
1 | 1 | 0 | 38 | 0x26 |
1 | 1 | 1 | 39 | 0x27 |
Всё это я спаял на макетной плате. Получилось вот такое вот устройство:

Светодиоды с резисторами вставил в отверстия в кабельканале 10×15. Получившуюся конструкцию разместил между лампами.

Кстати, ЭПРА я вынес наружу ещё давно. Комплектная сгорела, а новая не вошла — расстояние между лампами оказалось меньше. Здесь же это пошло мне на руку — линейка со светодиодами свободно разместилась в светильнике.


Выводы SDA и SCL от микросхем подключаем к контактам Raspberry Pi. Оттуда же можно взять и питание.

Теперь необходимо настроить интерфейс I2C на Raspberry Pi. Для этого открываем (по SSH или через сам RPi под рутом) файл /etc/modprobe.d/raspi-blacklist.conf и закомментируем две строчки:
# blacklist spi-bcm2708
# blacklist i2c-bcm2708
Открываем файл /etc/modules и добавляем в его конец строку:
i2c-dev
Перезагружаемся:
sudo reboot
Затем, установим необходимые пакеты:
sudo apt-get update
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
При подключенной схеме вводим команду
sudo i2cdetect -y 1
либо (если Raspberry Pi первой ревизии)
sudo i2cdetect -y 0
Должна появиться таблица с адресами устройств на шине I2C:
Наши микросхемы занимают адреса 0x20 и 0x24, что соответствует таблице адресов PCF8574 приведённой ранее.
Создаём на Raspberry Pi файл для программы управления:
touch /home/pi/colormusic.py
и записываем в него следующее:
#!/usr/bin/python import smbus import sys import socket from time import * # ====== Settings ====== port=53412 addr1=0x20 addr2=0x24 addr3=0x22 addr4=0x26 # ====== Functions ====== # Set bit in byte def setbit(num,bit): num=num | (1 << bit) return num; # Unset bit in byte def unsetbit(num,bit): num=num & (~ (1 << bit)) return num; # ====== Functions end ====== UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) listen_addr = ("",port) UDPSock.bind(listen_addr) bus = smbus.SMBus(1) # LEDs off try: bus.write_byte(addr1, 0) bus.write_byte(addr2, 0) bus.write_byte(addr3, 0) bus.write_byte(addr4, 0) except IOError: xa=0 #null instruction # main cycle while True: #Read from socket data,addr = UDPSock.recvfrom(1024) xa=0 xb=0 xc=0 xd=0 # Write to I2C try: bus.write_byte(addr1, ord(data[0])) bus.write_byte(addr2, ord(data[1])) bus.write_byte(addr3, ord(data[2])) bus.write_byte(addr4, ord(data[3])) except IOError: xa=0 #null instruction UDPSock.close
В строках 8-10 указаны порт, на котором RPi будет принимать данные от плагина визуализации, а также адреса микросхем PCF8574 в 16-ричном виде. Даём скрипту права на выполнение:
chmod 755 /home/pi/colormusic.py
Осталось добавить его в автозагрузку. Для этого я просто добавил следующую строку в файл /etc/rc.local
/home/pi/colormusic.py &
Для ручного запуска вводим ещё раз эту же самую команду в консоли.
На этом всё. Ставим плагин (ссылки в конце статьи) к Winamp или AIMP, указываем в настройках порт и IP-адрес RPi и вперёд 🙂 Компьютер и Raspberry Pi естественно должны быть соединены в сеть через роутер/свитч, либо напрямую.

Для открытия настроек плагина в AIMP просто щёлкните по чёрному полю визуализации.


А вот как это выглядит на видео:
Для Winamp:
Плагин: http://19dx.ru/files/soft/ArduinoLED_winamp.zip
Исходники плагина на Delphi: http://19dx.ru/files/soft/ArduinoLED_winamp_source.zip
Для AIMP:
Плагин: http://19dx.ru/files/soft/vis_nfLED_aimp.zip
Исходники плагина на Delphi: http://19dx.ru/files/soft/ArduinoLED_AIMP_source.zip
colormusic.py: http://19dx.ru/files/rpi/colormusic.py

