Een LCD controlepaneel voor je Linux server

ArticleCategory: [Choose a category, do not translate this]

Hardware

AuthorImage:[Here we need a little image from you]

[Guido Socher]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to nl Guus Snijders

AboutTheAuthor:[A small biography about the author]

Guido houdt van Linux. Niet alleen omdat het interessant is te leren hoe een besturingssysteem werkt, maar ook vanwege de mensen die betrokken zijn bij het ontwerp ervan.

Abstract:[Here you write a little summary]

In dit artikel ontwerpen we een LCD controlepaneel, gebaseerd op een Hitachi HD44780 LCD en de AT906-S4433 AVR 8-bit RISC Microcontroller van Atmel. Beide componenten komen veel voor, en zijn niet duur. Het controlepaneel bevat een watchdog om de computer in de gaten te houden en heeft 2 knoppen voor een dialoog met de gebruiker. Je kunt het IP adres, netmask en het adres v/d gateway ermee instellen, maar ook de computer afsluiten, statistieken lezen, eigenlijk zo'n beetje alles wat je maar kunt bedenken, want de meeste logica zit in het Perl script en kan eenvoudig worden aangepast. Het paneel wordt via de seri�le lijn op de computer aangesloten.

Voor dit artikel heb je op z'n minst een gedeeltelijke installatie van de Linux AVR ontwikkelomgeving nodig. Hoe je die kunt installeren is beschreven in het artikel De AVR Microcontroller programmeren met GCC.

ArticleIllustration:[This is the title picture for your article]

[Illustration]

ArticleBody:[The article body]

Introductie

Dit apparaat combineert in principe functionaliteit van hardware die eerder is gebruikt in voorgaande artikelen: Dit nieuwe ontwerp gaat veel verder dan dat. Het voegt knoppen toe voor interactie met de gebruiker en bevat een hardware watchdog om de server in de gaten te houden. In aanvulling daarop bevat de hardware een analoge input lijn. Deze wordt hier niet gebruikt, maar je zou deze bijvoorbeeld kunnen gebruiken om een temperatuur sensor aan te sluiten.

Om dit te ontwerpen zijn een paar hobby electronica vaardigheden vereist. De onderdelen die we gebruiken zijn goedkoop, en kosten samen minder dan 40 Euro.

Het idee achter dit paneel is dat het je in staat stelt je server te bedienen zonder monitor of toetsenbord. Linux is een erg betrouwbaar server OS en kan eenvoudig op afstand beheerd worden. Echter, de eerste keer dat je het aansluit op een netwerk, zul je een IP adres moeten opgeven, net als een gateway adres en de netmask. Dit paneel stelt je in staat om deze adressen in te stellen. Het geeft je ook de mogelijkheid om de server af te sluiten terwijl je nog in de server ruimte bent.

Het ontwerp van dit paneel is heel algemeen. Alle "server specifieke" delen zijn ge�mplementeerd in een perl script. De volledige hardware, de status van de knoppen, tekst op de dispay, LEDs..., kunnen worden aangestuurd via ASCII commando's. Daardoor kun je het ontwerp gebruiken om een mp3 speler te bouwen, of je broodrooster aan te sturen, wat je maar wilt.

Benodigdheden

Om dit te bouwen, zijn volgende onderdelen nodig:

1 x Atmel At90S4433 Microcontroller
1 x 28pin 7.25 mm IC voetje
1 x 16pin IC voetje
1 x MAX232
1 x klein 5V relais
1 x 4MHz kristal
2 x LEDs (groen en rood)
1 x BC547 NPN transistor
1 x BC557 PNP transistor
4 x 1uF condensator (mag electrolytisch zijn)
2 x 27pF keramische condensator
1 x 10nF condensator
1 x 100nF condensator
3 x weerstand 4k7
2 x weerstand 2k2
1 x weerstand 10K
1 x weerstand 3k3
2 x weerstand 100 Ohm
3 x weerstand 470 Ohm
3 x weerstand 1k
1 x weerstand 220 Ohm
1 x 4K7 potmeter (zo klein mogelijk)
1 x Z-diode 4.3V
2 x kleine druk knoppen
1 x kleine standaard diode (bijv. 1N4148, een willekeurige goedkope diode)
1 x 2-lijns, 20 karakter LCD display met een HD44780 compatible interface.

Alle LCD's met 14 of 16 pennen aan de connector die ik ooit heb gezien waren compatibel met de HD44780. Je zou ook gebruik kunnen maken van 3- of 4- regelige display, maar dan moet de software een beetje worden aangepast.

Schema en printplaat

Voor het ontwerp van het schema en de printplaat heb ik gebruik gemaakt van Eagle voor Linux. Het is een fantastisch pakket, maar kost enige tijd om het leren. Voor privé-gebruik is er een gratis versie verkrijgbaar op cadsoftusa.com.

Het schema (klik erop voor een groter plaatje):
[Schematic]

De printplaat (klik erop voor een groter plaatje):
[board]


De layout van de printplaat op een witte achtergrond voor het printen: printplaat met witte achtergrond (Noot: dit is niet het bestand dat je nodig hebt om het geprinte circuit te maken.)

De eagle bestanden (ingepakt met gzip, merk op dat sommige slimme browsers uitpakken tijdens het downloaden):

De schakeling

Bovenstaande schakeling zal ik hier kort uitleggen. De AT90S4433 microcontroller heeft 3 poorten: PB, PC en PD. PC kan gebruikt worden als een analoge of digitale ingang. Alle poorten kunnen gebruikt worden als digitale ingang en uitgang. Dit wordt geregeld door de software via het DDR (Data Direction Register). Behalve pen 23 kunnen we alle pennen gebruiken voor digitale lijnen (0 of 5V). De Max232 is een voltage regelaar. De RS232 interface gebruikt +- 10V en de Max232 converteert dit naar 0-5V. Op pen 1 (reset pen) van de AT90S4433 zul je iets vinden met de naam Brownout circuit. Dit circuit houdt de reset laag (actief) tijdens periodes van falende voeding om te voorkomen dat de CPU fouten gaat vertonen of verkeerde instructies gaat uitvoeren. Dit kan enkele miliseconden lang voorkomen tijdens in- of uitschakelen. In principe verzekert dit dat het programma op de Microcontroller correct wordt gestart.

Sommigen vragen zich misschien af waarom er een diode paralel is geschakeld met de spoel van het relais met de polariteit zodanig dat het lijkt alsof het nooit wat te doen heeft. Deze diode is zeer belangrijk! Zodra je het relais uitschakelt ontstaat er een erg hoog voltage, dat wordt opgewekt door de spoel. Dit kan de Microcontroller vernietigen. Dit voltage heeft een tegengestelde polariteit ten opzichte van het voedings voltage van de spoel. De diode mag een willekeurige goedkope, kleine diode zijn, niks bijzonders, maar het is belangrijk om deze te hebben.

De 2 drukknoppen worden op de connector aangesloten die in het schema is gemarkeerd als "DIGITAL IN PUSH BUTTON". Zij verbinden PD3 of PD6 met aarde wanneer ingedrukt.

Het maken van de printplaat

Om de printplaat te maken, moet je eerst dit postscript bestand (linuxlcdpanel.ps.gz) printen op transparante folie. Het beste kun je gebruik maken van een semi-transparante plastic folie met de naam Sinolit. Het wordt geproduceerd door Regulus en wordt veel gebruikt voor offset printing. Een ander goed alternatief is 60g papier + transparante spray (pausklar 21 van Kontakt Chemie). Het voordeel van papier en Sinolit is dat de toner van Laser printers er goede grip op heeft en een goed contrast geeft.
Ik heb het postscript bestand geconverteerd naar PDF voor het geval je niet de beschikking hebt over een postscript print systeem. De kwaliteit laat echter nogal te wensen over.
De belichtingstijd voor koper bekleedde, lichtgevoelige platen is afhankelijk van de lichtbron. Voor normale (huiskamer) lichtomstandigheden is het tussen de 1 en de 2 minuten. Je kunt ook gebruik maken van daglicht, maar probeer direct zonlicht te voorkomen (het is te sterk). Je zou misschien het beste kunnen experimenteren met strookjes van lichtgevoelige platen, om de meest optimale tijd te vinden, alvorens de 'echte' plaat te gebruiken.
[voor etsen]
De belichte en ontwikkelde plaat voor het etsen.


De belichte plaat moet dan gedurende enkele minuten ontwikkeld worden in NaOH (NatriumHydroxide). Daarna zou je het resultaat nauwkeurig moeten nakijken en eventueel correcties aanbrengen met een Edding 780 zwarte markeer stift (niet de permanent stift voor overheads, het is een stift met echte verf). Meestal maak ik de paden iets groter omdat ik van mening ben dat de paden van Eagle te klein zijn voor hobby gebruik.
[na etsen]
De klaargemaakte plaat, vóór het boren van gaten


Noot: Op de een of andere manier schijnt het voor fabrikanten onmogelijk te zijn om het eens te worden over een standaard layout en benaming van de pennen. Ik heb gebruik gemaakt van een klein 5V relais van Matsushita. Het door jou gebruikte relais kan over een andere penbezetting beschikken. Als dit het geval is, is het dus nodig om de plaat aan te passen (met een ets-bestendige markeer stift).

Als je tevreden bent, kun je de plaat etsen in FeC13 (ijzercloride). FeC13 geeft goede ets-resultaten op kamertemperatuur. Het is erg eenvoudig te gebruiken en daardoor geschikt voor thuisgebruik. De beste resultaten worden bereikt als de plaat rechtop staat, in een hoge houder. Koper deeltjes zijn zwaarder dan ijzer deeltjes, zodat, als je de F3C13 in een kleine platte buis laat lopen, de koperdeeltjes opeen gehoopt worden op de bodem, waar de plaat zich bevindt.

Als de plaat klaar is, is het verstandig om eerst de Edding markeer-inkt te verwijderen met behulp van terpentijn. De foto-resistente inkt kan erop blijven. Het zal verdampen als je erop soldeert en beschermt het koper.

De software voor de Microcontroller

De software voor de Microcontroller is opgedeeld in de volgende bestanden: Om de software tot in detail te begrijpen, raad ik aan om de datasheet van de microcontroller te lezen. Het is opgenomen in het referenties aan het eind van het artikel (of op www.atmel.com).
Om dit paneel te gebruiken hoef je echter de software niet te begrijpen. Je hoeft alleen maar de het broncode archief uit te pakken (download linuxlcdpanel-0.7.tar.gz op de download pagina) en typ:

make
make load

Of maak gebruik van de voor-gecompileerde software en laad het met het commando
make loadprebuild

Erg eenvoudig. Een beschrijving van hoe het programmeren van de Microcontroller in z'n werk gaat, is te vinden in het eerste artikel: De AVR Microcontroller programmeren met GCC.

Testen van de LCD

De LCD is ontworpen om te werken met de 5V interne voeding van je server (rode kabel=5V, zwarte kabel=aarde). Het is verstandig om hem de eerste keer niet gelijk op de voeding van een computer aan te sluiten. Stel je voor dat je een fout hebt gemaakt tijdens het soldeer- en assemblage proces. De voeding van de computer is zeer krachtig en zowel je computer als de printplaat zouden in rook kunnen opgaan als je een fout hebt gemaakt. Test eerst met een externe, electronisch gestabiliseerde en stroom-gelimiteerde voeding! Nu kun je de software in de EEPROM laden zoals hierboven beschreven. Daarna zou je een "linuxfocus.org" banner moeten zien scrollen. Nu is het tijd om de RS232 interface aan te sluiten:

MAX232 pin 14 naar CTS (DB-9 pin 8)
MAX232 pin 7 naar RXD (DB-9 pin 2)
MAX232 pin 13 naar TXD (DB-9 pin 3)
Het kan ook nodig zijn om DTR, DSR en CD met elkaar te verbinden (DB-9 pin 4, 6 en 1)

Dit is ook gedocumenteerd in het schakeldiagram.

[spreken met de LCD over de seriële lijn] Om gebruik te maken van de seri�le lijn, moet je deze eerst initialiseren. Het broncode-archief linuxlcdpanel-0.7.tar.gz bevat een programma met de naam ttydevinit die deze initialisatie uitvoert. Stel dat je het paneel op COM2 (ttyS1) hebt aangesloten, dan moet je eenmalig dit commando uitvoeren:

./ttydevinit /dev/ttyS1

Nu is driver van de seri�le lijn ingesteld om 9600 Baud te gebruiken en kun je beginnen "spreken" met je LCD. Open 2 xterm vensters. In de ene type je 'cat /dev/ttyS1" en in de andere type je 'cat > /dev/ttyS1'. Nu kun je commando's als l=11 (schakel LED 1 in), of l=10 (schakel LED 1 uit) gebruiken. In de eerste xterm kun je zien dat ons LCD paneel de commando's bevestigt met "ok".
Alle beschikbare commando's worden uitgelegd in het README.commands bestand.

Het broncode-archief bevat een perl script, met de naam ttytest.pl, welke niets anders doet dan de rode LEDs in- en uitschakelen na bepaalde intervallen. Het is bedoeld als een eenvoudig voorbeeldprogramma dat laat zien hoe je de LCD kunt aansturen. Je kunt het als basis gebruiken voor je eigen programma. Kijk ook eens naar broncode. Het vereist enige kennis van perl, maar het is een vrij kort programma.

De watchdog inschakelen

Standaard staat de watchdog uitgeschakeld. Je kunt hem inschakelen met het commando w=1 en de timeout kun je regelen met s=x, waarbij x een waarde tussen 1 en 255 is. Dus s=10 geeft de watchdog een een timeout in 10*16sec=160 seconden. Het driver programma moet de timeout regelmatig bijstellen, om te voorkomen dat de watchdog ingrijpt. Mocht het voorkomen dat je server hangt, dan zal de driver de timeout niet langer bijstellen, en zal de watchdog ingrijpen. Ik weet wel dat Linux servers zelden hangen, maar áls ze hangen is er meestal niemand ter plekke om de resetknop in te drukken. Of niemand weet waar de server staat omdat er de afgelopen 2 jaar geen problemen mee zijn geweest.

Om de watchdog fysiek aan te sluiten, moet je op zoek gaan naar de 2 draden die naar de resetknop van je server leiden. Het relais van de watchdog sluit je hier parallel op aan.

Gebruik van de watchdog

Een watchdog garandeert dat het systeem altijd in staat is programma's uit te voeren. Het garandeert echter niet dat een webserver of database blijft draaien en reageren. Om dergelijke dingen te controleren zou je gebruik moeten maken van een crontab of andere programma's. Je kunt er vrij zeker van zijn dat de crontab beschikbaar blijft omdat de watchdog zorgt dat software in het algemeen blijft draaien.

Je zou bijvoorbeeld een script kunnen ontwerpen dat gestart wordt door een cronjob en iedere 15 minuten een webpagina downloadt van je webserver. Wees hier echter wel voorzichtig mee: een webserver kan zwaar belast worden door heel veel aanvragen en het is normaal dat ze dan niet allemaal beantwoord worden. Daarom zou je moeten tellen hoe vaak de webserver niet antwoordt. Je zou dan de webserver kunnen herstarten of een normale reboot starten (geen harde reset via de watchdog).

Behalve de applicatie zou je ook het gebruik van schijfruimte moeten monitoren. Het volgende shell commando zal iets 'teruggeven' wanneer een van de schijfpartities voor meer 80% vol is:

df | egrep ' (8.%|9.%|100%) '

Ook dit kan gebruikt worden in combinatie met een crontab om regelmatig het schijfgebruik te controleren.

De scripts op de server

Bijna alle logica van ons-LCD paneel is ge�mplementeerd in een perl script, genaamd llp.pl. Kopieer dit bestand naar /usr/sbin. Plaats daarna een kopie van het programma ttydevinit in /usr/bin en het bestand ifconfig_llp.txt (in de etc directory van het broncode archief) in /etc. Open nu het bestand ifconfig_llp.txt en verander de adressen naar wens:

NETMASK=255.255.255.0
IPADDR=10.0.0.4
GATEWAY=10.0.0.2

Maak nu eerst een backup van je originele /etc/rc.d/init.d/network script en kopieer het /etc/network script van het broncode archief naar /etc/rc.d/init.d/network. Dit script en de directory namen zijn alleen geldig voor RedHat en Mandrake. Het script /etc/network_all_distributions is meer algemeen en werkt met alle Linux distributies, maar je moet wel kijken waar jouw distro zijn init-rc directories heeft gelaten. Er zijn kleine verschillen tussen de verschillende distributies.
Open het bestand /etc/rc.d/init.d/network en verander de regel

/usr/sbin/llp.pl /dev/ttyS1&

als een andere poort (dus niet COM2) gebruikt.

Nu kun je gebruiken maken van

/etc/rc.d/init.d/network start

om je LCD paneel in actie te zien. Noot: Je kunt veilig spelen en het IP adres veranderen. De veranderingen worden pas actief na de volgende reboot. Daarom, test de mogelijkheden en verander het terug voor je de server herstart (je kunt ook /etc/ifconfig_llp.txt bewerken om de wijzigingen ongedaan te maken).

Logbestanden

Het script llp.pl schrijft een logbestand naar /var/log/llp.log. Dit bestand zal langzaam groeien. Normaal gesproken zou het nauwelijks de moeite waard zijn deze automatisch te laten roteren. Je zou het kunnen laten roteren met een programma als logrotate. Een post rotate actie is niet nodig. Een regel in het configuratie bestand van logrotate zou er zo uit kunnen zien:

/var/log/llp.log {
nocompress
monthly
}

Het log zal meldingen bevatten als het systeem handmatig werd afgesloten, een IP adres veranderd is (IP, GW, netmask) of als de hardware watchdog een reset heeft gestart. Natuurlijk kun je een timeout van de watchdog niet loggen (het systeem hangt dan immers) maar in plaats daarvan zal het gelogd worden tijdens de volgende startup.

Het paneel in actie

Hier zijn een paar "screenshots" van het LCD paneel tijdens gebruik. Dit zijn niet alle functies die worden aangeboden met dit paneel! Er zijn er meer en je kunt je eigen uitbreidingen toevoegen.

Het hoofdscherm. Geeft een naam weer (linuxfocus in dit geval), uptime en belasting. Deze wordt periodiek ge�pdate.
[hoofd]

Het IP configuratie menu
[IP configuratie menu]

Voorbeeld van een IP adres dat wordt gewijzigd
[IP wijziging]

Het veranderen van het gateway adres (default route)
[GW]

Conclusie

[het uiteindelijke paneel] Het bouwen van dit LCD paneel vereist enige hobby vaardigheden maar het is geen erg complexe schakeling. Ons Linux LCD paneel biedt meer functionaliteit dan ieder ander paneel dat ik ooit gezien heb en is erg algemeen en goedkoop.

Prettig soldeerwerk :-)

Referenties