Zwischenschritt: Analyse von Motorverhalten

 Beim Umstellen der seriellen Funktionen auf ASCII-Klartext-Anweisungen anstatt binärer Daten, stellte sich heraus, dass die Motoren nicht immer gleich auf die selben Anweisungen reagierten. Um sicher zu gehen, dass es kein Hardwarefehler ist – und weil ein Programmfehler nicht feststellbar war – wurde kurzerhand ein kleiner Analysestecker gebaut und alle Verbindungen insgesamt aufgetrennt um jedes elektrische Modul für sich sauber zu testen. Und so sah der Test dann aus:

  

Wie mah sieht zeigt die grüne LED den Zustand des betreffenden Portbits des Atmel an. Zum einfacheren Testen wurden einfach ein paar LEDs mit je einem 1,5 k Ohm Vorwiderstand gegen Masse auf den betreffenden Pfostenverbinder gelötet:

  

Das funktionierte offenbar wie gewünscht. Anschließend wurden umgekehrt die Eingänge der Motorcontrol-Boards jeweils per Drahtbrücken auf high gesetzt um zu sehen, ob die Motorcontrol-Boards beide ordentlich funktionieren. Das Wichtigste dabei: Eine ordentliche und aufgeräumte Testumgebung! 

  

Spaß beiseite. Hintergrund dieser wilden Verkabelung ist natürlich, dass das Board "vor Ort" also in der Originalumgebung "im Roboter" getestet werden soll, also mit der gleichen Spannungsversorgung etc. Also wurde die Platinen nur soweit gelöst, dass man an die betreffenden Stecker ordentlich ran kommt und etwas unter die Platinen gelegt, damit es keine Kurzschlüsse gibt.

Nun wurden endlich auch die letzten Stecker und Kabel bei der Gelegenheit beschriftet – wo sowieso schon mal alles auseinander gebaut war:

    

Ergebnis: Interessanterweise wurde kein Fehler gefunden und nach dem Zusammenbau funktionierte alles wie gewünscht – ohne was geändert zu haben. Irgendwie seltsam… 

Erste Tests mit der Microsoft Kinect und OpenKinect / libfreenect

 Wie aus dem letzten Post vielleicht für den einen oder anderen zu erkennen, handelt es sich bei dem selbst gemachten Weihnachtsgeschenk um die Microsoft Kinect, die gerade vielfältig von sich reden macht. Denn eine Art 3D-Sensor in dieser Preisklasse schien vorher nicht recht möglich. Seit ein paar Tagen werden die gehackten und mittlerweile als Open Source verfügbaren Treiber, Libraries und Sourcecodes untersucht und ein wenig damit experimentiert. Hier die ersten Eindrücke:

      

Und hier das erste Erfolgserlebnis im etwas angepassten Sourcecode:

Wie man an der markierten Stelle sieht, wird hier schon ganz gut ein mögliches "Hindernis" für den Roboter angezeigt. Auf dem Live-Bild der Kamera rechts oben im Bild ist ein "Klavier-Hocker" zu erkennen. Der Sourcecode wurde so angepasst bzw. beim Programmstart so eingestellt, dass im Fenster links unten nur Objekte (Hindernisse) ab einer bestimmten Entfernung markiert (umrahmt) werden. Das Programm zeigt das größte Hindernis an, erkennt nun deren Mittelpunkt innerhalb des Bilders (X/Y-Koordinaten) und zeigt auch den Abstand des Objektes an. Und das beste: Das läuft soweit bereits unter Mac OS und unter Linux.

Genutzt wurde dazu der als Open Source verfügbare Treiber / die Library OpenKinect. Ergänzt um openFrameworks und ofxKinect. Vorteil dieser Lösung ist, dass sie unter Windows, Linux und Mac OS läuft. Ein Nachteil dieser Lösung könnte sein: Es gibt zwar einen Wrapper für das Qt Framework, welches von mir genutzt wird, aber da fehlen sämtliche OpenCV Elemente, die bei der openFrameworks Lösung alle schön beinhaltet sind. Da ist also noch etwas Analyse erforderlich, wie das ganze zusammenzubringen ist. :-) Es wird nicht langweilig…

Montage des Commel Pico ITX Boards, der Festplatte und der WLAN-Antenne

Nachdem das neue Pico-ITX Board von Commel; das 170G nun "verkabelt" wurde,

   

ging es an die Montage des Boards auf dem Roboter. Verbaut wurde es an die gleiche Stelle, an der zuvor der fit-PC2 war:

   

Hierzu wurde es wie bewährt auf die Profilschienen geschraubt:

  

Wie man an den Detailfotos sieht, wird das Board mit Kunststoffmuttern und -unterlegschreiben auf den Distanzbolzen festgehalten, damit hier keine besonderen Masseschleifen o.ä. entstehen. Das Kabel rechts im Bild mit den freien Kontakten am Pfostenstecker geht übrigens zum Ein-Aus-Schalter auf dem Bedienpanel:

   

Um nun die 2,5" Festplatte zu befestigen, bedurfte es Distanzbolzen mit sehr kurzem Gewinde. Diese wurden kurzerhand mit einer Schleifmaschine gekürzt. Tipp dazu: Vor dem Kürzen eine passende Mutter auf das Gewinde schrauben, damit man hinterher ggf. die verbleibenden Grate leichter beim Lösen der Mutter "wegdreht" [And always wear safety glasses!]:

    

Und nun die Montage der Festplatte und ein paar verschiedene Blickwinkel:

          

Nun noch die WLAN-Antenne montiert, die übrigens samt mini-PCI-Karte noch aus dem defekten fit-PC2 stammt:

    

Und noch mal im Ganzen fotografiert:

  

 

Und nun am Roboter montiert:

         

Ein abschließender Test durfte nicht fehlen:

     

PS.: Die Kabel am Mainboard sind natürlich erst provisorisch und müssen noch "verlegt" werden. Und ja, der rote Text im letzten Foto zeigt leider noch eine Fehlermeldung vom Laserscanner. Irgendwie bringt dieser unter Linux – aber nur unter Linux – noch Fehlermeldungen und bricht dann ab. Da ist noch Forschungsarbeit zu leisten.

Meanwhile: checking of the motor behavior

 After changing the serial method to transceive ASCII clear text instructions instead if binary data, I found out that that the motors do not react the same when using identical instructions. To ensure that this is not due to a hardware error – and since it does not look like a software error too – I built a small analysis connector which disconnects all connections at all to test every electrical module  seperately. This is how the test looked like:

 

As you can see the green LED shows the state of the corresponding Atmel port bit. For easier testings I simple connected some series resistors of 1.5 k Ohm in line with some LEDs connected to the common ground – with 7-segmend-LEDs, to be more precise. These were than directly soldered on the board connecter:

 

This stuff worked as expected. After this the input ports from the motor control boards were set to high (one after another) to check of these boards work as expected. The most important thing when testing things like this: a wel organised and tidy working environment! 

 

To be honest the reason for this wild flying wires here are was that I had to test this directly at and close to the robot. Since I wanted to have a realistic test case with the original power supply etc. This is why I unmounted the PCBs only this far that I was able to connect all relevant connectors and not resulting in a short circuit.

Using this opportunity I finally labeld the last connectors and cables with this DYMO stuff – since at least anything was disassembled at this moment:

   

Result so far: No error found. After reassambling everything, all motors worked like they should – allthough nothing was changed. Strange…. 

Analyse der fit-PC2 Probleme – Teil 2 (vor fit-PC-Tod)

 Auf der Suche der USB-Probleme, genauer, warum die USB-Verbindung offensichtlich verloren geht, geht es hier nun weiter. Wie man hier sieht, geht zeitweise die USB-Verbindung zwischen PC und Atmel-Board verloren:

Bei der vorangegangenen Analyse wurde bereits klar, dass das Problem nicht auftritt, wenn das Atmel-Board an ein anderes Gerät als den fit-PC2 angeschlossen wird, also z.B. an den iMac oder ein anderes Linux-Laptop. Um alles auszuschließen, wurden erst alle Stromversorgung extern aufgeteilt; also jede Spannung wurde durch ein eigenes Netzteil angeschlossen (5V, 12V und 24V):

Dieses brachte leider noch keine Änderung: Nach mehreren Motor Ein- und Ausschaltvorgängen, ging die USB-Verbindung wieder verloren. Nach weiteren Tests fiel auf, dass ein wichtiger Hinweis aus dem Wiki von roboternetz.de vernachlässigt wurde: Und nie vergessen Motoren zu entstören!

Solle es also daran liegen? Streuen die Motoren so viele Störungen Richtung fit-PC? Also, "kurz mal eben" alle Motoren und deren Kabel ausgebaut, ausgetauscht (die Kabel) und gemäß Wiki entstört:

     

Ja, Entstören wurde leider sträflich versäumt in der Vergangenheit. Und das Ergebnis? Leider nichts! Der oben gezeigte Fehler tritt noch immer auf. Fortsetzung folgt…

Analyse der fit-PC2 Probleme, Update der direcs-remote GUI

 Seit langer Zeit gibt es im Blog nicht viel Neues. Dieses liegt vor allem daran, dass es Probleme mit dem fit-PC in Verbindung mit dem Atmel-Controller gibt – scheinbar zumindest. Als erstes stellte sich heraus, dass aufgrund des unter Debian fehlenden Intel-Grafikkarten-Treibers die Performance der GUI so miserabel war, dass diese (eben mangels passenden Treibers) vollständig "in Software gerendert" wurde. Was das bedeutet, kann sich jeder vorstellen: Der größte Teil der CPU-Zeit steht nicht für das eigentliche direcs-Programm zur Verfügung, sondern wurde für den X-Server und/oder die KDE-Oberfläche "verbraucht".

Nach dem Entfernen der kompletten GUI zeigte sich auch, dass für das direcs-Programm auf dem 1,1 GHz-Rechner natürlich genug CPU-Power zur Verfügung hat; trotz diverser parallel laufender Threads für die Sensoren, den Laserscanner, das Netzwerk, den Joystick usw.

In der System-Konsole sah man nun endlich auch, dass derzeit offenbar ein ganz anderes Problem vorliegt. Denn nach Analyse der bisher selbst gedrehten Videos, war schnell klar, dass der fit-PC bisher nie im Einsatz auf dem Roboter war, um diesen – also das Atmel-Board – direkt anzusteuern. Zum Testen wurde in der Vergangenheit immer der Entwicklungungs-PC bzw. -Mac genutzt.

Das Ergebnis von heute sieht also derzeit so aus: direcs auf dem Bot im Konsolen-Modus (ohne GUI) gestartet; wartet auf Befehle (per Joystick oder über das WLAN). Danach wird direcs-remote gestartet (derzeit noch im Teststadium):

Wie man sieht, werden über WLAN vom fit-PC z.B. Spannungswerte der Akkus übertragen und in der GUI angezeigt sowie ein Heartbeat (grüne GUI-LED rechts oben), an dem derzeit lediglich erkennbar ist, dass der SensorThread auf dem Roboter läuft und Daten ausliest bzw. übermittelt.

Klickt man nun links unten auf den "foward" Button (blauer Pfeil nach oben), wird über WLAN der Befehl "forward" an den Roboter gesendet und nun passiert folgendes (was erst in der Konsole sichtbar wurde, da Systemmeldung):

Und hier gilt es nun zu Analysieren, woran es liegt. Denn wird der Roboter z.B. an den Mac oder an ein anderes Linux-Laptop angeschlossen, tritt dieses Problem nicht auf:

Atmel flashen unter Mac OS X über USB

Unter Mac OS X wollte das flashen des Atmel erst nicht klappen. Für alle, die das gleiche Problem – sei es unter Linux, als auch unter Mac OS X – auch schon einmal hatten, hier nun die Lösung. Zum flashen über USB wurde das USB AVR Lab mit der Standardfirmware (ab Werk) von www.ullihome.de genutzt. Beim Nutzen des avrdude zum flashen (hier installiert via Macports), stellte sich heraus dass dieser nicht aktuell genug war, auch meinen Atmel Atmega 2560 zu unterstützen. Der avrdude wurde also wieder per Macports wieder entfernt. Komfortabel wurde nun die sehr aktuelle Version des avrdude (zurzeit V5.10-1) (mit ebenfalls aktuellerem avr-gcc) mittels des CrossPack Paketes auf dem Mac installiert.

Zum Programmieren (flashen) über den USB-Port ist nun folgender Befehl nötig:

avrdude -p m2560 -c usbasp -P usb -e -U flash:w:FILENAME.hex

 

Der manuelle compile und link Vorgang für ein C-Programm für den Atmega sieht übrigens wie folgt aus. Konfortabler geht dieses natürlich per Makefile.

avr-gcc FILENAME.c -c -o FILENAME.o -Os -g -mmcu=atmega2560

avr-gcc FILENAME.o -o FILENAME.elf -mmcu=atmega2560

avr-objcopy -j .text -j .data -O ihex FILENAME.elf FILENAME.hex

 

Sollte folgende Fehlermeldung erscheinen:
 
avrdude: Warning: cannot query manufacturer for device: error sending control message: Operation not permitted
avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
 
muss das Ganze als root ausgeführt werden. also per "su" oder "sudo" bzw. "sudo -s".
 

 

Support für SICK Laser S300 kurz vor der Fertigstellung

 Nach vielem Testen und viel reverse engineering konnte der Source Code für den neuen Laserscanner S300 von SICK erstellt werden. Schon spaßig, so ein paar Zeilen eines Seriellen Port Analysers auseinanderzunehmen:

 

Auch der richtige serielle-USB-Konverter will auch gefunden sein:

 

 

Aber ein simples Testprogramm mit eigenem git Repository hilft hier weiter. Und so sehen die ersten Testergebnisse aus:

PS.: Der erste Laserscannerwert ist wohl vernachlässigbar / noch mal zu prüfen… ;-)

32/64 Bit Bug gefixt

 Interessanter Fehler, der bereits die ganze Zeit in der GUI angezeigt wurde: Unter zufälligen Umständen wurden "zufällige" Laserlinien in der GUI angezeigt (im Simulationsmodus. Zusätzlich wurde auch nur jede zweite Laserlinie dargestellt. So stellte sich dieses dar:

Nach längerem Debuggen stellte sich heraus, dass alle Laserlinienelemente in allen Schleifen vollständig vorhanden waren. Einzig in der Darstellung wurden sie nicht angezeigt… Ursache schien hier ein 32/64 Bit-Problem zu sein, denn beim Auslösen des Events des LaserThreads, dass alle Daten für die GUI zur Verfügung stehen, wurde ein Zeiger auf das erste Element einer QList übergeben. Da nur jeder zweite Wert angezeigt wurde macht deutlich, dass die Ablage der Werte im Speicher offensichtlich jeden zweiten "übersprungen" hat. Denn das jetzige System (ein Apple iMac) ist ein 64 Bit-System!

Da die QList ohnehin bereits 360 Elemente enthielt – unabhängig davon, wie viel Grad der Laserscanner abdeckt, wurde hier kurzerhand (Und um mehr Zeit für Wichtigeres im Projekt zu verwenden) einfach auf ein normales good-old float-Array umgestellt. Nun werden alle Werte korrekt an die GUI emmited und damit auch wieder dargestellt.

Zwei Tage flashen und keine Funktion des neuen RN-MEGA 2560 Moduls…

Nach dem Tod des alten und ersten Atmel-Boards und 60 EUR später,  von robotikhardware.de sollte nun einfach das neu gelieferte Board geflasht und ein den Roboter eingesetzt werden…

Interessanterweise lies sich das Board zwar einwandfrei flashen und wurde auch am USB-Port sauber erkannt (auch das mitgelieferte Testprogramm lief beim ersten Einschalten einwandfrei), aber leider lief danach scheinbar gar nichts mehr.

Konkret lief das flashen zwar einwandfrei durch (einschließlich vorigem Löschen und anschließendem verify), das Atmel-Board bzw. die geflashte Firmware "lief" danach aber nie. Selbst ein Testprogramm welches nur ein Bit setzte um die onBoard-LED zu aktivieren lief nicht.

Um das Ganze nicht noch spannender zu machen: Ursache war ein vom Lieferanten falsch gesetztes Fuse-Bit! Nur unter größter Unterstützung eines Forum-Mitgliedes des Forums RoboterNetz.de, wurde diese Ursache gefunden (Danke an Sven Arnold).

Entgegen der Anleitung auf der mitgelieferten CD war das betreffende Fuse-Bit M nicht wie folgt gesetzt:

Quelle: http://www.robotikhardware.de/download/rnmega2560.pdf

 

Statt dessen war das Bit auf "Bootloader" gesetzt. Dieser stand jedoch gemäß beiliegender CD gar nicht zur Verfügung, sondern war in Planung. [Update: Mittlweile verfügbar] Damit war klar, dass der Atmel per Bootloader starten wollte und nicht sofort das geflashte Programm startete. Kleine Ursache, große Wirkung. Am Ende der zwei Tage leuchte dann auch wieder die LED und das alte, unveränderte Atmel-Progamm lief natürlich auch wieder anstandslos:

   

:-)