Schaltungen

So bauen Sie eine Luftgitarre mit Arduino, Aka the AIRduino Guitar: 5 Schritte

AIRduino Guitar

AIRduino Guitar

Inhaltsverzeichnis:

Anonim

  • Die Idee dabei ist, eine tragbare virtuelle Gitarre zu bauen, die mit zwei Händen gesteuert werden kann, ähnlich wie beim Spielen von Air Guitar. Es wurde in einem zweiwöchigen Projekt bei erstellt und prototypisiert ChalmersUniversität (Schweden) für eine Physical Computing Klasse.

    Ziel ist es, das Gefühl zu bekommen, eine echte Gitarre zu spielen. Die AIRduino-Gitarre besteht aus einem Handschuh und einem Schläger.Der Handschuh wird verwendet, um den Ton einzustellen, und der Stock, um den Ton auszulösen.

    Um einen solchen Trick auszuführen, verwendeten wir einen Beschleunigungsmesser und einen Ultraschallsensor (siehe Schritt 1 für eine Konzeptbeschreibung).

    Schauen Sie sich die Video-Demo an, um eine genauere Vorstellung davon zu bekommen, wie es funktioniert, und machen Sie sich an die Arbeit, um Ihre eigenen zu bauen!


    Das AIRduino-Team:

    David Fournier, Jean-Louis Giordano, Monireh Sanaei, Maziar Shelbaf und Gustav Sohtell.

    Zubehör:

    Schritt 1: Konzeptbeschreibung

    Die Air Guitar soll als Rechtshänder-Gitarre arbeiten.
    Der Gitarren-Controller ist in zwei Teile unterteilt, den linken und den rechten Controller.
    Mit dem linken Controller kann der Spieler seine Finger beugen und auf den Handschuh drücken, um die Tonhöhe zu ändern.
    Der rechte Controller wird durch einen Stick dargestellt, der geschüttelt werden muss, um den Klang der Luftgitarre auszulösen.
    Der Spieler kann auch den Abstand zwischen rechter und linker Hand ändern, um die Töne zu verändern und die verschiedenen Bünde am Gitarrenhals zu simulieren.
    Um solche Tricks auszuführen, sind die Hauptkomponenten ein Beschleunigungsmesser zum "Fühlen" des Stickshakes, ein gehackter Ultraschallsensor zum Messen des Abstands zwischen der rechten Hand und dem Stick und leitfähiges Gewebe zum Herstellen des Handschuhs.
    Alles in allem ist es ein ziemlich einfach zu bauendes Spielzeug. Der einzige schwierige Teil wäre der Ultraschall-Sensor-Hack, der etwas Fingerspitzengefühl erfordert. Sie benötigen einige grundlegende elektronische Kenntnisse, um die Anweisungen zu verstehen und um herauszufinden, was Sie falsch gemacht haben, als Sie etwas vermasselt haben und die Gitarre am Ende nicht funktioniert. Wir waren dort. :-)

    Schritt 2: Einkaufsliste

    Hier ist eine Liste von Dingen, die Sie benötigen, um Ihre eigene AIRduino-Gitarre zu bauen:
    1. Drähte: leider viel für diese Prototypversion. Sie wurden verwendet, um die beiden Handschuhe und die Arduino-Teile miteinander zu verbinden. Fühlen Sie sich frei, diesen Teil des Designs zu verbessern, indem Sie es drahtlos machen!
    2. Beschleunigungsmesser: Wird im Stab in der rechten Hand verwendet, um das Zittern zu erkennen. Wir haben einen dreiachsigen Beschleunigungsmesser verwendet, aber eine einzige Achse reicht aus
    3. Ultraschallsensor: Zum Messen des Abstands zwischen beiden Händen des Players wurde Parallax # 28015 verwendet
    4. Leitfähiges und dehnbares Gewebe: um den Handschuh zu bauen,
    5. Arduino: Der Kern der Gitarre, der sich um alles kümmert. Ein Arduino Diecimila funktioniert gut.
    6. Potentiometer: Zum Einstellen einiger Einstellungen ist ein Potentiometer mit einem Maximalwert von 1KOhm-1MOhm in Ordnung.
    7. Schmelzkleber: ein bequemer Weg, um Dinge zusammenzuhalten,
    8. 3,5-mm-Buchse: für den Audioausgang verwendet,
    9. Klassisches elektronisches Zeug: Widerstände (10k), Kondensator (10uF), LEDs und eine Art Netzteil für das Arduino. (Eine 9V Batterie reicht völlig aus).

    Schritt 3: Schaltpläne

    Hier sind die elektronischen Schaltpläne für die AIRduino-Gitarre.
    Wie Sie sehen, ist es ziemlich einfach zu verstehen und daher auch zu bauen.
    Schauen Sie sich das Bild an, wenn Sie wissen möchten, welche Komponente wohin gehört. Wie Sie wahrscheinlich verstehen, ist dies in keiner Weise maßstabsgetreu. Die Kabel sind viel länger als im Schaltplan gezeigt.
    Möglicherweise haben Sie auch bemerkt, dass sich der Sender des Ultraschallsensors auf dem Stick und der Empfänger auf der linken Seite befindet. Das ist der schwierige Teil, den ich bereits erwähnt habe: Sie müssen den Ultraschallsender von der Ultraschallsensoreinheit ablöten, um ihn von der Sensorplatine zu trennen.
    Mehr dazu in späteren Schritten. Jetzt lass uns an die Arbeit gehen!

    Schritt 4: Aufbau des Handschuhs

    Der Handschuh enthält einen Ultraschallempfänger und vier Tasten. Das ist es!
    Der Ultraschallempfänger befindet sich in der Blackbox, die auf einigen der folgenden Abbildungen zu sehen ist.
    Der Handschuh hat eine große Fläche, die nur auf der Arduino-Platine mit Masse verbunden ist. Wenn ein Finger gegen die Handfläche gedrückt wird, wird eine Verbindung zwischen dem leitenden Stoff auf dem Finger und der Handfläche hergestellt.
    Unten sehen Sie ein Bild von zwei verschiedenen Handschuhmodellen. Man hat abnehmbare Finger, wodurch beide Spieler mit sehr kleinen und sehr großen Händen spielen können. Das andere Modell wird direkt an einen Standardhandschuh angenäht. Ich würde die zweite Version empfehlen, sie ist einfacher zu erstellen und einfacher zu installieren.

    Schritt 5: Code

    Hier ist der Arduino-Code erforderlich:
    Der Teil zur Echtzeit-Klangerzeugung stammt aus diesem großartigen Tutorial.
    ------------------------------------------------------
    // Ein Array, das die Wellenform enthält
    // eines Gitarrensounds
    Zeichenwellenform =
    {125, 148, 171, 194, 209, 230, 252, 255,
    253, 244, 235, 223, 207, 184, 169, 167,
    163, 158, 146, 131, 126, 129, 134, 127,
    105, 80, 58, 51,38, 22, 12, 2, 10, 35,
    58, 75, 89, 103, 120, 141, 150, 148, 145,
    144, 140, 129, 116, 105, 95, 86, 75, 72,
    73, 76, 88, 103, 117, 121, 120, 115, 120,
    143, 159, 162, 156, 155, 163, 184, 202,
    214, 215, 211, 213, 212, 205, 196, 182,
    162, 142, 118, 99, 84, 68, 54, 40, 28,
    19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
    49, 59, 65, 75, 92, 110};
    // Wir verwenden diese Wellenform, um das zu ändern
    // Lautstärke der Ausgabe
    char waveVolume =
    {125, 148, 171, 194, 209, 230, 252, 255,
    253, 244, 235, 223, 207, 184, 169, 167,
    163, 158, 146, 131, 126, 129, 134, 127,
    105, 80, 58, 51,38, 22, 12, 2, 10, 35,
    58, 75, 89, 103, 120, 141, 150, 148, 145,
    144, 140, 129, 116, 105, 95, 86, 75, 72,
    73, 76, 88, 103, 117, 121, 120, 115, 120,
    143, 159, 162, 156, 155, 163, 184, 202,
    214, 215, 211, 213, 212, 205, 196, 182,
    162, 142, 118, 99, 84, 68, 54, 40, 28,
    19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
    49, 59, 65, 75, 92, 110};
    // Ein Array, das als zu vermeidender Puffer verwendet wird
    // fehlerhafte pünktliche Entfernung
    // Messungen
    unsigned int distance_buffer = {16000,
    16000, 16000, 16000, 16000, 16000, 16000,
    16000, 16000, 16000, 16000, 16000, 16000,
    16000, 16000, 16000};
    const int distance_length = 3;
    int distance_index = 0;
    // Die Überlaufwerte für 2 Oktaven
    int frequency = {39, 42, 44, 47,
    50, 52, 56, 59, 63, 66, 70, 74, 79,
    84, 89, 94, 100, 105, 112, 118, 126,
    133, 141, 149};
    // Anfangssteigung
    int pitch = 160;
    // Anfangsvolumen und Beschleunigung
    // parameter
    int lastAcc = 0;
    Schwimmervolumen = 0;
    // Audiowiedergabe an Pin 3
    Byte Speakerpin = 3;
    // Indexvariable für Position in
    // Wellenform
    flüchtiges Byte Wellenindex = 0
    flüchtiger Bytestromwert = 0;
    // Pin für Ultraschallsensor
    const int pingPin = 7;
    // Pins für die Potentiometer
    const int sustainPin = 1;
    const int sensitivityPin = 2;
    // Stifte für jeden Finger von links
    // Hand
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    lange Dauer, Zoll, cm;
    void setup () {
    PinMode (3, OUTPUT); // Lautsprecher an Pin 3
    pinMode (finger1, INPUT);
    pinMode (finger2, INPUT);
    pinMode (finger3, INPUT);
    pinMode (finger4, INPUT);

    /**************************
    PWM-Audiokonfiguration
    ****************************/
    // Timer2 auf schnellen PWM-Modus einstellen
    // (verdoppelt die PWM-Frequenz)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    // Interrupts jetzt aktivieren, die registriert werden
    // wurden gesetzt
    sei ();

    /*************************
    Timer 1 Interrupt Konfiguration
    *************************/
    // Interrupts deaktivieren während
    // Register sind konfiguriert
    cli ();
    / * Normaler Portbetrieb, Pins nicht angeschlossen
    aus dem Timer-Betrieb (Breaking PWM) * /
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    bitClear (TCCR1A, COM1A1);
    / * Modus 4, CTC, wobei TOP durch das Register eingestellt wird
    OCR1A. Ermöglicht die Einstellung eines variablen Timings für
    den Interrupt durch Schreiben neuer Werte auf
    OCR1A. * /
    bitClear (TCCR1A, WGM10);
    bitClear (TCCR1A, WGM11);
    bitSet (TCCR1B, WGM12);
    bitClear (TCCR1B, WGM13);
    / * Stellen Sie den Clock Prescaler auf / 8. * /
    bitClear (TCCR1B, CS10);
    bitSet (TCCR1B, CS11);
    bitClear (TCCR1B, CS12);
    / * Force Output Compare für deaktivieren
    Kanäle A und B. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Initialisiert Output Compare
    Registrieren Sie A bei 160, um die
    Anfangsabstand * /
    OCR1A = 160;
    // Eingangserfassungsinterrupt deaktivieren
    bitClear (TIMSK1, ICIE1);
    // Ausgabe deaktivieren
    // Vergleiche B Match Interrupt
    bitClear (TIMSK1, OCIE1B);
    // Ausgabe aktivieren
    // Vergleiche einen Match Interrupt
    bitSet (TIMSK1, OCIE1A);
    // Overflow Interrupt deaktivieren
    bitClear (TIMSK1, TOIE1);
    // aktiviere jetzt die Interrupts
    // Register wurden gesetzt
    sei ();
    }
    // Timer-Überlauf-Handler
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. Jedes Mal wenn es
    heißt es setzt den Speakerpin auf den
    nächster Wert in der Wellenform . Frequenz
    Die Modulation erfolgt durch Ändern der
    Timing zwischen aufeinanderfolgenden Aufrufen von
    Diese Funktion, z.B. für einen 1 kHz-Ton
    Stellen Sie das Timing so ein, dass es läuft
    1000-mal durch die Wellenform
    eine Sekunde. * /
    // setze den Wellenindex zurück, wenn er erreicht ist
    // das Ende des Arrays
    if (Wellenindex> 102) {
    Wellenindex = 0;
    }
    // Ausgabewert setzen
    if (Volumen> 0,03) {
    analogWrite (Speakerpin,
    WaveformVolume Waveindex);
    }
    waveindex ++;
    // Aktualisiere die Tonhöhe
    OCR1A = Tonhöhe;
    }

    leere Schleife ()
    {
    // Interputs deaktivieren, Ping senden
    // message und warte auf die Antwort.
    cli ();
    pinMode (pingPin, OUTPUT);
    digitalWrite (PingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (PingPin, LOW);
    duration = pulseIn (pingPin, HIGH, 2000);
    sei ();
    // Wandle die Zeit in eine Distanz um
    // in Zentimetern
    // und im Puffer speichern
    distance_buffer distance_index ++
    % distance_length = duration / 20;
    // Suche im Puffer den kürzesten
    // entfernung gemessen
    cm = 16000;
    für (int i = 0; i <distance_length; i ++) {
    cm = min (cm, distance_buffer i);
    }
    // Überprüfen Sie, welche Finger gedrückt sind
    fingerValue = 5;
    if (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    if (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    if (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    if (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    // Aktualisiere das Sustain und
    // empfindlichkeitswerte
    float Sustain =
    map (analogRead (sustainPin), 0,
    1024, 101, 130) / 100.0;
    Int Empfindlichkeit =
    map (analogRead (sensitivityPin),
    0, 1024, 100, 200);
    // Aktualisiere das Volume
    Lautstärke = Lautstärke / Sustain;
    if (Volumen <0) {
    Volumen = 0;
    }

    // Überprüfen Sie den Beschleunigungsmesser
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    // Aktualisiere den Volumenwert
    if (accDiff> 5 * (200 - Empfindlichkeit)) {
    volumen + = (float)
    pow (accDiff,
    Empfindlichkeit / 100,0) / 50000;
    }
    lastAcc = acc;
    // Stellen Sie sicher, dass die Lautstärke nicht höher als 1 ist
    if (volume> .95) {
    Volumen = 0,95;
    }
    // Aktualisiere die Lautstärke in der Wellenform
    für (int i = 0; i <= 102; i ++) {
    WaveformVolume i =
    ((Wellenform i - 127) * Lautstärke) + 127;
    }
    // Stellen Sie die Tonhöhe entsprechend der Entfernung ein
    // zwischen den beiden Händen und dem
    // Finger gedrückt
    if (cm <102 && cm> 0) {
    if (cm> 30) {
    Tonhöhe = Frequenzen 7 +
    (((cm - 30) / 24) * 4 + fingerValue - 1);
    }sonst{
    Abstand = Karte (cm, 0, 30, 39, 79);
    }
    }sonst{
    Tonhöhe = Frequenzen 7 +
    (((102 - 30) / 24) * 4 + fingerValue - 1);
    }
    // Verzögerung, um Signalreflexionen zu vermeiden
    Verzögerung (50);
    }
    ------------------------------------------------------