Nunchuk Controlled Robotic Arm (with Arduino)

10,200

155

25

Intro: Nunchuk Controlled Robotic Arm (with Arduino)

Robotic arms are awesome! Factories all over the world have them, where they paint, solder and carry stuff with precision. They can also be found in space exploration, subsea remote operated vehicles, and even in medical applications!

And now you can have a cheaper version of them at your own home, office or lab! Tired of doing a repetitive job? Program your own robot to help you... or to mess things up! :D

In this tutorial I show you how to mount a robotic arm, and how to program it using an Arduino Mega. For this project I also wanted to experience a different method for controlling a robotic arm: using a Nintendo Nunchuk! They are cheap, easy to find, and have a bunch of sensors.

There are several ways you can use this tutorial. If you don't have a robotic arm kit (and doesn't want to buy or build one) you can still use it to learn something about Arduino programming, and how to interface an Wii Nunchuk to your own projects. You can also use it to practice your electronics and mechanic skills.

Step 1: Tools and Materials

The following tools and materials were used in this project:

Tools and materials:

  • Solder iron and wire. I had to solder some terminals to Nunchuk's wires in order to connect it to the Arduino;
  • Shrinking tube. Some pieces of shrinking tube were used for a better isolation of the conductors;
  • Screwdriver. The structure is mounted using some bolts and nuts;
  • 6-axis mechanical desktop robotic arm (link). This awesome kit already comes with several components as described bellow. It's reliable and easy to assemble;
  • 12V power supply (2A or more);
  • Nunchuk controller (link). It interfaces to the Arduino board, and it's used to control the robotic arm;
  • Male jumper wires (4 wires);
  • Arduino Mega (link / link / link). Notice that the robotic arm kit I've used also has a board and controller bundle that already comes with this Arduino board. If you you're not using on of those kits, you might use other Arduino boards as well;

I was informed later that there's a Nunchuk adapter that makes the connection to a breadboad easier (link / link). It's a good option if you want to same some time on soldering and doesn't want to destroy the original connector as described on Step 9.

Sain Smart 6-axis mechanical desktop arm already comes with the following components:

  • Arduino Mega 2560 R3 (link)
  • Control board shield (link)
  • NRF24L01+ Wireless Transceiver Module (link)
  • MPU6050 3-axis gyroscope and a 3-axis accelerometer (link)
  • 71 x M3X8 screw
  • 47 x M3 nut
  • 2 x U bracket
  • 5 x servo bracket
  • 4 x 9kg servo (link)
  • 2 x 20kg servo (link)
  • 6 x metal servo tray
  • 3 x U bracket
  • 21 x right-angled bracket
  • 3 x flange bearing
  • 1 x gripper

You might find other robotic arm kits online (link), or even design your own. There are some awesome projects you can 3D print, for instance.

In the following 7 steps I'll show you how to assemble the arm kit before wiring up the circuits. If you doesn't have a similar kit, feel free to jump some steps. You can use another robotic arm kit, assemble it and jump directly to the electronics and programming steps.

At each step, there is an animated gif, showing how my robotic arm was assembled. It only runs on website's desktop version.

Step 2: Assembling the Robotic Arm Pt1 - Base

The first part to be assembled is the base of the robot.

It's made of two U shaped brackets, joined back to back using four M3 bolts and nuts, as shown in the pictures. This is propably the easiest part to be mounted.

Step 3: Assembling the Robotic Arm Pt2 - Servo #1

The first servomotor is mounted perpendicular to the base, using a servo bracket. This profile is attached to the base using four M3 bolts and nuts, as it's shown in the pictures. Servo #1 is place on it's top, and attached using four M3 bolts and nuts.

A circular metal horn is attached to the servo axis. The kit comes with several plastic horns. They won't be used for assembling the robot.

Step 4: Assembling the Robotic Arm Pt3 - Servo #2

Another servo bracket is mounted perpendicular to the previous one. It's connected to servo #1 horn using four M3 bolts. Servo #2 is installed with four M3 bolts and nuts, and also uses a circular metal horn.

An U bracket is then attached to the horn using four bolts. Notice that a M3 bolt is used oposite the servo axis. It gives stability to the structure. A bearing fits on this bolt, and it's locked in position using another M3 nut. This way the U bracket is tightly attached to servo #2 center axis.

Step 5: Assembling the Robotic Arm Pt4 - Servo #3

Another U bracket is mounted using four M3 bolts and nuts.

On the other end, servo #3 is installed, using a circular metal horn and four bolts. A servo bracket is connected to the servo motor, and a L shaped profile is linked to the servo bracket using some bolts and nuts.

Notice that another bearing is used oposite to the servo axis, as described before.

Step 6: Assembling the Robotic Arm Pt5 - Servo #4

Another U bracket is connected to the L shaped profile using a set of four M3 bolts and nuts. Similarly to the previous step, servo #4 is mounter to the U bracket using four bolts. Another servo bracket is connected to the servo.

Step 7: Assembling the Robotic Arm Pt6 - Servo #5

The fifth servo is connected perpendicular to servo #4 using another servo bracket, installed using four M3 bolts and nut.

Step 8: Assembling the Robotic Arm Pt7 - Servo #6

The gripper is then connected to servo #5 axis. On it's top, servo #6 is connected using some bolts, nuts and a metal horn. The gripper has some gears, which will turn the rotation of the servo into a linear movement of the gripper.

Step 9: Preparing Nunchuk Controller

For this project I decided to use a Nintendo Nunchuk controller for a number of reasons:

  1. They are cheap! Replicas might have a inferior quality, but I didn't need a robust controller for this project;
  2. They are easy to find! There are several original and inexpensive replicas online.
  3. It has lots of sensors! Each controller has two buttons (Z and C buttons), a two axis joystick (X and Y) and a three axis accelerometer;
  4. It has an Arduino library. Robert Eisele designed an amazing and easy to use library for reading Nunchuk sensor. Check it out: https://www.xarg.org/2016/12/using-a-wii-nunchuk-with-arduino/

Unfortunatelly Nunchuk joysticks have a complicated connector, hard to interface with other electronics. In order to connect it to the Arduino, I had to cut its cable and expose it's wires. This way, it won't work with a Nintendo Wii anymore... :/

First I had to cut the connector of the joystick and remove the insulation of the wires. Using a multimeter, and based on the color of each wire, I determined the function of each wire (Vcc, GND, SCL and SDA) based on the schematic of the connector shown in the picture. The color of the wires has no standard. I've already heard of the following possibilities:

Original:

  • SDA = green
  • SCL = yellow
  • 3V3 = red
  • GND = white

Replica #1:

  • SDA = yellow
  • SCL = white
  • 3V3 = green
  • GND = red

Replica #2:

  • SDA = blue
  • SCL = white
  • 3V3 = pink
  • GND = green

I soldered the wires to a male jumper , for an easier connection to the Arduino board. For that, I used a soldering iron, and some shrinking tube, as its shown on the pictures.

I was informed later that there's a Nunchuk adapter that makes the connection to a breadboad easier (link / link). It's a good option if you want to same some time on soldering and doesn't want to destroy the original connector.

Step 10: Wiring Up the Circuits

Once the structure is assembled, and Nunchuk connectors are finished, you'll be ready to wire up the circuits. I used the controll board shield that came along with my robotic arm kit. It makes the connection of the components easier, since it already comes with specific connectors for the servomotors, power supply, etc.

Connect the components as follows:

Nunchuk:

  • Nunchuk pin 6 (SCL) => Arduino Mega Pin 21 (SCL) (on the shield)
  • Nunchuk pin 1 (SDA) => Arduino Mega Pin 20 (SDA) (on the shield)
  • Nunchuk pin 3 (Vcc) => Ardino Mega Pin 3V3 (on the shield)
  • Nunchuk pin 4 (Gnd) => Arduino Mega Pin Gnd (on the shield)

If you're using an Arduino Uno, Nunchuk' SCL and SDA pins shall be connected to different Arduino pins, as follows:

  • Nunchuk pin 6 (SCL) => Arduino Uno Pin A5
  • Nunchuk pin 1 (SDA) => Arduino Uno Pin A4
  • Nunchuk pin 3 (Vcc) => Ardino Uno Pin 3V3
  • Nunchuk pin 4 (Gnd) => Arduino Uno Pin Gnd

Servos:

  • Control shield terminal 11 => Servo #1
  • Control shield terminal 12 => Servo #2
  • Control shield terminal 13 => Servo #3
  • Control shield terminal 8 => Servo #4
  • Control shield terminal 9 => Servo #5
  • Control shield terminal 10 => Servo #6

If you're not using the control shield, you should use the following pin configuration:

  • Arduino Pin 11 => Servo #1 (Sgn)
  • Arduino Pin 12 => Servo #2 (Sgn)
  • Arduino Pin 13 => Servo #3 (Sgn)
  • Arduino Pin 8 => Servo #4 (Sgn)
  • Arduino Pin 9 => Servo #5 (Sgn)
  • Arduino Pin 10 => Servo #6 (Sgn)
  • Arduino Gnd => Servos Gnd
  • 6V Power supply => Servos Vcc

You'll also need to connect an external 12V power supply. I suggest one with more than 2A output. The servos consume a lot of power, and if the power supply is not powerfull enough, the servos will vibrate and get really hot. They will also lose their strenght.

Don't connect the power source until you've uploaded the Arduino code (shown in later steps). There's a power button on the shield. Keep it on the off position.

Plug an USB cable on the Arduino and proceed to the next step.

Step 11: Setup Arduino IDE

Now that the hardware is ready, it's time to work on the Arduino code.

1. Download and install Arduino IDE latest version
You can find the latest version for Windows, Linux or MAC OSX on Arduino's website: https://www.arduino.cc/en/main/software

Download it for free, install it on your computer and launch it.

2. Adding the libraries

For this project I used Robert Eisele's amazing Nunchuk Arduino library! You can find more about it on his website:

https://www.xarg.org/2016/12/using-a-wii-nunchuk-with-arduino/

Download the library at https://github.com/infusion/Fritzing/tree/master/Wii-Nunchuk

Navigate to Sketch-> Include Library -> Manage Libraries... on your Arduino IDE for adding the library.

How does the library works?

Nunchuk library comes with a set of functions for reading controller's sensors:

  • nunchuk_buttonZ(): returns 1 if Z button is pressed, or 0 if it isn't;
  • nunchuk_buttonC(): returns 1 if C button is pressed, or 0 if it isn't;
  • nunchuk_joystickX(): returns x value of the joystick (between -127 and 127);
  • nunchuk_joystickY(): returns y value of the joystick (between -127 and 127);
  • nunchuk_pitch(): returns the angle of the controller in radians (between -180º and 180º);
  • nunchuk_roll(): returns the roll angle of the controller in radians (between -180º and 180º).

The angles are returned in radians. I converted those values to degrees in my Arduino code.

Step 12: Arduino Code

Download Arduino's sketch file.

Plug the USB cable on your computer's USB port and upload the code. Uploading the code takes some time. You can use that time to give a 'like' and 'share' this tutorial while you wait! :D

After the upload was complete, unplug the USB cable, connect the power supply and turn on the power button. The code will start running imediatly.

Warning: when the code starts running, the robotic arm will move really fast to it's initial position. Be careful not to get hurt or damage nearby equipment during startup!

You'll possibly have to replace the starting angle of each servomotor depending on how your servos where mounted.

Code explained:

Before the setup, the code imports the libraries used on the sketch (nunchuk.h, wire.h and servo.h).

Pins to be used are defined, and global variables are declared. The angle# integer variables store the initial position for each servo. If you want your robot to start at a different position, change the values on those variables.

servo#_speed variables define the speed of the movement of each servo. If you want a specific servo to move faster, increase its value. angle#min and angle#max variables are used to limit the maximun and minimun angle for each servo. You can set those variables in order to avoid colisions between consecutive joints of the robot.

//Include libraries
#include <nunchuk.h>
#include <wire.h>
#include <servo.h>

//define variables
#define SERV1 8    //servo 1 on digital port 8
#define SERV2 9    //servo 2 on digital port 9
#define SERV3 10   //servo 3 on digital port 10
#define SERV4 11   //servo 4 on digital port 11
#define SERV5 12   //servo 5 on digital port 12
#define SERV6 13   //servo 6 on digital port 13

Servo s1; //servo 1
Servo s2; //servo 2
Servo s3; //servo 3
Servo s4; //servo 4
Servo s5; //servo 5
Servo s6; //servo 6

//define starting angle for each servo
//choose a safe position to start from
//it will try to move instantaniously to that position when powered up!
//those angles will depend on the angle of each servo during the assemble
int angle1 = 90; //servo 1 current angle
int angle2 = 30; //servo 2 current angle
int angle3 = 0;  //servo 3 current angle
int angle4 = 90; //servo 4 current angle
int angle5 = 90; //servo 5 current angle
int angle6 = 45; //servo 6 current angle
int servo1_speed = 3; //servo 1 speed
int servo2_speed = 3; //servo 2 speed
int servo3_speed = 3; //servo 3 speed
int servo4_speed = 1; //servo 4 speed
int servo5_speed = 1; //servo 5 speed

//define restrictions for each servo
//those angles will depend on the angle of each servo during the assemble
int angle1min = 0;   //servo 1 minimum angle
int angle1max = 180; //servo 1 maximum angle
int angle2min = 0;   //servo 2 minimum angle
int angle2max = 180; //servo 2 maximum angle
int angle3min = 0;   //servo 3 minimum angle
int angle3max = 180; //servo 3 maximum angle
int angle4min = 0;   //servo 4 minimum angle
int angle4max = 180; //servo 4 maximum angle
int angle5min = 0;   //servo 5 minimum angle
int angle5max = 180; //servo 5 maximum angle
int angle6min = 0;   //servo 6 minimum angle
int angle6max = 180; //servo 6 maximum angle

boolean display_angles = true; //boolean used to update the angle of each servo on Serial Monitor

During the setup, each servo is attached to an especific pin, and its position is started.

Serial communication (to Serial monitor) and I2C communication with the Nunchuk are also started here.

//SETUP

void setup() {
    //attach each servo to a pin and start its position
    s1.attach(SERV1);
    s1.write(angle1);
    s2.attach(SERV2);
    s2.write(angle2);
    s3.attach(SERV3);
    s3.write(angle3);
    s4.attach(SERV4);
    s4.write(angle4);
    s5.attach(SERV5);
    s5.write(angle5);
    s6.attach(SERV6);
    s6.write(angle6);

    //start serial communication
    Serial.begin(9600);

    //start Nunchuk
    Wire.begin();
    nunchuk_init();
}

The main loop is repeated over and over. Nunchuk status is read at each cycle. Depending on the readings, different commands are performed.

void loop() {

    //read Nunchuk sensors
    if (nunchuk_read()) {        
        int x = nunchuk_joystickX();    //joystick X position
        int y = nunchuk_joystickY();    //joystick Y position
        boolean z = nunchuk_buttonZ();  //z button status
        boolean c = nunchuk_buttonC();  //c button status
        float pitch = nunchuk_pitch();  //pitch angle
        float roll = nunchuk_roll();    //roll angle

Joystick X will be used to move the servo #1.

The following block of code was used. First it checks if the value of the joystick is large enough. This way, noise and small variations are disregarded. If the value meet the requirements, the angle of the servo will be increased/decreased at a given speed.

//Turn left/right (at a fixed speed)
        //Turn left
        if (x > 90) {
          angle1 -= servo1_speed;
          display_angles = true;
          if (angle1 < angle1min) {
            angle1 = angle1min;
          }
        }
        //Turn right
        if (x < -90) {
          angle1 += servo1_speed;
          display_angles = true;
          if (angle1 > angle1max) {
            angle1 = angle1max;
          }
        }
        s1.write(angle1); //update servo position

A similar block is used for joystick y. It's used for changing the angle of servo #3. Servo #2 is kept fixed in this code.

Rotation of the gripper is given by the roll and pitch angles of the controller, measured by it's accelerometer. In order to make the control of the arm easier, the angle of the gripper is only updated when C or Z buttons are pressed.

When only C button is pressed, the code reads roll angle and use it as a set point. servo #5 is rotated until it reaches the set point. It's speed is proportional to the error between actual and desired position. A similar code is used for servo #4, which tracks Nunchuk's pitch angle.

// Enable accelerometer only when the buttons are pressed
        // Rotate gripper (only Z button pressed)
        if (c && !z) {
          roll = roll * 57.0 + 90.0; //convert do degrees
          servo5_speed = abs(angle5 - roll)/10 + 1; //speed proportional do the error between actual and desired angle
          if (roll > angle5) {
            angle5 += servo5_speed;
            display_angles = true;
          }
          if (roll < angle5) {
            angle5 -=servo5_speed;
            display_angles = true;
          }
          s5.write(angle5); //update servo position
        }

The gripper is closed whenever both C and Z buttons are pressed. When any of those buttons is released, the robot will open its gripper.

//Open/close gripper (both buttons pressed)
      if(z && c) {
        s6.write(90); //close gripper
        display_angles = true;
      }
      else {
        s6.write(45); //open gripper
      }

There's a block of code by the end of the sketch. It will display on the Serial Monitor the actual angle of each servomotor. It might be helpfull for choosing the starting angle of each motor.

Step 13: Usage

Now that everything is ready, power up the robot and have fun!

The Nunchuk is used to control the five movements shown in the pictures: right/left rotation, up/down movement, gripper rotation, gripper up/down movement, and gripper open/close movements. You can combine those movements for perfoming different tasks.

You can modify the code for having different movements based on a combination of the buttons and angles of the joystick.

Step 14: Final Considerations

If you still don't follow my tutorials, take a look at those other projects in which I explain a little bit about internet of things, robotics and 3D printing. I hope you enjoy them too!

https://www.instructables.com/id/IoT-Wallet-smart-...

https://www.instructables.com/id/IoT-Air-Freshner-...

https://www.instructables.com/id/Minimalist-IoT-Cl...

https://www.instructables.com/id/IoT-Air-Freshner-...

https://www.instructables.com/id/Nunchuk-Controll...

Liked any of my projects? Please consider supporting my future projects with a small Bitcoin donation! :D

BTC Deposit Address: 1FiWFYSjRaL7sLdr5wr6h86QkMA6pQxkXJ

Share

Recommendations

  • Plastics Contest

    Plastics Contest
  • Optics Contest

    Optics Contest
  • Audio Contest 2018

    Audio Contest 2018

25 Discussions

0
None
FrankL136

Question 2 days ago on Introduction

This is really nice! Thanks for posting such comprehensive instructions!

I am thinking about purchasing the Sainsmart robot control shield as well. Your post gives me much better confidence on it. One question here is: I am still not quite clear on how exactly you connect the 12V 2A external power supply to the power input terminal provided by the robot control shield? Would you mind shedding more color or even pics on that? Thanks!

0
None
IgorF2michael01952

Answer 6 days ago

Hi there!

Actually the MPU6050 wasn't used in this project. The kits comes with this module, but I used the accelerometer from the Nunchuk instead.

0
None
tscottwa

Question 5 weeks ago

Was wondering, as I see "enable accelerometer" within your code; where does the MPU6050 connect to the Arduino Mega shield? Am using same SainSmart kit and Mega board your photos show. Is the MPU6050 indeed necessary?

1 more answer
0
None
IgorF2tscottwa

Answer 7 days ago

Hi there!

Actually what I meant was to enable Nunchuk's accelerometer readings, not the ones from the MPU6050. There's a part on the code that rotates some servos based on the readings from the accelerometers of the Nunchuk controller, only when the buttons are pressed.

In this project I didn't use the MPU6050 module provided on the kit.

Sorry for the confusion.

0
None
IgorF2

8 weeks ago

Thanks! I'm glad you liked it! :D

Regarding the library, maybe you can go to the following link, download it (click "Clone or download"), and the copy only Nunchuk's library.

https://github.com/infusion/Fritzing

Regarding servo numbering, it starts from the base (servo 1 = base, ..., servo 6 = gripper).

I hope it helps.

0
None
ZiggyH

Question 6 months ago

I think you were right and i put each servo with reverse pins in code. But when I tried it and... nothing. Still says gripper is open. I switched the code back to how it originally was

1 more answer
0
None
IgorF2ZiggyH

Answer 6 months ago

If it says "gripper open" it means you were able to read the data on the Serial monitor, right? If you press then release both buttons, does it print "grippen opened" then "gripper closed"? If so, the Nunchuk is working properly.

Regarding the movement of the servos, they won't move unless you power them up, using an external 12V power source connected to that green connector on the Arduino shield.

0
None
ZiggyH

Question 6 months ago

In the code you provided and diagrams you showed, are you sure that which servos go to which ports are matched up? I look on the shield and it looks sort of different..

1 more answer
0
None
IgorF2ZiggyH

Answer 6 months ago

Please verify the connections between the arduino pins (pins D8, 9, 10, 11, and 12) and the signal pins of the connectors for the servos. In the shield I have, the labels with pin numbers on the connectors are mismatched. I realised that using and voltmeter. The 3.3V pin is also with a wrong label. It has a 5V indication, but when I measured it was a 3.3V pin.

0
None
ZiggyH

Question 6 months ago

Ok. I ordered a power source that will work, should come in a bit. For now, when i look at serial monitors and press both buttons at 9600 kbps, and.... nothing changes.... baud is kbps right? I couldnt find anything that changed....

0
None
ZiggyH

Question 6 months ago

Ok, none of the serial port is affected by nunchuck.... i think i need a power supply for that to work? The code now uploads, just nothing else works... should i connect power source while it is connected to computer?

1 more answer
0
None
IgorF2ZiggyH

Answer 6 months ago

You should be able to read some data on the Serial monitor if the Arduino Mega is connected to the USB port (even if you don't use another power source for the shield). But the motors won't move if you doesn't power up the shield using an external power source. You'll also have to turn on the power switch on the shield.

Also remind that the Serial monitor have to use the same baudrate configured on the Arduino code. In my example, I used 9600 kbps... otherwise you'll see nothing (or read a lot of garbage). If you press both buttons, for instance, the Serial monitor is supposed to print "gripper closed" (even if the motors doesn't move).

Remember to check the pins you've used between the shield and the nunchuk, and check some voltages with a multimeter (voltage to the Nunchuk 3.3V pin for instance). Also verify if you've connected your servos correclty.

I hope it helps.

0
None
ZiggyH

Question 6 months ago

Also, none of the motors have so much as moved the tiniest bit no matter what i try...

1 more answer
0
None
IgorF2ZiggyH

Answer 6 months ago

Even if the Nunchuk isn't working, the Arduino should move the motors to the preconfigured starting angle. If the code was loaded correctly, please verify the hardware. For instance: measure the output voltage for the servos to check if they are getting power supply.

0
None
ZiggyH

Question 6 months ago

Ok, all the libraries are in, everything is set up good. I hit upload, it says succesful, but nothing moves or happens. I am using the original nunchuck with the shield. Do you know what might be going wrong.

1 more answer
0
None
IgorF2ZiggyH

Answer 6 months ago

Hi there. When the code is running, it's supposed to read Nunchuk inputs, command the servomotors and print the angle for each motor on the serial monitor. Do you get anything on the Serial Monitor? Once it's open loop (the Arduino doesn't read the actual angle of the motors), it is supposed to show the expected angle for the motors, even if they aren't really there.

0
None
ZiggyH

Question 6 months ago

Hi! I got to the adding library stage, and i cannot get the library to work. Would the wiichuck library also work?

1 more answer
1
None
IgorF2ZiggyH

Answer 6 months ago

Hi there! I verified if the library was right, and apparently it's ok.

Did you remove any special characters (like the '-') from the zip file name before adding it to the Arduino IDE?

0
None
SAR-Francesc XavierM

7 months ago

Nice job. I did one myself some months ago and I used an adaptor to avoid tearing apart the nunchuck connector. There are adaptors out there for 50 cents. Make a search with nunchuck and arduino.

2018-03-05_140131.png