Arduino и Neopixel Coke Bottle Rainbow Party Light: 7 шагов (с изображениями)
Arduino и Neopixel Coke Bottle Rainbow Party Light: 7 шагов (с изображениями)
Anonim
Image
Image

Так что мой сын Дун замечает очень крутой свет для вечеринки, сделанный из старых бутылок из-под кокса и липких внутренностей светящихся палочек, и спрашивает, можем ли мы сделать такой светильник для его предстоящих школьных экзаменов Are Over Blowout PartAYYY !!! Я говорю, конечно, но разве ты не предпочел бы некоторые из тех элегантных колец Adafruit Neopixel, о которых мы читали… Он смотрит на меня пустым взглядом. Потому что факт в том, что он не знает, о чем я говорю, но папа заметил возможность поиграть с теми кольцами Neopixel, о которых он читал, и все мы знаем одну из 10 основных причин, по которым отцы-компьютерщики производят потомство, - это иметь извините, чтобы поиграть с крутыми гаджетами, которые, по их словам, созданы для их детей.

Это супер-простой проект, который выглядит действительно здорово. Мы построили нашу из 3 старых бутылок из-под кокса, деревянной тарелки и кронштейна для столба игровой площадки - всякие вещи валяются в подвале - в сочетании с Arduino (Леонардо в нашем случае, но подойдет любая плата Genuino!) И трех колец Neopixel. Я заказал кольцо с 9 светодиодами, но в итоге получил кольцо с 12 светодиодами по той же цене. Это было мило, но означало переделку отверстий для колодцев - кольца с 12 светодиодами имеют ширину 35 мм, а не 23 мм. Что вам понадобится:

  • Плата Genuino / Arduino (мы использовали Леонардо, но подойдет почти любая плата)
  • 3 кольца Neopixel (по 12 светодиодов в каждом): приобретите их у Adafruit и поддержите этих прекрасных людей
  • Конденсатор емкостью 1000 мкФ 6,3 В или лучше
  • Резистор 300-500 Ом
  • Деревянная тарелка, или квадрат из лома, или что-нибудь, на что вы можете поместить неопиксели и поставить бутылки из-под кокса сверху.
  • Какая-то форма крепления для пластины - нам отлично подошел кронштейн для детской площадки.
  • Настенная бородавка 9в
  • Сверлильный станок 40мм
  • Болты, гайки, шайбы, распорки
  • Проволока с твердым сердечником
  • Паяльник и припой
  • Макетная плата
  • Пластиковый корпус для Arduino. Вы можете пойти и купить действительно красивый, идеально подогнанный пластиковый футляр, сделанный из нефти, которой миллион лет назад пробурено из земли в какой-то хрупкой среде, произведено на другой стороне планеты и отправлено в контейнере на склад рядом с вами со всеми необходимыми принадлежностями. порты вырезаны идеально совмещены, и он будет доставлен к вашей двери на фургоне, выбрасывающем углекислый газ в атмосферу. Или вы можете сделать то же самое, что и я, и использовать старую выброшенную пластиковую коробку… в данном случае мадагаскарский пластырь, лежащий в аптечке… и просверлить в ней несколько отверстий. Здесь заканчивается лекция. Давайте сделаем…

Шаг 1: Сделайте основу

Сделайте базу
Сделайте базу
Сделайте базу
Сделайте базу

Вы можете импровизировать свою базу из того хлама, что есть в вашем собственном подвале, или даже просто использовать деревянный ящик или что-нибудь, что скроет вашу электронику.

Сначала мы просверлили три отверстия, равномерно расположенных на деревянной пластине, достаточно больших, чтобы в них поместились кольца Neopixel. На изображении отверстия - это лунки, просверленные перфоратором. В конце концов, из-за большего размера колец с 12 светодиодами пришлось сверлить отверстия сверлом. Это означало пройти через пластину полностью, и вместо того, чтобы аккуратно затягивать кольца в их тонко обработанные маленькие лунки глубиной 2 мм с центральным отверстием для аккуратной прокладки проволоки, я закончил тем, что закрепил кольца … кхм … изолентой по дну пластины. Не судите. В любом случае в моем дизайне нижнюю часть тарелки не видно. И темно, когда он включен. А кроме того - что не так с изолентой?

Мне нужен был зазор между пластиной и кронштейном для макета в нижней части пластины и одного компонента - конденсатора, а также для проводов, которые должны были пройти от макета к Arduino, которые я планировал поместить внутри кронштейна. Поэтому я поставил набор самодельных проставок на оси болтов, чтобы обеспечить достаточный зазор - около 3 см, высота макета и немного, чтобы не сломать проводку. Я использовал по два деревянных анкерных болта на каждый угол, потому что они были подходящей высоты и лежали в мужском ящике … эта коробка с незакрепленными винтами, болтами, гвоздями, ржавыми звеньями цепи, шланговыми муфтами, старыми монетами, неожиданно острыми предметами и всем прочим. кусочков и бобов, которые могут волшебным образом спасти вас от похода в строительный магазин, предлагая если не то, что вам нужно, то то, что вам подойдет.

Счастливый случай с столбиком для детской площадки, который я нашел в подвале, потому что в пластине уже были дыры. Не нужно сверлить железо! В основании было четыре отверстия для болтов, и мы просверлили четыре отверстия с утопленной в деревянной пластине, чтобы они соответствовали друг другу.

Затем мы раскрасили все это спреем Gothic Black.

Шаг 2: подготовка колец Neopixel

Подготовка колец Neopixel
Подготовка колец Neopixel

Вам нужно будет припаять провода к вашим кольцам neopixel: провод для ввода данных для всех, провод для вывода данных для двух из них, а также питание и заземление для каждого. Какой бы длины вы ни считали нужной, добавьте немного. Лишнюю проволоку всегда можно отрезать, слишком короткую нельзя растягивать. И помните о предупреждении от Adafruit:

При пайке проводов к этим кольцам нужно проявлять особую бдительность в отношении пятен припоя и коротких замыканий. Расстояние между компонентами очень маленькое! Часто проще всего вставить провод спереди и припаять сзади.

Я бы хотел прочитать это до того, как припаял к передней панели. Мне удалось не пережечь ни один из моих светодиодов, но я опалил край одного так, что я вспотел, пока не включил его. Кроме того, если бы я прочитал прекрасное руководство, я бы также прочитал предупреждение не ставить зажим из крокодиловой кожи на светодиод. Пусть мои близкие к кораблекрушению останки будут твоим маяком.

Neopixel подключается к шлейфу, что означает, что вы можете управлять всеми их светодиодами одновременно с Arduino, подключив провод от ВЫХОДА одного кольца к ВХОДУ другого. Каждому кольцу также нужны провода питания и заземления.

Шаг 3: Электромонтаж

Электропроводка
Электропроводка

Подключите его, как в приведенном выше описании Fritzing - контакт 6 Arduino передает данные в первое кольцо, выход данных из этого кольца идет на вход данных следующего, выход данных из этого кольца идет в Данные последнего звонка. Вам не нужен провод вывода данных последнего кольца.

Емкость 1000 мкФ проходит между положительной и отрицательной шинами макетной платы. Этот колпачок защищает кольца от скачков напряжения и рекомендован разделом лучших практик Adafruit NeoPixel Uberguide. Резистор на Data in до первого неопикселя также рекомендован Adafruit - он 1K для Fritzing, но рекомендуемое сопротивление составляет 300-500 Ом.

В моей сборке я проложил провода от Neopixels через заднюю часть пластины к макетной плате, закрепленной в центре. Таким образом, вам нужно будет провести к базовому блоку только три длинных провода: питание, заземление и данные. Я сделал эти провода сверхдлинными - в основании достаточно места для хранения вещей, и это позволяет удобно вытаскивать плату для перепрограммирования.

Шаг 4: Код

"loading =" lazy "упомянул, что моему сыну нужна музыкально-реактивная версия этого. Потребовалось до своего 18-летия, чтобы дойти до этого, но вот оно!

Дополнительное оборудование:

1 однополюсный переключатель двойного направления 1 микрофон с автоматической регулировкой усиления (я использовал MAX9184 от AdaFruit) 1 конденсатор 1 мкФ-100 мкФ (любое значение)

Для правильной работы микрофон действительно должен иметь автоматическую регулировку усиления. AGC будет постоянно измерять окружающий шум и повышать и понижать порог, который он считает фоном, поэтому ваш свет будет реагировать на всплески на этом фоне. Микрофон AdaFruit великолепен: вы можете перейти из тихой комнаты, в которой звук одного голоса вызовет его, в полноценный режим вечеринки с комнатой, полной подростков и ревущей музыки, и он просто улавливает ритм музыки отлично. Альтернатива, микрофон с регулируемым усилением, имеет крошечный потенциометр на плате, который невероятно тонкий и неудобный. Чтобы сделать устройство бесполезным, не требуется больших изменений в окружающем звуке: постоянно горит свет или постоянно темно. AGC работает как по волшебству.

Мне нужна была возможность использовать тестовый образец завихрения или музыку, поэтому я подключил центральный вывод переключателя к VIN, а один вывод - к контакту 4, другой - к контакту 8 Леонардо. Проверяя эти контакты на HIGH или LOW, мы можем узнать, в каком состоянии находится переключатель, и соответственно код ветвления.

Шаг 7: Подключение микрофона

Подключение микрофона
Подключение микрофона

Подайте микрофонный вход через этот конденсатор 1-100 мкФ на аналоговый вывод 0. Если ваш конденсатор поляризован, выходной вывод идет на положительную сторону (зеленый провод).

Спасибо CodeGirlJP за ее программу раскраски безделушек по звуку, которую я адаптировал ниже:

// Звуковые активируемые светодиоды с Arduino и NeoPixels

#включают

#define MIC_PIN A0 // Микрофон подключен к контакту a0 на Leonardo

#define LED_PIN 6 // Нить светодиода NeoPixel подключена к контакту 6 на плате Leonardo #define N_PIXELS 36 // количество пикселей в нити светодиода !!!!!! Отрегулируйте количество пикселей в вашей настройке. Это верно для 3-х колец Neopixel !!!!!! #define N 100 // Количество выборок, которые нужно брать каждый раз, когда вызывается readSamples #define fadeDelay 5 // время задержки для каждой величины затухания #define noiseLevel 30 // крутизна среднего шума микрофона без звука

// Инициализируем полосу NeoPixel с указанными выше значениями:

Полоса Adafruit_NeoPixel = Adafruit_NeoPixel (N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int samples [N]; // хранилище для набора образцов

int periodFactor = 0; // отслеживаем количество мс для расчета периода int t1 = -1; // время наклона> 100 обнаружено. int T; // период между временами масштабируется до миллисекунд int slope; // наклон двух точек выборки собранных данных byte periodChanged = 0; const int SwitchPinMusic = 4; // Пин для положения переключателя чувствительности к музыке const int SwitchPinSwirl = 8; // Пин для положения переключателя Test Pattern (swirl) int MusicbuttonState = 0; // Вкл. Логическая переменная для чувствительности к музыке

// Метод настройки Arduino

void setup () {

strip.begin ();

ledsOff (); задержка (500); displayColor (Колесо (100)); strip.show (); задержка (500); oddWheel (Колесо (100)); strip.show (); задержка (500); pinMode (SwitchPinMusic, ВХОД); pinMode (SwitchPinSwirl, ВХОД); // attachInterrupt (4, Switched, ПАДЕНИЕ);

}

// Метод цикла Arduino

недействительный цикл () {SwirlbuttonState = digitalRead (SwitchPinSwirl); // ВЫСОКИЙ, если переключатель установлен в положение Чувствительность к музыке MusicbuttonState = digitalRead (SwitchPinMusic); // ВЫСОКИЙ, если переключатель установлен в положение Тестовый образец while (SwirlbuttonState == LOW) {readSamples (); // Запускаем процедуру сэмплирования музыки SwirlbuttonState = digitalRead (SwitchPinSwirl); // Проверяем, был ли изменен переключатель} SwirlbuttonState = digitalRead (SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); в то время как (SwirlbuttonState == HIGH) {Dance (); // Запускаем процедуру тестового шаблона SwirlbuttonState = digitalRead (SwitchPinSwirl); // Проверяем, был ли изменен переключатель

}

}

void Dance () {

в то время как (SwirlbuttonState == HIGH) {colorWipe (strip. Color (255, 0, 0), 50); // Красный SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 255, 0), 50); // Зеленый SwirlbuttonState = digitalRead (SwitchPinSwirl); colorWipe (strip. Color (0, 0, 255), 50); // Синий SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // Белый RGBW // Отправляем погоню за пикселями театра в… SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (strip. Color (127, 127, 127), 50); // Белый SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (strip. Color (127, 0, 0), 50); // Красный SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChase (strip. Color (0, 0, 127), 50); // Синий SwirlbuttonState = digitalRead (SwitchPinSwirl); радуга (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); rainbowCycle (20); SwirlbuttonState = digitalRead (SwitchPinSwirl); TheaterChaseRainbow (50); SwirlbuttonState = digitalRead (SwitchPinSwirl); }} // Считываем и обрабатываем образцы данных из микрофона void readSamples () {for (int i = 0; i0) {slope = samples - samples [i-1]; } else {slope = samples - образцы [N-1]; } // Проверяем, больше ли Slope, чем noiseLevel - обнаружен звук не на уровне шума if (abs (slope)> noiseLevel) {if (slope <0) {calculatePeriod (i); если (periodChanged == 1) {displayColor (getColor (T)); }}} еще {ledsOff (); // TheaterChaseRainbow (50); } periodFactor + = 1; задержка (1); }}

недействителен calculatePeriod (int i)

{if (t1 == -1) {// t1 не установлен t1 = i; } else {// t1 было установлено так: calc period int period = periodFactor * (i - t1); periodChanged = T == период? 0: 1; T = период; //Serial.println(T); // сбрасываем t1 на новое значение i t1 = i; periodFactor = 0; }}

uint32_t getColor (период int)

{if (period == -1) return Wheel (0); иначе, если (период> 400) return Wheel (5); else return Wheel (map (-1 * период, -400, -1, 50, 255)); }

void fadeOut ()

{для (int я = 0; я <5; я ++) {strip.setBrightness (110 - я * 20); strip.show (); // Обновление задержки полосы (fadeDelay); periodFactor + = fadeDelay; }}

void fadeIn ()

{strip.setBrightness (100); strip.show (); // Обновление полосы // постепенное увеличение цвета for (int i = 0; i <5; i ++) {//strip.setBrightness(20*i + 30); //strip.show (); // Обновление задержки полосы (fadeDelay); periodFactor + = fadeDelay; }}

void ledsOff ()

{ исчезать(); для (int i = 0; i

void displayColor (цвет uint32_t)

{для (int i = 0; i

void oddWheel (цвет uint32_t)

{for (int j = 0; j <256; j ++) {// цикл всех 256 цветов в колесе for (int q = 0; q <3; q ++) {for (uint16_t i = 24; i <36; i = i + 3) {strip.setPixelColor (i + q, Wheel ((i + j)% 255)); // включаем каждый третий пиксель} strip.show ();

задержка (1);

для (uint16_t я = 24; я <36; я = я + 3) {strip.setPixelColor (я + q, 0); // отключаем каждый третий пиксель}}} fadeIn (); }

// Заливаем точки одну за другой цветом

void colorWipe (uint32_t c, uint8_t wait) {for (uint16_t i = 0; i

пустая радуга (uint8_t wait) {

uint16_t i, j;

for (j = 0; j <256; j ++) {for (i = 0; i

// Слегка отличается, поэтому радуга равномерно распределяется по

void rainbowCycle (uint8_t wait) {uint16_t i, j;

for (j = 0; j <256 * 5; j ++) {// 5 циклов всех цветов на колесе for (i = 0; i <strip.numPixels (); i ++) {strip.setPixelColor (i, Wheel (((i * 256 / strip.numPixels ()) + j) & 255)); } strip.show (); задержка (ждать); }}

// Ползущие огни в театральном стиле.

void TheaterChase (uint32_t c, uint8_t wait) {for (int j = 0; j <10; j ++) {// делаем 10 циклов погони за (int q = 0; q <3; q ++) {for (uint16_t i = 0; я <strip.numPixels (); я = я + 3) {strip.setPixelColor (я + q, c); // включаем каждый третий пиксель} strip.show ();

задержка (ждать);

для (uint16_t я = 0; я <strip.numPixels (); я = я + 3) {strip.setPixelColor (я + q, 0); // выключаем каждый третий пиксель}}}}

// Ползущие огни в театральном стиле с эффектом радуги

void TheaterChaseRainbow (uint8_t wait) {for (int j = 0; j <256; j ++) {// цикл всех 256 цветов в колесе for (int q = 0; q <3; q ++) {for (uint16_t i = 0; i <strip.numPixels (); i = i + 3) {strip.setPixelColor (i + q, Wheel ((i + j)% 255)); // включаем каждый третий пиксель} strip.show ();

задержка (ждать);

для (uint16_t я = 0; я <strip.numPixels (); я = я + 3) {strip.setPixelColor (я + q, 0); // выключаем каждый третий пиксель}}}}

// Введите значение от 0 до 255, чтобы получить значение цвета.

// Цвета представляют собой переход r - g - b - обратно к r. uint32_t Wheel (byte WheelPos) {WheelPos = 255 - WheelPos; if (WheelPos <85) {return strip. Color (255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos <170) {WheelPos - = 85; возвратная полоса. Color (0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos - = 170; возвратная полоса. Цвет (WheelPos * 3, 255 - WheelPos * 3, 0); }

void Switched () {

strip.show (); readSamples (); }

Прежде чем меня забьют в комментариях (помните политику Be Nice !!), я понял, после того как загрузил это, насколько небрежным является мой код. Нет необходимости постоянно проверять контакты 4 и 8 на ВЫСОКИЙ. Поскольку переключатель является однополюсным, с двойным переключением, значение одного можно вывести из другого: вам нужно только проверить один. Таким образом, вы можете пройти и удалить все ссылки на чтение и запись MusicButtonState и просто запустить все это более эффективно, протестировав SwirlButtonState, если у вас мало памяти или расширение с помощью других подпрограмм. Но приведенный выше код работает.

И если кто-то хочет настроить эти звуковые подпрограммы, чтобы определять не только уровни шума, но и частоту, и написать некоторый плавный код, чтобы скользить вверх и вниз по световому спектру в ответ на движения по звуковому спектру, оставьте ссылку в комментариях на как ты это сделал.

Наслаждаться!

Рекомендуемые: