Оглавление:

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

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

Видео: Arduino и Neopixel Coke Bottle Rainbow Party Light: 7 шагов (с изображениями)
Видео: Arduino & Neopixel Coke Bottle Party Light 2024, Декабрь
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, если у вас мало памяти или расширение с помощью других подпрограмм. Но приведенный выше код работает.

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

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

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