SuperPID Router Power Switch

Wow @tchad that looks great. Any shots of your wiring?

Still trying to get my mind around PC/knob control. If you cannot tell electronics is not even my second language. :nerd_face:

I assume the PWM pin on the SO controller & a SPDT switch is all that is needed to wire it up per the SPID directions?



Unfortunately I don’t have any pictures of the wiring. I’m not sure a photo would help much anyway, there’s too many wires to trace them out much in a photo.

There is a diagram on the SuperPID site, here, that shows the wiring for switch to change back and forth between PC and knob control. To your question, yes, a SPDT is all you need.

The PWM signal comes from your SO controller to the SuperPID, which converts it from PWM to an analog voltage signal. Then the SPDT switch just changes back and forth between that analog voltage signal, and the output from the pot.

Mine is slightly more complicated: I used a DPDT for the PC/Knob switch, and used the other pole to change which wire is connected to the Run pin on the SuperPID board. When my PC/Knob switch is in PC mode, the Spindle switch (which is also DPDT) interrupts the RUN wire from the SO board, so I can click off the Spindle even when the SO board is telling it to run. When the PC/Knob switch is in Knob mode, the Spindle switch is between GND and the RUN pin on the SuperPID board, so I can manually turn on and off the spindle. In this way, the Spindle toggle works as expected, regardless of whether the whole thing is in PC or Knob mode.

It took me a while to wrap my head around the wiring – the small / compact diagrams with crossing lines on the SuperPID site don’t help. I ended up re-drawing my own, sort of one step at a time, and then wiring it one step at a time, to prevent confusion. Once it’s done, it’s done.

Thanks for the detailed explanation, I’ll puzzle everything out from there. This is actually a great project for me to gain some chops with electronics.

Appreciate the feedback.


@rmwarren Agreed, and good luck!

One thing to pay attention to that can be tricky your fist time hashing through this, is the logic levels. SuperPID uses logic-low to represent enabled. (e.g., a ground signal is logically “true” or “on”, and a +5V signal is logically “false” or “off” – this can seem counter-intuitive at first.)

Also, if you want your router to turn on and off automatically with software, then you’ll need to re-upload grbl with some configuration changes to enable the RUN wire (labeled D13 on your Carbide Motion board), and to make it logic-low. (By default in grbl, PWM = 0 would imply stopped, but on the SuperPID, PWM=0 is 5,000 RPM. If you want your spindle to start and stop on command, you need to enable a RUN wire.)

In the GRBL config.h, uncomment (by removing the // in front of each line):


Then re-compile and upload.

If you just use a manual toggle switch to turn on and off your router, and only have the PC send RPM signals to your SuperPID, then no recompile / upload of grbl is necessary.

Also note that the Arduino boot loader on the ATmega micro-controller pulses the outputs at boot-up. This means that without any modifications, (only if you are using the RUN wire to have grbl control the on-off state of your spindle) your spindle will spin up very briefly when you turn on your S3!

I used an external programmer to re-flash my chip omitting the Arduino boot-loader, which prevents the outputs from pulsing at start-up.

There are other ways around it, and there are discussions on the forums here about it, just be aware of it and plan for it; make sure your spindle is clear the first time you power up the machine with the new configuration.

so many thanks for this. really found it useful. especially this part:
Also, if you want your router to turn on and off automatically with software, then you’ll need to re-upload grbl with some configuration changes to enable the RUN wire (labeled D13 on your Carbide Motion board), and to make it logic-low. (By default in grbl, PWM = 0 would imply stopped, but on the SuperPID, PWM=0 is 5,000 RPM. If you want your spindle to start and stop on command, you need to enable a RUN wire.)
something i was searching injectable steroids for quite a while now as i needed it. will try.

1 Like

There you go, my head just burst into flames…

Perhaps I will be satisfied after all with a more manual setup.

Thanks @tchad


Haha, apologies, friend!

There are easier ways to configure the SuperPID with an S3. Search around the forum and you’ll find some more straight forward setups that several others have.

The good news is once you have the SuperPID working manually, you can always continue to tweak it and add more automated controls later without undoing what you’ve accomplished.

Just an update for anyone else considering this. I order a PC 450 (twin of DW611 w/o the speed control) and gutted it last night. After poking around in its innards it turned out to be pretty simple to remove the soft start TRIAC and connect the switched leads directly. I used crimp/solder connectors in case I ever want to reverse the process. The unadulterated guts:

Soft start removed and leads reconnected:

Without the TRAIC there is a ton of room to nest the wiring out of the way. Here’s a glimpse of the router shaft target for the speed sensor:

The poly tube installed w/ CA glue. Sighted thru it with a light and it’s a bulls-eye on the router shaft:

I was simpler that I had expected. Tonight I hope to get the S-PID rigged up on the bench to test and adjust it before I start assembling the control box.



Final update - lots of stuff crammed into a small box:

I initially thought the enclosure would be way big (240-160-90) but there wasn’t a lot of unused space. Goofed up the air slot @ the bottom & I still need to make a cover to hold a bit of filter material. Was going to repurpose the unused fan from the old SO controller but decided it wasn’t moving enough air & ordered one that I’ll fit above the power supply. Intake at the bottom and out at the top. Had to make the 50mm standoffs.

S-PID works great, much quieter than the router alone even at higher speeds. Purrs @ 5K. Was a bit finicky to get the sensor adjusted and siliconed in place.

Should have it installed by this weekend. Thanks for all the input.



Looks good!

I know what you mean about the noise. When it’s turned way down it’s stealthy, I’ve actually pulled the gantry forward to do a bit change then noticed that it was still spinning (obviously not following my self imposed checklist). Mine has been great except for when I bumped the optical sensor tube loose one time…a bigger glob of epoxy and I was back in business!

Have fun!


When you say “re-compile” and upload, are you doing this with the Arduino IDE? I’m working on implementing a PID controller being developed by folks on the MPCNC forum. I’m not unfamiliar with editing sketches and compiling/flashing, but I’ve never flashed the SO3. Basically it looks like I want to copy my current settings which I have edited from the standard Carbide. Then load up Grbl 1.1 into the Arduino IDE, set my machine default to Shapeoko 3, make the changes listed here along with my custom settings, then compile/upload.

Is the Carbide 3D Shapeoko control board in the Arduino “boards” list?

My big question is, if I goof, will I be able to reload the “official” Carbide 3D firmware via their updater?

Yes, via the Arduino IDE. Select Ardunio Uno / atmega 328 as the board type and CPU.

And yes, you can go back to the official firmware if you goof something with your custom build.

See this thread for more information on both flashing and rolling back.

The main gotcha is noted in @WillAdams’s first comment:

Note that depending on board version you may need to hold down the Z-axis homing switch (newer revisions) or a “Program” button on the board itself (older boards), and keep it pressed until the process completes, just like carbideupdater

Also note that (I believe…) you will need to update the EEPROM values for grbl after you re-flash. Carbide motion can push them all automatically, or you can do it manually from any gcode sender that has a terminal.

These are the values I have documented. The only change I made to the below was to update the Min and Max spindle speed according to my VFD.

Note: sending $$ to GRBL will list out all current settings

$132=80 //[X,Y,Z] Max travel, mm
$131=465 //[X,Y,Z] Max travel, mm
$130=425 //[X,Y,Z] Max travel, mm
$122=400 //[X,Y,Z] Acceleration, mm/sec^2
$121=400 //[X,Y,Z] Acceleration, mm/sec^2
$120=400 //[X,Y,Z] Acceleration, mm/sec^2
$112=5000 //[X,Y,Z] Max rate, mm/min
$111=5000 //[X,Y,Z] Max rate, mm/min
$110=5000 //[X,Y,Z] Max rate, mm/min
$102=40 //[X,Y,Z] steps/mm
$101=40 //[X,Y,Z] steps/mm
$100=40 //[X,Y,Z] steps/mm
$32=0 //Laser mode, boolean
$31=0 //Min spindle speed, RPM
$30=1000 //Max spindle speed, RPM
$27=5 //Homing pull-off, mm
$26=25 //Homing debounce, milliseconds
$25=1000 //Homing seek, mm/min
$24=100 //Homing feed, mm/min
$23=0 //Homing dir invert, mask
$22=1 //Homing cycle, boolean
$21=0 //Hard limits, boolean
$20=0 //Soft limits, boolean
$13=0 //Report inches, boolean
$12=.01 //Arc tolerance, mm
$11=.02 //Junction deviation, mm
$10=255 //Status report, mask
$6=0 //Probe pin invert, boolean
$5=0 //Limit pins invert, boolean
$4=0 //Step enable invert, boolean
$3=6 //Direction port invert, mask
$2=0 //Step port invert, mask
$1=255 //Step idle delay, millisecond
$0=10 //Step pulse, microseconds


Excellent. Thank you so much!

1 Like