author
40Instructables1,696,812Views180CommentsLos AngelesJoined August 26th, 2008
A Maker since childhood with all the classic symptoms, a robot builder, and an Internet software CTO by day.

Achievements

100+ Comments Earned a bronze medal
1M+ Views Earned a silver medal
Automation Contest 2017
Contest Winner Runner Up in the Automation Contest 2017
Tech Contest
Contest Winner Runner Up in the Tech Contest
Halloween Decor Contest
Contest Winner Third Prize in the Halloween Decor Contest
course completion badge
Large Motors ClassClass Complete!
Show 4 More »
  • CarlS commented on CarlS's instructable Permanent Digital LED House Holiday Lighting6 months ago
    Permanent Digital LED House Holiday Lighting

    Thanks. Good ideas on the lighting. There are so many new materials and info on doing this now! Mine is still working - had to replace a few LEDs and power connectors in the Fall. I would re-do the power connections for sure - squirrels have chewed on the T connectors :-)I have not updated the code from the Instructable since I use a personal web site to set the colors. The drawing subroutines are below, and I can PM you a version with the proper indenting etc. if you need, though you may only be missing a couple of the ones below. I have a more limited holiday display due to comments from the family :-) Not going for one of the contests here :-)Radiate,5,40,255,0,0,0,255,0 Radiate,5,40,255,0,0,0,255,0 XmasColors Wait,8 RedWhiteOne more note: I tried the Vixen Lights app recen...

    see more »

    Thanks. Good ideas on the lighting. There are so many new materials and info on doing this now! Mine is still working - had to replace a few LEDs and power connectors in the Fall. I would re-do the power connections for sure - squirrels have chewed on the T connectors :-)I have not updated the code from the Instructable since I use a personal web site to set the colors. The drawing subroutines are below, and I can PM you a version with the proper indenting etc. if you need, though you may only be missing a couple of the ones below. I have a more limited holiday display due to comments from the family :-) Not going for one of the contests here :-)Radiate,5,40,255,0,0,0,255,0 Radiate,5,40,255,0,0,0,255,0 XmasColors Wait,8 RedWhiteOne more note: I tried the Vixen Lights app recently with a simple Arduino as a controller and I think it would work with this many LEDs, though I have not tried it.//----------------------------------------------------------------------// wait_secs//----------------------------------------------------------------------void wait_secs(int secs) { delay(1000 * secs);} // wait_secs//----------------------------------------------------------------------// set_color//----------------------------------------------------------------------void set_color(uint8_t r, uint8_t g, uint8_t b) { for(uint16_t i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, strip.Color(r, g, b)); } strip.show();} // set_color//----------------------------------------------------------------------// colorWipeUp - Fill the dots one after the other with a color//----------------------------------------------------------------------void colorWipeUp(uint32_t c, int wait) { for(uint16_t i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, c); strip.show(); delay(wait); }} // colorWipeUp//----------------------------------------------------------------------// colorWipeDown - Fill the dots one after the other with a color//----------------------------------------------------------------------void colorWipeDown(uint32_t c, int wait) { for(uint16_t i=strip.numPixels()-1; i>=0; i--) { strip.setPixelColor(i, c); strip.show(); delay(wait); }} // colorWipeDown//----------------------------------------------------------------------// rainbow//----------------------------------------------------------------------void rainbow(int wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<strip.numPixels(); i++) { strip.setPixelColor(i, Wheel((i+j) & 255)); } strip.show(); delay(wait); }}//----------------------------------------------------------------------// rainbowCycle - Slightly different, this makes the rainbow equally distributed throughout//----------------------------------------------------------------------void rainbowCycle(int wait) { uint16_t i, j; for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel for(i=0; i< strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); } strip.show(); delay(wait); }}//----------------------------------------------------------------------// Input a value 0 to 255 to get a color value.// The colours are a transition r - g - b - back to r.//----------------------------------------------------------------------uint32_t Wheel(byte WheelPos) { if(WheelPos < 85) { return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } else if(WheelPos < 170) { WheelPos -= 85; return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } else { WheelPos -= 170; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); }}//----------------------------------------------------------------------// xmas_colors//----------------------------------------------------------------------void xmas_colors() { int mod; for(uint16_t i=0; i<strip.numPixels(); i++) strip.setPixelColor(i, strip.Color(0, 0, 0)); for(uint16_t i=0; i<strip.numPixels(); i++) { mod = i % 30; if ((mod >= 0) && (mod <= 2)) strip.setPixelColor(i, strip.Color(255, 0, 0)); if ((mod >= 6) && (mod <= 8)) strip.setPixelColor(i, strip.Color(0, 255, 0)); if ((mod >= 12) && (mod <= 14)) strip.setPixelColor(i, strip.Color(204, 50, 0)); if ((mod >= 18) && (mod <= 20)) strip.setPixelColor(i, strip.Color(0, 0, 255)); if ((mod >= 24) && (mod <= 26)) strip.setPixelColor(i, strip.Color(255, 240, 0)); } strip.show();} // xmas_colors//----------------------------------------------------------------------// fade_ab - fade between 2 colors//----------------------------------------------------------------------void fade_ab(uint8_t cR1, uint8_t cG1, uint8_t cB1, uint8_t cR2, uint8_t cG2, uint8_t cB2, int wait, int num_steps) { int j; set_color(cR1, cG1, cB1); for (j=0; j<num_steps; j++) { set_color(cR1 + j * (cR2 - cR1)/num_steps, cG1 + j * (cG2 - cG1)/num_steps, cB1 + j * (cB2 - cB1)/num_steps); strip.show(); delay(wait); }} // fade_ab//----------------------------------------------------------------------// chase//----------------------------------------------------------------------void chase(int width, int gap, int loop_delay, int fR, int fG, int fB, int bR, int bG, int bB) { int len = width + gap; int R, G, B; int i, j; for (i=0; i<strip.numPixels(); i++) { for (j=0; j<=i; j++) { R = fR - (((i-j) % len) * fR / width); if (R < 0) R = bR; G = fG - (((i-j) % len) * fG / width); if (G < 0) G = bG; B = fB - (((i-j) % len) * fB / width); if (B < 0) B = bB; strip.setPixelColor(j, strip.Color(R, G, B)); } strip.show(); delay(loop_delay); }} // chase//----------------------------------------------------------------------// chase_single_up//----------------------------------------------------------------------void chase_single_up(int width, int wait, int fR, int fG, int fB, int bR, int bG, int bB) { // green dot moving down for(uint16_t i=0; i<strip.numPixels(); i++) { if ((i - width) >= 0) { strip.setPixelColor(i-width, strip.Color(bR, bG, bB)); } strip.setPixelColor(i, strip.Color(fR, fG, fB)); strip.show(); delay(wait); }} // chase_single_up//----------------------------------------------------------------------// chase_single_down//----------------------------------------------------------------------void chase_single_down(int width, int wait, int fR, int fG, int fB, int bR, int bG, int bB) { // green dot moving down for(uint16_t i=strip.numPixels()-1; i>=0; i--) { if ((i + width) <= strip.numPixels()) { strip.setPixelColor(i+width, strip.Color(bR, bG, bB)); } strip.setPixelColor(i, strip.Color(fR, fG, fB)); strip.show(); delay(wait); }} // chase_single_down//----------------------------------------------------------------------// sparkle//----------------------------------------------------------------------void sparkle(uint32_t col1, uint32_t col2, int wait, int steps) { uint16_t i, j, k; for(i=0; i<strip.numPixels(); i++) strip.setPixelColor(i, strip.Color(0, 0, 0)); for(k=0; k<steps; k++) { i = random(strip.numPixels()); j = random(2); if (j == 0) strip.setPixelColor(i, col1); if (j == 1) strip.setPixelColor(i, col2); strip.show(); delay(wait); strip.setPixelColor(i, 0); }} // sparkle//----------------------------------------------------------------------// red_white//----------------------------------------------------------------------void red_white() { #define pat_width 7 int i, j, k; strip.setBrightness(0); for(j=0; j<256; j++) { strip.setBrightness(j); for(i=0; i<strip.numPixels(); i++) { if (((i % pat_width) == 0) || ((i % pat_width) == 1)) strip.setPixelColor(i, 255, 0, 0); if (((i % pat_width) == 2) || ((i % pat_width) == 3)) strip.setPixelColor(i, 255, 255, 255); if (((i % pat_width) == 4) || ((i % pat_width) == 5) || ((i % pat_width) == 6)) strip.setPixelColor(i, 0, 0, 0); } strip.show(); delay(10); } for (k=0; k<200; k++) { for(i=0; i<strip.numPixels(); i++) { j = i + k % pat_width; if (((j % pat_width) == 0) || ((j % pat_width) == 1)) strip.setPixelColor(i, 255, 0, 0); if (((j % pat_width) == 2) || ((j % pat_width) == 3)) strip.setPixelColor(i, 255, 255, 255); if (((j % pat_width) == 4) || ((j % pat_width) == 5) || ((j % pat_width) == 6)) strip.setPixelColor(i, 0, 0, 0); } strip.show(); delay(100); }} // red_white//----------------------------------------------------------------------// middle_to_edge - fill the strip from the middle out//----------------------------------------------------------------------void middle_to_edge(int wait, uint8_t R, uint8_t G, uint8_t B) { int i; int n2 = strip.numPixels() / 2; for(uint16_t i=0; i<=n2; i++) { if ((n2 - i) >= 0) strip.setPixelColor(n2 - i, strip.Color(R, G, B)); if ((n2 + i + 1) < strip.numPixels()) strip.setPixelColor(n2 + i + 1, strip.Color(R, G, B)); delay(wait); strip.show(); }} // middle_to_edge//----------------------------------------------------------------------// bar_right - move a bar of the given width to the right//----------------------------------------------------------------------void bar_right(int width, int wait, uint8_t fR, uint8_t fG, uint8_t fB, uint8_t bR, uint8_t bG, uint8_t bB) { int i, j; for(uint16_t i=0; i<strip.numPixels(); i++) { for (j=0; j<width; j++) { strip.setPixelColor(i+j, strip.Color(fR, fG, fB)); strip.setPixelColor(i-j, strip.Color(bR, bG, bB)); } strip.show(); delay(wait); } strip.show();} // bar_right//----------------------------------------------------------------------// bar_left - move a bar of the given width to the left//----------------------------------------------------------------------void bar_left(int width, int wait, uint8_t fR, uint8_t fG, uint8_t fB, uint8_t bR, uint8_t bG, uint8_t bB) { int i, j; for(uint16_t i=strip.numPixels()-1; i>0; i--) { for (j=0; j<width; j++) { strip.setPixelColor(i+j, strip.Color(bR, bG, bB)); strip.setPixelColor(i-j, strip.Color(fR, fG, fB)); } strip.show(); delay(wait); } strip.show();} // bar_left//----------------------------------------------------------------------// radiate out from the center//----------------------------------------------------------------------void radiate(int width, uint8_t wait, uint8_t fR, uint8_t fG, uint8_t fB, uint8_t bR, uint8_t bG, uint8_t bB) { int i, j, k; int mid = strip.numPixels() / 2; for (i=0; i<mid; i++) { for (j=0; j<=i; j++) { if ((((i-j) / width) % 2) == 0) { strip.setPixelColor(mid + j, strip.Color(fR, fG, fB)); strip.setPixelColor(mid - j, strip.Color(fR, fG, fB)); } else { strip.setPixelColor(mid + j, strip.Color(bR, bG, bB)); strip.setPixelColor(mid - j, strip.Color(bR, bG, bB)); } } strip.show(); delay(wait); }} // radiate//----------------------------------------------------------------------// running mice//----------------------------------------------------------------------#define MAXMICE 40void mice(int num_mice, int width, int min_vel, int max_vel, uint8_t wait, uint8_t fR, uint8_t fG, uint8_t fB, uint8_t bR, uint8_t bG, uint8_t bB) { int i, j, k; int mPos[MAXMICE]; int mVel[MAXMICE]; int pos; int mDone[MAXMICE]; boolean bQuit; num_mice = min(num_mice, MAXMICE); // initialize the mice positions and velocities for (i=0; i<num_mice; i++) { mPos[i] = random(strip.numPixels() - width); mVel[i] = random(min_vel, max_vel + 1); if (random(2) == 0) mVel[i] = -1 * mVel[i]; mDone[i] = 0; } // move each mouse while(1) { // wipe the strip to the back color for(j=0; j<strip.numPixels(); j++) { strip.setPixelColor(j, strip.Color(bR, bG, bB)); } for (j=0; j<num_mice; j++) { for (k=0; k<width; k++) { pos = mPos[j] + k; if ((pos >= 0) && (pos < strip.numPixels())) { strip.setPixelColor(pos, strip.Color(fR, fG, fB)); } else { mDone[j] = 1; } } //mPos[j] = min(strip.numPixels() - width - 1, max(0,mPos[j] + mVel[j])); mPos[j] = mPos[j] + mVel[j]; } // j mice strip.show(); delay(wait); // quit if the mice are all done bQuit = true; for (j=0; j<num_mice; j++) { if (mDone[j] == 0) bQuit = false; } if (bQuit) return; } // while(1)} // mice

    View Instructable »
  • CarlS commented on CarlS's instructable Quick PVC Banner Stand11 months ago
    Quick PVC Banner Stand

    I think it just seemed OK that way. The end couplers on those extend them out a bit. The end size is about 28" x 20".FWIW, I added grommets to the banner and use minature bungee cords to hold the banner on the frame now.

    View Instructable »
  • CarlS's instructable Battery Powered LED Garage Lighting's weekly stats: 11 months ago
    • Battery Powered LED Garage Lighting
      107 views
      0 favorites
      0 comments
  • CarlS commented on CarlS's instructable Marching Band Field Prop1 year ago
    Marching Band Field Prop

    We started with the idea of a bigger size too, but the 4'x8' was a convenient form factor, and was tall enough to hide all the band members behind it. I don't think we tried to hide the sousaphones there. :-) The design would work at any size, though.Wind is an issue, and varies greatly. A surface this large is generally called a sail. If you live in Kansas, then I would not even try these. Here is So Cal, it was not too bad. On breezy days we taped 4 bricks to those middle supports.Good luck!

    View Instructable »
  • CarlS commented on CarlS's instructable WiFi Mesh Synchronized LED Bars1 year ago
    WiFi Mesh Synchronized LED Bars

    Thanks! Good Luck!

    View Instructable »
  • CarlS commented on CarlS's instructable Servo Controlled Marble Maze Build 21 year ago
    Servo Controlled Marble Maze Build 2

    The servos I used were pretty powerful, so they hold the maze when not in use. For the larger maze, I used counter-weights to balance it out, but I would still like to re-work that one to use servo arms or gears for more leverage and balance when off.

    View Instructable »
  • CarlS commented on CarlS's instructable WiFi Mesh Synchronized LED Bars1 year ago
  • WiFi Controlled LED Wedding Table Pieces

    Very nice! I just finished a similar one, but wanted mine to be stand-alone: https://www.instructables.com/id/WiFi-Mesh-Synchronized-LED-Bars/ I was not aware of the mcLightning library - looks great!

    View Instructable »
  • CarlS's instructable WiFi Mesh Synchronized LED Bars's weekly stats: 1 year ago
    • WiFi Mesh Synchronized LED Bars
      764 views
      22 favorites
      2 comments
  • CarlS entered WiFi Mesh Synchronized LED Bars in the Wireless Contest contest 1 year ago
  • CarlS entered WiFi Mesh Synchronized LED Bars in the LED Contest 2017 contest 1 year ago
  • CarlS followed Tecwyn Twmffat1 year ago
      • ☠Weedinator Part 1: Drive Mechanism☠
      • Arduino Cell Phone 4G Signal Booster / Repeater Part 1
      • Simple Manual Arduino 4 Axis Stepper Motor / 16 Channel LED Power Controller
  • CarlS followed witnessmenow1 year ago
      • Arduino Commute Checker
      • Upgrade Your $3 Bluetooth Module to Have HID Firmware
      • Avoid Hard-Coding WiFi Credentials on Your ESP8266 Using the WiFiManager Library
  • CarlS's instructable Marching Band Field Prop's weekly stats: 1 year ago
    • Marching Band Field Prop
      278 views
      0 favorites
      0 comments
  • CarlS entered Marching Band Field Prop in the PVC Contest 2017 contest 1 year ago
  • CarlS's entry Bucket Bot 2 is a winner in the Automation Contest 2017 contest 1 year ago
  • CarlS's entry Bucket Bot 2 is a finalist in the Automation Contest 2017 contest 1 year ago
  • CarlS commented on CarlS's instructable Glow in the Dark Tombstones1 year ago
  • CarlS's instructable Glow in the Dark Tombstones's weekly stats: 1 year ago
    • Glow in the Dark Tombstones
      376 views
      7 favorites
      2 comments
  • CarlS commented on CarlS's instructable Glow in the Dark Tombstones1 year ago
    Glow in the Dark Tombstones

    Rimshot please :-) Thanks!

    View Instructable »
  • CarlS entered Glow in the Dark Tombstones in the Halloween Contest 2017 contest 1 year ago
  • CarlS commented on CarlS's instructable Bucket Bot 21 year ago
    Bucket Bot 2

    An inverted bucket bot? :-) You can also have a flexible mount at the top and use contact switches around the edges to detect when an obstacle is hit.

    View Instructable »
  • CarlS commented on CarlS's instructable Bucket Bot 21 year ago
  • CarlS's instructable Bucket Bot 2's weekly stats: 1 year ago
    • Bucket Bot 2
      2,245 views
      19 favorites
      3 comments
  • CarlS commented on CarlS's instructable Bucket Bot 21 year ago
  • CarlS entered Bucket Bot 2 in the Automation Contest 2017 contest 1 year ago
  • CarlS posted an instructable Bucket Bot 21 year ago
  • CarlS commented on CarlS's instructable Internet Arduino Controlled T-Slot XY Table1 year ago
    Internet Arduino Controlled T-Slot XY Table

    Thanks - glad it was helpful.Those steppers sound good. I have used lower current / lower torque ones on a mobile robot and they were great. I used the Adafruit motor driver board and AccelStepper library.Your definition of racking is correct. I am surprised the one rod does not work since it mechanically connects the sides (well, through the belts in my setup). Make sure the screws are tight and belts fairly tight - not slipping at all. Are you using two motors or one on that axis? If it's two, they may not be moving exactly together. I only use one motor. You could extend that long shaft and put the motor right on that one. If you have a high acceleration on the motor, that could also be an issue - would require a stronger frame. But, yes, you should be able to put a long sha...

    see more »

    Thanks - glad it was helpful.Those steppers sound good. I have used lower current / lower torque ones on a mobile robot and they were great. I used the Adafruit motor driver board and AccelStepper library.Your definition of racking is correct. I am surprised the one rod does not work since it mechanically connects the sides (well, through the belts in my setup). Make sure the screws are tight and belts fairly tight - not slipping at all. Are you using two motors or one on that axis? If it's two, they may not be moving exactly together. I only use one motor. You could extend that long shaft and put the motor right on that one. If you have a high acceleration on the motor, that could also be an issue - would require a stronger frame. But, yes, you should be able to put a long shaft on both ends.Yes, for multiple screws, a custom bracket from angle aluminum or printed may work, and yes, it might be less adjustable. I have not tried that approach.Good luck!

    View Instructable »
  • CarlS's instructable Hawaiian French Toast Hash's weekly stats: 2 years ago
    • Hawaiian French Toast Hash
      373 views
      13 favorites
      2 comments
  • CarlS commented on CarlS's instructable Hawaiian French Toast Hash2 years ago
    Hawaiian French Toast Hash

    It's my own fault for giving him some tidbits :-)

    View Instructable »
  • CarlS's instructable WiFi Connected LED Bars With Shared Animations's weekly stats: 2 years ago
    • WiFi Connected LED Bars With Shared Animations
      977 views
      19 favorites
      0 comments
  • CarlS commented on CarlS's instructable Low Cost Hobby Servo XY Table2 years ago
    Low Cost Hobby Servo XY Table

    Nice project. Yes, those linear bearings can be expensive, so a lot of projects use v-groove rollers now. The T-Slot version I also published is another approach, albeit more expensive. It is a lot more relaible, though.

    I think most CNC type applications assume there are no obstacles in the workspace - avoiding those would clearly change the drawing. There are numerous vector conversion programs - maybe you can go from an intermediate format like gcode?

    View Instructable »
  • CarlS commented on CarlS's instructable Built In Book Cases2 years ago
    Built In Book Cases

    Looks nice - the base cabinets definitley give you more surface space for the printer etc.

    View Instructable »
  • CarlS's instructable LED Holiday Tree with Shared Internet Control's weekly stats: 2 years ago
    • LED Holiday Tree with Shared Internet Control
      623 views
      13 favorites
      3 comments
  • CarlS commented on CarlS's instructable Permanent Digital LED House Holiday Lighting2 years ago
    Permanent Digital LED House Holiday Lighting

    Great info - thanks!

    View Instructable »
  • CarlS commented on CarlS's instructable Built In Book Cases2 years ago
    Built In Book Cases

    The cabinets fit inside the frames, so I just used a few drywall screws from the sides to connect the cabinets to the frames. Be careful on the placement so the screws don't go into the cabinets.

    View Instructable »
  • CarlS commented on CarlS's instructable Low Cost Hobby Servo XY Table2 years ago
  • CarlS commented on CarlS's instructable Internet Arduino Controlled T-Slot XY Table2 years ago
    Internet Arduino Controlled T-Slot XY Table

    Thanks. I do not think this approach would be suitable for very high precision positioning. Using stepper motors would help, as well as making sure everything is well tuned. But, there are many XY table hardware options out there that may be more reliable. I have not used them, so cannot make any recommendations. Good luck!

    View Instructable »
  • CarlS commented on CarlS's instructable Built In Book Cases3 years ago
    Built In Book Cases

    Looks great! All set for tyhat new TV! :-)

    View Instructable »
  • CarlS commented on CarlS's instructable LED Bar Light3 years ago
    LED Bar Light

    Cool - glad to hear it! I am waiting for the fluorescent tubes to fail in my garage :-)

    View Instructable »
  • CarlS posted an instructable LED Bar Light3 years ago