MikroKopter

Light-CTRL, was ist das...

Die Light-CTRL ist eine Licht oder auch Lastschaltung, basierend auf der Bl-CTRL.

... und warum eigentlich?

Das Problem bestand darin, dass zum einen die LED-Beleuchtung über J16/J17 der FL-CTRL steuerbar sein sollte und zudem die teilweise blinken oder besser doppelt blitzen sollte. Die erste Überlegung war, die LED-Beleuchtung über eine Transistorschaltung zu realisieren und den Blitzer über eine Reihenschaltung von NE555-Timern zu realisieren. Jedoch stößt man aufgrund der Abmessungen auf einer Lochrasterplatine schnell an seine Grenzen. Auch die Einstellung der Zeit über Potentiometer ist nicht sauber realisierbar.

Viel einfacher kann eine solche Schaltung mit einem Mikrokontroller wie dem ATMEGA8 aufgebaut werden. Die BL-CTRL-Platine eignet sich aufgrund der vorgesehenen FETs auch wunderbar dazu.

Umbau der bestehenden BL-Ctrl

Auf einer Fertig bestückten BL-CTRl müssen die FETs IRFR 5305 und deren Ansteuerung entfernt werden. Die FETs IRFR1205 und die Transistoren BC817-16SMD können als Schalter verwendet werden. Die Widerstände R7,R12,R13,R20,R21,R22,R1,R4,R18,R10,R14, sowie die Kondensatoren C1,C2, C4 und C17 müssen entfernt werden. Anbei hier auch ein abgeänderter Schaltplan des BL-CTRL:

http://gallery.mikrokopter.de/main.php/v/tech/Light-CTRL_Schaltplan.JPG.html http://gallery.mikrokopter.de/main.php/v/tech/bild+087.jpg.html http://gallery.mikrokopter.de/main.php/v/tech/bild+091.jpg.html

FETs und Transistoren der Bl-Ctrl als Schalter nutzen

Die Transistoren und FETs, die bereits mit dem Emitter, bzw. Source an Masse liegen können relativ leicht als Masseschalter verwendet werden. z.B. können direkt über die 12V Versorgungsspannung und einen FET, LED-Leisten angesteuert werden. /!\ Bei den SMD-Transistoren muss man die Leistung beachten!

Eingänge mit J16/J17 (FL-Ctrl) schalten

Bei einem Mikrokontroller lassen sich die Ports auch als Eingänge deklarieren. Die Ports PC0..PC2 bieten sich dabei an, denn diese wurden für die Motorenbemessung bereits auf Lötflächen herausgeführt. Durch die Einbindung eines Softwaremäßigen Pull-Up-Widerstands entfällt dieser Hardwareseitig. Dadurch kann z.B. J16/J17 der FL-CTRL direkt mit dem Eingang, z.B. PC2 des Light-CTRL verbunden werden.

Programmierung

Programmieren WinAVR

/!\ Hier gibt es noch was zu tun...

Der Programmcode

Zu Beginn des Programms wird mit den Präprozessordirektiven gestartet. Hier werden die Unterprogramme und wichtige Parameter, wie z.B. die Prozessorgeschwindigkeit angegeben.

// Einstellen des Systemtakts des µC auf 1Mhz.
// UL gibt an, dass es ein unsigned-Long Datentyp ist.
#define F_CPU 1000000UL                

// Erstellt eine Instanz des Prozessabbilds der Eingänge. Soll heißen,
// dass die Zustände der Eingänge ständig in die Variable WP übergeben werden.                                       
#define WP PINC

// Einbinden zusätzlicher Bibliotheken oder Unterprogramme. Z.B. die Funktionen
// der Ein- und Ausgabe des ATMEL.
#include <avr/io.h>
#include <util/delay.h>

Im Hauptprogramm (main) werden zunächst die Parameter für die einzelnen Ports und Pins definiert. Pin C2 (BL-CTRL auch NULL_C genannt) wird als Eingang verwendet:

int main(void)
{
        // Variablendeklaration für Zeitschleifen
        uint8_t j;

        // Port C "pauschal" als Eingänge festlegen     
        DDRC =0x00; 
                   
        // Pullup für PC2 aktivieren. Damit entfällt der Aufbau
        // eines Pull-Up Widerstandes für die Eingangsbeschaltung
        PORTC |= (1 << PC2); 
       
        // Pin D3,D4,D5 und D7 als Ausgänge festlegen   
        DDRD |= (1 << PD3)|(1 << PD4)|(1 << PD5)|(1 << PD7);

Das eigentliche Programm liest nun den Port C aus und führt bei einer logischen "0" an Pin C2 das Blink-Programm aus. Damit dies immer wieder passiert wird es in einer endlosen While-Schleife verpackt.

    // Unendlich lang wiederholen
    while(1) 
    {
                // UND-Verknüpfung => Wenn PC2 auf LOW ist, dann...
                if (!(WP & (1<<PC2)))
                {

Setzen und Rücksetzen der LEDs bzw. der Transistoren. Durch das nicht zurücksetzen von PD3 hat dieser PIN während dem Durchlauf der While-Schleife immer 1 Signal:

                        // Alle Pins an Port D aktivieren
                        // Pin D |7|6|5|4|3|2|1|0
                        // Binär:|1|1|1|1|1|1|1|1 (b) => #FF (h)
                        PORTD = 0xFF;

                        // Mehrmaliger Durchlauf der Zeitschleife, um die 
                        // Delay-Zeit zu verlängern.
                        FOR (j=0; j<10; j++)
                        {
                                _delay_ms(50);
                        }

                        //Alle Pins an Port D, außer PD5 deaktivieren
                        // Pin D |7|6|5|4|3|2|1|0
                        // Binär:|0|0|0|0|1|0|0|0 (b) => #08 (h)        
                        PORTD = 0x08; 


                        // Mehrmaliger Durchlauf der Zeitschleife, um die 
                        // Delay-Zeit zu verlängern.
                        for (j=0; j<10; j++)
                        {
                                _delay_ms(100);
                        }

Wenn der Eingang ausgeschaltet bzw. über den Pullup wieder High-Signal (1) anliegt sollen die Leuchten alle ausgehen. Dazu wird die Else-Funktion der Schleife genutzt:

                else
                PORTD = 0x00; // PD0 deaktivieren

Zusammengesetzt, und ohne Kommentare sieht das ganze so aus:

#define F_CPU 1000000UL
#define WP PINC
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
    uint8_t j;
    DDRC =0x00; 
    PORTC |= (1 << PC2); 
    DDRD |= (1 << PD7)|(1 << PD3)|(1 << PD4)|(1 << PD5);
    while(1)
    {
                if (!(WP & (1<<PC2)))
                {
                        PORTD = 0xFF; 
                        for (j=0; j<10; j++)
                        {
                                _delay_ms(50);
                        }               
                        PORTD = 0x08; 
                        for (j=0; j<10; j++)
                        {
                                _delay_ms(100);
                        }
                        PORTD = 0xFF; 
                        for (j=0; j<10; j++)
                        {
                                _delay_ms(50);
                        }
                        PORTD = 0x08; 
                        for (j=0; j<100; j++)
                        {
                                _delay_ms(100);
                        }
                }
                else
                PORTD = 0x00; // PD0 deaktivieren
    }
} 

Diese Schaltung bewirkt ein Dauerleuchten auf PD3 und einen Doppelblitz auf PD4 und PD5, wenn der Eingang PC2 auf LOW (0)-Signal gesetzt wurde. Nachteil ist, dass die LEDs erst erlöschen, wenn die Zeitschleife komplett durchlaufen wurde. Das kann mit der letzten Schleife ca. 1 Sekunde dauern, bis die LED ausgeht, nachdem abgeschaltet wurde.

Video

So sieht das ganze dann fertig aus:

/!\ Weitere Infos folgen...


MikroKopter: light-ctrl (zuletzt geändert am 28.04.2010 22:56 durch anonym)