Android mit Arduinoâ„¢ Due. Manuel di Cerbo
und Arduino Due
Bild 2.7: Die USB-Verbindung mit dem USB-serial converter.
Zum Testen der seriellen Verbindung schreiben wir ein kleines Programm, welches die Groß- und Kleinschreibung aller eingehenden Buchstaben umkehrt und die veränderten Symbole wieder an den Computer zurückschickt. Dabei ist zu beachten, dass die Symbole im ASCII-Format codiert sind. Es wird jeweils ein Byte übertragen, welches einen Wert zwischen 0 und 255 haben kann. Der Wert 65 entspricht dabei einem groß geschriebenen »A«. Ein großes »B« hat den Wert 66 und so weiter bis »Z« (90). Die klein geschriebenen Buchstaben starten mit »a« bei 97. Eine vollständige ASCII-Tabelle findet man zum Beispiel unter http://www.asciitable.com im Internet.
Tabelle 2.1: Dezimale ASCII-Werte der Buchstaben von A bis Z
int input;
int output;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available() > 0){
input = Serial.read();
if(64 <= input && input <= 90 ){ // upper case input
output = input + 32;
Serial.write(output);
} else if(97 <= input && input <= 122) { // lower case
// input
output = input – 32;
Serial.write(output);
} else if(input == 32){ // space bar
output = input;
Serial.write(output);
}
else {
Serial.println();
}
}
}
Kompilieren Sie das obige Programm und laden Sie es auf den Arduino. Nun starten wir den Serial Monitor durch Klick auf das Lupen-Symbol oben rechts in der Arduino IDE.
Bild 2.8: Das Lupen-Symbol zum Start des Serial Monitor.
Es öffnet sich ein neues Fenster mit dem Serial Monitor. Beachten Sie, dass die verwendete Baudrate unten rechts auf 9600 eingestellt ist (vgl. Bild 2.9), da wir diese Geschwindigkeit auch im obigen Programm mit Serial.begin(9600) konfiguriert haben. Schreiben Sie nun ein paar Buchstaben und bestätigen Sie mit Enter oder durch Klick auf Send. Als Antwort erhalten Sie dieselben Wörter mit invertierter Groß- und Kleinschreibung.
Bild 2.9: Hello World im Serial Monitor.
Ein Serial Monitor eignet sich übrigens auch sehr gut zum Debuggen von Programmen, indem einfach an den entsprechenden interessanten Stellen Nachrichten herausgeschrieben werden. Neben dem integrierten Serial Monitor gibt es noch eine Menge anderer sogenannter Terminal-Programme. Einige davon bieten nützliche Zusatzfunktionen, wie zum Beispiel die Darstellung der erhaltenen Daten im Dezimal-, Hex- oder Binärformat. Der integrierte Serial Monitor von Arduino versucht die empfangenen Daten immer als ASCII-Symbole darzustellen. Sehr zu empfehlen ist zum Beispiel das frei erhältliche Terminal-Programm HTerm für Windows/Linux (www.der-hammer.info/terminal/). Im folgenden Bild ist die gleiche Ausgabe in HTerm dargestellt. Das kleine »h« am Anfang entspricht dem Hexadezimalwert »0x68« beziehungsweise dem Dezimalwert »104« oder dem Binärwert »01101000«. Beachten Sie bei der Verwendung von externen Terminal-Programmen, dass jeweils nur ein Computer-Programm mit dem virtuellen COM-Port verbunden sein kann. Trennen Sie also die Verbindung im Terminal-Programm, bevor Sie einen neuen Sketch auf den Arduino laden. Als Verbindungsparameter verwenden Sie natürlich die entsprechende Baudrate. Die Konfiguration ist standardmäßig »8 data bits, no parity, one stop bit«, was manchmal auch als 8N1 bezeichnet wird.
Bild 2.10: Ein empfehlenswertes Terminal-Programm für den Arduino: HTerm.
2.6 LED-Intensität steuern über serielle Konsole
Das vorherige Arduino-Programm hat gezeigt, wie man zwischen Arduino Due und einem Host-Computer kommunizieren kann. In einem weiteren Schritt soll nun abhängig von den empfangenen Daten die Helligkeit der On-board-LED eingestellt werden.
Der benötigte Sketch ist erstaunlich einfach.
#define LED 13
void setup()
{
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop(){
char cmd = 0;
if(Serial.available()){
cmd = Serial.read();
analogWrite(LED,cmd);
}
}
Dieser Sketch empfängt einzelne Bytes über die serielle Verbindung und setzt den LED-Pin mit der Funktion analogWrite(). Mit analogWrite() wird an den entsprechenden Pin ein PWM-Signal gesetzt. Unter der Bezeichnung »PWM« verbirgt sich die Pulsweitenmodulation. Bei der Pulsweitenmodulation wird ein Signal für eine gewisse Zeit eingeschaltet und auch für eine gewisse Zeit ausgeschaltet. Dies wiederholt sich periodisch und meistens mehrere hundert Mal pro Sekunde. Die PWM-Frequenz des Arduino ist zum Beispiel 490 Hz. Also wiederholt sich diese Sequenz 490 Mal pro Sekunde und dauert 1/490 Hz = 2,04 ms oder ungefähr 2 Millisekunden. Die Funktion analogWrite() erwartet nebst der Pin-Nummer auch einen »value«-Parameter zwischen 0 und 255. Dieser Parameter legt fest, wie lange das Signal während der 2 Millisekunden eingeschaltet ist. Ein Wert von 0 bedeutet, dass es nie eingeschaltet ist, die LED ist also komplett dunkel. Mit einem Wert von 255 bleibt sie immer eingeschaltet, die LED leuchtet also mit voller Kraft. Ein Wert von 128 bedeutet, dass die LED die Hälfte der Zeit eingeschaltet ist, sie leuchtet also mit halber Kraft. Diese Beziehung ist auch in Bild 2.11 dargestellt. Im Zusammenhang mit PWM-Signalen kommt häufig auch der Begriff Duty-Cycle zum Einsatz. Ein Duty-Cycle von 50 % zum Beispiel bedeutet, dass das PWM-Signal im Mittel 50 % der Zeit eingeschaltet ist. Dies wird mit einem Aufruf von analogWrite(LED, 128) erreicht. Wie bereits erwähnt, hat die PWM-Frequenz des Arduino, welche durch die Funktion analogWrite() erzeugt wird, einen festen Wert von ca. 490 Hz. Um eine LED zu steuern, ist diese Frequenz gut geeignet. Obwohl die LED in Tat und Wahrheit viele Male ein- und ausgeschaltet wird, können wir kein Flackern feststellen. Je nach Anwendung muss die PWM-Frequenz aber angepasst werden. Ein herkömmlicher Servo zum Beispiel erwartet eine Frequenz von 50 Hz, welche mit Hilfe der Arduino Servo Library in einem späteren Beispiel (vgl. Kapitel 8 Servo mit Android ansteuern) erzeugt werden kann.
Bild 2.11: Die Pulsweitenmodulation zur Steuerung der LED-Intensität.
Wenn Werte über die serielle Verbindung von einem Host-Computer gesendet werden, dann sollte beachtet werden, dass die empfangenen Bytes auf dem Arduino »roh« gelesen und als Zahl zwischen 0 und 255 interpretiert werden. Mit dem integrierten Serial Monitor (Tools > Serial Monitor oder CTRL+SHIFT+M) werden alle Daten in ASCII codiert. Ein großes »A« entspricht dabei dem Wert 65, und ein kleines »z« entspricht dem Wert 122. Senden Sie also abwechselnd diese zwei Buchstaben. Es sollte ein Unterschied in der Lichtstärke der On-board-LED erkennbar sein. Achten Sie auch darauf, dass unten rechts No line encoding eingestellt ist. Sonst wird nach jedem Senden noch ein konstantes Sonderzeichen (New Line und/oder Carriage