Einfache Sättigungsarithmetik in VHDL

Für ein Projekt an der Uni habe ich mit zwei Kommilitonen ein Malprogram („FPGArt“) auf einem FPGA implementiert. Dabei wird eine Maus per PS/2-Schnittstelle angebunden und das Bild schließlich per VGA ausgegeben. Zu dem Projekt selber später vielleicht mehr, hier jetzt nur ein kleines VHDL-Snippet das man vielleicht man gebrauchen kann.

In dem Projekt wird regelmäßig die relative Bewegung der Maus abgefragt und zu dem alten Wert addiert. Natürlich hat das Bild eine begrenze Größe und der Mauszeiger muss in diesen Grenzen von 800×600 gehalten werden. Es wird also eine sog. Sättigungsarithmetik benötigt: Sollte das Ergebnis der Addition größer als 800 (bzw. 600) sein, oder kleiner als 0 wird es auf den Grenzwert gesetzt. Das ganze ist gar nicht so einfach in Hardware zu implementieren (zumindest ist uns nichts intelligentes eingefallen…).

In jedem Fall muss es ein Zwischenergebnis geben das ausreichend groß ist, um Überläufe überhaupt zu erkennen. Die Maus kann pro Intervall Maximal um 256 bewegt werden, entsprechend muss als ein Wert von 800+256 = 1056 gespeichert werden können. Mit 11 bit kommt man auf 2048, das reicht. Hiermit kann man auch Unterläufe erkennen: 0-256 = -256 was dann 1792 entspricht. Dieser Bereich überlappt auch nicht mit den 1056 nach oben. Es ist also immer einwandfrei erkennbar, dass ein Über/Unterlauf stattgefunden hat.

Weiterlesen

ftRoboExt: Software

Nach einiger Pause gibt es mal wieder etwas neues zu meinem selbstgebauten Erweiterungsmodul „ftRoboExt“. Hardware und Gehäuse waren ja schon fertig, nun fehlte eine finale Version der Software. Inzwischen ist das ganze Projekt übrigens auf GitHub zu finden.

Das Protokoll für die Kommunikation zwischen Interface und Extension ist recht einfach, es ist im Prinzip ein SPI-Bus mit einem zusätzlichen Bestätigungssignal und einer Adresse. Über drei Adressleitungen wählt das Interface aus, mit welcher Extension es sprechen möchte. Die originalen Extensions lassen sich verketten, dabei wird das Signal aber nicht ganz unverändert durchgeschleift, sondern die Adresse wird von jedem Modul um ein verringert. Auf diese Weise ist jedes Modul adressiert, wenn es Adresse 0 sieht (das erste direkt, das zweite weil es 1-1=0 sieht). Eine sehr intelligente Lösung, denn dadurch wird die Adresse des Moduls einfach durch die Verkabelung bestimmt.

Wenn das Modul die Adresse 0 sieht, zieht es EM-ACK (die Bestätigungsleitung) auf Low. Nun beginnt das Interface 6 Bytes zu senden, die Extension gibt nach jedem Byte einen kurzen High-Puls auf der EM-ACK Leitung aus. Die originale Extension scheint recht langsam zu sein, so braucht sie etwa 700µs um die Adressierung zu bestätigen. Das Interface hat aber scheinbar auch kein Problem damit, wenn man schneller ist. Die 6 Bytes übertragenen Bytes enthalten die Nutzdaten, genaueres bei thkais.

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

Strom sparen mit AVRs

Die AVRs von Atmel bieten ja wirklich ein Füllhorn von Funktionen. Selbst ein winziger, 8-beiniger ATtiny13, den ich gerade in einem Projekt verbaut habe, hat dermaßen viele Funktionen, das ich vermutlich nur die Hälfte nutze. Eine Funktion, die ich aber schon immer mal ausprobieren wollte, sind die diversen Sleep-Modes zum Stromsparen. Und dieses Projekt lud gerade dazu ein: Ein elektronische Zielscheibe, die eine paar LEDs leuchten lässt und eine Melodie spielt, wenn man sie lange genug mit einem Laser in der Mitte trifft. Das ganze wird von einer Batterie angetrieben, und die soll natürlich möglichst lange halten.

Die meiste Zeit ist das Gerät im Leerlauf und wartet darauf, das es angeleuchtet wird. Dazu überprüft es alle 200ms den Spannungspegel an einem Lichtsensor. Entsprechend habe ich auch erst Mal nur versucht, den Stromverbrauch im Leerlauf zu drücken, während die LEDs blinken geht sowieso ein Großteil des Stroms für die LEDs drauf. (BTW: 6 LEDs, ein Lautsprecher und ein Lichtsensor an 5 Pins, das geht 😉 )

Weiterlesen

Musik mit Diskettenlaufwerken

Ohne viele Worte 😉

Das ganze sind viel Diskettenlaufwerke, dazu ein Breadboard mit einem ATmega328, die Software stammt nicht von mir, das ist Moppy.

Das ganze mache ich für ein Schülerprojekt an der Uni Hannover, dort werden wir spezielle Boards (mit der Schaltung auf dem Breadboard) löten, und dann ein wenig mit Arduino-Code rumspielen, bis wir schließlich unsere Raum-Nachbarn mit vielen Diskettenlaufwerken nerven können.

Ein Prototyp des PCB ist auch gestern gekommen, sieht wunderbar aus. (Mein erstes selbst gemachtes PCB!) Ich hatte auch mal versucht, eine eigene Software zu schreiben, aber die von SammyIAm funktioniert einfach besser (und MIDI ist eine ganz schön komplizierte Sache. Jede Menge MIDI-Dateien, die für Floppys optimiert wurden, findet man übrigens bei GitHub.

Weiterlesen

Temperaturüberwachung mit 1-Wire, Raspberry Pi und FHEM

Ui, viel Zeit vergangen seit dem letzten Eintrag hier. Aber irgendwie habe ich auch nicht interessantes gemacht (außer studiert und so…). Jetzt gibt es aber mal wieder was neues:

Nach dem die Heizung meines Vaters ein wenig Probleme macht(e), kamen wir irgendwie auf die Idee, es wäre nett, die Temperaturen an den verschiedenen Rohren überwachen zu können. Aktuell benutzt er sowieso schon FHEM für ein paar Aktoren im Haus (aka „Smart Home“), daher wäre es ja nicht schlecht, die Sensoren da auch einzubinden.

IMG_0161

Weiterlesen