Arduino Nano ESP32 - MG996R

In this tutorial, we are going to learn how to use the MG996R high-torque servo motor with Arduino Nano ESP32.

Hardware Preparation

1×Arduino Nano ESP32
1×USB Cable Type-C
1×MG996R Servo Motor
1×Jumper Wires
1×(Recommended) Screw Terminal Adapter for Arduino Nano

Or you can buy the following sensor kit:

1×DIYables Sensor Kit 30 types, 69 units
Disclosure: Some of the links provided in this section are Amazon affiliate links. We may receive a commission for any purchases made through these links at no additional cost to you. We appreciate your support.

Overview of Servo Motor

The MG996R servo motor is a high-torque servo motor capable of lifting up to 15kg in weight. The motor can rotate its handle from 0° to 180°, providing precise control of angular position. For basic information about servo motors, please refer to the Arduino Nano ESP32 - Servo Motor tutorial.

Pinout

The MG996R servo motor used in this example includes three pins:

  • VCC pin: (typically red) needs to be connected to VCC (4.8V – 7.2V)
  • GND pin: (typically black or brown) needs to be connected to GND (0V)
  • Signal pin: (typically yellow or orange) receives the PWM control signal from an ESP32's pin.
MG996R Servo Motor Pinout

Wiring Diagram

Since the MG996R is a high-torque servo motor, it draws a lot of power. We should not power this motor via the 5v pin of Arduino Nano ESP32. Instead, we need to use the external power supply for the MG996R servo motor.

  • When powering the Arduino Nano ESP32 board via USB port.
The wiring diagram between Arduino Nano ESP32 and MG996R Servo Motor

This image is created using Fritzing. Click to enlarge image

  • When powering the Arduino Nano ESP32 board via Vin pin.
The wiring diagram between Arduino Nano ESP32 and MG996R Servo Motor external power

This image is created using Fritzing. Click to enlarge image

Arduino Nano ESP32 Code

/* * This Arduino Nano ESP32 code was developed by newbiely.com * * This Arduino Nano ESP32 code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-mg996r */ #include <Servo.h> Servo servo; // create servo object to control a servo void setup() { servo.attach(D2); // attaches the servo on pin D2 to the servo object servo.write(0); // rotate slowly servo to 0 degrees immediately } void loop() { for (int angle = 0; angle <= 180; angle += 1) { // rotate slowly from 0 degrees to 180 degrees, one by one degree // in steps of 1 degree servo.write(angle); // control servo to go to position in variable 'angle' delay(10); // waits 10ms for the servo to reach the position } for (int angle = 180; angle >= 0; angle -= 1) { // rotate from 180 degrees to 0 degrees, one by one degree servo.write(angle); // control servo to go to position in variable 'angle' delay(10); // waits 10ms for the servo to reach the position } }

Detailed Instructions

To get started with Arduino Nano ESP32, follow these steps:

  • If you are new to Arduino Nano ESP32, refer to the tutorial on how to set up the environment for Arduino Nano ESP32 in the Arduino IDE.
  • Wire the components according to the provided diagram.
  • Connect the Arduino Nano ESP32 board to your computer using a USB cable.
  • Launch the Arduino IDE on your computer.
  • Select the Arduino Nano ESP32) board and its corresponding COM port.
  • Click to the Libraries icon on the left bar of the Arduino IDE.
  • Type ServoESP32 on the search box, then look for the servo library by Jaroslav Paral. Please be aware that both version 1.1.1 and 1.1.0 are affected by bugs. Kindly choose a different version.
  • Click Install button to install servo motor library for Arduino Nano ESP32.
Arduino Nano ESP32 servo motor library
  • Connect Arduino Nano ESP32 to PC via USB cable
  • Open Arduino IDE, select the right board and port
  • Copy the above code and open with Arduino IDE
  • Click Upload button on Arduino IDE to upload code to Arduino Nano ESP32
Arduino IDE - How to Upload Code
  • See the result: Servo motor rotates slowly from 0 to 180° and then back rotates slowly from 180 back to 0°

Code Explanation

Read the line-by-line explanation in comment lines of code!

How to Control Speed of Servo Motor

By using map() and millis() functions, we can control the speed of servo motor smoothly without blocking other code

/* * This Arduino Nano ESP32 code was developed by newbiely.com * * This Arduino Nano ESP32 code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-mg996r */ #include <Servo.h> Servo servo; unsigned long MOVING_TIME = 3000; // moving time is 3 seconds unsigned long move_start_ms; int angle_start = 30; // 30° int angle_stop = 90; // 90° void setup() { servo.attach(D2); move_start_ms = millis(); // start moving // TODO: other code } void loop() { unsigned long progress = millis() - move_start_ms; if (progress <= MOVING_TIME) { long angle = map(progress, 0, MOVING_TIME, angle_start, angle_stop); servo.write(angle); } // TODO: other code }

Video Tutorial