4.12 Externe Schnittstellen / Controller Board Arduino 4.12.1 USB, serielle Schnittstelle Universal Serial Bus (USB): serielles Bussystem zur Verbindung eines Computers mit externen Geräten. Vor USB gab es recht unterschiedliche Computer-Schnittstellen, fast alle diese Schnittstellenvarianten wurden durch USB ersetzt 1996 eingeführt, vom Hersteller Intel entwickelt 2000 Version USB 2.0 spezifiziert 2008 Version 3.0, Brutto-Datentransferrate bis zu 500 MBytes/s. serieller Bus: die einzelnen Bits eines Datenpaketes werden nacheinander übertragen. Geräteklassen: Audio (Lautsprecher, Mikro), Human Interface Device (Maus, Tastatur),... damit nicht jedes Gerät einen eigenen Treiber benötigt, definiert der USB-Standard verschiedene Geräteklassen -> generische Treiber 4.12.2 Controller Board Arduino Arduino: kleines Mikrocontroller Board, hier Uno USB-Anschluss, ext. Stromversorgung Prozessor: Microcontroller ATmega328 14 Digital I/O Pins (0 bzw. 5 V) 6 PWM Digital I/O Pins (Pulse-width modulation, var. U) 6 Analog Input Pins Flash Memory, SRAM, EEPROM Schwingquarz: Clock Speed 16 MHz 1 LED auf dem Board zu Testzwecken Preis für Arduino Uno: ca. 25 EURO Hardware-Spezifikation und Software ist Open Source (Quell-offen) An die Pins von Arduino können Daten-Ein- und Ausgänge angeschlossen werden, z.b. zum Schalten von LEDs, Relais, Motoren oder zum Einlesen von Signalen. Informatik 1
4.12.3 Arduino Sketches (C-Programme im IDE) integr. Entwicklungsumgebung (IDE) von Arduino-Seite herunterladen und installieren (Treiber) plattformunabhängige gg Java-Anwendung, basierend auf der IDE von Processing Programme heißen bei Arduino Sketch, Programmierung in C und C++ Für ein Programm genügt es, zwei Methoden zu definieren: setup() beim Start des Programms einmalig aufgerufen loop() wird immer wieder durchlaufen, solange das Board eingeschaltet ist. int ledpin = 13; // LED an Pin 13 angeschlossen void setup() { pinmode(ledpin, OUTPUT); // LED-Pin als Ausgang festlegen } void loop() { digitalwrite(ledpin, HIGH); // LED anschalten delay(1000); // 1 Sekunde (=1000 ms) warten digitalwrite(ledpin, LOW); // LED ausschalten delay(1000); // 1 Sekunde warten } Abschluss: Sketch im IDE kompilieren und auf das Board hochladen Arduino-IDE: Programmier-Tools, etc. Sketch Blink im Arduino-IDE, geladen unter Datei / Beispiele Kompilieren mit dem Icon ganz links (Häkchen) Hochladen mit dem Icon rechts daneben (Pfeil rechts) Serial Monitor mit dem Icon ganz rechts (Lupe), für Debug-Ausgaben mit der Klasse Serial durch die Methoden begin und println Informatik 2
4.12.4 Ansteuerung über MATLAB MATLAB-Umgebung für Arduino von der Mathworks-Seite herunterladen und installieren Wichtigstes Programm (Sketch):./ArduinoIO/pde/adioes/adioes.pde adioes.pde in die Ardino-IDE laden, kompilieren und auf das Board übertragen, ist der "Analog and Digital Input and Output Server for MATLAB" Jetzt läuft auf dem Board der Sketch adioes.pde und das Board ist in dem Zustand, Befehle von MATLAB zu empfangen und zu interpretieren Im MATLAB-Verzeichnis gibt es auch den M-File arduino.m, der ziemlich automatisch MATLAB mit dem Board verbindet - wir werden hier die Funktionalität von arduino.m NICHT verwenden, sondern die Verbindung Schritt für Schritt per Hand durchführen Es gibt außerdem M-Files für die MATLAB-Toolbox Simulink, die den Zugriff auf das Board über eine grafische Oberfläche noch viel komfortabler macht - verwenden wir hier aber auch nicht. Wir verwenden nur absolute Basis-Befehle von MATLAB zum Datenaustausch. MATLAB-Befehle zum Kontakt mit Arduino (1. Board an USB-Port anschließen) >> comport='com6'; % COM-Port für Arduino, siehe Systemsteuerung % keine serielle Schnittstelle angemeldet >> instrser = instrfind( 'Type', 'serial' ) instrser = [] % seriellen Port 'COM6' erzeugen >> a.aser = serial( comport,'baudrate',115200 ); % serielle Schnittstellen anzeigen >> instrser = instrfind( 'Type', 'serial' ) Serial Port Object : Serial-COM6 Communication Settings Port: COM6 BaudRate: 115200 Terminator: 'LF' Communication State Status: closed RecordStatus: off... Informatik 3
MATLAB-Befehle zum Kontakt mit Arduino (2. Port öffnen) % Port öffnen, vgl. Öffnen von binären Dateien mittels fopen >> fopen( a.aser ); % serielle Schnittstellen anzeigen >> instrser = instrfind( 'Type', 'serial' ) Serial Port Object : Serial-COM6 Communication Settings Port: COM6 BaudRate: 115200 Terminator: 'LF' Communication State Status: open RecordStatus: off Read/Write State TransferStatus: idle BytesAvailable: 0 ValuesReceived: 0 ValuesSent: 0 MATLAB-Befehle zum Kontakt mit Arduino (3. Erster Befehl an das Board) % Befehl mittels fwrite an Arduino senden: mehrere Bytes als Text (uchar) >> char( [57 57] ) ans = 99 % Befehl '99': Typ des Sketches bestimmen, der auf dem Board läuft >> fwrite( a.aser, [57 57], 'uchar' ); % Antwort vom Board mittels fscanf abholen, als Integer interpretieren: >> a.sktc = fscanf( a.aser, '%d' ) a = aser: [1x1 serial] sktc: 2 % 'Analog & Digital I/O + Encoders + Servos (adioes.pde) sketch detected!' Befehle an einen Port entsprechen den Befehlen zum Lesen und Schreiben in eine binäre Datei auf der Festplatte: fopen, fwrite, fscanf,... Der erste Parameter, hier a.aser, gibt an, wohin der Daten-Stream geht bzw. woher er kommt. Informatik 4
MATLAB-Befehle zum Kontakt mit Arduino (4. Onboard-LED an Pin 13 schalten) % Befehl 48: Pin 13 als Output definieren: % Befehl '0n1' = char( [48 97+13 49] ) >> pin = 13; >> val=1; % 'output' => 48 + val = '1' >> fwrite( a.aser, [48 97+pin 48+val], 'uchar' ); % Befehl 50: Pin 13 auf HIGH (Strom durch LED) % Befehl '2n1' = char( [50 97+13 49] ) >> dv = 1; >> fwrite( a.aser, [50 97+pin 48+dv], 'uchar' ); % Pin 13 auf LOW (LED ausschalten) % Befehl '2n0' = char( [50 97+13 48] ) >> fwrite( a.aser, [50 97+pin 48+0], 'uchar' ); MATLAB-Befehle zum Kontakt mit Arduino (5. Status von Pin 13 auslesen) % Befehl 49: Status von Pin 13 auslesen % Befehl '1n' = [49 97+pin]: reads digital pin #13 ('n') >> fwrite( a.aser, [49 97+pin], 'uchar' ); % Board sendet auf Befehl 49 Daten an MATLAB zurück % Wert von der Schnittstelle mittels fscanf lesen: >> val = fscanf( a.aser, '%d ') val = 0 % da LED ausgeschaltet wurde Kommunikation beenden: % COM-Port schließen >> fclose( a.aser ) % serielle Schnittstelle freigeben >> delete( a.aser ); Informatik 5
4.12.5 Literatur Arduino: http://arduino.cc/ http://arduino.cc/de/guide/homepage MATLAB: Arduino Support from MATLAB http://www.mathworks.de/hardware-support/arduino-matlab.html/ weitere Dokus: http://de.wikipedia.org/wiki/arduino-plattform/ Wikipedia http://www.freeduino.de/books/arduino-tutorial-lady-ada Lady Ada http://www.arduino-tutorial.de/ t t i d / Stefan Hermann http://de.wikipedia.org/wiki/processing Wikipedia Processing http://de.wikipedia.org/wiki/universal_serial_bus Wikipedia USB Informatik 6