Solved an interesting problem last week using an Arduino UNO.  We needed to sync two IDS Particle Image Velocimetry (PIV) cameras using a hardware trigger.

The two cameras were different models and had different connectors.  There are many ways to trigger the system depending on what action you want to capture.


I could have just connected a function generator to the inputs, but instead chose to use an Arduino UNO for more flexibility.

The hardware trigger inputs to these cameras are opto-isolated, so the output from the UNO can be used directly.…

So I mounted an Arduino in a box, powered from the USB, added a couple of LEDS and a pushbutton, and a BNC connector for the output.

The software is fairly straight forward.

 Last Edit 25 July 2019
 by RSC

// constants won't change. They're used here to set pin numbers:
const int PushButtonPin = 5; // the number of the pushbutton pin
const int RedLedPin =  4;    // the number of the LED pin
const int TriggerPin = 3;    // the number of the trigger pin
const int GreenLedPin =  2;  // the number of the LED pin

int buttonState = 0; // variable for reading the pushbutton
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pins as inputs/outputs.
  pinMode(RedLedPin, OUTPUT);
  pinMode(GreenLedPin, OUTPUT);
  pinMode(TriggerPin, OUTPUT);
  pinMode(PushButtonPin, INPUT);
  // initialize serial:

// the loop function runs over and over again forever
void loop() {
   // read the state of the pushbutton value:
  buttonState = 0;
  digitalWrite(RedLedPin, HIGH);
  digitalWrite(GreenLedPin, LOW);
  Serial.println("PushButton = Off"); 
  Serial.println("Trigger = Armed");
  while (!buttonState){
    buttonState = digitalRead(PushButtonPin);
  Serial.println("PushButton = On");
  Serial.println("Trigger = On");  
  digitalWrite(RedLedPin, LOW);
  digitalWrite(GreenLedPin, HIGH);
  buttonState = 0;
    digitalWrite(TriggerPin, HIGH);   // turn the trigger on
    delay(50);                       // wait for X miliseconds
    digitalWrite(TriggerPin, LOW);   // turn the trigger off
    delay(50);                      // wait for X miliseconds
    buttonState = digitalRead(PushButtonPin);