Forum: Projekte & Code noch ein AVR Moodlight


von Axel S. (a-za-z0-9)


Angehängte Dateien:

Lesenswert?

Moin,

hier kommt ein kleines Bastelprojekt von mir, das ich zwischen den 
Jahren angefangen habe und dessen Software jetzt erstmals in einem 
präsentablen Zustand ist.

Es ist ein RGB-Moodlight mit IR-Fernbedienung. Angehängt ist der 
komplette Code und die Platine, die ich für den Prototypen entworfen 
habe.

Die Hardware ist simpelst, weswegen da (noch) kein Schaltplan ist. An 
PD0, PD1 und PD2 hängen die LEDs, in meinem Fall über geschaltete 350mA 
Stromsenken. An PD3 ist ein IR-Empfängermodul a'la TSOP1738 
angeknüppert. Die Platine trägt huckepack den Kühlkörper mit den 1W-LEDs 
und dazwischen das 5V/2A Schaltnetzteilmodul von Pollin. LEDs und 
Netzspannung werden über Schraubklemmen angeschlossen.

Prozessor ist ein Mega8. Der Code ist derzeit knapp 3K, es würde also 
auch ein Tiny45 o.ä. reichen.

Eckdaten:

16 bit Soft-PWM (ähnlich wie Soft-PWM aber im Detail besser :) die 
die LED mit 204 logarithmischen Helligkeitsstufen dimmt. Derzeit sind 
zwei Modi implementiert: Rotation R-G-B und R-B-G mit einstellbarer 
Geschwindigkeit. Mehr Modi folgen, wie ich Zeit und Lust habe :)

Die PWM verwendet ein paar Tricks. Zum einen ist die Datenstruktur 
darauf ausgelegt, eine möglichst kompakte ISR zu haben. Die PWM-Tabelle 
wird mit dem beiliegenden Perl-Skript generiert, momentan mit 2% 
Steigerung je Stufe und minimal 61 Takten zwischen aufeinanderfolgenden 
Stufen. Wegen der logarithmischen Helligkeitsstufen werden die Abstände 
zwischen den Interrupts mit steigender Helligkeit immer größer. Die 
größte Lücke ist im Zyklus, bevor der Timmer wieder auf 0 geht. Deswegen 
wird da die 'tick' Variable dekrementiert, die das Timing für die 
Endlosschleife in main() bestimmt. An dieser Stelle werden dann auch die 
Helligkeiten neu berechnet.

Der IR-Empfang stützt sich komplett auf IRMP, konfiguriert 
ausschließlich für das NEC-Protokoll. Danke Frank, für dieses 
Klasse-Projekt! Address- und Tastencodes (#define's in moodlight.c) sind 
von einer alten Goldstar-Fernbedienung, die hier noch rumflog.

Viel Spaß beim Anschauen, Nachbauen und was euch sonst noch dazu 
einfällt.


XL

von Axel S. (a-za-z0-9)


Angehängte Dateien:

Lesenswert?

Moin,

hier noch der Schaltplan. Die Stromsenke ist dreimal identisch 
aufgebaut. Der Strommeßwiderstand von 2R besteht aus 2 einzelnen 0805 
SMD Widerständen (wegen der Leistung). Die 2SD1802 habe ich verwendet, 
weil ich sie da hatte (von alten PC-Mainboards geborgen).

Die Schottky-Diode (irgendwas kleines, notfalls auch eine 1N4148) in der 
Vcc Leitung zum ATmega8 ist da aus zwei Gründen:

1. werden so Surges die u.U. beim gleichzeitigen Einschalten der LEDs 
entstehen, vom Controller und IR-Empfänger ferngehalten.

2. kann man so die Einheit beim flashen aus dem Programmer versorgen.


XL

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Axel Schwenke schrieb:

> hier kommt ein kleines Bastelprojekt von mir, [...]

Schönes Projekt - vor allen Dingen, weil da IRMP mit drin steckt ;-)

Wenn ich den Source richtig interpretiere, kann man sowohl die Richtung, 
in der die Farben wechseln, als auch die Geschwindigkeit des 
Farbwechsels per FB einstellen.

Eine Farbe vorgeben wäre vielleicht noch eine sinnvolle Erweiterung, 
oder?

Das könnte vielleicht folgendermaßen ablaufen:

Wenn gerade eine Farbe erscheint, die man speichern will, drückt man auf 
der FB eine Speicher-Taste gefolgt von 1-9 für den Speicherplatz.

Wenn man dann später eine Taste zwischen 1 und 9 drückt, wird die 
gespeicherte Farbe aufgerufen.

Gruß,

Frank

von Axel S. (a-za-z0-9)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Schönes Projekt - vor allen Dingen, weil da IRMP mit drin steckt ;-)

:D

> Wenn ich den Source richtig interpretiere, kann man sowohl die Richtung,
> in der die Farben wechseln, als auch die Geschwindigkeit des
> Farbwechsels per FB einstellen.

Das ist der Stand der Dinge. Eigentlich ist das nur ein Modus mit 2 
Parametern: Richtung und Geschwindigkeit.

> Eine Farbe vorgeben wäre vielleicht noch eine sinnvolle Erweiterung,
> oder?

Ich hab noch ein paar Ideen für Modi:

- feste Farbe; zwei Tasten, um durch das Farbrad zu "drehen" (z.B. 
FWD/REW), zwei weitere Tasten (z.B. +/-) um die Helligkeit zu ändern

- feste Farbe; pulsierende Helligkeit; auch hier wieder die Möglichkeit, 
Farbe und Geschwindigkeit zu beeinflussen

- hartes Umschalten zwischen den Farben. Hier könnte man außer Richtung 
und Geschwindigkeit auch die Anzahl der Zwischenfarben variieren. Z.B. 
(R,G,B) -> (R, R+G, G, G+B, B, B+R) -> (R, R+50%G, 50%R+G, ...)

Das Vorhandensein einer Record-Taste schreit aber geradezu danach, z.B. 
drei Lieblings-Modi mitsamt Parametern auf drei Ziffern zu legen. Und 
mit der Pause-Taste könnte man zyklische Modi anhalten/weiterlaufen 
lassen.


XL

von Axel S. (a-za-z0-9)


Angehängte Dateien:

Lesenswert?

Moin,

ich hab in der Zwischenzeit ein bisschen am Code gefeilt und jetzt 3 
Modi implementiert:

Mode 1: sanfter Farbwechsel R->G->B->R. Die Farben "treffen" sich bei 
50% Intensität, dadurch sind die Zwischenfarben (z.B. Magenta = 
Rot+Blau) etwas dunkler als die reinen Farben.

Mode 2: sanfter Farbwechsel R->R+G->G->G+B->B->B+R->R. Hier haben die 
LED bei den Zwischenfarben jeweils 100% Intensität, wodurch jetzt die 
Zwischenfarben heller erscheinen.

Mode 3: hartes Umschalten zwischen R, R+G, G, G+B, B, B+R, R+G+B.

In allen 3 Modi kann die Geschwindigkeit mit 2 Tasten (FWD, REV) 
verändert werden. Außerdem kann man das Moodlight mit einer Taste 
(PAUSE) anhalten (und mit einem weiteren Druck weiter laufen) lassen. 
Schließlich kann man mit einer weiteren Taste (PLAY) entweder aus dem 
Pause-Zustand weiterlaufen oder wenn es schon läuft, die Richtung 
wechseln. Zu guter Letzt kann man mit einer Taste (OPERATE) das 
Moodlight ausschalten. Der µC bleibt unter Strom, so daß man mit der 
Fernbedienung wieder einschalten kann. Die Einstellungen bleiben 
erhalten.

Der Code ist jetzt noch aufgeräumter und besser kommentiert. Außerdem 
habe ich das für meinen Prototypen verwendete Platinenlayout dazu 
gepackt.

In den nächsten Tagen werde ich den Code auf einen ATtiny85 portieren 
und die finale Hardware bauen. Der Prototyp sieht schon sehr nett aus, 
nachdem ich die Milchglaskugel einer "Fado" Lampe (von IKEA: 
http://www.ikea.com/de/de/catalog/products/80096372/) drüber gestülpt 
habe.


In der Hoffnung, jemanden zu inspirieren :)

XL

von Thomas D. (thomasderbastler)


Lesenswert?

Mal eine doofe Frage, wo sind die erwähnte Tasten im Schaltplan ?

von Axel S. (a-za-z0-9)


Lesenswert?

Thomas der Bastler schrieb:

> Mal eine doofe Frage, wo sind die erwähnte Tasten im Schaltplan ?

Auf der Fernbedienung :D

Oder was glaubst du, warum da ein TSOP1736 in der Schaltung ist?


XL

von Axel S. (a-za-z0-9)


Angehängte Dateien:

Lesenswert?

Hier noch zwei Fotos vom Prototypen. Wie man leicht sehen kann, sind die 
Verbindungen vom µC zu den Treibern (PD0,1,2) noch gefädelt. Ebenso 
wurde der IR-Empfänger auf dem Lochraster aufgebaut. Den genauen Typ des 
Empfängers kenne ich gar nicht, den hab ich mal von einer 
Schrott-Platine geborgen.

Das Netzteil ist in dieser Phase nicht eingelötet, statt dessen 
provisorisch zwei Lötösen für GND und +5V.


XL

von Thomas D. (thomasderbastler)


Lesenswert?

Axel Schwenke schrieb:
> Oder was glaubst du, warum da ein TSOP1736 in der Schaltung ist?

Das war ja klar, aber Ich habe von dir gelesen :

"mit 2 Tasten (FWD, REV) verändert werden. Außerdem kann man das 
Moodlight mit einer Taste (PAUSE) anhalten"

Di hate ich vermisst...

von Janser (Gast)


Lesenswert?

Wo hast du das denn mit der Pause im Code gemacht?

Axel Schwenke schrieb:
> Außerdem kann man das Moodlight mit einer Taste
>
> (PAUSE) anhalten (und mit einem weiteren Druck weiter laufen) lassen.

von Lorenz H. (lorenzo)


Lesenswert?

Hallo Axel,

ich bin erst jetzt auf dein Projekt aufmerksam geworden. Ich würde das 
gern auf einen ATTiny85 portieren, komme aber mit Timer1 nicht klar. Du 
verwendest hier einen 16 Bit Timer, der Tiny85 hat aber nur 8 Bit. Wie 
müsste ich die Timereinstellungen setzen und vor allem die pwmtable, 
damit das ganze mit 8 Bit funktioniert.

beste Grüße

von Axel S. (a-za-z0-9)


Lesenswert?

Lorenz H. schrieb:

> Ich würde das
> gern auf einen ATTiny85 portieren, komme aber mit Timer1 nicht klar. Du
> verwendest hier einen 16 Bit Timer, der Tiny85 hat aber nur 8 Bit. Wie
> müsste ich die Timereinstellungen setzen und vor allem die pwmtable,
> damit das ganze mit 8 Bit funktioniert.

Das erfordert größere Anderungen am Code um es mit einem 8-Bit Timer 
umzusetzen. Dann wäre es wahrscheinlich einfacher, wenn man gleich auf 
binär gewichtete PWM (aka BAM) setzt.

Siehe: Beitrag "AVR: Fast-PWM (BAM) 12 Bit für 8 Kanäle"

von Lorenz H. (lorenzo)


Lesenswert?

Danke für die schnelle Rückmeldung :-). Das muss ich mir dann erst 
einmal ansehen.

beste Grüße

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Schönes Projekt! Das mit der SoftPWM schaut sehr gut aus :)

Unter welcher Lizenz steht dein Source-Code? Darf man den in eigenen 
Projekten verwenden, die man als OpenSource zur Verfügung stellt 
(natürlich mit Quellenangabe im Sourcecode).

Ich bastel auch gerade an sowas ... Mein Projekt hat neben IR auch noch 
USB, Li-Ion-Akku + Laderegelung, Step-Up-Converter, Helligkeitssensor, 
ein paar Tasten usw ...

Derzeit hab ich das mit ATTiny84 und 3 PWM-Kanälen gelöst (der Tiny84 
hat 16Bit PWM), aber wenn noch IR dazu kommt, dann gehen mir die Timer 
aus^^. Und mit V-USB müsste die ISR schnell sein, das ist sie bei mir 
derzeit nicht.

Denke deine Lösung wäre gut bei mir zu integrieren :)

: Bearbeitet durch User
von Axel S. (a-za-z0-9)


Lesenswert?

Mampf F. schrieb:
> Unter welcher Lizenz steht dein Source-Code?

Für die paar Zeilen habe ich da nicht drüber nachgedacht.
Ich würde mal sagen: Artistic License.

> Darf man den in eigenen
> Projekten verwenden, die man als OpenSource zur Verfügung stellt
> (natürlich mit Quellenangabe im Sourcecode).

Nur zu.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Axel,

Axel S. schrieb:
> Für die paar Zeilen habe ich da nicht drüber nachgedacht.
> Ich würde mal sagen: Artistic License.

Ich wollte nur kurz einwerfen, dass das verwendete IRMP unter GPL 
lizensiert ist. Soviel ich weiß (bzw. meine zu wissen), untersteht auch 
jede Software, die GPL-Software verwendet, damit auch der GPL. Ich kann 
mich auch irren, habe aber da die "Viren-Characteristik" von 
GPL-Software im Kopf.

Mir persönlich ist es schnuppe. Kann aber sein, dass Du durch die 
Verwendung von IRMP gar nicht mehr die freie Wahl hast ;-)

von Axel S. (a-za-z0-9)


Lesenswert?

Stimmt auch wieder :)

Wie gesagt: für meinen Teil an diesem Projekt ist es mir eigentlich 
egal. Artistic oder GPL. Wenn Mampf beides in seinem Projekt verwursten 
und es veröffentlichen will, muß er dann wohl auch GPL nehmen. Wenn er 
nur die Soft-PWM braucht und die Steuerung anders macht, dann nicht.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Axel S. schrieb:
> Wie gesagt: für meinen Teil an diesem Projekt ist es mir eigentlich
> egal. Artistic oder GPL. Wenn Mampf beides in seinem Projekt verwursten
> und es veröffentlichen will, muß er dann wohl auch GPL nehmen. Wenn er
> nur die Soft-PWM braucht und die Steuerung anders macht, dann nicht.

Ohje, ich sehe schon wieder endlose Diskussionen bzgl Lizenzen und 
Virencharakter von GPL xD

Man könnte ja argumentieren, dass der von dir geschriebene Code bereits 
GPL ist, weil du ja IRMP verwendet hast. Wenn ich aus GPL-Code etwas 
herausnehme, bleibt es ja GPL xD

Sorry dafür, sowas wollte ich nicht starten xD

Also ich mach es einfach so: Wenn ich Teile von dir verwende, schreib 
ich die original-Quelle der Code-Schnippsel als Quellenangabe in den 
Code. IRMP werde ich vermutlich auch verwenden. Der Code wird dann 
einfach hier im Forum veröffentlich :)

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Ah jetzt konnte ich doch nichts von deinem Code verwerten ... Der hat 
sich mit dem VUSB nicht vertragen :(

Hab jetzt doch 3 Hardware-PWMs verwendet :)

von equi (Gast)


Lesenswert?

Hi,
schönes Projekt! Hab das gleiche, jedoch ohne das IRMP vor längerem mal 
gemacht. Damals aber auf dem Attiny 85 (wars glaub) weil ich da 
ziemmlich minimalistisch bin ^.^
Das Ding hatte ich über zwei potis gesteuert (ADC), wobei eines für den 
Modus (Strobo, Kerze, Moodlight, Color, Random color, Lampe etc) und das 
andere für die Geschwindigkeit zuständig war.
Da du ja dekadent mit einem Atmega8 gestartest hast, könntest du ja auch 
noch 2 manuelle auswahlpotis einbaun ;)
Ist dann zum Beispiel für Geschwindigkeit angenehmer zum Testen, wie 
schnell man es haben will, als es mühselig über die Fernbedinung zu 
machen.
Wenn du es auch noch als Lampe verwenden willst, je 3W LEDs sind extrem 
hell xD

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.