Hulp nodig: wiel encoder trigger camera

Hoi,

Ik heb een wiel-encoder : kubler incremental encoder met 250 pulses per draai.

Ik wil deze verbinden met de arduino Uno. Wat hij moet doen/doorgeven is dat elke x m1 (2,5 meter) er een trigger gaat naar een camera. "maak foto"

Op de camera heb ik kabel blauw (opto input) en groen (opto ground). Hiermee kan ik de camera triggeren om een foto te maken.
Echter als ik deze nu rechtstreeks de wiel-encoder op de camera aansluit maakt hij super veel foto's. Niet goed dus.

Ik wil de Arduino Uno gebruiken om de pulses te reguleren. Lees, instellen dat hij elke 15 omwentelingen van de encoder 1 pulse doorgeeft.

Ik heb nu de code van Benny-Tommy Eriksen gebruikt, zie onderstaand.

Hoe kan ik op de Arduino Uno een output op twee pins zetten om een trigger door te geven aan de camera??

Wie kan mij helpen?

*/

// Encoder connect to digitalpin 2 and 3 on the Arduino.

volatile unsigned int counter = 0; //This variable will increase or decrease depending on the rotation of encoder

void setup() {
Serial.begin (9600);
//Setting up interrupt
//A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
attachInterrupt(0, ai0, RISING);

//B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
attachInterrupt(1, ai1, RISING);
}

void loop() {
// Send the value of counter
Serial.println (counter);
}

void ai0() {
// ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
// Check pin 3 to determine the direction
if(digitalRead(3)==LOW) {
counter++;
}else{
counter--;
}
}

void ai1() {
// ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
// Check with pin 2 to determine the direction
if(digitalRead(2)==LOW) {
counter--;
}else{
counter++;
}
}

Je zal vermoedelijk wel een weerstand in serie met een datapin moeten maken (iets van 330 ohm oid.). De opto GND gaat aan de GND van de Arduino

Hoi Nico,

Bedankt voor je reactie.

Kun je concreet wat voorbeelden geven. Eveneens hoe ik de code moet aanpassen/aanvullen om een trigger uit te sturen?

Hopelijk kun je me helpen....

Denk dat dit wel wil werken:

// Encoder connect to digitalpin 2 and 3 on the Arduino.

volatile unsigned int counter = 0; //This variable will increase or decrease depending on the rotation of encoder

uint32_t pulsTimer = 0;                // timer voor duur van de trigger
#define PULSE_PIN    5                // pin 5 is de trigger pin voor de camera
#define TRIGGER_TIME 100            // trigger tijd duurt 100 milliseconden. kun je dus aanpassen
#define AANTAL_ENCODER_PULSEN 2500    // aantal pulsen van de encoder waarna een foto wordt genomen

void setup() {
    Serial.begin(9600);
    //Setting up interrupt
    //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
    attachInterrupt(0, ai0, RISING);

    //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
    attachInterrupt(1, ai1, RISING);
}

void loop() {
    // Send the value of counter
    Serial.println(counter);
    //
    // kijk of er een trigger puls loopt
    //
    if (pulsTimer != 0) {
        //
        // hij loopt dus controleer of deze inmiddels verlopen is
        //
        if ((millis() - pulsTimer) > TRIGGER_TIME){
            //
            // klaar dus de trigger puls weer uitzetten
            //
            digitalWrite(PULSE_PIN, LOW);
            //
            // en zet te pulstimer weer uit
            //
            pulsTimer = 0;
        }
    }
    //
    // controleer of de encoderpulsen verlopen zijn
    //
    if (counter > AANTAL_ENCODER_PULSEN) {
        //
        // we moeten een foto nemen. Dus start de trigger puls
        //
        digitalWrite(PULSE_PIN, HIGH);
        //
        // en start de timer
        //
        pulsTimer = millis();
        //
        // en reset de teller voor volgende foto
        //
        counter = 0;
    }
}

void ai0() {
    // ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
    // Check pin 3 to determine the direction
    if (digitalRead(3) == LOW) {
        counter++;
    } else {
        counter--;
    }
}

void ai1() {
    // ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
    // Check with pin 2 to determine the direction
    if (digitalRead(2) == LOW) {
        counter--;
    } else {
        counter++;
    }
}

Hoi,

Thnx, ga het direct proberen....

"weerstand in serie met een datapin moeten maken (iets van 330 ohm oid.). De opto GND gaat aan de GND van de Arduino"

Heb ik de weerstand nog nodig? Suggesties welke te gebruiken?

Begrijp ik het goed dat dan GND opto op GND ardiono gaat
en
opto camera op PIN5?
Met indien nodig de weerstand tussen camera opto PIN5 en OPTO camera

Hoi Nico,

Ik heb hem nu aangesloten (nog zonder camera).
Ik kan wel de voorwaarste een beweging maken. Dan telt hij netjes op naar 2500, top!
Maar als ik achterwaarts draai telt hij wel af naar nul en stopt hij met tellen. Behalve als ik weer voorwaarts ga, dan telt hij weer netjes op.

Is er een oplossing om hem voor- en achterwaarts te laten "optellen". Dus dat je achterwaarts ook foto's kan maken?

Hoi.

Als je onderaan de code kijkt, zie je daar staan dat de counter word opgeteld, of in het andere geval word afgeteld.
Schijnbaar wil je niet zien of je een afstand hebt afgelegd, maar alleen of je hebt bewogen.
Daarom zou je die code zo kunnen aanpassen dat ie alleen maar optelt, dus bij elke beweging in welke richting dan ook.

Dat zou hiermee gebeuren:

// Encoder connect to digitalpin 2 and 3 on the Arduino.

volatile unsigned int counter = 0; //This variable will increase or decrease depending on the rotation of encoder

uint32_t pulsTimer = 0;                // timer voor duur van de trigger
#define PULSE_PIN    5                // pin 5 is de trigger pin voor de camera
#define TRIGGER_TIME 100            // trigger tijd duurt 100 milliseconden. kun je dus aanpassen
#define AANTAL_ENCODER_PULSEN 2500    // aantal pulsen van de encoder waarna een foto wordt genomen

void setup() {
    Serial.begin(9600);
    //Setting up interrupt
    //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
    attachInterrupt(0, ai0, RISING);

    //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
    attachInterrupt(1, ai1, RISING);
}

void loop() {
    // Send the value of counter
    Serial.println(counter);
    //
    // kijk of er een trigger puls loopt
    //
    if (pulsTimer != 0) {
        //
        // hij loopt dus controleer of deze inmiddels verlopen is
        //
        if ((millis() - pulsTimer) > TRIGGER_TIME){
            //
            // klaar dus de trigger puls weer uitzetten
            //
            digitalWrite(PULSE_PIN, LOW);
            //
            // en zet te pulstimer weer uit
            //
            pulsTimer = 0;
        }
    }
    //
    // controleer of de encoderpulsen verlopen zijn
    //
    if (counter > AANTAL_ENCODER_PULSEN) {
        //
        // we moeten een foto nemen. Dus start de trigger puls
        //
        digitalWrite(PULSE_PIN, HIGH);
        //
        // en start de timer
        //
        pulsTimer = millis();
        //
        // en reset de teller voor volgende foto
        //
        counter = 0;
    }
}

void ai0() {
    // ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
    // Check pin 3 to determine the direction
    if (digitalRead(3) == LOW) {
        counter++;
//    } else {
//        counter--;
    }
}

void ai1() {
    // ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
    // Check with pin 2 to determine the direction
    if (digitalRead(2) == LOW) {
//        counter--;
//    } else {
        counter++;
    }
}

Zoals je ziet is het dezelfde code als die van Nico, alleen met wat regels uitgeschakeld door er commentaar van te maken.

Super, precies wat ik zoek!!!
Bedankt! Ook Nico top!

Zouden jullie me nog een tip met het laatste kunnen geven. Voor de zekerheid dat ik niks verkeerd doe met de camera (kapot maak):

"weerstand in serie met een datapin moeten maken (iets van 330 ohm oid.). De opto GND gaat aan de GND van de Arduino"

Heb ik de weerstand nog nodig? Suggesties welke te gebruiken?

Begrijp ik het goed dat dan GND opto op GND ardiono gaat
en
opto camera op PIN5, Met indien nodig de weerstand tussen camera opto PIN5 en OPTO camera

Dat weet ik niet.
De kans dat er een weerstand nodig is, is bijna 100 %.
Maar geen idee of die weerstand niet al gemonteerd is.
Als je het merk en model van de camera en die opto interface kunt noemen zou het kunnen dat er daar wat over opgezocht kan worden.

Tuurlijk:

LadyBug5 van PointGrey

Ik gebruik:

OPT-GND (Green)
OPT O1 (Blue) voor input trigger)

Das een geinig ding.
Er is een mooie handleiding te downloaden, waarin aardig wat gegevens staan.
Dus ook die 12 polige connector.
Pinnen 1 en 2 zijn voor die opto input.
Daar word wel iets over gezegd, maar niets over welke spanning er verwerkt kan worden.

fabrikant:
Opto-isolated input pins require an external pull up resistor to allow triggering of the camera by shorting the pin to the corresponding opto ground (OPTO_GND).

Dat is het enige dat ik er over kon vinden.
Dat leest een beetje raar als je bekend bent met optocouplers.
Pull up is vermoedelijk niet helemaal het juiste woord voor de weerstand.
Helaas heb ik niet gevonden welke waarde er geldt voor die weerstand, de spanning of de stroom die er voor die ingang moet gelden.
Daarom is Nico's voorstel van een 330 Ohm weerstand best een goed idee.
Eventueel kan de stroom door de opto interface gemeten worden en ook kun je met een diode test vaststellen op welke spanning de LED die daar in zit moet branden.
Maar das wel een beetje gedoe.
Daarom lijkt me gewoon testen met 330 Ohm en de 5 volt van een Arduino een goed idee.

Volgens pagina 50 van diezelfde handleiding zou hij zowel de 5V als 3.3V aankunnen. Ik zou zelf eerst met een weerstandje beginnen. 220-330 ohm.
Daarnaast kan het ook zijn dat je de digitalWrites in de code (op pin 5) moet omdraaien van HIGH->LOW en vice versa.. Maar dat merk je gauw genoeg.

Hoi,

Jazeker, is een super fijne 360 camera :slight_smile:

Dit is mijn opstelling nu (bijlage).

Ik krijg alleen geen licht signaaltje?

Ik heb ook HIGH en LOW visa versa omgedraaid....

nu met bijlage

nu met bijlage

IMG_5098_k.jpg

zie het al:

In de setup() toevoegen:

pinMode(PULSE_PIN, OUTPUT);

TOP!!

Nu werkt hij perfect

Vele malen dank!

:grin:

Da's mooi. Nu kijken hoe lang het duurt voordat je die beide parameters instelbaar wil maken :slight_smile: