Com a projecte de final de curs, hem fet un altaveu que funciona amb un microcontrolador.
Per el moment, posarem el cablejat en una protoboard per fer-ho mes facil d'arreclar si passa alguna cosa.
 
    Cablejat del altaveu
 
    Recreació del cablejat a tinkercad
#include  // Incloim la llibreria de neopixel
#ifdef __AVR__
#include 
#endif
#define PIN 6 //Indiquem el pin del LED Strip
#define NUMPIXELS 20 //Indiquem el numero de leds de la strip
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() 
    {
        pinMode(D8, OUTPUT); //Indiquem que utilitzarem el pin D8 (El pin 8 en mode digital) com a output
        pixels.begin();
    }
void loop() 
    {
        tone(D8, 523.25); //Fem que l'altaveu emiti la frequencia especificada, 523.25 en aquest cas
        pixels.clear(); //Netegem tots els lleds
        pixels.setPixelColor(0, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        //Indiquem quin led volem iluminar
        pixels.show(); //Ensenyem els leds que hem indicat
        delay(600); //Fem que el codi esperi 600 mil·lisegons
        tone(D8, 880);
        pixels.clear();
        pixels.setPixelColor(1, pixels.ColorHSV(map(880, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(150);
        tone(D8, 783.99);
        pixels.clear();
        pixels.setPixelColor(2, pixels.ColorHSV(map(783.99, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(300);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(3, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(1150);
        noTone(D8); //Fem que l'altaveu no emiteixi ningun to
        pixels.clear();
        delay(200);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(4, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(600);
        tone(D8, 880);
        pixels.clear();
        pixels.setPixelColor(5, pixels.ColorHSV(map(880, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(150);
        tone(D8, 783.99);
        pixels.clear();
        pixels.setPixelColor(6, pixels.ColorHSV(map(783.99, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(300);
        tone(D8, 587.33);
        pixels.clear();
        pixels.setPixelColor(7, pixels.ColorHSV(map(587.33, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(650);
        noTone(D8);
        pixels.clear();
        delay(100);
        tone(D8, 587.33);
        pixels.clear();
        pixels.setPixelColor(8, pixels.ColorHSV(map(587.33, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(300);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(9, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(250);
        noTone(D8);
        pixels.clear();
        delay(50);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(10, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(600);
        tone(D8, 880);
        pixels.clear();
        pixels.setPixelColor(11, pixels.ColorHSV(map(880, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(150);
        tone(D8, 783.99);
        pixels.clear();
        pixels.setPixelColor(12, pixels.ColorHSV(map(783.99, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(300);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(13, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(950);
        noTone(D8);
        pixels.clear();
        delay(100);
        tone(D8, 659.26);
        pixels.clear();
        pixels.setPixelColor(14, pixels.ColorHSV(map(659.26, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(150);
        noTone(D8);
        delay(150);
        tone(D8, 659.26);
        pixels.clear();
        pixels.setPixelColor(15, pixels.ColorHSV(map(659.26, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(16, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 587.33);
        pixels.clear();
        pixels.setPixelColor(17, pixels.ColorHSV(map(587.33, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 659.26);
        pixels.clear();
        pixels.setPixelColor(15, pixels.ColorHSV(map(659.26, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(16, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 587.33);
        pixels.clear();
        pixels.setPixelColor(17, pixels.ColorHSV(map(587.33, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);tone(D8, 659.26);
        pixels.clear();
        pixels.setPixelColor(15, pixels.ColorHSV(map(659.26, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(16, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 587.33);
        pixels.clear();
        pixels.setPixelColor(17, pixels.ColorHSV(map(587.33, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);tone(D8, 659.26);
        pixels.clear();
        pixels.setPixelColor(15, pixels.ColorHSV(map(659.26, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 523.25);
        pixels.clear();
        pixels.setPixelColor(16, pixels.ColorHSV(map(523.25, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);
        tone(D8, 587.33);
        pixels.clear();
        pixels.setPixelColor(17, pixels.ColorHSV(map(587.33, 523.25,880,0,300), 50, 50));
        pixels.show();
        delay(200);}