thinkJDs Blog WhooHoo es blinkt!!!

26Mai/115

MoodPxl facts Teil 1

"Bomb the facts bitch!"

Dieser Aufforderung komme ich gerne nach! Hier also ein paar Fakten über die technische Umsetzung von MoodPxl:

Die Hardware ist nicht all zu spannend und besteht hauptsächlich aus:

Die Komponenten werden dann fachgerecht zusammengefrickelt um schnell mit dem spassigen Teil des Projekts zu beginnen, der Firmware. Diese hat folgende Aufgaben  zu erfüllen:

  • Erzeugen der PWM, in diesem Fall vier Kanäle mit je 10bit Auflösung.
  • Kommunikation mit dem Funkmodul RFM12.
  • Temperaturmessung und Steuerung des Lüfters.
  • Gammakorrektur für jeden Farbkanal.
  • Ein Fader für schöne Farbübergänge in variabler Zeit.
  • Ne kleine Scriptengine um mehrere Befehle nacheinander ausführen zu können.
  • Ein bissel rechnen um HSV-Farbwerte in RGB umzurechnen.

Erstes Problem, die Gammakorrektur:

Die PWM-Au?ösung von 10bit entspricht theoretisch 1024 Helligkeitsstufen. Nach den ersten Versuchen die Stufen von 0 bis 1024 zu durchlaufen, fällt auf, dass die Helligkeit anfänglich sehr stark zunimmt und später nur noch leicht steigt. Der Grund liegt in der Kennlinie des Auges. Das Helligkeitsemp?ndenist so ausgelegt, dass wir bei sehr wenig Helligkeit (Straßenbeleuchtung) und bei extrem großer Helligkeit (Sommertag) gut sehen können, es ist also nicht linear. Um dem Auge einen linearen Farbverlauf vorzugaukeln, muss die Helligkeit angepasst werden. Dazu berechnet man für jeden Helligkeitswert den entsprechenden Korrekturwert. Am Ende erhält man die folgende Kennlinie:

 

Von der ehemaligen 10 bit Auflösung bleiben so noch 8 bit übrig. Die Werte sind alle vorberechnet und in einer Tabelle im Programm abgelegt. Das belegt etwas mehr Speicher, spart aber teure Rechenzeit.

Zweites Problem, das Funkprotokoll:

Daten via Funk zu übertragen ist nicht unbedingt trivial, vor allem dann nicht, wenn man versucht das widerspenstige RFM12 Funkmodul mit einem völlig anderen Funkchip (CC1100 von TI) zum Kommunizieren zu überreden. Von dem grundsätzlichen Problem wie der Frequenzauswahl und so weiter mal abgesehen, benötigt man vor ein stabiles Funkprotokoll.

Auf der folgenden Grafik könnt ihr sehen, wie ein MoodPxl Datenpaket aufgebaut ist. Es entspricht weitestgehend dem Funkprotokoll der RFM12 Lib von Das Labor. Die Lib selbst war für meine Zwecke unbrauchbar, daher habe ich das Protokoll noch einmal selbst implementiert.

  • Die blau markierten Felder werden, richtige Kon?guration vorausgesetzt, vomFunkchip CC1100 automatisch generiert.
  • Die Präambel 0xAAAA entspricht einer Abfolge von 16 High/Low Über-gängen. Sie wird gesendet, um dem Empfänger das Synchronisieren auf den Takt zu ermöglichen.
  • Das Syncpattern 0x2DD4 ist von dem Funkmodul RFM12 fest vorgegeben. Wenn dieses Datenwort empfangen wird, beginnt das Modul damit,die folgenden Daten in den Empfangspu?er zu schreiben. Dieser ist so konfiguriert, dass er beim Empfang von acht bit ein Interrupt auslöst. In der Interruproutine wird geprüft ob es sich um einen Empfangsinterrupt handelt (das Funkmodul unterstützt noch einige mehr) und falls ja, wird das Byte abgeholt.
  • Das Längenbyte gibt die Paketlänge ab dieser Position an. Da es keinSchlusszeichen gibt, dient es dem Empfänger, um das Ende der Übertragung zu erkennen.
  • Das Adressbyte des Masters ist immer 0x00, die Bytes 0x01 bis 0xFE kön-nen für die Slaves verwendet werden. Der Adresse 0xFF ist die Broadcastadresse. Mit ihr können alle Slaves in der Reichweite gleichzeitig adressiert werden.
  • Nach dem Header (Länge und Adresse) folgt eine Checksumme. Wenn die Checksumme nicht stimmt oder der Slave nicht adressiert ist, wird der Empfang ab hier eingestellt. Die Checksumme selbst ist eine einfache Längsparität, also eine XOR-Verknüpfung der Datenfelder mit 0xFF.
  • Die Nutzdaten, hier kommen die Befehle und deren Parameter rein. Es ist übrigens nicht empfehlenswert mehr als 30 Byte über die Luftschnittstelle zu verschicken. Das Funkmodul kommt sonst irgendwann aus dem Tritt.
  • Das letzte Byte der Übertragung ist eine CRC Prüfsumme über das komplette Paket.

Für den Anfang sollten das genug Fakten sein. Wollt ihr mehr wissen? Dann Schreibt mir einen Kommentar :-)

thinkJD

 

26Mai/1110

MoodPxl v1.0 das vorläufige Projektende

Da bin ich wieder!

Alles abgeschlossen, geTeXt, gedruckt, gebunden, optimiert, präsentiert, bewertet,  aus, vorbei! Endlich wieder Zeit für mein Blog und ein paar spannende zukünftige Projekte (ich hab da schon so einiges auf Lager).

Sagt Hallo zu MoodPxl v1.0:

Demnächst werde ich euch dann mit den technischen Details bombardieren.

thinkJD

 

27Jan/1110

HILFE! GIT auf eigenem Webspace

Hallo Leute,

ich bin schon länger vom GIT-Fieber gepackt und hatte gestern einen tollen Einfall. Ich möchte ein Repository auf meinem Webspace. Leider gibt es da ein Problem, es ist eben nur Webspace und kein Rootserver.
Hat jemand von euch eine Ahnung, wie man so etwas gut umsetzt? Gibt es eine (funktionierende) Lösung auf PHP oder sonst was Basis? Habt ihr so etwas vielleicht selbst am laufen und könnt mir ein paar Tipps geben?

Github kann ich leider nicht verwenden, da das Repo. nicht öffentlich sein soll. Auch Sync via Dropbox fällt flach, da ich nicht erst einen Dropbox client installieren möchte.

thinkJD

18Jan/114

Zur Abwechslung mal etwas Sourcecode

Hi Leute,

ihr habt sicher schon bemerkt, dass hier seit Neujahr nicht viel passiert. Ich könnte euch jetzt die Ohren voll jammern, wie viel Arbeit ich habe und bla bla bla... Stattdessen mache ich hier lieber ein kleines Experiment. Inspiriert vom lieben Angelslayer, beginne ich auch mal damit, etwas Sourcecode um mich zu werfen.

Zuerst muss ich euch aber noch etwas über meinen Kollegen erzählen:
Er macht den Job schon länger als ich und hat wesentlich mehr Erfahrung. Früher großer Delphi Fan ist er zusammen mit mir jetzt bei C# gelandet. Ich hatte schon ein wenig .NET Vorbelastung, da ich vorher VB.Net programmierte. Ich wollte weg von dieser Kindersprache (nein, das meine ich nicht ernst, viele Personalchefs allerdings schon) und er wollte auch mal etwas Neues testen. So kamen wir vor ca. 4 Jahren zu C# und sind immer noch begeistert dabei.

Da wir sehr unterschiedliche Stile haben, entwickeln sich immer wunderbare Diskussionen darüber, wie man was besonders elegant, verständlich oder optimal implementiert. Die Gegenstände dieser Diskussionen und deren Lösung will ich euch in dieser kleinen Kategorie vorstellen.

Im ersten Teil geht es um das Singleton man könnte es auch Einzellstück nennen. Es ist eine Klasse die immer nur genau ein mal instanziert werden kann. Sie verhält sich in etwa wie eine globale Variable, was nüchtern betrachtet auch der größte Nachteil bei einer objektorientierten Sprache sein kann.

Dazu switche ich mal in Codeview :-)

?//Die Klasse ist sealed,
//so kann man wirksam verhindern, dass andere Objekte
//von ihr erben.
sealed class clsHaus {

//Beim ersten Aufruf, wird eine Instanz der clsHaus erzeugt
//und hier gespeichert. Ab jetzt kann man auf die
//Klasse und alle Funktionen global zugreifen.
private static clsHaus instance = null;

//Der private Konstruktor verhindert, dass die Klasse von
//außen instanziert wird.
private clsHaus() { }

//Im geter wird, falls die Klasse noch null ist,
//eine neue Instanz erzeugt.
public static Singleton Instance {
get {
//Ist die Klasse noch null
if (instance==null) {
//Wird eine neue Instanz erzeugt
instance = new clsHaus();
}

//ab jetzt wird genau diese Instanz immer zurück gegeben
return instance;
}
}

Achtung, bei dieser Implementierung fehlt noch einiges, um das Teil wirklich sicher zu beherrschen. In dieser Version zum Beispiel, ist unser Singleton noch nicht thread-safe. Falls es euch interessiert, kann ich euch in den Kommentaren noch ein bissel was dazu erzählen. Ich denke halt an meine Leser ;-)

Wozu benötigt man das jetzt?

Kurz, für alle Aufgaben die bei großen Projekten (manchmal auch kleine) zenral verwaltet werden müssen. Dazu zählen zum Beispiel Logger, globale Variablen (auch wenn diese böse sind), Verwaltung von Datenklassen und so weiter.

Ich benutze es zum Beispiel für eine Bandanlage. Jedes Teil auf dem Band bekommt ein Objekt zugeordnet, dieses wird von einer solchen Klasse verwaltet. Auf dem Band gibt es mehrere Stationen, die Daten zu den Objekten benötigen. Ich kann an jeder Station auf dem Band auf jedes Objekt und dessen Daten zugreifen. Außerdem können Datenbankzugriffe zentral in eben dieser Klasse vorgenommen werden, was wiederum für übersichtlichen Code und einfache Transaktionen sorgt.

Jetzt seid ihr gefragt. Was haltet ihr von dem Singleton? Benutzt ihr es selbst? Ist es böse? Macht ihr es ganz anders? Habe ich etwas nicht bedacht? Habt ihr noch Fragen zur Implementation oder wollt ihr mehr Beispiele? Dann schreibt mir einfach einen Kommentar.

thinkJD

2Dez/106

Ambilight? Kein Problem!

Ich wollte schon ein Ambilight bauen, seit ich es das erste mal gesehen habe. Leider hatte ich nie die Zeit oder Motivation dazu gefunden.

Das ist aber gar kein Problem, Mike Shatohin hat das wunderbar und wie ich finde extrem elegant erledigt. Er verwendet einen ATiny44 Mikrocontroller von Atmel um die LEDs zu steuern. Auf dem Rechner läuft ein tool, welches eben jenen AVR über USB mit den benötigten Daten versorgt.

Auf seiner Homepage findet ihr Pläne, Sourcecode und Beispiele, mit denen es kein Problem sein sollte das System selbst zu implementieren. Die Steuersoftware läuft auf Windows und Linux und dank Apples Umstieg auf Intel Prozessoren, sollte das übersetzen auf den Mac auch kein unüberwindbares Problem sein. Wie das am Ende ausschaut, könnt ihr hier bewundern:

Awesome!

Wie findet ihr eigentlich das Ambilight? Habt ihr einen Fernseher mit entsprechender Technik? Steht ihr drauf oder findet ihr es eher störend?

thinkJD

29Okt/100

Eine verdammt helle LED!

Kennt ihr die erste Regel im Umgang mit ICs?
Richtig, das Datenblatt lesen! Was passiert wenn man das mal eben sein lässt, will ich euch in diesem Artikel erzählen.
Außerdem erwarten euch noch einige Informationen zum Thema LED und deren Ansteuerung. Habt ihr Fragen? Dann packt sie in die Kommentare, wenn ich kann werde ich sie euch beantworten.

Ich habe mir drei wirklich helle LEDs bestellt. Je eine Rote, eine Grüne und eine Blaue. So kann man mit geschickter Ansteuerung viele verschiedene Farben, aus dem sichtbaren Spektrum, darstellen.
Die LEDs sitzen, zwecks besserem Handling, ?bereits auf einer Adapterplatine um die Linse und den Kühlkörper anzubringen.

Kühlkörper? Ja richtig, die Teile benötigen einen Kühlkörper.
Immerhin werden sie mit bis zu 700 mA Strom betrieben, was das Silizium bei 3V Spannungsabfall schon reichlich zum Schwitzen bringt.
Für die Rechenfaulen unter euch 700mA X 3V = 2,1W und da ist noch nicht Ende der Fahnenstange :-)

Auch die Ansteuerung solcher Monster ist nicht so trivial wie man vermutet. Ein einfacher Vorwiderstand, wie ich es in diesem Artikel beschrieben habe, kann man aus wirtschaftlichen Gründen nicht benutzen. Bei so hohen Strömen würde man unnötig viel Energie "verheizen". Eine Spannungsregelung ist bei LEDs dieser Größe ist auch nicht Mittel der Wahl, da die Kennlinie sehr steil ist (wie bei allen Dioden) und bereits kleine Spannungsschwankungen nahezu gigantische Stromschwankungen mit sich bringen.

Will man es richtig machen, regelt man den Strom durch die LED. Dazu gibt es einige sehr gute Treiber ICs, man muss das Rad ja nicht neu erfinden. Ich habe mich entschieden den ZXLD1360 zu benutzen.
Ein wirklich tolles IC mit einigen interessanten Features:

  • Er befeuert LEDs mit bis zu einem Ampere
  • Der Ausgangsstrom kann auf einen Maximalwert begrenzt werden
  • Bis zu einem Megaherz PWM-Frequenz
  • Ein sehr geringer Aufwand an externen Bauteilen
  • Und zuletzt der Knackpunkt dieses Artikels, er besitzt einen Tri-State Inputpin

Jetzt muss ich natürlich kurz erklären was Tri-State bedeutet.
In der Digitaltechnik wird keineswegs nur zwischen 0 und 1 unterschieden, es gibt noch einen dritten Zustand. Nennen wir ihn der Einfachheit halber mal IchBinWeg-Zustand.
In der C-Mos Technik wird eine logische 0 nicht durch 0V dargestellt, sondern durch 0 bis 1,5V eine logische 1 entspricht einem Pegel von 3,5V bis 5V alles dazwischen wird undefinierter Zustand genannt und sollte tunlichst vermieden werden.
Der dritte Zustand ist einfach hochohmig, kein Pegel vorhanden, der PortPin ist quasi weg. (Ich hoffe man versteht das so wie ich es beschreibe)

Jetzt besitzt das wunderbare Treiber IC also einen solchen Eingang. Logisch 0 bedeutet die LED ist aus. Hochohmig bedeutet die LED wird mit dem in der Schaltung vorgegeben Maximalstrom betrieben und Logisch 1 bedeutet die LED wird mit maximalem Strom betrieben.

Ihr ahnt sicher schon was kommt. Ich habe diesen Umstand einfach großzügig überlesen und die LED bei einem Ampere schön knusprig gebraten.
Daher immer ja wirklich immer das Datenblatt lesen!

Fuuuuuuuuuuuuuu!!!!!

Vielleicht wollt ihr noch wissen warum es so eine Option überhaupt gibt, wenn man damit die LED schrotten kann.
Nun das ist ganz einfach. Um eine LED zu dimmen benutzt man PWM, dabei wird der Strom gepulst, um so länger die Pulse in einem festgelegten Zyklus um so heller leuchtet die LED.
Wie das genau funktioniert kann ich gerne mal in einem extra Artikel erklären. Wenn man mehrere LEDs betreiben will, aber nur wenige Ausgänge zur verfügung hat, kann man diese multiplexen.
Das bedeutet man schaltet LED1 an, dann LED2, dann LED3, immer nacheinander. Das Auge ist so träge, dass es von dem schnellen Schalten nichts mit bekommt. Der unangenehme Nebeneffekt ist, dass diese Signalform wie PWM wirkt. Die LED wird immer dunkler wahrgenommen, da sie nicht mehr so viele Photonen aussenden kann (sie ist ja seltener eingeschaltet). Dem kann man entgegenwirken, indem man die LED mit einem höheren Strom betreibt.
Es ist also zulässig einen größeren Strom anzulegen, allerdings nur für eine gewisse Zeit. Diese Zeit ist im Datenblatt angegeben und beträgt je nach Strom maximal ein paar Millisekunden.

Überschreitet man diesen heiklen Grenzwert, verabschiedet sich die LED blitzartig in den Failhimmel.

Man sollte bei solchen Späßen auch immer auf sein Programm achten. Eine Schleife, die zu lange dauert, kostet euch genau wie ein Freeze die LED. Ein Watchdog oder gut ausgetestet Interrupt Routinen sind Pflicht, zumal die LEDs nicht gerade billig sind.

Ich hoffe euch hat der Artikel gefallen und ich kann ähnliche Fails bei euch vermeiden :-)

thinkJD

Page 1 of 3
1
2
3