Embedded Webserver CrumbX1-NET von Chip45 mit Bluetooth Modul HC-06

Projekt Status

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.

Changelog

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.

2.12.2 28.10.2014
Fix for wrong output on Port Y after oPY command with bit number 15-31. The problem did not occur on all gcc versions.

2.12.1 23.04.2014
Fixed compiler warnings that have been introduced by new avr-gcc version.

2.12.0 16.03.2014
Reduced size of hex file.
Added support for more serial ports.
Serial echo is now disabled by default (in serialconsole.h).

2.11.12 02.03.2014
Made serial port much more stable on Xmega devices with R/C oscillator.
Fixed buffer overflow when receiving an oversized packet.
Fixed a missing byte in DHCP discover request.
Added DHCP status info to the "ip" command.

Startseite  

I/O Schnittstellen Module für Ethernet

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.

Darüber hinaus enthält die Firmware einen eingebetteten Webserver, mit dem man das Gerät konfiguriert. Der Webserver kann Dateien von einer SD Karte zum Download bereit stellen. Auch ohne SD Karte kann man als Softwareentwickler eigene Features und kleine funktionale Webseiten hinzufügen.

Der C Compiler zum Programmieren des Mikrocontrollers ist kostenlos für Windows, Linux und Mac OS erhältlich. Die Beispiel App "ioModule" für PC und Smartphones kannst du mit Qt Creator compilieren. Schaue dir auch die Alarmanlage als Anwendungsbeispiel an. Eine ausführliche Erklärung, wie das zugrunde liegende µIP von Adam Dunkels funktioniert, findest du hier.

Download source code, compiled binaries (hex files).

So funktioniert es

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 Programm 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.

Voraussetzungen

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 mit vorinstallierter Firmware kaufen. Oder du baust die Hardware anhand der Schaltpläne im Download selbst.

Um die Firmware in den Mikrocontroller zu laden, benötigst du einen zum Chip kompatiblen Programmieradapter (ISP für ATmega, PDI für Xmega).

Schnittstellen

Eine optionale 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. Dort kann man auch größere Webseiten und downloadbare Software ablegen.

Die Chinesischen Bluetooth Module HC-05 und HC-06 passen perfekt auf das CrumbX1-NET Modul. Ansonsten empfehle ich auch das BTM-222, welches mit externer Antenne mehr Reichweite verspricht.

Für USB benötigst du einen USB-UART Chip, wie den FT232R, den CP2102, CH-340, CH-341 oder MCP2221A.

Die Anzahl der I/O Ports kann mit Schieberegistern vom Typ 74HC165 und 74HC595 erweitert werden. So kommt man auf jede Menge zusätzliche Eingänge und Ausgänge. Außerdem wird ein serieller 12bit ADC vom Typ MCP3204 oder MCP3208 unterstützt.

Protokolle

Bildschirmfotos

I/O-Befehle über TCP Socket (Telnet):


I/O-Befehle über seriellen Port (USB):


I/O-Befehle über HTTP:


Web Server:










Die Beispiel App "ioModule" steuert zwei LEDs an:

Befehlssatz

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.

Digitale Eingänge

Standardmäßig sind alle I/O Pins als Eingang konfiguriert. Die folgenden Beispiele zeigen, wie man Eingänge liest:

Befehl:   iPB7
Antwort: PB7=1

Befehl:   iPA
Antwort: PA=FF

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.

Bei den Eingängen kann man optional interne Pull-Up Widerstände einschalten, welche offene I/O Pins auf High ziehen:

Befehl:   pPC0,1
Antwort: Ok

Befehl:   pPC,FF
Antwort: Ok

Befehl:   p,FFFFFFFF
Antwort: Ok

Für jedes gesetzte Bit wird der entsprechende Pull-Up Widerstand eingeschaltet. Für die anderen wird er ausgeschaltet.

Digitale Ausgänge

Zuerst muss man die gewünschten I/O Pins als Ausgang konfigurieren, danach kann man den Pin 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

Beim direction Befehl bewirkt jedes gesetzte Bit, dass der entsprechende Pin als Ausgang konfiguriert wird. Die anderen Pins sind Eingänge. Beim output Befehl bewirkt jedes gesetzte Bit, dass der entsprechende Pin auf High geht, die anderen Pins gehen auf Low.

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

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.

Erweiterte Eingänge

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!

Erweiterte Ausgänge

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!

Spezielle Befehle für die Ethernet Version