<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.52"> <META NAME="LFCATEGORY" CONTENT="Hardware"> <link rel="icon" href="../../common/images/lf-16.png" type="image/png"> <TITLE>lf236, Hardware: Eine LCD Anzeige und Steuertasten für den Linux Server</TITLE> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-family:monospace,Courier } pre.code { font-family:monospace,Courier;background-color:#aedbe8; } p.cl { color:#EE9500 } table.left { margin-right:0.3cm } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } div.tbbutton { background: #ddd; border-right: 1px solid #aaa; border-bottom: 1px solid #aaa; margin: 2px 5px 2px 5px; text-align: center; width: 20em; line-height: 1.2em; padding: 2px; font-size: 12px; white-space: nowrap; color: #555; } div.bbutton { background: #ddd; border-right: 1px solid #aaa; border-bottom: 1px solid #aaa; float: left; margin: 2px 5px 2px 5px; text-align: center; line-height: 1.2em; padding: 2px; font-size: 12px; white-space: nowrap; color: #555; } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://main.linuxfocus.org/~guido/dev/lfparser.html --> <!-- this is used by a number of tools: =LF=AUTHOR: Guido Socher =LF=CAT___: Hardware =LF=TITLE_: Eine LCD Anzeige und Steuertasten für den Linux Server =LF=NUMBER: 236 =LF=ANAME_: article236.shtml =LF=PARSER: 2.52 --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar, current, style=2 --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><a href="../../index.shtml"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></a></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"> <A class="nodec" href="../../index.shtml"><FONT color= "#DDDDDD" size="2"><--</FONT></A> | <A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Home</FONT></A> | <A class="nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Plan</FONT></A> | <A class="nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Index</FONT></A> | <A class="nodec" href="../Search/index.html"><FONT color= "#DDDDDD" size="2">Suchen</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color= "#FFFFFF">Nachrichten</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Archiv</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.shtml"><FONT color= "#FFFFFF">Links</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Über uns</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.5 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dieses Dokument ist verfübar auf: <A href="../../English/May2002/article236.shtml">English</a> <A href="../../Castellano/May2002/article236.shtml">Castellano</a> <A href="../../ChineseGB/May2002/article236.shtml">ChineseGB</a> <A href="../../Deutsch/May2002/article236.shtml">Deutsch</a> <A href="../../Francais/May2002/article236.shtml">Francais</a> <A href="../../Italiano/May2002/article236.shtml">Italiano</a> <A href="../../Nederlands/May2002/article236.shtml">Nederlands</a> <A href="../../Russian/May2002/article236.shtml">Russian</a> <A href="../../Turkce/May2002/article236.shtml">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT_BIO_ABOUT_THE_AUTHOR_AND_INDEX_START --> <TABLE ALIGN="LEFT" BORDER="0" WIDTH="195" summary="about the author" class="left"> <TR> <TD> <img src="../../common/images/Guido-S.gif" alt= "[Photo of the Author]" height="164" width="173"> <BR>von Guido Socher <a href="http://linuxfocus.org/~guido/"><font size="1">(homepage)</font></a> <BR><BR> <I>Über den Autor:</I><BR> <!-- aboutauthor_start --> <p>Guido mag Linux nicht nur, weil es Spaß macht, die großartigen Möglichkeiten, die dieses System bietet zu entdecken, sondern auch wegen der Leute, die an seiner Entwicklung beteiligt sind.</p> <!-- aboutauthor_stop --> <!-- TRANSLATED_TO de --> <BR><BR><I>Übersetzt ins Deutsche von:</I><BR> Guido Socher (<a href="http://linuxfocus.org/~guido/"><font size="1">homepage</font></a>) <br> <!-- =LF=TRANSTO=de: Guido Socher --> <!-- TRANSLATED_TO_STOP --> <!-- INDEX_START --> <BR><i>Inhalt</i>: <UL> <LI><A HREF="#236lfindex0">Einführung</A></LI> <LI><A HREF="#236lfindex1">Benötigte Bauteile</A></LI> <LI><A HREF="#236lfindex2">Schaltplan und Platine</A></LI> <LI><A HREF="#236lfindex3">Die Schaltung</A></LI> <LI><A HREF="#236lfindex4">Wie man eine Platine erstellt</A></LI> <LI><A HREF="#236lfindex5">Die Software für deinen Microcontroller</A></LI> <LI><A HREF="#236lfindex6">Testen</A></LI> <LI><A HREF="#236lfindex7">Die Watchdog anschließen</A></LI> <LI><A HREF="#236lfindex8">Wie man die Watchdog benutzt</A></LI> <LI><A HREF="#236lfindex9">Die Scripte auf dem Server</A></LI> <LI><A HREF="#236lfindex10">Log files</A></LI> <LI><A HREF="#236lfindex11">Das Kontrollfeld im Betrieb</A></LI> <LI><A HREF="#236lfindex12">Zusammenfassung</A></LI> <LI><A HREF="#236lfindex13">Referenzen</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=236">Talkback für diesen Artikel</A></LI> </UL> </TD></TR></TABLE> <!-- INDEX_STOP --> <!-- SHORT_BIO_ABOUT_THE_AUTHOR_AND_INDEX_STOP --> <!-- HEAD_OF_THE_ARTICLE_START --> <br> <table border="0"><tr><td> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfPdf ver 0.1 --> <TABLE style="border-style:outset; border-width:1px" align="right" bgcolor="#ff9616" cellspacing="1"><TR><TD bgcolor="#ff9616"> <a href="../Archives/lf-2002_05-0236.pdf"><small>PDF</small></a> </TD></TR></TABLE> <H2>Eine LCD Anzeige und Steuertasten für den Linux Server</H2> <img src= "../../common/images/article236/pic03_finalpanel_th.jpg" width= "129" height="108" alt="[Illustration]" hspace="10"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Zusammenfassung</i>: <P> <!-- articleabstract_start --> In diesem Artikel entwickeln wir ein LCD Kontrollfeld basierend auf einem Hitachi HD44780 LCD Display und dem AT90S4433 AVR 8-Bit RISC Microcontroller von Atmel. Beides sind geläufige Komponenten und sind nicht zu teuer. Das Kontrollfeld enthält neben Anzeige und zwei Tasten eine Watchdog, um den Server zu überwachen. Mit Hilfe der Anzeige und den Tasten kann man einen Dialog mit dem Benutzer führen und einigen Sachen einstellen. Man kann die IP Adresse, Netzmaske und Gateway Adresse setzen, außerdem ist es möglich den Rechner herunterzufahren (shutdown) oder Statistiken abzufragen. Eigentlich gibt es fast unbegrenzte Möglichkeiten. Der größte Teil der Logik ist in einem Perlscript implementiert und die ganze Schaltung ist über die RS232 Schnittstelle mit dem Server verbunden. <br><br> Für diesen Artikel brauchst du wenigstens Teile der Linux AVR Entwicklungsumgebung. Wie man diese Linux AVR Entwicklungsumgebung aufsetzt ist in dem Artikel <a href= "../March2002/article231.shtml">"Programmierung des AVR Microcontroller mit GCC"</a> beschrieben. <!-- articleabstract_stop --> <br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br> </td></tr></table> <!-- HEAD_OF_THE_ARTICLE_STOP --> <!-- BODY_OF_THE_ARTICLE_START --> <A NAME="236lfindex0"> </A> <H2>Einführung</H2> <table align="right" cellspacing="10" width="200"> <tr> <td bgcolor="#aedbe8"> <center> <a href="http://shop.tuxgraphics.org"><img src="../../common/images2/tuxgraphics_hd44780_linux_lcd.jpg" alt="lcd from tuxgraphics" width="120" height="80"></a> <br><a href="http://shop.tuxgraphics.org">shop.tuxgraphics.org</a> verkauft sehr gute und günstige LCD Anzeigen. </center> </td> </tr> </table> Die hier entwickelte Schaltung kombiniert Funktionalität, die schon in zwei vorhergegangenen Artikeln beschrieben wurde: <ul> <li><a href="../July2000/article165.shtml">Serial Line LCDs für Linux</a></li> <li><a href="../January2001/article186.shtml">Ein Knopf zum Herunterfahren des Rechners für die serielle RS232 Schnittstelle mit LEDs</a></li> </ul> Unsere Neuentwicklung geht jedoch weit über das hinaus. Die neue Hardware enthält zwei Tasten für den Dialog mit dem Benutzer und eine Watchdog, um den Server ständig zu überwachen. Es ist außerdem ein analoger Eingang vorhanden, den wir hier jedoch nicht benutzen. Man könnte z.B einen Temperaturfühler anschließen.<br> <br> Um diese Schaltung aufzubauen, braucht man etwas Geschick und Erfahrung im Bereich Hobbyelektronik. Die Bauteile für die Schaltung sind nicht teuer und kosten alle zusammen weniger als 40 Euro. <br> <br> Die Idee hinter dem LCD Kontrollfeld ist, daß man damit einen Server ohne Monitor und Tastatur bedienen kann. Linux ist ein sehr zuverlässiges Serverbetriebssystem und kann gut per ssh, telent oder remote login verwaltet werden. Wenn man die Server jedoch das erste Mal mit dem Netzwerk verbindet, muß man eine IP Adresse, Netzmaske und Gateway setzen. Mit diesem Kontrollfeld kann man das machen. Es bietet außerdem die Möglichkeit, den Server herunterzufahren während man noch im Serverraum ist.<br> <br> Das ganze Kontrollfeld ist sehr allgemein gehalten. All die Server spezifischen Teile sind in einem Perlscript implementiert. Die gesamte Hardware, der Zustand der Tasten, der Text im Dispaly, LEDs, ..., kann über ASCII Kommandos gesteuert werden. Man kann daher dieselbe Schaltung übernehmen, um einen mp3 Spieler zu bauen oder einen Toaster zu steuern, was immer du möchtest. <A NAME="236lfindex1"> </A> <H2>Benötigte Bauteile</H2> Um dieses Kontrollfeld zu bauen, benötigst du die folgenden Teile: <p class="code">1 x Atmel At90S4433 Microcontroller<br> 1 x 28pin 7.25 mm IC Sockel<br> 1 x 16pin IC Sockel<br> 1 x MAX232<br> 1 x kleines 5V Relai<br> 1 x 4MHz Quarz<br> 2 x LEDs (grün und rot)<br> 1 x BC547 NPN Transistor<br> 1 x BC557 PNP Transistor<br> 4 x 1uF Kondensator (Folie oder Elko)<br> 2 x 27pF Keramikkondensator<br> 1 x 10nF Kondensator<br> 1 x 100nF Kondensator<br> 3 x Widerstand 4k7<br> 2 x Widerstand 2k2<br> 1 x Widerstand 10K<br> 1 x Widerstand 3k3<br> 2 x Widerstand 100 Ohm<br> 3 x Widerstand 470 Ohm<br> 3 x Widerstand 1k<br> 1 x Widerstand 220 Ohm<br> 1 x 4K7 Poti (Bauform so klein wie möglich)<br> 1 x Z-Diode 4.3V<br> 2 x kleine Taster<br> 1 x Diode (e.g 1N4148, irgendeine kleine billige Diode)<br> 1 x 2 Zeilen 20 Zeichen LCD Display mit HD44780 kompatiblem Interface.<br> <br> Alle LCD Displays mit 14 oder 16 Anschlüssen, die ich jemals gesehen habe, waren HD44780 kompatibel. Man kann auch ein 3 oder 4 zeiliges Display benutzen, aber dann muß man die Software für den Microcontroller etwas anpassen.</p> Zusätzlich zu diesen Teilen braucht man noch Drähte und Anschlüsse für Stromversorgung und RS2322. Das zweizeilige Display kann man an einem gebogenen Aluminiumblech befestigen und dann in einem freien 5.25" Schacht am Server montieren. <A NAME="236lfindex2"> </A> <H2>Schaltplan und Platine</H2> Ich habe Eagle für Linux benutzt, um den Schaltplan und die Platine zu entwerfen. Es ist eine ausgezeichnete Software, aber es braucht Zeit bis man sie bedienen kann. Für private Zwecke kann man eine kostenlose Version von Eagle bei <a href= "http://www.cadsoftusa.com/">cadsoftusa.com</a> erhalten. <br> <br> Der Schaltplan (mit einem Klick auf den Plan erhält man ein größeres Bild):<br> <a href= "../../common/images/article236/linuxlcdpanel_schematic_big.gif"> <img src= "../../common/images/article236/linuxlcdpanel_schematic_small.gif" width="448" height="267" alt="[Schematic]"></a> <br> <br> Die Platine (mit einem Klick auf die Platine erhält man ein größeres Bild):<br> <a href= "../../common/images/article236/linuxlcdpanel_board.gif"><img src= "../../common/images/article236/linuxlcdpanel_board_small.gif" width="442" height="395" alt="[board]"></a> <br> <br> <br> Die Platine mit weißem Hintergrund, um das Drucken erleichtern: <a href= "../../common/images/article236/linuxlcdpanel_board_white.gif">Platine in weiß</a> <small>(Achtung: Das ist nicht die Datei, die man zum Belichten der Platine braucht)</small><br> <br> Die Eagle Dateien (komprimiert mit gzip. Achtung einige Webbrowser un-zippen die Dateien schon beim Herunterladen): <ul> <li><a href= "../../common/src/article236/linuxlcdpanel.brd.gz">linuxlcdpanel.brd.gz</a></li> <li><a href= "../../common/src/article236/linuxlcdpanel.sch.gz">linuxlcdpanel.sch.gz</a></li> </ul> <A NAME="236lfindex3"> </A> <H2>Die Schaltung</H2> Ich werde kurz den Schaltplan erklären. Der AT90S4433 hat 3 Ports: PB, PC und PD. PC kann als analoger oder digitaler Eingang benutzt werden. Alle Ports können als digitale Ein- oder Ausgänge benutzt werden. Dieses wird per Software über das DDR (Data Direction Register) festgelegt. Wir benutzen alle Pins bis auf 23 als digitale Ein- oder Ausgänge (0 oder 5V). Der Max232 ist ein Spannungswandler. Das RS232 Interface benutzt +-10V und der Max232 konvertiert das in 0-5V. An Pin 1 (Reset) befindet sich etwas namens Brownout-Schaltung. Diese Schaltung hält den Reset auf 0 (aktiv) während Perioden mit unzureichender Spannungsversorgung. Das verhindert, daß die CPU Anweisungen fehlerhaft ausführt. Normalerweise ist das für einige Millisekunden während des Einschaltens oder beim Ausschalten der Fall. Die Brownout-Schaltung stellt im wesentlichen sicher, daß der Microcontroller richtig startet. <br> <br> Einige Leute mögen sich wundern, warum eine Diode parallel zur Spule liegt und so gepolt ist, daß sie sinnlos scheint. Diese Diode ist sehr wichtig. Beim Ausschalten des Stromes an dem Relai würde die Spule eine sehr hohe Spannung induzieren, die den Microcontroller sofort zerstören kann. Diese induzierte Spannung hat entgegengesetzte Polarität zur Betriebsspannung an der Spule. Die Diode kann eine ganz kleine billige Diode im Glasgehäuse sein, aber es ist wichtig, daß sie vorhanden ist. <A NAME="236lfindex4"> </A> <H2>Wie man eine Platine erstellt</H2> Um die Platine zu ätzen, muß zuerst diese <a href= "../../common/src/article236/linuxlcdpanel.ps.gz">Postscriptdatei (linuxlcdpanel.ps.gz)</a> auf eine transparente Folie ausgedruckt werden. In Läden für Architekten kann man eine semitransparente Plasikfolie namens Sinolit finden. Sie wird von der Firma Regulus hergestellt und ist für den Offsetdruck gedacht. Eine andere gute Alternative ist 60g Papier + Pausklarspray von Kontakt Chemie. Der Vorteil von Papier und Sinolit ist, daß der Druckertoner dort 100%ig haftet. <br> Ich habe die Postscriptdatei auch in <a href= "../../common/src/article236/linuxlcdpanel1.pdf">PDF</a> umgewandelt für den Fall, daß du kein Postscript drucken kannst, aber die Qualität ist sehr schlecht.<br> Die Belichtungszeit für fotobeschichtete Platinen hängt von der Lichtquelle ab. Bei einem Heimsolarium sind es etwa 1-2 Minuten. Man kann auch Tageslicht benutzen, aber direkte Sonneneinstrahlung sollte man vermeiden, da die Strahlung einfach zu stark ist. Man sollte vorher die beste Belichtungszeit mit einem kleinen Streifen Platine ermitteln. Die Folie und die Platine legt man während des Belichtens am besten unter eine Glasplatte, damit die Folie ganz plan liegt. <table border="1" align="right" width="200"> <tr> <td><a href= "../../common/images/article236/pic01_beforeetching.jpg"><img src= "../../common/images/article236/pic01_beforeetching_th.jpg" width="188" height="160" alt="[before etching]"></a></td> </tr> <tr> <td>Die belichtete und entwickelte Platine vor dem Ätzen</td> </tr> </table> <br> <br> Die belichtete Platine wird für einige Minuten in Natriumhydroxid (NaOH) entwickelt. Danach sollte man das Ergebnis sorgfältig prüfen und gegebenenfalls Korrekturen mit einem ätzfesten Edding 780 Lackstift (Edding 780 paint marker) vornehmen. Ich zeichne gewöhnlich die Pads für die Bauteile etwas größer, weil die von Eagle vorgegegebene Größe für Hobbyzwecke zu klein ist. <table border="1" align="left" width="160"> <tr> <td><a href= "../../common/images/article236/pic02_boardready.jpg"><img src= "../../common/images/article236/pic02_boardready_th.jpg" width="149" height="132" alt="[after etching]"></a></td> </tr> <tr> <td>Das fertige Board vor dem Bohren der Löcher</td> </tr> </table> <br> <br> Aus irgendeinem Grund scheint es unmöglich für die Hersteller von Relais zu sein, sich auf eine Anschlußbelegung zu einigen. Ich habe ein kleines Relai, das von Matsushita hergestellt wurde benutzt. Dein Relai wird vermutlich anders aussehen und du mußt daher die Platine anpassen. Das geht am besten mit so einem ätzfesten Edding Lackstift. <br> <br> Wenn Du mit den Bahnen auf der Platine zufrieden bist, kannst Du sie in FeCl3 (Eisendreichlorid) ätzen. FeCl3 hat eine gute Ätzgeschwindigkeit bei Raumtemperatur. Es ist einfach zu benutzen und daher gut für Hobbyzwecke geeignet. Man bekommt die besten Ergebnisse, wenn die Platine in der Ätzlösung steht. Kupferionen sind schwerer als Eisen und sammeln sich deshalb am Boden des Gefäßes an. Liegt dort die Platine, so verlangsamt sich die Ätzgeschwindigkeit sehr schnell. <br> <br> Wenn die Platine fertig ist, spühlt man sie mit Wasser ab und wischt den Eddingstift mit Terpentin ab. Den Fotolack kann man auf den Bahnen lassen. Er verdampft beim Löten und schützt die ungelöteten Bahnen. <A NAME="236lfindex5"> </A> <H2>Die Software für deinen Microcontroller</H2> Die Software für den Microcontroller ist auf folgende Dateien aufgeteilt: <ul> <li><a href="../../common/src/article236/c/index.html">lcd.c, lcd.h, lcd_hw.h</a>: Das ist eine allgemeine LCD Library. Sie basiert auf der Arbeit von Peter Fleury (http://jump.to/fleury). Diese Version ist jedoch etwas modifiziert und flexibler. Man kann die LCD Hardware an jeden Pin des Microcontrollers anschließen. Dazu muß man lediglich die Definitionen in lcd_hw.h ändern.</li> <li><a href="../../common/src/article236/c/index.html">avr-util.c, avr-util.h</a>: Funktionen zur Zeitverzögerung.</li> <li><a href="../../common/src/article236/c/index.html">uart.c, uart.h</a>: Das ist die Library für das RS232 Interface. Es werden Hardwareinterrupts benutzt. Jedesmal, wenn ein Zeichen vom Computer empfangen wird, wird die Funktion SIGNAL(SIG_UART_RECV) aufgerufen und das Zeichen wird in einen String kopiert. Die ASCII Befehle für das Kontrollfeld sind so aufgebaut, daß ein kompletter Befehl immer eine Zeile ist (mit Newline endet). Wenn ein Newline gefunden wird, dann wird die Variable uart_rx_linecomplete gesetzt. Das bedeutet, daß man die Befehle nicht zu schnell hintereinander schicken darf. Es muß immer einige Millisekunden Pause geben, damit der String ausgewertet werden kann, bevor er durch einen neuen Befehl überschrieben wird. Jeder Befehl wird durch ein Ergebnis, ein ok oder err (für Error) beantwortet. Das kann man als Auslöser benutzen, um den nächsten Befehl zu schicken.</li> <li><a href="../../common/src/article236/c/index.html">analog.c, analog.h</a>: Der Programmcode für den Analogdigitalwandler. Er funktioniert auch mit Interrupts. Ein Konvertierungsvorgang wird gestartet und dann wartet das Programm auf den SIG_ADC Interrupt, um das Ergebis aus dem ADC Register zu lesen.</li> <li><a href="../../common/src/article236/c/index.html">hardwarewd.c, hardwarewd.h</a>: Das ist der Code für die Watchdog. Wir benutzen einen internen Teiler (durch 1024), um Pulse für den Timer zu liefern. Der Timer ist ein 16 bit register. Wenn dieses überläuft, dann zählen wir eine 8 Bit Variable herunter. Bei einem 4MHz Quarz wird diese 8 Bit Variable ungefähr alle 16 Sekunden heruntergezählt. Das Perlprogramm auf dem Server zeigt, daß es am Leben ist, indem es die 8 Bit Variable regelmäßig wieder auf einen Anfangswert setzt. Sollte das mal nicht passieren (weil der Server hängt), dann wird die 8 Bit Variable irgendwann auf Null gehen und das Relai macht klick-klack und der Server bekommt ein CPU reset.</li> <li><a href="../../common/src/article236/c/index.html">linuxlcdpanel.c</a>: Das ist das Hauptprogramm. Es überprüft regelmäßig, ob Kommandos am RS232 Interface angekommen sind oder einer der Taster gedrückt wurde.</li> </ul> Um die Software im Detail zu verstehen, empfehle ich das Datenblatt für den Microcontroller zu lesen. Das Datenblatt findet man im Abschnitt Referenzen am Ende des Artikels oder auf der Atmel Webseite (www.atmel.com). <br> Um jedoch dieses Kontrollfeld benutzen zu können, braucht man die Software überhaupt nicht zu verstehen. Man muß lediglich den Quellcode auspacken (linuxlcdpanel-0.7.tar.gz gibt's auf der <a href="../../common/src/article236/index.html">download Seite</a>) und dann <p class="code">make<br> make load<br> </p> tippen. Man kann sogar einfach die schon vorkompilierte Software benutzen und sie mit <p class="code">make loadprebuild</p> in den Microcontroller laden. Ganz einfach. Eine Beschreibung, wie man den Microcontroller programmiert und was man dazu braucht, findet sich im ersten Artikel: <a href= "../March2002/article231.shtml">Den AVR Microcontroller mit GCC programmieren</a>. <A NAME="236lfindex6"> </A> <H2>Testen</H2> Das LCD Kontrollfeld ist so gebaut, daß man es an die 5V interne Stromversorgung im Linux Server anschließen kann (rotes Kabel=5V, schwarzes Kabel=Masse=0V). Man sollte die Schaltung jedoch niemals sofort und ungetestet an den Computer anschließen. Es könnte sein, daß du einen kleinen Fehler beim Aufbau gemacht hast. Die Stromversorgung des Rechners ist sehr leistungsfähig und ein Fehler könnte den Rechner beschädigen und die Schaltung in Rauch aufgehen lassen. <br> Man sollte zum Testen eine strombegrenzte und elektronisch stabilisierte Laborspannungsquelle benutzen. Nachdem die Versorgungsspannung angeschlossen ist, kann man die Software wie oben angegeben in den EEPROM laden. Sobald das geschehen ist, sollte man einen Lauftext mit "linuxfocus.org" in der LCD Anzeige sehen. Als nächstes wird die RS232 Schnittstelle angeschlossen: <p class="code">MAX232 Pin 14 an CTS (DB-9 Pin 8)<br> MAX232 Pin 7 an RXD (DB-9 Pin 2)<br> MAX232 Pin 13 an TXD (DB-9 Pin 3)<br> Man muß außerdem DTR, DSR und CD miteinander verbinden (DB-9 Pin 4, 6 und 1)</p> Das ist auch kurz in dem Schaltplan oben angegeben. <br> <br> <a href= "../../common/images/article236/test_with_cat.gif"><img src= "../../common/images/article236/test_with_cat_th.gif" width= "235" height="194" alt= "[talking to the LCD panel over the serial line]" hspace="5" align="right"></a> Bevor man die serielle Schnittstelle benutzen kann, muß man sie initialisieren. Das Quellcodearchiv, linuxlcdpanel-0.7.tar.gz, enthält ein Programm namens ttydevinit, das diese Initialisierung übernimmt. Falls das Kontrollfeld und COM2 (ttyS1) angeschlossen sind, dann muß man einmal folgendes Kommando ausführen: <p class="code">./ttydevinit /dev/ttyS1</p> Nun ist die serielle Schnittstelle im Server initialisiert für eine Übertragungsrate von 9600 Baud und du kannst mit dem Kontrollfeld "reden". Dazu öffnet man zwei xterm Fenster. In einem tippt man "cat /dev/ttyS1" und in dem anderen "cat > /dev/ttyS1". Nun kann man z.B l=11 (LED 1 wird eingeschaltet) oder l=10 (LED 1 aus) eintippen. In dem ersten xterm Fenster sieht man, daß das Kontrollfeld immer auf die Befehle mit "ok" antwortet.<br> Alle verfügbaren Befehle sind in der Datei <a href="../../common/src/article236/c/index.html">README.commands</a> erklärt.<br> <br> Das Quellcodearchiv enthält auch ein Perlscript namens ttytest.pl, das nichts anderes macht, als die rote LED in Abständen ein und wieder auszuschalten. Es ist gedacht als ein einfaches Beispielprogramm, in dem man sehen kann, wie das Kontrollfeld angesteuert wird. Du kannst es benutzen, um deine eigenen Programme zu schreiben. Dazu brauchst Du nur Grundkenntnisse in Perl. <A NAME="236lfindex7"> </A> <H2>Die Watchdog anschließen</H2> Die Watchdog ist standardmäßig aus. Man schaltet sie mit dem Befehl w=1 an und man setzt die Zeit mit s=x, wobei x einen Wert zwischen 1 und 255 haben muß. s=10 setzt den Watchdog-timeout auf 10*16sec=160sec. Das Ansteuerprogramm muß diesen Wert periodisch setzen, um zu verhindern, daß die Watchdog zuschlägt. Falls sich der Server irgendwann mal aufhängt, dann wird dieser Wert nicht gesetzt, und wenn er auf Null heruntergezählt hat, gibt es einen Reset. Linuxserver sind sehr stabil und bleiben fast nie stehen. Wenn es jedoch mal passiert, ist meist niemand da, der den Resetknopf drücken könnte oder niemand weiß, wo der Server steht, weil er noch nie Probleme gemacht hat.<br> <br> Die Watchdog ist so gebaut, daß sie nur einmal zuschlägt. Das verhindet, daß sie während des vermutlich folgenden Filesystem Check schon wieder zuschlägt. <br> <br> Um die Watchdog physikalisch anzuschließen, muß man die zwei Drähte finden, die zu dem Resettaster am Server führen. Das Relai unserer Watchdog wird parallel dazu angeschlossen. <A NAME="236lfindex8"> </A> <H2>Wie man die Watchdog benutzt</H2> Die Watchdog stellt sicher, das der Server immer Programme ausführen kann. Sie stellt nicht sicher, daß ein Webserver läuft oder die Datenbank antwortet. Um so etwas zu überprüfen, sollte man crontab oder ein anderes Programm benutzen. Man kann recht sicher sein, daß crontab vermutlich funktioniert, weil die Watchdog sicherstellt, daß Software im allgemeinen immer noch ausgeführt werden kann.<br> <br> Man kann z.B ein Script schreiben, das von cronjob regelmäßig ausgeführt wird und alle 15 Minuten eine Webseite von dem Webserver herunterlädt. Es ist jedoch Vorsicht geboten. Ein Webserver kann mit zu vielen Anfragen überladen sein. In diesem Fall ist es normal, daß er nicht alle beantwortet. Man sollte daher zählen, wie oft der Server versagt hat und ihn erst über das Script rebooten, falls er z.B die letzten 10 mal nicht geantwortet hat. Hier reicht ein normaler reboot (shutdown -r), ein Reset über die Watchdog ist nicht erforderlich. <br> <br> Abgesehen von den Applikationen sollte man auch den freien Plattenplatz überwachen. Das folgende Shellscript gibt z.B. nur etwas zurück, wenn 80% oder mehr von einer Partition belegt sind. <p class="code">df | egrep ' (8.%|9.%|100%) '</p> Über crontab kann man damit regelmäßig prüfen, ob noch genug Platz vorhanden ist und eine e-Mail schicken, wenn der Platz knapp wird (corntab verschickt Bildschirmausgaben automatich per e-Mail). <A NAME="236lfindex9"> </A> <H2>Die Scripte auf dem Server</H2> Fast die gesamte Logik für unser Linux LCD Kontrollfeld ist in einem Perlscript namens llp.pl implementiert. Kopiere diese Datei nach /usr/sbin/. Als nächstest kopiere die Datei ttydevinit nach /usr/bin und die Datei ifconfig_llp.txt (aus dem etc Verzeichnis im Quellcodearchiv) nach /etc. Nun editiere die Datei ifconfig_llp.txt und ändere die Adressen wie gewünscht. <p class="code">NETMASK=255.255.255.0<br> IPADDR=10.0.0.4<br> GATEWAY=10.0.0.2</p> Nun sollte man eine Sicherheitskopie der Datei /etc/rc.d/init.d/network erstellen und dann die Datei etc/network aus dem Quellcodearchiv nach /etc/rc.d/init.d/network kopieren. Dieses Script und die Verzeichnisnamen beziehen sich auf Redhat und Mandrake. Das Script etc/network_all_distributions ist ein etwas einfacheres Script, das für alle Distributionen geeignet ist, man muß jedoch selbst herausfinden, wo in einer gegebenen Linuxdistribution die init-rc Verzeichnise sind. Das ist immer etwas unterschiedlich von Linuxdistribution zu Linuxdistribution.<br> <br> Editiere nun die Datei /etc/rc.d/init.d/network und ändere die Zeile <p class="code">/usr/sbin/llp.pl /dev/ttyS1&,</p> falls du nicht COM2 benutzt. <br> <br> Nun kann man <p class="code">/etc/rc.d/init.d/network start</p> tippen und das Kontrollfeld füllt sich mit Leben. Beachte: es ist unproblematisch, die IP Adressen über das Kontrollfeld zu ändern. Sie werden erst beim nächsten Reboot wirksam. Man kann daher alles austesten und anschließend die Werte wieder zurücksetzen (man kann auch einfach die Datei /etc/ifconfig_llp.txt editieren, um die Änderungen rückgängig zu machen). <A NAME="236lfindex10"> </A> <H2>Log files</H2> Das llp.pl Script schreibt ein Logfile nach /var/log/llp.log. Diese Datei wird nur sehr langsam größer. Es sollte normalerweise keine Notwendigkeit geben, sie über logrotate zu rotieren. Man kann es jedoch machen. Es ist kein post rotate Befehl in logrotate dazu nötig. Ein Konfigurationseintrag für logrotate könnte so aussehen: <p class="code">/var/log/llp.log {<br> nocompress<br> monthly<br> }<br> </p> Das Log enthält Einträge, wenn das System manuell heruntergefahren wird, eine IP Adresse geändert wurde (IP, GW, netmask) oder wenn es einen Watchdog Reset gab. Naturgemäß kann man den Watchdog Timeout nicht loggen, wenn er passiert. Er wird beim nächsten Hochfahren in das Log geschrieben. <A NAME="236lfindex11"> </A> <H2>Das Kontrollfeld im Betrieb</H2> Hier sind einige Fotos der LCD Anzeige. Es sind nur Beispiele. Die Anzeige verfügt über wesentlich mehr Möglichkeiten und man kann seine eigenen Sachen hinzufügen. <br> <br> Das Hauptmenü. Es zeigt einen Namen (Linuxfocus in diesem Fall) und die Uptime sowie CPU load. Es ändert sich periodisch von selbst.<br> <img src= "../../common/images/article236/display_inaction1.jpg" width= "395" height="137" alt="[main]"> <br> <br> Das IP Konfigurationsmenü<br> <img src= "../../common/images/article236/display_inaction2.jpg" width= "395" height="127" alt="[IP configuration menu]"> <br> <br> Ein Beispiel, wie die IP Adresse gerade geändert wird.<br> <img src= "../../common/images/article236/display_inaction3.jpg" width= "395" height="124" alt="[change IP]"> <br> <br> ... und wie die Gateway Adresse (default route) geändert wird<br> <img src= "../../common/images/article236/display_inaction5.jpg" width= "395" height="128" alt="[GW]"> <A NAME="236lfindex12"> </A> <H2>Zusammenfassung</H2> <img src= "../../common/images/article236/linuxlcdpanelfinal.jpg" width= "386" height="275" alt="[the final panel]" align="right"> Um dieses Kontrollfeld zu bauen, ist etwas an Hobbyelektronikgeschick nötig, aber es ist keine komplizierte Schaltung. Dieses Linux Kontrollfeld bietet mehr Funktionen als jedes andere LCD Bedienfeld, das ich bisher gesehen habe, es ist sehr allgemein gehalten und preiswert.<br> <br> Frohes löten :-) <br clear="all"> <A NAME="236lfindex13"> </A> <H2>Referenzen</H2> <ul> <li>Die uisp AVR Programmiersoftware: <a href= "http://www.amelek.gda.pl/avr/">www.amelek.gda.pl/avr/</a></li> <li>Der Quellcode für diesen Artikel <a href= "../../common/src/article236/linuxlcdpanel-0.7.tar.gz">linuxlcdpanel-0.7.tar.gz</a><br> Der Schaltplan, die Eagle Dateien und ein paar Fotos sind auch enthalten.</li> <li>Alle Software und Dokumentation <a href="../../common/src/article236/index.html">aus diesem Artikel</a></li> <li>Datenblatt für MAX232 <a href= "../../common/src/article236/MAX220-MAX249.pdf">MAX220-MAX249.pdf 448K</a></li> <li>Datenblatt für ST232, eine billige Variante, oft anstelle des echten MAX232 verwendet. <a href= "../../common/src/article236/st232.pdf">st232.pdf 100K</a></li> <li>Datenblatt für Atmel AT90S4433 <a href= "../../common/src/article231/avr4433.pdf">avr4433.pdf 2356K</a></li> <li>Die Atmel Webseite: <a href= "http://www.atmel.com/">www.atmel.com</a></li> <li>Eagle für Linux <a href= "http://www.cadsoftusa.com/">cadsoftusa.com</a></li> </ul> <!-- vim: set sw=2 ts=2 et tw=80: --> <!-- BODY_OF_THE_ARTICLE_STOP --> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Talkback für diesen Artikel</h2> Jeder Artikel hat seine eigene Seite für Kommentare und Rückmeldungen. Auf dieser Seite kann jeder eigene Kommentare abgeben und die Kommentare anderer Leser sehen: <center> <table width="250" border=0><tr><td> <div class="tbbutton"><A class="nodec" href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=236"> Talkback Seite </a></div> </td></tr></table> </center> <br clear="all"> <HR size="2" noshade> <table width="250" border=0><tr><td> <div class="bbutton"><a class="nodec" href="../../index.shtml"><--, LF Home</a></div> </td><td> <div class="bbutton"><a class="nodec" href="index.shtml">Zum index dieser Ausgabe</a></div> </td></tr></table> <br clear="all"> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%" summary="footer"> <TR><TD ALIGN=CENTER BGCOLOR="#bdc6d5" WIDTH="50%"> <A HREF="../../common/lfteam.html">Der LinuxFocus Redaktion schreiben</A> <BR><FONT COLOR="#1111aa"><a href="../../common/copy.html">© Guido Socher</a><br>"some rights reserved" see <a href="../../license/index.shtml">linuxfocus.org/license/</a><br><a href="http://www.linuxfocus.org">http://www.LinuxFocus.org</a></FONT> </TD> <TD BGCOLOR="#bdc6d5"> <!-- TRANSLATION INFO --> <font size=2>Autoren und Übersetzer:</font> <TABLE summary="translators"> <tr><td><font size="2">en --> -- : Guido Socher (<a href="http://linuxfocus.org/~guido/"><font size="1">homepage</font></a>)</font></td></tr> <tr><td><font size="2">en --> de: Guido Socher (<a href="http://linuxfocus.org/~guido/"><font size="1">homepage</font></a>)</font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2005-02-11, generated by lfparser version 2.52</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>