AVR Webserver Software
Inhalt:
- Vorwort
- Hardware
- Grundkonfiguration
- Mainloop
- serielle Schnittstelle
- Scheduler (zeitgesteuerte Aufgaben)+
- Hintergrundprozesse (Daemon)
- http-Server
- Telnet-Server
- FTP-Server+
- NTP
- LCD-Modul
- AD-Wandler
- Kamera
- E-Mail Versand
- http-Client (Wetterdaten empfangen)
- WOL (Wake on Lan)
- SD-Kartenanbindung+
- IR-Fernbedienung mit RC5-Codes+
- 1-Wire Bus mit DS18x20 Temperatursensoren+
- Befehle auf der Kommandozeile
Vorwort
Die Software existiert zur Zeit in zwei Versionen:
- die Version von Ulrich Radig: ETH_M32_EX
- und eine speziell an das AVR-Webmodul angepasste und um die SD-Kartenfunktionen erweiterte Version: http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=1214.
Funktionen die nur in der erweiterten Version vorhanden sind sind hier mit + gekennzeichnet.
Hardware (Unterschiede)
Die Software kann auf den hier vorgestellten AVR-Modulen eingesetzt werden. Der Unterschied in der Hardware sieht wie folgt aus:
Feature | ETH_M32_EX | AVR Webmodule | Pollin Net-IO |
---|---|---|---|
10MBit Ethernet | X | X |
X |
serielle RS232 | X | X | X |
ISP-Schnittstelle | X | X | X |
SD-Kartenslot | O | X | O |
ohne SMD-Bauteile (leichte Lötbarkeit) |
X | O | X |
ATmega32 |
X | O | X |
ATmega644(P) | X | X | X |
Hutschienengehäuse | O | X | O |
Grundkonfiguration
An Einstellungen für das „eigene“ Modul ist folgendes zu überprüfen und eventuell zu ändern:
- Verwendeter Prozessor: ATmega32 / 644 / 644P
- Verwendeter Quarz: #define F_CPU xxx
- IP Einstellungen: DHCP oder eigene IP / Router / DNS-Server
- MAC-Adresse und IP-Adresse des Moduls (wichtig falls mehrere Module im gleichen Netz)
- Baudrate der seriellen Schnittstelle
Einstellen der Fuses
Ist ein wichtiger Schritt und es werden an dieser Stelle gern Fehler gemacht.
Eingeschaltet (aktiviert) werden muss:
- Brown-out detection level at VCC=4.3V [BODLEVEL=100]
(für das AVR-Webmodul: Brown-out detection level at VCC=2.7V [BODLEVEL=101] ) - Serial program downloading (SPI) enabled [SPIEN=0]
- Boot Flash section size=4096 words Boot start address =$F000; [BOOTSZ=00]; default value
- Ext. Crystal Osc; Frequency 8.0- MHz; Start-up time: 16K CK + 65ms; [CKSEL=1111 SUT=11]
Die anderen Fusebit deaktivieren.
Mainloop
serielle Schnittstelle
Über die serielle Schnittstelle können mit Hilfe eines Terminal-Programms die Ausgaben des Webservers mitgelesen werden (z.B. für debugging). Außerdem können verschiedene Kommandos an den Server gesendet und Einstellungen angepasst werden. Beispielsweise lassen sich WakeOnLan Packete versenden. Die Tabelle (rechts) zeigt alle derzeit möglichen Befehle. Die Einstellungen der seriellen Schnittstelle ist: 9600Baud, 8Datenbits, no Parity und 1 Stoppbit des weiteren kein Handshake.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1471&p=6077
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1462&p=6046
Scheduler (zeitgesteuerte Aufgaben)+
Mit dem Scheduler können Aufgaben auf Websever zeitgesteuert ausgeführt werden.
Zu den möglichen Aufgaben gehört:
- Das Starten von Anwendungen (mit oder ohne Parametern)
- Der Aufruf von Internetseiten
- Der Vergleich von Temperaturen
- Das Schalten von Verbraucher
Diese Aufgaben können zu folgenden Zeitpunkten bzw. in folgenden Intervallen automatisch durchgeführt werden:
- Mehrfach pro Tag (Zeitgesteuert)
- Täglich
- Wöchentlich
- Monatlich
- Einmalig
Die Einsatzmöglichkeiten des Scheduler sind vielfältig, z.B:
- Regelmäßige Kontrolle einer Heizung oder Warmwasseranlage
- Regelmäßige Kontrolle von Temperaturen
- Lüftungssteuerung
- u.v.m.
Hintergrundprozesse (Daemon)
Über den Ethernet-Stack in der Software können getrennt für TCP und UDP mehrere Prozesse definiert werden, die im Hintergrund auf Anfragen auf den entsprechenden Ports antworten.
Dazu werden die Prozesse ( auszuführende Funktionen ) mit der Portnummer und der auszuführenden Funktion in die Tabellen TCP_PORT_TABLE bzw. UDP_PORT_TABLE eingetragen. Dies wird gewöhnlich über die xxx_init()-Funktionen ausgeführt (z. B. httpd_init() ). Trifft nun ein Ethernetpaket von außen ein, wird im Stack entsprechend dieser Tabellen an die jeweilige Funktion (z.B. httpd(index) ) weiterverzweigt. In der Tabelle 'tcp_entry[MAX_TCP_ENTRY+1]' werden dann alle gerade aktiven TCP Verbindungen aufgelistet (UDP hat keine Rückmeldung und daher keine 'aktive' Verbindung). Per Parameter 'index' bekommen die Daemon-Funktionen einen Zeiger auf ihre aktive Verbindung mitgeteilt und müssen nun selbst über den Status und Verarbeitungsfortschritt der Verbindung entscheiden.
Folgende Prozesse sind aktuell implementiert:
http-Server
Ein Webserver überträgt Dokumente an Clients wie z. B. einen Webbrowser. Die zur Verfügung gestellten Dokumente können statisch (eine HTML-Seite) oder dynamisch (Messwerte) sein. Als Übertragungsmethoden dienen standardisierte Übertragungsprotokolle (HTTP, HTTPS) und Netzwerkprotokolle (TCP/IP) üblicherweise über Port 80 (HTTP) und Port 443 (HTTPS).
Telnet-Server
Auf Port 23 horcht ein Telnetserver und tauscht Daten mit der seriellen Schnittstelle des Boards aus. Somit ist die RS232-Schnittstelle des Boards über das Internet "tunnelbar" und es können viele Geräte (z.B. Telefonanlagen) aus der Ferne gesteuert werden.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1480
FTP-Server+
FTP steht für File Transfer Protocol, also ein Protokoll, das es erlaubt Dateien mit dem Webserver auszutauschen. Dazu sind Port 21 und 2100 zuständig. Client-Programme sind z.B. FileZilla oder ws_ftp.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=973
NTP
config.h / ntp.c / ntp.h
NTP (Network Time Protocol) ist ein Standard zur Synchronisierung von Uhren in Computersystemen und verwendet den UDP Port 123. Diese Funktion stellt Datum und Uhrzeit bereit. Verwendet wird diese Funktion z.B. im Scheduler. Man kann man auch eine kleine Ethernet Uhr bauen, die über das Internet die aktuelle Uhrzeit empfängt.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=1269&p=5086
LCD-Modul
config.h / lcd.c / lcd.h
Über folgende defines lässt sich in der config.h ein Standard-LCD (HD44870, SED1278F und kompatible) ansteuern.
#define USE_SER_LCD 1 //!< LCD Routinen mit einbinden
#define USE_LCD_4Bit 0 //!< LCD im 4Bit Mode oder seriell
Alternativ kann das LCD im 4-bit Modus angeschlossen werden oder über die folgende Zusatzschaltung seriell mit 3 Datenleitungen plus Vcc und GND. Die dadurch frei gewordenen Portpins können zum Schalten oder Abfragen von Zuständen genutzt werden.
Eine Platine für diese Schaltung gibt es im Shop. (LCD Seriell Leiterplatte)
Verwendete Hardware-Ports sind wie folgt:
Im 4Bit Mode: (USE_LCD_4bit =1) | Im seriellen Mode: (USE_LCD_4Bit=0) |
---|---|
PortC Pin0 - LCD D4 |
PortC Pin2 - LCD Enable |
In der Datei lcd.h ist noch einzustellen, wie viele Zeilen das Display darstellen kann:
#define TWO_LINES
//#define THREE_LINES
//#define FOUR_LINES
Für die formatierte Ausgabe auf das Display kann dann die Funktion
void lcd_print (unsigned char zeile, unsigned char spalte, const char *Buffer,...);
verwendet werden.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1321&p=5677
AD-Wandler
config.h / analog.c / analog.h
Analog-Digital-Wandler wandeln analoge Eingangssignale in digitale Signale um. Somit ist es möglich z. B. Temperaturen zu überwachen. Die Messdaten stehen in var_array [0] bis var_array[7] zur Auswertung bereit.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1252&p=4935
Kamera
config.h / cam.c / cam.h
Die Kamera stellt Bilder direkt auf eine Seite des WWW dar. Für dieses Gimmick sollte ein ATMega644P verwendet werden, da der ATMega32 nur eine serielle Schnittstelle zur Verfügung stellt.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1385&p=5665
http://www.ulrichradig.de/forum/viewtopic.php?f=33&t=1552
E-Mail Versand
config.h / sendmail.c / sendmail.h
Werden Temperaturen nicht erreicht oder versagt eine Pumpe ihren Dienst, ist die E-Mail eine gute Wahl, sich benachrichtigen zu lassen. Dazu sollte der Webserver einen eigenen E-Mail-Account haben.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=1328&p=5407
http-Client (Wetterdaten empfangen)
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=993&p=3811
WOL (Wake On Lan)
Mittels Wake on LAN kann ein Gerät (PC oder ähnliches) über das Netzwerk eingeschaltet werden. Die Netzwerkkarte des Geräts wartet auf ein so genanntes Magic Packet (Schutzmarke von AMD), bei dessen Empfang das Gerät eingeschaltet wird. Das Datenpaket ist direkt an die Netzwerkkarte adressiert oder wird als Broadcast verschickt. Es enthält 6 Mal in Folge den hexadezimalen Wert FF; unmittelbar danach erscheint die ununterbrochene 16-malige Wiederholung der MAC-Adresse der Netzwerkkarte.
Trägt man die MAC-Adresse 'seines' PCs ein, so kann der PC durch den Webserver aufgeweckt werden (vorausgesetzt der PC ist für WOL konfiguriert).
WOL kann eine knifflige Angelegenheit sein, je nach dem welche Hardware- und Software-Kombination auf dem zu startenden Gerät im Einsatz ist und wie diese eingestellt wurden. Also nicht gleich aufgeben!
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=27&t=818&p=2606
SD-Kartenanbindung+
MMC/SD oder miniSD
Für manche Projekte benötigt man mehrere Mega-Byte Speicher z.B. für einen MP3Player oder auch für die Datenerfassung. Da stellt sich die Frage, was nehmen bei der unüberschaubaren Anzahl sich auf dem Markt befindlichen Speicherkarten. Mein Favorit ist eindeutig die MMC/SD Karte. Dafür sprechen mehrere Gründe.
- Die MMC/SD - Karte ist eine mit der kleinsten Speicherkarten.
- Sie benötigt nur 4 I/O Pins am Mikrocontroller und kommt ohne weitere Logik aus.
- Es wird, auf Grund der 3,3 Volt Betriebsspannung, ein Level Shifter benötigt. Im einfachsten Fall reichen da paar Widerstände.
- http://www.ulrichradig.de/home/index.php/avr/mmc-sd
- Der Anschluß gestaltet sich einfacher als bei so mancher anderen Karte
microSD
Der wichtige Unterschied zu MMC/SD und miniSD ist eine abweichende Pinbelegung.
Weitere Info:
http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=973
IR-Fernbedienung mit RC5-Codes+
Als IR-Empfänger verwendet man einen TSOP1736, der direkt an 5V und einen Inputport (RC5_PIN) angeschlossen wird.
Ein Beispiel zur Verwendung der Fernbedienung findet sich in der Mainloop 'Steuerung mit IR-Fernbedienung'. Sollen kurze im Millisekundenbereich liegende Pulse an Ausgängen erzeugt werden sollte auch der Abschnitt zu dem Countdown-Timer T3 beachtet werden.
1-Wire Bus mit DS18x20 Temperatursensoren+
Anschluss der 1-Wire Sensoren DS18B20
An die Klemmleiste OW werden die einzelnen DS18B20 über einen "Klingeldraht"-Bus hintereinander angeschlossen. Kurze Abzweige sind möglich. Funktionieren tut das auch noch mit 20 Sensoren und 50 Meter Kabel.
Der Widerstand R1 kann ab ca. 2K2 aufwärts gewählt werden.
Aktivierung mittels USE_OW in der config.h
Weitere Info:
www.ulrichradig.de/forum/viewtopic.php
Was machen, wenn es nicht geht?
- Hardware prüfen
- Ist alles sauber gelötet?
- Gibt es Lötbrücken?
- Sind alle Bauteile an der richtigen Stelle?
- Stecken die IC mit Pin 1 richtig?
- Stimmt die Polung der Kondensatoren?
- Stimmen die Quarzangaben mit dem im Makefile überein?
- Sind die Fusebit eingestellt?
- Stecken die Jumper?
- Einstellungen im Terminal prüfen
- Ist die IP Adresse an das eigene Netzwerk angepasst?
- Fehler beim Programmieren? SD-Karte herausnehmen!+
Befehle der Kommandozeile
Übersicht der Befehle |
|
reset |
Zetzt den AVR-Controller zurück |
arp |
Gibt die aktuelle ARP-Tabelle aus |
tcp |
Gibt die aktuelle Tabelle der TCP Verbindungen aus |
ip [<ip>] |
Gibt die aktuelle IP Adresse des Boards aus, oder überschreibt diese mit <ip> |
net [<netmask>] |
Gibt die aktuelle Netzwerkmaske des Boards aus, oder überschreibt diese mit <netmask> |
router [<ip>] |
Gibt die aktuelle IP Adresse des Routers aus, oder überschreibt diese mit <ip> |
ntp [<ip>] |
Gibt die aktuelle IP Adresse des NTP-Servers aus, oder überschreibt diese mit <ip> |
ntpr |
Holt die Zeit vom NTP-Server und stellt die Uhr des Boards |
mac |
Gibt die MAC-Adresse des Boards aus |
ver |
Gibt die versionsnummer des ENC-Netzwerkchips aus |
sv |
|
time |
Gibt die aktuelle Zeit aus |
wol [<mac>] [<ip>] |
Versendet ein MagicPackt an die gespeicherte MAC-Adresse, |
help, ? |
Gibt eine Hilfe aus |
+ nur in dieser Version: http://www.ulrichradig.de/forum/viewtopic.php?f=35&t=1214
Vorherige Seite: Software
Nächste Seite: JavaSimpleTelnet - Ein einfacher Telnet-Client