Showing posts with label Fireworks. Show all posts
Showing posts with label Fireworks. Show all posts

11 May 2012

10 May 2012

First Production Batch Prototype 2 of Fireworks (V4)

Yay the joy. I have just etched the PCBs for the final production Boards.

Update: it turns out that this is still a prototype (the hardware is not yet production ready).

What is it? This board (once finished) will be able to launch fireworks trough electric fuses controlled by a Bluetooth device (I plan to write an Android app).

See the development history of this project.





Layout




23 Dec 2011

Fireworks, Revision 3

The 3rd one is always a good one ;)

Firmware (arduino C++ code), Layout as PDF.

Revision 3 of the fireworks board:

All layers.
Bottom layer.
Top layer.

Everything is now much tighter packed! I decided to use RJ45 to connect every six-pack of rockets (spare 2 pins used as 12V power supply). The arduino's FTDI port can be easily used with an FTDI breakout board.


Lession learned:
  • Use small pads only where needed (in tight spots)
  • Pull out all available ɥC pins
  • plan mount holes
  • put as much as possible onto the lower layer (easier to solder)
  • 8705 is a very useful power regulator when used with 3-5 cell LIPOs
Hardware documentation is available as PDF or you can get the whole source code including pcb (beta version).

21 Dec 2011

Fireworks, the first prototype PCB

Yay, today I made the first prototype PCB. Already soldered the absolute minimum onto it for tesing.

Top layer, with Arduino Pro mini 5V (top) and a single 8 bit shift register (below the Arduino).

Bottom layer.
The final layout will certainly differ from this a bit. I did not know how painful it is to solder headers which have connections on the front layer. Thanks to swiss machine pins it is possible without funny chemicals.

Also, the copper around  the via and pin holes are much too small. They make drilling and sometimes proper soldering very hard. It's just looks ugly too.

Further more, a new design decision was to use RJ45 as connector for the expansion to the electric fuses (connectors at the bottom).

Back to the drawing board!

18 Dec 2011

Fireworks!

Not much time left until it is Silvester. The remote controlled fireworks launcher is in prototyping stage. I got the first PCB layout together.

The pcb files are created with an open source program called pcb (free as in free code and free of charge) which should compile on nearly all UNIX like operating systems (incuding, osx, cygwin or mingw for windows).

The pcb application is also able to generate gerber files which are included in the pcb files download.

Some alpha code (written in C)  is available to be run on an Arduino Pro Min 5V.

This project builds on the knowledge gathered from 8 bit shift registers and Arduino in general.

Special thanks goes to Sämi for all his valuable input.

Circuit



Front side



Back side

13 Oct 2011

Finally, a three some (74HC595)!

As a follow up to the first tests with the 74HC594 and 74HC595 with Arduino I got some more 595 delivered, finally chaining them together. This example uses the 74HC595 chip.



Code:

First, you need to install (extract) the MM74HC595 library I wrote into your "<\libraries>" folder.

/**
 * Board: Pro Mini 5V
 * 
 * Chained 74HC595 8 bit shift register demo. Knight Rider!
 *
 * $Id: test_74HC595.pde 319 2011-10-13 20:48:10Z wunderlins $
 */

// how many shift registers are we using in serie? (must be >=1)
#define NUM_SHIFT_REGISTERS 3

// include library (must be installed unter <sketches>/libraries/MM74HC595/)
// http://spliffy.freeshell.net/hardware/MM74HC595.zip
#include <MM74HC595.h>

/**
 * Arduino pins:
 * 
 * PIN_SER: is the arduino serial pin
 * PIN_SCK: is the arduino pin for the shift register
 * PIN_RCK: is the arduino pin for the output register
 */
int PIN_SER = 8;  // pin 14 on the 75HC595
int PIN_SCK = 9;  // pin 12 on the 75HC595
int PIN_RCK = 10; // pin 11 on the 75HC595

int i = 0;
int direction = 1; // 1 = L2R, -1 R2L

// shift register instance
MM74HC595 registers(PIN_SER, PIN_SCK, PIN_RCK, NUM_SHIFT_REGISTERS);

// module pins already initialzed
void setup() {;}               

void loop(){
 
 // reset all pins (set to LOW)
 registers.reset();
 
 // set pin(s) to high
 registers.set(i, true);
 
 // activate outputs
 registers.update();
 
 // check if we have to change direction
  if (i+1 == NUM_SHIFT_REGISTERS * 8) {
   direction = -1;
  } else if (i == 0) {
   direction = 1;
  }
  i += direction;

  delay(100);
}


6 Oct 2011

Knight Rider with 74HC595 8 bit shift register

Please note, the next article «Finally a threesome» includes an arduino library for the 74HC595 (not for the 74HC594) and probably obsoletes this post.





 
/**
 * Board: Pro Mini 5V
 *
 *  $Id: test_74HC595.pde 293 2011-10-06 17:30:05Z wunderlins $
 */

int SER_Pin = 8;   //pin 15 on the 75HC595
int RCLK_Pin = 9;  //pin 12 on the 75HC595
int SRCLK_Pin = 10; //pin 10 on the 75HC595

//How many of the shift registers - change this
#define number_of_74hc595s 1 

#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins];

void setup(){
  pinMode(SER_Pin, OUTPUT);
  pinMode(RCLK_Pin, OUTPUT);
  pinMode(SRCLK_Pin, OUTPUT);

  //reset all register pins
  clearRegisters();
  writeRegisters();
}               

//set all register pins to LOW
void clearRegisters() {
  for(int i = numOfRegisterPins - 1; i >=  0; i--){
     registers[i] = LOW;
  }
} 

//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
int direction = 1; // 1 = L2R, -1 R2L
void writeRegisters(){

  digitalWrite(RCLK_Pin, LOW);

  for(int i = numOfRegisterPins - 1; i >=  0; i--){
    digitalWrite(SRCLK_Pin, LOW);

    int val = registers[i];

    digitalWrite(SER_Pin, val);
    digitalWrite(SRCLK_Pin, HIGH);

  }
  digitalWrite(RCLK_Pin, HIGH);

}

//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
  registers[index] = value;
}

int i = 0;
void loop(){
 
 clearRegisters();
 
  setRegisterPin(i, HIGH);
  
  writeRegisters();  //MUST BE CALLED TO DISPLAY CHANGES
  //Only call once after the values are set how you need.
  
  if (i+1 == numOfRegisterPins) {
   direction = -1;
  } else if (i == 0) {
   direction = 1;
  }
  i += direction;

  delay(100);
} 
 
Code example is borrowed from here: http://bildr.org/2011/02/74hc595/