O&K-Radlader L25 als Modell

 Eingebettete Systeme, Modellbau  Comments Off on O&K-Radlader L25 als Modell
Feb 232011
 

Vor ein paar Tagen war ich bei meinem Freund Tobias Braeker. Er hat sich als Dipl. Ing. (Maschinenbau) einen Kindheitstraum verwirklicht und einen Radlader im Maßstab 1:12 nachgebaut. Der O&K L25 ist aus Edelstahl gefertigt, wiegt stattliche 12 kg und kann bis zu 9 kg heben. Das Modell ist sehr detailliert gearbeitet. Jedes Rad wird durch einen eigenen Glockenankermotor (Faulhaber) angetrieben, die Schaufel wird hydraulisch betätigt. Ein Soundmodul sorgt für Hörgenuss, denn das Motorengeräusch passt zu den gesteuerten Fahrkommandos. Natürlich ist das Modell auch vorbildlich mit Leuchten (Blinker, Rückfahrscheinwerfer, etc.) ausgestattet. Übrigens kann die Schaufel hydraulisch durch ein anderes Anbaugerät ausgewechselt werden.

Radlader

Die Steuerung ist ein waschechtes Embedded System. Sie beinhaltet den Empfänger, die Motorensteuerung, die Sound- und Lichtsteuerung. Der linke Steuerhebel bedient das Fahrzeug selbst, der rechte Steuerhebel bedient die Schaufel. Die Bedienung braucht natürlich Übung, denn meistens ist man es gewöhnt, mit links die Geschwindigkeit und mit rechts die Lenkung zu bedienen. Es macht aber in jedem Fall viel Spaß, Sand und Steine durch das Gelände zu transportieren.

Tobias verkauft das Modell als Bausatz oder als Fertigmodell. Die Preise können über seine Homepage erfragt werden. Auf YouTube können weitere interessante Filme mit dem L25 betrachtet werden. Für die Zukunft plant er die Konstruktion eines Kippers. Ich bin mal gespannt :-)

Jul 072010
 

Das Projekt der modell(-bau-)basierten Eisenbahnsteuerung ist ab sofort auf SourceForge als Open Source verfügbar. Die Startseite ist unter http://sourceforge.net/p/mrw/wiki/Home/ erreichbar. Der Quellcode und die Schaltungen können aus dem Subversion-Repository heruntergeladen werden.

Viel Spaß!


Anzeige:



Modellbasierte Firmware-Generierung

 ATmega, CAN-Bus, Eclipse, Eingebettete Systeme, MDSD, Modellbau  Comments Off on Modellbasierte Firmware-Generierung
Nov 182008
 

Auf dem Yakindu-Tag wurde die modell(-bau-)getriebene Eisenbahnsteuerung vorgestellt. Dabei wurde der Gleisplan schon modellgetrieben generiert. Bisher war die Firmware der CAN-Knoten als Referenzimplementierung noch klassisch implementiert. Die Kommandoverarbeitung in der Firmware der CAN-Knoten war ein unschönes Stück Spaghetti-Code. Aus diesem Grund wurde ein Zustandsdiagramm gefertigt, das die Betriebszustände der CAN-Knoten enthält. Die eingehenden Kommandos sind als Zustandsübergänge modelliert. Aus diesem Diagramm wird mit Hilfe von openArchitectureWare der Code für die Kommandoauswertung generiert.

Der generierte Code enthält zwar relativ viele Callbacks und switch/case-Anweisungen und bläht den Binärcode um ca. 1,5 KByte auf. Das ist aber nicht weiter schlimm, da jetzt noch Platz für ca. 18 KByte im Flash des ATmega32 vorhanden ist. Ein weiterer Vorteil ist, dass der generierte Code wesentlich übersichtlicher aussieht. Änderungen und Erweiterungen der Steuerkommandos lassen sich jetzt viel leichter einpflegen. Die Integration des generierten Codes in den bestehenden Firmware-Rahmen gestaltete sich als unproblematisch, da der restliche klassisch implementierte Teil nur aus Service-Methoden zur Ansteuerung der Hardware dient.


Anzeige:

Prototypen der CAN-Controller

 ATmega, CAN-Bus, Eingebettete Systeme, Modellbau  Comments Off on Prototypen der CAN-Controller
Jul 102008
 

Nach der Entwicklung der CAN-Controller, wird jetzt als nächster Schritt das Bauen der Prototypen angegangen. An ihnen kann man das erste Mal testen, wie sich mehrere CAN-Controller an einem Bus verhalten. Erwartungsgemäß funktioniert der CAN-Bus mit mehreren Teilnehmern gemäß Spezifikation. Auch das Flashen einer neuen Firmware funktioniert einwandfrei. Dabei wird ein Bootloader verwendet, der die Firmware über den CAN-Bus entgegennimmt.

Auf dem Bild kann man vier CAN-Teilnehmer erkennen. Man kann inzwischen auch von den itemis Hardware Labs Lünen sprechen.

itemis Hardware Labs Lünen

Als nächster Schritt wird ein Platinen-Layout entwickelt, um die endgültigen CAN-Controller zu erhalten. Desweiteren werden jetzt die Schaltungen für die Leistungselektronik entwickelt. Schließlich sollen die CAN-Controller ja eine Modellbahn steuern.

Mehr Komfort mit C++

 Eingebettete Systeme  Comments Off on Mehr Komfort mit C++
Jun 212008
 

In der Elektronikpraxis ist ein Artikel von mir erschienen, der sich mit der Verwendung von C++ im Embedded Systems beschäftigt. Obwohl mit C++ schon seit über 20 Jahren entwickelt wird, hält diese Sprache nur langsam in die Mikrocontroller-Programmierung Einzug. Sie enthält aber viele Sprachkonstrukte die die Qualität der Firmware erheblich verbessern kann und dem Entwickler die Arbeit vereinfacht. Ein Grund für die zögerliche Nutzung liegt im höheren Ressourcen-Bedarf. Viele moderne Mikrocontroller haben diese Hürde aber nicht mehr.

Der gesamte Artikel kann hier eingesehen werden: http://www.elektronikpraxis.vogel.de/themen/embeddedsoftwareengineering/implementierung/articles/120537/


Anzeige:

Fallstricke bei der Mikrocontroller-Programmierung

 ATmega, Eingebettete Systeme, Modellbau  Comments Off on Fallstricke bei der Mikrocontroller-Programmierung
Jun 052008
 

Seit geraumer Zeit programmiere ich mit einem Kollegen der itemis AG an einer Mikrocontroller-gesteuerten Modellbahnanlage. Im Großen und Ganzen ging die Entwicklung sehr zügig voran. Es kam aber zu einigen Fallstricken, über die ich hier gerne mal berichten möchte. Zuerst bleibt zu erwähnen, dass die Entwicklungsumgebung für die AVR-Mikrocontroller recht gut sind. Die Gesamtanlage ist ein relativ komplexes System. In der Kette wurden Stellwerkssoftware in Java, ein Übertragungskanal über RS232-Schnittstelle an ein CAN-Gateway mit ATmega32 und MCP2515 gekoppelt. Daran sind mehrere CAN-Knoten derselben Hardware miteinander gekoppelt. Die Firmware ist C programmiert. Die Entwicklung aller Komponenten kann sowohl unter Windows, als auch unter Linux erfolgen. Linux hat den Vorteil, dass auch mal Remote entwickelt werden kann.

Nachdem die erste Schaltung gesteckt war, wurde schnell deutlich, dass die Kommunikation zum CAN-Controller nicht mehr stattfand. Offensichtlich ist die Kommunikation über das SPI zusammengebrochen. Ein kurzes Kontrollprogramm zeigt mithilfe eines Oszilloskops, dass die Verbindung tatsächlich zusammengebrochen ist. Ein genauer Blick ins Datenblatt des ATmega32 zeigte schnell, woran es lag: Es gibt einen Pin names Slave Select, der das SPI-Interface von außen in den Slave-Modus versetzen kann. In diesem Fall war er als offener Eingang – also ohne Anschluss – konfiguriert und beschaltet. Die Lösung bestand darin, das /CS-Signal für den MCP2515 als Ausgang daran anzuschließen.


Anzeige:


Ein weiterer Punkt war, dass ein CAN-Knoten nach kurzer Betriebszeit nur durch einen Kaltstart wiederzubeleben war. Die Ursache war schnell gefunden: Als Takt wurde der Taktausgang des MCP2515 verwendet. Der Taktausgang ist nach einem Reset per Default eingeschaltet, kann aber per Software ausgeschaltet werden. Wenn der Takt erst einmal aus ist, besteht per Software keine Möglichkeit mehr, den Takt zu reaktivieren. Ein eigener Quartz für den ATmega32 bestätigte die Vermutung. Warum der Takt ungewollt ausgeschaltet wurde, wurde nicht geklärt. Vermutlich wurde durch eine Race Condition das entsprechende Register mit falschen Daten beschrieben. Ein ausführlicher Code Audit hat das Problem behoben, denn der CAN-Knoten funktioniert jetzt einwandfrei.

Zum guten Schluss haben wir noch ein Problem gehabt, dessen Lösung sich lange hingezogen hat: Es gingen CAN-Frames verloren. Das kann sehr unangenehm sein, denn es wird ein Messaging System vorausgesetzt, dass sich dadurch auszeichnen soll, dass nicht dauernd Informationen und Zustände abgefragt werden sollen (Polling). Es darf also keine Information verloren gehen. Interessanterweise ist dieser Effekt gehäuft beim Konfigurieren der CAN-Knoten aufgetaucht. In diesem Fall ist sporadisch ein Reset aufgetaucht. Ein Reset war nach der Konfiguration gewollt. Dieser hier tauchte aber während der Konfiguration auf. Die erste Vermutung, dass ein fehlkonfigurierter Interrupt eine nicht konfigurierte Interrupt Service Routine anspringt, hat sich nicht erhärtet. Woher kommt aber der Reset? Ein dummer Zufall brachte des Rätsels Lösung, als im Millisekunden genauen Logfile eine Pause von etwa 700 Millisekunden nach dem Ende der Konfigurierung auftauchte. Das ist gefährlich nahe am Timeout des Watchdogs, der mit einer Sekunde aktiv war. Laut Datenblatt dauert das Speichern eines Bytes im EEPROM 8.5 Millisekunden. Das Speichern einer Flash Page (128 Bytes) hingegen nur etwa fünf Millisekunden. In dieser Zeit kann kein Watch Dog Reset durchgeführt werden. Die Lösung bestand also darin, während dieser Zeit den Watch Dog zu deaktivieren. Eines hat die lange Suche aber noch gebracht: Der Code ist jetzt wesentlich effizienter und aufgeräumter.


Anzeige:


Zusammenfassend kann man feststellen, wie eng gerade in Embedded Systems alle Komponenten miteinander abgestimmt sein müssen. Zwei scheinbar unabhängige Komponenten (Watch Dog und EEPROM) haben letztlich doch miteinander zu tun. Es lohnt sich immer, bei Problemen zuerst in Ruhe (!) einen Blick in die Datenblätter zu werfen. Wie bei der SPI-Schnittstelle kommt man dann schnell auf die Lösung. Wenn man mit Interrupts arbeitet, muss man ein Gespühr für Nebenläufigkeit (Threads) haben. So kann man das Zeitverhalten einschätzen und Race Conditions vermeiden. Dead Locks treten hierbei mit geringerer Wahrscheinlichkeit auf, sind aber nicht unmöglich. Dieser kann auf den ATmega Controllern wenigstens mit dem Watch Dog aufgelöst werden. Alles in Allem braucht man einen klaren Kopf und die Geduld, auf die Lösung des Problems hinzuarbeiten.