Arduino – p5.js Keyboard

Du hast Lust dir mit deinem Arduino und p5.js ganz einfach ein Musik-Keyboard zu bauen? Dann bist du hier richtig!

Arduino p5.js Musik-Keyboard

In diesem Tutorial zeige ich dir, wie du ein Musik-Keyboard mit einem Arduino und p5.js bauen kannst.

Im Gegensatz zu vielen anderen Projekten geben wir die Töne nicht über einen kleinen Arduino-Lautsprecher aus – sondern direkt über den Computerlautsprecher.

Das heißt: Der Arduino erkennt nur die Tastendrücke, der Computer erzeugt den Klang.

Was brauchst du dafür?

  • 1x Arduino Uno (oder kompatibel)

  • 8x Taster

  • Jumper Kabel

  • Breadboard

  • USB-Kabel für Arduino

  • Computer mit Internetzugang (für p5.js)

  • Die Libraries: p5.js und p5.serialport

Schaltplan

Bild des Schaltplan

Überblick über die Funktionsweise

Der Arduino erkennt, wenn eine Taste gedrückt oder losgelassen wird.

Er sendet über die serielle Schnittstelle (USB) ein kurzes Textsignal an den Computer (z.B. "C" oder "stop").

Die p5.serialport-Library öffnet einen seriellen Port im Browser und wartet auf die eingehenden Signale.

Der Browser empfängt die Signale mit Hilfe von p5.js.

Der Browser spielt die passende Frequenz über die Computerlautsprecher ab.

Arduino Code

Du brauchst folgenden Code im Arduino-Programm:

const int buttonPins[8] = {2, 3, 4, 5, 6, 7, 8, 9};
bool lastStates[8] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
const char* tones[8] = {"C", "D", "E", "F", "G", "A", "H", "C2"};

void setup() {
  for (int i = 0; i < 8; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 8; i++) {
    bool currentState = digitalRead(buttonPins[i]);
    
    if (lastStates[i] == HIGH && currentState == LOW) {
      Serial.println(tones[i]); // Taste gedrückt
      delay(5);
    } else if (lastStates[i] == LOW && currentState == HIGH) {
      Serial.println("stop"); // Taste losgelassen
      delay(5);
    }

    lastStates[i] = currentState;
  }
}

Erklärung des Codes

  • buttonPins enthält die Pins, an denen die Taster angeschlossen sind.

  • lastStates speichert den letzten Zustand jeder Taste (wichtig, um Veränderungen zu erkennen).

  • tones ordnet jedem Taster einen musikalischen Ton zu.

In setup():

  • Alle Pins werden als Eingänge definiert, dabei wird der interne PullUp-Widerstand aktiviert. Das heißt: Die Pins sind standardmäßig HIGH und gehen auf LOW, wenn die Taste gedrückt wird.

  • Die serielle Verbindung wird mit Serial.begin(9600) gestartet. Der Computer kann jetzt Text vom Arduino empfangen.

In loop():

  • Jede Taste wird abgefragt.

  • Wird eine Taste gedrückt (Übergang von HIGH zu LOW), wird der zugehörige Ton über Serial.println() gesendet.

  • Wird eine Taste losgelassen (Übergang von LOW zu HIGH), wird das Signal stop gesendet.

  • Ein kleines delay(5) verhindert Prellen der Kontakte.

p5.js-Programm

Jetzt kommen wir zur Visualisierung und zum Ton auf dem Computer.

let serial;
let latestData = "waiting for data";
let osc;
let noteFreqs = {
  "C": 261.63,
  "D": 293.66,
  "E": 329.63,
  "F": 349.23,
  "G": 392.00,
  "A": 440.00,
  "H": 493.88,
  "C2": 523.25
};

function setup() {
  createCanvas(400, 200);
  textSize(16);
  background(220);
  text("Warte auf Tasten...", 10, 30);

  osc = new p5.Oscillator('sine');
  osc.amp(0);
  osc.start();

  serial = new p5.SerialPort();
  serial.list();
  serial.open('/dev/tty.usbmodem1301'); // Hier  deinen Port anpassen!
  serial.on('connected', () => print("Verbunden"));
  serial.on('list', gotList);
  serial.on('data', gotData);
  serial.on('error', print);
  serial.on('open', () => print("Port geöffnet"));
  serial.on('close', () => print("Port geschlossen"));
}

function gotList(thelist) {
  for (let i = 0; i < thelist.length; i++) {
    print(i + ": " + thelist[i]);
  }
}

function gotData() {
  let currentString = serial.readLine().trim();
  if (!currentString) return;

  latestData = currentString;
  console.log("Empfangen:", latestData);

  if (noteFreqs.hasOwnProperty(latestData)) {
    osc.freq(noteFreqs[latestData]);
    osc.amp(0.5, 0.05);
  } else if (latestData === "stop") {
    osc.amp(0, 0.05);
  }
}

function draw() {
  background(255);
  fill(0);
  text("Letzte Eingabe: " + latestData, 10, 20);
}

function mousePressed() {
  userStartAudio();
}

Erklärung des Code

  • noteFreqs ist ein Objekt, das jedem Ton den richtigen Frequenzwert (in Hertz) zuordnet.

  • osc ist ein Oszillator mit dem in p5.js Töne über Frequenten erzeugt werden können.

  • serial ist das Objekt, mit dem wir den seriellen Port steuern.

In setup():

  • Ein Fenster (Canvas) wird erstellt.

  • Ein Oszillator wird initialisiert, aber die Lautstärke auf 0 gesetzt.

  • Die serielle Verbindung wird gestartet:

    • serial.list() zeigt alle verfügbaren Ports an (hilfreich, wenn du deinen Port suchst).

    • serial.open() öffnet den Port – hier musst du deinen eigenen Portnamen eintragen!

    • Verschiedene Events (connected, list, data, etc.) sorgen dafür, dass wir auf Verbindungsstatus und eingehende Daten reagieren können.

In gotData():

  • Eingehende Zeilen werden gelesen und gespeichert.

  • Wenn eine bekannte Taste (C, D, etc.) empfangen wird, wird der Oszillator auf die richtige Frequenz eingestellt und hörbar gemacht.

  • Wenn stop empfangen wird, wird der Ton leise gestellt.

In draw():

  • Der Bildschirm wird bei jedem Frame neu gezeichnet und zeigt den aktuell empfangenen Text an.

In mousePressed():

  • Um Sicherheitsvorgaben moderner Browser zu erfüllen, muss der Nutzer einmal klicken, um Audio zu aktivieren.

Anpassung des HTML-Code

In den <script>-Tags binden wir externe Bibliotheken ein, die unser Projekt braucht:

  • p5.js ist die Hauptbibliothek für kreatives Programmieren im Browser (z.B. für Zeichnungen und Animationen).

  • p5.sound erweitert p5.js, damit wir ganz einfach Töne und Klänge erzeugen können.

  • p5.serialport ermöglicht die Verbindung zwischen Arduino und p5.js über die serielle Schnittstelle (USB), damit wir Tastenanschläge vom Arduino im Browser nutzen können.

Am Ende wird mit einem weiteren <script> unser eigener p5.js Code eingebunden.

Fertig!

Und so einfach gehts! Jetzt hast du dein eigenes digitales Musik-Keyboard gebaut!

Du kannst die Töne einfach spielen, indem du die Tasten auf deinem Arduino-Board drückst – und dein Computer erzeugt die Musik.

Wie das ganze sich dann anhört kannst du im Video unten anschauen.

Quelle:

Für unser Projekt haben wir uns hier inspireieren Lassen: https://diyelectromusic.com/2020/06/01/simple-arduino-music-keyboard/

Schlagworte


© 0t1

Cookies

0t1 mag keine Kekse (und kein Tracking). Wir verwenden lediglich notwendige Cookies für essentielle Funktionen.

Wir verwenden Schriftarten von Adobe Fonts. Dafür stellt dein Browser eine Verbindung zu den Servern von Adobe in den USA her. Wenn du unsere Seite nutzen möchtest, musst du dich damit einverstanden erklären.

Weitere Informationen in unserer Datenschutzerklärung.