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

Raspberry Pi управляет светодиодами
Я уже публиковал ранее статью о светодиодной цветомузыке на 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 и закомментируем две строчки:
1
2
# blacklist spi-bcm2708
# blacklist i2c-bcm2708

Открываем файл /etc/modules и добавляем в его конец строку:

i2c-dev

Перезагружаемся:

sudo reboot

Затем, установим необходимые пакеты:

1
2
3
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:
i2c_address
Наши микросхемы занимают адреса 0x20 и 0x24, что соответствует таблице адресов PCF8574 приведённой ранее.
Создаём на Raspberry Pi файл для программы управления:

touch /home/pi/colormusic.py

и записываем в него следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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 просто щёлкните по чёрному полю визуализации.
snag-0053


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


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

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

colormusic.py (733 bytes)

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

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

Похожие записи:

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *