Arduino: Orchester aus alten PC Lüftern

In meinem letzten Beitrag habe ich beschrieben wie ich es geschafft habe mit dem Arduino anzufangen. Jetzt will ich gleich von meinem ersten Projekt erzählen. Die Idee ist über MIDI ein Orchester aus alten PC Lüftern zu steuern. Hier will ich beschreiben wie das klappt.

MIDI empfangen

Als erstes habe ich in der Suchmaschine deren Name nicht genannt werden darf gesucht ob schon andere etwas ähnliches gemacht haben. Es gab dann auch tatsächlich einige ähnliche Projekte und sogar eine fertige MIDI-Bibliothek. Also die gibt es immer noch. Dann hab ich mir das erstmal etwas angeschaut. Auf dieser Seite gibt es eine gute Einführung in MIDI. Auf der gleichen Seite ist dann auch noch eine Anleitung um MIDI auf dem Arduino zu nutzen . Diese Anleitung ist zum Verständnis echt nützlich. Wenn man aber nachher wirklich etwas mit MIDI machen möchte nutzt man vielleicht lieber die Arduino MIDI-Bibliothek. Dann muss man sich nicht mehr mit Fehlern beim MIDI Empfang beschäftigen sondern kann direkt eine Anwendung basteln. Wie man die nutzt und gleich noch die Elektronik aufbaut ist hier anschaulich beschrieben.

Wenn man ein Arduino und ein Breadbord hat sollte bis hierhin alles zu machen sein. Zum testen hatte ich einfach ein USB-zu-MIDI Gerät genutzt. Wenn man sich mit der Elektronik nicht ganz so sicher ist wird vor allem die Zweite Anleitung helfen (ich meine diese). Ansonsten gibt es die Elektronik scheinbar auch schon Komplett zu kaufen. Ich hab das aber nicht getestet.

Töne machen

Danach kann man sich Gedanken machen wie man einen Ton dann ausgibt. Also das MIDI-Signal in ein Geräusch auf dem Lüfter verwandelt. Dafür schließt man an den Lautsprecher auf dem der Ton erklingen soll an einen GPIO (irgendein Ausgang mit einer Nummer) des Arduino an. Dann schaltet man diesen Ausgang in einer hohen Frequenz an und aus. Diese Frequenz ist dann die Frequenz in der der Lautsprecher schwingt. Also die Frequenz des Tones den man hört. Das ist hier alles nochmal genauer beschrieben. Mithilfe von Wikipedia, dieser Formel und dieser Tabelle habe ich dann eine Funktion geschrieben die die passenden Frequenzen berechnen soll:

int getTone(int noteByte) {

//an Octave
static const int tones[] = {
8372 / 2,//c
8870 / 2,//c#
9397 / 2,//d
9956 / 2, //d#
10548/ 2,//e
11175 / 2,//f
11840 / 2,//f#
12544 / 2,//g
13290 / 2,//g#
14080 / 2, //a
14917/ 2,//a#
15804 / 2 //h
};

//find the right octave, then calculate the Frequency
if (noteByte >= 120)
return tones[noteByte - 120];
//8
if (noteByte >= 108)
return tones[noteByte - 108] / 2;
//7
if (noteByte >= 96)
return tones[noteByte - 96] / 4;
//6
if (noteByte >= 84)
return tones[noteByte - 84] / 8;
//5
if (noteByte >= 72)
return tones[noteByte - 72] / 16;
//4
if (noteByte >= 60)
return tones[noteByte - 60] / 32;
//3
if (noteByte >= 48)
return tones[noteByte - 48] / 64;
//2
if (noteByte >= 36)
return tones[noteByte - 36] / 128;
//1
if (noteByte >= 24)
return tones[noteByte - 24] / 256;
//0
if (noteByte >= 12)
return tones[noteByte - 12] / 512;
//-1
if (noteByte >= 0)
return tones[noteByte - 0] / 1024;
return 0;

}

 Eine Oktave habe ich einfach berechnet der Rest wird davon abgeleitet. Wenn es effizienter oder eleganter geht würde ich mich über eine Verbesserung freuen. (Update: dank tipps von gehaxelt und otori sieht es schon besser aus)

In meinem Fall ist der Lautsprecher halt ein alter PC-Lüfter. Der ist natürlich nicht dafür gemacht. Aber interessanter Weise kann man damit auch Töne erzeugen. Der Motor des Lüfters wird einfach genauso gesteuert wie irgend ein anderer Lautsprecher. Nur man brauch jetzt etwas mehr Strom deswegen steure ich die Lüfter über Transistoren. Das hat auch schon geklappt. Um das etwas klarer zu machen habe ich hier den Schaltplan hinzugefügt:

mit Fritzing erstellter Schaltplan

Schaltplan vom Projekt

mit Fritzing erstellte Ansicht

Ansicht

Bisher nur ein Solo

Bis dahin hat auch so gut wie alles geklappt. Was jetzt noch nicht geht ist die Wiedergabe von mehreren Tönen gleichzeitig. Bisher habe ich nur ein Solo oder eben mehrere Lüfter parallel. Ein Orchester ist es noch nicht. Momentan nutze ich die tone() Funktion aus der Arduino-Bibliothek. Die geht aber leider nur für einen Ton gleichzeitig. Das ist aber ein Problem das man lösen kann. Auf einem Blog beschreibt jemand wie er das macht. Leider wird dort die kuschelige Arduino-Welt mit all den Komfortfunktionen etwas verlassen. Dort werden direkt Bits auf dem Mikroprozessor gesetzt. Bisher kann ich das noch nicht. Nichtsdestotrotz habe ich das Projekt auf Github hochgeladen da kann man mir zuschauen wie ich vorankomme. Natürlich kann man mir da auch helfen. Wäre doch schade wenn es beim Solo bleibt.