четверг, 4 июля 2013 г.

BlockProto2 и RGB светодиод - готовая Mood лампа


В продолжение темы об использовании платы BlockProto2 запаяной с цанговыми разъёмчиками под BreadBoard - беспаечную макетную плату.
Сегодня попались мне под руку трехцветные светодиоды и вспомнилось мне, что хотелось как-то посмотреть как будет выглядеть Mood лампа в домашнем исполнении. Ну и я их тут же и примостил на плату.
С резисторами решил не заморачиваться, а просто общий вывод, в моем случае это катод, я повесил на порт микроконтроллера. А так как порт не дает больше 20мА, то светодиод не пострадает от избыточного тока.
Как известно выводов у светодиода 4 - это по одному аноду на каждый встроенный в корпус светодиод (а их там три - красный/Red, зеленый/Green и синий/Blue) и один общий катод.
Расположены в порядке: Red, Катод, Blue, Green. По крайней мере на моих светодиодах. Вывод на катод самый длинный.
Чтоб управлять яркостью светодиода его нужно подключить к порту на котором есть управление ШИМ (PWM), у нас это D3,D5,D6,D9,D10,D11. Этого хватит чтобы управлять двумя трехцветными светодиодами. Один светодиод помещаем на площадку шины BlockDuino, на цифровой ряд, в порта D3-D6, так чтобы катод стал в порт D4, а другой, если есть желание, в порта D8-D11, но надо изгольнуться так, чтобы катод стал в порт D8, т.е. первый и второй ножки согнуть так, чтоб они не соприкасаясь поменялись местами.
 


Далее оставляем железо и переходим к софту, т.е. заливаем на микроконтроллер проверочный код:
void setup() {
  pinMode(4, OUTPUT);
  pinMode(8, OUTPUT);
}

void loop() {
  digitalWrite(4, LOW);
  digitalWrite(8, LOW);
  analogWrite(3, 128);
  analogWrite(5, 128);
  analogWrite(6, 128);
  analogWrite(9, 128);
  analogWrite(10, 128);
  analogWrite(11, 128);
  delay(10000);
}
Если сразу после запуска программы все светодиоды светятся вполнакала, значит мы подключили все правильно. Теперь вкусняшки. Находим и загружаем библиотеку [RGBlink], мне такая под руку подвернулась, устанавливаем и загружаем наш код для Mood лампы:
#include <RGBlink.h> int ledC1 = 8; // порт катода для первого светодиода LED led1(11,9,10); // порта анодов для первого светодиода (R,G,B) int ledC2 = 4; // порт катода для второго светодиода LED led2(3,6,5);   // порта анодов для второго HSB myColor1 = {0, 255, 255};   // объявляем переменную где будет храниться цвет для первого HSB myColor2 = {360, 255, 255}; // то же для второго светодиода int counter = 0; // просто счетчика int interval = 20; // время между шагами изменения цвета мсек void setup() {    pinMode(ledC1, OUTPUT);   digitalWrite(ledC1, LOW); // подаем землю на первый катод pinMode(ledC2, OUTPUT); digitalWrite(ledC2, LOW); // то же на второй} void loop() {     counter++; // увеличиваем счетчик на единицу if (counter > 359) counter = 0; // проверяем переполнение myColor1.hue = counter; // цвет первого светодиода идет по часовой стрелке 0 -> 359 myColor2.hue = 359 - counter; // цвет второго - навстречу, 359 -> 0 led1.setColor(myColor1); // зажигаем светодиод 1 led2.setColor(myColor2); // зажигаем светодиод 2 delay(interval); // ждем}
Эта программка прогоняет первый светодиод по часовой стрелке по шкале HSB, а второй против часовой стрелки, т.е. навстречу. Цикл порядка 7 с половиной секунды. Кстати, чтоб получить полноценные цвета, нужно светодиод, который скорее всего тоже в прозрачном корпусе, как у меня, "заматовать", т.е. одеть на него что-то полупрозрачное/матовое. Например кусок белого поролона из упаковочного материала. А лучше сразу же подготовить лампу - взять лампочку с матовым покрытием, выковырнуть внутренности цоколя и выбить аккуратно содержимое лампочки. Светодиод подпаивается на проводки, помещается внутрь на небольшую глубину, фиксируется и на выходе имеем готовую "MoodLamp":
Обычная лампа без внутренностей
Просто поставил ее на светодиод
В принципе готовая Mood Lamp
Цвета вдохновляют, это - мой любимый
UPD: А я вот тут подумал, а зачем собственно эта плата BlockProto2 тут нужна? Можно и без нее обойтись, ведь светодиоды неплохо помещаются в разъем MaMa:

Заодно я поднапрягся и прописал код для плавного перехода в случайный цвет за случайный промежуток времени (в разумных пределах). Как по мне, так заметно красивее получается:
#include <RGBlink.h> //int ledC = 8; //LED led(9,11,10); int ledC = 4; LED led(3,6,5); long previousMillis = 0; long interval = 10; HSB Color = green; HSB OldColor = white; int newHue = 240; void setup() {   pinMode(ledC, OUTPUT);   digitalWrite(ledC, LOW); } void loop() {   OldColor = Color;   float delta = ((float)Color.hue - (float)newHue) / (float)interval;   for (int i=0; i<interval; i++){     Color.hue = OldColor.hue - delta * i;     led.setColor(Color);     delay(10);   }   delay(1000);   newHue = random(0, 360);   interval = random(100, 1000); }
Код для одного светодиода.

Что дальше? А дальше несложно привертеть ИК приемник и управлять с пульта; можно подобрать скрипт и менять цвета в определенном порядке: свеча, морской бриз, осень и т.д.; подключить датчик звука и управлять хлопками в ладоши или менять в такт музыки.