Inkrementalgeber Maus an ATTiny24 - Strom sparen

OP #4088814
Lesenswert?

Hallo Forum,

ich möchte zur Bewegungserkennung einen Inkrementalgeber aus einer Maus 
verwenden. Da das Gerät batteriebetrieben sein soll, versetze ich den 
Tiny in den Sleep-Mode und lasse ihn durch den Interrupt am 
Inkrementalgeber erwachen. Das Problem ist die Led im Inkrementalgeber, 
die ständig 18 mA zieht. Die würde ich gerne über einen Pin am Tiny 
ausschalten und erst wieder bei Bedarf einschalten, habe hier aber das 
typische Henne-Ei-Problem,
ohne Led kein Interrupt... ich habe einfach keine Idee, wie ich das 
lösen könnte.

bisheriger Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/sleep.h>
4
#define F_CPU 800000UL
5
#include <util/delay.h>
6

7
unsigned char level_old=0;
8
unsigned char level_new=0;
9
unsigned char counter=0;
10

11
void beep(void){        //Piezo-Element ansteuern
12
  
13
  int i = 0;
14
  for(i = 1;i<50;i++){
15
  
16
  PORTB |=  (1<<PB1);  // setze PB1 high
17
  PORTB &= ~(1<<PB2);  // setze PB2 low
18
  _delay_us(190);
19
  PORTB &= ~(1<<PB1);  // setze PB1 low
20
  PORTB |=  (1<<PB2);  // setze PB2 high
21
  _delay_us(190);
22
 
23
  }  
24
}
25

26
int main(void){
27
  
28
  DDRB |= ((1<<PB1)|(1<<PB2));//PB1 und PB2 Ausgang Piezo-Element
29
  ACSR|=(1<<ACD);              //Komperator aus
30
  sei();                      //Interrupt freigeben
31

32
  while(1){
33
 
34
  GIMSK |= (1 << PCIE0);               //Interupt freigeben   
35
  PCMSK0 |= (1 << PCINT5);            //Maske PCINT5 freigeben
36
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);//Sleep Mode setzen
37
  sleep_mode();                       //Schlafen
38
  GIMSK &= ~(1 << PCIE1);              //Interrupt aus
39

40
    if (!(PINA & (1<<PA5))){          //PINA5 Inkrementalgeber einlesen
41
      level_new = 0;                   //low    
42
    } 
43
    else
44
    { 
45
      level_new=1;                    //high
46
    }
47
    if(level_new!=level_old){    //vergleiche alte und neuen Status
48
      counter++;                //Zähler erhöhen
49
        if(counter==25){        //Zähler 25 ?
50
          beep();  
51
          counter=0;            //Zähler zurücksetzen
52
        }
53
    }
54
  level_old=level_new;          //alter Status wird neuer Status
55
  }
56
}
57

58
ISR (PCINT0_vect){                    //Interrupt-Routine
59

60
}
OP #4088973
Lesenswert?

Ich versuche die Bewegung einer Schnur mit Hilfe einer Rolle und dem 
besagten Inkrementalgeber zu erkennen. Gibt es so etwas  evtl. auch als 
mechanische Variante, um die LED einsparen zu können und den 
Flankenwechsel auszuwerten? Es darf nur nicht zu viel Kraft kosten um 
die Mechanik zu bewegen.
Kennt jemand vielleicht was in der Richtung?
Gast #4088986
Lesenswert?

Evtl Magnetisch über Hallswitches?

Oder einen Singleturn/Multiturn-Magnetsensor?
Bei Singleturn musst du dann immer nur so oft einschalten das du bei 
maximaler Verfahrgeschwindigkeit mindestens eine Umdrehung mitbekommt...
Gast #4089070
Lesenswert?

Die LEDs kann man schon Takten. Die Abfrage direkt über die 
Interruptsist so oder so nicht gut für Incrementalgeber. Da ist Polling 
mit einer nicht zu hohen Geschwindigkeit schon in Ordnung: also etwa 
alle 500 µs die LEDs einschalten, nach vielleicht 20 µs wieder 
auschalten und dann sehen was am Pin ankommt. Bei der Auswertung muss 
man ggf. sehen das die schnell genug wird - die Reaktion auf Licht an 
ist ja zum Glück die schnellere. Ggf. braucht man den Komparator Eingang 
für etwas mehr Empfindlichkeit.

Die maximale Geschwindigkeit ist dann halt begrenzt, auf z.B. 1000 
Schritte je Sekunde.
(Firma: matzetronics) #4089085
Lesenswert?

Andreas Fiedler schrieb:
> Hallsensor ist eine gute Idee, manchmal hat man einfach eine Blockade im
> Hirn......
>
> Danke für den Tip!

Allerdings benötigt auch ein Hallsensor einen Querstrom, damit er 
funktioniert. Mit ein bisschen Glück findest du aber welche, die mit 
deutlich weniger als 18mA auskommen. Alte mechanische Mäuse hatten auch 
mal mechanische Encoder, die sich leicht drehen, und es könnte dir auch 
gelingen, aus einem normalen Drehgeber die Rastung zu entfernen.
OP #4089118
Lesenswert?

Hab mir gerade mal das Datenblatt vom TLE4905 G (Siemens) 
Unipolar-Hall-Switch angesehen, dort steht Output leakage current 10uA 
bei 18 Volt Versorgung, das klingt doch schon recht gut, ich hoffe ich 
hab das richtig interpretiert. Ich werde die Schaltung mal aufbauen und 
messen.
Vielleicht findet sich in meiner Ersatzteilkiste auch noch eine alte 
Maus, mit mechanischem Geber, die ich evtl. ausschlachten kann.
Die Auswertegeschwindigkeit muss gar nicht so hoch sein, es muss nur 
erkannt werden, ob sich die Schnur bewegt, die Richtung und 
Geschwindigkeit sind nicht so wichtig.

Danke für die guten Anregungen!
(Firma: matzetronics) #4089172
Lesenswert?

Rufus Τ. Firefly schrieb:
> Welches Datenblatt?

Das DB des TLE4905, den der TE sich, wie oben erwähnt, als Hallsensor 
rausgesucht hatte.
http://www.datasheetcatalog.com/datasheets_pdf/T/L/E/4/TLE4905.shtml

Andreas Fiedler schrieb:
> Supply Current ist sozusagen der Strom, der immer fließt, sobald eine
> Spannung anliegt?

So isses. Der Hallsensor braucht einen kontinuierlichen Querstrom, um zu 
funktionieren, wird im DB auch kurz skizziert.
Gast #4089287
Lesenswert?

Andreas Fiedler schrieb:

> die haben aber den Vorteil, dass jemand auf die Taste drückt, sobald er
> weitermachen will, genau der fehlt mir!

Den nutzen sie aber erst bei langen Zeiten der Inaktivität, vorher 
machen sie noch was anderes...

Und genau das ist auch alles, was du tun kannst. Eben weil dir das 
Knöpfchen fehlt...
Gast #4089510
Lesenswert?

Er kann ja die LED ausschalten. Muss aber mindestens in einem Raster 
Wiedereinschalten, das er bei der schnellsten Bewegung keine Impulse 
verliert.
Den Sprung durch das einschalten muss er halt ignorieren.

Bei einer Maus ist es auch egal wenn man beim Wiedereinschalten erst mal 
1000 Impulse verliert.
Dass das passiert merkt man auch ab und zu, wenn man die Maus los 
schiebt und der Zeiger kurz hakelt.

Keine Ahnung ob das für seine Anwendung reicht. Das muss er selbst 
entscheiden.
#4089789
Lesenswert?

wie waers denn mit nem billigen beschleunigungssensor?

http://www.analog.com/media/en/technical-documentation/data-sheets/ADXL345.pdf

das feine, das ding kann mit interrupt auf aktivitaet/inaktivitaet 
reagieren und hat nen verbrauch von nur 23uA, der durch standby etc 
auchnoch ordentlich gesenkt werden kann. musst dir quasi nurnoch 
gedanken ueber den mechanischen aufbau machen...
#4090161
Lesenswert?

Andreas Fiedler schrieb:
> Ich habe eine Maus mit mechanischem Geber gefunden, das würde ich gerne
> mal testen.
Wie oft und wie viel wird denn das Teil bewegt? Da sollte man den 
Verschleiß im Auge behalten!

> Ist ein pull-down am Pin des AVR strommäßig günstiger oder ein pull-up?
der Strom ist der gleiche, egal ob Pullup oder Pulldown - das Problem 
ist eher das in der Ruhestellung mit großer Warscheinlichkeit wenigstens 
einer der beiden Schalter geschlossen ist und somit über den Pullup/down 
immer Strom fließt. Also so hochohmig wie möglich machen.

Sascha
OP #4090372
Lesenswert?

Randa L. schrieb:
> wie waers denn mit nem billigen beschleunigungssensor?

Gute Idee, das Datenblatt muss ich aber erstmal verdauen, wie gesagt, 
ich bin ein elektronischer Laie.

Amateur schrieb:
> Schau Dir mal:
> STEC12E05 von "R" an.

wie sieht es mit der "Schwergängigkeit" des Teils aus? Allzuviel Kraft 
habe ich nicht zur Verfügung, da die Welle nur von einer lose 
aufgelegten Schnur bewegt wird.

Peter II schrieb:
> warum eigentlich kein reed-kontakt und ein kleines Magnet.
>
> Braucht 0mA und kann zuverlässig den Tiny aufwecken.

hier braucht man doch aber auch eine Pull-up/down, oder liege ich da 
falsch?

Ist meine Rechnung korrekt, dass bei 5 V Betriebsspannung und 10 k 
Pull-up/down ca. 0,5 mA Strom fließen?
#4090430
Lesenswert?

Andreas Fiedler schrieb:
> Peter II schrieb:
>> warum eigentlich kein reed-kontakt und ein kleines Magnet.
>> Braucht 0mA und kann zuverlässig den Tiny aufwecken.
> hier braucht man doch aber auch eine Pull-up/down, oder liege ich da
> falsch?
ja den brauchst du, Strom fließt aber nur wenn er Magnet gerade am 
Kontakt ist.

> Ist meine Rechnung korrekt, dass bei 5 V Betriebsspannung und 10 k
> Pull-up/down ca. 0,5 mA Strom fließen?
Ja, du kannst den Pullup aber auch größer machen - es sei denn du willst 
zwischen Sensor und μC noch eine größere Entfernung mit Kabel 
überbrücken.

Oder wie in meinem Bild mit 2 Reedkontakten die bei 0° und 180° 
positioniert werden müssten.
Der eine lädt den C und erzeugt einen pos. Impuls, der zweite entlädt 
ihn wieder. Im Ruhezustand kann kein Strom fließen.

Sascha
Angehängte Dateien:
OP #4090485
Lesenswert?

Sascha Weber schrieb:

> Oder wie in meinem Bild mit 2 Reedkontakten die bei 0° und 180°
> positioniert werden müssten.
> Der eine lädt den C und erzeugt einen pos. Impuls, der zweite entlädt
> ihn wieder. Im Ruhezustand kann kein Strom fließen.

Ich glaube, das gefällt mir sehr gut, das kann ich auch fachlich noch 
nachvollziehen und basteln.

> es sei denn du willst
> zwischen Sensor und μC noch eine größere Entfernung mit Kabel
> überbrücken.

Nein, Sensor und µC sitzen im selben Gehäuse nebeneinander, kein langer 
Weg. Wie wäre denn der größtmögliche Wert des Widerstandes und welche 
Kapazität sollte der Kondensator haben? Der Schaltvorgang sollte max 
20-30 mal pro Sekunde erfolgen.

Danke Andreas
#4091525
Lesenswert?

Hallo,

die Werte würde ich jetzt einfach mal durch probieren ermitteln und mit 
100nF und 10k anfangen. Bei meiner Schaltung oben sollte allerdings noch 
eine Diode am μC Eingang rein (K an den Eingang) sonst hast du dort beim 
entladen des C eine negative Spannung. Ein kleiner R von 100Ohm in Reihe 
zum unteren REED-Kontakt sollte zur Begrenzung des Entladestroms noch 
mit rein.

30Hz sollten mit einem REED-Kontakt gerade noch gehen.

Sascha

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren