Use OS X Media Keys for Google Play

I have been a Spotify customer for over a year now. But my loyalty for a product ends as soon as i get something better for less. Some days ago, Google opened its Google Music All Access music subscription service to german customers, and that is why it suddenly became interesting for me. If you become a customer before middle of January, you get it for 7,99€ per month, which is 2€ cheaper than Spotify. Apart from the lower price, the Android client app for this service is simply better than Spotify’s app.

I am very happy with this service, but it doesn’t come with an app for the desktop computer. In general, this is not a problem. I am perfectly fine with streaming music via an HTML5 page. The only disadvantage is that i cannot use my Apple keyboard’s media keys any longer. Fortunately, workflows in OS X are scriptable to quite an extent with factory included software. In the end, there is a scripted solution which feels quite native.

Programmatic Access to Media Functions

At first we need some kind of script which can be started to execute some workflow like play/pause the music or go back/forward in the playlist. A function which i consider extremely important is voting up/down the track which is currently played, as i am mostly listening to automatically generated playlists based on my music rating history.

I do not have much exercise in using Apple Script, although this is the obvious way to do it. Apple Script is the extremely versatile and mighty approach to automate stuff in OS X. On this site i found the generic approach to trigger user input events in Google Play:

on run
	tell application "Google Chrome"
		set allWins to every window
		set allTabs to {}
		repeat with currWin in allWins
			set allTabs to allTabs & every tab of currWin
		end repeat
		repeat with currTab in allTabs
				if ((characters -17 thru -1 of (title of currTab as string)) as string) = "Google Play Music" then set musicTab to currTab
			end try
		end repeat
		# Javascript line which triggers the actual event:
		tell musicTab to execute javascript "SJBpost('playPause');"
	end tell
end run

What this script does is basically looking for the Google Chrome Browser tab which displays the Google Music player and telling it to execute some Javascript magic. The Javascript magic here is “SJBpost(‘playPause’);”. Obviously, the SJBpost() method looks like it can be used for other user input events, too. Fortunately, someone found out all the event names and posted them on Github. According to that list, the events “prevSong”, “nextSong”, “thumbsUpPlayer”, and “thumbsDownPlayer” should help with all the other events we would like to trigger. Unfortunately, most of them don’t work any longer.

However, triggering these events is also possible by obtaining references to the event buttons and simulating a click. This is how to trigger the other events using Javascript:

// Play Previous Song

// Play Next song

// Rate Current Song Up
(document.getElementsByClassName('rating-container thumbs')[0].childNodes[0]).click()

// Rate Current Song Down
(document.getElementsByClassName('rating-container thumbs')[0].childNodes[1]).click()

These code lines can just be used to substitute line 14 in the Apple Script code listing.

To save such Apple Scripts in a way that they become useful as hotkey-mappable workflow-actions which are globally reachable, we have to save them as a Service using Just start Automator, make a new Service and add a “Run Applescript” action to it. Paste the Applescript into it and set the “service receives” drop down list to “no input”. That is it. Save it with some descriptive name. Services are saved in ~/Library/Services/ by default.

Add a new Service with

Add a new Service with

Configure your new Automator service like this for every new input event.

Configure your new Automator service like this for every new input event.

Mapping the Apple Multimedia Keys

Now that we have these input events encapsuled into global services, we can trigger them using keyboard shortcuts. Configure them using System, under Keyboard > Shortcuts > Services.

Map some keys to your new services.

Map some keys to your new services.

Assuming that we want to use the original Play/Pause, forward, and back buttons on the Apple keyboard, there is some more remapping necessary as OS X will not let us reconfigure these special buttons. We could remap them if we switch their standard behaviour. Either they represent the F1-F12 keys if we hold the fn button or they represent (not reconfigurable) special functions by default. This is what OS X lets us configure. Of course this is not what we want, because there are just those 3 buttons we want to change – the brightness- and window-management functions shall be left untouched.

KeyRemap4MacBook is the perfect helper in this situation: It lets us switch the standard behaviour for a subset of function keys. We just need to download, install and configure it and wire the Google Play services to the F7-F9 keys. That’s it!

Check this box to switch the standard behaviour of only the special keys for music.

Check this box to switch the standard behaviour of only the special keys for music.

I experienced that the hotkeys do not work immediately. The setting seems to need some time to seep through to all apps. But then it feels perfectly native. Enjoy.

High-Performance abs() Function

Some time ago i was looking for the best possibility to implement the mathematical abs(x) function in a maximal performant way for integer values. This function returns the absolute value of its argument and is defined like following:
abs(x) = \left\{\begin{matrix} x & x \geq 0\\ -x & x < 0\end{matrix}\right.

The naive implementation of it may look like this:

int abs(int x)
    return (x &lt; 0) ? -x : x;

This is the easiest way. Return the number if it is positive already, and multiply the number with -1 if not. Unfortunately it is not the fastest variant, because it uses branching.

Then i found a more sophisticated solution (or here). This is faster in the average case because it compiles to absolutely branchless code:

int abs(int x) {
    int s = x >> 31;
    x ^= s;
    x -= s;
    return x;

That code looks a bit weird at first. When you understand the Two’s Complement, it is quite easy to grasp. Let’s see what this code does to positive and negative choices for x:

C Code Resulting Equivalent Transformation
x \geqslant 0 (positive) x < 0 (negative)
Line 2 s = x >> 31 s = 0 s = (-1)_{10} = (1111...1111)_2
Line 3 x = x \oplus s x = x \oplus 0 = x x = x \oplus (11...11)_2 = \neg x
Line 4 x = x - s x = x - 0 x = x - (-1)
Result x = x x = \neg x + 1

The two’s complement of a number is the digital representation of its negative. Applying the two’s complement to a digital number is done by inverting all of its bits and then adding one to the result. Have a look at the table and realize that exactly this happens to negative numbers. Positive number values happen to stay completely untouched by the transformations applied by this code.

The whole process is branchlessly controlled by the value of the most significant bit, which also denotes if the number is negative or not. So if this bit is not set, all mathematical operations done by this code are rendered completely effectless, which is the right thing for numbers which are already positive.

In the end, this code compiles to three assembler instructions:

mov %edi, %edx
sar $0x1f, %edx ; s = x >> 31
mov %edx, %eax
xor %edi, %eax ; x ^= s
sub %edx, %eax ; x -= s

According to the source articles, some compilers should use the “cdq” instruction, which converts double words into quad words, which also implies that the most significant bit needs to be set over all 32 bits by which the value gets extended. The __builtin_abs function of GCC compiles to absolutely the same assembly like in the listing.

I am pretty amazed by this, as it is both pretty elegant and performant. Not only on the Intel architecture this should compile to short branchless assembly. The author of the article where i got this function from also demonstrates, how to design the max(x, y) and min(x, y) functions the same way:

int max(int a, int b)
    int diff = a - b;
    int dsgn = diff >> 31;
    return a - (diff & dsgn);

int min(int a, int b)
    int diff = a - b;
    int dsgn = diff >> 31;
    return b + (diff & dsgn);

Reparatur eines Brutkastens

Die Eltern meiner Freundin wohnen auf dem Land und halten sich allerlei Tiere: Esel, Kaninchen, hin und wieder Enten, Ziegen, eine Katze und Hühner. Es ging vor allem um letztere als sie mich fragten, ob ich ihren Brutkasten reparieren könnte.

Der Brutkasten ist einfach ein großer Kasten aus Holz mit einer Schublade auf der letztendlich die auszubrütenden Eier liegen. Darüber ist ein Heizdraht gespannt, welcher einfach an die Netzspannung angeschlossen ist. Zwischen Netzspannung und Heizdraht schließt allerdings noch ein mechanisches Thermostat den Stromkreis, welches mit einem Stück Bimetall einfach die Stromzufuhr kappt wenn die Temperatur zu hoch ist. Das scheint in dieser Form eine Ewigkeit lang funktioniert zu haben und hat nun doch noch den Geist aufgegeben.

Die Reparatur-Idee ist einfach: Man ersetzt das mechanische Thermostat durch ein elektronisches. Da eine primitive Lösung ausreichen sollte, habe ich einfach eine Schaltung ohne Mikrocontroller und Schnickschnack um einen Operationsverstärker herum-entworfen. Die Präzision der Bauteile ist sehr unkritisch.

Der Operationsverstärker bekommt auf den nichtinvertierenden Eingang die Stellgröße für die Temperatur in Form einer Spannung, die mit einem Spannungsteiler eingestellt wird. Auf den invertierenden Eingang des Operationsverstärkers wird dann wiederum die Spannung eines Spannungsteiler gegeben, dessen oberer Widerstand ein temperaturabhängiges NTC-Bauteil ist. Dieses Bauteil ist der Temperaturfühler, dessen elektrischer Widerstand sich mit steigender Temperatur senkt. Dies führt dazu, dass der Ausgang des OPs abschaltet, wenn die Temperatur zu hoch ist und die Spannung auf dem invertierenden Eingang über die des nichtinvertierenden Eingangs steigt.

Nun könnte man einfach einen Transistor mit diesem Ausgangssignal betreiben, welcher wiederum ein Relais steuert, welches wiederum in Serie zum Heizdraht geschaltet ist. Das würde funktionieren, aber eventuell würde es das Relais auf Dauer zerstören, zumal diese Schaltung in sehr kurzen Zeitabständen ständig hin- und her schalten würde.

Um die Intervalle, in denen hin- und her geschaltet wird also zu verlängern und damit die Lebensdauer des Relais zu verbessern, kann man einfach unter den Spannungsteiler den der Benutzer auf die richtige Temperatur einstellt, einen weiteren Widerstand in Serie schalten (nicht zu groß) und dazwischen das Ausgangssignal des Operationsverstärkers zurückführen.

Der Brutkasten steht nunmal in einer anderen Stadt.Obwohl ich dabei überhaupt nichts berechnet habe und die Bauteildimensionen einfach von mir nach Gefühl gewählt wurden, zeigt der Test mit dem NTC über dem Toasterschlitz, dass es hervorragend funktioniert: Die Steuerung hat nun die Charakteristik eines Schmitt-Triggers wie er auch in Kühlschränken, elektrischen Heizungen usw. verwendet wird.

Zu beachten ist vor allem auch die sogenannte Freilaufdiode, die die Schaltung vor Spannungsspitzen schützt, die aufkommen, wenn das Relais ständig ein- und wieder abgeschaltet wird. Sie ist parallel in Sperrrichtung zum Relais geschaltet. (Siehe Schaltplan)

Später beim Einbau ist wichtig, dass der Temperaturfühler in etwa zwischen den Hühnereiern liegt und nicht irgendwo “versteckt” ist, da er genau die gleiche Temperatur abbekommen muss, wie die Eier selbst auch. Die Steuerplatine darf natürlich irgendwo angebracht sein. Da ich keine Ahnung von Hühnern habe, habe ich es den Eltern überlassen, die Temperatur korrekt einzustellen – die Stellschraube des Spannungsteilers ermöglicht das ganz einfach.

Nun musste nur noch die Hoffnung erfüllt werden, dass der Toaster als Testobjekt die Realität gut genug simulieren konnte. In letzter Zeit wurden allerdings wieder Eier von den Hühnern gebrütet und auf die letzten drei Eier hatte die Henne keine Lust mehr, weshalb meine Schaltung direkt getestet werden konnte. Wie die Bilder beweisen, funktioniert sie!😉

Simulation eines Federpendels mit Matlab, C++ und Qt

Das Bild stammt vom Wikipedia-Artikel "Federpendel"

Zur Zeit schlagen sich alle Kommilitonen des Semesters (inklusive mir) in meinem Studiengang den Stoff der Klausur “Systemtheorie 2” um die Ohren.

Da es unter anderem darum geht, aus Differentialgleichungen, die physikalische Gegebenheiten beschreiben, Gleichungen mit Matrizen und Zustandsvektoren zu machen, die dann wiederum von der zeitkontinuierlichen Form in äquivalente zeitdiskrete Systeme umgeformt werden können, habe ich mir mal ein einfaches, akademisches Beispiel herausgenommen um es mal als Simulation im Computer nachzuprogrammieren: Das Federpendel mit Dämpfung.  Man kennt es in ähnlicher Form von Smartphones: Wenn man sehr schnell durch Listen scrollt und jene am unteren oder oberen Ende ankommen, dann scrollt das Display ein bisschen zu weit und “wippt” zurück. Möglicherweise ist das ähnlich programmiert, wie ich es hier in diesem Artikel schildere.

Alles beginnt mit einer Differentialgleichung. Die Gleichung für das Federpendel sieht folgendermaßen aus (Herleitung im Physikbuch nachschauen. Ein Buch von Abiturniveau reicht völlig aus):

Wobei “m” die Masse, “D” der Dämpfungs- und “k” der Federkoeffizient sind. Diese Differentialgleichung muss erst mal umgeformt werden – mit einem Zustandsvektor, der Geschwindigkeit und Position beinhaltet:

Hier ist also noch nicht viel passiert. Die untere Zeile gibt exakt die ursprüngliche Differentialgleichung wieder. Da ein Computerprogramm entstehen soll und Computer nicht viel mit solchen zeitkontinuierlichen Systemen anfangen können, muss nun diskretisiert werden, was nach folgendem Rezept geschieht:

Wir brauchen nun also die Matrizen A und B. Ich habe das mal auf Papier durchgerechnet, aber nach der inversen Laplace-Transformation sind die Terme ein wenig länger geworden und ich muss dann irgendwo mehrere Fehler eingerechnet haben, weil das Programm am Ende nicht funktionierte. Also schrieb ich ein kurzes Matlab-Skript, welches diesen Job erledigt:

syms d k m x0 T; % Konstanten
syms s; % Laplace

F = [0, 1; -k/m, -d/m]; % Autonomer Anteil
G = [0; k/m]; % erzwungener Anteil

psi_lap = (eye(size(F, 1))*s -F)^-1;
psi_t = ilaplace(psi_lap);

A = psi_t;
B = int(psi_t*G, 0, T);

Matlab bekommt die Ausdrücke auch sofort viel kürzer hin als ich es auf Papier geschafft habe, weil es mehrere Exponentialterme gibt, die sich zu sinh(x) und cosh(x) zusammenfassen lassen:

Mit A und B lässt sich nun folgende Gleichung formulieren:

Das besondere an Dieser Gleichung ist nun, dass wir mit x0(k) eine Folge von Positionen haben, die zeitlich betrachtet jeweils einen Abstand von T Zeiteinheiten haben. Das heißt, man kann nun die Koeffizienten dieser Matrix ausrechnen und als Konstanten(!) in ein C/C++-Programm packen,  jede T Zeiteinheiten die Position x0 neu berechnen und einfach irgendwie darstellen. Das schöne ist, dass man bereits mit T = 10ms ein sehr flüssiges Bild erhält und pro Schritt nur 6 Multiplikationen und Additionen braucht, um die Pendelposition korrekt zu iterieren.

Problematisch mit solch gedämpften Systemen kann allerdings noch die Stabilität sein. Ich wollte ein Federpendel, welches tatsächlich hin und her pendelt, wobei die Amplitude der Federbewegung die ganze Zeit abnimmt. Würde man diese Matrizen nun genau so wie sie jetzt hier stehen abtippen und durch den Compiler jagen, so würde man je nach Dimensionierung der Konstanten k, d und m zwei mögliche Abläufe beobachten: Möglichkeit 1: Das Pendel bewegt sich zum Nullpunkt und hält dann langsam am Nullpunkt an und überschreitet ihn niemals. Außerdem wird die Bewegung zum Nullpunkt hin auch zu stark gebremst. Möglichkeit 2: Das Pendel springt unkontinuierlich hin und her und macht alles andere als die Realität darzustellen, während es merkwürdige Zustände annimmt.

Das liegt an der Stabilität. Im ersten Fall war das Pendel überkritisch gedämpft. Im zweiten Teil war der Inhalt der Wurzelterme in den Matrizen negativ, was numerisch nichts sinnvolles ergibt. Deshalb müssen nun die Kriterien dafür, bei welcher Konstantenwahl das System wie gedämpft ist analysiert und die Terme angepasst werden:

s1 und s2 sind die Polstellen der Laplace-Variante der ursprünglichen Matrix (Is-F)^-1. Die Variablen d_unterkritisch und d_überkritisch sind aus dem Inhalt des Wurzelterms hergeleitet. Wenn d^2 kleiner als 4km ist, dann ist der Inhalt der Wurzel negativ. Abhilfe: den Inhalt mit -1 multiplizieren und ein imaginäres “j” vor die Wurzel schreiben. Dann ist der Term zwar komplex, aber die Wurzel ist erst mal wieder numerisch “normal”. Das “j” kann nun recht einfach entfernt werden. Wenn man die Wurzel überall in den Matrizen A und B so anpasst, wie es hier bei der Polstellenbetrachtung passiert ist, dann erhält man sinh- und cosh-Terme, die rein imaginäre Argumente bekommen, was wiederum folgendermaßen umformbar ist:

Sind diese Umformungen an den Matrizen angewandt worden, so verschwinden alle imaginären Terme. Das System ist nun wieder rein reell-wertig und kann einfach in den C++-Code übernommen werden.

Um den Sachverhalt darzustellen, habe ich ein Qt-C++-Projekt angelegt, welches die Position des Pendels einfach mit einem Slider-Widget darstellt. Man kann den Slider mit der Maus “anfassen” und ziehen, um ihn dann “zurückspringen” zu lassen, was dann schon der Algorithmus berechnet. Die Konstanten lassen sich im Sourcecode abändern, so dass das nächste Kompilat dann mit diesen Änderungen arbeitet.

Download-Link: SwingingMassSimulation

Das Endprodukt entspricht meinen Erwartungen. Ich habe im folgenden Video die Dämpfungskonstante auf einen recht niedrigen Wert eingestellt, weil das Pendel dann länger anschaulich schwingt und man damit schön spielen kann.

Fazit: Mein Ansatz ist sicher naiv, aber er funktioniert ja recht gut.😉

Verschwindende git-daemon-export-ok Datei

Ich habe hin und wieder mit der Administration von Git-Repositories zu tun, die einerseits mit Gitosis les- und schreibbar für Entwickler, andererseits noch zusätzlich über das git-Protokoll nur lesbar für die Öffentlichkeit zugänglich gemacht werden.

Das funktioniert dann so, dass man den Git-Daemon über das Verzeichnis wachen lässt, in dem alle Repos liegen, die allgemein über Gitosis zugänglich gemacht werden. Beim Aufruf (meist über xinetd) lässt man das –export-all Flag weg, legt aber in jedem öffentlich lesbar zugänglich zu machenden Repo eine Datei namens git-daemon-export-ok an. Dann bietet der git-Daemon Lesezugriff zum Repo unter der URL git://server/reponame.git an.

Dieser Blog-Eintrag widmet sich allerdings einem speziellen (pebcak-)Phänomen: Manchmal verschwindet diese Datei und der öffentliche Zugriff ist nicht mehr möglich. Naiv und verwundert legt man sie also erneut an und wundert sich später erneut, weil sie wieder verschwinden wird.

Nach einiger Googlerei habe ich heute die Lösung gefunden, die ich hier mal schildere, damit der nächste sie schneller findet:

Das Problem kommt nur dann vor, wenn man Gitosis-Administration und Git-Daemon vermischt. Das ist allerdings von Gitosis so vorgesehen – man muss nur in der gitosis.conf vermerken, dass das Repository vom Git-Daemon erfasst werden soll und das geschieht mit den folgenden Zeilen:

[repo DeinRepoName]
daemon = yes

Die Änderung pusht man kurz auf den Server und das war’s! Die Datei würde somit sogar von alleine angelegt werden, falls sie vorher noch nicht existiert hat.

OS X Spotlight stark beschleunigen

Unter OSX gibt es so etwas wieSpotlight-Blockierliste einStartmenünicht. Wenn man eine Applikation starten will, dann öffnet man mit Finder einfach den /Applications-Ordner und doppelklickt auf die gewünschte Applikation oder man drückt die Tastenkombination ⌘-Leertaste und gibt die ersten paar Buchstaben seiner Applikation ein. Wenn sie sofort gefunden wurde, drückt man nur noch Enter und sie wird gestartet. Das hat sich bei mir so stark zur Gewohnheit gemacht, dass ich teilweise keinen Dateibrowser mehr benutze (für Dateisystem-Operationen ist das Terminal sowieso benutzerfreundlicher), was wiederum erlaubt zu hinterfragen, ob man so etwas als Benutzer in Zukunft überhaupt wirklich braucht wenn solche Konzepte wie Spotlight sich noch etwas weiterentwickeln.

Spotlight holt seine Informationen aus einer Datenbank. Diese Datenbank hält einen Index über alle Dateien auf der Festplatte bereit und wird von Hintergrundprozessen ständig aktuell gehalten.

Allerdings ist Spotlight manchmal langsam. Ich definierelangsam” in diesem Fall mit “die Ergebnisse erscheinen nicht sofort“. Das kommt einerseits daher, dass der Hintergrundprozess, der die Datenbank aktuell hält, bei manchen Ordnern extrem viel zu tun hat, da sich dort ständig vieles ändert. Andererseits kommt es daher, dass Suchen in großen Datenbanken geringfügig länger dauert, als in kleinen. Die Laufzeit steigt zwar nicht linear mit der Datenbankgröße (Datenbanken verfügen über einige sehr ausgeklügelte Suchalgorithmen), aber sie steigt.

Googlen und Ausprobieren hat mir heute die Erkenntnis gebracht, dass es da gewisse Ordner gibt, nach deren Inhalten man eigentlich nie sucht, die sich aber laufend ändern. Wenn man sie von der Indizierung ausschließt, dann lässt Spotlight sich dadurch verblüffend gut beschleunigen.

Man geht folgendermaßen vor: Klick auf  -> Systemeinstellungen -> Spotlight -> Privatsphäre. Mit einem Klick auf “+” kann man nun Ordner hinzufügen, die dann später von Spotlight nicht mehr berücksichtigt werden.

Hier fügt man nun die Ordner “~/Library/Application Support” und “~/Library/Caches” hinzu (~ ist eine Abkürzung für den eigenen Home-Ordner). In diesen Ordnern ändert sich ständig einiges und als normaler Benutzer schaut man sowieso praktisch nie in die dort liegenden Dateien.

Da ich als Software-Entwickler haufenweise SDKs und Frameworks installiert habe, werde ich bei fast jedem Stichwort von Spotlight mit gefundenen Header-Dateien überflutet. Das bleibt aus, wenn man einfach grob “/Library” und unter “/Developer” alles außer “/Developer/Applications” in die Sperrliste hinzufügt.

Wer “Fink” benutzt (Ein Paketmanager für freie Software für OS X), wird “/sw” zur Liste hinzufügen wollen.

Der zur Datenbank gehörende Hintergrundprozess passt sein Vorgehen beim Indizieren nun automatisch daran an. Die Datenbank muss nicht neu aufgebaut werden.

Ein Weihnachtsgeschenk 2009

Ich hatte mir dieses Jahr eigentlich vorgenommen, zu Weihnachten als Geschenk eine selbstgebaute “Pulsanzeige” zu bauen, deren Schaltung dann noch in einem dekorativen Gehäuse verbaut werden sollte.  Das “Praktikum Elektrotechnik 2”, an dem ich dieses Semester  teilnehme, befasst sich im vierten Versuch mit Funktionsgeneratoren auf Basis von Operationsverstärkern und Grundschaltungen derselbigen. Jedenfalls brachte mich die letzte Aufgabenstellung der Versuchsdurchführung, nämlich das Verstärken des Pulssignals aus einer Fingerklammer, auf die Idee so etwas mal zuhause nachzubauen und es dann noch “Benutzerkompatibel” für die erwähnte Geschenkidee zu machen. Der Benutzer sollte dann einen Finger in eine Klammer stecken, die seinen Puls über das optische Verfahren abnimmt und die Operationsverstärkerschaltung betreibt dann eine dekorative Lampe die so synchron mit seinem Puls aufleuchtet.

Leider hat es mit der Zeit nicht mehr hingehauen, die Schaltung verschenkfertig zu machen. Es gab ein paar batteriespezifische Probleme und so weiter, von daher habe ich mich nach einem Alternativgeschenk umgesehen.

Bei der Suche bin ich auf eine Reihe Klein-Bastelprojekte gestoßen, die aufeinander aufbauen und sich auf interessantem Wege jeweils verbessern:

Phototransistorschaltung von (Bild stammt von dort)

Zunächst ist auf eine Bastelei aufgetaucht, die auf sehr minimalistischem Wege LEDs nur in dunkler Umgebung leuchten lässt (Link zum Artikel). Ein anderer Bastler hat auf veröffentlicht, wie er eine kleine LED-Schaltung insofern mit einem Mikrocontroller erweitert hat, dass sie danach flackert wie eine Kerze (Link zur Anleitung).

Ein weiterer Hobbybastler hat dann auf veröffentlicht, wie er diese beiden Ideen kombiniert hat, um LEDs nur im Dunklen flackern zu lassen (Link zum Artikel). Die Schaltung bietet auf diesem Stand einen Mikrocontroller, der sich um das Flackern kümmert und einen Fototransistor, der den kompletten Mikrocontroller abschaltet, wenn das Umgebungslicht zu hell ist.

Fototransistor mit Mikrocontroller verschaltet auf (Bild stammt von dort)

Diese Schaltung wiederum hat der Webmaster von aufgegriffen (Link zum Artikel), weil ihm aufgefallen ist, dass die Schaltung auch mit viel weniger Bauteilen funktioniert, wenn man ein interessantes Detail von LEDs ausnutzt:

Wenn man Licht auf eine LED scheinen lässt, dann produziert sie eine Spannung an ihrer Sperrschicht, die in Sperrichtung abfällt. In diesem Moment kann man die LED wie eine kleine Stromquelle, parallel zu einem Kondensator geschaltet, betrachten.
Der Mikrocontroller nutzt diese Tatsache folgendermaßen aus: Er schaltet in gewissen Zeitintervallen die Beleuchtung ab, beschaltet eine LED hochohmig, damit sich eine Spannung anlegen kann, misst sie und entscheidet dann, ob die Lichter danach weiter leuchten sollen oder nicht. Ferner wird der Mikrocontroller nun nicht mehr ausgeschaltet, sondern legt sich einfach “schlafen” und wacht später für die nächste Messung wieder auf. Das ist immer noch extrem sparsam.

Schaltung, die ohne Phototransistor auskommt

Vereinfachte Schaltung von (Bild stammt von dort)

Alex von hat diese Idee wiederum aufgegriffen und ihr mit einer künstlerisch anmutenden Freiform-Verlötung der Bauteile einen wundervollen Hauch von Eleganz und Ästhetik verpasst. (Link zum Artikel).

Weil mir die Idee so gut gefallen hat, habe ich mich schnell dazu entschieden, sie nachzubauen, zumal man sowas schön verschenken kann.

Allerdings bot die der Schaltung und Mikrocontroller-Software eine Möglichkeit, die Schwellhelligkeit, bei der die LEDs noch flackern sollen, einzustellen/zu kalibrieren. Die tinkerlog-Version hat darauf verzichtet, um Platz für ein anderes nettes Feature zu bieten: Wenn man den Mikrocontroller resettet, dann leuchtet jeweils eine andere Anzahl an LEDs, was wiederum sehr passend für die verschiedenen Adventswochen ist.

Die Version die ich nachgebaut habe, bot letzteres Feature nicht, zumal die Adventwochen sowieso schon vorbei waren und ich diese Kalibrierung nicht auslassen wollte, zumal der Benutzer meiner Ansicht nach entscheiden sollte, bei welcher Helligkeit er den Kranz schimmern sehen will.

Jedenfalls habe ich mich heute noch einmal hinter den Sourcecode geklemmt, um Helligkeitskalibrierung und Adventskerzenfunktion zu haben.

Das Flackern der Lichter wird  realisiert, indem einfach verschiedene LED-Helligkeiten die in einem Array gespeichert sind, schnell nacheinander auf den LEDs dargestellt werden. Die Werte sind allesamt möglichst zufällig gewählt, um sich dem praktisch zufälligen Flackern einer Kerzenflamme in den ebenso praktisch zufälligen Luftzügen, die man zuhause so hat, anzunähern.

Im Endeffekt lief es darauf hinaus, dass ich so viele Zufallszahlen aus dem Zufallszahlen-Array herausgelöscht habe, dass beide Features auf den Chip passen. Außerdem habe ich die im EEPROM gespeicherten Werte (Kerzen-Anzahl und gespeicherte Schwell-Helligkeit) in eine .eep Datei ausgelagert, die getrennt auf den Chip geflasht werden kann.

Ein Video zeigt ganz gut, dass es keinen deutlichen Unterschied macht, ob es ~150 oder ~250 Zufallswerte sind, die das Flackern erzeugen. Zwei Abschnitte des folgenden Videos sind mit zwei verschieden großen Zufallszahlen-Arrays gemacht. Um ehrlich zu sein, weiß ich selbst nicht mehr, welcher Abschnitt mit welcher Einstellung arbeitet:

Nun ja, besonders verwunderlich ist das nicht, zumal das Kerzenflackern ja schon mit zwei NE556-Bausteinen gut klappt.

Den Sourcecode inklusive dem angepassen Makefile gibt es hier: Download

Video vom fertigen Aufbau:

AVR-Programmierung unter OS X

atmelchipAtmel kümmert sich mit kostenloser Software zur komfortableren Entwicklung von Software für die hauseigenen Mikrocontroller ganz gut um seine Kunden. Wenn sie Windows benutzen.

AVR Studio (Homepage, für Windows) kann alles, was das Herz begehrt. Es ist eine Programmierumgebung für C- und Assembler-Programmierer, die zusätzlich das Hochladen und Debugging von Programmcode auf den Chip bietet. Außerdem ist ein Simulator mitgeliefert, der die Analyse des Chips mit dem man arbeitet, stark vereinfacht und veranschaulicht.

Abgesehen davon dass man, nach einer kurzen Phase der Enttäuschung darüber dass Kunden mit anderen Lieblingsbetriebssystemen nicht bedient werden, fast Neid empfindet, stellt sich nach etwas Recherche aber dann doch durchaus heraus, dass das kein Grund ist, auf Windows umzusatteln. Jeder Nicht-User von Windows hat schließlich seine guten Gründe.

Also um überhaupt erst einmal AVR-Mikrocontroller zu programmieren, braucht man Compiler, Bibliotheken, Header-Dateien, Assembler und das Tool zum Hochladen des Codes.


Fink-Nutzer mögen einfach die diversen AVR-Pakete installieren, das geht schnell und einfach. (Mit Paketnamen: avr-binutils, avr-gcc, avr-libc, avrdude). Ich gehe hier nicht weiter auf Fink ein, da diejenigen, die jetzt nicht wissen wie das geht oder was Fink überhaupt ist, sowieso ein paar mehr Seiten an Doku lesen müssten und da ich es selbst nicht so gemacht habe (Beispielsweise deswegen weil der Assembler den ich haben wollte meines Wissens nach nicht per Fink zu erhalten ist).

Objective Development hat ein sehr praktisches Paket herausgebracht: Das Crosspack bietet alle Tools die man braucht. Gleichermaßen für Intel-Macs wie PPC-Macs.

Jetzt steht man zwar noch ohne GUI-Tools da, aber per Konsole kann man schon losprogrammieren. Mit dem Lieblingstexteditor programmiert man drauf los, kompiliert mit “avr-gcc” oder assembliert mit “avra”, lädt das Kompilat mit “avrdude” hoch und mit selbigem Tool ändert man auch die FUSE-Werte. Das ist nicht unkomfortabel, wenn man sich mit Shellscripten und einem guten Texteditor ausrüstet. (Empfehlung: VIM – ist bereits vorinstalliert)

Allerdings fehlen noch Syntax-Highlightning, Code-Completion, Upload-Button, FUSE-Editor, Registerbrowser usw.:


Beim Crosspack sind bereits Xcode-Templates mitgeliefert, aber da ich jene nicht benutze, bleibt das nur nebenbei erwähnt.

Ich kann Eclipse wärmstens empfehlen: Es handelt sich um eine Entwicklungsumgebung, die – da Java-basiert – auf jedem Betriebssystem heimisch ist und Plugins für jede Programmiersprache und beinahe jedes Framework liefert. Sich an dieses sehr umfangreiche Programm zu gewöhnen ist eine gute Idee, da man sich damit nicht an ein Betriebssystem oder Framework oder ähnliches bindet. Die neueste Version für OS X hängt auch nicht mehr vom Carbon-Framework ab, sondern baut die Oberfläche endlich auf Cocoa auf, was viele Vorteile gebracht hat.

Um Eclipse den Umgang mit AVRs beizubringen, braucht man das entsprechende Plugin: AVR-Eclipse. Auf die Installation gehe ich nicht weiter ein, da sie nicht kompliziert ist und eine Anleitung bald ohnehin schnell veraltet sein kann. Das Wiki der Projektseite bietet eine gute Anleitung.

Der praktische Upload-Button!

Als nächstes bringt Eclipse allgemein natürlich den Syntax-Parser, die Code-Completion, Syntax-Highlightning, eine schöne Organisationsstruktur für Projekte, Debuggingmöglichkeiten, Symbolbrowser und so weiter.

AVR-Plugin-spezifischer sind der praktische Upload-Button, der AVR-Device-Explorer, in dem man alle Register, Ports und Interrupts chipspezifisch einsehen kann, die Programmer-Integration (über die man den Typ des Mikrocontrollers übrigens inklusive Taktung automatisch auslesen kann) und die Möglichkeit, alles projektspezifisch einzustellen.

Bilder sagen mehr als tausend Worte:

Der AVR Device ExplorerFUSE-Editorlockbit_editor

Wer die Arbeit mit Eclipse bereits gewohnt ist, der wird dieses Plugin sicher mögen.

Wenn allerdings schnell mal ohne großes Terminal-Bla FUSEs ausgelesen/geändert, Kompilat hochgeladen oder ähnliches getan werden soll, dann ist es übertrieben, extra ein Eclipse-Projekt aufzuziehen.

Das perfekte Tool hierfür heißt AVRFuses. avrfuses_about

Es ist in C#.NET programmiert, was wiederum bedeutet, dass es unter Windows, Linux (mit Mono) und OS X lauffähig ist.

Da es eine Vielzahl von AVR-Chips unterstützt und an sich recht spartanisch ausgestattet (Es kann das was man braucht und mehr nicht) ist, nutzt man es am besten um schnell mal ein paar Bits zu setzen, wenn man fremde Programme in den eigenen Mikrocontroller schicken will oder ähnliches.

Die eigentlichen Features:

  • Programme hochladen/auslesen
  • EEPROM hochladen/auslesen
  • Chip löschen
  • FUSE-Bits setzen/auslesen



O2-Kunden: Verbindungsaufbau beschleunigen

O2-StandardrouterMittlerweile bekommt man kaum noch echte Telefonanschlüsse, sondern eher Telefon über Internet. Die Qualität ist schlechter, der Verbindungsaufbau häufig langsamer, aber es ist billig.

Bei O2 ist es so, dass der Router nach dem Eintippen der Nummer noch fünf Sekunden wartet, bis er loswählt. Vielleicht zögert/überlegt der Benutzer ja noch. Bei früheren Telefonverbindungen war das egal – wenn man über Internet verbunden wird, dann ist das aus technischen Gründen nicht mehr egal.

Als ich letztens auf (dort wo man als “Onlinekunde” seine Rechnungen und Verbindungsnachweise nachlesen kann) im Hilfe-Abteil herumgesurft bin, habe ich auch folgenden goldenen Tipp gefunden:

Die fünfsekündige Wartezeit des Routers lässt sich unterbrechen, indem man eine Raute (#) an die Nummer anhängt. Der Router wählt dann sofort los!

Wer also alle Nummern im digitalen Telefonbuch mit einer Raute am Ende ausstattet, der wartet fortan nicht mehr so lange, bis er verbunden ist.

Das sollte nicht nur bei O2-Kunden klappen, sondern allgemein bei jedem, der einen Router von Zyxel benutzt. Allerdings sind alle mir bekannten Geräte dieses Herstellers so schlecht, dass man sowas eigentlich nur dann haben sollte, wenn der Telekommunikationsanbieter es kostenlos mit dem Anschluss ausliefert.

Lösungen zum Praktikum Informatik 1

Dir listingIm zweiten Semester des Bachelor-Studiengangs “Elektrotechnik / Informationstechnik / Technische Informatik” gibt es ein Programmierpraktikum unter dem Titel “Praktikum Informatik 1”.

Ich habe das alles vorgearbeitet um es schnell hinter mir zu haben und hin und wieder Kommilitonen geholfen, wenn sie mich um Hilfe fragten. Auf Dauer lud ich die Sourcecodes einfach aus Bequemlichkeit hoch und durch die bald darauf folgende Verlinkung auf hat sich die entsprechende Adresse schnell und weit verbreitet. Gerade weil das eher ein Bequemlichkeitsakt war, sind die Sourcecodes auch nicht lehrsam dokumentiert. Ich habe einfach nur programmiert was das Praktikumsskript verlangt um dafür meine Testate zu bekommen und das war’s.

Da mittels Google oft nach “Student im Urlaub Programmierpraktikum Lösungen” o.ä. gesucht wird, dieses Blog hier allerdings nicht darauf verlinkt, verlinke ich die Adresse mal in diesem Artikel, um vielen sonst ins Leere gehenden Suchanfragen doch ein Ziel zu geben.

Alle meine Lösungen sind unter erreichbar.
Ich übernehme weder Haftung für die Richtigkeit der Sourcecodes, noch für Schäden oder irgendwelche unmittelbare Folgen durch Benutzung dieser Programmcodes. (Schließlich bin ich nur Kommilitone und habe sonst nichts mit dem Praktikum am Hut)

Mittlerweile ist diese Quelle auch den Tutoren aufgefallen. Offenbar ist ihnen auch aufgefallen, dass viele den Code einfach kopieren, aber nicht richtig verstehen. Der Sinn dieses Praktikums ist dadurch natürlich für diejenigen, die sowas tun, gebrochen.

Mit ist das prinzipiell völlig egal, zumal wir alle erwachsen genug sind, um selbst zu entscheiden. Wie gesagt, ich schreibe diesen Artikel hier, um ins Leere gehende Suchanfragen zu verhindern.

Sobald das Praktikum vorbei ist, lade ich die Lösungen auf, das Forum für Kommilitonen dieses Studiengangs, hoch. Das verzögert sich deshalb auf das Ende des Praktikums, weil bis dahin nicht sicher ist, ob noch Änderungen/Korrekturen folgen.