Arduino Nano + ESP-01 Modul

Changelog

1.0.7 11.03.2016
Add a watchdog which resets the WLAN module when it hangs.

1.0.6 10.03.2016
Add system clock initialization code for Xmega controllers.

1.0.5 09.03.2016
Improved timing and source code structure.

1.0.4 08.03.2016
The correct line-feed format for the WLAN module is now auto-detected. Debugging via SERIAL_ECHO option is now disabled by default.

1.0.3 07.03.2016
Reduced RAM usage a lot and improved stability.

Startseite  

I/O Schnittstellen Module für WLAN

Mit einem 8bit AVR Mikrocontroller Board und einem WLAN Modul kann man selbst gebaute elektronische Geräte per WLAN fernsteuern. Diese Lösung bietet sich als Ersatz für herkömmliche Parallel-Ports an, mit denen aktuelle PC's leider nicht mehr ausgestattet sind. Sie erhalten je nach Mikrocontroller 16 bis 82 steuerbare Anschlüsse. Und mit Hilfe von ein paar billigen Schieberegistern sind noch mehr machbar.

Ich empfehle den ATmega168, ATmega328 (Arduino Nano und Uno), Atmega644, ATmega1284, ATmega2560 oder Xmega128D3, sowie ein ESP-01 Modul.

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.

Downloads:

Beispiel-Programm:

So funktioniert es

Nach einmaliger Einstellung der Netzwerk-Parameter, baue eine Verbindung zum WLAN Modul auf Port 23 auf. Ich bevorzuge zum Testen das Programm Netcat (nc). Sende Befehle in Text-Form und empfange die Antworten.

Zum Beispiel setzt man so den Pin PC3 auf High:

Sende:   oPC3,1
Antwort: Ok

So fragt man Port D als Hexadezimalzahl ab:

Sende:   iPD
Antwort: PD=3F

Den vollständigen Befehlssatz findest du weiter unten. Du kannst ungefähr 4 Befehle pro Sekunde ausführen.

Schaltplan

Bildschirmfotos

Test mit Netcat:

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

Digitale Ausgänge

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

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 WLAN Version

Mit dem ATZ Befehl wird ein Hardware-Reset des WLAN Moduls ausgelöst.

Darüber hinaus kannst du alle AT-Befehle verwenden, die das WLAN Modul versteht (außer AT+CIPSEND). Wobei deren Antworten auf eine Zeile beschränkt sind. Die folgende Befehlsfolge richtet die WLAN Verbindung des ESP Moduls ein: