Archive for the 'DIY' Category

Hobby/RC Servo Control in PSoC



The PSoC family is my go to line of processors for prototyping.  It is like having a breadboard full of digital and analog circuits that you can wire up on the fly. I have been doing some stuff with hobby servos lately so I needed to figure out how to do it on the PSoC.

Hobby Servos


From Wikipedia


Image from Adafruit


Hobby servos set their rotation based on the length or a repeating pulse. The pulse should be 1ms to 2ms long and repeat every 20ms.  One end of the rotation is at 1ms and the other is at 2ms.

The PSoC PWM  Component


The PWM component is perfect for this job.  The PWM component can be setup to have a period and an on time.  The period should be 20ms and the on time would be between 1ms and 2ms.  The component uses a clock and two counter values.  The component will count on every clock pulse.  It resets the counters after the period count has been reached and the CMP value determines how long the pulse is logic high.

The PWM output goes to the servo control line.  Here is the configuration dialog box for the PWM component. The graph at the top is a good reference for what the output will look like.


The goal is to have a pretty decent resolution to set the 1ms to 2ms pulse.  I chose a 2MHz clock.  I picked the fastest clock that would still fit within the 16bit (65535) limit of the control.  PSoC clocks are derived from system clocks, so you need to pick values easily divided down from them.  The IDE helps with creation of these clocks.  At 2Mhz the period (repeat rate) should be set to 40,000.  The equation is the clock * period(in second) = period counts (2,000,000 counts/sec * 0.02 secs = 40,000 counts).

The CMP Value is how many counts the high pulse should last.  The equation is the same. For 1ms the count would be (2,000,000 cnts/sec * 0.001secs =  2,000 counts) and for 2ms the counts would be 4,000.  The range is 2,000 to 4,000 (2,000 count resolution).  This is better than most hobby servos can do.

The Code

The IDE will generate a bunch of functions, a custom API, for each component used when the application is built. There are two PWM Component functions we need to use for this application .

  • PWM_Servo_Start() This will initialize the component and get it running. This is called once at the beginning of the program.
  • PWM_Servo_WriteCompare(val) This sets the CMP Value that will be used to set the pulse length.

I also wrote a function the can set the value by degrees.

void setServo(float degrees)
unsigned int val;
// convert degrees to compare value
// 2000 to 4000 = 0 to 180
// value is
val = (degrees / 180.0 * 2000.0) + 2000;


The Results

Here is a screen shot of my logic analyzer. The output was set for 1/2 rotation. The pulse is 1.51ms and the period is 20.14ms.  That is close enough for me.  It is likely the clock speed is different between the PSoC and  and the analyzer.



Typically you will have to tune the to the actual servos used.  Just tweak the endpoint values until you get the rotation you want.

A Line-us Clone


I have been going to the monthly Amp Hour, Hardware Happy Hour meetup.  A lot of people bring something to show.  My projects are too big.  Also, you need to bring your own power.  The meetup standard seems to be running off a USB cord. I was brainstorming ideas, when I saw the Line-us project on Kickstarter. It looked like the perfect size and power. I also love the challenge of non linear kinematics.


I decided to make a clone of it.  I started by importing one if their drawings into CorelDRAW and scaling it up to 1:1.  I then added some measurements.  I rounded them up to 80mm for the pen arm and 30mm and 50mm for the linkages.


I looked into hobby servos and found that the “mini” size looked about right.  I ordered 4 of them from Amazon.  I made sure to get metal output shafts because I thought I might have to press them into the 3D printed arms.




I created a basic design in PTC CREO.  I added a lot of construction sketches for the linkages to help me with the kinematics later.  I downloaded a model of the servo from GrabCAD  to use while I waited the delivery.


I used 3mm bearings for all the joints.  These are pressed into the linkages.  This would allow me to firmly tighten the joints and not have to worry about slop in the joints.


When the servos arrived, there were slight differences in from the model.  The mounting holes we much smaller at about 2mm.  I had to reprint with some changes.

My concept was to press the arms onto the servo shafts.  This sort of worked, but after a few crashes, they loosened up.  I ended up using a drop of thick super glue to secure them.  They were able to stall the motor without slipping.  It is important to mount the arms at the precise angle.  I made an Arduino sketch to hold the servo in the precise position while attaching the arms at the angle I wanted.  Each servo has a 180° travel.  The upper arm travels from 135° to negative 45°.  The lower arm travels from 45° to 225°.


In order make the pen go where you want it to go, you have to figure out what angle to set the arms. This is not a simple linear equation. You have to solve a multi-step geometry problem for each new location. I’ll walk you through the basic process. I placed the axis of the two servos at XY 0,0 to simplify things. You know the desired Pen Tip location, so start working back towards the cranks.

  • Step1: Find the Pen A point. You know the lengths of the linkages between the 0,0 point and the pen tip. They are both 50mm. Each arm end has a set of points where it can exist that scribes a circle. If the desired pen point is within reach of the machine, the circles (green ones) will cross at two points. The solution is a well documented process. I used the C code from this page. So far, I found that using the location, of the two, with a higher Y value is the one to use.
  • Step 2: Find the Pen B point. Pen B is easy to find because you now know the slope of the Pen Arm. Multiply the X distance from the pen tip to the Pen A point by the ratio of the length of the pen arm (80mm) over the length of the arm from Pen Tip to Pen A (50mm) and add it to the pen tip. Do the same for the Y axis.
  • Step 3: Now that you know the Pen B location, you can do the intersecting circles (red ones) trick again. This time I used the left most point of the two.
  • Step 4: Find the angles. Use the X and Y distances of the crank tips and the atan function to get the angles. ( angle = atan(deltaY / deltaX) )

Another problem with non linear machines is that moving between two points will not be a straight line. The points will typically be connected with a slightly curved line. You need to constantly recalculate points along the way to keep it straight. If you break a line into smaller segments, the connecting curves also get smaller to the point where they are not notices.





Everything I chose was for prototyping ease and probably not the final solution. I used an Arduino UNO as the controller. I used a PCA9685 based servo motor controller for the servo. The Arduino could probably handle it on its own, but the wiring is so clean and simple with this. I used a breadboard power supply to power the servos. It had a handy switch to kill the power to the servos without killing the Arduino.




The Results

Here is a video of the machine running. The rectangle is hard coded via some for loops recalculating at 1mm increments. The results are shaky, but consistent with the Line-us results. The machine is quite rigid. Most of the shakiness comes from the servo motion. I also do not have the machine held down. If I get some magnets like Line-us, it might help.


Open Source (sorry)

I don’t think it is fair to the Line-us folks to release any files at this time. I think there are plenty of resources in this blog post if you want to clone it yourself. So far I only have about 5-6 hours into the project, so it is pretty a pretty easy project.

The real Line-us looks very polished and they are selling it at a good price. I am sure a lot of the work they did was on the UI, which I did not replicate at all.

Next Steps

I need a way to stream drawing data to the machine. I would like to use g-code. It also needs a UI and I thought Easel might be best. For the gcode I might try hacking Grbl. I would just add a timer that reads the current location at about 5hz, send it through the math and set the servos. Any value above Z 0 would be pen up.

For Easel, I could create a template that shows the usable work area. You would then just click Carve






grAMPS 1.0 Stepper Motor Shield


The newest version of the CNC controller software, grbl (0.9g at this post) has a lot of cool new features, but the two that caught my attention were the ability to compile and upload from the Arduino IDE and support for multiple Arduino types including the Arduino Mega 2650.  I have always found the I/O count and memory of the Arduino UNO very limiting.  I quickly compiled it onto a Mega and hand wired a RAMPS board for testing.  It worked great.


The RAMPS board is a famous open source RepRap 3D printer controller.  It is an acronym for Reprap-Arduino-Mega-Pololu-Shield.  It is so simple and hackable that I have used it for dozens of CNC projects. The RAMPS board made it easy to hook up all the wires, but you can’t just plug it into MEGA because grbl requires that certain I/O is grouped into a single I/O port.  RAMPS was designed for 3D printer firmwares that do not have that limitation, so things like X,Y and Z step are not all on the same port.  I am sure you could hack grbl to break that limitation, but I wanted to only touch the config files.

The RAMPS also has a ton of features, like (3) thermocouple inputs that are not needed, so I decided to make my own version of a RAMPS with just the features that a CNC router like the Shapeoko needs.  When I realized I could use the name grAMPS (grbl+RAMPS), I wanted to get it done as quickly as possible.  Here are the features I implemented.

  • Stepper drivers for X, Y and Z.
  • The Y axis is setup for dual drive with two ganged stepper drivers (like Shapeoko).  If you wanted dual on a different axis, you just need to modify the pin mapping a little.
  • A spindle control circuit.  This uses a high power MOSFET.  I have it hooked up to a 10 bit PWM channel.  It works great with no thermal issues.
  • Separate power inputs for the Stepper Drivers and the Spindle so these can be run at the optimal voltages.
  • There are terminals to hook up a fan to cool the drivers using the motor power supply
  • X, Y and Z limit switches are brought out to a terminal block.
  • The Z probe function is brought out to a terminal block.
  • There are buttons for Feedhold, Resume, grbl Reset and Arduino Reset.
  • IOREF is used for the stepper driver logic voltage, so you could try this on an Arduino DUE board.  There is a jumper in case you have an old Arduino that does not have the IOREF pin.
  • Microstep selection jumpers.

I hand assembled one in about 30 minutes.  The part count is quite low.


Final Thoughts

The only thing I would change is the power terminal blocks.  There are a little small for heavy gauge wire.  Everything else I like.  I like the clean layout. I love how fast and easy it is to assembly.  The parts cost is quite low except for the 0.10″ pitch terminal block.  That is a couple dollars by itself.

I have about 15 raw boards.  I would love to get them in the hands of some CNC builders.  I will be at Maker Faire NY.  Find me or tweet me, @buildlog, during the faire for a free one.   My hackerspace, Pumping Station One, will have a booth there.  I might spend some time there.


Source (CC-A-SA)


Schematic 32028

Gerber Files 16030




Bridgie – A new look for a CNC router

Bridgie CNC Router

When our Hackerspace, Pumping Station One, had it’s mini router repossessed by a member who was leaving, I decided to design a replacement.   As always, I wanted to try out some new ideas on the build.  I also wanted a project made primarily in metal to force me to get up to speed on using my CNC Bridgeport.  The result is Bridgie.



Bridgie was inspired by the Bridgeport’s sliding X axis, so the working name became Bridgie.  The other inspiration came from a sliding chop saw.  This was used on the Y axis.  The Y axis is remarkably stiff and makes the Z far stiffer than many other routers I have used..  All rods except for the Z are 20mm hardened steel and the 12mm ball screws add strength.  The X is even stronger and the bearings always stay directly under the spindle.  The entire machine weighs about 45 lbs..

Bridgeport  Bosch_10_Sliding_Miter_Saw_Large


Clean Design

I wanted a very clean design, so I designed it so it is totally self contained.  The power supply, controller, limit switches and motors are totally contained inside the body of the machine.  The only external interfaces are power and USB on the back.  There is also a fan on the back that blows directly on the motor drivers and flushes any hot air out of the interior.

Spinning Ball Nuts

It uses 12mm ball screws on the X and Y axes.  In order to bring the motors inside, I decided to use spinning nuts and stationary lead screws.  This actually simplifies things because you don’t need to put expensive bearings on the lead screw, you just firmly attach it to the end plates.  The lead screw becomes a structural member in the machine.  The bearing on the nut is important for reducing backlash, so I used a large dual angular contact bearing.  These were about $10 each from VXB.  I did not take too many pictures during assembly, so here are some screenshots and renderings of the design.

Spinning Lead Screw Nut

Exploded view of the nut assembly.

Top view of X axis nut area

Top view of X axis nut area

Bottom view of X axis


Controller and Firmware

The controller is an Azteeg X3 with a Viki LCD.  I have used the X3 on a lot of projects.  It worked really well on this project because it has the on board SD card and works well with the Viki LCD.  The firmware is a highly hacked version of Marlin.  Here is what I changed.

  • Totally altered the LCD menu system to be right for a router.
  • Tore out all the temperature stuff.
  • Left in the extruder features in case I want to add a rotary axis.  I have used the extruder as a 4th axis successfully on other projects.
  • Added a Z zero touch plate feature.
  • Added a G54 machine offset like feature in EEPROM.  You you set a 0,0,0 for your workpiece, you can recall this later if there was a power failure or other crash.
  • The arrow keys on the Viki jog the machine.  In jog mode the up and down keys jog in XY.  The rotary encoder is still active and sets the rate of the jog, so you can jog XY in fast, slow and micro mode all from one screen.  Z can be jogged as well on it’s own screen.
  • There is a feedrate override feature on the main screen to speed up or slow down the feedrate.
  • All features are accessible via gcode, so pendant use is not required.

Homing and Work Offsets

The machine can be homed at any time.  The Z homes first at the top of travel before homing the X and Y so this is less likely a chance to hit a clamp.  Homing at the top of Z is not too useful for setting up your job, but the machine will now know the limits of travel and will never crash into the ends of travel.

The machine then homes at minimum X and Y.  There are also two other configured locations called “park” and “access bit”.  Park moves to center X, zero Y and top of Z.  The head is out of the way in this spot so it is easy to clamp the work piece in this location.  It is also has the minimum footprint in this mode for easy transport.  It also has an access bit location that moves the spindle to the front for easy access to change the bit.

You can jog and set a work 0,0,0 anywhere you want.  The machine resets it’s soft limits so jogging or G Code cannot crash at either end of any axis.  If you restart the machine, you can recall the last work 0,0,0 so a previous job can be completed accurately.

Feature List

  • Work area 12″ x 8″ x 3.5″
  • T Slot table (larger on all sides than the work area for clamping).
  • Sliding X table – Like a Bridgeport.
  • Spinning lead screw nuts.
  • Jogging with the pendant arrow keys
  • Z touch plate.  You can manual set the Z zero on the top of the workpiece or it can be done automatically with a touchplate.
  • X,Y,Z limit switches.
  • Park feature that moves the machine into it’s smallest size for transport.
  • Weight: heavy…about 45lbs
  • Soft limits.  If you set a new work zero, the machine still knows the new limits of travel.
  • Does not need a PC.  It can run completely off the SD card with control via the pendant.
  • No exposed wiring.
  • Super quiet DC spindle.
  • Cooling Fan directed on drivers, but flushes the whole interior.
  • “Park” command shrinks the size to smallest footprint to help with transport.
  • Freaking heavy at over 45lbs


To Do

  • It would be nice to have easy access the the SD card.  It is buried inside the unit now and you need to upload files to it via USB.
  • Add a real feed hold (immediate deceleration like grbl does now)


  • There a few thing I would do to make it a little easier to fabricate.  A few holes were difficult to drill and tap and some simple changes would make that a lot easier.
  • I added an e-stop button since taking these pictures that cuts the DC power.

The Delta Router + 4th Axis



Every year I make a new thing for ORD Camp.  This year I made a delta router.  The ORD contraptions I make, have one primary function; to spark conversation.  This means they have to be interesting, a little whimsical and a little cool looking.  They are generally rather small for portability and to keep the costs down. Practicality and suitability are way down the list, so go ahead and snark away.  If you do, you are missing the point.

This year there happened to be a session on creativity with constraints.  The question we debated for an hour was, do constraints help or hurt the creative process. Constraints can move you out of your comfort zone and maybe that is a big part of creativity.  The topic was perfect for me because I had intentionally challenged myself with a few constraints on this project.

  • Use non captive stepper motors. Not a lot of people have seen these in use, they are cool to watch and they simplify the design.
  • Limit myself to 3 unique fabicated parts.  People keep thinking deltas are more complicated than .  This was to demonstrate the simplicity.  Go ahead, design a Cartesian machine with only 3 unique fabricated parts.  All other parts had to be commonly available parts.
  • Use stock reprap software.  I could only touch the configuration files.


I met all the constraints except for one.  I designed a common top and bottom bulkhead, but at machining time I decided it was silly to to spend the time to add holes only used on the top to the bottom and the same with the top.  So the four unique fabricated parts are the top, the bottom, the carriages and the end effector.  The top and bottom are 3/4 inch Baltic birch.  The other fabricated parts are 3mm carbon fiber.  All parts were setup and cut in less than 30 minutes on my homemade CNC router.  A 3D STEP of my design is here.


The vertical rails are MakerSlide.  I used steel V wheels because I had them laying around.  The rest of the mechanical parts are Actobotics parts from Servo City.  I thought they were an awesome discovery and then the next day I saw that Sparkfun started to sell them.  They really worked out great.  My only complaint is that they are imperial thread based parts.  I prefer all metric on my designs.

The non captive stepper motors are really cool.  The thread is a 2 start 8mm trapoidal, so it moves 4mm per rev.  They are quite fast and strong.  I custom ordered them at Robot Digg.  The only drawback is you cannot move them by hand.  You can’t spin the rod or the motor.  In this design they are a little vulnerable too.  If they get banged hard they could bend.

The linkages are Acrobotics heavy duty ball ends attached to some standoffs I got at McMaster.


I used some mini arcade style switches for the limit switches.  They are pretty nice snap acting switches, but probably a little less accurate than microswitches.  I chose them because they would be super simple to mount without adding mounting brackets.


The controller is my favorite reprap controller; the Azteeg X3.



The spindle is a brushless DC hobby motor.  It is a Turnigy Trackstar.  The speed controller is a Turnigy Plush 30.  The shaft is 1/8″.  I used a simple shaft coupler to mount the bit.  This added a lot of vibration so the motor could not run at full speed, but that was OK becuase the full speed is close to 30,000 RPM and 550Watts!.  I eventually manually balanced the coupler and it runs a lot smoother now.  I did it by drilling through the existing set screw holes to the other side with a small bit.  I enlarged that hole until it was balanced.





4th Axis


Later when I got home, I thought it would be cool to add a rotary axis to it.  The challenge was going to be using the extruder motor logic for the rotary axis.  I had this attachment laying around that was bought from eBay a few months ago.  A typical 4 axis machine simply disables one of the axes while using the rotary.  That is not possible with a delta, so all 4 axes need to run at the same time.  It is quite fun to watch.



It was perfect because it was so small.  It has a 6:1 reduction gear inside.  I made a simple base for it that would allow it to be quickly mounted to the router.



Firmware Changes.

The firmware changes to Repetier were pretty simple.  Extruders use millimeters as the feed unit, so I just converted that to degrees.  The motor is 200 steps/rev with 16x microstepping plus 6: 1 gear reduction.  This yielded 53.333 steps per degree.   I changed the safe extruding temperature to a very low value and then just wired a 100k resistor across the thermistor pins so it read a constant value above the safe temperature.

 CAM Software

I don’t have any high end CAM software that does anything really cool on a rotary.  I did have an evaluation copy of DeskProto, but that timed out.  I did have Vectric V Carve that does have a wrapped rotary feature.  That would be good enough to do my Hello World project.  I had to write a post processor for it.  I basically hacked the Mach3 wrapped rotary post processor.  I had to make it really simple and tell it convert “A” moves to “E” moves.  There were a couple other changes too. The post processor is here.


Changes and Issues

  • I really need a tail stock to support the stock and help set up the job level.


  • The feed rate on rotary axes are tricky because millimeters per minute is quite different than degrees per minute and there is no way to deal with that in GCode.  The actual feed rate through the material depends on the radius (Z).  Programs like Mach3 can compensate for it.   I could really hack the firmware or maybe write a post post processor to compensate the speed based on the Z.
  • I need to get some real software to some interesting carving with this thing.


First Job Video

Go Deltas!





RepRap Brushless DC Spindle Control

I need a tiny spindle for a CNC Build Club project I am working on.  I decided to use a Brushless DC  Hobby motor.  These motors have a huge amount of power for their size and cost.   I want the machine to be able to turn the spindle on and set the speed via GCode so I spent some time testing this out.

You need to power these motor with special 3 phase controller.  These are typically controlled like a hobby servo, so the interface is a little different than a typical spindle motor.  The machine is going to be a delta type machine, so I will be using RepRap firmware.  Marlin was selected over Repetier because it has built in servo control.

Part Used

The motor is a Turnigy Track Star motor.  I like it because it is sealed and air cooled and it is 550W.  That is over 2/3hp.


This is the Brushless Electronic Speed Control (BESC) I used.  It is a Turnigy Plush 30A.  It has a battery eliminator circuit, which is basically a 5V output to eliminate the need for a battery for the RF receiver and servos.  This is the thin red wire on the 3 wire connector.  This should not be used because the Arduino has it’s own 5V supply.



The controller I used is an Azteeg X3.


 Hobby Servo PWM

Hobby servos use pulse width to control the position of the servo.  You basically use a pulse from about 1ms (off) to 2ms (full speed) to control the servo.  This must be repeated about every 20ms.



The BESC has a safety feature where you must turn it on in a special sequence.  You must set the pulse length to minumum (1ms), turn on the motor power supply, wait until you hear the startup beeps, then a few more beeps which tell you the count of batteries connected.  You can then vary the pulse length to control the speed.

Basic Arduino Control.



The first thing I worked on was basic manual control using an Arduino.  I started with the “Servo…Knob” example that comes the Arduino IDE.  I modified it a bit to match the pins I was using.  It reads the voltage on a potentiometer and uses the value to set the pulse length.  The sequence was, turn the knob to the minimum, turn on the power supply, wait for the startup beeps, then use the pot to control the speed.  At first it did not work.  I looked at the servo library code and found it used 540 microseconds for the minimum pulse and 2400 microseconds for the maximum pulse length.  I switched from myservo.write(val) to myservo.writeMicroseconds(val) to use the actual time values and it worked.

Here is the code.

// based on the servo...knob example.
#include <Servo.h> 

// define the min and max because the servo library has a wider range 
#define MIN_PULSE 1000
#define MAX_PULSE 2000

Servo myservo; // create servo object to control a servo 

int potpin = 0; // analog pin used to connect the pot
int val; // variable to read the value from the analog pin 

void setup() 
 myservo.attach(3); // attaches the servo on pin 3


void loop() 
 val = analogRead(potpin); // reads potentiometer (value between 0 and 1023) 
 val = map(val, 0, 1023, MIN_PULSE, MAX_PULSE); // scale between 1ms and 2ms
 Serial.println(val); // show the values
 myservo.writeMicroseconds(val); // sets the servo using microseconds 
 delay(20); // wait a bit

Automatic Startup Using Arduino

The next step was to try semi-automate the startup sequence.  In the previous step, I found that holding the pulse to the minimum length for about 4 seconds was long enough.  This code would test that.  After startup the Arduino output the minimum pulse, lit an LED as a signal to turn on the power supply, then wait for 4 seconds.

// based on the servo...knob example.
#include <Servo.h> 

// define the min and max because the servo library has a wider range 
#define MIN_PULSE 1000
#define MAX_PULSE 2000

Servo myservo; // create servo object to control a servo 

int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin 
int led = 13; // led pin

void setup() 
 pinMode (led, OUTPUT);

 myservo.attach(3); // attaches the servo on pin 3 to the servo object
 delay(1000); // wait a bit for the human to get ready

 myservo.writeMicroseconds(MIN_PULSE); // go to the low end
 digitalWrite(led, HIGH); // signal p/s turn on
 delay(4000); // wait a bit
 digitalWrite(led, LOW); // ok to control with pot

void loop() 
 val = analogRead(potpin); 
 val = map(val, 0, 1023, MIN_PULSE, MAX_PULSE); 

RepRap Control


The plan was to use the servo control feature to adjust the speed and the heater control circuit to control the power. Here are the changes I had to make to Marlin. Search for these lines in the files indicated and change them.

Overview: The temp sensors are all disabled.  You need to remove HEATER_BED_PIN from the array of SENSITIVE_PINS or the M42 command will ignore it.  Setup what pin you want for the servo output.  I changed the default pulses to comply with what the BESC wanted.

in file configuration.h
#define MOTHERBOARD 67  //azteeg X3
#define TEMP_SENSOR_0 0
#define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0
in file pins.h
#define SERVO0_PIN         31
in file servo.h
#define MIN_PULSE_WIDTH 1000 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2000 // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH 1000 // default pulse width

I used Repetier host to talk to the controller.   Here is the GCode I used to test.  It runs the motor for 10 seconds.

; set speed to zero
M280 P0 S0
; power up speed controller
M42 P8 S254
; wait for startup tones
G4 P4000
; go to full speed
M280 P0 S180
; run for 10 secs
G4 P10000
; turn speed to 0
M280 P0 S0
; turn off power
M42 P8 S0


It turns out I was not able to get the bed heater circuit to directly control the power to the BESC.  The bed heater circuit switches the ground side of the the circuit and the positive voltage is always present.  The controller would not turn off.  It was using the servo ground wire, which is probably not rated for that.  I had to find a way to switch the positive voltage.


The easiest way to do this was with a relay.  I wired an automotive relay to the bed circuit.  I put a flyback diode across the relay to protect the bed heater circuit.  It all works perfectly now.


12-/27/2013 I tried hooking both grounds to the heater power circuit and it pulled ground from the servo signal pin.  That can’t be good for the BESC or the CPU, so back the the ugly relay.


Camera Slider Controller Hack


I have been having fun with my camera slider controller.  It is a cool, little, general purpose motion and camera controller that will soon to go on sale at Inventables. Taking a picture is very easy.  You just plug the camera into it and run the takePicture() function.  It has a lot of spare I/O pins that can be used for some cool hacks.

I always thought it would be cool to take a time lapse movie of a 3D print, but do it exactly one layer per frame and have the picture be taken at the exact same location every time so the print appears to grow out of thin air.  I know people have done this before, and I could probably hack the circuit right onto the printer controller, but camera slider controller was ready to go with the circuit and connectors all ready to go.  With less than ten minutes of coding and making a cable, I was ready to go.

GCode Hacking

The first task was hacking the GCode to output a a signal I could read remotely.  Kisslicer has a feature where you can add a few lines of Gcode every “N” layers.  I added the following GCode.  Note the “1″ in the layers box.  This means do it every layer.




G1 X0 Y0 means move to 0,0

G4 P500 means dwell for 500 milliseconds.  This was added because the next command was happening before the move completed.  I think this has to do with the way commands are buffered.  I think there is a more elegant fix for this, but adding a little delay here was a quick fix.

M42 P11 S255 means set I/O pin 11 to full on (255  is max).  Pin 11 is the first of the “servo” pins on my RAMPS controller.  This three pin connector would map directly to the servo connector on the camera controller.

G4 P1000 is a 1 second delay.  I had my DSLR on “auto” so it would need to focus for each shot, so I gave a little extra time.

M42 P11 S0 turns pin 11 off.

I ran a few test layers with my volt meter hooked up to the connector and it looked great.

Camera Slider Controller Hacking

The controller has 2 servo connectors that are intended to be used for hobby servos in a pan and tilt arrangement.  The signal pin on the connector can also be used as and input.  The code is simply going to watch for that pin to go high.  When it does it will display the next layer number and take the picture


Arduino Code

In the setup() section you need to make the PIN_SERVO_1 pin an input because that is connected to the printer controller.

pinMode(PIN_SERVO_1, INPUT);

The loop() section looks for the PIN_SERVO_1 pin to go high. When it does the layer number is incrememented the picture is taken and the LCD is updated. The camSignalRead flag is set so we don’t go read the same pulse more than once. The flag is cleared as soon as the signal

void loop() {

   if (digitalRead(PIN_SERVO_1) == HIGH) {
     if (!camSignalRead) { // make sure we read once per pulse
       camSignalRead = true; // 

       lcd.cursorTo(2, 0);
       sprintf(sVal, "Layer %d", layerNumber);


   else {
     camSignalRead = false; //reset this. the pulse is over 



Simply connect the signal pin (D11) on the servo 1 connector of the printer controller to the signal pin on the servo 1 (J7) connector of the camera slider controller. You also need to connect together a ground pin on each controller.






Camera Setup

I setup my DSLR on fully automatic and disabled the flash. I am sure the movie would have been better if I manually focused and locked the speed and aperture settings, but I just wanted a quick result. The controller first sends a focus signal and then a shutter signal. The focus signal acts like the half button push you do to focus most cameras.

The Print

The printing was done on the Quantum Delta printer.  I used my CNC Ninja Squirrel as the test print. It was scaled to 50mm tall. At at 0.25mm layer height, that gave 200 layers. The print took about 45 minutes with the added delays. It was run in a busy room at Pumping Station One so there was a lot of activity in the background and some light level changes.



The Result

Click here if the video is not displayed below.


CNC Translator for BeagleBone

The Rosseta Bone is a “universal” CNC translator for BeagleBone Black.

Rosetta Bone

The BeagleBone is awesome little controller.  It is a lot like the Raspberry Pi, but it has one special feature that makes it viable for CNC.  It is the PRU.  This is Programmable Realtime Unit.  This a part of the CPU that runs separately from the OS and gives it the critical timing required for smooth stepper motor control.  People have tapped into this and LinuxCNC to make a real embedded version of LinuxCNC.  Add in all the other capabilities like HDMI, keyboard, mouse networking, etc and things get amazing really fast.


I bought the BeagleBone Black which is the second generation BeagleBone.  It has more features than the original “white” version and actually costs less.  There are several CNC capes for the BeagleBone, like the BeBoPr or Replicape, but they are expensive, can be hard to get and some have issues with pinout changes that came with the BeagleBone Black.

BeagleBone CNC

Continue reading ‘CNC Translator for BeagleBone’

DIY Jumper Wires

I love using these jumper wires for prototyping. They work great for breadboards and Arduino headers.

You can buy them all over the place including SparkFun.  They are available male/male, male/female and female/female in various lengths.

Sometimes you need to hook up something that already has wires attached. I got these pins and single pin housings from Pololu the other day.

I really like them.  The housing works for either male or female pins.  You can either manually crimp the pins with a needle nose pliers or use a real crimper.  The crimper works for both the male and female pins.

Here are the links to the parts.  If you know of other sources, please add them in the comments.

Male Pins

Female Pins

Single Pin Housing.


Proper use of a crimper is a learned skill.  You need to take the time to learn it.  I lend out my crimpers all the time.  Many people try to use their first attempt in project.  The pin falls off or does not have a connection.  They then give up and use pliers.  The bottom line is there is no better way to put the pin on than a proper set of crimpers.  This is how the professionals do it.  It only takes a few attempts to get it right.  Take the time.

One of the biggest mistakes newbies make is stripping too much insulation.  It is usually just a tiny amount and only the length of the wire barrel portion.  It is very important that the insulation barrel of the crimp grabs onto the insulation.  That is the thing that really holds the pin from being pulled off.

I always buy my crimpers from eBay where they are usually about 25% of retail.  Avoid generic or all purpose crimpers.  Try to get the manufacturers brand.

The crimpers I used are Ampmodu Mod 90418-1.  The can be found used on eBay for around $50.  Pololu suggests you can use this general purpose crimper.  I also have that crimper and it works better than anything you could do by hand, but is no where near as good as the real one.  The 90418-1 has a little “gate” thing that fits between the part the crimps on the insulation vs the part that crimps on the wire.  This allows it to crimp just right on each part and sets the depth of the inserted wire.  It also has two different wire size ranges.You can see this gate in the picture as the shiny bit with the square cuts.



PS:One Longboard

The subject of skateboards came up about 2 weeks ago at meeting of local makers.  One of the PS:One Hackerspace guys confessed he wanted to buy a longboard for getting around town.  Longboards are more about basic transportation and carving smooth turns than doing tricks.  The large size also encourages design and graphical creativity.  I thought it was the perfect opportunity to get the creative juices flowing.  It was a fun project that cost less than $50 to complete.

Once I get these ideas in my head I am totally obsessed with them.  The only way to clear my brain is to actually build the thing whether I need it or not.  I finally got some time between 2.x Lasers and ORD Bots orders on the CNC router last Sunday night.


  • 3/4″ baltic birch deck.
  • Logo inlay on top near the front in a contrasting wood type.
  • The inly would be 1/4″ thick so minor dings and chips would not wreck the inlay.
  • Pockets cuts on the back to look cool, reduce the weight and give the board a little flex.
  • Miter the edges of the pockets for a cool look, make it more comfortable to carry and make it less prone to chipping.
  • Round the perimeter edges.
  • I really like the drop style truck mounting, but I would stick with a conventional bottom mount to start with.

Drop through mounting – Image from Moose

I found a whole bunch of longboard PDF templates here at Silverfish Longboarding.  I started with the ST11 version.  I felt the exposed wheels would allow more wheel, truck and mounting options without the wheels “biting” the board.  The outline had a few sharp corners that I smoothed out.  I didn’t want the line that is produced when you round the edge with the sharp corner.  I imported an SVG of the snowflake logo from the PS:One wiki and sketched in some pockets on the back that looked cool, but still preserved the strength off the board with hope for a little flex.
I bought a truck and wheel kit off eBay for about $35 (free shipping). I only did basic research into what made a good choice.  I just bought something that fit the basic requirements and looked cool (wide, reverse kingpost, big red wheels).
The basic deck is 3/4″ thick Baltic birch plywood..  The local high end lumber yard, Owl Hardwood, had some really nice 13 ply material.  The top side is perfect.  The back side is really good with only a few small blemishes and all the inner layers are high quality with no voids.  Most plywood has knots and voids on the inner layers.  The exposed edge and the pockets would show the inner layers so I wanted them to look good.

Fabrication Process.

  • Cut the inlay piece out of  1/4″ thick oak.
  • Mount the Baltic birch on the router and check for Z flatness in the inlay area.  I mounted it on a sacrificial particle board.  This board was clamped by itself, so unclamping the plywood would not affect the position of the sacrificial board.
  • Cut the pocket for the inlay slightly under sized.  I then continued to profile the edges larger until it fit tightly.
  • Glued the inlay in place.
  • Cut the bolt holes for the trucks.
  • Cut the deck outline.  I purposely cut extra deep into my sacrificial base so that I would have a clear outline of the board.  This would allow me to flip it squarely to do the back side.
  • Cut the back pockets 1/4″ deep.
  • At the last minute I decided to add the the PS:One logo to the back as a 1/8″ deep pocket.  It turned out to be my favorite detail.
  • Used a 1/2″ 90 Deg V bit to miter the edges of the pockets.  I did a profile pass on the pocket lines set inside the line 0.02″ to make sure the tip was always inside the edge for a clean cut.  The depth was set to leave 1/16″ of the original pocket wall.
  • Unclamp the deck.
  • I used a 3/8″ 1/4 round bit with guide bearing on the router table to round the edges.
  • Sanded.
  • Stained using Minwax Golden Oak stain.  It is a light colored stain that varies quite a bit with the wood type.
  • Sealed.  Minwax Satin Poly Urethane.


  • Design, research, ordering parts…about 1 hour.
  • Total time on the router…about 1 hour.
  • Sanding and Finishing…about 1.5 hours.


  • $10 worth of baltic birch
  • $5 1/4″ x 8″ oak for inlay
  • $35 trucks and wheels.
  • Already had all bits, stain and varnish


  • I want to laser cut a bunch of little PS:One snowflakes out of grip tape and sprinkle them on the deck.
Hind Sight:
  • I am not super happy with the way the baltic birch stained.  Woods like that can look blotchy due to varying wood density.  I might have done better pre treating with a wood conditioner the birch or going without stain.