In this tutorial we will see the use of the CNC Shield V3 for Arduino. To be able to manage a machine like a CNC or a 3D printer with several stepper motors, it is interesting to have a board that facilitates the connection of the different elements of the machine. This is the role of the CNC shield.


  • Arduino UNO
  • CNC Shield V3
  • Stepper driver A4988 or DRV8825 or SilentStepStick
  • USBA male to USB B male cable

Principle of operation

The CNC Shield V3 is an extension board for Arduino UNO or Mega allowing to interface easily to stepper motor controllers, type A4988. It also allows to drive and manage the elements necessary to operate a digital milling machine (CNC). That is, end stops, fan, etc,


The Shield is placed on the Arduino microcontroller and the motors are connected directly to the output pins of the drivers. You can choose the drivers you want depending on the power of your motors and your applications (A4988, DRV8825, SilentStepStick, TMC).

Terminals are available below each driver to select the step resolution. These terminals are connected to the MS0, MS1 and MS2 pins of the controllers.

Before connecting the motors, be sure to set the current limiter on each controller to match the motor it is driving.


To drive a stepper motor with CNC Shield V3, we refer to the pinout of the shield which gives us access to the pins to call to send commands to the motor controller (DRV8825, A4988 or SilentStepStick).

const int enPin=8;
const int stepXPin = 2; //X.STEP
const int dirXPin = 5; // X.DIR
const int stepYPin = 3; //Y.STEP
const int dirYPin = 6; // Y.DIR
const int stepZPin = 4; //Z.STEP
const int dirZPin = 7; // Z.DIR

int stepPin=stepYPin;
int dirPin=dirYPin;

const int stepsPerRev=200;
int pulseWidthMicros = 100;  // microseconds
int millisBtwnSteps = 1000;

void setup() {
  pinMode(enPin, OUTPUT);
  digitalWrite(enPin, LOW);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  Serial.println(F("CNC Shield Initialized"));

void loop() {
  Serial.println(F("Running clockwise"));
  digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
  // Makes 200 pulses for making one full cycle rotation
  for (int i = 0; i < stepsPerRev; i++) {
    digitalWrite(stepPin, HIGH);
    digitalWrite(stepPin, LOW);
  delay(1000); // One second delay

  Serial.println(F("Running counter-clockwise"));
  digitalWrite(dirPin, LOW); //Changes the rotations direction
  // Makes 400 pulses for making two full cycle rotation
  for (int i = 0; i < 2*stepsPerRev; i++) {
    digitalWrite(stepPin, HIGH);
    digitalWrite(stepPin, LOW);

To test the operation of the Shield and the engines, we do not use any particular library. Note however, that if you want to use more advanced features you can use the AccelStepper library or the GRBL V0.9 firmware.


Once the code is uploaded and the system is plugged in, you should see the motor connected to the Y driver turn one turn clockwise and two turns counterclockwise. If this is not the case, you probably have a connection problem.

It is also possible that the fuse on the board is damaged. You can replace it with a conductive wire.


  • Build your own CNC or laser engraver
  • Make a cutter
  • Drive up to three stepper motors independently


How useful was this post?

Click on a star to rate it!

Average rating 4.1 / 5. Vote count: 32

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?