Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Construire une lampe de bureau réactive à l'audio avec Arduino Nano

Composants et fournitures

Composant Quantité
Arduino Nano R3 1
Module détection sonore 1
Plaque d'essai (breadboard) 1
Fils de liaison 1
Bande LED adressable (WS2812B / NeoPixel) 60 LED/m 1
Bocal IKEA DROPPAR (grand modèle) 1
Tube PVC (petite longueur) 1

Outils nécessaires

Applications et services en ligne

À propos de ce projet

HELLO WORLD !!

Dans ce projet, nous réalisons une belle lampe qui danse au rythme des sons et de la musique, avec des composants simples et une programmation Arduino de base. Effet garanti sur un bureau lors de sessions gaming, d'écoute musicale, ou tout environnement sonore.

Basé sur le travail du youtubeur « Natural Nerd » (grand merci pour les détails). Voici ma version.

ÉTAPE 1 : PRINCIPAUX APPROVISIONNEMENTS

Pour l'esthétique (diffusion de la lumière) :

Coût total environ 19 € (la bande LED étant le poste principal ~9 € pour 1 mètre).

ÉTAPE 2 : ALIMENTATION DES COMPOSANTS

Alimentation simple via le câble USB de l'Arduino Nano sur PC. Si alimentation externe 12V, un module abaisseur (step-down) vers 5V est indispensable pour ne pas griller l'Arduino et les composants.

Le module détecteur de son fournit un signal analogique à l'Arduino pour piloter les LED RGB. Les deux fonctionnent en 5V. Câblage : VIN Arduino et VIN détecteur sur +5V ; GND commun. Alimentez aussi la bande LED (+5V et GND).

ÉTAPE 3 : DÉTECTEUR & BANDE LED

ÉTAPE 4 : TÉLÉVERSER LE CODE

Le code est la clé : il mappe la valeur analogique du capteur sur le nombre de LED à allumer. Utilisez le code fourni.

ÉTAPE 5 : PRÉPARATION DU BOÎTIER

  1. Couvercle : Le couvercle du bocal est en verre (pas acrylique). Découpez un disque de plaque de mousse au diamètre du couvercle (méthode : marqueur humide + papier + découpe).
  2. Retrait du verre : ATTENTION ! Enveloppez le bocal dans un sac plastique épais, cassez le verre en espace ouvert. Retirez tous les éclats restants.
  3. Montage du disque mousse : Placez-le au centre du couvercle, ajustez pour qu'il tienne fermement.
  4. Perçages : Deux trous pour les fils du module sonore (placé sous le couvercle) vers la breadboard ; un trou pour le câble USB de l'Arduino (monté verticalement). Breadboard mini au centre du couvercle pour accès facile.
  5. Tube PVC + LED : Enroulez la bande LED en spirale légèrement inclinée autour du tube PVC. Cachez l'excédent de câble dans le tube. Fixez le tube sur la breadboard (colle chaude ou ruban double face).
  6. Câblage final : Suivez le schéma (côté gauche breadboard = +, côté droit = -).
  7. Module sonore : Placez-le à l'extérieur du couvercle pour meilleure captation. Connectez selon le schéma.

Projet terminé après essais et ajustements !

Code

#include <FastLED.h>

/** CONFIGURATION DE BASE **/
#define NUM_LEDS 60        // Nombre de LED
#define LED_PIN 6          // Broche commande LED
#define ANALOG_READ A0     // Broche lecture capteur son
#define MIC_LOW 0.0        // Valeur basse capteur (calibrer)
#define MIC_HIGH 200.0     // Valeur haute capteur (calibrer)

/** AUTRES PARAMÈTRES **/
#define AVGLEN 5           // Fenêtre moyenne courte
#define LONG_SECTOR 20     // Fenêtre longue pour détection pics
#define HIGH_MODE 3
#define NORMAL_MODE 2
#define MSECS 30000        // Fenêtre temps "chanson" (30s)
#define CYCLES MSECS / DELAY
#define DEV_THRESH 0.8     // Seuil rejet valeurs aberrantes
#define DELAY 1            // Délai boucle (ms)

float fscale(float originalMin, float originalMax, float newBegin, float newEnd, float inputValue, float curve);
void insert(int val, int *avgs, int len);
int compute_average(int *avgs, int len);
void visualize_music();

int curshow = NUM_LEDS;
int mode = 0;
int songmode = NORMAL_MODE;
unsigned long song_avg = 0;
int iter = 0;
float fade_scale = 1.2;
CRGB leds[NUM_LEDS];
int avgs[AVGLEN] = {-1};
int long_avg[LONG_SECTOR] = {-1};

struct time_keeping { unsigned long times_start; short times; };
struct color { int r, g, b; };
time_keeping high;
color Color;

void setup() {
  Serial.begin(9600);
  FastLED.addLeds<NEOPIXEL, LED_PIN>(leds, NUM_LEDS);
  for (int i = 0; i < NUM_LEDS; i++) leds[i] = CRGB(0, 0, 255);
  FastLED.show(); delay(1000);
  
  for (int i = 0; i < AVGLEN; i++) insert(250, avgs, AVGLEN);
  
  high.times = 0; high.times_start = millis();
  Color.r = 0; Color.g = 0; Color.b = 1;
}

void loop() {
  switch (mode) {
    case 0: visualize_music(); break;
    default: break;
  }
  delay(DELAY);
}

void check_high(int avg) {
  if (avg > (song_avg / max(1, iter) * 1.1)) {
    if (high.times != 0) {
      if (millis() - high.times_start > 200) { high.times = 0; songmode = NORMAL_MODE; }
      else { high.times_start = millis(); high.times++; }
    } else { high.times++; high.times_start = millis(); }
  }
  if (high.times > 30 && millis() - high.times_start < 50) songmode = HIGH_MODE;
  else if (millis() - high.times_start > 200) { high.times = 0; songmode = NORMAL_MODE; }
}

void visualize_music() {
  int sensor_value = analogRead(ANALOG_READ);
  if (sensor_value == 0) return;
  
  float mapped = fscale(MIC_LOW, MIC_HIGH, MIC_LOW, (float)MIC_HIGH, (float)sensor_value, 2.0);
  int avg = compute_average(avgs, AVGLEN);
  if (abs(avg - mapped) > avg * DEV_THRESH) return;
  
  insert((int)mapped, avgs, AVGLEN);
  insert(avg, long_avg, LONG_SECTOR);
  
  song_avg += avg; iter++;
  if (iter > CYCLES) { song_avg /= iter; iter = 1; }
  
  int longavg = compute_average(long_avg, LONG_SECTOR);
  check_high(longavg);
  
  if (songmode == HIGH_MODE) { fade_scale = 3; Color.r = 5; Color.g = 3; Color.b = -1; }
  else { fade_scale = 2; Color.r = -1; Color.b = 2; Color.g = 1; }
  
  curshow = (int)fscale(MIC_LOW, MIC_HIGH, 0.0, (float)NUM_LEDS, (float)avg, -1);
  
  for (int i = 0; i < NUM_LEDS; i++) {
    if (i < curshow) {
      leds[i].r = constrain(leds[i].r + Color.r, 0, 255);
      leds[i].g = constrain(leds[i].g + Color.g, 0, 255);
      leds[i].b = constrain(leds[i].b + Color.b, 0, 255);
    } else {
      leds[i] = CRGB(leds[i].r / fade_scale, leds[i].g / fade_scale, leds[i].b / fade_scale);
    }
  }
  FastLED.show();
}

int compute_average(int *avgs, int len) {
  int sum = 0;
  for (int i = 0; i < len; i++) sum += avgs[i];
  return sum / len;
}

void insert(int val, int *avgs, int len) {
  for (int i = 0; i < len; i++) if (avgs[i] == -1) { avgs[i] = val; return; }
  for (int i = 1; i < len; i++) avgs[i-1] = avgs[i];
  avgs[len-1] = val;
}

float fscale(float originalMin, float originalMax, float newBegin, float newEnd, float inputValue, float curve) {
  if (curve > 10) curve = 10; if (curve < -10) curve = -10;
  curve = (curve * -.1); curve = pow(10, curve);
  if (inputValue < originalMin) inputValue = originalMin;
  if (inputValue > originalMax) inputValue = originalMax;
  float OriginalRange = originalMax - originalMin;
  float NewRange = (newEnd > newBegin) ? newEnd - newBegin : newBegin - newEnd;
  bool invFlag = (newEnd <= newBegin);
  float zeroRefCurVal = inputValue - originalMin;
  float normalizedCurVal = zeroRefCurVal / OriginalRange;
  if (originalMin > originalMax) return 0;
  float rangedValue = invFlag ? newBegin - (pow(normalizedCurVal, curve) * NewRange) 
                               : (pow(normalizedCurVal, curve) * NewRange) + newBegin;
  return rangedValue;
}

Schémas

Schéma de câblage : Arduino Nano, module son sur A0, bande LED adressable sur D6, alimentation commune 5V/GND, résistance sur ligne data LED recommandée (non montrée).

Processus de fabrication

  1. Détecteur de langue TinyML avec Edge Impulse sur Arduino Nano 33 BLE Sense
  2. Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
  3. Dé numérique Arduino sur écran LCD 16x2 – Générateur aléatoire à bouton poussoir
  4. Construire un Iron Man animé avec Arduino : capteurs, sons et relais
  5. Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
  6. Comment lire de l'audio avec Arduino UNO et DFPlayer Mini – Guide étape par étape
  7. Contrôleur d'humidificateur DIY avec Arduino et relais – Installation haute tension sécurisée
  8. Mesure de distance en temps réel par sonar Arduino et visualisation Processing
  9. MobBob : Construisez votre propre robot Arduino, contrôlé via smartphone Android