Polsera LEDRGB reactiva al so.
Bateria de liti petita, micròfon , Xiao ESP32C3, ESP32C3-Mini, Arduino Nano o similar , tira de LEDs direccionables (com WS2812B) i interruptor.
Per adaptar el projecte de la polsera LED reactiva al so a l’ESP32-C3 Mini-1, et proporciono un exemple de codi. Aquest codi utilitza la biblioteca FastLED per controlar els LEDs i realitza una anàlisi bàsica de les freqüències de so mitjançant un sensor analògic. Tingues en compte que aquest codi és un punt de partida i pot requerir ajustaments segons els components específics que utilitzis.
Xiao ESP32C3 i Neopixel
#include <FastLED.h>
#include <Adafruit_NeoPixel.h>
// Define pins and constants
#define LED_PIN 6 // Pin connected to the LED strip
#define NUM_LEDS 30 // Number of LEDs in the strip
#define SOUND_PIN A0 // Analog pin connected to the sound sensor
#define VIBRATION_PIN 9 // Pin connected to the vibration motor
// Initialize the LED strip
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// Initialize the LED strip
strip.begin();
strip.show(); // Turn off all LEDs initially
// Set up the vibration motor pin as output
pinMode(VIBRATION_PIN, OUTPUT);
}
void loop() {
int soundLevel = analogRead(SOUND_PIN); // Read the sound level from the microphone
// Map sound level to vibration intensity and LED brightness
int vibrationIntensity = map(soundLevel, 0, 1023, 0, 255);
int ledBrightness = map(soundLevel, 0, 1023, 0, 255);
// Activate the vibration motor based on sound intensity
analogWrite(VIBRATION_PIN, vibrationIntensity);
// Set LED colors based on sound level
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(ledBrightness, 0, ledBrightness)); // Example color: purple
}
strip.show(); // Update the LEDs
}
_______
Codi d'exemple per ESP32-C3 Mini-1
#include <FastLED.h>
#include <arduinoFFT.h>
// Definició de constants
#define LED_PIN 6 // Pin on es connecta la tira de LEDs
#define NUM_LEDS 30 // Nombre de LEDs a la tira
#define SOUND_PIN A0 // Pin analògic per al sensor de so
#define SAMPLES 128 // Nombre de mostres per a la FFT (ha de ser potència de 2)
#define SAMPLING_FREQ 10000 // Freqüència de mostreig en Hz
// Configuració dels LEDs
CRGB leds[NUM_LEDS];
// Configuració de la FFT
arduinoFFT FFT = arduinoFFT();
// Arrays per a les dades de la FFT
double vReal[SAMPLES];
double vImag[SAMPLES];
void setup() {
// Inicialitzar la tira de LEDs
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
// Inicialitzar la comunicació serial per a depuració
Serial.begin(115200);
}
void loop() {
// Recollida de mostres de so
for (int i = 0; i < SAMPLES; i++) {
vReal[i] = analogRead(SOUND_PIN);
vImag[i] = 0;
delayMicroseconds(100); // Ajusta aquest valor per aconseguir la freqüència de mostreig desitjada
}
// Realitzar la FFT
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
// Analitzar les freqüències i assignar colors
int lowFreq = 0, midFreq = 0, highFreq = 0;
for (int i = 2; i < (SAMPLES/2); i++) { // Ignorem la component DC (i=0) i la primera freqüència
if (i <= 4) lowFreq += vReal[i]; // 0-200 Hz aproximadament
else if (i <= 10) midFreq += vReal[i]; // 200-500 Hz aproximadament
else highFreq += vReal[i]; // 500+ Hz
}
// Normalitzar i mapejar a valors RGB
int r = map(lowFreq, 0, 1000, 0, 255);
int g = map(midFreq, 0, 1000, 0, 255);
int b = map(highFreq, 0, 1000, 0, 255);
// Limitar els valors RGB a 0-255
r = constrain(r, 0, 255);
g = constrain(g, 0, 255);
b = constrain(b, 0, 255);
// Calcular la brillantor basada en el volum total
int totalVolume = lowFreq + midFreq + highFreq;
int brightness = map(totalVolume, 0, NUM_LEDS * SAMPLES /2 ,10 ,255);
brightness = constrain(brightness ,10 ,255);
// Aplicar el color i la brillantor a tots els LEDs
fill_solid(leds ,NUM_LEDS ,CRGB(r ,g ,b));
FastLED.setBrightness(brightness );
FastLED.show();
// Imprimir valors per a depuració
Serial.print("R: "); Serial.print(r);
Serial.print(" G: "); Serial.print(g);
Serial.print(" B: "); Serial.print(b);
Serial.print(" Brillantor: "); Serial.println(brightness );
// Petit retard per estabilitat
delay(10 );
}
Consideracions:
1. Connexions: Assegura't que el `LED_PIN` i el `SOUND_PIN` estiguin connectats correctament als pins del teu ESP32-C3 Mini-1.
2. Alimentació: L'ESP32-C3 funciona a un voltatge de funcionament de 3.3V, així que assegura't que tots els components siguin compatibles amb aquest voltatge.
3. Biblioteques: Assegura't d'instal·lar les biblioteques FastLED i arduinoFFT des del gestor de biblioteques d'Arduino.
4. Ajustaments: Pots necessitar ajustar els paràmetres com `SAMPLES`, `SAMPLING_FREQ`, o els rangs de freqüència segons el teu sensor específic i les teves preferències visuals.
Aquest codi proporciona una base sòlida per començar amb el teu projecte utilitzant l'ESP32-C3 Mini-1. Pots expandir-lo afegint funcionalitats addicionals com control remot via Wi-Fi o Bluetooth si ho desitges.
________________________________
Codi per Arduino Nano
#include <FastLED.h>
#include <arduinoFFT.h>
// Definició de constants
#define LED_PIN 6 // Pin on es connecta la tira de LEDs
#define NUM_LEDS 30 // Nombre de LEDs a la tira
#define SOUND_PIN A0 // Pin analògic per al sensor de so
#define SAMPLES 128 // Nombre de mostres per a la FFT (ha de ser potència de 2)
#define SAMPLING_FREQ 10000 // Freqüència de mostreig en Hz
// Configuració dels LEDs
CRGB leds[NUM_LEDS];
// Configuració de la FFT
arduinoFFT FFT = arduinoFFT();
// Arrays per a les dades de la FFT
double vReal[SAMPLES];
double vImag[SAMPLES];
void setup() {
// Inicialitzar la tira de LEDs
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
// Inicialitzar la comunicació serial per a depuració
Serial.begin(115200);
}
void loop() {
// Recollida de mostres de so
for (int i = 0; i < SAMPLES; i++) {
vReal[i] = analogRead(SOUND_PIN);
vImag[i] = 0;
delayMicroseconds(100); // Ajusta aquest valor per aconseguir la freqüència de mostreig desitjada
}
// Realitzar la FFT
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
// Analitzar les freqüències i assignar colors
int lowFreq = 0, midFreq = 0, highFreq = 0;
for (int i = 2; i < (SAMPLES/2); i++) { // Ignorem la component DC (i=0) i la primera freqüència
if (i <= 4) lowFreq += vReal[i]; // 0-200 Hz aproximadament
else if (i <= 10) midFreq += vReal[i]; // 200-500 Hz aproximadament
else highFreq += vReal[i]; // 500+ Hz
}
// Normalitzar i mapejar a valors RGB
int r = map(lowFreq, 0, 1000, 0, 255);
int g = map(midFreq, 0, 1000, 0, 255);
int b = map(highFreq, 0, 1000, 0, 255);
// Limitar els valors RGB a 0-255
r = constrain(r, 0, 255);
g = constrain(g, 0, 255);
b = constrain(b, 0, 255);
// Calcular la brillantor basada en el volum total
int totalVolume = lowFreq + midFreq + highFreq;
int brightness = map(totalVolume, 0, 3000, 10, 255); // Mínim 10 per evitar que s'apagui completament
brightness = constrain(brightness, 10, 255);
// Aplicar el color i la brillantor a tots els LEDs
fill_solid(leds, NUM_LEDS, CRGB(r, g, b));
FastLED.setBrightness(brightness);
FastLED.show();
// Imprimir valors per a depuració
Serial.print("R: "); Serial.print(r);
Serial.print(" G: "); Serial.print(g);
Serial.print(" B: "); Serial.print(b);
Serial.print(" Brillantor: "); Serial.println(brightness);
// Petit retard per estabilitat
delay(10);
}
_______________________________
Samarreta Vibrant amb LED RGB per a Concerts
Per dissenyar roba per a persones sordes amb wearables i vibradors, es poden considerar les següents idees:
Per crear samarretes vibrants i amb LED RGB per a persones sordes per utilitzar en concerts, podem combinar diverses tecnologies wearables modernes disponibles el 2024. Aquí tens una proposta detallada:
Components Principals:
1. Teixit Intel·ligent:
- Utilitzar teixits conductius que integren fils conductors per transmetre senyals elèctriques.
- Incorporar materials termoreguladors per mantenir la comoditat de l'usuari.
2. Sistema de Vibració:
- Múltiples motors vibrants de mida reduïda distribuïts estratègicament per la samarreta.
- Utilitzar actuadors hàptics avançats com els de la tecnologia VibrotextileTM de Not Impossible Labs.
3. Il·luminació LED RGB:
- Tires de LED RGB flexibles i de baix consum integrades al teixit.
- Controladors LED miniaturitzats per gestionar els patrons de llum.
4. Microcontrolador:
- Utilitzar un ESP32-C3 Mini-1 o similar per la seva mida reduïda i potència de processament.
5. Sensors de So:
- Micròfons d'alta sensibilitat per captar les freqüències del so ambient.
- Processadors de senyal digital (DSP) per analitzar l'àudio en temps real.
6. Bateria:
- Bateria flexible i de capa fina integrada al teixit.
- Sistema de càrrega sense fils per facilitar el manteniment.
Funcionament:
1. Els sensors de so capten la música del concert.
2. El microcontrolador processa les dades d'àudio i les converteix en patrons de vibració i llum.
3. Els motors vibrants transmeten les vibracions corresponents a diferents freqüències del so.
4. Els LEDs RGB s'il·luminen en sincronia amb la música, canviant de color segons les freqüències predominants.
Característiques Avançades (2024):
- Personalització via App: Una aplicació mòbil permet ajustar la intensitat de les vibracions i els patrons de llum segons les preferències de l'usuari.
- Reconeixement de Cançons: Utilitzar IA per identificar cançons específiques i crear patrons de vibració i llum únics per a cada una.
- Sincronització Multidispositiu: Permetre la sincronització entre múltiples samarretes per crear efectes visuals coordinats en grups.
- Adaptació Automàtica: Sensors de moviment i temperatura per ajustar automàticament la intensitat de les vibracions i la lluminositat dels LEDs segons l'activitat de l'usuari.
- Teixit Autonetejant: Incorporar nanotecnologia per crear un teixit que repel·leixi la brutícia i les olors, ideal per a l'ús en concerts.
Aquesta samarreta combinaria les tecnologies de vibració tàctil com les utilitzades en el Not Impossible Vest amb il·luminació LED avançada i teixits intel·ligents, creant una experiència immersiva per a persones sordes en concerts. La integració de components miniaturitzats i teixits conductius permetria un disseny elegant i còmode, mentre que les funcionalitats avançades de 2024 oferirien una experiència altament personalitzable i interactiva.
Amb Lilipad
Per crear una samarreta vibrant amb LED RGB utilitzant components moderns per a wearables el 2024, pots seguir aquest exemple de codi i llista de components. Aquest projecte utilitza el LilyPad Arduino, dissenyat específicament per a tèxtils electrònics i projectes wearables.
Components Necessaris
1. LilyPad Arduino Main Board: Microcontrolador dissenyat per a wearables.
2. NeoPixel LED Strip: Tira de LEDs RGB direccionables per crear efectes de llum.
3. Vibrating Mini Motor Discs: Motors vibrants per proporcionar feedback tàctil.
4. Micròfon MEMS: Sensor de so per captar les freqüències ambientals.
5. Bateria LiPo: Font d'alimentació compacta i recarregable.
6. Fil Conductiu: Per cosir i connectar components al teixit.
Codi Arduino amb Comentaris
#include <FastLED.h>
#include <Adafruit_NeoPixel.h>
// Definició de constants
#define LED_PIN 6 // Pin on es connecta la tira de LEDs
#define NUM_LEDS 30 // Nombre de LEDs a la tira
#define SOUND_PIN A0 // Pin analògic per al sensor de so
#define VIBRATION_PIN 9 // Pin digital per al motor vibrant
// Configuració dels LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// Inicialitzar la tira de LEDs
strip.begin();
strip.show(); // Apaga tots els LEDs inicialment
// Configurar el pin del motor vibrant com a sortida
pinMode(VIBRATION_PIN, OUTPUT);
}
void loop() {
int soundLevel = analogRead(SOUND_PIN); // Llegir el nivell de so
// Mapejar el nivell de so a un valor de vibració i color LED
int vibrationIntensity = map(soundLevel, 0, 1023, 0, 255);
int ledBrightness = map(soundLevel, 0, 1023, 0, 255);
// Activar el motor vibrant segons la intensitat del so
analogWrite(VIBRATION_PIN, vibrationIntensity);
// Configurar el color dels LEDs segons el nivell de so
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(ledBrightness, 0, ledBrightness)); // Color morat com a exemple
}
strip.show(); // Actualitzar els LEDs
}
Explicació del Codi
- Inicialització: Es configura la tira de LEDs NeoPixel i el pin del motor vibrant.
- Lectura del So: Es llegeix el nivell de so mitjançant un sensor analògic.
- Mapeig: El nivell de so es mapeja a intensitats per als motors vibrants i la brillantor dels LEDs.
- Actualització: Els motors vibrants s'activen segons la intensitat del so i els LEDs canvien de color en conseqüència.
Aquest projecte combina llum i vibració per oferir una experiència immersiva en concerts per a persones sordes. Els components moderns com el LilyPad Arduino i els NeoPixels permeten una fàcil integració en tèxtils intel·ligents.
Amb Gemma M0
Per crear una banda wearable utilitzant l'Adafruit GEMMA M0 amb retroalimentació LED i de vibració, pots utilitzar el següent codi. Aquest exemple mostra com controlar una tira de LEDs i un motor de vibració basant-se en l'entrada d'un sensor de so. El codi està dissenyat per a una aplicació wearable senzilla, com una banda que reacciona als nivells de so.
Components Necessaris
1. Adafruit GEMMA M0: Un microcontrolador petit i wearable.
2. Tira de LEDs NeoPixel: LEDs RGB direccionables per a retroalimentació visual.
3. Discos de Motor Vibrant: Petits motors per a retroalimentació hàptica.
4. Micròfon MEMS: Sensor de so per detectar nivells d'àudio.
5. Bateria LiPo: Font d'alimentació compacta.
6. Fil Conductiu o Cables: Per connectar els components a la banda.
Codi per al GEMMA M0
#include <Adafruit_NeoPixel.h>
// Definició de pins i constants
#define LED_PIN 1 // Pin connectat a la tira de LEDs
#define NUM_LEDS 8 // Nombre de LEDs a la tira
#define SOUND_PIN A0 // Pin analògic connectat al sensor de so
#define VIBRATION_PIN 0 // Pin connectat al motor vibrant
// Inicialitzar la tira de LEDs
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// Inicialitzar la tira de LEDs
strip.begin();
strip.show(); // Apagar tots els LEDs inicialment
// Configurar el pin del motor vibrant com a sortida
pinMode(VIBRATION_PIN, OUTPUT);
}
void loop() {
int soundLevel = analogRead(SOUND_PIN); // Llegir el nivell de so del micròfon
// Mapejar el nivell de so a la intensitat de vibració i la brillantor dels LEDs
int vibrationIntensity = map(soundLevel, 0, 1023, 0, 255);
int ledBrightness = map(soundLevel, 0, 1023, 0, 255);
// Activar el motor vibrant segons la intensitat del so
analogWrite(VIBRATION_PIN, vibrationIntensity);
// Configurar els colors dels LEDs segons el nivell de so
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(ledBrightness, 0, ledBrightness)); // Color exemple: morat
}
strip.show(); // Actualitzar els LEDs
delay(10); // Petit retard per estabilitat
}
Consideracions Clau
- Configuració dels Pins: Assegura't que `LED_PIN`, `SOUND_PIN` i `VIBRATION_PIN` estiguin correctament connectats als pads adequats del GEMMA M0.
- Alimentació: El GEMMA M0 funciona a un voltatge de 3.3V, així que assegura't que tots els components siguin compatibles amb aquest nivell de voltatge.
- Compatibilitat de Llibreries: Assegura't d'haver instal·lat la llibreria Adafruit NeoPixel en el teu IDE d'Arduino.
- Integració dels Components: Utilitza fil conductiu o cables fins per connectar els components dins d'un disseny compacte per a la banda.
Aquest conjunt proporciona tant retroalimentació visual com tàctil basada en els nivells de so ambientals, cosa que pot ser especialment útil en entorns com concerts on les pistes visuals i tàctils són importants per a les persones amb discapacitats auditives.