Skip to content

Solution: Sync Flash to GS Camera with use of the XVS PIN and an Pico or Arduino #4034

Open
@emc02

Description

@emc02

I was working on that for 2 days and finally found a perfect solution that is not in the docs. I don't know how to make a Pull Request correctly, but maybe someone else will use my information.

I Used a BC547 transistor
XVS--1k--BASE
PicoPIN--1k--COLLECTOR
GND--EMITTER

GND has to be connected between Pico and Camera.

I am collecting the picture with an C++ Code in StillCapure Mode and fixed FrameDurationTime to 1ms. If you change this, you should change the FLASH_TIMER_DURATION too. This could also be done with serial commands directly to the Pico to match the values (not in the code).
I am always starting and stopping the camera in the code, because I don't want to flash all the time.

cam_device->start();
wait till captured...
cam_device->stop();

The XVS Pin triggers twice for every pic.
HIGH - 20us - LOW - 32384us - (takes picture for FrameDurationTime (e.g. 1000us)) - HIGH - 20us - LOW

The picture is taken before(!!!) the second HIGH signal.
So the timing is important!
I am triggering the flash 32384us after the first HIGH signal.

Arduino Code:

#define TriggerPIN  3 //D03 (Uno, Nano, Mini)
#define StatusLED  13 //D13

// to find the perfect timing window set FLASH_TIMER_DURATION=2 and then change the FLASH_TIMER_DELAY up and down to find the limits (point the camera on the Status LED and watch the brightness change)
// 502 off
// 503 weak
// 504 better
// 505 full
// .
// .
// .
// 518 full
// 519 better
// 520 weak
// 521 off
`
#define FLASH_TIMER_DELAY    505  // (16 MHz / 1024) * 0.032384 - 1 ≈ 505 für 32,384ms Interrupt
#define FLASH_TIMER_DURATION  15  // (16 MHz / 1024) * 0.001024 - 1 ≈  15 für  1,024ms Interrupt

unsigned long starttime, endtime, duration, pause;
unsigned int triggered=0, status=0, i=0, FLASH_ON=0;

void setup() {
  pinMode(StatusLED,OUTPUT);                // set PIN to OUTPUT
  digitalWrite(StatusLED,LOW);              // set PIN to LOW (StatusLED OFF)
  
  pinMode(TriggerPIN,INPUT_PULLUP);         // set PIN to INPUT
    
  attachInterrupt(digitalPinToInterrupt(TriggerPIN),TriggerISR,CHANGE);   // SET InterruptPIN, ISR and Mode

  // Timer
  TCCR1A = 0;
  TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10);  // CTC Modus, Prescaler 1024
  OCR1A = FLASH_TIMER_DELAY;
  TIMSK1 = (1 << OCIE1A);  // Timer1 Compare Match Interrupt aktivieren

  interrupts();                             // enable Interrupts

  Serial.begin(115200);                     // initialize serial
}


void loop() {
  if (triggered==0) {
    TCNT1 = 0;  // Timer reset
  }

  if (status==1) {    
    status=0;
    Serial.println(i);
    Serial.print("pause:");
    Serial.print(pause/1000);
    Serial.println("ms");
    Serial.print("duration:");
    Serial.print(duration);
    Serial.println("us");
    Serial.println("-------------------------");
    i++;
  }
}


void TriggerISR() {                       // ISR function excutes when PIN is triggered
  if (digitalRead(TriggerPIN)==HIGH) {    // check if PIN is high or low and set Flash PIN
    if (triggered==0) {
      triggered=1;
      TCNT1 = 0;  // Timer reset
    }
    starttime = micros();
    pause=(starttime-endtime);
  }
  else {
    endtime = micros();
    duration=endtime-starttime;
    status=1;                             // allow posting new Timings
  }
}


ISR(TIMER1_COMPA_vect) {                  // Timer
  if (FLASH_ON==0) {
    digitalWrite(StatusLED,HIGH);
    TCNT1 = FLASH_TIMER_DELAY - FLASH_TIMER_DURATION;  // Timer reset to 1ms
    FLASH_ON=1;
  }
  else {
    digitalWrite(StatusLED,LOW);
    FLASH_ON=0;
    triggered=0;
  }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions