Shielding circuit from false induction

I have done a sequencing circuit that switches relays. These relays will be used for SFX pyrotechnic ignition. When I get my hand close to the leads or have a remote button cord close to an AC source, I get an unwanted sequence start. I noticed with my voltmeter that I can get 2-3V reading just by holding the leads. I have some shielded twisted pair cable that I will use to connect the sequence start button. Do I need a grounded case, etc to be sure that I don't get outside induction with this system? Any other suggestions for safety?
Thanks!

namenerb:
I have done a sequencing circuit that switches relays. These relays will be used for SFX pyrotechnic ignition. When I get my hand close to the leads or have a remote button cord close to an AC source, I get an unwanted sequence start. I noticed with my voltmeter that I can get 2-3V reading just by holding the leads. I have some shielded twisted pair cable that I will use to connect the sequence start button. Do I need a grounded case, etc to be sure that I don't get outside induction with this system? Any other suggestions for safety?
Thanks!

I'm afraid we need some more informations about your sequencing circuit.
Which device is connected the input that detects the start button ?
Is there a filter at the input ? A debouncing circuit? etc....
a schematics would help people to help you :wink:

namenerb:
pyrotechnic ignition ... unwanted sequence start

Maybe I'm squeamish, but it really creeps me out to see those two phrases in the same sentence.

It sounds to me like the problem is an open input, and that you need a pullup resistor.

Any other suggestions for safety?

Yes: Do not attempt.

Where safety is an issue, devices should be designed by people skilled in the art, extensively tested, and listed for the purpose. If you're not experienced in designing circuits for this purpose - and if you're asking for safety suggestions on this forum, you're not - then leave it to others who are. If you must persist, keep this in mind: Just one lousy person disfigured, maimed, or dead, and you'll never again see a good night's sleep.

To get the jitters when just putting you hand near the wires points to some floating input that needs pullup/pulldown resistors.
Ferrite beads and screened cable are also a good idea.

Sounds like the key though is the circuit. If you could post a circuit diagram would help. I suspect your switches are connected to some driving circuit that may be picking up stray noises or is too sensitive.

Aside from that always use a common ground point and grounding your circuit to a metal case can help. Filter capacitors can reduce noise.

With a project that can be so potentially dangerous you need to understand what’s going on and eliminate ALL potential for misfires. Possibly even an oscilloscope to see what’s going on.

I agree with tmd3. This is absolutely the wrong type of circuit to be learning robust design on.

I agree with you too, but if OP gives us more informations (schematics... ) we'll probably be able to tell him what has definitely to be avoided .
But still, OK, the valuable advice is "do not attempt!"

The minimal precautions are using low-impedance circuit (500 ohm pull-up or similar), debouncing
the signal in software (filters out all the spikes), and shielding.

And its likely the pick-up is capacitive, not inductive as you suppose, so low-impedance will make
a big difference.

But as has been mentioned if safety is an issue then its a major undertaking (you have to be in
a position to convince an insurance company that you took all reasonable precautions, for instance).

The kinds of pick up you need to protect against include capacitive pick up, inductive pick-up,
radio frequency interference (such as mobile phone touching the wires), nearby lightning discharge.

One powerful technique is to transmit a code word, which cannot be mimiced by some random
noise - something like a randomly generated 64 bit code common to transmitting and receiving end,
which requires an intelligent remote control, not just a button. This works both for wired and wireless
triggering.

Shielded twisted pair, and only ground the shield back at the control box end. Actually, put the switch in a metal box, connect the shield of the cable to the box, but only connect the two twisted pair wires to the switch. Even though one of the wires may be connected to the same ground point back inside the control box, do NOT connect it to ground in the switch box.

As pointed out, there are -many- things to consider. Low impedance, filter caps, shielding and the proper use of it, etc.

This member has written in the past about his explosives :
namenerb quotes:
July 22, 2013
"people will get blown up without knowing it's coming. (This is SFX pyro) Without that in the else statement, what keeps it from executing the rest of the loop?"

"this is for sequenced pyro explosions/gunshots in SFX film work. I will end up with many channels and I know that initially I am using longhand, but I'll convert it to better coding at some future date, my partner is ready to use this soon. Everything after the first if/else statement are the sequenced ignitions along with variable durations that each one stays on (for when they are using air mortars, etc. which have a longer 'unload' time)
I'm using a button on the internal pullup resistor for now, but may change that later...."

"I have to keep the if buttonPin = HIGH in the else statement so it doesn't take off in that sequence as soon as the loop starts. We will power up, then wait indefinitely for the button action (it will be a flip switch that stays on)."

"I was getting some really goofy stuff, like my button was malfunctioning or something. I removed the button and occasionally the else sequence would start before I manually plugged the button lead into the breadboard. Eventually, I held a ground lead while plugging in the button lead and it seems to work 100% correct, so I'm assuming that galvanic skin response/voltage might be the culprit? I am hoping..."

"I don't see how bounce would cause any problem other than very slightly delaying the sequence, correct?
Since this if for pyro used in filming Special FX, I will also need a 'kill' switch (e-stop button) in case the FX guy suspects any problems or the director 'cuts' and he needs to stop it quickly. I assume the safest and easiest method would be to simply put that e-stop on the power supply to the board?"

"This first project is for a partner in the film business with a Special FX company. He needs a sequencer for pyro with 48 channels that have a variable gap between firing as well as a variable duration that each is on. (Air mortars take a few seconds to unload, while squibs/bullet hits are instant) I plan to end up with a touch screen that sets up his variable library, as well as a sound library so that he can demonstrate the firing sequences to the director to make sure it is what they want."

" None of the button tutorials looked like they would work. Once I flip the switch, it stays on for the duration. I appreciate any input, be nice. Pointers help more than "you made a mistake and I won't tell you anything" Thanks! "

DANGER DANGER, WARNING, RED FLAG, LAST CHANCE, DO NOT PROCEED!

no answer from him...... hum... I hope it's not too late :grin:

Don't pretty much all microcontrollers have disclaimers saying that they are not for use in medical devices, or devices where someone's life may be in danger if it malfunctions?

I don't think I'd use a bunch of wires plugged into Arduino sockets in something this dangerous.

Hey guys, been out of pocket, not blown up. :slight_smile: I work in the business and deal with SFX operations from time to time. Just got back from initial testing, and everything is working well. As I go through the prototypes, I will be consulting people with experience on the electronic safety measures. I appreciate all your concerns, but my background is stunts, etc and have worked around explosives at different times for 40 yrs. I know where safety is needed and I assure you that I'm not a wacko in the garage looking for thrills. We are surrounded with people who have done major film FX for many years and they make sure that safety procedures are followed. When on set, the FX crew places and wires all charges with strict supervision over access to the area. No one (actors and stunts) are allowed into their places until all is armed and ready. Mortars, etc are directional charges and they make sure that a misfire is only a 'cut' situation and not an injury. This is not amateur hour. I ask questions because I want all the input then I can sift through and take the good advice and get most of the job of design done. When I have the major part finished, then it will go to someone with the expertise to look it over and let me know if I've missed anything.

This first test, I used twisted pair shielded cable left over from rewiring my previous cnc milling machine and it stopped the false starts from capacitance/inductance. We blew some squib sequences and an air mortar (dump valve). I'm running 2A solid state relays for each output channel and they have plenty of amperage for most of the FX guy's dump valves and are way more than adequate for the little squibs. The output lines to the charges will have shunts that stay in place until we are ready to go 'hot', etc.

MrMonteith, MarkT, and Polymorph, I appreciate your replies. I'll have a few more questions about proper grounding; for now, the shielded cable is grounded to the arduino board. I am getting ready to solder all my relays and LED indicators on a blank board, then plan to use a short ribbon cable from that to the Arduino. I assume that the first step is to eliminate long, looping wires that can pick up outside interference. I looked at some of the aluminum extrusion boxes today at Fry's and imagine that something along that line is what I should have my boards housed in. The complete setup will be in a Pelican case with foam lining.

Thanks again for all the replies, but don't worry about safety, we make sure that we have that part covered.

Thank you for filling in all the information about your experience and expertise.

Making the switch circuit low impedance helps noise immunity a lot. Don't rely on the Arduino's weak pull-up resistors, use something like a 100 ohm pull-up. A decent anti-bounce routine should also help noise immunity.

Thanks Polymorph,
I’ll try to incorporate the resistor today. I’ll insert my full code below. With the initial If/else statement, bounce is not a problem since it only has to see the button one time, then it is bypassed on subsequent looping. Adding even 100 ms for debounce creates a timing problem. When they push the button, the sequence Must start immediately.

The sequence we tested yesterday will be used on set Monday if I can get my new board soldered in. There won’t be anything else working in near proximity to the control box and the largest charge is directional and only 3 ounces of black powder. The zip cord running to the charges are always shunted until last thing before going ‘hot’, so outside influence is minimized.

Here’s the current program. It will be added to, etc, but the flow chart is basically very simple.

/*
Program purpose: 
 The channel pins will be turned on sequentially by looking at millis().  Pin one is turned on when the button is activated and startTime = millis() is set.  
 After the first pin, each subsequent pin will have a variable time delay before it turns on, 
 then each pin will be on for a variable time duration before being turned off.
 An LED is programmed to turn on for verification and stay on after each channel has cycled on/off.
 
 Program is finished when each pin has cycled on and off one time.  
 */

int ch1 = 2;    // pin 2 digital output
int ch1Led = 3;  // pin 3 digital output
int ch2 = 4;     // pin 4 digital output
int ch2Led = 5;  // pin 5 digital output
int ch3 = 6;     // pin 6 digital output
int ch3Led = 7;  // pin 7 digital output
int ch4 = 8;     // pin 8 digital output
int ch4Led = 9;  // pin 9 digital output
int ch5 = 10;     // pin 10 digital output
int ch5Led = 11;  // pin 11 digital output
int buttonPin = 12;

long startTime;

int ch1Dur;    // Ch_Dur is the interval period that each channel output will be on
int ch2Dur;    
int ch2GapDur; // Ch_GapDur is the duration between each channel and the previous channel
int ch3Dur;    
int ch3GapDur;
int ch4Dur;    
int ch4GapDur;
int ch5Dur;    
int ch5GapDur;

int trip;

void setup() {
  pinMode(ch1, OUTPUT);
  pinMode(ch1Led, OUTPUT);
  pinMode(ch2, OUTPUT);
  pinMode(ch2Led, OUTPUT);
  pinMode(ch3, OUTPUT);
  pinMode(ch3Led, OUTPUT);
  pinMode(ch4, OUTPUT);
  pinMode(ch4Led, OUTPUT);
  pinMode(ch5, OUTPUT);
  pinMode(ch5Led, OUTPUT);
  pinMode(buttonPin, INPUT);  //  Button input *** this will change to resistor pullup ***

  ch1Dur =500;     //  These are the Gap and Duration variables which will be set for each use
  ch2GapDur =500;
  ch2Dur =3000;    //  This 3 second Duration was used yesterday on a dump tank which will project a vertical column of propane/propylene, then Ch3 ignites that 200 ms later
  ch3GapDur =200;
  ch3Dur =200;
  ch4GapDur =100;
  ch4Dur =100;
  ch5GapDur =100;
  ch5Dur =1000;


  trip = 0;
}

void loop() 
{

  digitalRead(buttonPin);

  if(digitalRead(buttonPin) == HIGH && trip == 0)
  {
    startTime = millis();   
    digitalWrite(ch1,HIGH);
    trip = 1;
  }
  else {
    if(trip ==1)  // *** Thanks to the forum member who made me realize I didn't need to repeat if button == HIGH here !!! ***
    {

      // The main relay loop
      if (millis() - startTime >= ch1Dur)     //  ch1 operation
      {
        digitalWrite(ch1,LOW);
        digitalWrite(ch1Led,HIGH);           // ch1 LED ON
      } 


      // ch2 operation
      if (millis() - startTime >= ch2GapDur  && millis() - startTime <= ch2GapDur + ch2Dur)   
      {
        digitalWrite(ch2,HIGH);
      }
      else 
      { 
        digitalWrite(ch2,LOW);
      }  
      if (millis() - startTime >= ch2GapDur + ch2Dur)   // ch2 LED ON
        digitalWrite(ch2Led,HIGH); 


      // ch3 operation    
      if (millis() - startTime >= ch2GapDur + ch3GapDur  && millis() - startTime <= ch2GapDur + ch3GapDur + ch3Dur)   
      {
        digitalWrite(ch3,HIGH);
      }
      else 
      { 
        digitalWrite(ch3,LOW);
      }

      if (millis() - startTime >= ch2GapDur + ch3GapDur + ch3Dur)   // ch3 LED ON
        digitalWrite(ch3Led,HIGH); 


      // ch4 operation
      if (millis() - startTime >= ch2GapDur + ch3GapDur + ch4GapDur  && millis() - startTime <= ch2GapDur + ch3GapDur + ch4GapDur + ch4Dur)   
      {
        digitalWrite(ch4,HIGH);
      }
      else 
      { 
        digitalWrite(ch4,LOW);
      }

      if (millis() - startTime >= ch2GapDur + ch3GapDur + ch4GapDur + ch4Dur)   // ch4 LED ON
        digitalWrite(ch4Led,HIGH); 


      // ch5 operation
      if (millis() - startTime >= ch2GapDur + ch3GapDur + ch4GapDur + ch5GapDur  && millis() - startTime <= ch2GapDur + ch3GapDur + ch4GapDur + ch5GapDur + ch5Dur  )   
      {
        digitalWrite(ch5,HIGH);
      }
      else 
      { 
        digitalWrite(ch5,LOW);
      }

      if (millis() - startTime >= ch2GapDur + ch3GapDur + ch4GapDur + ch5GapDur + ch5Dur)   // ch5 LED ON
        digitalWrite(ch5Led,HIGH); 

    //  I know this is a longhand version.  Later, with more time, I will learn the coding to put all the Gap and Duration variables in a library and have it loop through
    //  so that adding more channels will be easier.  
    }      
  }
}

Debounce is not just about ignoring subsequent triggerings, it is also about making sure it is a valid trigger. If you simply accept the first apparent button press, no matter how short, you are potentially accepting noise as a button press. You don't need 100ms, just long enough to make sure it stays activated for 1ms, probably.

In any case, the low impedance should make a -big- difference. I'd also consider adding a 1nF or 10nF capacitor from the Arduino pin to ground.