-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Ansteuerung RC LED Scheinwerfer

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9

    Ansteuerung RC LED Scheinwerfer

    Anzeige

    Hallo RN-Gemeinde,

    Ich bin neu hier und hoffe darauf, das ich hier ein bisschen Hilfe bei beinen Projekten bekomme.

    Erst mal zu meiner Person, ich bin 33 Jahre, gelernter Elektriker und komme aus dem Rhein Neckar Kreis Rund um Heidelberg. Mein grosses Hobby ist der RC -Modellbau.
    Ich möchte mich etwas mehr mit den ganzen AVR Mikropozessoren beschäftigen um damit die ein oder andere Funktion an meinen Modellen zu realisieren.

    Ein konkretes erstes Projekt gibt es auch schon.

    Zu meinem Vorhaben:

    Ich habe ein Modell eines Polizeibootes (Robbe W3) gebaut, dies ist auch schon komplett fertig bis auf eine Funktion.

    Auf dem Aufbau befindet sich ein Scheinwerfer, welchen ich auch schon mit einer LED (weiss 3V 20mA) bestückt habe. Dieser Scheinwerfer lässt sich über ein Modellbauservo drehen.

    Aktuell habe ich aber keinen Schaltkanal mehr frei, um diesen Scheinwerfer einzuschalten. Hier soll nun ein Mikroprozessor ran.

    Am liebsten würde ih es gerne mit einem Tiny13 realisieren aber ich befürchte der ist dafür schon fast zu klein.

    Ich möchte gerne das Signal des Servos welches den Scheinwerfer dreht auswerten. Sprich Servo bewegt sich dann Scheinwerfer an, Servo steht für eine Zeit x still, Scheinwerfer geht wieder aus.
    Am liebsten wäre mir auch, wenn die LED nicht einfach nur an und aus gehen würde sondern per PWM heller und dunkler wird.

    Da der Tiny 13 ja nur einen Timer besitzt, denke ich mal ist hier das größte Problem.
    Der Timer0 muss sofern das überhaupt gehen 3 Funktionen übernehmen.

    - PWM vom Empfänger einlesen und auswerten
    - PWM für die LED erzeugen
    - Nachlaufzeit für LED nachdem keine Servobewegung mehr erkannt wurde zählen.

    Meine konktrete Frage ist nun ist das mit dem Tiny 13 realisierbar ? oder doch eher ein 2313?

    und welche Betriebsart für den Timer benutzen ? Verstehe ich das in dem Datenblatt richtig das er zwar nur einen Timer aber zwei unabhängig Compare register hat. Kann man dann das erste register nehmen um den Empfänger auszuwerten und das zweite für die LED PWM ? Und mit einem Überlauf kann ich mir dann ja evtl. die nachlaufzeit zusammen addieren oder?

    Danke für eure Meinungen im Voraus.

    Gruß

    Stephan

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.544
    Willkommen im Forum,
    Ich kenne den uC nicht, sollte aber, laut deinen Angaben, funktionieren.

    Ansonsten könntest du noch den Attiny25, 45 bzw 85 oder Attiny44 nehmen.

    Aber ein timer reicht eigentlich. Normale PWM Funktion für die LED (oder Soft PWM), die Interrupt zählen für die Stillstandserkennung. Für die Auswertung des Servosignals nimmst du einen normalen Int Eingang und liest bei einem Int den aktuellen Timerwert aus.

    MfG Hannes

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Hallo Stephan,

    für so eine Aufgabe (Servo-Impulse überwachen, bei Änderungen eine LED einschalten, bei konstant bliebender Impulslänge die LED langsam abdimmen) ist ein Mikrocontroller geradezu ideal! Ich bin übrigens auch Modellbauer, auf dem Gebiet der Elektronik zwar nur Amateur, aber der Einstieg in die Materie der Mikrocontroller hat mir ganz neue Welten eröffnet.

    Mit dem ATtiny13 habe ich gerade am letzten Wochenende eine kleine Schaltung für einen Modellbau-Kollegen realisiert, von daher habe ich seine Features gerade ganz gut auf dem Schirm. Wenn man einigermaßen sparsam mit dem Speicherplatz ummgeht, müsste Dein Projekt allemal mit diesem Chip zu realisieren sein. Der eine Timer reicht definitiv aus, wenn man ihn inteligent nutzt

    Der Timer an sich müsste zwei Dinge tun: Erstens die Länge der Servo-Impulse messen und zweitens bei Bedarf ein PWM-Signal erzeugen.
    Für´s erste ist es oft sinnvoll, die einzelnen Teilfunktionen eines Programms zu programmieren, und ganz am Schluss alles zusammenzusetzen.

    Wie viel weißt Du denn schon über Timer, Variable, Interrupts (ohne die wird´s nicht gehen!) usw.?

    Gruß, Daniel

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Hallo Daniel,

    gut was weiß ich über Timer, Variablen und Interrupts.

    Timer sind in wirklichkeit nichts anderes als Zähler.
    Genau genommen erhöhen sich deren Zählwerte pro Programmdurchlauf um 1, was die Timergeschwindigkeit von der Taktrate des Mikroprozessors abhängig macht. Hab ne bissel was schon mit denen gemacht nur eben keine PWM.
    Die Themen prescaler und das es eben nur ein 8 Bit Timer ist der nur bis 255 zählen kann sind mir klar.

    Interrupts lößen meines wissens speziele Programmabschnitte / Routinen aus die möglichst kurz sein sollen. Die Routinen werden bei einem Flankenwechsel nur einmal durchlaufen soweit ich weiß
    Variablen kenn ich die gängigsten Typen wie eben Bool Integer Word usw. Die sind mir von meiner Arbeit bekannt.

    Mein Problem ist oftmals die Fehlersuche beim probieren.
    Ich programmier auf Arbeit in Industriesteuerungen da hab ich aber immer die Möglichkeit online zuzuschauen was die CPU im Programm treibt.

    Das fehlt mir leider bei den Mikroprozessoren ein wenig.

    Ich bin leider noch nicht so wirklich weiter gekommen.

    Bin immer noch am basteln.

    Gruß Stephan

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Mein Problem ist oftmals die Fehlersuche beim probieren.
    Ich programmier auf Arbeit in Industriesteuerungen da hab ich aber immer die Möglichkeit online zuzuschauen was die CPU im Programm treibt.

    Das fehlt mir leider bei den Mikroprozessoren ein wenig.

    Ich bin leider noch nicht so wirklich weiter gekommen.

    Bin immer noch am basteln.
    Das stimmt - manchmal ist es schwierig herauszufinden, was in diesen kleinen Dingern wirklich gerade passiert. Aber es ist grundsätzlich möglich!
    Wir wollen hier ja niemandem fertigen Code vorkauen, denn den meisten Spaß macht es ja, selber drauf gekommen zu sein!
    Ich würde sagen, wir fangen mal mit was ganz einfachem an:

    So ein Servo-Impuls bewegt sich zwischen 1 und 2 ms. Wenn man die Länge dieses Impulses mit dem (einzigen) Timer0 messen möchte, darf der Timer keinesfalls während des zu messenden Impulses "überlaufen", weil er danach ja wieder bei 0 anfängt und die Messung dann logischerweise total falsch wäre. Anders gesagt, um von 1 bis 255 hochzuzählen muss der Timer länger brauchen als 2 ms. Rechne doch mal aus wie viel Zeit der Timer0 is zum Überlauf braucht, wenn Du den Takt des Controllers auf 4,8 MHz und den Prescaler des Timers uf 64 einstellst - und dann sehen wir weiter!

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Hi,
    einen vorgekauten Code, will ich ja gar nicht haben

    Wenn ich mich jetzt nicht allzu dolle verrechnet habe, sollte bei 4,8 Mhz und einem Prescaler von 64 ein timerüberlauf nach 3,4 ms stattfinden, was ja aussreicht um die 2ms vom Empfänger zu erkennen.
    Daher sollte der Timer bei 1ms einen Wert von ca. 75 haben und bei 2 ms einen Wert von 150.


    Nur als Info, da nicht jeder Empfänger als High Pegel um die 5 V ausgibt sondern manchmal deutlich weniger, schalte ich mit der Impulsleitung einen kleinen NPN Transistor und ziehe mit diesem den Int0 auf GND. ansonsten benutze ich den Internen Pullup Widerstand.

    Von der Theorie her dachte ich daran mit dem Int0 einen Interrupt auzulösen und in eine ISR zu springen. Dort Frage ich den Pin ab ob er 1 oder 0 ist und merke mir das. Nur müßte ich dann bei ausgelößter ISR und Gemerkter steigender Flanke den Timer starten und bei fallender Flanke auslesen und den Timer wieder stoppen.

    Aber wie verwende ich den Timer dann noch für die anderen Funktionen?

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.544
    Was bedeutet deutlich weniger Spannung als 5V? Hast du das nachgemessen? Vielleicht benötigst du keinen Transistor. Und beim messen kein Multimeter sondern ein Oszilloskop verwenden.

    Beim Timer darfst du nichts ändern, sonst funktioniert der Timer Interrupt und die PWM Funktion nicht richtig. Du liest nur den aktuellen Zählerstand aus. Du musst nur bedenken das es einen Überlauf geben kann. Bei einem Überlauf musst du die Berechnung etwas anpassen.

    MfG Hannes

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Genau so ist es, der Timer zählt zwischen 75 und 150 Schritte weiter. Und man darf ihn nicht starten und stoppen, wenn er gleichzeitig ein PWM-Signal generieren soll, auch das ist richtig. Und bei dieser Anzahl an Zählschritten ist es sogar sehr wahrscheinlich, dass der Timer regelmäßig während des Impulses überläuft. Aber das ist nicht schlimm:

    Da Bytes ja keine negativen Werte haben können, gibt es sozusagen einen "Rückwärts-Überlauf", wenn Du von einem kleineren Byte ein größeres subtrahierst. Klingt jetzt vielleicht ein wenig abstrakt, aber an einem Beispiel wird es sicher verständlich:

    Nehmen wir mal an der Impuls ist so lang, dass der Timer um 80 Schritte weiterzählt. In der ISR weist Du bei steigender Flanke einer Variablen (z.B. "Alt") den aktuellen Zählerstand zu, und bei fallender Flanke einer anderen (z.B. "Neu"). Anschließend subtrahierst Du Neu-Alt. Ist der Timer zwischen den Flanken nicht übergelaufen, ist alles klar: Neu ist grölßer als Alt, und die Differenz ist immer 80.

    Aber was passiert wenn der Timer während des Impulses überläuft und Neu somit kleiner ist als Alt? Wenn Alt z.B. 200 ist, hätt Neu nach 80 Takten und einem Überlauf einen Wert von 24. Die Rechnung 24 - 200 ergibt auf Byte-Ebene aber nicht -176, sondern genau 80 (weil's nach der Null wieder bei 255 anfängt).

    Der langen Rede kurzer Sinn: Lass den Timer ganz ungerührt durchlaufen, lese den Zählerstand bei steigender und fallender Flanke ab, subtrahiere die beiden Werte, und Du hast IMMER die Impulslänge

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2016
    Beiträge
    9
    Hallo Hannes,

    es ist wirklich so, es gibt bei Empfängern große Unterschiede und das teilweise auch bei gleichen Herstellern.
    Wenn man einen Empfänger mit den z. B. typichen 4,8V betreibt, gibt es keine Garantie das an einem Servoausgang auf der Impulsleitung auch 4,8V anliegen.
    Ganz klar, das läßt sich nur mit dem Oszi messen.

    Ich hatte schon Schaltungen aus dem Internet nachgebaut, an einem Servotester haben diese dann funktioniert und an einem Empfänger nicht.
    Seit dem bau ich mir einen Tansistor davor, den bekommt man immer noch unter und es funktioniert zuverlässiger.

    @Daniel

    Ok das mit dem Überlauf hab ich verstanden Ich bin es nur nicht gewohnt, ich programmier in 16 Bit Systemen da findet ein Byte nicht so die Verwendung und mit der Variable WORD läßt sich nur beschränkt rechnen. Und Integers sind vorzeichenbehaftet. Manchmal kann die Lösung doch so einfach sein

    Ich habe bisher nur ganz kleine Sachen selbst gemacht. Wie ist das mit den Interrupts. Ich möchte den Int0 verwenden mehr hat der Tiny eh nicht. Das ist Pin B.1 ok wie genau funktioniert das? Springt der bei jedem Flankenwechsel in die ISR routine und bearbeitet diese genau einmal?
    Also sowohl bei steigender als auch bei fallender Flanke?

    Ich bin übersa Wochenende nicht zuhause und komme mal wieder nicht zum testen.

    Aber könnte das so funktionieren? Wenn die Routine Zaehlung bei Int0 ausgelößt wird.

    Zaehlung:
    If Pinb.1 = 0 Then Signal_alt = Timer0 Else Signal_neu = Timer0
    Return

    Soweit ok den Timer Konfiguriere ich dann auch also nur als "Config Timer0 = Timer ; Prescaler 8"

    Das heißt ich kann dann um ne PWM zu erzeugen einen vergleichswert nehmen, beim erreichen den Ausgang einschalten und wenn der Timer überläuft den Ausgang wieder auf null setzen. Das kommt dann im Endeffekt diesem Fast-PWM Mode ungefähr gleich.

    Da hab ich jetzt ja mal ne paar anhaltspunkte.

    Vielen Dank euch bis hierher schon mal

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.544
    Wie das in Bascom funktioniert weiß ich nicht. Ich würde die normale PWM einstellen (egal welchen PWM Mode), also Prescaler, und die anderen Register für den PWM Mode, den du verwenden willst. Zusätzlich gibst du den Timer Interrupt frei. Dieser wird immer ausgelöst wenn der Timer überläuft (von Zähler max auf 0 springt).


    Wie der Int 0 reagiert musst du einstellen (mit den Registern). Ich müsste nachschauen wie das bei dem uC ist, ich weiß ich nicht. Aber normalerweise kann ma wählen zwischen Flanke steigend, Flanke fallend, Flanke steigend und fallend bzw Pegel high bzw Pegel low.

    MfG Hannes

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. LED-Scheinwerfer mit 3.000 Lumen
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 10
    Letzter Beitrag: 18.04.2013, 15:57
  2. Scheinwerfer und Blaulicht
    Von markus788 im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 26.10.2012, 17:12
  3. LED- und IR- Scheinwerfer
    Von fabqu im Forum Robby RP6
    Antworten: 18
    Letzter Beitrag: 15.02.2011, 20:43
  4. Dmx RGB Led Scheinwerfer
    Von Maxtronik im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 7
    Letzter Beitrag: 07.06.2010, 23:39
  5. DMX-LED-RGB Scheinwerfer
    Von rideyourstyle im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 5
    Letzter Beitrag: 24.10.2008, 14:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •