Der Freeduino dient als zentrale Steuereinheit. Für die Anzeige der Uhrzeit kommt eine 4x7-Segmentanzeige zum Einsatz. Der Radioempfang erfolgt über ein UKW-Modul. Bestens dafür geeignet ist die Platine aus dem UKW-Retro-Radio [1].
Die folgende Abbildung zeigt eine Innenansicht des Geräts. Man erkennt drei Funktionseinheiten:
Auch im nachfolgenden Schaltplan sind diese Funktionseinheiten deutlich zu erkennen.
Die einzelnen Einheiten werden im Folgenden genauer beschrieben.
Das Freeduino-Board [2] übernimmt die gesamte Steuerung des Radioweckers. Dazu wird es mit Hilfe einer Trägerplatte in das Gehäuse eingebaut.
Die Stromversorgung erfolgt über den DC-In Stecker mit einer Spannung von 9V. Diese wird auf dem Board in eine konstante Versorgungsspannung von 5.0 V gewandelt. Steckernetzteile mit einer Nennspannung von 9 V und einer Strombelastbarkeit von ca. 500 mA sind zur Speisung des Raduino gut geeignet.
Die LED Anzeige: Ein Display mit Doppel-Multiplex
Die Anzeige der Uhrzeit erfolgt mit einem 4-stelligen 7-Segment-Display. Dieses verfügt über 12 Anschlüsse:
- 7 Segmente sind jeweils gemeinsam herausgeführt (a bis g)
- 4 Anoden (oder Kathoden) für jede Ziffer
- 1 Anschluss für den Doppelpunkt
Die Ansteuerung des 4-stelligen Displays weist eine Besonderheit auf. Üblicherweise werden solche Displays mit einfachen Multiplex angesteuert, d. h. alle Segmente einer Ziffer leuchten gleichzeitig, die Ziffern werden aber nacheinander eingeschaltet. Erfolgt dieses sequentielle Einschalten mit ausreichend hoher Geschwindigkeit, erscheinen die einzelnen Ziffern als flimmerfreie Zahl. Ein Beispiel zu diesem Verfahren ist im Beitrag „Schulstunden Countdown Timer" [3] zu finden.
Beim Doppel-Multiplex wird sogar nur jeweils ein einziges Segment aktiviert. Dadurch kann weitere Hardware eingespart werden. Anstelle der sonst notwendigen 4 Transistoren und 12 Widerständen kommt man nun mit nur noch 4 Widerständen aus!
Im C-Code der Include-Datei LED_display.h wird dies in der entsprechenden Routine deutlich:
// Write number at indicated position to display
void digit (int value, int pin)
{ sbi(PORTC, pin); // pin high => current digit on
PORTD = 0b11111111;
for(int i=0; i<=7; i++) // activate one segment after another
{ if(numbers[value][i]==0)
{ cbi(PORTD, (i)); // set segment
_delay_ms(1);
sbi(PORTD, (i)); // clear segment
}
}
}
Die Anpassung de Software an eine Anzeigeeinheit mit gemeinsamer Anode oder gemeinsamer Kathode kann durch einfaches Invertieren der Ansteuerungsmatrix durchgeführt werden.
Das Radio-Modul mit Zusatzverstärker
Da das UKW-Empfänger-Modul aus dem Retro-UKW-Radiobausatz [1] verwendet wird, entsprechen die Bezeichnungen im Schaltbild der Beschriftung auf dieser Platine. Um eine auch für das Wecken von Tiefschläfern ausreichende Lautstärke zu erzielen, wurde der integrierte Verstärkerbaustein LM386 verwendet [4]. Dieser kann noch problemlos auf einem kleinen Steckboard mit aufgebaut werden.
Die Versorgung sowohl des Radiomodul als auch des Verstärkers kann direkt aus einem Pin des Freeduino-Boards erfolgen. Der ATmega liefert bei ca. 5V einen Strom von über 100 mA. Die damit zur Verfügung stehenden 500 mW sind zum Betrieb des Radios vollkommen ausreichend.
Da die Versorgungsspannung sehr gut auf stabilisiert ist, bleibt ein einmal ausgewählter Sender sehr stabil erhalten. Das bei Batteriebetrieb zu beobachtende Abdriften von Sendern tritt bei dieser Schaltungsvariante also nicht auf. Für eine zusätzliche Spannungsstabilisierung kann noch ein größerer Stützelko (z. B. 470 µF) eingebaut werden, damit kann der Klang bei Lautstärkenspitzen sogar noch etwas verbessert werden.
Das Potentiometer für die Senderabstimmung und die Empfangsantenne werden an der Rückseite des Radioweckers angebracht (s. Abb.).
Auf eine Lautstärkeneinstellung wurde verzichtet, da die Schaltung gerade die ausreichende Lautstärke für ein sicheres Wecken von Tiefschläfern liefert. Ein mittelgroßer 8-Ohm Lautsprecher kann noch bequem im Gehäuse untergebracht werden.
Die Software
Die zugehörige Software wurde in („Freeduino-„) C erstellt:
// radio clock with 4x7-LED-display
#include "TimerOne.h" // include timer
#include "LED_display.h" // include display driver
int radioPin = 13; // pin for radio supply
int radioStart = 6; // radio start time
int radioStop = 7; // radio stop time
int hrs=20, mins=0, secs=0; // boot time
volatile int tc=0; // timeCounter
void update_time() {tc++;}
void setup()
{ DDRD = 0b11111111; // Port d as output for segments
DDRC = 0b00001111; // port c as output for digits
Timer1.initialize(1000000); // interrupt every 1000000 µs = 1.000000 s
Timer1.attachInterrupt(update_time);
pinMode(radioPin, OUTPUT);
}
void loop()
{ number_output (hrs*100+mins); // write current time to display: hh:mm
{ secs=tc;
if (secs==60) // update minutes
{ tc=0; secs=0; mins++;
if (mins==60) // upddate hours
{ mins=0; hrs++;
if (hrs==24) hrs=0; // restart for new day
}
}
}
if (hrs == radioStart) digitalWrite(radioPin, HIGH); // start radio
if (hrs == radioStop) digitalWrite(radioPin, LOW); // stop radio
while (secs==tc) refresh(); // refresh display within the seconds
}
Das Herzstück ist die Uhrenschleife, welche die LED Anzeige steuert:
void loop()
{ number_output (hrs*100+mins); // write current time to display: hh:mm
{ secs=tc;
if (secs==60) // update minutes
{ tc=0; secs=0; mins++;
if (mins==60) // upddate hours
{ mins=0; hrs++;
if (hrs==24) hrs=0; // restart for new day
}
}
}
In den Zeilen
if (hrs == radioStart) digitalWrite(radioPin, HIGH); // start radio
if (hrs == radioStop) digitalWrite(radioPin, LOW); // stop radio
wird der Radio-Teil ein- bzw. ausgeschaltet.
Die Weckzeit wird mit den beiden Variablen
int radioStart = 6; // radio start time
int radioStop = 7; // radio stop time
festgelegt und kann hier einfach den eigenen Bedürfnissen angepasst werden.
Die Uhr beginnt nach dem Power-Up mit 20:00. Um die exakte Uhrzeit zu erhalten muss der Wecker also einmalig, z. B. genau zu Beginn der Tagesschau gestartet werden. Dann läuft er zuverlässig und mit hoher Präzision weiter.
Weitere Informationen dazu finden sich in [5]

Ausblick
Ein wesentlicher Vorteil eines Eigenbau-Radioweckers ist natürlich, dass man leicht zusätzliche Funktionen integrieren kann. Hier einige Vorschläge dazu:
- Steuerung und Zeiteinstellung über Berührungssensoren
- Integration eines Einschlaftimer („sogenanntes „Snooze")
- Einbau eines Innen- und Außenthermometers [5]
- etc.
Literatur
- Franzis UKW-Retroradio
- Z. B. aus dem Franzis-Lernpaket „Freeduino"
- Siehe ELO-Beitrag „Schulstunden Countdown Timer"
- Siehe ELO-Beitrag „Mini-Stereo-Verstärker"
- G. Spanner: AVR-Mikrocontroller in C Programmieren, Franzis (2010)
Software-Download
RADUINO-SW
Die passende Ergänzung zu diesem Artikel:
| |  | Lernpaket Arduino Lieferumfang: Platine, Steckboard, ATmega168-Mikrocontroller, 20 Bauteile, CD-ROM, 200-seitiges Handbuch ISBN 978-3-645-65007-6 Versandkostenfrei* direkt beim Verlag bestellen!
79,95 € 
|