Montag, 20. August 2012

IR-Fernbedienung - Teil 1

Eines meiner aktuellen Projekte ist ein sogenannter HTPC (Home Theater PC) als  wohnzimmertauglicher Rechner. Die Anforderungen an solch einen multimedialen Computer sind neben einem gefälligen Äußeren und einer möglichst geringen Lautstärke auch die komfortable Nutzung mit einer Fernbedienung.
Dazu orderte ich eine recht minimalistisch anmutende Infrarot-Fernbedienung von Apple - mein erstes und einziges Produkt dieser Firma. Meine Recherche ergab, dass Apple das NEC-Protokoll verwendet. Ein TSOP1736 lag noch im Sortimentskasten, bereit für erste Experimente mit einem Boarduino, der recht bald durch einen Leonardo ersetzt wurde.

Apple IR-Fernbedienung und Arduino Leonardo

Samstag, 11. August 2012

8-Bit-Binärzähler

Hier eine kleine Fingerübung: Ein Mikrocontroller (Attiny85) erhöht bzw. verringert auf Knopfdruck den Wert einer Variablen. Diese Variable wird im Binärsystem ausgegeben. Die Anzahl der frei belegbaren Pins ist auf 5 beschränkt, zwei davon werden als digitale Eingänge zum Inkrementieren und Dekrementieren genutzt. Somit verbleiben 3 Pins als digitale Ausgänge. Das ist gerade zur Minimalbeschaltung eines Schieberegisters ausreichend. In diesem Fall handelt es sich um ein 74HC595, Schieberegister mit seriellem Eingang und parallelen Ausgängen, zur Visualisierung der Zählvariable können nun 8 Stellen dargestellt werden.

8-Bit-Binärzähler

Montag, 4. Juni 2012

Projekt Analoguhr - Teil 4

Ein weiterer Meilenstein wurde erreicht, die Uhr läuft schonmal. Bisher wurde zwar kein Funkuhrmodul verbaut, dafür wurde jedoch eine sogenannte Real Time Clock eingesetzt. Diese Echtzeituhr ist batteriegepuffert, läuft also unabhängig von der Versorgungsspannung der Uhr permanent im Hintergrund.
Für erste Experimente habe ich mir ein fertiges Modul zum Anschluss an den I2C-Bus schicken lassen: Hier verrichtet ein DS1307 seinen Dienst, sämtliche erforderlichen Komponenten wie Batteriehalter und ein Uhrenquarz sind ebenso auf der Platine enthalten.

Um die Programmierung möglichst übersichtlich zu halten, habe ich darauf geachtet, die einzelnen "Aufgaben" in separate Funktionen zu gliedern.
So gibt es  bspw. die setRTCtime()- und die getRTCtime()-Funktion. Später wird der Sketch um eine Funktion getDCFtime() ergänzt, die in regelmäßigen Zeitabständen aufgerufen wird und das Funkuhrsignal auswertet. Dann erfolgt eine simple Abfrage, ob die RTC-Zeit aus getRTCtime identisch zur DCF77-Zeit ist. Ist dies nicht der Fall, wird die RTC-zeit mittels setRTCtime() neu gesetzt.
Wie es hier zu Abweichungen kommen kann, wird sich der eine oder andere fragen. Zum einen ist eine RTC auch nicht genauer als eine herkömmliche Quarzuhr, denn letzten Endes ist sie ja nichts anderes. Ein anderer Fall ist die Umstellung von Sommer- auf Winterzeit (oder auch umgekehrt), denn das beherrscht die RTC im Gegensatz zur Funkuhr nicht.

Dazu noch das passende Video für die visuell geprägte Leserschaft:


Und zum Abschluss noch ein paar Zeilen Code:

Projekt Analoguhr - Teil 3

Zwischenzeitig hatte ich mit meinem mäßigen DCF77-Signal zu kämpfen, wobei die Wortwahl "mäßig" schon sehr beschönigend ist. Immer wieder gab es Signalverfälschungen und Einstreuungen, was die Fehlerkorrektur und letzten Endes die Auswertung unmöglich machte.
Das Ganze sah dann so aus:


 Das Signal ist nicht zu gebrauchen, ein Ausrichten der Antenne brachte kaum Besserung.

Mittwoch, 30. Mai 2012

Arduino Leonardo

Ein brandneuer Arduino hat seinen Weg zu mir gefunden. Ich gebe es zu, ich gehöre zu den Sammlern. Nach kurzen Experimenten mit Bascom und einem Atmega8 stieß ich recht bald auf meinen ersten Arduino, das war damals der Duemilanove. Seitdem haben sich weitere Arduino-Boards hinzugesellt: ein Arduino Ethernet, ein Mini und selbstverständlich auch ein Uno. Auch Nachbauten wie der Boarduino und Wattuino stehen meiner Bastel- und Programmierwut zur Verfügung.

Das neue Mitglied in dieser Riege ist ein Arduino Leonardo. Dieser ist in vielerlei Hinsicht spannend, denn es wird ein aktueller Mikrocontroller verbaut, der seinerseits die Kommunikation über USB übernimmt. Die ersten Arduini kommunizierten mit dem Rechner noch über eine serielle Schnittstelle, die als 9polige Buchse auf dem Board vorhanden war. Die Pegelanpassung übernahm ein MAX232. Wenig später wurde schon die USB-Kommunikation eingeführt, erst über spezielle Schnittstellenwandler wie dem USB-Seriell-Wandler FT232 von FTDI, später allerdings über separate Mikrocontroller wie Atmels Atmega8U2 und Atmega16U2.

Projekt Analoguhr - Teil 2

Erwartet nicht zuviel, es gibt nur ein kleines Update. Ich habe mir einen Aufsteller aus Pappe gebastelt.


Ich war es einfach leid, dass der lose Aufbau auf dem Basteltisch umherrutscht.

Freitag, 25. Mai 2012

Projekt Analoguhr - Teil 1

Neulich entdeckte ich diese schöne Seite:
http://www.sharebrained.com/chronulator/
Da habe unweigerlich Lust bekommen, eine Uhr zu bauen.

Dazu habe ich mir zwei Amperemeter mit jeweils 100µA als Drehspulinstrumente besorgt. Nach ein paar Stunden Bildbearbeitung waren die Skalen auch endlich angepasst, eingebaut und somit betriebsbereit. Angeschlossen wurden die Instrumente über einen entsprechend dimensionierten Vorwiderstand an zwei PWM-Pins des Arduinos. Diese Vorwiderstände sind so gewählt, dass bei einem PWM-Wert von 240 der Zeiger voll ausschlägt. Natürlich hätte man das auch bei 255 machen können, aber die Berechnungen werden so um einiges leichter:
analogWrite(10,stunde*20) stellt die Stunden sauber dar, analogWrite(11,minute*4) ist für die Minuten verantwortlich.

Was jetzt noch fehlt ist folgendes:
- ein schönes Gehäuse
- ein Funkuhrmodul und/oder
- eine Echtzeituhr (RTC, z.B. DS1307)

Desweiteren denke ich über ein paar Spielereien nach, um bspw. den Stundenzeiger sanft auf die nächste Stunde zu stellen. Auch neigt der Minutenzeiger beim plötzlichen Sprung von 59 zurück zur 0 zum "überschwingen", der wird also auch sanft runterfahren müssen.


Hier noch ein kleines Video, selbstverständlich als Zeitraffer, dass man Änderungen sehen kann. Kommentare, Ideen und so weiter sind ausdrücklich erwünscht.