Цветомузыка в люминесцентном светильнике
Я уже публиковал ранее статью о светодиодной цветомузыке на 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 определяют адрес микросхемы на шине:
Резисторы 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 * 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)
В строках 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:
Плагин (227.16 KB)
Исходники плагина на Delphi (18.97 KB)
Плагин (227.16 KB)
Исходники плагина на Delphi (18.97 KB)
Для AIMP:
Плагин (227.52 KB)
Исходники плагина на Delphi (24.94 KB)
Предупреждение!
Автор не несёт ответственности за возможную порчу оборудования. Всё, что вы делаете — вы делаете на свой страх и риск!
Ссылки по теме
Raspberry Pi. Работаем с I2C на Python: http://we.easyelectronics.ru/pilamaster/raspberry-pi-rabotaem-s-i2c-na-python.html