ct.2204.236-240 08.10.2004 15:06 Uhr ©Seite 236 Praxis | Mikrocontroller im LAN Benjamin Benz, Thorsten Thiele Sensibelchen Mikrocontroller-Programmierung: Timer, Sensoren und Drehgeber Der c’t-Mikrocontroller-im-LAN kann verschiedenste Sensoren abfragen, um Temperaturen, Lichtintensitäten und andere physikalische Größen zu messen. Wenige Zeilen Programmcode fragen dazu Sensoren ab oder ermöglichen es, den Controller mit einem inkrementellen Drehgeber bequem zu bedienen. D as c’t-Projekt Mikrocontroller-im-LAN aus den Artikeln [1, 2] soll nun praktische Aufgaben übernehmen und Temperaturen und andere physikalische Größen messen. Die nötigen Messschaltungen für eine Vielzahl von Sensoren befinden sich schon auf dem B-Modul, wurden aber noch nicht detailliert besprochen. Bislang konnte der Controller (ATMega 8535) schon testweise Daten an PCs im Netzwerk übermitteln oder diese auf dem Display anzeigen. Die Benutzerführung auf dem LCD 236 gestaltete sich mit den bislang verwendeten Komponenten etwas schwierig. Hier sorgt ein inkrementeller Drehgeber, wie man ihn aus vielen modernen Geräten kennt, für Abhilfe. Bevor sich eine physikalische Größe mit einem Mikrocontroller messen lässt, muss ein geeigneter Sensor die Ursprungsgröße in eine elektrisch messbare verwandeln – zum Beispiel eine Temperatur in einen Widerstandswert. Im zweiten Schritt fällt über diesem Widerstand eine Spannung ab, die dann schließ- lich ein Analog-Digital-Umsetzer (ADU) in einen digitalen Wert verwandelt. Andere ebenfalls nutzbare Zwischengrößen sind Kapazitäts- (Kondensator) und Induktivitätsänderungen (Spule), die man beispielsweise in einen Schwingkreis einbauen kann. Gemessen wird dann die veränderte Frequenz des Schwingers. Edelmetall Zur Temperaturmessung bieten sich Messwiderstände wie der PT100 an. Diese sind in internationalen (IEC 751 und EN 60751) und einer deutschen Norm (DIN 60751) genau spezifiziert. Als Material kommt Platin (Pt) zum Einsatz, das in weiten Bereichen seinen Widerstand annähernd linear mit der Temperatur verändert. Die Zahl hinter dem Elementzeichen gibt den Wider- standswert (100 Ω) bei 0 °C an. Da die Widerstandsänderung jedoch nicht über den gesamten Temperaturbereich konstant ist, muss man für eine korrekte Umrechnung der gemessenen OhmWerte in Temperaturen zwei Abschnitte getrennt betrachten. Zwischen 0 °C und 180 °C gilt folgender Zusammenhang: R(T) = R0(1 + A·T + B·T2) A=3,9083·10–3·°C–1; B=–5,775·10-7 °C–2 im Bereich von –200 °C bis 0 °C kommt noch ein Term dritter Potenz hinzu: R(T) = R0(1 + A·T + B·T2 + C·T3) C=–4,183·10–12·°C–3 PT100-Temperaturfühler sind nach internationalen Normen spezifiziert und decken einen Messbereich von –200 °C bis +850 °C ab. c’t 2004, Heft 22 © Copyright by Heise Zeitschriften Verlag GmbH & Co. KG. Veröffentlichung und Vervielfältigung nur mit Genehmigung des Heise Zeitschriften Verlags. ct.2204.236-240 08.10.2004 15:06 Uhr ©Seite 237 Praxis | Mikrocontroller im LAN reich durch sukzessive Approximation in 1024 (210) gleich große Stufen ein. Als Referenzspannung und Obergrenze des Messbereichs dient entweder die analoge Versorgungsspannung (im vorgestellten Modul AVCC mit 5 Volt), der Eingang AREF oder eine interne Referenzspannung von 2,56 Volt. Welche der drei Varianten zum Einsatz kommt, legt die Firmware über die obersten beiden Bits im ADMUXRegister fest. Um die beiden PT100-Sensoren auszuwerten, nutzt unser Beispielcode die interne Referenz und richtet die zehn Daten-Bits rechtsbündig im 16-Bit-Ergebnis aus (ADLAR=0): #include <avr/io.h> ... ADMUX=(1<<REFS1)+(1<<REFS0)+— (0<<ADLAR); Das B-Modul besitzt zwei komplette analoge Messschaltungen für Temperatursensoren, die versuchen, möglichst viele Störeinflüsse zu vermeiden. Dazu betreibt es den Sensor an einer Konstantstromquelle, die ungefähr 1 mA durch den Sensor fließen lässt. Diese Aufgabe übernimmt etwas zweckentfremdet der einstellbare Spannungsregler LM317L (IC6). Er regelt seine Ausgangsspannung so, dass zwischen dem Justiereingang ADJ und dem Ausgang VO immer 1,25 V anliegen. Da der Widerstand R1 mit 1,3 kΩ deutlich größer als der PT100 ist, fließt durch beide näherungsweise konstant 1 mA. R38 dient nur dazu, den Spannungsregler ein wenig zu belasten, damit die Regelung einwandfrei arbeitet. Stufen zum Erfolg Nach dem Ohmschen Gesetz (U = R·I) fällt bei einem Messstrom von 1 mA am PT100 bei 0 °C 100 mV Spannung ab, bei 100 °C entsprechend 137,6 mV. Diese relativ kleinen Spannungswerte sind empfindlich gegenüber Störungen oder Belastungen, wie sie eine direkte Analognach-Digital-Umsetung mit sich bringen würde. Daher entkoppelt zunächst ein Verstärker mit dem Verstärkungsfaktor eins (IC4A) den Eingang von der folgenden Schaltung. Diese subtrahiert zunächst den Offset von 100 mV, damit der Messbereich bei 0 °C beginnt. Dazu erzeugt der Spannungsteiler R2/R3 eine Spannung von ebenfalls 100 mV, die IC4C wieder entkoppelt und IC4B als Subtraktor vom Messsignal abzieht. Zuletzt verstärkt IC4D das Signal so weit, dass es den Messbereich des A/D-Umsetzers voll ausnutzt. Die Verstärkung kann man mit dem Spindelpotentiometer TR1 relativ genau einstellen. Möchte man den Messbereich verschieben, um beispielsweise Temperaturen unter 0 Grad zu messen, muss man die OffsetSpannung (Spannungsteiler R2/ R3) anpassen. Die Schaltung ist ziemlich universell – die Subtraktionsstufe (R2, R3, IC4C) verschiebt die Eingangsspannung um beliebige Offsets und legt damit das untere Ende des Messbereiches fest, der nachgeschaltete Verstärker (TR1, IC4D) das obere Ende. So lassen sich auch alle anderen Sensoren anschließen, die eine Ausgangsspannung oder eine Widerstandsänderung erzeugen. Verwandlungskünstler Bevor der Mikrocontroller den Messwert weiter verarbeiten kann, muss er das analoge Signal in digitaler Form erhalten. Dazu besitzt der ATMega 8535 acht Eingänge (PA0 bis PA7), die über einen Multiplexer an einem einzigen 10-Bit-D/A-Umsetzer hängen. Dieser teilt den Eingangsbe- Die ADMUX-Bits null bis zwei wählen den Eingang aus, der mit dem Umsetzer verbunden werden soll. Die übrigen Bits (drei und vier) sind nur in speziellen Betriebsarten nötig und aktivieren unter anderem die differenzi- ellen Eingänge und den internen Verstärker. Genaue Informationen dazu liefert das Datenblatt (Soft-Link). Beim Eintragen der gewünschten Kanalnummern in die zuständigen Bits müssen alle anderen unverändert bleiben, was man durch das logische Oder (|-Operator) und die Maskierung (&-Operator) erreicht: ADMUX = ADMUX | (channel &; 0x07); Die Verknüpfung einzelner Bits kann man in C auch kürzer schreiben, wie die folgenden Zeilen mit dem logischen Und-Gleich (&=Operator) zeigen. Sie schalten den ausgewählten Kanal als Input-Pin und deaktivieren den internen Pullup-Widerstand, der nur für die Nutzung als digitaler Eingang benötigt wird: DDRA &= ~(1<<(channel & 0x07)); PORTA &= ~(1<<(channel & 0x07)); Für die Approximation eines Signals benötigt der Umsetzer ein Taktsignal, das ungefähr zehnbis fünfzehnmal höher liegt als die erwünschte Abtastrate. Diese sollte, sofern die maximale Auflösung erwünscht ist, 15 kHz nicht überschreiten. Daraus ergibt sich c’t-Projekt Mikrocontroller-im-LAN Der c’t-COM-auf-LAN-Adapter aus dem ersten Teil des Projektes [1] verbindet Geräte, die nur eine RS-232-Schnittstelle besitzen, mit dem LAN. So lässt sich zum Beispiel eine Telefonanlage im Keller fernwarten oder ein Modem aus der Ferne nutzen. Die PCs im LAN können sich auch ein so angeschlossenes Gerät teilen. Der c’t-Mikrocontroller-im-LAN [2] erweitert das Projekt um einen Mikrocontroller, der analoge Signale misst und über digitale Eingänge verfügt. Er kann über zwanzig digitale Ports steuern und mit seriellen Geräten kommunizieren. Aufgesteckt auf das COM-auf-LANModul lässt er sich über das Netzwerk fernsteuern und mit einem beliebigen Webbrowser überwachen. Die Webseiten zur Abfrage der Sensoren dürfen auch Java-Applets enthalten und können auf dem integrierten Webserver des A-Moduls abgelegt werden. Beispielcode dazu fin- Die untere Platine (c’t-COMauf-LAN) verbindet das B-Modul mit dem LAN. Über den integrierten Webserver und ein kleines Java-Applet kann jeder PC im Netzwerk den c’t-Mikrocontrollerim-LAN fernsteuern und Messwerte abfragen. det sich auf der Projektseite (Soft-Link). Wer lieber mit einer eigenen Software den Controller fernsteuert, dem steht sowohl für Linux als auch für Windows eine virtuelle COMSchnittstelle zur Verfügung. Hartgesottene können die beiden Module auch direkt über einen TCP/IP-Port ansprechen. c’t 2004, Heft 22 © Copyright 237 by Heise Zeitschriften Verlag GmbH & Co. KG. Veröffentlichung und Vervielfältigung nur mit Genehmigung des Heise Zeitschriften Verlags. ct.2204.236-240 08.10.2004 15:06 Uhr ©Seite 238 Praxis | Mikrocontroller im LAN P6 PT 100 Der PT100-Sensor ist über eine Dreileiterschaltung mit dem Eingang verbunden, bei der die Adern erst am Messpunkt miteinander verbunden sind. So fließt auf der Signalleitung nur ein sehr kleiner Strom und der Leitungswiderstand beeinflusst die Messung kaum. ein sinnvoller Umsetzertakt von maximal 200 kHz, den ein Teiler aus dem Chiptakt (14,7456 MHz) erzeugt. Wir haben uns für ein Teilerverhältnis von 128 (die drei untersten Bits im Register ADCSRA) beziehungsweise eine Frequenz von 115 kHz entschieden. ADCSRA=(1<<ADPS2)+(1<<ADPS1)+— (1<<ADPS0); Das Setzen zweier weiterer Bits leitet die Konvertierung schließlich ein: AVCC 3 2 1 4 R38 470Ω AVCC 3 + 2 – AVCC IC4B TLC2264 5 + 6 – 10k 7 IC4D TLC2264 12 13 R2 100k VO R1 1,3k ADJ R3 2k mit dem PT100 (adc) und mit einem normalen Thermometer (T). Die Faktoren errechnen sich dann wie folgt: d = (T1–T2)/ (adc1–adc2) und e = T1–d·adc. Im Beispiel-Quelltext (Soft-Link) kann man am Anfang der Datei adc.c die zwei Messpaare eintragen und die Temperaturen mit der Funktion pt100_read(kanal) in Hundertstel-Grad auslesen. Genau wie die Temperaturfühler kann man auch alle anderen Sensoren, über denen eine 10 + 9 – IC4C TLC2264 8 R5 while ((ADCSRA&(1<<ADSC))!=0){} adc = ADCL + (ADCH<<8); Um aus dem ADC-Wert eine Temperatur zu berechnen, müsste man eigentlich die weiter oben gennanten Formeln genau auflösen. Da die Faktoren B und C aber relativ klein sind und im Temperaturbereich zwischen 0 und 100 °C daher nur wenig ins Gewicht fallen, darf man sie im Regelfall vernachlässigen. Es ergibt sich dann eine einfache Geradengleichung: T = d·adc + e, deren Koeffizienten d und e sich anhand von zwei Stützstellen bestimmen lassen. Dazu misst man zwei möglichst weit auseinander liegende Temperaturen (zum Beispiel Zimmerund Heizungstemperatur) jeweils 1 2 3 4 +VO GND –VO VCC Spannung zwischen 0 und 2,56 V abfällt, auslesen. Ein Licht-Sensor (LDR) ändert seinen Widerstandswert zwischen 100 Ω und 20 kΩ und so reicht ein einfacher Spannungsteiler (R19) aus, um ihn direkt an den ADU anzuschließen (P9 auf dem B-Modul). Für empfindlichere Sensoren bietet sich eine Anpassung der oben beschriebenen PT100-Schaltung an. Wer Sensoren mit integrierter Messbrücke wie einen Magnetfeldsensor (zum Beispiel KMZ10B von Philips) verwenden will, kann einen der Differenz-Ein- R8 P10 4k7 ATMega 8535 TR1 50k 10k gänge mit internem Verstärker des ATMega nutzen. 1, 2, 3 … Unterbrechung Für regelmäßige Messungen lassen sich die Sensoren in einer Endlosschleife ständig abfragen, aber damit blockiert man den Mikrocontroller völlig. Viel eleganter ist es, einen der eingebauten Timer zu benutzen. Diese generieren in einstellbaren Intervallen Interrupt-Signale. Der Der Magnetfeldsensor KMZ10B besitzt eine interne Messbrücke und kann direkt an einen der analogen Differenzeingänge des ATMega angeschlossen werden. Ein lichtempfindlicher Widerstand (LDR) direkt am Analogeingang des Controllers reicht als Sensor für eine Dämmerungsschaltung aus. Zusammen mit den eingebauten Timern lässt sich eine helligkeitsabhängige Zeitschaltuhr mit Ethernet-Port aufbauen. 238 14 – 10k ADCSRA|=(1<<ADEN)+(1<<ADSC); Sobald das Ergebnis bereitliegt, steht das ADSC-Flag im ADCSRA-Register wieder auf null. Darauf wartet die Firmware in einer Warteschleife und setzt danach das Ergebnis aus den zwei 8-Bit-Registern in einer 16Bit-Variablen (adc) zusammen: + R7 IC6 LM317LZ VI 11 R6 10k IC4A TLC2264 1 R4 Prozessor unterbricht daraufhin seine aktuelle Arbeit und verzweigt in die zugehörige Interrupt-Service-Routine (ISR). Diese liest die Sensoren aus, speichert das Ergebnis ab und kehrt dann zum eigentlichen Code zurück. Der ATMega8535 bringt gleich drei solcher Timer mit (zwei mit 8- und einen mit 16Bit-Zähler), von denen jeder mehrere Interrupts auslösen clock Clear clock/ 8 kann. Wir betrachten hier einen der 8-Bit-Timer, da er für das periodische Auslesen der Sensoren ausreicht. Der Timer zählt ein 8-Bit-Register (TCNT0) mit jedem Clock-Signal um eins hoch, vergleicht es dann mit dem Compare-Register (OCR0) und löst wenn nötig einen Interrupt aus (OCF0 bei OCR0 gleich TCNT0, TOV0 bei Zählerüberlauf). Wie schnell dies geschieht, entscheidet der verwendete Zählertakt. Ein Vorteiler stellt verschiedene Frequenzen zur Verfügung, die er durch Teilen aus dem Systemtakt (14,7456 MHz) erzeugt. Im Timer-Control-Register (TCCR0) legen drei Bits (CS00 bis CS01) fest, welchen Takt der Zähler verwendet (Tabelle im Datenblatt). Temperaturen ändern sich vergleichsweise langsam – eine Messung alle 3 ms reicht für viele Zwecke aus. Der Acht-Bit-Timer kann nur bis 255 zählen und so fällt die Wahl auf den höchstmöglichen Teiler (1024) und somit einen Takt von 14,4 kHz. Der Vergleichswert ergibt sich dann zu (14,400 kHz x 3 ms –1 = 42): #define XTAL 14745600 #define clock 333 // 3ˇms --> 333ˇHz ... TCCR0 = (1<<CS00) | (1<<CS02) | — (1<<WGM01); OCR0 = (XTAL/1024/clock)–1; Das WGM01-Bit sorgt dafür, dass der Zähler nach jedem Erreichen 10-BIT PRESCALER clock/ 64 clock/ 256 clock/ 1024 PSR10 0 CS10 CS11 CS12 0 CS00 CS01 CS02 TIMER/COUNTER1 CLOCK SOURCE TIMER/COUNTER0 CLOCK SOURCE Aus dem Chiptakt von 14 MHz generiert der Teiler vier verschiedene Takte, die für die Timer als Referenz zur Verfügung stehen. c’t 2004, Heft 22 © Copyright by Heise Zeitschriften Verlag GmbH & Co. KG. Veröffentlichung und Vervielfältigung nur mit Genehmigung des Heise Zeitschriften Verlags. ct.2204.236-240 08.10.2004 15:06 Uhr ©Seite 239 Praxis | Mikrocontroller im LAN Mit einem inkrementellen Drehgeber kann man bequem durch Menüs scrollen und durch Drücken des Drehknopfes die Auswahl bestätigen. Geschickt programmierte Abfrageroutinen berücksichtigen auch die Drehgeschwindigkeit. des Vergleichswertes wieder bei null anfängt zu zählen. Den Anfangswert schreibt man direkt in das Timer-Register und aktiviert zuletzt die Interrupts: TCNT0 = 0; TIMSK |= (1<<OCIE0); sei(); Das OCIE0-Bit im TIMSK-Register schaltet den Vergleichs-Interrupt ein und das Makro sei(), das in avr/interrupt.h definiert ist, aktiviert systemweit alle Interrupts. Die Interrupt-Service-Routine unterscheidet sich dank weiterer Makros aus avr/signal.h kaum von einer gewöhnlichen C-Funktion. Sie beginnt mit dem Schlüsselwort SIGNAL, gefolgt vom Namen des zu behandelnden Interrupts: SIGNAL (SIG_OUTPUT_COMPARE0){ Temp[0]=read_adc(0); Temp[1]=read_adc(1); } Während der Ausführung der Funktion sind alle anderen Interrupts blockiert. Wer das nicht will, nutzt statt SIGNAL das Makro INTERRUPT, muss dann aber selbst dafür sorgen, dass sich Aufrufe nicht gegenseitig überlappen. Grundsätzlich gilt, dass ein Programm möglichst wenig Zeit in ISRs verbringen soll. Aufwendige Operationen gehören dort nicht hin, daher rechnet auch erst das Hauptprogramm die Sensorwerte in Grad Celsius um. Rechts – Links In der regelmäßig aufgerufenen ISR kann man neben Sensoren auch Eingabegeräte wie einen Drehimpulsgeber, kurz Drehgeber, auslesen. Da sich dessen Zustand vergleichsweise langsam ändert, klappt dieses einfache Polling-Verfahren. Bei schnell wechselnden Eingangssignalen bieten sich hingegen die Eingänge an, die bei jeder Pegeländerung einen eigenen Interrupt auslösen. Handelsübliche inkrementelle Drehgeber erzeugen beim Drehen an jedem ihrer zwei Ausgänge ein Rechtecksignal. Beide sind um 90 Grad zueinander phasenverschoben (siehe Grafik). So entsteht ein 2Bit-Code, bei dem sich immer nur ein Bit auf einmal ändert (Graycode). Die Drehrichtung kann man dann aus einer Zustandstabelle ablesen. Einen Anschlag zur Winkelbegrenzung, wie bei Potentiometern üblich, gibt es nicht. Die aktuelle Position des Gebers kann folglich nur inkrementell durch kontinuierliches Mitrechnen ermittelt werden. Als Zusatzfunktion besitzen viele Drehgeber noch einen Taster, mit dem man beispielsweise in einem Menü die Auswahl bestätigen kann. Dieser wird wie jeder andere Taster auch ausgelesen [2]. Vor der Auswertung des Graycodes werden die drei Ports (2xGeber und 1xTaster) als Eingänge geschaltet und ihre internen Pull-up-Widerstände aktiviert. Eine logische Eins am Port- A Ein Drehgeber erzeugt einen Graycode, bei dem zwei aufeinander folgende Werte sich immer in genau einem Bit unterscheiden. Die Drehrichtung liest man dann aus der Zustandstabelle aus. B A B BA 0 1 2 1 1 0 0 1 0 0 1 3 1 0 2 1 1 0 1 0 0 3 1 0 c’t 2004, Heft 22 © Copyright 239 by Heise Zeitschriften Verlag GmbH & Co. KG. Veröffentlichung und Vervielfältigung nur mit Genehmigung des Heise Zeitschriften Verlags. ct.2204.236-240 08.10.2004 15:07 Uhr ©Seite 240 Praxis | Mikrocontroller im LAN IO4 IO5 IO6 IO7 IO9 P10 1 2 3 4 5 6 const int8_t graytab[] = { 0,-1,1,0, 1,0,0,-1, –1,0,0,+1, 0,1,-1,0 }; R23 4k7 Drehgeber/ Joystick Das B-Modul besitzt schon einen Anschluss für den Drehgeber. Vertauscht man Pin eins und zwei, dann ändert sich auch die Zählrichtung der Geberauswertung. Diesen kumuliert die globale Variable drehgeber, die das Hauptprogramm auslesen kann. Es muss dabei nur beachten, dass je nach Bauform der Geber pro Rastung mehrere Zählerstände durchlaufen kann. Unser Exemplar zählt pro Rastung um zwei weiter, weswegen man seine Funktion nicht Bauteile Bauteil PT100 KMZ10B EVQWTA MPY 54C569 ULN2803 Bezugsquellen Beschreibung Temperaturfühler Magnetfeldsensor Drehgeber mit Taster Fotowiderstand Transistor Array (NPN) Quelle www.emedia.de www.segor.de über der Betriebsspannung liegen. Der maximale Kollektorstrom richtet sich nach dem Innenwiderstand der Last. Um diese Schaltung für mehrere Ausgänge nicht jeweils ein- Pin entspricht damit einem geöffneten, eine Null dem geschlossenen Schalter. #define DREH_A 0x10 #define DREH_B 0x20 #define DREH_TAST 0x40 DDRC &= ~ (DREH_A + DREH_B + — DREH_TAST); PORTC |= (DREH_A + DREH_B + — DREH_TAST); Zum Abfragen des Drehgebers muss man der Timer-ISR nur einen Aufruf der im folgenden erklärten Funktion dreh_isr() hinzufügen. Der von uns verwendete Drehgeber erzeugt pro ganzer Drehung 60 Zustandsänderungen (zwei pro Rastung). Für die Abtastfrequenz von 333 Hz bedeutet dies: Alles unter zweieinhalb Umdrehungen pro Sekunde wird garantiert fehlerfrei abgetastet. Wem das nicht reicht, der kann den Wert im OCR0-Register herabsetzen. Die Abfrageroutine liest bei jedem Aufruf den aktuellen Zustand der beiden Geber-Pins ein und speichert sie in derselben Variable (Bits zwei und drei), in der auch die des letzten Aufrufes stehen (Bits null und eins): void dreh_isr(void){ graycode >= 2; if( (PINC & DREH_A) == DREH_A ) graycode |= 0x04; if( (PINC & DREH_B) == DREH_B ) — graycode |= 0x08; drehgeber += graytab[graycode]; ... } Dadurch entsteht ein Code, der für jede der möglichen Zustandsänderungen einen eigenen Wert enthält. Eine einfache Tabelle (graytab[]) mit 16 Werten verbindet jeden Zustand mit einem Wert für die Positionsänderung (+1 für Rechtsdrehung, –1 für eine Linksdrehung). 240 Ein Feuchtesensor wandelt Änderungen der relativen Luftfeuchtigkeit zwischen zehn und neunzig Prozent in Kapazitätsänderungen von 100 bis 150 pF um. Einen IR-Sensor schließt man am besten an einen der Mikrocontroller-Eingänge an, die bei Pegeländerung einen Interrupt auslösen können. Die Dekodierung der RC5-Fernbedienungscodes erfolgt dann in Software. vollständig mit einem DigitalMultimeter nachprüfen kann. Die oben beschriebene Funktion eignet sich auch, um den Taster des Gebers mit auszulesen (Soft-Link). zeln aufbauen zu müssen, gibt es ICs mit Transistor-Arrays (zum Beispiel ULN2803, Ausgangsspannung bis 50 V). Sie enthalten sieben oder acht einzelne Transistoren mit zusammengeschalteten Emittern und integrierten Basiswiderständen. Für induktive Lasten halten sie noch eine Freilaufdiode für jeden Ausgang bereit. An – Aus – An Der Atmega kann nicht nur Signale aufnehmen, sondern sie auch mit seinen I/O-Pins erzeugen. Jeder Port-Pin kann bis zu 20 mA in beide Richtungen (nach High und nach Low) treiben. Allerdings ist der Gesamtstrom pro Port auf rund 100 mA und für den kompletten Chip auf 200 mA begrenzt. Die 20 mA eines Pins sind gut geeignet, um LEDs anzusteuern – für Relais, Motoren oder Glühbirnen reicht das aber nicht aus. Zudem sind die Ausgänge nicht potenzialfrei und können nur Geräte ansteuern, die mit demselben Massepotenzial arbeiten. Benötigt man nur mehr Strom oder Spannung bei gleichem Bezugspotenzial, so reicht ein Transistor am Ausgang. Der Transistor muss sowohl zum gewünschten Laststrom als auch zur Betriebsspannung des Verbrauchers (V+) passen. Die Sperrspannung muss Vermittler Potenzialfreie Ausgänge erhält man zum Beispiel mit einem kleinen Relais, das ein Transistor V+ Px 4k7 ATMega Die Ausgänge des Controllers liefern bis zu 20 mA Strom. Reicht dies nicht aus oder ist eine höhere Schaltspannung nötig, hilft ein NPN-Transistor mit Basiswiderstand weiter. Bauteil Platinen A- und B-Modul Bauteilsätze treibt. Dabei schützt eine Diode (1N4148) in Gegenrichtung (Kathode an Betriebsspannung) parallel zur Relaisspule den Transistor vor Spannungsspitzen. Diese entstehen in der Spule beim Abschalten der Relaisspannung. Netzspannung sollte man mit dem Relais aber keinesfalls schalten, da für das 230-VoltNetz zahlreiche Sicherheitsbestimmungen zu beachten sind. Deutlich schneller und langlebiger als Relais sind Optokoppler. Sie bestehen aus einer Leuchtdiode und einem Fototransistor in einem lichtdichten Gehäuse. Die Leuchtdiode lässt sich mit einem Vorwiderstand direkt von einem Port-Pin des Atmega ansteuern, der Fototransistor arbeitet als normaler Schalttransistor im Zielsystem. Ausblick Um die Messwerte von den einzelnen Sensoren komfortabel auszuwerten und auch die Stellgrößen für die Ausgänge zu verändern, bietet sich der Webserver des A-Moduls an. Codebeispiele dazu gab es bereits im zweiten Teil des Projektes [2]. Das B-Modul bietet genug Raum für eigene Experimente, auch mit Sensoren, die ihre Kapazität oder Induktivität ändern. Sie erfordern aber deutlich mehr Beschaltungsaufwand, da ihre Eigenschaftsänderungen nicht direkt eine Messspannung erzeugen. Für den Austausch von eigenen Ideen steht weiterhin das Leserforum (Soft-Link) zur Verfügung. Dort gibt es schon rege Diskussionen zu möglichen Erweiterungen von Hard- und Software. Programme von Lesern stellen wir auch gerne auf die Projektseite (Soft-Link). (bbe) Literatur [1]ˇBenjamin Benz, Brücken bauen, Umsetzer von Ethernet nach RS232 im Eigenbau, c’t 13/04, S. 200 [2]ˇBenjamin Benz, Fernkontrolle, Mikrocontroller zum Messen und Steuern über das LAN, Teil 2, c’t 14/04, S. 214 Soft-Link 0422236 c c’t 2004, Heft 22 © Copyright by Heise Zeitschriften Verlag GmbH & Co. KG. Veröffentlichung und Vervielfältigung nur mit Genehmigung des Heise Zeitschriften Verlags.