Introduction: Improve Fiberoptic Display With LEDs and Micro-controller.
This lovely fibre optic bonsai tree was dead, the power supply was no where to be found, but more important, the motor was dead. This was a slow turning motor that isnt something that I can find an easy replacement for. The improvement was primarily making it portable, but also making it programmable. There are a few ways that I could have done this, but I already had something built, that would work. The circuit that I had built was running on an arduino nano, but this project looked like a good time to try the arduino mini.
This project uses:
9 RGB LEDs
a 9 LED flashlight reflector (I took one from a dead flashlight)
3 current limiting resistors for the LEDs
3 Pchannel MOSFETs
3 gate resistors for the MOSFET
Battery pack for 6v (I rewired two three battery packs to use a total of four batteries, because I didnt have a for battery pack.)
The display came with an on/off switch, and switched power jack, which I promptly wired for the battery pack so that when its plugged in, it disconnects the batteries.
This circuit treats the 9 LEDs like 1 big LED. I was building an RGB, but I could have built it using individually controlled LEDs, and it would have been more interesting. I could have controlled the LEDs with a couple TLC5940 chips, or shift registers and resistors, or even by charlieplexing, all would have been viable ways to do this same thing, and maybe next time, I'll do it differently.
I experimented with other LEDs but the results were less than ideal. First I tried candle flame LEDs heres the video.
https://www.youtube.com/watch?v=eSQFF9lvp64
I also tried a gang of fast flash color cycle LEDs. I glued about 18 together in a big blob, and tried it. Here is the video
This video shows the original parts, and the parts that make up my RGB flashlight, that I ended up using for the display.
https://www.youtube.com/watch?v=DqeuIN9O2DM
That flashlight used common cathode LEDs and P-channel MOSFETs, There are many ways to do the LEDs, you could even use LED strips, or individually controllable LEDs, or whatever you like, but this time, I used these parts.Step 1: Gut It, and Prep It.
9 RGB LEDs running full (white) is 540 mA, or just over half amp current limit on USB, but we wont be doing any white, we will only have 2 colors at full brightness at any one time, so a realistic consumption is around 360mA, which is within safe limits, so I wired this for USB, even but I run it from a wall wart USB charger It runs 5v on AC/USB, but 6v on (4)batteries.
Step 2: Make a Power Cable
Step 3: Build the New Lighting Source
The photos below show it running off an arduino mini, but it originally ran from a nano.
I included some pictures below to compare the mini and nano, and the programmer that I made to program the mini. The programmer was a cheap programmer that didnt have auto reset. I followed an instructable, and modified it a little to suit my needs.
Here is the instructable about making a USB programmer, I used it to program my mini, had to make an adapter too. You wont need to do this if you use a nano, but this was a good project to try the mini with.
https://www.instructables.com/id/Arduino-USB/
The LEDs are wires with all the reds together, the blues together, green together, and cathodes together. Its a simple matter of bending the leads from one LED down parallel so they contact the next LEDs same leads, and trim the excess leads. then solder a wire to each of the 4 contacts to the control circuit with the MOSFETs and resistors, then wire that to the microcontroller.
I've included a schematic for the LEDs and controller. You can wire it differntly, but you want to use PWM pins so I used 9, 10, 11.
https://www.youtube.com/watch?v=Do2lNCN8xzU
Step 4: Program It
I tried a few RGB color cycle programs, but ended up severely modifying someone else program. I added some randimizations to make the display less static, and hopefully more interesting. Heres is the current version.
/*******************************************************\
* RGB_Fade *
* Created for the use of common !cathode! RGB LEDs. *
* Cycles through the three colors, fading in and out. *
* The pins used must be PWM(~) pins. *
* *
* Author: Anthony Weber *
* Date Created: April 03, 2012 *
* *
* Slightly modified by Hippynerd (hippynurd@gmail.com) *
* to make transitions smoother, and make the cycling *
* more interesting. *
\*******************************************************/
//Color Pin Variables
int redPin = 11; //Isn't it obvious?
int greenPin = 10;
int bluePin = 9;
// Timing Settings Variables
int fadeSpeed = 1; //This is how much each LED changes on each step.
int delaytime = 1; // delay between cycles.
int delayCount = 1;
int randCount = 10;
// note: I tried to make fadeSpeed random, but bad things happened.
//Other Variables. Don't need to change these.
int red = 0; //Starting positions.
int green = 0; //If you change these, since the code is set up
int blue = 255; //to start at blue, it might act funny on the first cycle.
int mode = 0; //0 - blue to purple, 1 - purple to red, 2 - red to yellow,
//3 - yellow to green, 4 - green to aqua, 5 - aqua to blue
void setup() { //3-5-g-6
// declare pin 9 to be an output:
pinMode(bluePin, OUTPUT); //blue
pinMode(greenPin, OUTPUT); //green
pinMode(redPin, OUTPUT); //red
}
void loop() {
//Light 'em!
analogWrite(bluePin, blue);
analogWrite(greenPin, green);
analogWrite(redPin, red);
//Now change 'em!
if (mode == 0) { //blue to purple;
if (red >= 255) { //change places!
mode = 1;
delay(delaytime*50); //dont change right away.
} else {
red += fadeSpeed;
}
}
else if (mode == 1) { //purple to red
if (blue <= 0) { //change places!
mode = 2;
delay(delaytime*50);//dont change right away.
} else {
blue -= fadeSpeed;
}
}
else if (mode == 2) { //red to yellow
if (green >= 255) { //change places!
mode = 3;
delay(delaytime*50);//dont change right away.
} else {
green += fadeSpeed;///2; //I slow this down because it seems to blink by too quickly.
//if (green > 255) green = 255;
}
}
else if (mode == 3) { //yellow to green
if (red <= 0) { //change places!
mode = 4;
delay(delaytime*50);//dont change right away.
} else {
red -= fadeSpeed;
}
}
else if (mode == 4) { //green to aqua
if (blue >= 255) { //change places!
mode = 5;
delay(delaytime*50);//dont change right away.
} else {
blue += fadeSpeed;
}
}
else if (mode == 5) {//aqua to blue
if (green <= 0) { //change places!
mode = 0;
delay(delaytime*50);//dont change right away.
} else {
green -= fadeSpeed;
}
}
//This delay works pretty well, but feel free to
//change this if you want a faster but smoother fade.
//Changed delay to random for more fun display.
delayCount++;
if (delayCount >= randCount) {
delayCount = 1;
randCount= random (500, 5000);
delaytime = random (1, 150); // random delays to keep things interesting
}
delay(delaytime);
}