Table des matières:

Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 étapes (avec photos)
Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 étapes (avec photos)

Vidéo: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 étapes (avec photos)

Vidéo: Arduino & Neopixel Coke Bottle Rainbow Party Light: 7 étapes (avec photos)
Vidéo: Arduino & Neopixel Coke Bottle Party Light 2024, Décembre
Anonim
Image
Image

Alors mon fils Doon aperçoit une lumière de fête très cool faite de vieilles bouteilles de coca et des entrailles gluantes de Glow Sticks, et demande si nous pouvons en faire une pour ses prochains examens scolaires sont terminés Blowout PartAYYY !!! Je dis bien sûr, mais ne préféreriez-vous pas avoir certains de ces superbes anneaux Adafruit Neopixel dont nous avons entendu parler… Il me donne un regard vide. Parce que le fait est qu'il ne sait pas de quoi je parle, mais papa a repéré une opportunité de jouer avec ces anneaux Neopixel dont il a lu, et nous savons tous que l'une des 10 principales raisons pour lesquelles les papas geeks procréent est d'avoir un excuse pour jouer avec des gadgets sympas qu'ils disent que tout le monde est pour leurs enfants.

C'est un projet super simple qui a l'air vraiment génial. Nous avons construit les nôtres de 3 vieilles bouteilles de coca, d'une assiette en bois et d'un support de poteau de terrain de jeu - des trucs qui traînent dans le sous-sol - combinés avec un Arduino (Leonardo dans notre cas, mais n'importe quelle planche Genuino fera l'affaire !) et trois anneaux Neopixel. J'ai commandé un anneau à 9 LED, mais je me suis retrouvé avec un anneau à 12 LED pour le même prix. Ce qui était gentil, mais signifiait un remaniement des trous de puits – les anneaux à 12 LED ont une largeur de 35 mm, contre 23 mm. Ce dont vous aurez besoin:

  • Carte Genuino/Arduino (nous avons utilisé un Leonardo, mais presque toutes les cartes feront l'affaire)
  • 3 anneaux Neopixel (12 LED chacun): obtenez-les d'Adafruit et soutenez ces braves gens
  • 1000 µf 6.3v ou mieux condensateur
  • résistance 300-500 ohms
  • Une assiette en bois, ou un carré de bois de rebut, ou tout ce dans lequel vous pouvez placer les néopixels et poser les bouteilles de coca dessus
  • Une forme de support pour la plaque - un support de poteau de terrain de jeu a très bien fonctionné pour nous
  • verrue murale 9v
  • perceuse 40mm
  • Boulons, écrous, rondelles, entretoises
  • Fil à âme pleine
  • Un fer à souder et de la soudure
  • Planche à pain
  • Un boîtier en plastique pour l'Arduino. Vous pouvez sortir et acheter un très beau boîtier en plastique parfaitement ajusté fabriqué à partir de pétrole vieux d'un million d'années extrait du sol dans un environnement fragile et fabriqué à l'autre bout de la planète et expédié dans un conteneur vers un entrepôt près de chez vous avec tous les ports découpés dans un alignement parfait et le faire livrer à votre porte par une camionnette crachant du dioxyde de carbone dans l'atmosphère. Ou vous pouvez faire ce que j'ai fait et utiliser une vieille boîte en plastique jetée.. dans ce cas une boîte de pansement de Madagascar qui traîne dans l'armoire à pharmacie… et percer quelques trous dedans. Ici se termine la conférence. Faisons…

Étape 1: faire la base

Faire la base
Faire la base
Faire la base
Faire la base

Vous pouvez improviser votre base à partir de tout ce que vous avez dans votre propre sous-sol, ou même simplement utiliser une boîte en bois ou tout ce qui cachera vos appareils électroniques.

Nous avons d'abord percé trois trous, régulièrement espacés sur la plaque de bois, assez grands pour que les anneaux Neopixel y reposent. Dans l'image, les trous sont des puits percés avec une perceuse à bêche. En fin de compte, en raison de la taille plus grande des anneaux de 12 LED, nous avons dû percer des trous avec un foret. Cela signifiait aller tout au long de la plaque, et au lieu de bien serrer les anneaux dans leurs petits puits finement ouvrés de 2 mm de profondeur avec un trou central pour un passage de fil soigné, j'ai fini par fixer les anneaux avec… hum… Du ruban adhésif en bas de la plaque. Ne jugez pas. Vous ne pouvez pas voir le bas de la plaque dans ma conception de toute façon. Et il fait noir quand il est allumé. Et en plus, qu'est-ce qui ne va pas avec le ruban adhésif ?

J'avais besoin d'un espace entre la plaque et le support pour une planche à pain au bas de la plaque et un composant - le condensateur, et pour les câbles qui devraient aller de la planche à pain à Arduino, que j'avais prévu de mettre à l'intérieur du support. J'ai donc mis un ensemble d'entretoises de fortune sur les tiges de boulons pour donner suffisamment d'espace - environ 3 cm, la hauteur de la planche à pain et un peu pour ne pas écraser le câblage. J'ai utilisé deux boulons d'ancrage en bois par coin parce qu'ils étaient à la bonne hauteur et traînaient dans le tiroir de l'homme… de morceaux et de bobs qui peuvent comme par magie vous éviter un voyage à la quincaillerie en offrant, sinon la chose exacte dont vous avez besoin, quelque chose qui fera très bien l'affaire.

Heureux accident à propos du poteau de terrain de jeu que j'ai trouvé au sous-sol, il y avait déjà des trous dans la plaque. Pas besoin de percer le fer ! La base avait quatre trous de boulons et nous avons percé quatre trous fraisés dans la plaque de bois pour qu'ils correspondent.

Nous avons ensuite peint à la bombe le tout en Gothic Black.

Étape 2: Préparation des anneaux Neopixel

Préparation des anneaux Neopixel
Préparation des anneaux Neopixel

Vous aurez besoin de souder des fils sur vos anneaux néopixels: un fil Data-In pour chacun d'eux, un fil Data-Out pour deux d'entre eux, et l'alimentation et la terre pour chacun. Quelle que soit la longueur dont vous pensez avoir besoin, ajoutez-en. Vous pouvez toujours couper l'excès de fil, vous ne pouvez pas en étirer un trop court. Et soyez conscient de l'avertissement d'Adafruit:

Lorsque vous soudez des fils à ces anneaux, vous devez être extrêmement vigilant sur les taches de soudure et les courts-circuits. L'espacement entre les composants est très serré ! Il est souvent plus facile d'insérer le fil par l'avant et de souder à l'arrière.

J'aurais aimé lire ça avant de souder à l'avant. J'ai réussi à ne griller aucune de mes LED, mais j'ai brûlé le bord de l'une d'une manière qui m'a fait transpirer jusqu'à ce que je l'allume. De plus, si j'avais lu le manuel, j'aurais également lu l'avertissement de ne pas mettre de pince crocodile sur la LED. Que mes quasi-naufrages soient votre phare.

Les anneaux Neopixel se connectent en guirlande, ce qui signifie que vous pouvez contrôler toutes leurs LED simultanément à partir d'un Arduino en connectant un fil entre la sortie OUT d'un anneau et l'entrée IN d'un autre. Chaque anneau a également besoin de fils d'alimentation et de terre.

Étape 3: Le câblage

Le câblage
Le câblage

Câblez-le comme dans le Fritzing ci-dessus - la broche 6 de l'Arduino amène les données au premier anneau, la sortie de données de cet anneau va à l'entrée de données du suivant, la sortie de données de celui-ci va au Entrée de données de la dernière sonnerie. Vous n'avez pas besoin du fil de sortie de données de la sonnerie finale.

La capacité de 1000 µf va entre les rails positifs et négatifs de la maquette. Ce capuchon protège les anneaux des pics de puissance et est recommandé par la section des meilleures pratiques de l'Adafruit NeoPixel Uberguide. La résistance sur les données dans le premier néopixel est également recommandée par Adafruit - c'est 1K dans le Fritzing mais la résistance recommandée est de 300-500 ohms.

Dans ma construction, j'ai fait passer les fils des Neopixels à l'arrière de la plaque jusqu'à une planche à pain fixée au centre. De cette façon, vous n'avez qu'à faire passer trois longs fils dans l'unité de base: alimentation, terre et données. J'ai fait ces fils très longs - il y a beaucoup d'espace de stockage dans la base, et il est pratique de pouvoir retirer la carte pour la reprogrammer.

Étape 4: le code

"loading="lazy" a mentionné que mon fils voulait une version réactive à la musique. Il a fallu jusqu'à son 18e anniversaire pour s'y adapter, mais la voici !

Équipements supplémentaires:

1 interrupteur unipolaire à double direction 1 micro de contrôle de gain automatique (j'ai utilisé le MAX9184 d'AdaFruit) 1 condensateur 1 uF-100 uF (n'importe quelle valeur)

Le microphone doit vraiment avoir un contrôle automatique de gain pour que cela fonctionne correctement. AGC échantillonnera constamment le bruit ambiant et augmentera et abaissera le seuil qu'il considère comme arrière-plan, de sorte que votre lumière répondra aux pointes sur cet arrière-plan. Le micro d'AdaFruit est génial: vous pouvez passer d'une pièce silencieuse dans laquelle le son d'une seule voix le déclenchera à un mode fête complet avec une pièce pleine d'adolescents et de musique tonitruante, et il reprendra le rythme de la musique juste amende. L'alternative, un micro à gain réglable, a un petit potentiomètre sur la carte qui est incroyablement délicat et délicat. Il ne faut pas beaucoup de changement dans le son ambiant pour rendre l'appareil inutilisable: lumières allumées en permanence ou éteintes en permanence. AGC fonctionne comme par magie.

Je voulais avoir la possibilité d'utiliser le motif de test de tourbillon ou la musique, j'ai donc câblé le fil central d'un commutateur sur VIN et un fil sur la broche 4, l'autre sur la broche 8 du Leonardo. En testant ces broches pour HIGH ou LOW, nous pouvons savoir dans quel état se trouve le commutateur et dériver le code en conséquence.

Étape 7: Câblage du microphone

Câblage du microphone
Câblage du microphone

Alimentez l'entrée du micro, via ce condensateur 1-100µF, dans la broche analogique 0. Si votre condensateur est polarisé, la broche de sortie va du côté positif (fil vert).

Merci à CodeGirlJP pour sa routine Trinket-Color-by-Sound, que j'ai adaptée ci-dessous:

// LED activées par le son avec l'Arduino et les NeoPixels

#comprendre

#define MIC_PIN A0 // Le microphone est connecté à la broche a0 du Leonardo

#define LED_PIN 6 // Ruban LED NeoPixel attaché à la broche 6 du Leonardo #define N_PIXELS 36 // nombre de pixels dans le brin LED !!!!!! Ajustez au nombre de pixels de votre configuration. C'est correct pour 3 anneaux Neopixel !!!!!! #define N 100 // Nombre d'échantillons à prendre à chaque fois que readSamples est appelé #define fadeDelay 5 // temps de retard pour chaque montant de fondu #define noiseLevel 30 // niveau de pente du bruit moyen du micro sans son

//Initialiser la bande NeoPixel avec les valeurs définies ci-dessus:

Bande Adafruit_NeoPixel = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

int échantillons[N]; // stockage pour un ensemble de collections d'échantillons

int periodFactor = 0; // garde une trace du nombre de ms pour le calcul de la période int t1 = -1; // temps de pente > 100 détectés. int T; // période entre les temps mis à l'échelle en millisecondes int pente; // la pente de deux points d'échantillon de données collectés byte periodChanged = 0; const int SwitchPinMusic = 4; // Broche pour la position du commutateur music-sensitivity const int SwitchPinSwirl = 8; // Broche pour la position du commutateur Motif de test (tourbillon) int MusicbuttonState = 0; // On off variable logique pour la sensibilité musicale

// Méthode de configuration Arduino

void setup() {

strip.begin();

ledsOff(); retard (500); displayColor(Roue(100)); strip.show(); retard (500); impairRoue(Roue(100)); strip.show(); retard (500); pinMode (SwitchPinMusic, INPUT); pinMode (SwitchPinSwirl, INPUT); //attachInterrupt(4, Switched, FALLING);

}

// Méthode de boucle Arduino

boucle vide () { SwirlbuttonState = digitalRead (SwitchPinSwirl); //ÉLEVÉ si le commutateur est réglé sur Sensibilité musicale MusicbuttonState = digitalRead(SwitchPinMusic); //HIGH si le commutateur est défini sur Test pattern while (SwirlbuttonState == LOW) { readSamples(); //Exécutez la routine d'échantillonnage de musique SwirlbuttonState = digitalRead(SwitchPinSwirl); //Vérifiez si le commutateur a été modifié } SwirlbuttonState = digitalRead(SwitchPinSwirl); MusicbuttonState = digitalRead (SwitchPinMusic); while (SwirlbuttonState == HIGH) { Dance(); //Exécutez la routine de motif de test swirly SwirlbuttonState = digitalRead(SwitchPinSwirl); //Vérifiez si le commutateur a été modifié

}

}

Danse vide () {

while (SwirlbuttonState == HIGH) { colorWipe(strip. Color(255, 0, 0), 50); // Red SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 255, 0), 50); // Vert SwirlbuttonState = digitalRead(SwitchPinSwirl); colorWipe(strip. Color(0, 0, 255), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); //colorWipe(strip. Color(0, 0, 0, 255), 50); // White RGBW // Envoie une poursuite de pixels de théâtre dans… SwirlbuttonState = digitalRead(SwitchPinSwirl); théâtreChase(strip. Color(127, 127, 127), 50); // White SwirlbuttonState = digitalRead (SwitchPinSwirl); théâtreChase(strip. Color(127, 0, 0), 50); // Red SwirlbuttonState = digitalRead(SwitchPinSwirl); théâtreChase(strip. Color(0, 0, 127), 50); // Blue SwirlbuttonState = digitalRead (SwitchPinSwirl); arc-en-ciel(20); SwirlbuttonState = digitalRead (SwitchPinSwirl); arc-en-ciel(20); SwirlbuttonState = digitalRead (SwitchPinSwirl); théâtreChaseRainbow(50); SwirlbuttonState = digitalRead (SwitchPinSwirl); } } // Lecture et traitement des échantillons de données à partir du micro void readSamples() { for(int i=0; i0) { slope = samples - samples[i-1]; } else { pente = échantillons - échantillons[N-1]; } // Vérifier si la pente est supérieure à noiseLevel - son qui n'est pas au niveau de bruit détecté if(abs(slope) > noiseLevel) { if(slope < 0) { calculatePeriod(i); if(periodChanged == 1) { displayColor(getColor(T)); } } } else { ledsOff(); // théâtreChaseRainbow(50); } periodFactor += 1; retard(1); } }

void calculatePeriod(int i)

{ if(t1 == -1) { // t1 n'a pas été défini t1 = i; } else { // t1 a été défini donc calc period int period = periodFactor*(i - t1); periodChanged = T==période ? 0: 1; T = période; //Série.println(T); // réinitialiser t1 à la nouvelle valeur i t1 = i; facteurpériode = 0; } }

uint32_t getColor(int période)

{ if(période == -1) return Wheel(0); else if(période > 400) return Wheel(5); else return Wheel(map(-1*période, -400, -1, 50, 255)); }

void fadeOut()

{ for(int i=0; i<5; i++) { strip.setBrightness(110 - i*20); strip.show(); // Mettre à jour le délai de bande (fadeDelay); periodFactor +=fadeDelay; } }

annuler fondu d'entrée ()

{ strip.setBrightness(100); strip.show(); // Mettre à jour la bande // fondu de couleur pour (int i=0; i<5; i++) { //strip.setBrightness(20*i + 30); //strip.show(); // Mettre à jour le délai de bande (fadeDelay); periodFactor+=fadeDelay; } }

annuler les leds éteintes()

{ disparaître(); for(int i=0; i

void displayColor (couleur uint32_t)

{ for(int i=0; i

void oddWheel (couleur uint32_t)

{ for (int j=0; j < 256; j++) { // cycle toutes les 256 couleurs dans la roue pour (int q=0; q < 3; q++) { for (uint16_t i=24; i < 36; i =i+3) { strip.setPixelColor(i+q, Wheel((i+j) % 255)); //activer chaque troisième pixel } strip.show();

retard(1);

pour (uint16_t i=24; i < 36; i=i+3) { strip.setPixelColor(i+q, 0); //désactiver chaque troisième pixel } } } fadeIn(); }

// Remplir les points les uns après les autres avec une couleur

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

void arc-en-ciel (uint8_t wait) {

uint16_t i, j;

pour(j=0; j<256; j++) { pour(i=0; je

// Légèrement différent, cela rend l'arc-en-ciel également réparti

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

for(j=0; j<256*5; j++) { // 5 cycles de toutes les couleurs sur la roue for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); } strip.show(); retarder (attendre); } }

//Lumières rampantes de style théâtre.

void TheaterChase(uint32_t c, uint8_t wait) { for (int j=0; j<10; j++) { //faire 10 cycles de poursuite pour (int q=0; q < 3; q++) { for (uint16_t i= 0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, c); //activer chaque troisième pixel } strip.show();

retarder (attendre);

pour (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //désactiver chaque troisième pixel } } } }

//Lumières rampantes de style théâtre avec effet arc-en-ciel

void theatreChaseRainbow(uint8_t wait) { for (int j=0; j < 256; j++) { // cycle toutes les 256 couleurs dans la roue pour (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)); //activer chaque troisième pixel } strip.show();

retarder (attendre);

pour (uint16_t i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); //désactiver chaque troisième pixel } } } }

// Saisissez une valeur de 0 à 255 pour obtenir une valeur de couleur.

// Les couleurs sont une transition r - g - b - retour à 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; return strip. Color(0, WheelPos * 3, 255 - WheelPos * 3); } RouePos -= 170; return strip. Color(WheelPos * 3, 255 - WheelPos * 3, 0); }

void commuté (){

strip.show(); readSamples(); }

Avant de me faire massacrer dans les commentaires (rappelez-vous la politique Be Nice !!), j'ai réalisé après avoir téléchargé ceci à quel point une partie de mon code est bâclée. Il n'est pas nécessaire de tester constamment les broches 4 et 8 pour HAUT. Comme l'interrupteur est unipolaire bidirectionnel, la valeur de l'un peut être déduite de l'autre: il suffit d'en tester un. Ainsi, vous pouvez parcourir et supprimer toutes les références à la lecture et à l'écriture du MusicButtonState et simplement exécuter le tout plus efficacement en testant SwirlButtonState, si vous manquez de mémoire ou si vous étendez avec d'autres routines. Mais le code ci-dessus fonctionne.

Et si quelqu'un veut modifier ces routines audio pour détecter non seulement les niveaux de bruit mais aussi la fréquence, et écrire un code fluide pour faire glisser le spectre lumineux de haut en bas en réponse aux mouvements le long du spectre audio, déposez un lien dans les commentaires pour Comment vous l'avez fait.

Prendre plaisir!

Conseillé: