Цветомузыка в люминесцентном светильнике

Я уже публиковал ранее статью о светодиодной цветомузыке на 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
A2A1A0DECHEX
000320x20
001330x21
010340x22
011350x23
100360x24
101370x25
110380x26
111390x27

Всё это я спаял на макетной плате. Получилось вот такое вот устройство:

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

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



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

Теперь необходимо настроить интерфейс I2C на Raspberry Pi. Для этого открываем (по SSH или через сам RPi под рутом) файл /etc/modprobe.d/raspi-blacklist.conf и закомментируем две строчки:

[shell]
# blacklist spi-bcm2708
# blacklist i2c-bcm2708
[/shell]
Открываем файл /etc/modules и добавляем в его конец строку:
[shell]
i2c-dev
[/shell]
Перезагружаемся:
[shell]
sudo reboot
[/shell]
Затем, установим необходимые пакеты:
[shell]
sudo apt-get update
sudo apt-get install i2c-tools
sudo apt-get install python-smbus
[/shell]
При подключенной схеме вводим команду
[shell]
sudo i2cdetect -y 1
[/shell]
либо (если Raspberry Pi первой ревизии)
[shell]
sudo i2cdetect -y 0
[/shell]
Должна появиться таблица с адресами устройств на шине I2C:
i2c_address
Наши микросхемы занимают адреса 0x20 и 0x24, что соответствует таблице адресов PCF8574 приведённой ранее.
Создаём на Raspberry Pi файл для программы управления:
[shell]
touch /home/pi/colormusic.py
[/shell]
и записываем в него следующее:
[python]
#!/usr/bin/python

import smbus
import sys
import socket
from time import *

port=53412
addr1=0x20
addr2=0x24

#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; UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) listen_addr = ("",port) UDPSock.bind(listen_addr) bus = smbus.SMBus(1) while True: #Read from socket data,addr = UDPSock.recvfrom(1024) datas=data.strip() x=255 xr=255 for i in range(0,8): if datas[i]=="1": x=unsetbit(x,i) if datas[8]=="1": xr=unsetbit(xr,6) if datas[9]=="1": xr=unsetbit(xr,7) #Write to I2C bus.write_byte(addr1, x) bus.write_byte(addr2, xr) [/python] В строках 8-10 указаны порт, на котором RPi будет принимать данные от плагина визуализации, а также адреса микросхем PCF8574 в 16-ричном виде. Даём скрипту права на выполнение: [shell] chmod 755 /home/pi/colormusic.py [/shell] Осталось добавить его в автозагрузку. Для этого я просто добавил следующую строку в файл /etc/rc.local
[shell]
/home/pi/colormusic.py &
[/shell]
Для ручного запуска вводим ещё раз эту же самую команду в консоли.

На этом всё. Ставим плагин (ссылки в конце статьи) к Winamp или AIMP, указываем в настройках порт и IP-адрес RPi и вперёд 🙂 Компьютер и Raspberry Pi естественно должны быть соединены в сеть через роутер/свитч, либо напрямую.


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


А вот как это выглядит на видео:


Скачать
Для Winamp:
Плагин (227.16 KB)
Исходники плагина на Delphi (18.97 KB)

Для AIMP:
Плагин (227.52 KB)
Исходники плагина на Delphi (24.94 KB)

colormusic.py (733 bytes)

Предупреждение!
Автор не несёт ответственности за возможную порчу оборудования. Всё, что вы делаете — вы делаете на свой страх и риск!

Ссылки по теме