Forum: Projekte & Code Touchdimmer mit ATtiny13


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


Angehängte Dateien:

Lesenswert?

Moin,

ich habe letztens meine Küche etwas umgebaut und dabei entschieden, die 
Leuchtstoffröhre über der Spüle gegen einen LED-Streifen zu tauschen. 
Aus naheliegenden Gründen wollte ich dort keinen mechanischen Schalter 
haben. Zuerst habe ich mit einem Lichtsensor (Reflexlichtschranken- 
Prinzip) geliebäugelt. Aber das ist schwer zuverlässig zu bekommen.

Dann fiel mir ein, daß es ja diese famosen Qtouch, TouchSense etc. Libs 
gibt. Nach etwas Experimentieren bin ich auf Tims Implementierung von 
QtouchADC im Beitrag "TinyTouchLib - Touchbutton library für Attiny" gestoßen.
Der Prototyp auf dem Steckbrett funktionierte auf Anhieb. Und weil noch 
so viel Platz im Flash war, habe ich statt eines einfachen Schalters 
gleich einen Dimmer reinprogrammiert.

Die Funktion ist ähnlich wie man es von den althergebrachten 
Touchdimmern a'la SLB0586 kennt: kurzes Berühren des Sensors schaltet 
das Licht an bzw. aus. Langes Berühren startet den Dimmvorgang.

Per #define in main.c sind verschiedene Dimm-Modi wählbar:
1
#define TURN_ON_MAX_BRIGHT 1
 Wenn das auf 1 gesetzt ist, wird beim Einschalten des Lichts die 
maximale Helligkeit gesetzt und die initiale Dimmrichtung ist abwärts 
(dunkler). Ein Wert von 0 bedeutet, daß Helligkeit und Dimmrichtung vom 
Zeitpunkt des Ausschaltens benutzt werden.

1
#define AUTO_REVERSE_DIR 0
 Ein Wert von 1 bedeutet, daß beim Erreichen der maximalen bzw. 
minimalen Helligkeit die Dimmrichtung automatisch umgekehrt wird. Wenn 
man das aktiviert, sollte man den Touch-Timeout in TinyTouchLib.h 
deaktivieren. Beim Wert 0 bleibt der Dimmer in der jeweiligen 
Endstellung einfach stehen.

1
#define REVERSE_DIR_ON_RELEASE 1
 Wenn das angeschaltet ist, dann wird die Dimmrichtung nach jedem 
Dimmvorgang umgekehrt. Das ist besonders hilfreich bei deaktiviertem 
Auto-Reverse.

Schließlich kann man in DIMM_START_CYCLES und DIMM_REPEAT_CYCLES noch 
vorgeben, nach welcher Zeit das Dimmen startet und wie schnell es dann 
voran geht.

Die Schaltung ist der Zuverlässigkeit halber auf einer Platine unter- 
gebracht und paßt problemlos in das recht formschöne Gehäuse Nr. 2044 
von Strapubox (z.B. bei Reichelt erhältlich). Die Sensorfläche ist in 
das Oberteil eingeklebt und wird über eine auf der Platine aufgelötete 
Spiralfeder kontaktiert. Ein- und Ausgang wollte ich ursprünglich direkt 
auf die Platine löten, habe mich dann allerdings doch für einen 
Steckverbinder für den Ausgang entscheiden.

An dieser Stelle noch ein herzliches "Dankeschön" an Tim für 
TinyTouchlib. Ich hoffe jemand kann mit meinem Projekt etwas anfangen.

: Bearbeitet durch User
von Hobbiest (Gast)


Lesenswert?

Danke Axel, dass auch das hexfile dabei ist.

Nicht jeder kann programmieren und compilieren...

So macht nachbasteln Spass

von Gerd (Gast)


Lesenswert?

Zieht diese Schaltung nicht ESD an, wie ein Magnet?

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


Lesenswert?

Gerd schrieb:
> Zieht diese Schaltung nicht ESD an, wie ein Magnet?

Ich verstehe deine Frage nicht. Ganz besonders nicht, was du mit ESD 
meinst. Electrostatic Discharge kann es ja nicht sein. Vielleicht 
Einspritzdüse? Oder elektrisches Schiebedach?

von Peter (Gast)


Lesenswert?

Er bezieht sich wahrscheinlich auf den fast ungeschützten Eingang am uC. 
Der Widerstand alleine ist keine große Hürde für eine statische 
Entladung.

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


Lesenswert?

Peter schrieb:
> Er bezieht sich wahrscheinlich auf den fast ungeschützten Eingang
> am uC.
> Der Widerstand alleine ist keine große Hürde für eine statische
> Entladung.

Aha.

Und wie kommt eine statische Entladung auf den µC-Eingang, wo sich die 
Elektrode doch im Inneren des Gehäuses befindet? Diese Definition von 
"fast ungeschützter Eingang" war mir bislang unbekannt.

Nach dieser Metrik ist ADC3 (= Pin2) sogar noch ungeschützter. Da ist 
noch nicht mal ein Widerstand vorgeschaltet!1!!elf!

Aber mal im Ernst: es würde helfen, sich mal mit der Qtouch-ADC Methode 
zu befassen. Der µC-Pin ist keineswegs die ganze Zeit offen, sondern 
wird regelmäßig als Ausgang geschaltet und aktiv auf H bzw. L getrieben.

von Rahul (Gast)


Lesenswert?

Hello

I have made this on a proto board. However the PWM output is 140hz.

Is there any way to increase this to close to 1Khz?

regards

Rahul

von René H. (Gast)


Lesenswert?

Hi Axel,

was für ein Material hast Du für den Sensor verwendet?

(falls Du noch mit liest :-).

Grüsse,
René

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


Lesenswert?

Rahul schrieb:
> ... the PWM output is 140hz.
> Is there any way to increase this to close to 1Khz?

You can use a different prescaler for Timer0. Right now it's 256 which 
yields f_pwm = 9.6MHz ÷ 256 ÷ 256 = 146Hz. Other available prescalers 
are 64 → 586Hz and 8 → 4.7kHz.

For ~1kHz you could use Timer0 prescaler = 8 and reduce the system clock 
to 1.2MHz by writing CLKPR accordingly. All this is done in function 
hw_init() in main.c. Make sure to set F_CPU in the Makefile as well.

Then you might also need to change the ADC clock prescaler (or maybe 
it'll work with the ADC running at 1/4th of the current speed) which is 
in tinytouch_init() in TinyTouchLib.c.

But why? 146Hz is already flicker-free. Increasing the PWM frequency 
means increased loss in the switching MOSFET and increased EMI radiation 
from the LED strip (and cables leading there).

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


Lesenswert?

René H. schrieb:

> was für ein Material hast Du für den Sensor verwendet?

Ein Stückchen Messingblech aus der Restekiste. Jedes Blech geht hier, 
z.B. von einer Konservendose. Oder etwas dickere Alufolie. Die 
Metallfläche muß halt nur möglichst direkt an die Gehäuseinnenseite. Ein 
Stück Platinenmaterial müßte also mit der Kupferseite nach außen 
verwendet werden und durch die Isolierschicht hindurch kontaktiert 
werden. Nicht unmöglich, aber allemal aufwendiger als meine Konstruktion 
mit der Feder und dem Blechstückchen.

von Rahul (Gast)


Lesenswert?

Hi

wow you are quick to respond :). thanks

I have an LED Tablelamp which uses this IR3M92N4 SHARP driver. I looked 
up the datasheet and it said that to dim it I need a PWM frequency of 
1khz.

I tried Playing with the code before I wrote to you and got the 
following error in WINAVR

  C:\Users\rahul\Desktop\dimmer/main.c:136: undefined reference to 
`tinytouch_init'
C:\Users\rahul\Desktop\dimmer/main.c:140: undefined reference to 
`tinytouch_sense'

I am not very good with this so therefore my call for help

Regards
Rahul

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


Lesenswert?

Rahul schrieb:

> I have an LED Tablelamp which uses this IR3M92N4 SHARP driver. I looked
> up the datasheet and it said that to dim it I need a PWM frequency of
> 1khz.

I don't find that in the datasheet. And it seems this IC just turns 
on/off it's 210kHz switcher, so the PWM frequency shouldn't matter much. 
I suggest to try it with 146Hz first and if that makes any problems, try 
580Hz next. 4.7Khz would be too much IMO.

For 580Hz you have to change this line:
1
TCCR0B = (_BV(CS02));


to that:
1
TCCR0B = (_BV(CS01) | _BV(CS00));


> I tried Playing with the code before I wrote to you and got the
> following error in WINAVR
>
>   C:\Users\rahul\Desktop\dimmer/main.c:136: undefined reference to
> `tinytouch_init'
> C:\Users\rahul\Desktop\dimmer/main.c:140: undefined reference to
> `tinytouch_sense'

Those functions are in TinyTouchLib.c. You must include that in your 
project to have it compiled and linked in.

von René H. (Gast)


Lesenswert?

Danke Axel.

Grüsse,
René

von Rahul (Gast)


Lesenswert?

Hi

I tried the original 146hz HEX . the led flickered like crazy.

I then tried your suggestion for 580hz and recompiled it. Success. the 
led was stable and dimming properly.

I then wired the touch wire to the metal base of the tablelamp. it went 
crazy. I had  no control.  Flashing led etc.


what do you think is wrong. ?

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


Lesenswert?

Rahul schrieb:
> I tried the original 146hz HEX . the led flickered like crazy.
> I then tried your suggestion for 580hz and recompiled it. Success. the
> led was stable and dimming properly.

Good.

> I then wired the touch wire to the metal base of the tablelamp. it went
> crazy. I had  no control.  Flashing led etc.
> what do you think is wrong. ?

The QTouchADC sensing method works only for rather small sensors. The 
whole lamp base will 1. have too much capacitance to earth by itself and 
2. will pickup 50/60Hz noise from the mains power line. You need a 
dedicated sensor or a different sensing method.

Lamps powered by mains typically use a sensing method where the 50Hz 
signal as such is detected.

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.