Introduction: How to Make an Expandable, Professional, Pc Controlled Fireworks Launcher

 The basis of this project is the arduino MEGA. If you have not experience with it it is a good platform for beginners and I will provide all the code necessary. With this you'll be able to launch hundreds of shells off.

First, order your supplies. You'll need-

- 2 arduino megas ($50-$60 each) or chinese knockoffs from ebay (I got them for $27 a piece, yes I know this makes me a terrible person) This could theoretically be done with any arduino using software serial but I didn't
- speaker wire or cat5 cable (or whatever you have thats long enough to go from where you want to be to where the fireworks will go that has at least 2 wires)
(X is the number of fireworks you want to launch/8 rounded up to the nearest whole number i.e. 37 fireworks=5)
- X male to female serial cables (http://www.sparkfun.com/products/65)
- X darlington transistor arrays (http://www.sparkfun.com/products/312)
- X female serial ribbon connectors (http://www.sparkfun.com/products/11157)
- X male serial ribbon connectors (http://www.sparkfun.com/products/11156)
- 2 project enclosures from radioshack or make your own
- 10 wire ribbon cable (http://www.sparkfun.com/products/10647)
- several breadboards and/or perfboards
- jumper wires or thin solid core wire
- 1 red led, 1 green led
- 1 toggle switch with led built in (or just a cheap switch)
- a way to attach a battery to your arduino (I used http://www.sparkfun.com/products/10512)
- a 2.2k ohm resistor for each firework
- X screw/screwless terminal blocks in sets of 8
- 2 cat5 female connectors or 4 terminal blocks for connection between arduinos
- a laptop

Step 1: Wire the Transmitter Arduino and Upload the Code

Connect two leds, one green to pin 22 (use a resistor so you don't blow the leds) and a red led to pin 23. To connect to the other arduino you will need to connect both the tx3 (pin 14) and ground pins so connect them to a nicely mounted speaker terminal or cat5 jack etc. for easy disconnect. Just follow the wiring diagram below basically (thanks Fritzing!). This is the easy part not much needs to happen except taking serial from the pc and transmitting it to the other arduino plus some status indicators.

You will also need to load this sketch to the arduino-

void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);  
  pinMode(22, OUTPUT);
  digitalWrite(22, HIGH);
  pinMode(23, OUTPUT);
  digitalWrite(23, LOW);
  Serial.begin(4800);
  Serial3.begin(100); 
}

void loop() {
  int incoming=0;

  // send data only when you receive data:
  if (Serial.available() > 0) {
    digitalWrite(13, HIGH);
    // read the incoming byte:
    incoming = Serial.read();
    Serial.println(incoming);
   
    if(incoming==254){
      digitalWrite(23, HIGH);
    }else if(incoming==255){
      digitalWrite(23, LOW);
    }
   
    Serial3.write(incoming);
  }
 
  delay(50);              // wait 
  digitalWrite(13, LOW);
}

Step 2: Wire the Receiver and Upload the Code

The arduino itself does not supply enough current to each pin to ignite a squib/ematch. So we will use transistor arrays. You could also use individual transistors but that is more work and money so why do that? Follow the wiring diagram I made connecting the digital pins in sets of 8 to transistor arrays through 2.2 kohm resistors then taking the output of the trasistors through to the serial connectors. Make sure that the last pin on the serial connector is directly from the 9 volt or whatever voltage your using and not from the arduino 5v. Use the ribbon cable to connect the transistor output to the serial connector (you will have to peel off one wire). Once again use a speaker terminal or cat5 etc. to connect the ground and tx3 pin from the other arduino to this boards ground and rx3. If the mega does not have enough outputs for you you can use a shift register or split the serial into two megas acting as receivers.

**EDIT**
An easier way is now available. Order this PCB http://www.batchpcb.com/product_info.php?products_id=89346&check=b350c5bbd3311b9c47fb5adb70ba0d60 (I make no profit from this board) or contact me for the gerber file to print your own.

here's the receiver code (I used the simplest pin configuration because I didn't need that many outputs, if you do you can change it to use 0-13 and then 16-53 afterwords)-

void setup() {               
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);
  digitalWrite(13,LOW);
  for(int i = 21; i < 50; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW);
  }
  Serial3.begin(100);
}

boolean isArmed=false;
boolean isClearForLaunch=false;
int firstSentNumber=0;

void loop() {
  int incoming=0;
 
  // send data only when you receive data:
  if (Serial3.available() > 0) {
    // read the incoming byte:
    incoming = Serial3.read();
   
    if(incoming==254){
      isArmed=true;
      digitalWrite(13,HIGH);
    }else if(incoming==255){
      isArmed=false;
      digitalWrite(13,LOW);
    }else if(incoming==253){
      isClearForLaunch=true;
    }else if(isArmed&&isClearForLaunch&&firstSentNumber==incoming){
      digitalWrite(incoming+20,HIGH);
      delay(500);
      digitalWrite(incoming+20,LOW); 
      isClearForLaunch=false;
      firstSentNumber=0;
    }else if(isArmed){
      firstSentNumber=incoming;
    }
  }
}

Step 3: Make Individual Lunch Strips

I used screwless terminal blocks from digikey but I wouldn't recommend these particular ones, they are very hard to squeeze open and fairly small. Basically you just want to connect pins 1-8 of the serial connector to each of the spots on the terminal block and the ninth pin which is hot to every pin on the other terminal block. You can then insert each end of the squib into the terminal blocks for quick and easy connection and disconnection. Mount the perf board or breadboard to some plywood or in another project box and you can attach that to your fireworks rack or simply near the fireworks if they are not in a rack.

Step 4: Program the Pc Controller

I wrote my interface in java using netbeans however feel free to use any language that supports serial communication. For setting up the libraries and such see http://arduino.cc/playground/Interfacing/Java Instructables isn't letting me post the code in this text box so I will include the code in an attached text file.

After you get the code working all thats left is to hook up your squibs, attach the launcher to the reciever and flip the switch on the reciever, connect each strip of 8 to the reciever with a serial cord, arm the system from the computer and press fire!