can arduino detect camera flash sync pulse?

I have built a arduino based flash trigger box. I am at the point of connecting it to a camera but it won't trigger. The test trigger button on my box works, shorting the camera end plug with the tip of a pen works. But neither a Wein Safe shoe adapter on DSLR nor my old Pentax K1000 mechanical camera will trigger it.

I'm wondering if the pulse from the camera is too short to register. Using pin 19 (analog being used as digital as the only avaliable digitals only's are 13, 1 and 2 which I'm not using as will cause undesirable triggers when rebooting or usb data transfer when reprogramming).

Pin 19 is tied low with a pull-down resister, momentary on button causes it to go high on pin 19. sync lead wired across test trigger button.
My setup stages

/* Flash sequential trigger unit
By "Krazy Darcy" Waters.  Derived from freetronics LCD module sample, and Arduino Cookbook */

/* INCLUDES */
#include <Wire.h>;
#include <LiquidCrystal.h>; //includes these libraries


/* DEFINES */
#define BUTTON_ADC_PIN A1   //analog output from lcd buttons
/* Pin A0 is used by the Freetronics LCD module keypad, So I've used A1 for my button array */
#define LCD_BACKLIGHT_PIN 3  //lcd backlight control
#define RIGHT_10BIT_ADC 0 // right button
#define UP_10BIT_ADC 145  // up botton
#define DOWN_10BIT_ADC 329  //down button
#define LEFT_10BIT_ADC 505  //left button
#define ENTER_10BIT_ADC 741  // select-enter button
#define BUTTONHYSTERESIS  20  //hysteresis for valid button sensing window
/* value of hysteresis increased as instead of using onboard keypad, external button array to same design but with 
slightly differant resistor values to those on the array on the freetronics lcd schematic */
#define FLASH_1_PIN 2    // output trigger flash 1 relay
#define FLASH_2_PIN 12    // output trigger flash 2 relay
#define FLASH_3_PIN 11    // output trigger flash 3 relay
#define FLASH_4_PIN 10    // output trigger flash 4 relay
#define FLASH_TRIGGER_PIN 19   //trigger signal from camera
#define FLASH_ON 500   //delay to keep relay closed for flash unit to register sync pulse
/* NOTES - digital pins
pin1
pin 19 flash trigger input
pin 3 lcd backlight control output
pin 4-9 freetronics LCD module
pin 10 flash 4 trigger output
pin 11 flash 3 trigger output
pin 12 flash 2 trigger output
pin 13 flash 1 trigger output  */

/* Return values for readbuttons */
#define BUTTON_NONE  0//
#define BUTTON_UP  2//
#define BUTTON_RIGHT  1//
#define BUTTON_DOWN  3//
#define BUTTON_LEFT  4//
#define BUTTON_ENTER  5//



/* variables */
byte buttonJustPressed = false;
byte buttonJustReleased = false;
byte buttonWas =BUTTON_NONE;
int SOLO_F;

/* Initialise LCD Pins */
LiquidCrystal lcd(8,9,4,5,6,7);  //pins for Freetronics lcd screen - check pin assignments for your lcd
#define FLASH_ON 500
int MENU = 0;
unsigned int RETARD = 0; // retard used for interval between each flash as the word delay is a command
int TRIGGER;

/* setup - runs once when program launched */
void setup() {
  
  pinMode(BUTTON_ADC_PIN, INPUT); // sets A0 as input from lcd buttons
  digitalWrite(BUTTON_ADC_PIN, LOW); // ensures voltage pulup is off on A0
  digitalWrite(LCD_BACKLIGHT_PIN, OUTPUT); // sets D3 as output
  pinMode(FLASH_TRIGGER_PIN, INPUT); // input for flash sync signal
  lcd.begin(16,2);  //configure screen size
  lcd.setCursor(0,0); //sets cursor at line 1 character 1
  lcd.print("FLASH CONTROLLER"); // title screen
  lcd.setCursor(0,1); // set cursor at line 2 character 1)
  lcd.print("v0.16           ");
  delay (100);
pinMode(FLASH_1_PIN, OUTPUT);
pinMode(FLASH_2_PIN, OUTPUT);
pinMode(FLASH_3_PIN, OUTPUT);
pinMode(FLASH_4_PIN, OUTPUT);
pinMode(FLASH_TRIGGER_PIN, INPUT); 
/* Due to the relay board used, when there is no signal (pin is low) the relay is on.
    So in setup pins are set high, and pins set low when I want the relays to turn on. */
digitalWrite(FLASH_1_PIN, HIGH);  // ensures relay 1 is off
digitalWrite(FLASH_2_PIN, HIGH);  // ensures relay 2 is off
digitalWrite(FLASH_3_PIN, HIGH);  // ensures relay 3 is off
digitalWrite(FLASH_4_PIN, HIGH);  // ensures relay 4 is off
}
/* setup - runs once when program launched */
void setup() {
...
  pinMode(FLASH_TRIGGER_PIN, INPUT); // input for flash sync signal
...
pinMode(FLASH_TRIGGER_PIN, INPUT); 
...

Afraid the processor would forget you set FLASH_TRIGGER_PIN to INPUT?

You appear to have forgotten to post loop.

Yes, post your complete sketch please.

If you're right and the trigger pulse is very short, you may be forced to use an interrupt capable pin to detect it. Polling may be missing the pulse.

Paul

(My menu system is a bit of a mess and will be rewritten)
have to post in parts as whole code exceeds post character limit

/* Flash sequential trigger unit
By "Krazy Darcy" Waters.  Derived from freetronics LCD module sample, and Arduino Cookbook */

/* INCLUDES */
#include <Wire.h>;
#include <LiquidCrystal.h>; //includes these libraries


/* DEFINES */
#define BUTTON_ADC_PIN A1   //analog output from lcd buttons
/* Pin A0 is used by the Freetronics LCD module keypad, So I've used A1 for my button array */
#define LCD_BACKLIGHT_PIN 3  //lcd backlight control
#define RIGHT_10BIT_ADC 0 // right button
#define UP_10BIT_ADC 145  // up botton
#define DOWN_10BIT_ADC 329  //down button
#define LEFT_10BIT_ADC 505  //left button
#define ENTER_10BIT_ADC 741  // select-enter button
#define BUTTONHYSTERESIS  20  //hysteresis for valid button sensing window
/* value of hysteresis increased as instead of using onboard keypad, external button array to same design but with 
slightly differant resistor values to those on the array on the freetronics lcd schematic */
#define FLASH_1_PIN 2    // output trigger flash 1 relay
#define FLASH_2_PIN 12    // output trigger flash 2 relay
#define FLASH_3_PIN 11    // output trigger flash 3 relay
#define FLASH_4_PIN 10    // output trigger flash 4 relay
#define FLASH_TRIGGER_PIN 19   //trigger signal from camera
#define FLASH_ON 500   //delay to keep relay closed for flash unit to register sync pulse
/* NOTES - digital pins
pin1
pin 2 flash trigger input
pin 3 lcd backlight control output
pin 4-9 freetronics LCD module
pin 10 flash 4 trigger output
pin 11 flash 3 trigger output
pin 12 flash 2 trigger output
pin 13 flash 1 trigger output */

/* Return values for readbuttons */
#define BUTTON_NONE  0//
#define BUTTON_UP  2//
#define BUTTON_RIGHT  1//
#define BUTTON_DOWN  3//
#define BUTTON_LEFT  4//
#define BUTTON_ENTER  5//



/* variables */
byte buttonJustPressed = false;
byte buttonJustReleased = false;
byte buttonWas =BUTTON_NONE;
int SOLO_F;

/* Initialise LCD Pins */
LiquidCrystal lcd(8,9,4,5,6,7);  //pins for Freetronics lcd screen - check pin assignments for your lcd
#define FLASH_ON 500
int MENU = 0;
unsigned int RETARD = 0; // retard used for interval between each flash as the word delay is a command
int TRIGGER;

/* setup - runs once when program launched */
void setup() {
  
  pinMode(BUTTON_ADC_PIN, INPUT); // sets A0 as input from lcd buttons
  digitalWrite(BUTTON_ADC_PIN, LOW); // ensures voltage pulup is off on A0
  digitalWrite(LCD_BACKLIGHT_PIN, OUTPUT); // sets D3 as output
  pinMode(FLASH_TRIGGER_PIN, INPUT); // input for flash sync signal
  lcd.begin(16,2);  //configure screen size
  lcd.setCursor(0,0); //sets cursor at line 1 character 1
  lcd.print("FLASH CONTROLLER"); // title screen
  lcd.setCursor(0,1); // set cursor at line 2 character 1)
  lcd.print("v0.16           ");
  delay (100);
pinMode(FLASH_1_PIN, OUTPUT);
pinMode(FLASH_2_PIN, OUTPUT);
pinMode(FLASH_3_PIN, OUTPUT);
pinMode(FLASH_4_PIN, OUTPUT);
pinMode(FLASH_TRIGGER_PIN, INPUT); 
/* Due to the relay board used, when there is no signal (pin is low) the relay is on.
    So in setup pins are set high, and pins set low when I want the relays to turn on. */
digitalWrite(FLASH_1_PIN, HIGH);  // ensures relay 1 is off
digitalWrite(FLASH_2_PIN, HIGH);  // ensures relay 2 is off
digitalWrite(FLASH_3_PIN, HIGH);  // ensures relay 3 is off
digitalWrite(FLASH_4_PIN, HIGH);  // ensures relay 4 is off
}

void loop ()  // acts as the main menu screen
{
   
lcd.setCursor(0,1);
lcd.print(">Seq <All vSolo");
   byte button;
    byte timestamp;
     
      button=ReadButtons();
      if(buttonJustPressed||buttonJustReleased)
      {
          lcd.setCursor(4,1);
          lcd.print("   ");
      }
      switch(button)
      {
          case BUTTON_NONE:
          {
            break;
          }
          case BUTTON_RIGHT:
          {
            SEQUENTSET();
            break;
          }
          case BUTTON_DOWN:
          {
            SOLOSET();
            break;
          }   
          case BUTTON_LEFT:
          {
            ALLWAIT();
            break;
          }
          case BUTTON_UP:
          {
            lcd.setCursor(4,1);
            lcd.print("up");
            break;
          }
          case BUTTON_ENTER:
          {
            lcd.setCursor(4,1);
            lcd.print("SELECT-FLASH");
            break;
          }   
          default:
          {
            break;
          }
      }
          if(buttonJustPressed)
             buttonJustPressed = false;
             
          if(buttonJustReleased)
              buttonJustReleased = false;
    }      
        /*read buttons
        detect button pressed and return value */
     byte ReadButtons()
    {
          unsigned int buttonVoltage;
          byte button = BUTTON_NONE;
          buttonVoltage = analogRead(BUTTON_ADC_PIN);
          if (buttonVoltage < (RIGHT_10BIT_ADC+BUTTONHYSTERESIS))
          {
            button = BUTTON_RIGHT;
          }
          else if(buttonVoltage >=(DOWN_10BIT_ADC-BUTTONHYSTERESIS)
             && buttonVoltage <= (DOWN_10BIT_ADC+BUTTONHYSTERESIS))
           {
             button = BUTTON_DOWN;
           }
           else if(buttonVoltage >=(LEFT_10BIT_ADC-BUTTONHYSTERESIS)
             && buttonVoltage <= (LEFT_10BIT_ADC+BUTTONHYSTERESIS))
            {
              button = BUTTON_LEFT;
            }
              else if(buttonVoltage >=(UP_10BIT_ADC-BUTTONHYSTERESIS)
             && buttonVoltage <= (UP_10BIT_ADC+BUTTONHYSTERESIS))
             {
               button = BUTTON_UP;
             }
              else if(buttonVoltage >=(ENTER_10BIT_ADC-BUTTONHYSTERESIS)
             && buttonVoltage <= (ENTER_10BIT_ADC+BUTTONHYSTERESIS))
             {
               button = BUTTON_ENTER;
             }
             if((buttonWas==BUTTON_NONE)&&(button !=BUTTON_NONE))
             {
               buttonJustPressed = true;
               buttonJustReleased = false;
             }
             if((buttonWas !=BUTTON_NONE)&&(button==BUTTON_NONE))
             {
               buttonJustPressed = false;
               buttonJustReleased = true;
             }
             buttonWas = button;
             return(button);
 }

Rest of code

 void SEQUENTSET()  // sets RETARD delay value for sequential firing
  
 {
   buttonJustPressed = false;
   buttonJustReleased = false; 
   delay(1000);
   RETARD = 0;
   do
   {
    byte button;
    
     button=ReadButtons();
     if(buttonJustPressed||buttonJustReleased)

      delay(150);
      lcd.setCursor(0,0);
      lcd.print(">+1 <-1 ^+5 v-5   ");
      lcd.setCursor(0,1);
      lcd.print("set delay = ");  
      lcd.print (RETARD/1000);
      lcd.print ("s      ");
        switch(button)
      {
          case BUTTON_NONE:
          {
            break;
          }
          case BUTTON_RIGHT:
          {
            RETARD = RETARD+1000; // adds 1 second to delay
            break;
          }
          case BUTTON_DOWN:
          {
           RETARD = RETARD-5000; // subtracts 5 seconds from delay
            break;
          }   
          case BUTTON_LEFT:
          {
            RETARD = RETARD-1000; // subtracts 1 second from delay
            break;
          }
          case BUTTON_UP:
          {
            RETARD = RETARD+5000;  // adds 5 seconds to delay
            break;
          }
          case BUTTON_ENTER:
          {
            SEQUENTWAIT();  // runs the routine to wait for trigger.
            break;
          }   
          default:
          {
            break;
          }
      
       int TRIGGER = digitalRead(FLASH_TRIGGER_PIN);
       lcd.setCursor(0,0);
       lcd.print("Select to ARM    ");
      }
   }
 while (TRIGGER == 0);  
   }

  void SEQUENTWAIT()  // waits for the trigger signal from camera or test button
  {
    lcd.setCursor(0,0);
    lcd.print("SEQUENTIAL FLASH");
    lcd.setCursor(0,1);
    lcd.print("Flashes ARMED    ");
    
   do
     {
      int TRIGGER = digitalRead(FLASH_TRIGGER_PIN);
      delay (1);
      if(TRIGGER == 1) SEQUENT();
  }
    while (TRIGGER == 0);
}
 
 
   void SEQUENT()  // triggers flash units in sequence with RETARD as delay between each
{
  lcd.setCursor(0,0);
  lcd.print("Flashes FIRING  ");
   lcd.print(RETARD);
    lcd.setCursor(0,1);
    digitalWrite(FLASH_1_PIN, LOW);  // turns relay on
    lcd.print("Flash 1      ");
    delay(FLASH_ON);
    digitalWrite(FLASH_1_PIN, HIGH);  // turns relay off
    delay(RETARD);
    
    lcd.setCursor(0,1);
    digitalWrite(FLASH_2_PIN, LOW);  // turns relay on
    lcd.print("Flash 2      ");
    delay(FLASH_ON);
    digitalWrite(FLASH_2_PIN, HIGH);   // turns relay off
    delay(RETARD);
    
    lcd.setCursor(0,1);
    digitalWrite(FLASH_3_PIN, LOW);  // turns relay on
    lcd.print("Flash 3      ");
    delay(FLASH_ON);
    digitalWrite(FLASH_3_PIN, HIGH);   // turns relay off
    delay(RETARD);
    
    lcd.setCursor(0,1);
    digitalWrite(FLASH_4_PIN, LOW);  // turns relay on
    lcd.print("Flash 4      ");
    delay(FLASH_ON);
    digitalWrite(FLASH_4_PIN, HIGH);   // turns relay off
    delay(RETARD);
    
    SEQUENTWAIT();
  }
 
 void ALLWAIT()  // waits for the trigger signal from camera or test button
  {
    lcd.setCursor(0,0);
    lcd.print("FIRE ALL AT ONCE");
    lcd.setCursor(0,1);
    lcd.print("ARMED           ");
    RETARD = 0;
   do
     {
      int TRIGGER = digitalRead(FLASH_TRIGGER_PIN);
      delay (1);
      if(TRIGGER == 1) ALLFIRE();
  }
    while (TRIGGER == 0);
}

   void ALLFIRE()  // triggers all flash units simutaneously
{
  lcd.setCursor(0,0);
  lcd.print("Flashes FIRING");
    digitalWrite(FLASH_1_PIN, LOW); // setting all flash driver pins low as fast as possible to turn all on
     digitalWrite(FLASH_2_PIN, LOW);
     digitalWrite(FLASH_3_PIN, LOW);
     digitalWrite(FLASH_4_PIN, LOW);
        lcd.setCursor(0,1);
        lcd.print("FIRING           ");
         delay(FLASH_ON);            // delay to ensure all driver relays have turned on before turning them off
     digitalWrite(FLASH_1_PIN, HIGH); //  setting all flash driver pins high as fast as possible to turn all off.
     digitalWrite(FLASH_2_PIN, HIGH);
     digitalWrite(FLASH_3_PIN, HIGH);
     digitalWrite(FLASH_4_PIN, HIGH);
        lcd.setCursor(0,1);
        lcd.print("ARMED           ");
     ALLWAIT();
  }
  
    void SOLOSET()  // selects single flash to fire - usefull for metering single light in multi-light setup
  
 {
   buttonJustPressed = false;
   buttonJustReleased = false; 
   delay(1000);
   RETARD = 0;
   do
   {
    byte button;
    
     button=ReadButtons();
     if(buttonJustPressed||buttonJustReleased)

      delay(150);
      lcd.setCursor(0,0);
      lcd.print("SELECT FLASH");
      lcd.print("       ");
      lcd.setCursor(0,1);
      lcd.print("Flash = ");  
      lcd.print (SOLO_F); // print flash selected
      lcd.print("       ");
        switch(button)
      {
          case BUTTON_NONE:
          {
            break;
          }
          case BUTTON_RIGHT:
          {
            SOLO_F = 2;
            break;
          }
          case BUTTON_DOWN:
          {
           SOLO_F = 3;
            break;
          }   
          case BUTTON_LEFT:
          {
            SOLO_F = 4;
            break;
          }
          case BUTTON_UP:
          {
            SOLO_F = 1;
            break;
          }
          case BUTTON_ENTER:
          {
            SOLOWAIT();  // runs routine to wait for trigger for firing songle flash fire
            break;
          }   
          default:
          {
            break;
          }
      
       int TRIGGER = digitalRead(FLASH_TRIGGER_PIN);
       lcd.setCursor(0,0);
       lcd.print("Select to ARM    ");
      }
   }
 while (TRIGGER == 0);  
   }



void SOLOWAIT()  // waits for the trigger signal from camera or test button
  {
    lcd.setCursor(0,0);
    lcd.print("FIRE FLASH No ");
    lcd.setCursor(14,0);
     lcd.print(SOLO_F);
    lcd.setCursor(0,1);
    lcd.print("ARMED           ");
    RETARD = 0;
   do
     {
      int TRIGGER = digitalRead(FLASH_TRIGGER_PIN);
      delay (1);
      if(TRIGGER == 1) SOLOFIRE();
  }
    while (TRIGGER == 0);
} 


void SOLOFIRE()  // routine that actually fires the single flash unit
{
          if(SOLO_F == 0)
           {
             	SOLOSET();
           }
            else if(SOLO_F == 1)
           {
             	digitalWrite(FLASH_1_PIN, LOW);  // turns relay on
                 lcd.setCursor(0,1);
                  lcd.print("FIRING           ");
         	delay(FLASH_ON);
    		 digitalWrite(FLASH_1_PIN, HIGH);   // turns relay off
                  lcd.setCursor(0,1);
                  lcd.print("ARMED           ");
           }
           else if(SOLO_F == 2)
            {
              digitalWrite(FLASH_2_PIN, LOW);  // turns relay on
              lcd.setCursor(0,1);
                  lcd.print("FIRING           ");
        	 delay(FLASH_ON);
     		digitalWrite(FLASH_2_PIN, HIGH);   // turns relay off
                  lcd.setCursor(0,1);
                  lcd.print("ARMED           ");
            }
              else if(SOLO_F == 3)
             {
               digitalWrite(FLASH_3_PIN, LOW); // turns relay on
               lcd.setCursor(0,1);
                  lcd.print("FIRING           ");
     		    delay(FLASH_ON);
     		digitalWrite(FLASH_3_PIN, HIGH);   // turns relay off
                    lcd.setCursor(0,1);
                  lcd.print("ARMED           ");
             }
              else if(SOLO_F == 4)
             {
		digitalWrite(FLASH_4_PIN, LOW);  // turns relay on
                  lcd.setCursor(0,1);
                  lcd.print("FIRING           ");
         	delay(FLASH_ON);
    		 digitalWrite(FLASH_4_PIN, HIGH);   // turns relay off
                   lcd.setCursor(0,1);
                  lcd.print("ARMED           ");
             }
           }

Try removing the delay (1) from SEQUENTWAIT ()

Paul

Thanks very much :).

I removed the delays, no differance.

I consulted a few e-books and tried the interupt. It triggered. However the onboard trigger button multi triggers it - no biggie as I have to do a rewrite as a) the menu system is a pile of rubbish (planned to rewrite if trigger worked) and b) I had to rem out whole sequences so that the interupt wouldn't clash with the wait sequences.
But the Interrupt based trigger WORKS
I was afraid that the duration of the trigger pulse may have been too short to register but it does. Unsure the exact duration but for an idea Pentax k1000 purely mechanical film camera fastest sync speed 1/60th second, Pentax Kx DSLR 1/125sec, Pentax K50 1/160thsec (triggers as soon as shutter fully open and before it starts closing - K1000 used Focal Plane shutter)

THANKS VERY MUCH for your time. :slight_smile: