четверг, 24 января 2013 г.

Подключение светодиодной ленты к BlockPWM (в продолжение темы ёлочных игрушек)

Хочу описать об управлении светодиодными новогодними игрушками.
Хотя их и можно просто подключить параллельно в 12 вольт и они будут ярко светить, но динамики при этом нет, а значит и нет нужной эффектности.
Поэтом я подключил их к блоку BlockPWM (описание блока).
Небольшое отступление: Новый Год я встречал в море, а там с ёлками проблема, посему пришлось из подручных средств соорудить что-то похожее - из гирлянды с зелеными проводами на иллюминаторе натянул треугольничек и все это обрамил еще одной гирляндой. С натяжкой можно считать новогодней ёлкой:
Имитация ёлки
Со светодиодными игрушками



Игрушки с помощью двужильных кабелей подключил в разъем к BlockPWM, минус светодиодной ленты к сигнальной линии (S), а плюс - к общей линии питания (Vcc). 
В разъем питания подключил 12ти вольтовый блок питания через переходник. Джампер на разъеме PA_V_SEL установил в положение 2-3 (Vcc->Vin), т.е. подал на линию Vin 12 вольт, запитав таким образом плату BlockDuino.
Еще подключил микрофон от DFRobot к аналоговому порту A0:
Код под спойлером:
#include "Tlc5940.h"
#include "tlc_fades.h"
#include "tlc_shifts.h"

#define ANALOG_PIN      5
#define SCOPE_PERIOD    (1000 * NUM_TLCS)
#define LED_PERIOD      SCOPE_PERIOD / (NUM_TLCS * 16)

TLC_CHANNEL_TYPE channel;
int stp = 0;
long previousMillis = 0;
long interval = 10000;  
byte count = 0;

void setup()
{
  Tlc.init();
  Serial.begin(9600);
  Serial.println(stp, DEC);
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;  
    stp++; 
    Serial.println(stp, DEC);
    count++;
  }
  switch( stp) {
    case 0:
      m_simple();
      break;
    case 1:
      m_shift();
      break;
    case 2:
      m_fades();
      break;
    case 3:
      m_invert();
      //m_flash();
      break;
    case 4:
      m_flash();
      break;
    default:
      stp=0;
  }
}

void m_fades()
{
  if (tlc_fadeBufferSize < TLC_FADE_BUFFER_LENGTH - 2) {
    if (!tlc_isFading(channel)) {
      uint16_t duration = analogRead(ANALOG_PIN) * 40;
      int maxValue = analogRead(ANALOG_PIN) * 100;
      uint32_t startMillis = millis() + 50;
      uint32_t endMillis = startMillis + duration;
      tlc_addFade(channel, 0, maxValue, startMillis, endMillis);
      tlc_addFade(channel, maxValue, 0, endMillis, endMillis + duration);
    }
    if (channel++ == NUM_TLCS * 16) {
      channel = 0;
    }
  }
  tlc_updateFades();
}

void m_simple() 
{
   for (int channel = 0; channel < 16; channel ++)
 {
   Tlc.set(channel, analogRead(ANALOG_PIN)*40);
   delay(5);
 }
 Tlc.update();
}

void m_invert()
{
   for (int channel = 0; channel < 16; channel ++)
   {
     Tlc.set(channel, 2090 - abs(analogRead(ANALOG_PIN)*400));
   delay(5);
   }
   Tlc.update();
}

void m_shift() 
{
  tlc_shiftUp();
  uint16_t sum = analogRead(ANALOG_PIN)*40;
  Tlc.set(0, sum);
  Tlc.update();
  delay(LED_PERIOD);
}

void m_flash()
{
   for (int channel = 0; channel < 16; channel ++)
   {
     Tlc.set(channel, 0);
   }
   Tlc.set(count++, 4000);
   if (count == 16) count=0;
   Tlc.update();
   delay(analogRead(ANALOG_PIN)*4); 
}




Видео работы BlockPWM на новогодней ёлке: