Go Down

Topic: Ich brauche mal wieder etwas hilfe =) (Read 21010 times) previous topic - next topic

nix_mehr_frei

Hallo,

Spindeltrimmer sind eine gute Option. Allerdings sollte der Wertebereich von der Größenordnung her auch passen. Hast du ein Digitalmultimeter? Hat es auch einen Widerstandsmessbereich? Wenn ja, dann einfach mal die Verkabelung vom Poti ab und an den Anschlüssen, wo es angeschlossen war, messen. Aber pass auf, das du die Messpitzen oder die Anschlüsse anfasst, um die Messung nicht zu verfälschen. Potis gibt es immer in 1; 2,2 und 4,7 - mit 10 geht das Spiel wieder von vorne los.
Wenn du meinetwegen 1,1K misst, dann kaufst du ein 2,2k Poti.
Prinzip verstanden?
Die Fotowiderstände kannst du ebenfalls mit dem Multimeter testen. Von einem sehr hohen Widerstand bei Dunkelheit sinkt der Wert um mehrere Zehnerpotenzen bei Sonnenlicht. Dunkel 1 Megaohm, hell 10K sind Richtwerte.
Das mit der spektralen Empfindlichkeit ist ein guter Einwurf. Es gibt viele Typen, die ab 450nm - das ist ca. türkis - ansprechen. Glühlampn und Halogenlampen senden Unmengen Infrarot-Licht, da passt dein Fototransistor. Wenn du aber einen Fotoblitz messen willst, da ist mehr blau und UV dabei, da brauchst du einen breitbandigeren Fototransistor. Fotowiederstände haben ein ähnliches Spektrum, wie das menschliche Auge. Wobei es ja nach Material (seltene) Ausnahmen gibt.
Um besser den Blitz und weniger das Umgebungslicht zu sehen, rate ich dir, die Fototransistoren in lichtdichte Röhrchen zu stecken, am besten aus Metall. dann mußt du aber recht genau auf deine Lichtquelle zielen. Z.B. mit einem Stativ.
Mit der Abschwächung über einen Basiswiderstand habe ich keine Erfahrung. Klingt aber logisch, wenn ich mit einem Widerstand einen Teil des Fotostromes der Fotodiode (B-->E  p/n Übergang als Ersatzschaltbild) nach Masse ableite.
Ich weiß nur aus eigener Erfahrung, das Fototransistoren ungemein empfindlich auf IR-Licht reagieren und Dinge, von denen man es nicht vermutet, für IR-Licht durchlässig sind. Deshalb auch mein Rat mit den Metallröhrchen. schwarze Dinge (Plastik, Glas) sind oft IR durchlässig. Sogar Gummi!!! Habe ich bei Mostkappen festgestellt  :smiley-eek:
Was früher auch ein guter IR-Filter für den Hausgebrauch war, belichteter Farbfilm! Der "schwarze" Film filterte das den sichtbaren Anteil ziemlich perfekt weg. Aber im Zeitalter der Digitalfotografie weiß bald keiner mehr, was überhaupt ein Film ist  :P
Ich habe auch mal von Versuchen gelesen, LEDs als Fotodioden zu verwenden. Das soll mit ungefärbten Gehäusen sogar recht gut gehen. Allerdings ist die spektrale Empfindlichkeit aller Typen, egal in welcher Farbe sie leuchten würden, immer im roten und nahen IR-Bereich.

Gruß Gerald
rot ist blau und Plus ist Minus

Serenifly


Mit der Abschwächung über einen Basiswiderstand habe ich keine Erfahrung. Klingt aber logisch, wenn ich mit einem Widerstand einen Teil des Fotostromes der Fotodiode (B-->E  p/n Übergang als Ersatzschaltbild) nach Masse ableite.

Es ging mehr eher darum, dass er gesagt hat, dass der eine Transistor sehr viel weniger empfindlich ist und mehr Licht braucht. Exemplar-Streuung vielleicht (falls das Poti richtig eingestellt ist).



Quote
Ich habe auch mal von Versuchen gelesen, LEDs als Fotodioden zu verwenden.

In Sperrrichtung ja. Das geht sehr gut mit einem Controller, da man die I/Os einfach umschalten kann. Man legt High an und lädt damit die Sperrschicht auf. Wie bei CCDs ist dann die Ladung proportional zum Lichteinfall. Dann schaltet man auf Eingang und misst wie lange es die Sperrschicht zum entladen braucht. Die Ladung fließt nach Masse ab und irgendwann kippt die Spannung unter die Schwelle des Pins.

Empfindlichkeit ist da glaube ich aber nicht so toll. Und es geht auch nicht schnell. Dann kann man auch die LED entsprechend schalten was man gemessen hat. Also die LED sowohl als Sensor als auch Aktor verwenden.

Fabio1989

SOOOO meine lieben =)

der rein "technische " part funktioniert 100 % tig ;-)

bei dem skript beekomme ich diese meldung

Code: [Select]
volatile boolean sensor1Triggered;
volatile boolean complete;
volatile unsigned long time1;
volatile unsigned long time2;

const int  mausKlick = 13; 

void setup()
{
     Serial.begin(9600);
     attachInterrupt(0, sensor1, RISING);    //Pin 2
     attachInterrupt(1, sensor2, RISING);    //Pin 3
     pinMode(mausKlick, OUTPUT);
     digitalWrite(mausKlick, LOW)
}

void sensor1()
{
     if(sensor1Triggered == false)
     {
         time1 = micros();
         sensor1Triggered = true;
     }
}

void sensor2()
{
       if(sensor1Triggered == true)
       {
           time2 = micros();
           complete = true;
       }
}

void loop()
{
        if(complete == true)
        {
             delayMicroSeconds((time2 - time1) / 2);        //Alternativ hier wie gesagt delay((time2 - time1) / 2000); wenn du über 16ms bist
             digitalWrite(mausKlick, HIGH);

             delay(500);                                   //LED nach 500ms wieder LOW. Das kann man auch anpassen
             digitalWrite(mausKlick, LOW);

              Serial.print("Zeit: ")
              Serial.println((time2 - time1) / 2);
           
              sensor1Triggered = false;
              complete = false;
        }
}


Code: [Select]
sketch_jan09a.ino: In function 'void setup()':
sketch_jan09a:15: error: expected `;' before '}' token
sketch_jan09a.ino: In function 'void loop()':
sketch_jan09a:39: error: 'delayMicroSeconds' was not declared in this scope
sketch_jan09a:46: error: expected `;' before 'Serial'



wenn das jetzt noch geregelt wird is alles gut :D

Serenifly

#63
Jan 09, 2014, 07:07 pm Last Edit: Jan 09, 2014, 07:09 pm by Serenifly Reason: 1
Steht eigentlich alles da. Doof nur das die Arduino IDE nicht so einfach die Zeilennummern anzeigt. Da hatte ich zweimal einen Strichpunkt vergessen. Und einmal Groß und Kleinschreibung. Schande über mich :(

Das hier kompiliert:
Code: [Select]

volatile boolean sensor1Triggered;
volatile boolean complete;
volatile unsigned long time1;
volatile unsigned long time2;

const int  mausKlick = 13;  

void setup()
{
    Serial.begin(9600);
    attachInterrupt(0, sensor1, RISING);    //Pin 2
    attachInterrupt(1, sensor2, RISING);    //Pin 3
    pinMode(mausKlick, OUTPUT);
    digitalWrite(mausKlick, LOW);
}

void sensor1()
{
    if(sensor1Triggered == false)
    {
        time1 = micros();
        sensor1Triggered = true;
    }
}

void sensor2()
{
      if(sensor1Triggered == true)
      {
          time2 = micros();
          complete = true;
      }
}

void loop()
{
       if(complete == true)
       {
            delayMicroseconds((time2 - time1) / 2);        //Alternativ hier wie gesagt delay((time2 - time1) / 2000); wenn du über 16ms bist
            digitalWrite(mausKlick, HIGH);

            delay(500);                                   //LED nach 500ms wieder LOW. Das kann man auch anpassen
            digitalWrite(mausKlick, LOW);

             Serial.print("Zeit: ");
             Serial.println((time2 - time1) / 2);
         
             sensor1Triggered = false;
             complete = false;
       }
}




Aber poste wie gesagt mal die Werte die das auf Serial anzeigt!! Kann sein, dass du gar keine Mikrosekunden-Genauigkeit brauchst. Ich glaube Millisekunden würde hier reichen.

Und delayMicroseconds() geht nicht mit Werten über ca. 16000!

Fabio1989



Zeit: 224704
Zeit: 216306
Zeit: 216310
Zeit: 224674
Zeit: 224710

das kommt raus ... is zu groß oder ?  lieber auf mills  gehen ?

Serenifly

#65
Jan 09, 2014, 07:37 pm Last Edit: Jan 09, 2014, 07:43 pm by Serenifly Reason: 1
Ja, du willst millis() :) Das sind ca. 220ms. Ist das ein realistischer Wert für die Anwendung?

Aber keine große Änderung. Einfach micros() durch millis() ersetzen. Und delayMicroseconds() durch delay()

Das kann man auch schöner machen, aber ich nehme mal an du willst in der Zeit sonst nichts anderes machen. Daher ist es wahrscheinlich ok wenn das mal blockiert bis da was geschaltet hat.


Code: [Select]

volatile boolean sensor1Triggered;
volatile boolean complete;
volatile unsigned long time1;
volatile unsigned long time2;

const int  mausKlick = 13;  

void setup()
{
    Serial.begin(9600);
    attachInterrupt(0, sensor1, RISING);    //Pin 2
    attachInterrupt(1, sensor2, RISING);    //Pin 3
    pinMode(mausKlick, OUTPUT);
    digitalWrite(mausKlick, LOW);
}

void sensor1()
{
    if(sensor1Triggered == false)
    {
        time1 = millis();
        sensor1Triggered = true;
    }
}

void sensor2()
{
      if(sensor1Triggered == true)
      {
          time2 = millis();
          complete = true;
      }
}

void loop()
{
       if(complete == true)
       {
            delay((time2 - time1) / 2);
            digitalWrite(mausKlick, HIGH);

            delay(500);                                   //LED nach 500ms wieder LOW. Das kann man auch anpassen
            digitalWrite(mausKlick, LOW);

             Serial.print("Zeit: ");
             Serial.println((time2 - time1) / 2);
         
             sensor1Triggered = false;
             complete = false;
       }
}



EDIT:
Moment mal, das ist glaube ich noch nicht ganz was du willst:
Quote

LDR 1 bekommt ein Signal  = Stoppuhr START

LDR 2 bekommt ein Signal = Stoppuhr STOP   ( die Lichtblitze erfolgen immer im wechsel )

Arduino Rechnet :  gemessene Zeit  / 2

LDR 1 bekommt Signal  = Delay  gemessene zeit durch 2


Also du willst 3 mal messen und erst nach dem dritten mal die Differenz zwischen den zwei ersten zwei haben? Moment, ich ändere es mal...Nicht schwer.

Serenifly

Ok, in dieser Version wird jetzt nach dem Auslösen von Sensor 2 nochmal abgefragt ob Sensor 1 ausgelöst hat und erst dann macht  er das Delay mit der Differenz zwischen den zwei ersten Messungen. Siehe die zweite if-Abfrage im Sensor1 Interrupt. Theoretisch...

Code: [Select]

volatile boolean sensor1Triggered;
volatile boolean sensor2Triggered;
volatile boolean complete;
volatile unsigned long time1;
volatile unsigned long time2;

const int  mausKlick = 13; 

void setup()
{
  Serial.begin(9600);
  attachInterrupt(0, sensor1, RISING);    //Pin 2
  attachInterrupt(1, sensor2, RISING);    //Pin 3
  pinMode(mausKlick, OUTPUT);
  digitalWrite(mausKlick, LOW);
}

void sensor1()
{
  if(sensor1Triggered == false)
  {
    time1 = millis();
    sensor1Triggered = true;
  }
  else if(sensor2Triggered == true)
  {
    complete = true;
  }
}

void sensor2()
{
  if(sensor1Triggered == true)
  {
    time2 = millis();
    sensor2Triggered = true;
  }
}

void loop()
{
  if(complete == true)
  {
    delay((time2 - time1) / 2);
    digitalWrite(mausKlick, HIGH);

    delay(500);                                   //LED nach 500ms wieder LOW. Das kann man auch anpassen
    digitalWrite(mausKlick, LOW);

    Serial.print("Zeit: ");
    Serial.println((time2 - time1) / 2);

    sensor1Triggered = false;
    sensor2Triggered = false;
    complete = false;
  }
}


Fabio1989

hallo =)

also bis jetzt läuft es aschon recht gut ...

ein FETTEEEESS DAAAAAANKEEEE !!!! an alle die sich hieran beteiligt haben und so viel geduld mit mir hatten  ]:D

jetzt müsste ich es nurnoch etwas verfeinern :D

die aktion unter pin 13 ist etwas zu laaahm ..,.  kann man das iwi beschleunigen =?  vill auch über das Gatter ... oder mit einer art verstärker ?

dickes danke jetzt schon für eure antworten ;)

Serenifly

Was meinst du genau mit "lahm"?

Will du eigentlich das:
Quote

LDR1 an (zum zweiten mal) -> Delay  -> LED an  ....LED aus


Oder das:
Quote

LDR1 an -> LED an -> Delay -> LED aus


Also soll die LED nach der Verzögerung angeschaltet werden (und dann wie lange?) oder soll sie solange wie die Verzögerung an sein?

Fabio1989

aslo so wie es jetzt ist passt es schon ..... um die LED perzieser zu schalten ...also knapp und genau .. hab ich das Delay  auf 25 runter gesetzt

das mit der reihenfolge passt soweit , sprich erst delay dann LED an dann wieder aus .....

ähhm .......... was ist denn wenn ich die LEd nicht über 13 ( weist du wie hoch der wiederstand vor dem pin ist ?)  sondern über z.b 12 laufen lasse wird es dann noch prezieser ?

Fabio1989


Serenifly

Wie merkst du dass das nicht genau ist?

Die beste Lösung ist das sicherlich nicht. Aber so hat man eigentlich ne Auflösung im Millisekunden Bereich. Wenn du da Werte von um die 200ms hast, sollte das theoretisch reichen. Und super Lösungen mit extremer Präzision übersteigen deine Fähigkeiten. Das kann man nicht mal so auf die schnelle hinschreiben ohne das richtig zu testen.

Rein theoretisch könnte man da jetzt messen wann die Transistoren auslösen und wann genau der Ausgang schaltet. Aber nur mit einem Mehrkanal-Oszilloskop...

Fabio1989

^^

sowas habe ich nich .... du hattest mir doch gesagt das ich bei dem alten problem mit den led´s und dem 4093 einen "versterker" einbauen soll ...

kann ich sowas nich auch vor die LDR´setzten das die eine noch höhere leistung haben ?

Serenifly

Das war was anderes. Du hast jetzt Darlington-Phototransistoren (die verwendest du doch noch, oder?). Die machen einen sehr großen Strom und schalten schnell.

Ich verstehe jetzt nicht genau dein Problem. Phototransistoren haben eigentlich eine Schaltzeit in µs Bereich (im Gegensatz zu den ms von LDRs). Der BPX99 hat laut Datenblatt maximal 80µs Anstiegszeit. Die Schaltung kann man sicherlich verbessern. Aber das war mit der einfachsten Variante ja schon schwer genug für dich.

Ich kann das auch nicht einfach so aus der Ferne diagnostizieren, was man da jetzt noch machen könnte. Es ist was anderes wenn man selbst davor sitzt.

Fabio1989

ja die verwende ich noch ...

ja da muss ich dir recht geben ... ok wenn die dinger schnell genug sind dann liegt es sicherlich an einer andernen komponente .. danke dir erstmal =9

falls dir noch spntan etwas einfällt dann kannste dich ja melden .. schönes wochenende dir =)

Gruß Fabio

Go Up