O Tannenbaum…

In the spirit of preparation for Christmas, here’s a neat little Christmas project you can easily do with your kids (or your mom-in-law!):

It’s a $8 soldering kit I picked up a month or two ago at Fry’s, the Velleman “3D Xmas Tree” MK130.  Velleman makes lots of these kind of cool little kits.

My mother-in-law inserting the LEDs to her color arrangement preference.

Some assembly tips:

When inserting the LEDs, be sure not to push the all the way in, leave some extra wire out so you can bend them as shown above.

It’s also very important when inserting the LEDs that the cathode (negative) leg of the LED go into the negative hole of the PCB (circuit board).  Here’s a quick reference:

electronics_led_diagram[1]

Do a quick check after all the LEDs are inserted that all of them are oriented properly BEFORE soldering.  If your LEDs dont’ have a flat edge (these don’t) another quick way to double-check is to look inside the “head” of the LED and check that the “bigger” part inside (on the right above) corresponds to the negative side (shown on the PCB with more flat and thicker white).

Same issue with polarity is there for the capacitors.  The caps conveniently have several large “-” signs running down the negative side, which means the other lead needs to go where it says “+” on the PCB.   Be careful also to not insert the capacitors all the way in either, as you need to leave room for bending them down.  Given the “3D” nature of this particular project, having the components not sticking out makes putting together the two PCBs much easier.

Once you have the LEDs where you want them, separate the extra wire on the other side which will serve to hold the LEDs in place while soldering them.  Do the same trick for other components.  I generally wait to clip off the extra wire until I’m absolutely sure that the component is placed properly, as it’s much harder to fix once the leads are shorter!

Finally, be careful when soldering so as to not overheat the PCB causing the pads to lift!  This happened a couple of times to me when making this tree!  Below is an example of lifted pad not from this project, but from a great Adafruit page on common soldering problems (of which I often have many!):

tools_Lifted_Pad[

I was able to find which joints were bad by using the circuit diagram enclosed in the box with the kit.  By figuring which lights worked and which didn’t was able to track the problem down to 2 branches of the circuit.

Capture2

After some tribulation, here is the final result:

Repeat a few more times if desired:

 

Merry Christmas!

Music and Lights!

This is a little project I took on recently for my son’s afterschool Makerspace.   The goal ultimately was to do something with Christmas lights, basically having an Arduino or something drive different strings of lights in time to some music.  I would serve as tech consultant but let the kids drive the creative side, with some tech learning on the way.

So basically the project idea started from this : http://www.instructables.com/id/Arduino-Christmas-Light-Controller/.  Got the relays, got the Arduino.   I took this code and hooked it up to 8 LEDs via Arduino just to see if it worked.   Got it working.  The problem was that getting the music in sync with the lights requires you hitting play at the right moment.   Also, doing a new song would require the kids to play a song over and over and measuring the time delays to update the program.  Not exactly fun.

Found a couple more Arduino projects to consider where they used a piezo speaker to beep out a tune electronically:  http://therandombit.wordpress.com/2011/11/21/arduino-piezo-speaker-super-mario/ and http://www.instructables.com/id/How-to-easily-play-music-with-buzzer-on-arduino-Th/.    The former one had a tune I really enjoyed but I preferred the way the latter was coded up, with 8 octaves of notes, actual BPM setting.

After some code update to make it easier for the kids to do their own songs, here we go.

Basically took a piezo speaker out of an old phone handset, hooked it up to pin 11 of the Arduino via a switch (for easy turn on/off) and a potentiometer (for volume control).   I then added some code where you can assign one of the 8 LEDs to a particular note of the song, when it plays the note, it lights the LED.

Here is what I have so far:

Showed this to the kids on Thursday and they seemed to all enjoy it!   They have started coding up Jingle Bell Rock note by note.   Will keep you all posted on the progress!

Hookup and code is below.  Enjoy!

Super-Mario-Pixel-psd37077

 

Capture

And the code:

// From: http://www.instructables.com/id/How-to-easily-play-music-with-buzzer-on-arduino-Th/
// NB: ALL NOTES DEFINED WITH STANDARD ENGLISH NAMES, EXCEPT FOR "A"
// WHICH HERE IS CALLED "AA" BECAUSE A0,A1...ARE THE ANALOG PINS ON ARDUINO.
// (Ab IS CALLED Ab AND NOT AAb)
#define	C0 16.35
#define	Db0	17.32
#define	D0	18.35
#define	Eb0	19.45
#define	E0	20.60
#define	F0	21.83
#define	Gb0	23.12
#define	G0	24.50
#define	Ab0	25.96
#define	AA0	27.50
#define	Bb0	29.14
#define	B0	30.87
#define	C1	32.70
#define	Db1	34.65
#define	D1	36.71
#define	Eb1	38.89
#define	E1	41.20
#define	F1	43.65
#define	Gb1	46.25
#define	G1	49.00
#define	Ab1	51.91
#define	AA1	55.00
#define	Bb1	58.27
#define	B1	61.74
#define	C2	65.41
#define	Db2	69.30
#define	D2	73.42
#define	Eb2	77.78
#define	E2	82.41
#define	F2	87.31
#define	Gb2	92.50
#define	G2	98.00
#define	Ab2	103.83
#define	AA2	110.00
#define	Bb2	116.54
#define	B2	123.47
#define	C3	130.81
#define	Db3	138.59
#define	D3	146.83
#define	Eb3	155.56
#define	E3	164.81
#define	F3	174.61
#define	Gb3	185.00
#define	G3	196.00
#define	Ab3	207.65
#define	AA3	220.00
#define	Bb3	233.08
#define	B3	246.94
#define	C4	261.63
#define	Db4	277.18
#define	D4	293.66
#define	Eb4	311.13
#define	E4	329.63
#define	F4	349.23
#define	Gb4	369.99
#define	G4	392.00
#define	Ab4	415.30
#define	AA4	440.00
#define	Bb4	466.16
#define	B4	493.88
#define	C5	523.25
#define	Db5	554.37
#define	D5	587.33
#define	Eb5	622.25
#define	E5	659.26
#define	F5	698.46
#define	Gb5	739.99
#define	G5	783.99
#define	Ab5	830.61
#define	AA5	880.00
#define	Bb5	932.33
#define	B5	987.77
#define	C6	1046.50
#define	Db6	1108.73
#define	D6	1174.66
#define	Eb6	1244.51
#define	E6	1318.51
#define	F6	1396.91
#define	Gb6	1479.98
#define	G6	1567.98
#define	Ab6	1661.22
#define	AA6	1760.00
#define	Bb6	1864.66
#define	B6	1975.53
#define	C7	2093.00
#define	Db7	2217.46
#define	D7	2349.32
#define	Eb7	2489.02
#define	E7	2637.02
#define	F7	2793.83
#define	Gb7	2959.96
#define	G7	3135.96
#define	Ab7	3322.44
#define	AA7	3520.01
#define	Bb7	3729.31
#define	B7	3951.07
#define	C8	4186.01
#define	Db8	4434.92
#define	D8	4698.64
#define	Eb8	4978.03
#define R       0        // rest

// DURATION OF THE NOTES
#define H 2*Q //half 2/4
#define Q 60000/bpm //quarter 1/4  // Here assumes 4/4 time signature!
#define E Q/2   //eighth 1/8
#define S Q/4 // sixteenth 1/16
#define W 4*Q // whole 4/4
#define EE E*4/3 // slightly slow E or a quick Q

int speaker = 11;                      // WRITE HERE WHICH PIN THE SPEAKER IS CONNECTED TO
int leds[] = {6, 7, 8, 9, 2, 3, 4, 5}; // WRITE HERE WHICH PIN THE LEDS ARE CONNECTED TO:  1, 2, 3, 4, 5 ....
int num_leds = 8;                      // WRITE HERE TOTAL NUMBER OF LEDS CONNECTED

// The Imperial March
/*
int bpm = 120;      // WRITE HERE THE TEMPO OF THE SONG (BPM)
int song[100][2] = {  // WRITE HERE THE SONG IN FORMAT {{NOTE, DURATION}, {NOTE, DURATION}, ... {NOTE, DURATION}} MAX NOTES = 100
       {AA3,Q},{AA3,Q},{AA3,Q},{F3,E+S},{C4,S},{AA3,Q},{F3,E+S},{C4,S},{AA3,H},
       {E4,Q},{E4,Q},{E4,Q},{F4,E+S},{C4,S},{Ab3,Q},{F3,E+S},{C4,S},{AA3,H},
       {AA4,Q},{AA3,E+S},{AA3,S},{AA4,Q},{Ab4,E+S},{G4,S},
       {Gb4,S},{E4,S},{F4,E},{R,E},{Bb3,E},{Eb4,Q},{D4,E+S},{Db4,S},
       {C4,S},{B3,S},{C4,E},{R,E},{F3,E},{Ab3,Q},{F3,E+S},{AA3,S},
       {C4,Q},{AA3,E+S},{C4,S},{E4,H},{AA4,Q},{AA3,E+S},{AA3,S},{AA4,Q},{Ab4,E+S},{G4,S},
       {Gb4,S},{E4,S},{F4,E},{R,E},{Bb3,E},{Eb4,Q},{D4,E+S},{Db4,S},
       {C4,S},{B3,S},{C4,E},{R,E},{F3,E},{Ab3,Q},{F3,E+S},{C4,S},
       {AA3,Q},{F3,E+S},{C4,S},{AA3,H}
};
int num_notes = 70; // WRITE HERE HOW MANY NOTES IN THE SONG!
int led_notes[] = {Ab3,AA3,F3,C4,E4,F4,Gb4,G4};  //WRITE HERE WHAT NOTES TO LINK TO WHICH LEDS, MUST BE SAME NUMBER AS NUMBER OF LEDS ABOVE!
*/ 

int bpm = 100;
int song[100][2] = {
 {C6,E},{AA5,E},{B5,E},{AA5,E},{G5,Q},{AA5,Q},{Bb5,Q},{B5,Q},{R,Q},{C6,E},{C6,E},{C6,Q},{B5,E},{B5,E},{B5,Q}
};
int num_notes = 15;
int led_notes[] = {C6,AA6,B6,G5};

/*
// Super Mario Bros (1985) Overworld / Main Theme
int bpm = 240; // want slightly faster
int song[100][2] = {
       {E6,E},{E6,Q},{E6,Q},{C6,E},{E6,Q},{G6,H},{G5,H},
       {C6,Q+E},{G5,Q+E},{E5,Q+E},{AA5,Q},{B5,Q},{Bb5,E},{AA5,Q},{G5,EE},{E6,EE},{G6,EE},{AA6,Q},{F6,E},{G6,Q},{E6,Q},{C6,E},{D6,E},{B5,Q+E},
       {C6,Q+E},{G5,Q+E},{E5,Q+E},{AA5,Q},{B5,Q},{Bb5,E},{AA5,Q},{G5,EE},{E6,EE},{G6,EE},{AA6,Q},{F6,E},{G6,Q},{E6,Q},{C6,E},{D6,E},{B5,Q+E},
       {G6,E},{Gb6,E},{F6,E},{Eb6,Q},{E6,Q},{Ab5,E},{AA5,E},{C6,Q},{AA5,E},{C6,E},{D6,Q+E},{G6,E},{Gb6,E},{F6,E},{Eb6,Q},{E6,Q},{AA6,Q},{AA6,E},{AA6,H}, //60
       {G6,E},{Gb6,E},{F6,E},{Eb6,Q},{E6,Q},{Ab5,E},{AA5,E},{C6,Q},{AA5,E},{C6,E},{D6,Q+E},{Eb6,Q+S},{D6,Q+S},{C6,H}
};
int num_notes = 74;
int led_notes[] = {AA5,B5,E5,G5,C6,E6,F6,G6};
*/

void setup() {
  pinMode(speaker, OUTPUT);
  for (int i=0; i < (num_leds-1); i++) {
    pinMode(leds[i], OUTPUT);
  }
}

// turn on LED that matches note
void leds_on(int note) {
  for (int i=0; i < (num_leds-1); i++) {
    if (led_notes[i] == note) {
      digitalWrite(leds[i],HIGH);
    }
  }
}

// turn on LED that matches note, turn off all others
void leds_on_v2(int note) {
  for (int i=0; i < (num_leds-1); i++) {
    if (led_notes[i] == note) {
      digitalWrite(leds[i],HIGH);
    } else {
      digitalWrite(leds[i],LOW);
    }
  }
}

void leds_off() { // turn off all LEDs
  for (int i=0; i < (num_leds-1); i++) {
    digitalWrite(leds[i],LOW);
  }
}

void play_note(int note, long duration) {
  int blink_lights = 1;  // false

  if (blink_lights == 1) {  // Turn on LED corresponding to note, if any
     leds_on_v2(note);
  }

  if (note != R) {                 // only play if not a rest
    tone(speaker, note, duration); // http://arduino.cc/en/Reference/Tone
  }
  delay(duration);

//  if (blink_lights == 1) {  // Turn off all LEDs
//     leds_off();
//  }

  delay(1); // note separator

}

void play_song(int which_song) {
  //int len = sizeof(melody)/sizeof(int);
  for (int i=0; i < num_notes; i++) {
    play_note(song[i][0], song[i][1]);
  }
}

// the loop routine runs over and over again forever:
void loop() {
    play_song(0);
    delay(1000);
}

“Contact Light”*

lunar_module_as12-51-7507b[1]

Working on names the other night for a new blog I’ve been wanting to do, it occurred to me that somehow relating it to my other internet endeavor, skywonders.com, might make some sense.   That enterprise, still having its own fits and starts, was started mainly as a way to show my sense of utter amazement and wonder at the universe we humans find ourselves in.  The utterly large Continue reading