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]
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]
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):
De printplaat (klik erop voor een groter plaatje):
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.
|
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.
|
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:
- lcd.c, lcd.h, lcd_hw.h:
Dit is een algemene avr LCD libray (bibliotheek). Het is gebaseerd op het
werk van Peter Fleury (http://jump.to/fleury). Deze versie is een beetje
gewijzigd en flexibeler. Het laat toe om de LCD hardware op alle pennen
van de Microcontroller aan te sluiten. Het enige wat je hoeft te doen is
het wijzigen van de definitie in het bestand lcd_hw.h.
- avr-util.c, avr-util.h:
Functies voor verschillende vertragingen.
- uart.c, uart.h: Dit is een
library voor de RS232 interface. Het gebruikt hardwarematige interrupts. Iedere
keer dat er een karakter wordt ontvangen van de computer, zal de functie
SIGNAL(SIG_UART_RECV) worden uitgevoerd en wordt de data gekopiëerd naar
een string buffer. De commando taal voor ons LCD paneel is zo ontworpen
dat ieder commando eindigt met een 'newline' karakter. Als er een nieuwe
regel wordt gevonden, wordt de flag (uart_rx_linecomplete) gezet en wordt
de data beschikbaar gemaakt. Dit betekent ook dat je commando's niet zo
snel mogelijk naar de display moet zenden, maar even moet wachten (een
miliseconde) na iedere regel. Elk commando wordt bevestigd met een
resultaat, 'ok' of 'err' (voor error - fout). Het lopende perl programma kan
daardoor het resultaat gebruiken als een trigger om het volgende commando
te sturen.
- analog.c, analog.h: Code
voor de analoog naar digitaal convertor. Ook deze wordt aangestuurd door
interrupts. Een enkele analoog naar digitaal conversie wordt gestart en
daarna wacht het programma op de SIG_ADC interrupt om het resultaat uit
het het ADC register te lezen.
- hardwarewd.c,
hardwarewd.h: Dit is de watchdog. We gebruiken de interne divider -
deler -(delen door 1024) om pulsen naar de timer te sturen. De timer
is een 16 bits register, als we een overflow krijgen tellen we een 8 bits
variabele af. We gebruiken een 4MHz kristal om onze variabele iedere 16
seconden af te tellen. Het perl programma registreert dat de computer
draait door periodiek de timer terug te zetten naar een hoge waarde. Als
dit faalt (omdat de computer hangt), zal het aftellen van de variabele
doorgaan en zodra deze nul bereikt zal het relais ingeschakeld worden, en
een hardware reset van de server veroorzaken.
- linuxlcdpanel.c: Dit is
het eigenlijke programma. Het zal continu luisteren naar commando's van
de RS232 interface en het indrukken van knoppen.
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.
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.
Het IP configuratie menu
Voorbeeld van een IP adres dat wordt gewijzigd
Het veranderen van het gateway adres (default route)
Conclusie
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