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

Я уже публиковал ранее статью о светодиодной цветомузыке на 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. Оттуда же можно взять и питание.

Теперь необходимо настроить интерфейс 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

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

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