Forum: Mikrocontroller und Digitale Elektronik Lichtschranke Arduino Attiny 84 zu "träge"


von Georg M. (georgm)


Lesenswert?

Hallo,

ich habe eine Lichtschranke mit einem LDR und einer Laserdiode gebaut.
Gesteuert wird das ganze über einen Attiny 84.
Damit soll verzögert eine Kamera ausgelöst werden.

Hier ist der Code:
1
#include <LiquidCrystal.h>
2
3
int potipin = A0;        // 13
4
int sensorpin = A1;      // 12
5
int ausloeserpin= 2;     // 11
6
int fokuspin = 3;        // 10
7
int tasterpin = 4;       // 9
8
LiquidCrystal lcd(10,9,8,7,6,5); //attiny ( 2,3,5,6,7,8)
9
10
int ausloesezeit=50;
11
int fokuszeit = 10000;
12
int ausloesewert=500;
13
int potieinleseintervall= 200; 
14
15
16
int fokuszustand = LOW;
17
int verzoegerung= 0;
18
unsigned long potimillis;
19
20
const int numReadings = 5;
21
int readings[numReadings];      // the readings from the analog input
22
int index = 0;                  // the index of the current reading
23
int total = 0;                  // the running total
24
int average = 0;                // the average
25
26
27
void setup(){
28
  lcd.begin(16, 2);
29
  pinMode(ausloeserpin, OUTPUT);
30
  pinMode(fokuspin, OUTPUT);
31
  pinMode(tasterpin, INPUT);
32
  lcd.print("Verzoegerung:");
33
  lcd.setCursor(0, 1);
34
  lcd.print(verzoegerung);
35
  lcd.print("  mSekunden");
36
    
37
  for (int thisReading = 0; thisReading < numReadings; thisReading++) // initialize all the readings to 0: 
38
    readings[thisReading] = 0;
39
}
40
41
void loop(){
42
43
  if((millis()-potimillis) > potieinleseintervall){
44
    
45
      // subtract the last reading:
46
    total= total - readings[index];         
47
    // read from the sensor:  
48
    readings[index] = (map(analogRead(potipin),0,1023,0,700));
49
    // add the reading to the total:
50
    total= total + readings[index];       
51
    // advance to the next position in the array:  
52
    index = index + 1;                    
53
      // if we're at the end of the array...
54
    if (index >= numReadings)              
55
      // ...wrap around to the beginning: 
56
      index = 0;                           
57
     // calculate the average:
58
    verzoegerung = total / numReadings;  
59
    
60
    
61
    lcd.setCursor(0, 1); 
62
    lcd.print((verzoegerung/10)*10);
63
    lcd.print("  mSekunden");    
64
    
65
    fokuszustand = digitalRead(tasterpin);
66
    digitalWrite(fokuspin, fokuszustand);
67
  }
68
  
69
  
70
  if((analogRead(sensorpin)>ausloesewert) && (fokuszustand == HIGH) ){
71
    delay(verzoegerung);
72
    digitalWrite(ausloeserpin, HIGH);
73
    delay(ausloesezeit);
74
    digitalWrite(ausloeserpin, LOW);
75
    fokuszustand == LOW;
76
    digitalWrite(fokuspin, fokuszustand);
77
    delay(1000);
78
  }
79
80
}

Leider ist die Lichtschranke etwas träge, sodass kurze Unterbrechungen 
nicht erkannt werden.
Woran kann das liegen?

Viele Grüße

Georg

von spess53 (Gast)


Lesenswert?

Hi

>Woran kann das liegen?

daran

>ich habe eine Lichtschranke mit einem LDR und einer Laserdiode gebaut.

Als Empfänger solltest du mindestens einen Fototransistor nehme. LDRs 
sind zu langsam.

MfG Spess

von Georg M. (georgm)


Lesenswert?

Danke für deine Antwort
spess53 schrieb:
> Als Empfänger solltest du mindestens einen Fototransistor nehme.

Dieser sollte dafür passen oder?
http://www.reichelt.de/Fotodioden-etc-/BPW-40/3/index.html?&ACTION=3&LA=2&ARTICLE=5806&GROUPID=3045&artnr=BPW+40

Was bedeuten:
Betriebsspannung    30 V
Gruppenstrom        0,5 mA
?

von dolf (Gast)


Lesenswert?

Georg M. schrieb:
> Dieser sollte dafür passen oder?

der SFH 300 FA-3/4 ist dank tageslichtfilter für lichtschranken wohl 
besser geeignet.
als lichtquelle dann natürlich ne ir led/laser.

von Georg M. (georgm)


Lesenswert?

Tageslicht gibt es dort sowieso nicht :)
Der Attiny ist aber mit 8Mhz flott genug und der Code auch nicht langsam 
geschrieben oder?

von ??? (Gast)


Lesenswert?

Georg M. schrieb:
> sodass kurze Unterbrechungen
> nicht erkannt werden.

Was sind "kurze Unterbrechungen"?
Wie kurz wird noch erkannt und wie kurz soll erkannt werden?
Ein LDR kann durchaus Unterbrechungen im ms-Bereich erkennen (z.B. 
10ms). Nur für die Übertragung höherfrequenter Signale ist er nicht 
geeignet.

Wenn du die Laserdiode mit einer höheren Frequenz modulieren würdest, um 
unabhängig vom Umgebungslicht zu sein, dann wäre ein Fototransistor 
zwingend notwendig, um die Frequenz auch empfangen zu können. Wenn du 
aber einen gleichmäßigen Lichtstrom aussendest, reicht ein LDR mit 
seiner typ. Ansprechzeit von ein paar ms aus.
Es sein denn, du willst die Lichtschranke für die Zählung von sehr 
schnellen Ereignissen (mehr als 100 Ereignisse pro Sekunde) benutzen. 
Dann ist auch wieder ein Fototransistor angesagt.

von Georg M. (georgm)


Lesenswert?

Kurze Unterbrechungen erzeuge ich, wenn ich so schnell ich kann mit 
meiner flachen Hand durch die Lichtschranke "haue".

von Max H. (hartl192)


Lesenswert?

Georg M. schrieb:
> der Code auch nicht langsam geschrieben oder?
DigitalRead/-Write sind nicht wirklich schnell.

von c-hater (Gast)


Lesenswert?

Georg M. schrieb:

> Kurze Unterbrechungen erzeuge ich, wenn ich so schnell ich kann mit
> meiner flachen Hand durch die Lichtschranke "haue".

Kannst du das auch mal in Zahlenwert+Einheit fassen?

Weil: wir wissen nicht, ob du ein trainierter KungFu-Kämpfer mit einer 
schmalen asiatischen Hand bist oder eine Coach-Potato mit Griffeln wie 
Klodeckel. Der Unterschied zwischen diesen beiden Extremen dürfte 
bezüglich der Unterbrechungszeit eine ganze Größenordnung ausmachen.

Um dir das mal zu erklären: Das SI-System der Maßeinheiten wurde 
eingeführt, weil Ellen, Füße, Höfe, Kerzen, Pferde und ähnliches halt 
nicht genügen, um einen Sachverhalt hinreichend genau zu beschreiben.

Das sollte eigentlich auch bis zu Arduino-Benutzern schon durchgedrungen 
sein...

von San L. (zwillingsfreunde)


Lesenswert?

c-hater schrieb:
>> Kurze Unterbrechungen erzeuge ich, wenn ich so schnell ich kann mit
>> meiner flachen Hand durch die Lichtschranke "haue".
>
> Kannst du das auch mal in Zahlenwert+Einheit fassen?

Informationen verlangen ist ja schön und gut... aber man kanns auch 
durchaus übertreiben.
Meine Güte, beweg deine Hand ein bisschen hin und her und schätz die 
Zeit. Wie soll dir der TO das in Zahlen + Einheit ausdrücken? Denkst du 
er hat eine Messeinrichtung für sowas zuhause? Ein bisschen den Kopf 
einschalten genügt hier...

Wird das hier im Forum langsam zum Trend, dieses ständige verlangen nach 
Informationen welche man sich mit ein bisschen Menschenverstand auch 
selbst erdenken kann?

von Ulrich (Gast)


Lesenswert?

Mit der Hand schnell durch die Lichtschranke bekommt man schon recht 
kurze Zeiten im Bereich 1/100 Sekunde. Mit 1 Finger wären auch unter 
1/1000 s drin.

Je nachdem wie die Empfindlichkeit eingestellt ist, kann das für einen 
LDR zu langsam sein. Das Signal vom LDR geht halt nicht gleichmäßig 
zurück, sondern erst relativ schnell und dann immer langsamer. Es kommt 
auch auf die LDR Type. Ein Fototransistor kann da schon gut als 1:1 
Ersatz dienen.

Das Programm ist zwar wegen fehlender externer Teil nicht so ganz zu 
verstehen, aber es sieht sehr langsam aus. Da sind massive Pausen drin 
wo nichts reagiert - da kann noch fast eine Schildkröte durch laufen 
ohne das die Anspricht.

von Peter D. (peda)


Lesenswert?

Georg M. schrieb:
> delay(verzoegerung);
>     ..
>     delay(ausloesezeit);
>     ..
>     delay(1000);

Also wenn ich sowas sehe, sträuben sich mir die Nackenhaare hoch.
Da braucht man nicht zu fragen, warum was zu langsam ist.

von W.M. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Also wenn ich sowas sehe, sträuben sich mir die Nackenhaare hoch.
> Da braucht man nicht zu fragen, warum was zu langsam ist.

Nachdem das Programm im Auslöseblock ist, dürfte es schnurz-piep-egal 
sein, wie viele Delays da folgen. Nachdem die Bedingung
1
  if((analogRead(sensorpin)>ausloesewert) && (fokuszustand == HIGH) )
 erfüllt ist, dürfte die Kamera zeitbestimmen sein.
Die Frage war doch, warum kurze Unterbrechungen nicht erkannt werden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

W.M. schrieb:
> Die Frage war doch, warum kurze Unterbrechungen nicht erkannt werden.
Wäre mal interessant, wie lange das dauert:
1
    lcd.setCursor(0, 1); 
2
    lcd.print((verzoegerung/10)*10);
3
    lcd.print("  mSekunden");
Sicher länger als ...
>>> ... wenn ich so schnell ich kann mit
>>> meiner flachen Hand durch die Lichtschranke "haue".
So "durchzuhauen" schaffe ich locker in weniger als 20ms. Das habe ich 
gerade mal ausprobiert mit einen LDR. Ein Oszilloskop, und sei es noch 
so schäbig (hier war es mein altes Hameg HM307, weil das Tektronix 
gerade anderweitig beschäftigt ist), ist hier Gold wert...

von Peter D. (peda)


Lesenswert?

W.M. schrieb:
> Die Frage war doch, warum kurze Unterbrechungen nicht erkannt werden.

Wo in dem Code sollen denn die Unterbrechungen erkannt werden?


Kommentare sollen nicht die Operation nochmal nennen, sondern warum man 
etwas macht.
Z.B. was soll diese Zeile bewirken:

Georg M. schrieb:
> if((millis()-potimillis) > potieinleseintervall){

"potimillis" wird nirgends geschrieben, ist aber vermutlich vom Compiler 
mit 0 initialisiert.

von W.M. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> "potimillis" wird nirgends geschrieben, ist aber vermutlich vom Compiler
> mit 0 initialisiert.

Das ist vermutlich nicht beabsichtigt, stört aber auch nicht. Sobald der 
µC länger als potieinleseintervall Millisekunden läuft, wird er sich 
mit der Analogeingabe beschäftigen. Aber wer weiß wie lange der ganze 
Skalierungszirkus mit /map()/, die Berechnung von verzoegerung und die 
LCD-Ausgabe dauern.

Schon mit einem kleiner LA für unter 20 Euro aus der Bucht ließen sich 
diese Fragen beantworten.

von Georg M. (georgm)


Lesenswert?

Erstmal Danke für die vielen Antworten!

An c-hater:
siehe Beitrag von San Lue

An Ulrich:
Auf jeden Fall werde ich den LDR durch einen Phototransistor ersetzen

An Peter Dannegger:
Sobald die delays ausgeführt werden hat die Lichtschranke auch schon 
ausgelößt und soll dann auch wirklich für eine Sekunde garnicht mehr 
auslösen daher stört delay da nicht
Wie W.M. es auch erkannt hat.

An Lothar Miller:
Interessant, dass du die Möglichkeit hast, dies zu messen. 20 ms ist 
schon flott. Den LC-Display hätte ich halt schon gerne zur 
Zeiteinstellung.
Ich aktuallisiere den aber nur jede fünftel Sekunde um möglichst freie 
"Zeitfenster" für die Auslösung zu haben

An Peter Dannegger und W.M.:
Danke! da habe ich ein potimillis = millis(); vergessen
Was ist ein LA ?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Georg M. schrieb:
> Was ist ein LA ?
Sowas:
https://www.google.de/search?q=Logic+analyzer

Georg M. schrieb:
> ich habe eine Lichtschranke mit einem LDR und einer Laserdiode gebaut.
Eins noch: wie ist der LDR am uC angeschlossen?

Wenn ich du wäre, dann würde ich (weil ich ja ein Oszilloskop habe) 
einmal pro Durchlauf einen Pin auf high und sofort wieder auf low 
togglen. Dann könnte ich sehen, wie lange so ein Programmzyklus dauert. 
Das ist eine extrem wichtige Information, man sieht auf jeden Fall 
sofort, wenn da lange Ausreisser drin sind...

von Georg M. (georgm)


Angehängte Dateien:

Lesenswert?

Siehe Anschluss des LDR im Anhang.

Dort wo Sensor ist, habe ich den LDR angeschlossen.
Diesen würde ich dann durch einen Phototransistor ersetzen.
Vielleicht noch VCC und GND tauschen.

von 132 (Gast)


Lesenswert?

Es gibt auch LDRs die einige Sekunden brauchen bis sie reagieren ... nur 
für die Größenordnung. Manchmal ist das auch absolut erwünscht!

von B.C. (Gast)


Lesenswert?

132 schrieb:
> Es gibt auch LDRs die einige Sekunden brauchen bis sie reagieren ... nur
> für die Größenordnung.

Das hängt meist ganz entscheidend von der Grundhelligkeit ab.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Georg M. schrieb:
> Siehe Anschluss des LDR im Anhang.
Welchen Wert hat R6?

von Georg M. (georgm)


Lesenswert?

Lothar Miller schrieb:
> Welchen Wert hat R6?

Ich habe einen 10k Poti Angeschlossen

von Georg M. (georgm)


Lesenswert?

Nochmal danke an alle!
Für den Phototransistor bin ich wohl nicht genug
c-hater schrieb:
> trainierter KungFu-Kämpfer
.
Der reagiert einfach zu gut.

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.