thinkJDs Blog WhooHoo es blinkt!!!

2Aug/12Off

Mit OpenSCAD 3D-Modelle selber bauen

Im letzten Post habe ich schon eine Kleinigkeit über OpenSCAD geschrieben, da ihr sicher schon ganz heiß darauf seid mehr zu erfahren, habe ich hier noch ein kleines Video für euch. 

Jeden Dienstag findet in meinem Lieblingshackersapce die offene RaumZeitLaborierung statt. Die Veranstaltung zeichnet sich besonders durch die Vorträge aus, welche von Mitgliedern, nicht Mitgliedern und außenstehenden gehalten werden.

Dieses Mal waren TabscoEye und ich am Start um etwas zu dem Ultimaker im Allgemeinen und zu OpenSCAD im speziellen zu erzählen. Viel Spaß mit dem Video!

Und? Sind alle Unklarheiten beseitigt? Dann freut es mich, falls nicht, könnt ihr weitere Fragen oder Anregungen gerne in die Kommentare packen.

thinkJD

20Jul/12Off

Aus Virtuell wird Physisch Teil 1

In meinem  Lieblings Hackerspace, dem RaumZeitLabor, haben wir ein neues Spielzeug bekommen. Einen Ultimaker 3D-Drucker. Grob gesagt handelt es sich dabei um eine Heißklebepistole, welche sich auf drei Achsen Bewegen kann. Dabei drückt sie Kunststoff durch eine Düse und kann so Schicht für Schicht Objekte ausdrucken.

Was man damit machen kann will ich euch mal an einem Beispiel erklären:

Wir haben einen Konferenztisch im Raum, aus Komfortgründen möchte man da natürlich Steckdosen haben, dass all die Nerds ihre Rechner besaften können. Da die Tische gerne auch einmal anders gestellt werden wollen, muss die Verdrahtung natürlich flexibel sein. Also bekommt jeder Tisch auf der Unterseite je eine Steckdose und einen Stecker. Die Stecker haben wir in einer Abzweigdose unter dem Tisch aufgelegt. Genau hier gibt es jetzt ein Problem. Man braucht eine Zugentlastung, dass die Stecker nicht versehentlich aus der Dose gerissen werden.

Jetzt könnte man natürlich irgendetwas zusammenpfuschen (der berühmte Kabelbinder hinter dem Würgenippel, die Elektriker wissen was ich meine) oder man kann es richtig machen. An dieser Stelle kommt dann der 3D-Drucker ins Spiel. Also habe ich fix das 3D CAD OpenSCAD angeworfen und ein kleines Script geschrieben.

Nach dem kompilieren sah die Zugentlastung dann so aus:

Unter den beiden Stegen kann ein Kabelbinder gezogen werden, der das Kabel in der Mulde fixiert und an den zwei Löchern wird das Teil unter den Tisch geschraubt. Nachdem das Modell kompiliert und exportiert war, wurde das Modell mit Hilfe eines Slicers in kleine Scheiben geschnitten. So wird aus einem 3D Modell ein 2D Schichtmodell, das jetzt vom Drucker verarbeitet werden kann. Danach konnte das Modell endlich von der virtuellen Welt in die reale überführt werden :)

Der Druck ist noch nicht wirklich gut, das liegt aber daran, dass wir noch nicht die optimalen Einstellungen gefunden haben. In Unserem Log könnt ihr euch über die Fortschritte informieren und allerlei andere Dinge ansehen, die bis jetzt aus dem Drucker gefallen sind. Ach ja, falls ihr auch eine Zugentlastung für zu Hause braucht. Hier könnt ihr euch das SCAD-File herunterladen.

thinkJD

26Mai/11Off

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

 

26Mai/11Off

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

 

27Jan/11Off

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/11Off

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

Page 1 of 4
1
2
3
4