Die Firmware läuft sehr stabil und hat alle Features, die ich bislang implementieren wollte. Neue Funktionen sind daher in absehbarer Zeit nicht zu erwarten.
2.12.8 06.11.2018
Reduce ADC clock of Xmega for better results.
2.12.7 05.08.2015
Fix timer sporadically not working properly (atomic access to timer counter).
2.12.6 21.05.2015
Add support for ATmega128.
Improved compiler error message in case of unsupported ATmega type.
Applied a patch to protothreads to get rid of the "unused PT_YIELD_FLAG" warnings.
2.12.5 12.05.2015
Removed gcc command line option that is not supported by WinAVR.
Fixed compilation error when the AUTH module is disabled.
2.12.4 13.04.2015
Removed wrong and useless pull-up settings for serial ports.
Mit I/O Schnittstellen Modulen steuert und überwacht man elektrische Einrichtungen. Da PC's keine herkömmlichen Parallel-Ports mehr haben, stelle ich hier einen Ersatz mit Ethernet, USB und Bluetooth vor. So kommt man je nach Mikrocontroller auf 19 bis 71 steuerbare Anschlüsse. Und mit Hilfe von ein paar billigen Schieberegistern sind noch mehr I/O Leitungen machbar.
Der Zugriff auf die I/O Ports erfolgt über einfache Textbefehle, so daß keine speziellen Treiber oder Libraries erforderlich sind. Es funktioniert daher mit jeder beliebigen Programmiersprache und jedem Betriebsystem, wie PC, Smartphones, Tablets, Raspberry Pi, usw.
Die Firmware enthält eine optionale Komponente, welche 8 Pins überwacht konfigurierbare Emails verschickt. Über den eingebauten Webserver wird das Gerät konfiguriert, und man hat Zugriff auf die optionale SD Speicherkarte,
Downloads:
Eine ausführliche Erklärung, wie das zugrunde liegende µIP von Adam Dunkels funktioniert, findest du hier.
Baue eine Verbindung zum I/O Modul auf. Dann sende Befehle in Text-Form und empfange Antworten auf dieser Verbindung. Zum Testen von seriellen, USB und Bluetooth Verbindungen empfehle ich das Hammer Terminal, Putty oder Cutecom. Um den TCP-IP Socket zu testen, empfehle ich Netcat (nc) oder telnet.
Zum Beispiel setzt man so den Pin PC3 auf High:
Sende: oPC3,1
Antwort: Ok
So fragt man den Port D als Hexadezimalzahl ab:
Sende: iPD
Antwort: PD=3F
Bei HTTP hängt man die Befehle an die URL an:
Request: http://192.168.0.123/io?oPC3,1
Response: Ok
Den vollständigen Befehlsatz findest du weiter unten. Du kannst über 100 Befehle pro Sekunde ausführen, aber kurzzeitige Verzögerungen durch das Netzwerk sollten eingeplant werden.
Die Schaltpläne findest du im Download-Paket. Du kannst den Ethernet Controller an beliebige Pins des Mikrocontrollers anschließen, da die Zuordnung der Pins konfigurierbar ist.
Bei Chip45 kann man das betriebsfertige CrumbX1-Net Modul kaufen. Dazu brauchst du einen Programmieradapter, der das PDI (nicht UPDI) Protokoll unterstützt.
Eine SD Speicherkarte kann bei 3,3V direkt an den SPI Port des AVR angeschlossen werden. Sie bietet sich zum Sammeln und Speichern von größeren Datenmengen an. Über den Webserver hat man von außen lesenden Zugriff auf die SD Karte.
Die Chinesischen Bluetooth Module HC-05 und HC-06 passen perfekt auf das CrumbX1-NET Modul. Ansonsten empfehle ich auch das BTM-238, welches mit externer Antenne mehr Reichweite verspricht.
Für USB benötigst du USB-UART Adapterkabel oder Chip, wie den FT232R, den CP2102, CH-340, CH-341 oder MCP2221A.
Die Anzahl der I/O Ports erweitert man mit Schieberegistern vom Typ 74HC165 und 74HC595 oder TPIC6B595 (kann Relais direkt ansteuern). So kommt man auf bis zu 32 zusätzliche Eingänge und 32 zusätzliche Ausgänge. Außerdem wird ein serieller 12bit ADC vom Typ MCP3204 oder MCP3208 unterstützt.
I/O-Befehle über TCP Socket (interaktiv mit Netcat oder Telnet):
I/O-Befehle über seriellen Port (USB):
I/O-Befehle über HTTP:
Web Server:
Die Beispiel App ioModule steuert zwei LEDs an:
Die Firmware wird vom PC aus mit Befehlen in textueller Form gesteuert. Die Befehle bestehen jeweils aus einem Buchstaben, gefolgt von spezifischen Parametern:
Jeder Befehl wird mit einem Zeilenumbruch (\n oder \r\n) beendet.
Die Befehle d, p, o und i können sich wahlweise auf einen einzelnen Pin, einen ganzen Port oder alle Ports gleichzeitig beziehen. Pin-Nummern werden immer als Dezimal-Zahl angegeben, und die Daten sind entweder binär (0/1) oder Hexadezimal.
Standardmäßig sind alle I/O Pins als Eingang. Der input Befehl liest den Eingang. Mit dem pull-up Befehl kann man die internen Pull-Up Widerstände einschalten.
Beispiel für das Lesen eines einzelnen Eingangs mit aktiviertem Pull-Up Widerstand:
Befehl: pPB7,1
Antwort: Ok
Befehl: iPB7
Antwort: PB7=1
Beispiel für einen ganzen Port am Stück (8 Pins):
Befehl: iPA
Antwort: PA=FF
Beispiel für alle Ports auf einmal:
Befehl: i
Antwort: i=000001FF
Die Hexadezimalzahl bezieht sich auf die Ports DD CC BB AA.
Bei größeren Mikrocontrollern ist sie doppelt so lang und bezieht sich auf die Ports HH GG FF EE DD CC
BB AA.
Zuerst muss man die gewünschten I/O Pins mit dem direction Befehl als Ausgang konfigurieren, danach kann man den Pin mit dem output Befehl steuern.
Beispiel für einen einzelnen I/O Pin:
Befehl: dPB4,1
Antwort: Ok
Befehl: oPB4,1
Antwort: Ok
Befehl: oPB4,0
Antwort: Ok
Beispiel für einen ganzen Port am Stück (8 Pins):
Befehl: dPB,FF
Antwort: Ok
Befehl: oPB,FF
Antwort: Ok
Befehl: oPB,00
Antwort: Ok
Beispiel für alle Ports auf einmal:
Befehl: d,FFFFFFFF
Antwort: Ok
Befehl: o,FFFFFFFF
Antwort: Ok
Befehl: o,00000000
Antwort: Ok
Die größeren Mikrocontroller mit mehr Ports erwarten längere Hexadezimalzahlen für die Ports HH GG FF EE DD CC BB AA, aber ohne Leerzeichen dazwischen.
Analoge Eingänge vergleichen die Spannung an einem Pin mit einer einstellbaren Referenzspannung. Das ist zugleich die höchste messbare Spannung. Je nach Mikrocontroller stehen dazu folgende Referenzen zur Verfügung:
Das folgende Beispiel wählt VCC als Referenz und liest dann den analogen Eingang 3 ein:
Befehl: rVCC
Antwort: Ok
Befehl: a3
Antwort: ADC3=01A3
Das Ergebnis ist eine hexadezimale Zahl, entsprechend dem Messwert der analogen Spannung.
Mit Hilfe von Schieberegistern kann man die Anzahl der Eingänge erweitern. Diese zusätzlichen Eingänge nenne ich "Port X". Sie können mit dem i Befehl abgefragt werden. Je nach Anzahl der Schieberegister antwortet der input Befehl mit unterschiedlich großen Hexadezimal-Zahlen (8-32 Bits). Zum Beispiel:
Befehl: iPX
Antwort: PX=FFFF
Beispiel zur Abfrage eines einzelnen Pins:
Befehl: iPX9
Antwort: PX9=1
Die Befehle d und p stehen bei erweiterten Eingängen und Ausgängen nicht zur Verfügung!
Mit Hilfe von Schieberegistern kann man die Anzahl der Ausgänge erweitern. Diese zusätzlichen Ausgänge nenne ich "Port Y". Sie können mit dem o Befehl beschrieben werden. Je nach Anzahl der Schieberegister erwartet der output Befehl unterschiedlich große Hexadezimal-Zahlen (8-32 Bits). Zum Beispiel:
Befehl: oPY,FFFF
Antwort: Ok
Beispiel zum Ändern eines einzelnen Pins:
Befehl: oPY12,1
Antwort: Ok
Die Befehle d und p stehen bei erweiterten Eingängen und Ausgängen nicht zur Verfügung!