Logo BugSoft Modellbau
 
Startseite
 
Flugzeuge
 
Schiffe/Boote
 
Autos
 
Hubschrauber
 
Elektronik
 
Airbrush
 
Links
 
Kontakt/Impressum
 
| BugSoft Modellbau | Elektronik | Lichtmodul für RC-Cars

Lichtmodul für RC-Cars

19.08.08

An dieser Stelle möchte ich über die Entwicklung eines Licht-Moduls für RC-Cars, insbesondere meinen Swift, berichten. Mit dieser Materie muss ich mich allerdings selbst noch etwas beschäftigen.
Das Modul wird entweder genau so, oder je nachdem, wie sich z.B. ein eingesetzter Regler beim Bremsen verhält, oder wenn noch andere Funktionen gewünscht sind, mit leichten Software-Änderungen auch in anderen Modellen als dem Swift einsetzbar sein.
Für den Swift habe ich folgende Funktionen geplant:
  • Fahrlicht schaltbar per Fernsteuerung durch Tasten mittels Steuerknüppel oder eben per Taster(wie die eingebaut werden, gibts beim Baubericht der Dolly zu lesen)
  • ebenso Nebellicht(Ob das so sinnvoll ist sei dahingestellt, als Schaltausgang auf dem Modul wird es die Funktion geben, man muss ihn ja nicht nutzen)
  • nur mal so neben die Tüte gekotzt, aber denkbar: auch per Taster fernsteuerbar: Hupe und Lichthupe
  • Blinker links/rechts, in Abhängigkeit von der Stellung des Lenkservos
  • Rückfahrlicht und Bremslicht, angepasst an die Funktion des Fahrtreglers
Es werden also folgende Eingänge(Kanäle vom Empfänger) benötigt:
  • Fahrlicht/Nebellicht(Tast-Schalt/Tast-Schalt)
  • Hupe/Lichthupe(Tast/Tast)
  • Blinker(Tast/Tast), Lenkservo durchgeschliffen
  • Rückfahr/Bremslicht, Fahrtregler-Kanal durchgeschliffen

Mit "Tast-Schalt" ist in diesem Fall eine Memory-Funktion gemeint, d.h. Bei einmaligem Tasten wird die Funktion eingeschaltet, bei nochmaligem Tasten wieder ausgeschaltet.
Für das Rückfahr bzw. Bremslicht muss der Kanal des Fahrtreglers so ausgewertet werden, dass die Beleuchtung zu den Aktionen des Reglers passt. Mein Regler bremst, falls vorher der Knüppel auf "Vorwärtsfahrt" stand, erst bei nochmaligem "Knüppel zurück" wird der Motor umgepolt. Also durchaus eine per Software nachzuvollziehende Angelegenheit.

Um dies alles zu realisieren, ist es einfacher, einen Mikrocontroller zu verwenden, als alles aus verschiedensten Logik-Bausteinen aufzubauen. Die Platine wird am Ende wesentlich kleiner weil einfach weniger Bauteile da sind und Änderungen durch Neuprogrammierung des Controllers sehr schnell und einfach ohne Hardwareänderung möglich sind.
Ich habe mich hier ersteinmal für einen Controller von Atmel entschieden, den ATTiny2313, denn mit genau diesem Controllertyp habe ich bei einem Praktikum im Rahmen meines Studiums erste Erfahrungen sammeln können. Auch sind für diese Controller mittlerweile günstig Programmiergeräte verfügbar, die auch per USB laufen. Wichtig wenn man wie ich keine serielle oder parallele Schnittstelle am Rechner mehr hat.
Ich habe so ein Gerät bei Conrad bestellt, es handelt sich um den ISP(In-System-Programming)-Programmer mySmartUSB. Dieser ist fertig aufgebaut, da es sich um eine mit doch sehr kleinen SMD-Teilen bestückte Platine handelt. Da hätte man beim Löten einen Nervenzusammenbruch erlitten. Dazu passend habe ich mir den myMultiProg USB bestellt, auf den der mySmartUSB aufgesteckt wird. Es handelt sich bei dieser Platine hauptsächlich um eine mit DIL-Fassungen und einem Taktgenerator bestückte Solche, sodass man den µC auch außerhalb der Schaltung(also vor dem Einbau in die Selbe) programmieren kann. Das spart wiederum Platz auf der späteren Platine, da man dann dort keinen ISP-Stecker unterbringen muss. Außerdem sind mit dem so geschaffenen Gerät die verschiedensten AVRs programmierbar, sodass man später nicht auf den ATTiny2313 beschränkt bleibt. Den MyMultiProgUSB gab es auch als Bausatz, dieser war schnell fertig gestellt. Wer kein Standard-USB(A/B) Kabel vorrätig hat, sollte dies auch mitbestellen. Der ganze Apparat sieht nun so aus:



Auf dem Bild steckt schon der erste ATTiny2313 in seiner Programmierfassung. Erste Gedanken zum Programm und der Außenbeschaltung sind auch bereits gemacht, ich werde sie bald hier niederschreiben.

22.08.08

Nach einigen Startschwierigkeiten mit der Software und Neuanschaffung eines vernünftigen Steckbretts ist der erste Test einer Schaltung mit selbst programmiertem AVR erfolgreich verlaufen. Ich verwende den C-Compiler CodeVision AVR, von dem es eine Testversion zum kostenlosen Download gibt. Leider lies sich dieses Programm unter Windows Vista 64 Bit nicht zum laufen überreden. Also habe ich mein Laptop aktiviert, darauf ist noch Windows XP 32 Bit installiert. Die Software ist im Vergleich zu dem mir bisher noch nicht bekannten AVR-GCC Compiler sehr einfach zu bedienen. Außerdem kann sie auch direkt den Chip programmieren. Es ist hierbei wichtig, den richtigen Controller, den richtigen Takt und das richtige Programmiergerät auszuwählen. Der MySmartUSb ist AVR910-kompatibel, also habe ich diesen ausgewählt. Die Taktfrequenz habe ich ersteinmal mit 4 Mhz gewählt. Für den ersten Test habe ich ein einfaches Programm geschrieben, dass einfach alle Pins des PORTB blinken lässt. Das sieht dann so aus:



Zuerst werden alle notwendigen Header eingebunden. Die Datei tiny2313.h enthält passend zum Controller z.B. die Definitionen der entsprechenden Register. stdio.h steht für Standard Input Output und wird bei mir pro forma in jedes C-Programm eingebunden ;-).
delay.h wird für die Verzögerungsfunktionen benötigt, damit die Pins nicht zu schnell blinken. Diese Funktion ist eigentlich eine unschöne Methode, weil der Controller in der Zeit des Abwartens nichts anderes machen kann und blockiert ist. Da es sich jedoch hier um ein erstes schnelles Testprogramm handelt, habe ich das mal so hingenommen. In der Praxis würde man wohl eher den eingebauten Timer nutzen.
In der Hauptfunktion main() wird zuerst die Variable DDRB auf den Wert 0b11111111 gesetzt. Das 0b legt fest, dass der Wert binär angegeben wird. Alle 8 Bits auf 1 entsprechen einem dezimalen Wert von 255. Binär dargestellt kann man jedoch jedes einzelne Bit sofort erkennen, was in diesem Fall praktischer ist. bei DDRB handelt es sich um das so genannte Data Direction Register für Port B. Port B besteht aus 8 Pins am realen Chip. Das Data Direction Register legt nun fest, welche Pins davon Eingänge und welche Ausgänge sind. Eine 1 entspricht einem Ausgang, eine 0 ist ein Eingang. Da für dieses Programm nur Ausgänge gebraucht werden, setzen wir also mit dieser Zeile alle Pins auf Ausgang.
Danach folgt die Hauptschleife. Sie läuft endlos. Innerhalb der Schleife werden alle Pins von Port B im Abstand von einer halben Sekunde abwechselnd ein- und ausgeschaltet. Auf die Pins greift man über das Register PORTB zu. Auch hierfür ist in tiny2313.h eine Variable definiert. Die Bits des Registers entsprechen genau wieder den Pins am realen Chip. Setzt man ein Bit auf 1, führt der entsprechende Pin am Chip Spannung. Setzt man es auf 0, ist er spannungslos.
Die Funktion delay_ms(int n) hält den Controller für n Millisekunden an, also in diesem Fall für eine halbe Sekunde. Das war auch schon alles.

Um das ganze auf Funktion zu überprüfen, lädt man das Programm auf den Chip. Dann braucht man natürlich noch eine Testschaltung, in die der Controller eingesetzt wird. Diese sieht bei mir so aus:



Ich habe hier zum Testen einfach mal wahllos 2 Ausgänge mit LEDs bestückt. Zu erwähnen wäre noch der externe Taktgenerator, bestehend aus einem Quarz und 2 Kondensatoren. Ansonsten dürfte alles klar sein. Die Werte für die Bauteile sind wie folgt:
G14x1,5V-Batterie
C122pF
C222pF
Q14,000Mhz
R11k
R21k
Aufgebaut auf einem Steckbrett sieht das dann ungefähr so aus:



Und das Beste ist: Es funktioniert!

22.08.08

Der nächste Schritt ist getan. Es ist mir gelungen, ein Empfängersignal auszuwerten und in Abhängikeit davon 2 LEDs zu schalten. Der Testaufbau auf dem Steckbrett sieht so aus:



Wie man sieht, ist kein Quarz mehr vorhanden. Ich habe die Fusebits des AVR auf 8Mhz internen Takt eingestellt, die Genauigkeit reicht für diese Anwendung aus. Zum Testen habe ich einen uralten Empfänger verwendet, dessen Anschlüsse mangels passender Stecker direkt mit einem Servokabel herausgeführt sind. Die Diode ist ein Verpolschutz für den AVR und senkt außerdem die Spannung für den AVR um 0,7V. Damit kann man den AVR dann auch mit 6V(4 normale Batterien) betreiben. Die LEDs mit Vorwiderständen sind an PORTD Bit 0 und 1 angeschlossen. Das Empfängersignal liegt an PORTB Bit 0.
Das zugehörige Programm sieht so aus:



Das Programm misst die Impulsdauer an PORTB Bit 0 und schaltet in Abhängigkeit davon die LEDs. Dazu wird der 8 bit Timer 0 des ATtiny2313 verwendet. Ach ja, mittlerweile läuft bei mir der AVR-GCC auch unter Windows Vista 64bit. Dazu war ein inoffizieller Patch notwendig. Manches gestaltet sich jetzt einfacher, da sehr viele leute AVR-GCC verwenden und auch die meisten Beispiele und Anleitungen im Internet hierfür geschrieben sind.
Den erwähnten Patch findet man hier: http://www.madwizard.org/electronics/articles/winavrvista

24.08.08

Hiermit erkläre ich die Software-Programmierung für das Lichtmodul vorerst für erfolgreich und beendet!
Der nächste Schritt wird sein, die Schaltung vom Steckbrett auf eine Lochraster bzw. Streifenplatine zu umzusetzen und ein paar Runden damit zu fahren. Wenn das dann keine Wünsche mehr offen lässt, baue ich das ganze auf eine "echte" Platine, evtl. in SMD, um Platz zu sparen. Das Programm ist mittlerweile recht komplex geworden (fertig kompiliert 1792 Bytes groß, 87,5% des Programmspeichers des ATtiny2313!), aber wer schonmal programmiert hat, der wird wohl dahinter kommen, wie es funktioniert. Ich spare mir an dieser Stelle seitenlange langweilige Erklärungen oder Screenshots vom Programm, und stelle es stattdessen als Download bereit(Ende der Seite).

Die Test-Schaltung ist auch ein bischen gewachsen:



Hier sind die Ausgänge alle einfach mit kleinen Low-Current-LEDs beschaltet. Auf dem richtigen Modul wird es ein Treiber-IC ULN2003 geben, damit auch mehrere ultrahelle LEDs angeschlossen werden können. Auch die Hupe ist im Moment noch eine LED. Auch neu ist der Taster. Das Modul ist in der Lage, auch mit Trimmungen außerhalb der Neutralposition klarzukommen. Dazu müssen die Neutralstellungen aller Knüppel bzw. Schalter einmal abgespeichert werden. Die Vorgehensweise ist wie folgt: Erst den Sender einschalten, dann den Programmiertaster drücken, dann den Empfänger einschalten. Die rote Programmier-LED fängt nun langsam zu blinken an. Währenddessen speichert der Controller die Neutralpositionen der Knüppel ab. Dann blinkt die LED 3x schnell und das Modul ist betriebsbereit. Diese Prozedur muss man nur einmal durchführen, oder wenn man z.b. den Lenk-Kanal stark neu getrimmt hat. Drückt man den Taster beim Einschalten nicht, blinkt die LED nur 3x schnell und das Modul ist dann sofort betriebsbereit. Wurde während des Setups an dem Kanal für das Licht kein Signal erkannt, ist das Fahrlicht dauerhaft eingeschaltet. Die Eingänge habe ich noch mit Pulldown-Widerständen versehen, damit kein Mist geschieht, falls mal ein Kanal nicht angeschlossen ist.

2.11.08

Projekt abgeschlossen!
Ich habe den Schritt mit der Lochrasterplatine übergangen ;-)
Die Platine habe ich für "normale", also bedrahtete Bauteile, in Eagle entworfen. Dann habe ich die Datei zu www.platinenbelichter.de geschickt und für wirklich wenig Geld zwei Top-Platinen erhalten! Kann ich nur weiterempfehlen. Für das Geld lohnt es sich wirklich nicht, die Brühe selbst anzurühren. Von der Bohrerei, die ohne Bohrständer gar nicht klappen will, mal abgesehen.
Hier mal der Entwurf, daneben die gelieferte Platine:



Wer genau hinsieht, bemerkt vielleicht, dass sich auf der Platine ein von mir zu dem Zeitpunkt nicht bemerkter Kurzschluss aufhält... Diesen habe ich aber Gott sei Dank vor dem Löten noch gesehen und mit einem Cuttermesser beseitigt. Das aktuelle Platinendesign enthält den Fehler nicht mehr.

Dann ging es auch relativ schnell, und das erste Modul war bestückt:



Es funktionierte schon ganz gut, allerdings waren noch ein paar Software-Änderungen nötig. So wurde auf allen Funktionen eine Schalthysterese eingebaut, die das Flackern an der Grenzposition verhindert. Auch die Nullzonen waren teilweise viel zu groß. Im Zuge dieser Anpassungen habe ich die Auflösung vergrößert(Timer schneller gemacht), und einige Konstanten eingeführt. Hysteresen und Nullzonen können nun bequem am Anfang der Datei eingestellt werden.
Das Modul ist mit dieser Software jetzt im Modell-BMW meines Vaters eingebaut und bereitet viel Freude. Besonders in der Dämmerung ist es die Show. Ausgestattet ist das Fahrzeug mit ultrahellen LEDs:
  • 2 St. warm-weiß für Abblend/Fahrlicht
  • 2 St. warm-weiß für Fernlicht/Lichthupe
  • 4 St. gelb für die Blinker
  • 2 St. rot für die Rücklichter
  • 2 St. rot für die Bremslichter
  • 8 St. SMD-LEDs rot für die 3. Bremsleuchte
  • 2 St. weiß für die Rückfahrlichter
  • 2 St. SMD-LEDs weiß für die Kennzeichenbeleuchtung
Ein echter Hingucker, der leider im dunkeln schwierig zu fotografieren, geschweige denn zu filmen ist...
Im Nachhinein muss ich sagen, die Aktion hat sich gelohnt!

Downloads:

Programm und Makefile:
Eagle Projekt mit Schaltplan und Platinenlayout: