RPi im Radio: Hardware

Ich bin der glückliche Besitzer einer Sharp XL-560 Mini-Stereoanlage, die ich vor einiger Zeit relativ günstig über ebay-Kleinanzeigen bekommen habe. Ein schönes Gerät, besonders die Tatsache das es einen Drehknopf hat, mit dem man die Lautstärke einstellen kann ist super. Mein Radio vorher hatte nur zwei Knöpfe, das war ein bisschen nervig, wenn es plötzlich zu laut war 🙂

Das Gerät ist schon aus einer bisschen älteren Generation, und hat die für die Zeit übliche Kombination: (UKW-)Radio, CD, Kassette, AUX-Eingang. Nun, irgendwie war meine Anwendung für das Kassettedeck ein bisschen limitiert (ich weiß bis heute nicht, ob es überhaupt funktioniert…). Daher nun also meine Idee: Modernisieren wir das Ding ein bisschen, und ersetzen das Kassettendeck durch einen Rasperry Pi Zero, mit Internetradio und Airplay. Gesagt getan 🙂 In diesem Post schreibe ich ein bisschen war zum Hardware-Umbau, zur Software kommt später noch mal was.

Eine weitere schöne Eigenschaft dieses Radios ist, das man im Internet ein Service-Manual findet, komplett mit Demontageintruktionen, Fehlersuchhilfe, Blockschaltbild und vollständigem Schaltplan (!) inklusive Bestückungsplan (!!). Ganz ehrlich, ohne dieses Dokument hätte ich das auch nicht hinbekommen… Zeit, mal wieder den Schreibtisch ins Chaos zu stürzen 🙂

Weiterlesen

ftRoboExt: Gehäuse

Nachdem Hardware und Software mehr oder weniger fertig sind, kam jetzt das Gehäuse an die Reihe. Der Plan stand ja schon seit der anfänglichen Planung: Das Modul sollte in eine 60er Kassette. Die Kassette stand auch schon seit dem Baubeginn hier bereit, jetzt mussten noch die Löcher in den Deckel 🙂

Dabei gab es zwei Probleme: Zum einen ist der Deckel aus Acrylglas, bei dem ich mir nicht ganz sicher war, wie gut man das bohren kann, zum anderen sind die Bundhülsen nicht ganz gerade eingelötet, so dass sich nicht wirklich ein Raster ergibt, sondern alle Löscher ein bisschen versetzt sind. Um das Problem zu lösen habe ich einfach den Deckel auf die Hülsen gelegt und dann angezeichnet, aber es war doch recht schwierig, die Markierungen auf dem Glas zu sehen, zum die Bohrmaschine leider nicht gerade an der bestbeleuchteten Ecke unserer Werkstatt steht…

Das Bohren selber war viel einfacher als gedacht. Wichtig ist nur, sehr langsam vorzugehen, und nicht zu stark zu drücken, ansonsten reißt das Glas, was mir auch ein paar Mal passiert ist. Zum Glück sind es aber nur kleine Stellen. Ich hatte befürchtet, dass die Löcher nach unten ausfransen würden, und daher das Glas von oben gebohrt. Das war insofern unpraktisch, als ich das Glas so nicht komplett auf die Unterlage auflegen konnte, weil der Deckel ja noch kleine Ecken zum festklemmen hat. Dadurch, dass der Deckel ein bisschen in der Luft hin, wurde das Problem mit dem Reißen vermutlich noch deutlich verstärkt. Ausgefranst sind die Löcher überhaupt nicht, ich hätte also auch von unten bohren können. Wieder was gelernt 😉

Weiterlesen

ftRoboExt: Fortschritt

Ja, die kleinen Fehler sind immer die gemeinsten. Das war ungefähr das Motto der letzten Runde Entwicklung an meinem ftRoboExt.

Wie üblich bei solchen gemeinen Problemen war der Fehler schwer einzugrenzen, ab und zu funktionierte die SPI-Verbindung zum Robo Interface ohne Probleme, in den meisten Fällen tat mein Controller aber gar nichts. Es lag natürlich an eigener Blödheit, ich hatte das Datenblatt nicht richtig gelesen, dort steht es im Abschnitt 19.3.1

When the SPI is configured as a Slave, the Slave Select (SS) pin is always input. When SS is held low, the SPI is activated, and MISO becomes an output if configured so by the user. All other pins are inputs. When SS is driven high, all pins are inputs, and the SPI is passive, which means that it will not receive incoming data. Note that the SPI logic will be reset once the SS pin is driven high.

Weiterlesen

ftRoboExt: Entwurf

…und am Anfang war der Entwurf. Ein eigenes Erweiterungsmodul für das Robo Interface soll es also werden. (Siehe hier für mehr Infos)

Grundlage sollte natürlich ein AVR sein, weil ich die am Besten kenne, und man dann auch immer gleich die Arduino Bibliotheken mitbenutzen kann 😉 Das Protokoll ist im Wesentlichen ein SPI Bus mit einer speziellen Bestätigungsleitung, das sollte sich also auch problemlos umsetzen lassen. Da die Schnittstelle mit 3,3V betrieben wird sollte auch das gesamte Modul mit dieser Spannung laufen. Die Motoren müssen aber natürlich mit 9V betrieben werden, so dass ein Spannungsregler nötig ist. Für die Motoren sind auch Treiber nötig, da habe ich den TLE4207 eingesetzt, mit dem anderen schon gute Erfahrungen gemacht haben.

2016-03-13 21_10_03-1 Board - C__Users_Niklas_Documents_eagle_ftRoboExt_ftRoboExt.brd - EAGLE 7.5.0Die nächste spannende Frage: In was für ein Gehäuse soll das Modul eingebaut werden? Ein Gehäuse wollte ich auf jeden Fall haben, einfach damit sich das ganze gut im Modell unterbringen lässt. Nach ein wenig Suche bin ich auf die Kassetten gestoßen, die gerade dazu einladen, Dinge dort hineinzubauen. Mit 60x60mm Grundfläche ist dort aber natürlich nicht viel Platz drin, die originalen Module haben etwa die doppelte Fläche. Nach ein wenig Überlegung kam ich dann zu dem Schluss, das gesamte Modul in SMD-Technik zu bauen, auf diese Weise kann ich die Platine zweiseitig bestücken; anders ist es kaum möglich, alles in der kleinen Box unter zu bringen.

Weiterlesen

fischertechnik Hochregallager und eine Robo Extension im Eigenbau

Vor inzwischen doch schon einiger Zeit hatte ich bei einem Besuch der Hannover ein Modell aus fischertechnik gesehen, was dort mit einer SPS gesteuert wurde. Irgendwie hat das mein Interesse an fischertechnik wieder geweckt (nachdem ich sie ja vor einiger Zeit schon mal wieder rausgekramt hatte). Geplant war ein Hochregallager, ein scheinbar ziemlich beliebtes Modell.

Nach ein wenig Gebastel war dann auch eine erste Version fertig (mit tatkräftiger Unterstützung ;)), die im Grunde auch funktionierte. Aber ich wollte mehr 👿 Äh naja, ich wollte jedenfalls gerne noch eine Version bauen, bei der sich der Hauptarm drehen konnte, und ich wollte auch gerne einen Greifer der sich öffnen und schließen konnte, statt nur von unten unter die Objekte zu fahren und sie anzuheben (ich habe leider keine Fotos von der alten Version gemacht). Da zu der Zeit Knobloch, der Einzelteilhändler gerade einen Abverkauf hatte, habe ich mich dort noch mal mit Teilen eingedeckt, speziell den Teilen für einen Greifer.

Weiterlesen

Led-Cube: Viele bunte Kabel

Nach langer Zeit mal wieder ein wenig neues zu meinem LED-Cube. Ich bin mit der Steuerungsplatine inzwischen recht weit fortgeschritten, es fehlen hauptsächlich noch die Transistoren, die die einzelnen Ebenen schalten. Das schlimmste an der Platine waren definitiv die Flip-Flops-Arrays, bzw. die Kabel dazwischen: 8 Datenpins + Output Enable = 9 Pins pro Chip. Ich hatte 8 Chips, das macht 9 * 8 * 2 = 144 Lötstellen, jeweils mit Kabel festhalten. Und das alles in ziemlicher Enge. Das hat wirklich keinen Spaß gemacht. Das Bild sollte es zeigen:

IMGP2061Dazu kamen noch die gelben Kabel, die jeweils die 4 Pins auf der „anderen“ Seite der Pfostenwannen (Insider ;)) verbinden. Von oben sieht das ganz dann so aus:IMGP2062Jetzt im Nachhinein hätte ich definitiv zwei Dinge anders gemacht: Zum einen hätte ich 16ner Pfostenwannnen/Flachbandkabel genommen (und dann immer zwei Ebenen an ein Kabel gehängt). Auf die Weise hätte am immer zwei Chips symmetrisch um einen Leiste gruppieren können und hätte sich die ganzen gelben Kabel sparen können. Und zum anderen (und das sehe ich als ganz großes Manko der Instructables-Anleitung), würde ich Schieberegister verwenden. Momentan liegt das Signal über die endlos vielen grünen Kabeln an allen Latch-Arrays parallel an, und über den Clock-Eingang wird ausgewählt, welcher Chip laden soll. So werden die Chips selber parallel geladen, die Ebene als ganzes aber seriell. Würde man Schieberegister verwenden, würde das Signal über nur acht Kabel am Eingang der Register anliegen, so dass die Chips seriell, aber die Schaltung parallel geladen wird. Das ist Grunde gleich, würde aber den Aufwand massiv reduzieren. Ich hatte sogar zwischendrin schon mal überlegt auf Schieberegister umzusteigen, aber die haben immer nur 16 Beine und würden auch sonst nicht in die Schaltung passen. Aber wenn ich ganz neu anfangen würde, würde ich auf jeden Fall Schieberegister verwenden.

Weiterlesen

FischerPi Teil 4: RaspiFastCamD

TL;DR: Wer einfach nur RaspiFastCamD haben will: Hier gibt es die (mglw. veraltete Binärversion).

Wow, der letzte Teil ist schon wieder lange her. Aber ich war nicht untätig, für die weitere Arbeit an meinem Roboter musste erst ein Software-Problem behoben werden:

Ich habe mir ja die Rasperry Camera gekauft, und diese sollte für die Navigation benutzt werden. Dazu muss natürlich irgendwie das Kamera-Bild ausgewertet werden. Nach ein wenig Suchen habe ich dann OpenCV gefunden, eine Bibliothek, die genau dafür gemacht wurde (CV steht für „Computer Vision“). Nur wie das Bild der Kamera in OpenCV bekommen? Bei USB-Kameras, die V4L (Video for Linux) unterstützen, ist das recht einfach, dort kann OpenCV die Bilder einfach abholen.

Weiterlesen

Mein Timetracker

An der Uni habe ich ja nun einen Hiwi-Job, und da sollte man natürlich die Stunden aufschreiben, die mal so arbeitet. Seit ich vor zwei Monaten dort angefangen habe, hatte ich vor, mir dafür ein „kleines“ PHP-Script zu schreiben, damit sich von jedem Rechner aus meine Stunden aufschreiben kann. Nun ist das ganze fertig, und ich finde, es ist gar nicht so schlecht geworden:

Das meiste sind natürlich fertige Sachen, im Hintergrund ist jede Menge jQuery, die Tabelle ist ein jQuery Plugin, Der Datumswähler und der Button unten stammt aus jQuery UI. Das ganze läuft über PHP und MySQL, und ist schön „ajaxifisiert“, sprich kein Neuladen der Seite 😉

Weiterlesen

DynamicLua

So, ich denke es ist Zeit, die Katze aus dem Sack zu lassen, und mein neues Projekt vorzustellen: DynamicLua

Kurz ein paar Worte zum Hintergrund: Mit .NET 4.0 wurde die sog. Dynamic Language Runtime (DLR) eingeführt. Die dient zum einen dazu, es Entwicklern einfacher zu machen, neue Sprache auf .NET Basis zu entwickeln (wie IronPython/IronRuby), hat aber auch ein paar tolle andere Features zu bieten. Eines davon ist das neue Schlüsselwort „dynamic“. Es funktioniert ähnlich wie „var“ kann also jeden Typ annehmen. Wenn man darin aber ein Objekt speichert, das von System.Dynamic.DynamicObject abgeleitet ist, kann man bestimmen was passiert, wenn etwas „nicht erlaubtes“ passiert, also wenn z.B. eine Methode aufgerufen wird, die es gar nicht gibt. Solche Aufrufe landen dann bei der Methode TryInvokeMember, und die kann dann entscheiden, was passieren soll.

Dieses Konzept habe ich jetzt genutzt, um einen Wrapper für das LuaInterface zu schreiben. Das Lua Interface ist eine Library für .NET, die es erlaubt, Lua in C# zu benutzen. Dabei kümmert sie sich auch darum, .NET Objekte in Lua abzubilden und vieles mehr. Diese Library ist wirklich unglaublich, man denkt wirklich, Lua hätte was mit Objekten am Hut.

Weiterlesen