Hallo,
ich habe eine RC Auto mit einer 3 Kanal Fernbedinung. 2 Kanäle sind für Gas/Bremse sowie Lenkung belegt. Der 3te Kanal ist frei und soll meine Beleuchtung steuern.
In meinem Projekt habe ich die RC-EmpfängerKanäle ausgewertet (Pulsein) und damit die Autobeleuchtung angesteuert. Es ist kein Eingriff in die FB nötig.
Kanal 3: Steuerknüppel OBEN ist die eine Funktion (tast&rast) und Knüppel UNTEN die andere(tast&rast).
Außerdem sind die Bremsleuchten beim fahren gedimmt(PWM) und im Stand auf volle Helligkeit. Beim start des µC wird die Nullstellung der Knüppel gespeichert.
Alle Einstellungen sind im EEProm(M88) gespeichert und können über RS232 geändert werden.
Video unter: http://youtu.be/Zc1vbOMbclw
Weitere Info´s im Programmcode.
Code:'------------------------------------------------------------------------------- ' Modellbauschalter -05/2012- 2Kanal mit ATMega 88 ' Programmiert für Savage Flux '------------------------------------------------------------------------------- 'Anmerkungen: ' - INPUT wartet bis eine Eingabe empfangen wurde - das Programm steht solange!!! ' - INPUT wartet auf den Befehl "CR" am Ende - sonst wird die Eingabe nicht erkannt 'Beschreibung: '2 RC Empfängerkanäle werden abgefragt 'Beim einschalten muss die FB in Nullstellung sein, da diese Position beim einschalten als Neutral gespeichert wird. 'Kanal 2: ist Gas/Bremse und schaltet das Bremslicht 'Knüppel in Mittelstellung = LED´s volle Helligkeit 'Knüppel vor/zurück = LED´s gedimmt über Hardware PWM 'Kanal 3: war noch frei und schaltet nun Abblendlicht bzw. Fernlicht 'über PWM als Tast- und Rastfunktion bei Knüppel UNTEN 'Knüppel OBEN hat auch Tast- und Rastfunktion und schaltet 2 LED´s 'die wie bei einem Polizeiauto an der Fron in der Mitte als Doppelblitz 'blitzen(2xlinks...2xrechts...2xlinks...). 'Das Hi-Signal vom Empfänger wird mit "Pulsein" ermittelt! 'Knüppelstellung Mitte hat ca. 159 Zeiteinheiten bei einem 20 MHz Quarz! 'An den Ausgängen für die LED´s sind Transistoren (BD677) die nach Masse schalten. 'Nicht angeschlossene Kanäle müssen auf einen angeschlossenen Kanal gebrückt 'werden - wenn kein Signal kommt wartet das Programm, bis ein ERROR nach ca.650ms kommt! 'LED´s: 'Abblendlicht - PWM - Compare1A 'Bremslicht - PWM - Compare1B 'Fernlicht_Links ohne PWM 'Fernlicht_Rechts ohne PWM 'Menü über RS232: 'Programm HTerm: 19200 Baud; Neue Zeile bei CR+LF; Zeichen senden als "ASC" und mit Enter CR+LF abschließen!!! 'man hat nur knapp 3 sekunden um mit "1" in das Menü zu gelangen - also vielleicht die 1 schon vorher drücken und dann bei Start nur noch Enter drücken 'EEPROM: 'einige Werte werden aus dem EEProm ausgelesen - wenn das EEProm leer ist funktioniert es nicht ;-) 'siehe bei Programmstart: Start-Werte setzen / aus EEPROM übernehmen '------------------------------------------------------------------------------- 'Konfiguration µC: $regfile = "m88def.dat" 'Deklarationen $crystal = 20000000 'interner Quarz 8MHz $baud = 19200 'Baudrate der UART: 9600 Baud '------------------------------------------------------------------------------- 'Ein- Ausgänge: Ddrb = &B11111111 '1 Ausgang, 0 Eingang = alles Ausgänge Ddrc = &B0000000 '1 Ausgang, 0 Eingang = alles Eingänge Ddrd = &B11111111 '1 Ausgang, 0 Eingang = alles Ausgänge '------------------------------------------------------------------------------- 'Konfiguration Timer: 'Timer0 = 8 Bit Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 64 On Timer0 Isr_von_timer0 Enable Timer0 '------------------------------------------------------------------------------ 'Variablen auswertung FB Dim Pulsbreite2 As Word 'Knüppelstellung Knüppel Kanal 2 ' Dim K2null As Word 'Nullstellung Kanal 2 Dim K2null2 As Word 'hilfsNullstellung Kanal 2 Dim K2hys As Byte 'Hyterese Dim K2hys_eeprom As Eram Byte Dim Pulsbreite3 As Word Dim K3null As Word 'Nullstellung Kanal 3 Dim K3null2 As Word 'hilfsNullstellung Kanal 3 Dim K3hys As Byte 'Hyterese Dim K3hys_eeprom As Eram Byte Dim K3oz As Word 'Zähler für Kanal 3 wenn OBEN betätigt / Auswertung lange drücken Dim K3uz As Word 'Zähler für Kanal 3 wenn UNTEN betätigt / Auswertung lange drücken Dim K3o_rast As Bit 'Rastfunktion OBEN Dim K3u_rast As Bit 'Rastfunktion UNTEN Dim K3sperre As Bit '1 = gesperrt 'PWM Dim Bremse As Byte 'Bremslicht Dim Bremsedimm As Byte 'dimm wert für Bremslicht Dim Bremsedimm_eeprom As Eram Byte 'dimm wert für Bremslicht aus EEPROM Dim Ab_licht As Byte 'Abblendlicht Dim Ab_lichtdimm As Byte 'dimm wert für Abblendlicht Dim Ab_lichtdimm_eeprom As Eram Byte 'dimm wert für Abblendlicht aus EEPROM Dim Blitzlicht As Bit 'Fernlicht links / rechts Dim Fl As Bit 'Impuls für Blitz Dim Fl_zaehler As Byte Dim Fl_auswahl As Byte 'auswahl der Lampe links / rechts / aus Dim Warten As Byte 'Wartezeit / dauer für Tastendrück lang Dim Warten_eeprom As Eram Byte 'Wartezeit / dauer für Tastendrück lang aus EEPROM Dim RS232 As Byte 'für seriellen Input Dim Rs232_z As Word 'Zähler Wartezeit für serielle Eingabe Dim Udr_in As Word 'um UDR auszulesen, zu löschen Dim Info As Byte '1=Ausgabe von Info´s Dim Info_eeprom As Eram Byte Dim Info_m As Byte 'merker damit Info nicht in jeder Do...Loop ausgegeben wird Dim Info_z As Byte 'welches Infomenue angezeigt werden soll Dim Info_z_eeprom As Eram Byte 'welches Infomenue angezeigt werden soll Dim Startmerker As Bit 'wird einmal beim Start ausgeführt Dim Cpu As Byte 'Auslastung verteilen '------------------------------------------------------------------------------ 'ALIAS Fl_l Alias Portd.7 'Fernlicht LINKS Fl_r Alias Portb.0 'Fernlicht RECHTS '------------------------------------------------------------------------------- Waitms 250 'Störungen vom einschalten abwarten z.b. Prellen... Enable Interrupts 'interrupts einschalten '------------------------------------------------------------------------------ ' Start-Werte setzen / aus EEPROM übernehmen Info = Info_eeprom 'Info´s ausgeben 1=JA Info_z = Info_z_eeprom 'welche Infos ausgeben Bremsedimm = Bremsedimm_eeprom 'Wert für gedimmtes Licht Bremse aus EEPROM laden Ab_lichtdimm = Ab_lichtdimm_eeprom 'Wert für gedimmtes Licht Abblendlicht aus EEPROM laden Bremse = 255 'Bremslicht 100% einschalten Ab_licht = Ab_lichtdimm 'Abblendlicht auf gedimmten Wert einstellen Fl_l = 0 'Fernlicht links aus Fl_r = 0 'Fernlicht rechts aus Warten = Warten_eeprom 'Wartezeit aus EEPROM laden K2hys = K2hys_eeprom 'Hysterese für aktuellen Nullwert K2 K3hys = K3hys_eeprom 'Hysterese für aktuellen Nullwert K3 Pulsein K2null , Pinc , 5 , 1 'aktuelle Nullstellung erfassen K2null2 = K2null - K2hys 'mit Hysterese umrechnen K2null = K2null + K2hys 'mit Hysterese umrechnen Pulsein K3null , Pinc , 4 , 1 'Nullstellung erfassen 'K3null = 159 'fester Wert da Schalter nicht zwingend in Mittelstellung... K3null2 = K3null - K3hys 'mit Hysterese umrechnen K3null = K3null + K3hys 'mit Hysterese umrechnen Print " " Print "Modelbauschalter V2 Version: " Print Version(1) Print "Baudrate: 19200" Print "_____________________________" Print " " Rs232_z = 100 'Wartezeit auf Menüeingabe Do Decr Rs232_z 'Variable zum Do...Loop verlassen runterzählen Print Rs232_z ; " - Druecke die (1) fuer das Menue: " 'Variable anzeigen RS232 = Inkey() 'Warten auf eingabe If RS232 = 49 Then 'wenn Eingabe = 1 (ASC = 49) Print "Menü wird gestartet" Print "" Udr_in = Udr 'Puffer auslesen b.z.w. leeren Goto Menue 'und ins Menü springen End If Loop Until Rs232_z = 0 Anfang: Print "" Print "" Print "===================================================================" Print "Anfang - Programm laueft - das Menue wurde beendet" '------------------------------------------------------------------------------- ' HAUPTPROGRAMM '------------------------------------------------------------------------------- Enable Interrupts '===================================================================================================================================== '===================================================================================================================================== '===================================================================================================================================== '===================================================================================================================================== '===================================================================================================================================== Do 'Do Loop Schleife Ocr0a = Bremse 'Übergabe der Werte in die PWM Ausgabe Ocr0b = Ab_licht 'FB auswerten: '_______________________________________________________________________________ 'Kanal 2 auswerten (Gas/Bremse): '_______________________________________________________________________________ Pulsein Pulsbreite2 , Pinc , 5 , 1 'Pulsbreite auslesen (1=High Impuls) 'Knüppel Gas / Bremslicht If Pulsbreite2 < K2null And Pulsbreite2 > K2null2 Then 'wenn Knüppel in Mittelstellung dann Bremse = 255 'volle helligkeit Else 'sonst Bremse = Bremsedimm 'gedimmt End If '_______________________________________________________________________________ 'Kanal 3 auswerten (Abblendlicht/Fernlicht): '_______________________________________________________________________________ Pulsein Pulsbreite3 , Pinc , 4 , 1 'Pulsbreite auslesen (1=High Impuls) 'Knüppel UNTEN If Pulsbreite3 > K3null Then 'wenn Knüppel unten dann Incr K3uz 'Variable hochzählen End If 'Knüppel MITTE If Pulsbreite3 < K3null And Pulsbreite3 > K3null2 Then 'wenn Knüppel in Mittelstellung dann K3oz = 0 'falls der Zählerstand zum schalten nicht erreicht wird, wird hier auf 0 gesetzt K3uz = 0 'falls der Zählerstand zum schalten nicht erreicht wird, wird hier auf 0 gesetzt K3sperre = 0 'Sperre frei (für Rastfunktion) End If 'Knüppel OBEN If Pulsbreite3 < K3null2 Then 'wenn Knüppel oben dann Incr K3oz 'Variable hochzählen End If '_______________________________________________________________________________ 'Blitzlicht: If K3oz = 0 And K3o_rast = 0 Then 'wenn Knüppel in Mittelposition und rasten aus dann Blitzlicht = 0 'Blitzlicht ausschalten Fl_auswahl = 0 'Zähler für Fehrnlicht auf 0 Fl_l = 0 'Fernlicht links aus Fl_r = 0 'Fernlicht rechts aus End If 'Blitzlicht_tast: If K3oz > 0 Then 'wenn Knüppel oben dann Blitzlicht = 1 'Blitzlicht einschalten If K3o_rast = 1 And K3sperre = 0 Then K3o_rast = 0 'wenn rasten aktiv und Sperre nicht aktiv dann rasten aus End If 'Blitzlicht_rast: If K3oz > Warten Then 'wenn Knüppel oben lange genug gehalten wurde dann K3sperre = 1 'K3 sperren K3o_rast = 1 'Rastfunktion aktiv K3oz = 0 'Zähler zurücksetzen End If If Blitzlicht = 1 Then Gosub Blitzlicht_routine '_______________________________________________________________________________ 'Fernlicht dimmen: If K3uz = 0 And K3u_rast = 0 Then 'wenn Knüppel in Mittelposition und rasten aus dann Ab_licht = Ab_lichtdimm 'gedimmte Helligkeit End If 'Fernlicht volle Helligkeit_tast: If K3uz > 0 Then 'wenn Knüppel unten dann Ab_licht = 255 'volle Helligkeit If K3u_rast = 1 And K3sperre = 0 Then K3u_rast = 0 'wenn rasten aktiv und Sperre nicht aktiv dann rasten aus End If 'Fernlicht volle Helligkeit_rast: If K3uz > Warten Then 'wenn Knüppel unten lange genug gehalten wurde dann K3sperre = 1 'K3 sperren K3u_rast = 1 'Rastfunktion aktiv K3uz = 0 'Zähler zurücksetzen End If '_______________________________________________________________________________ If Info = 1 And Fl = 1 And Info_m = 0 Then 'wenn info aktiv über Menüauswahl und Fl aktiv über Timer0Zähler und infoMerker aus dann Select Case Info_z 'Auswahl, welche Info angezeigt werden soll Case 1 : Gosub Info1 Case 2 : Gosub Info2 Case 3 : Gosub Info3 Case 4 : Gosub Info4 'Case 5 : Gosub Info5 'Case 6 : Gosub Info6 'Case 7 : Gosub Info7 'Case Else : Goto Menue_1 End Select Info_m = 4 'Merker setzen, damit nicht zu oft ausgegeben wird Else Decr Info_m 'Merker runterzählen End If 'Zähler auswerten If Fl_zaehler > 40 Then 'wird in Timer0 hochgezählt (eigendlich Hardware-PWM-Timer) wenn > 40 dann Fl_zaehler = 0 'zurücksetzen Toggle Fl 'Taktgeber - wird für Blitzlicht UND Printbefehle benötigt!!! 'Doppelblitz: If Fl_auswahl < 12 Then 'es werden 12 Schritte für den Doppelblitz benötigt Incr Fl_auswahl 'Fernlicht Auswahl hochzählen Else 'sonst Fl_auswahl = 1 'zurücksetzen Fl = 1 'auf 1 setzen damit syncron End If End If Loop '===================================================================================================================================== '===================================================================================================================================== '===================================================================================================================================== '===================================================================================================================================== '===================================================================================================================================== '_________________ Isr_von_timer0: 'ISR von Timer0 Incr Fl_zaehler Return '___________________ Blitzlicht_routine: If Fl = 1 And Fl_auswahl < 4 Then '0-4 ist für Fernlicht links - siehe Tabelle ganz unten Fl_l = 1 'Fernlicht links AN Else 'sonst Fl_l = 0 'Fernlicht links AUS End If If Fl = 1 And Fl_auswahl > 6 And Fl_auswahl < 10 Then '6-10 ist für Fernlicht rechts - siehe Tabelle ganz unten Fl_r = 1 'Fernlicht rechts AN Else 'sonst Fl_r = 0 'Fernlicht rechts AUS End If Return Info1: Print "Gas / K2: " ; Pulsbreite2 Print "Bremse: " ; Bremse Print "K2null: " ; K2null Print "K2null2: " ; K2null2 Print "K2Hys: " ; K2hys Print "-------------------------------" Print "" Return Info2: Print "Kanal 3: " ; Pulsbreite3 Print "K3null: " ; K3null Print "K3null2: " ; K3null2 Print "K3Hys: " ; K3hys Print "K3uz: " ; K3uz Print "Warten: " ; Warten Print "K3u_rast: " ; K3u_rast Print "-------------------------------" Print "" Return Info3: Print "Kanal 3: " ; Pulsbreite3 Print "K3null: " ; K3null Print "K3null2: " ; K3null2 Print "K3Hys: " ; K3hys Print "K3oz: " ; K3oz ; " (muss > warten = Blitzlicht AN) " Print "Warten: " ; Warten Print "K3sperre: " ; K3sperre ; " (muss = 0)" Print "Blitzlicht: " ; Blitzlicht Print "-------------------------------" Print "" Return Info4: Print "Gas / K2: " ; Pulsbreite2 Print "K2null: " ; K2null Print "K2null2: " ; K2null2 Print "K2Hys: " ; K2hys Print "" Print "Kanal 3: " ; Pulsbreite3 Print "K3null: " ; K3null Print "K3null2: " ; K3null2 Print "K3Hys: " ; K3hys Print "-------------------------------" Print "" Return '_________________ Menue: Disable Interrupts Print "" Print "" Print "" Print "*******************************************************************" Print "*******************************************************************" Print "***** - - - MENUE - - - *****" Print "*******************************************************************" Print " - - - ACHTUNG: BITTE CR-LF 10/13 AKTIVIREN!!! - - - " Print "*******************************************************************" Print "*******************************************************************" Print "" Print "aktuelle Werte:" Print K2null ; " = K2null - erfasste Nullstellung" Print K3null ; " = K3null - erfasste Nullstellung" Print " " Print Bremsedimm ; " = Bremsedimm - Wert fuer gedimmtes Bremslicht(Empf.10)" Print Ab_lichtdimm ; " = Ab_lichtdimm - Wert fuer gedimmtes Abblendlicht(Empf.10)" Print Warten ; " = Warten - Wartezeit fuer Rastfunktion(Empfehlung.25)" Print " " ; K2hys ; " = Hysterese Kanal 2(Empfehlung.5)" Print " " ; K3hys ; " = Hysterese Kanal 3(Empfehlung.10)" Print " " Print " " Print "zum aendern (2) druecken... " Print "zum beenden (0) druecken... " Do Udr_in = Udr Input RS232 Noecho Select Case RS232 Case 2 : Goto Menue_1 Print "" Print "Auswahl >2< aendern" Case 0 : Goto Anfang Case Else : Goto Menue_1 End Select Loop Until RS232 = 0 Goto Anfang Menue_1: Print "" Print "===================================================================" Print "Welcher Wert soll geaendert werden?" Print " " Print "(1) " ; Bremsedimm ; " = Bremsedimm - Wert fuer gedimmtes Bremslicht(Empf.10)" Print "(2) " ; Ab_lichtdimm ; " = Ab_lichtdimm - Wert fuer gedimmtes Abblendlicht(Empf.10)" Print "(3) " ; Warten ; " = Warten - Wartezeit fuer Rastfunktion(Empfehlung.25)" Print "(4) " ; K2hys ; " = Hysterese Kanal 2(Empfehlung.5)" Print "(5) " ; K3hys ; " = Hysterese Kanal 3(Empfehlung.10)" Print "(7) " ; Info ; " = InfoAusgabe ein-/ ausschalten" Print "(8) " ; Info_z ; " = Info_z (Auswahl der InfoAusgabe von aktuellen Werten)" Print "(0) -- > beenden" Udr_in = Udr Input RS232 Noecho Select Case RS232 Case 1 : Goto Wert1 Case 2 : Goto Wert2 Case 3 : Goto Wert3 Case 4 : Goto Hys2 Case 5 : Goto Hys3 Case 7 : Goto Info_aus Case 8 : Goto Info_zz Case 0 : Goto Anfang Case Else : Goto Menue_1 End Select Return Wert1: Print "" Print "Auswahl >1<" Print "" Print "===================================================================" Print Bremsedimm ; " = Bremsedimm - Wert fuer gedimmtes Bremslicht" Print "bitte neuen Wert eingeben" Udr_in = Udr Input Bremsedimm Noecho Print "neuer Wert: " ; Bremsedimm Bremsedimm_eeprom = Bremsedimm Print " " Goto Menue_1 Return Wert2: Print "" Print "Auswahl >2<" Print "" Print "===================================================================" Print Ab_lichtdimm ; " = Ab_lichtdimm - Wert fuer gedimmtes Abblendlicht" Print "bitte neuen Wert eingeben" Udr_in = Udr Input Ab_lichtdimm Noecho Print "neuer Wert: " ; Ab_lichtdimm Ab_lichtdimm_eeprom = Ab_lichtdimm Print " " Goto Menue_1 Return Wert3: Print "" Print "Auswahl >3<" Print "" Print "===================================================================" Print Warten ; " = Warten - Wartezeit fuer Rastfunktion" Print "bitte neuen Wert eingeben" Udr_in = Udr Input Warten Noecho Print "neuer Wert: " ; Warten Warten_eeprom = Warten Print " " Goto Menue_1 Return Hys2: Print "" Print "Auswahl >4<" Print "" Print "===================================================================" Print K2hys ; " = Hysterese Kanal 2" Print "bitte neuen Wert eingeben" Udr_in = Udr Input K2hys Noecho Print "neuer Wert: " ; K2hys K2hys_eeprom = K2hys Print " " Goto Menue_1 Return Hys3: Print "" Print "Auswahl >5<" Print "" Print "===================================================================" Print K3hys ; " = Hysterese Kanal 3" Print "bitte neuen Wert eingeben" Udr_in = Udr Input K3hys Noecho Print "neuer Wert: " ; K3hys K3hys_eeprom = K3hys Print " " Goto Menue_1 Return Info_aus: Print "" Print "Auswahl >7<" Print "" Print "===================================================================" Print Info ; " = InfoAusgabe ein-/ausschlten - 1=ein" Print "bitte neuen Wert eingeben" Udr_in = Udr Input Info Noecho Print "neuer Wert: " ; Info Info_eeprom = Info Print " " Goto Menue_1 Return Info_zz: Print "" Print "Auswahl >8<" Print "" Print "===================================================================" Print "Info_z = " ; Info_z Print "(1) = Gas / Bremslicht" Print "(2) = K3 Fernlicht" Print "(3) = K3 Doppelblitz Front" Print "(4) = K2 & K3 aktuelle Werte" Print "(5) =" Print "bitte neuen Wert eingeben" Udr_in = Udr Input Info_z Noecho Info_z_eeprom = Info_z Print "neuer Wert: " ; Info_z Print " " Goto Menue_1 Return End '=============================================================================== 'Doppelblitz ansteuerung Fernlicht '=============================================================================== 'FL FL_AUSW links rechts '1 1 1 0 '0 2 0 0 '1 3 1 0 '0 4 0 0 '1 5 0 0 '0 6 0 0 '1 7 0 1 '0 8 0 0 '1 9 0 1 '0 10 0 0 '1 11 0 0 '0 12 0 0 '=============================================================================== 'Pinbelegung µC '=============================================================================== 'MEGA88: 'Pin = Funktion ' 1 = Reset 10k Widerstand auf +5V '2&3 = RS232 ' 9 = Quarz 20 MHz mit 33p Kondensator gegen Masse ' 10 = Quarz 20 MHz mit 33p Kondensator gegen Masse ' 11 = PWM Abblendlicht ' 12 = PWM Bremslicht ' 13 = Fernlicht links ' 14 = Fernlicht rechts ' 27 = RC Empfänger Kanal 2(Gas) ' 28 = RC Empfänger Kanal 3(war noch frei)
Lesezeichen