There’s an often held belief that you can’t do CNCs without a parallel port on your PC and cleverly timed move instructions. That may have been the case back in the day, but we’ve had the nineties guys, USB is all the rage!

So we’re building a USB CNC controller board.
We’re quite lucky that these cheap little 5V 28BYJ48 steppers have already been stepped down. They’re supposed to be 1/64 but inside they’re geared down again. There are loads of places all over the internet which say that they’re stepped down again by 1/32 – meaning you need 64 * 32 = 2048 steps for one complete revolution.

If that’s the case, we should be able to get pretty precise movement, even with a massive gear/cog riding on the shaft, and without having to bother with the complexities of micro-stepping. There’s only one way to be sure – and that’s spin one around and count the steps!

In-keeping with our NC drill software, we’re looking to build a USB controller which we can give a number of steps and have the motor(s) play out those steps. We’ve no idea at the minute how many steps we may need to move up to (depending on how many steps per revolution these motors actually need) so we’ve allowed for a 4-byte value to be sent to our trusty 18F2455 PIC microcontroller.

We’re using (as ever) a generic HID device interface and sending data in 8 byte packets.

  • The first byte (byte zero) is our “command byte”.
  • If the value is one, it’s a command to set the x motor step count
  • If the value is two, it’s a command to set the y motor step count
  • The second, third, fourth and fifth bytes make up our 4-byte value (0-2,147,483,647)
  • The sixth byte (byte 5) is a direction – one is anit-clockwise, zero (or any other value) clockwise.

After sending the x-axis step count (or the y) the controller board stops all motor activity (since if the motors are spinning when new values come in, the x- and y- axis will go out of alignment with each other, as the earlier axis will be ahead of the later one).

Only once the command byte 254 is sent do the motors actually spin up.
For as long as the x/y step count has a value greater than zero, the motor(s) are given a signal to move them onto the next step. The step-count value is decreased by one each time one of the axis motors steps. Once both motors have a step-count value of zero, a flag is set to tell the PC that the motors have stopped spinning and the head is now in it’s correct position.

Here’s a video of some early testing:

What’s happening here? Thanks to the autofocus on our camera-phone it’s not too clear – but if you squint and stand back from the monitor you might see:
Firstly, the command byte (7th byte) is given the value 1 (set x motor step count), along with the second byte (from the right) set to 16. Since our x count is a 4-byte value, we’re setting it to 16*256 = 4096.
We repeat these values with the command byte set to value 2 (set y motor step count) then clear the buffer and send the command value 254 to get the motors spinning.
Giving our control board a value of 4096 makes the motor complete one full rotation.
So there we have it. Our stepper motor has a 1/64 step angle, geared down, not by 1/32 as some other forums suggest, but a full 1/64 again. 64 * 64 = 4096 so this is the number of steps required for a full rotation.
The video then skips back to a blurry laptop screen, where we enter the same values, but this time setting byte 4 to 1. This is the direction byte. When this is set to one, the motor spins in the opposite direction.
All in all, we’ve had quite a successful evening – we’ve got both axis motors spinning from a custom-built PIC-based USB (HID device) board and some software which we can talk to the board with and get predictable results. Now we just need to remember how to work with Timer1 to create a 20m/s interrupt on the PIC and we can use this to send servo commands for the z-axis (drill up, drill down and motor speed).
Tomorrow is another BuildBrighton open evening.
There’s even a slim chance that after the beers and pizza, we might actually get something working……