Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
techniken:datenaustausch:serialchars [2015/01/14 22:29] fbonowski [Erweiterung auf Kommandos mit dazugehörigen Zahlenwerten] |
techniken:datenaustausch:serialchars [2016/01/21 12:45] (aktuell) |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Kommandos in Form von einzelnen Zeichen an den Arduino senden ====== | + | ====== Übermittlung von Kommandos und Daten vom PC zum Arduino ====== |
+ | In diesem Artikel ist beschrieben, wie ihr | ||
+ | * Arduino-Programme mittels einfacher Kommandos vom PC aus 'fernsteuern' könnt. | ||
+ | * Zahlen vom PC an den Arduino übermitteln könnt. | ||
+ | Beide Mögglichkeiten können problemlos mit dem [[techniken:datenaustausch:processingserialread|Senden von Daten vom Arduino zum PC]] kombiniert werden. | ||
+ | |||
+ | Dazu verwenden wir die Serielle Schnittstelle des Arduinos, die ihr bereits aus dem 'Serial Monitor' kennt. Ihr könnt also einfach den Serial-Monitor nutzen, um manuell Daten an den Arduino zu schicken - z.B. um zu testen, ob er auf Kommandos so reagiert wie ihr es erwartet. Wirklich spannend wird es aber, wenn ihr ein eigenes Programm (z.B. ein Processing-Sketch) schreibt, welches die Serielle Schnittstelle verwendet, um dem Arduino vollautomatisch Befehle zu übermitteln. | ||
+ | |||
+ | In allen Fällen muss der Arduino mit einem Kabel mit dem PC verbunden sein - denn über dieses Kabel werden die Daten in Form von Elektrischen Impulsen übertragen... | ||
+ | ===== Kommandos in Form von einzelnen Zeichen an den Arduino senden ===== | ||
Die einfachste Art und Weise, einen Befehl vom PC an den Arduino zu übermitteln, ist, ihm einzelne Zeichen über die Serielle Schnittstelle zu schicken, die ein Programm auf dem Arduino auswertet. | Die einfachste Art und Weise, einen Befehl vom PC an den Arduino zu übermitteln, ist, ihm einzelne Zeichen über die Serielle Schnittstelle zu schicken, die ein Programm auf dem Arduino auswertet. | ||
Zeile 11: | Zeile 20: | ||
* Eine Funktion aufrufen, die das erledigt, was dem Befehl entspricht (im Befehlsblock (geschweifte Klammern) von ''if'' oder ''switch case'') | * Eine Funktion aufrufen, die das erledigt, was dem Befehl entspricht (im Befehlsblock (geschweifte Klammern) von ''if'' oder ''switch case'') | ||
- | ===== Ein Bespielprogramm mit 2 alternativen Befehlen (LED an/aus) ===== | + | ==== Ein Beispielprogramm mit 2 alternativen Befehlen (LED an/aus) ==== |
Das Beispiel ''libraries/Serial/SimpleWrite'' in Processing enthält sowohl den Processing, als auch den Arduino Code, um mit der Maus eine LED auf dem Arduino ein- und ausschalten zu können. Hier ein kleiner Ausschnitt mit den wichtigsten Teilen auf Arduinoseite: | Das Beispiel ''libraries/Serial/SimpleWrite'' in Processing enthält sowohl den Processing, als auch den Arduino Code, um mit der Maus eine LED auf dem Arduino ein- und ausschalten zu können. Hier ein kleiner Ausschnitt mit den wichtigsten Teilen auf Arduinoseite: | ||
Zeile 58: | Zeile 67: | ||
} | } | ||
</code> | </code> | ||
- | ===== Erweiterung auf Kommandos mit dazugehörigen Zahlenwerten ===== | + | ===== Übertragen von Zahlenwerten (als menschenlesbarer ASCII-Text) ===== |
In vielen Fällen wollen wir nicht nur ein Kommando übertragen ("fahre geradeaus"), sondern auch dazugehörige Zahlenwerte ("wie lange?" , "wie schnell?", "wie weit?"). | In vielen Fällen wollen wir nicht nur ein Kommando übertragen ("fahre geradeaus"), sondern auch dazugehörige Zahlenwerte ("wie lange?" , "wie schnell?", "wie weit?"). | ||
- | Das geht ganz einfach mit den beiden Befehlen ''Serial.parseInt()'' (für Ganzzahlen) oder ''Serial.parseFloat()''. | + | Das geht ganz einfach mit den beiden Befehlen [[http://arduino.cc/en/Serial/ParseInt|Serial.parseInt()]] (für Ganzzahlen) oder [[http://arduino.cc/de/Reference/StreamParseFloat|Serial.parseFloat()]] (Für Kommazahlen). |
- | Beide Befehle lesen solange Daten aus der seriellen Schnittstelle, bis entweder längere Zeit nichts mehr gekommen ist ("timeout") oder das nächste Zeichen nicht mehr Teil einer Zahl sein kann (also irgendetwas ausser 0...9 oder '.' ist). | + | Beide Befehle lesen solange Daten aus der seriellen Schnittstelle, bis entweder längere Zeit nichts mehr gekommen ist ("timeout") oder das nächste Zeichen nicht mehr Teil einer Zahl sein kann (also irgendetwas ausser 0...9, '+', '-' oder '.' ist). |
+ | |||
+ | //**Achtung**//: Als Dezimaltrennzeichen wird (wie eigentlich immer beim Programmieren) der **Punkt** (anstelle des **Kommas**) verwendet. | ||
Zum Steuern eines Roboters könnten wir z.B. die Kommandos 'l' für "links" und 'r' für "rechts" verwenden, die jeweils von einer Zahl gefolgt sind, die angibt, wieviel Gas der entsprechende Motor geben soll. Ein kompletter Befehl, der so in den Serial-Monitor eingegeben oder von Processing verschickt werden kann wäre also z.B. 'l100' oder 'r-20'. | Zum Steuern eines Roboters könnten wir z.B. die Kommandos 'l' für "links" und 'r' für "rechts" verwenden, die jeweils von einer Zahl gefolgt sind, die angibt, wieviel Gas der entsprechende Motor geben soll. Ein kompletter Befehl, der so in den Serial-Monitor eingegeben oder von Processing verschickt werden kann wäre also z.B. 'l100' oder 'r-20'. | ||
Zeile 85: | Zeile 96: | ||
break; // höre hier auf. | break; // höre hier auf. | ||
} | } | ||
- | case default: // bei uns unbekannten Kommandos machen wir einfach garnichts... | + | default: // bei uns unbekannten Kommandos machen wir einfach garnichts... |
break; | break; | ||
} | } | ||
Zeile 104: | Zeile 115: | ||
void setup() { | void setup() { | ||
- | // Wir lassen uns von der Serial-Klasse zunächst eine Liste der Namen der am PC vorhandenen Ports geben( 'Serial.list()') | + | // Um den Namen der Schnittstelle herauszufinden, lassen wir uns von der Serial-Klasse zunächst |
- | // Dann nehmen wir und den letzten (Serial.list().length-1) Namen aus der Liste heraus (String portName=Serial.list()[Serial.list().length-1]) | + | // eine Liste der Namen der am PC vorhandenen Ports geben ('Serial.list()') |
- | // Und verbinden uns mit diesem Port mit der Baudrate 115200 (new Serial(this, portName, 115200)). | + | // Den x'ten Eintrag aus dieser Liste bekommen wir mit 'Serial.list()[x-1]' (die indices fangen mit 0 an) |
- | + | ||
- | String portName = Serial.list()[Serial.list().length-1]; // finde den Namen des letzten Serialports heraus | + | // Bei den meisten PCs ist der Arduino der letzte Port in der Liste. |
- | myPort = new Serial(this, portName, 115200); // Erzeuge ein Serial Objekt und stelle Eine Verbindung mit 115200 Baus her | + | // Deshalb ermitteln wir zunächst die Länge der Liste (Serial.list().length) |
+ | // und nehmen uns den letzten Namen aus der Liste heraus (Serial.list()[Serial.list().length-1]) | ||
+ | |||
+ | String portName = Serial.list()[Serial.list().length-1]; // finde den Namen des letzten Serialports heraus. | ||
+ | int baudrate=115200; // Diese Baudrate muss mit der in eurem Arduinoprogramm übereinstimmen. | ||
+ | // String portName = "COM1"; // alternativ: verwende stattdessen einen bekannten Portnamen | ||
+ | myPort = new Serial(this, portName, baudrate); // Erzeuge ein Serial Objekt und stelle eine Verbindung her | ||
+ | | ||
size(300, 300); // mache das Fenster etwas größer | size(300, 300); // mache das Fenster etwas größer | ||
} | } |