Microcontroller-Tutorial - RC5 RGB Fader (IR Fernbedienung)

  • Hallo LEDStyles Gemeinde,


    aufbauend auf diesen Beitrag folgt nun eine erste Anwendung.
    Ich wollte schon seit längerem diese Anwendung mal realisieren
    (musste mich aber erstmal mit Atmel µC und Bascom beschäftigen 8-[ ).
    Zuerst habe ich es mittels eines Atmel ATtiny2313 versucht - bis ich dann doch irgendwann merkte das es nicht so trivial war.
    Problem: die Funktion RC5 (Getrc5) benutzt den Timer0 und den INT0. Somit ist natürlich der Timer0 anderweitig beschäftigt und kann nicht mehr für PWM verwendet werden. Bleiben aber noch Anwendungen die mit 2 Farben und IR Fernbedienung realisiert werden sollen - das nur mal für den Hinterkopf.
    Ich habe mir dann den ATmega8 etwas näher angeschaut und siehe da:
    - 3x Timer
    - 3x PWM
    genau das richtige für diese Anwendung.


    Ein Eagle Schema habe ich erstmal nicht erstellt, aber im Quellcode habe ich mir mal eine, wie ich finde, recht gute Idee der Dokumentation abgeschaut :-% .


    Im Code ist noch ein LCD vorhanden - finde ich ganz praktisch.
    Auf dem Display zu erkennen ist der RC5 Code "Address", "Command" und die Werte der einzelnen PWM Register
    für die einzelnen Farben.


    Aufgabe:
    3 LED's (Rot, Blau, Grün) unabhängig voneinander mittels IR Universal Fernbedienung (RC5 fähig) und PWM hoch oder runter "faden". Voreingestellte Farben auf Knopfdruck einschalten.


    Benötigte Teile:
    - Atmel Atmega8 (Pollin)
    - Festspannungswandler - 5V - z.B. 7805 (Pollin)
    - Bauteile lt. Datenblatt für 78xx
    - IR Empfänger Diode TSOP 1136 (Pollin)
    - optional: LCD 16*2 Goldentek GC-1602G0 (Pollin)
    - Kondensator 4,7µF (lt. Datenblatt IR Diode)
    - Widerstand 100 Ohm (lt. Datenblatt IR Diode)
    - IR Universal Fernbedienung RC5 fähig
    - RGB LED's (in meinem Fall erstmal Superflux für einen Funktionstest)
    danach ein Test mit 0.5W 5mm LED's an 3xKSQ (100mA) LED-Tech
    - Bauteile für KSQ's


    KSQ's sind modifiziert und auf 100mA ausgelegt - für die 0.5Watt LED's.


    Bascom Quell Code:
    [code:1]'******************************************************************************
    '*
    '* Programm Titel rgb_ir_fader_ATmega8.bas
    '* Start Datum: 2007/07/06
    '* Letzte Änderung: 2007/07/08
    '* Compiler: BASCOM-AVR v1.11.8.3
    '* Processor: Atmel ATmega8
    '* Programm Funktion: RGB Fader mittels IR RC5 Fernbedienung
    '* mittels RC5 Fernbedienung RGB hoch und runter faden
    '* Vorbelegte Farben mittels FB einschalten
    '*
    '*
    '******************************************************************************
    '*
    '* by amron für LEDStyles Community
    '*
    '* Komponenten: ATmega8,
    '* TSOP 1136 IR Empfangsdiode
    '* IR Universal Fernbedienung RC5 fähig (Medion)
    '* 5V Festspannungswandler 78xx
    '* (optional LCD Goldentek 16*2)
    '* RGB LED's (in meinem Fall erstmal Superflux für einen Funktionstest)
    '* danach ein Test mit 0.5W 5mm LED's an 3xKSQ (100mA)
    '*
    '* ------ -------
    '* | |
    '* ISP (Reset) PC6 --| 1 28 |-- PC5 (ADC5/SCL)
    '* | |
    '* (RXD) PD0 --| 2 27 |-- PC4 (ADC4/SDA)
    '* | |
    '* (TXD) PD1 --| 3 26 |-- PC3 (ADC3)
    '* | |
    '* TSOP1136 (INT0) PD2 --| 4 25 |-- PC2 (ADC2)
    '* | |
    '* LCD E (INT1) PD3 --| 5 24 |-- PC1 (ADC1)
    '* | |
    '* LCD RS (XCK/TO) PD4 --| 6 23 |-- PC0 (ADC0)
    '* | |
    '* +5V VDC (78xx) VCC --| 7 22 |-- GND
    '* | |
    '* ISP/Ground GND --| 8 21 |-- AREF
    '* | |
    '* (XTAL1/TOSC1) PB6 --| 9 20 |-- AVCC
    '* | |
    '* (XTAL2/TOSC2) PB7 --| 10 19 |-- PB5 (SCK) ISP
    '* | |
    '* LCD D4 (T1) PD5 --| 11 18 |-- PB4 (MISO) ISP
    '* | |
    '* LCD D5 (AIN0) PD6 --| 12 17 |-- PB3 (MOSI/OC2) PWM Rot/ISP
    '* | |
    '* LCD D6 (AIN1) PD7 --| 13 16 |-- PB2 (SS/OC1B) PWM Grün
    '* | |
    '* LCD D7 (ICP1) PB0 --| 14 15 |-- PB1 (OC1A) PWM Blau
    '* --------------
    '*
    '* benutzt wird ein serieller Programmer (ISP - In-System-Programmer)
    '*
    '*
    '***************************************************************************************
    $regfile = "m8def.dat"
    $lib "mcsbyte.lbx"
    $crystal = 4000000 'interner Quarz 4 MHz


    Declare Sub Check_input()
    ' optional LCD einbinden - hier Goldentek 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , E = Portd.3 , Rs = Portd.4
    Config Lcd = 16 * 2
    ' RC5 (TSOP1136) auf PIN D2 (INT0) festlegen - Timer0 und INT0 haben damit gut zu tun :)
    Config Rc5 = Pind.2
    Enable Interrupts
    ' Timer1 und Timer2 für PWM Betrieb initialisieren
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
    Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1


    Dim Address As Byte , Command As Byte
    Dim Rgb As Byte 'Hilfsvariable


    Config Pinb.3 = Output 'PWM Output rot Timer2
    Config Pinb.2 = Output 'PWM Output grün Timer1
    Config Pinb.1 = Output 'PWM Output blau Timer1


    Out_red Alias Ocr2 'PIN 17 PB3
    Out_blue Alias Ocr1al 'PIN 16 PB2
    Out_green Alias Ocr1bl 'PIN 15 PB1


    Out_red = 0 'rot dunkel
    Out_green = 0 'grün dunkel
    Out_blue = 0 'blau dunkel


    Cursor Off Noblink
    Cls


    Do
    Getrc5(address , Command)


    If Address = 0 Then
    Command = Command And &B01111111
    Locate 1 , 2
    Lcd "A:" ; Address ; " C:" ; Command ; " "
    Check_input
    Locate 1 , 11
    Lcd "R:" ; Out_red ; " "
    Locate 2 , 2
    Lcd "G:" ; Out_green ; " "
    Locate 2 , 9
    Lcd "B:" ; Out_blue ; " "


    End If
    Waitms 15
    Loop
    End


    Sub Check_input()


    Select Case Command
    Case 55 : Rgb = 1 ' rot eingeschaltet
    Case 54 : Rgb = 2 ' grün eingeschaltet
    Case 52 : Rgb = 3 ' blau eingeschaltet
    End Select


    If Command = 12 Then ' Power Taste - alles auf 0
    Out_red = 0
    Out_blue = 0
    Out_green = 0
    Rgb = 0
    End If
    If Command = 50 Then ' Gelbe Taste (Farbe gelb mischen)
    Out_red = 255
    Out_blue = 0
    Out_green = 255
    Rgb = 0
    End If
    If Command = 14 Then ' Rosa Taste (Farbe rosa mischen)
    Out_red = 255
    Out_blue = 128
    Out_green = 0
    Rgb = 0
    End If


    If Command = 59 Then ' Taste OK auf der Fernbedienung
    If Rgb = 1 Then ' rote LED einschalten
    Out_red = 255
    Out_blue = 0
    Out_green = 0
    Rgb = 0
    End If


    If Rgb = 2 Then
    Out_red = 0 ' grüne LED einschalten
    Out_blue = 0
    Out_green = 255
    Rgb = 0
    End If


    If Rgb = 3 Then ' blaue LED einschalten
    Out_red = 0
    Out_blue = 255
    Out_green = 0
    Rgb = 0
    End If
    End If


    If Command = 16 Then ' Vol.+ Taste gedrückt
    If Rgb = 1 And Out_red < 255 Then ' je nach Farbvorauswahl Farbe hoch
    Out_red = Out_red + 5
    End If


    If Rgb = 2 And Out_green < 255 Then
    Out_green = Out_green + 5
    End If


    If Rgb = 3 And Out_blue < 255 Then
    Out_blue = Out_blue + 5
    End If
    Waitms 15
    End If


    If Command = 17 Then ' Vol.- Taste gedrückt
    If Rgb = 1 And Out_red > 0 Then ' je nach Farbvorauswahl Farbe runter
    Out_red = Out_red - 5
    End If


    If Rgb = 2 And Out_green > 0 Then
    Out_green = Out_green - 5
    End If


    If Rgb = 3 And Out_blue > 0 Then
    Out_blue = Out_blue - 5
    End If
    Waitms 15
    End If


    End Sub[/code:1]

  • Hehe, sehr schön...
    Hatte ja auch schon einen Artikel zu dem Thema angefangen, dann aber Unfallbedingt aussetzen müssen ;) War allerdings mit Power-LEDs...
    Wird Zeit, den mal fertig zu machen... Muss aber das Board nochmal neu machen, waren leider noch einige Bugs drin.


    Laut Bascom-Doku kannst du aber den Timer0 wiederverwenden - allerdings könnten die LEDs dann kurz rumflackern. Der Interrupt ist aber verloren.

  • Zitat von "Stefan_Z"

    Hehe, sehr schön...
    Hatte ja auch schon einen Artikel zu dem Thema angefangen, dann aber Unfallbedingt aussetzen müssen ;) War allerdings mit Power-LEDs...
    Wird Zeit, den mal fertig zu machen... Muss aber das Board nochmal neu machen, waren leider noch einige Bugs drin.


    Laut Bascom-Doku kannst du aber den Timer0 wiederverwenden - allerdings könnten die LEDs dann kurz rumflackern. Der Interrupt ist aber verloren.


    :oops: Danke Danke.
    Ich wollte schon mal nachfragen - bin aber irgendwie davon abgekommen.
    ja ich habe auch sowas gelesen, aber so tief stecke ich dann doch noch nicht drin. geflackert hatte es beim Drücken der FB Tasten, aber leider haben die PWM Register ihren Wert nicht geändert - naja habe es daher auf ATmega8 versucht. Ich brauchte ein Erfolgserlebnis :lol: .
    Ja, HighPower LED's ist ein gutes Stichwort. Habe hier noch 3x RGB Rebel die verarbeitet werden wollen. Da würde ich aber versuchen die Pollin Logic-Level Mosfet's, Transistoren und Widerstände zu verwenden, um einen konstanten Strom für die LED's zu erreichen.
    Etwa so wie hier:
    [Blockierte Grafik: http://www.instructables.com/files/deriv/FTF/KKU6/Z2HEWIFNTP5/FTFKKU6Z2HEWIFNTP5.MEDIUM.jpg]


    könnte doch klappen, oder?

  • Die Skizze sieht aus wie von Instructables.com ;)
    Keine Ahnung, ob das funktioniert, bin in der Analogtechnik nicht wirklich gut... :oops: Aber das Mosfet is wie ein Schalter - Stom ans Gate -> Source und Drain verbinden sich...
    Das hier is eher so ne selbststabilisierende Stromquelle - Ich benutze immer den Ausgangsstrom von nem LM317 an der Anode von der PowerLED und die Kathode schalte ich mit dem Mosfet gegen GND: Pulldown-Widerstand muss man noch einbauen, dann geht das super...

  • Zitat von "amron"


    Si :wink:


    machst Du noch an Deinem Artikel weiter? ach by the way - wie geht's eigentlich Deinem Fuß?


    Fuß is wieder gut - danke der Nachfrage...
    Ja, mach ich weiter - habe ein neues Modell fertig, das ist jetzt auch fehlerfrei... Layouts und eagle-Datei samt Bascom-Source mach ich auch noch feddisch. Ist 5x5 cm groß und kann bis zu 2x 30V@3A schalten - auf 4 Kanälen. (oder auch 4x 30V@3A, so genau hab ichs noch nicht rausgefunden...) Mosfets sind die hier bei Pollin: MMDF3N03HDR2


    Stefan Z

  • :led: ich muss gestehen, das ich doch schon etwas gespannt bin - hört sich nämlich sehr interessant an.
    ja bei den mosfet's bin ich damals Deiner empfehlung gefolgt und habe gleich 'nen hektar :^o bei pollin mitbestellt.
    ich habe aber auch keinen anderen logic-level mosfet bei pollin gefunden - hab mir allerdings auch nicht jedes datenblatt angeschaut.

  • kann ich auch ein TSOP 1738 als IR Empfangsdiode benutzen? Wie der Name schon sagt 38KHz. Müssen dazu Änderungen in der Firmware durchgeführt werden? Die passende Fernbedienung betrachten wir mal als vorhanden.

  • Ja, das ist kein Problem. Habe selbst hier ein 1738 für meine Testaufbauten.
    Haben ihn allerdings nicht im "richtigen" Betrieb, dort nehme ich immer TSOP 1736.
    Kann also so erst mal nix über die Funktion im Langzeiteinsatz sagen. Am besten nicht fest einlöten,
    sondern mittels Steckverbindung anbringen, so kann man ihn später auch mal auswechseln, falls es hackt oder ähnliches.

  • danke, hat super funktioniert. Ich hatte Erfolg mit zwei älteren Philips Fernbedienungen TV und VCR und natürlich die Aldi Fernbedienung MD6461 TV Modus Code 088 auch Philips. Habe aber nur ein paar probiert.


    Tolles Tutorial, Danke

  • Ich werd hier jetzt nicht schlau



    Wozu dient dieses Tut ? Ich kann damit eine Fernbedienung bauen aber wazu brauch ich eine wenn ich eine habe ?


    nein, nicht ganz. mit diesem tutorial kann man keine fernbedienung bauen :rolleyes:
    dieser beitrag beschreibt einfach einen RGB Fader auf basis eines Microcontrollers (µC) den man mittels Fernbedienung steuern bzw. fern bedienen kann.
    der FB-Code der hier verwendet wird, da es hierfür schon eine bascom-routine gibt, ist RC5.
    manche realisieren solche anwendungen mittels taster und hier ist es eben per fernbedienung beschrieben.

  • Also habe ich dann ein Fernbedienung für einen Microcontroller ? Praktisch bräuchte ich dann den Microcontroller nur nur auf die FB proggen und dann z.B. ne laufschrift einfach mit der FB umstellen ?

  • der phantasie sind hier keine grenzen gesetzt.

    Zitat

    Also habe ich dann ein Fernbedienung für einen Microcontroller


    nein, einen Microcontroller, den man per Fernbedienung steuern bzw. fern bedienen kann ^^
    in diesem fall braucht man eben eine Fernbedienung, die RC5 Code kann.

  • der phantasie sind hier keine grenzen gesetzt.



    nein, einen Microcontroller, den man per Fernbedienung steuern bzw. fern bedienen kann ^^
    in diesem fall braucht man eben eine Fernbedienung, die RC5 Code kann.

    Sorry aber ich versteh hier echt nur Bahnhof


    Was ist RC5 ?



    Ich glaub ich lass es lieber sein ;(