Robot Arm with Multi Motor Movement

I’ve improved the movement of my robot arm by implementing multi motor movement. This means moving large distances will be more efficient since the arm can take a more direct route. You can see this in the video I created above. You’ll find my code for this routine here:

https://github.com/directorcia/Azure/blob/master/Iot/Arduino%20Uno%20R3/Robot%20Arm/routine2.cpp

This has lead me to go down the rabbit hole of kinematics.

Kinematics is the science of motion without considering forces. For robot arms, it answers questions like:

  • Where should each joint move to place the end-effector at a specific position?

  • What angle should each servo rotate to reach a target point?

There are two primary types:

  • Forward Kinematics – You provide joint angles, and it calculates the end-effector’s position.

  • Inverse Kinematics (IK) – You provide a desired end-effector position, and it calculates the joint angles needed to get there.

I’m going to try and implement kinematics for my arm going forward, so stay tuned for updates.

Keyestudio Sensor Shield/Expansion Board V5 for Arduino


Screenshot 2025-04-29 192828

One of the issues I found when powering the servos for the robot arm was that I found I couldn’t power them from the Arduino board, I needed an external power supply. This fact made wiring the servos up challenging as the control signal still had to come from the Arduino but the power elsewhere. Thus, lots of messy wires.

All that has been solved with the addition of a Keyestudio Sensor Shield/Expansion board as seen above.


Screenshot 2025-04-29 193342

Basically, the shield simply plugs into the pins in the Arduino controller (extending them) while providing:

– An alternate power supply

– Easy connections for all the servos

Screenshot 2025-04-29 193632

A nice compact solution to a few challenges with the robot arm. All I needed to do was connect up the shield onto the Arduino and then connect the servo motors directly to their ports and change nothing else. No code or other wiring was done except to also connect an external power supply to the shield board as seen in the lower right above.

I have to say, that if you need to control devices that require more power than the standard Arduino board can provide then this type of shield is exactly what you want!

Thumbs up to Keyestudio for both the controller:

KEYESTUDIO UNO R3 Development Board For Arduino Official Upgrated Version With Pin Header Interface

and the shield

Keyestudio Sensor Shield/Expansion Board V5 for Arduino

A diagram of the project looks like:

Screenshot 2025-04-29 194500

Nanoblock Tokyo Skyline Building Kit

20250426_040620737_iOS

Nanoblock Tokyo Skyline Building Kit, White – https://www.amazon.com.au/Nanoblock-Tokyo-Skyline-Building-White/dp/B07CDQQXWG/

1310 pieces

A kit with a lot of different components and colours. Takes longer to assemble than you think simply because you need to find a lot of unique pieces. However, enjoyed the longer assembly process and overall details of the end result. If you don’t mind so many unique pieces then this is great longer term build of intermediate difficulty.

Garage sensor–Version 1 summary

image

Video link = https://www.youtube.com/watch?v=MBYtc1O-l94

I’ve rounded off version 1 of the Garage sensor and am about to start work on version 2. There is a short video summary of what he sensor does in the video above.

I’m not happy with the daughter board that runs the 5 LEDs. It is cumbersome, challenging and time consuming to build. I plan to replace this with something pre-built. I’ll also opt for a cheaper Arduino board. The process will also require me to rework the 3D printed board all the components are mounted on.

Stay tuned for Version 2 coming soon!

Robot arm in action–Linear motion

Video link = https://www.youtube.com/watch?v=zdtojnnbCBg

Now that I have my robot arm actually working, I can share the video of its operation above. It basically operates one servo at time to pick up and object and then place that object to the left. It will simply continue to do that over and over.

The code for this is here:

https://github.com/directorcia/Azure/blob/master/Iot/Arduino%20Uno%20R3/Robot%20Arm/routine1.cpp

Which I’ll explain in an upcoming post soon.

After that I want to modify the operation so that it more more naturally and operates multiple servos together to arrive at its destination.

Getting the robot arm to actually work

After taking a good while to get the robot arm assembled, the next challenge was hooking it up and doing some initial testing.

To control the arm I had invested in a

KEYESTUDIO UNO R3 Development Board For Arduino Official Upgrated Version With Pin Header Interface

image

This is the same board that is used on the Sun follower kit I recently built. I like this board because it has all the connections for each port already mounted on the board. It also has the GND and VCC for each port as well making it easy to plug standard connectors into it. Less soldering, in my case , means less problems or stuff ups by me!

The first issue I discovered was that many of the leads to the servos were too short when the servo moves the arm through its full motion. In one case I threw the controller board off the table. Thus I needed to invest in:

Servo extension cable 600mm

and

Servo Extension Cable (1m)

to allow full movement of the arm.

The next challenge I found was when I moved on from testing each servo individually to testing the arm as single unit, some of the servos didn’t seem to work! Another oversight by me upon further investigation. The controller board has enough power to run a single servo but not a bank of servos all together from the VCC rails on the controller board.

I therefore connected the VCC of the all the servos directly to my bench top power supply to give it the juice needed. Interestingly, during testing I have seen the arm draw well over 1 amp in total from the power supply as various servos operate. Clearly, no way the controller board could provide that by itself.

With all the servo motors now working, I started to try and get the arm to move to a location and pick up an item. After a while, servo 0 (gripper) stopped working?? I checked all the connections and it still wasn’t working. It wasn’t until I actually touched the servo and found that it was super hot that I realised I must have burnt it out. Damm.

I replaced the burnt out servo with another I had. I also attempted to fix the burnt out servo by opening it up to see if I could free things up inside, but that didn’t go well and I ended up with the internals of the servo motor all over the floor.

I also learnt that when power is removed from the servos, for example when re-flashing the controller board, the servos don’t hold the arm in place. This means that when power is removed from the servos the arm collapses under its own weight. This can cause some unexpected impacts with the environment when power is restored. I’ll need to think about how to solve this down the track but for now I simply support the arm when I flash the controller with updated code.

Finally, with a replacement servo for the gripper and motor extension cables I had the arm operational to a point where I could start getting it to do something interesting.

I’ll cover off the code development in an upcoming article and hopefully also provide some videos of the arm in operation.

Building a 6DOF Programmable Robot Arm: A Step-by-Step Guide for Educators and Enthusiasts

There’s something incredibly satisfying about assembling your own robot arm. As someone who recently built the 6DOF Programmable Robot Arm Kit from IDY Production, I wanted to share my experience and provide a comprehensive guide for fellow educators, students, and robotics enthusiasts.

What’s in the Box

When my Amazon package arrived, I was impressed with how neatly everything was organized. The kit includes:

  • 2mm thick aluminium plate components (pre-cut and precision machined)

  • 6 high-torque servo motors for each degree of freedom
  • All necessary hardware (screws, nuts, spacers)

What was noticeably missing, however, was a comprehensive instruction manual. Despite the kit’s professional appearance, I had to hunt down assembly instructions online—an unexpected challenge that’s worth mentioning for anyone considering this purchase.

The quality of the materials immediately stood out – the 2mm aluminium plates are robust and precisely manufactured, providing a solid foundation for educational applications.

Finding Assembly Instructions

After discovering no instructions were included in the package, I immediately went searching online. Fortunately, I found several helpful resources:

  • PDF Assembly Guide: Downloadable Assembly Instructions PDF – This detailed document provides clear illustrations and step-by-step instructions for assembling the robot arm.

  • YouTube Tutorial: 6 dof robotic arm build tutorial part1 – This comprehensive video walks through the assembly of a similar 6DOF robot arm and was invaluable for understanding the correct positioning of components and servo motors.

I recommend downloading and printing the PDF instructions before beginning assembly, and having the video tutorial available for reference during the more complex assembly steps.

Assembly Process

1. Preparing Your Workspace

Before diving in, I recommend setting up a clean, well-lit workspace with all your tools organized. You’ll need:

  • Phillips screwdriver set

  • Needle-nose pliers

  • Small adjustable wrench

  • A container to hold small parts
2. Base Assembly

I started with the base, attaching the first servo motor to the bottom plate. The pre-drilled holes aligned perfectly, though I found it helpful to loosely thread all screws before tightening any of them fully. This allowed for minor adjustments as I completed each section.

3. Building the Arm Segments

Each joint required careful attention to the orientation of the servo motors. The PDF guide provides excellent diagrams showing the exact positioning of each component, while the video tutorial shows the assembly process in action. This combination of resources made even the trickier joint assemblies manageable.

The aluminium plates connect seamlessly, creating a professional-looking result that’s both sturdy and aesthetically pleasing.

4. Wiring the System

Cable management proved to be one of the more challenging aspects. The kit includes cable ties, but I supplemented these with spiral wire wrap to keep everything tidy. Take your time routing the wires to ensure they won’t impede movement once the arm is operational.

The video tutorial shows a good approach to cable management around the 12:40 mark, which I found helpful for keeping wires organized without restricting movement.

Programming Your Robot Arm

Once assembled, the real fun begins. The arm can be programmed using:

  • Arduino IDE (for customized control)

  • ROS (Robot Operating System) for advanced applications

  • Various GitHub repositories with open-source robot arm control code examples

I am planning on creating pick-and-place applications and programming choreographed movements across all six degrees of freedom.

Final Thoughts

The 6DOF Programmable Robot Arm Kit from IDY Production strikes an excellent balance between educational value and build quality. The 2mm aluminium construction ensures longevity even in classroom environments where equipment typically endures heavy use.

While the absence of included instructions was initially frustrating, finding the PDF guide and YouTube tutorial ultimately provided more comprehensive guidance than a basic manual might have offered. The assembly process itself is educational and deeply rewarding, though newcomers should expect to spend time studying both resources before and during assembly.

For college instructors looking to provide students with practical robotics experience, this kit offers tremendous value—just be prepared to supplement the package with the online resources I’ve mentioned.

Have you built a similar robotics kit? I’d love to hear about your experience and any creative applications you’ve developed in the comments below!


This blog post is based on my personal experience with the IDY Production 6DOF Programmable Robot Arm Kit, purchased through Amazon. The opinions expressed are my own, and I received no compensation for this review.

Garage Sensor–Power saving

image

I installed the CIAOPS Labs Garage Sensor just before I took my car out for a drive. About 2 hours later I returned to basically find that the 9 volt battery I was using to power the unit was flat!

So, I put the unit back on the bench and found that during operation the unit was drawing around 0.15 amps. Feeding that into AI I laern:

Battery Life (hours) = Capacity (mAh) ÷ Current Draw (mA)

Example 1: Alkaline (500 mAh)

Battery Life = 500 mAh ÷ 150 mA = 3.33 hours

Example 2: Lithium (1200 mAh)

Battery Life = 1200 mAh ÷ 150 mA = 8 hours

Example 3: NiMH (200 mAh)

Battery Life = 200 mAh ÷ 150 mA = 1.33 hours

Given that I was using an alkaline battery (of unknown life prior) the 3.33 hours above does correlate with what I saw.

To try and reduce the power usage over time I modified the code (here)

https://github.com/directorcia/Azure/blob/master/Iot/Arduino%20Uno%20R3/Garage%20distance/main.cpp

and added some logic to turn off the display and LEDs when no car has been detected for a period of time. This logic proved challenging because of the variation in the distance sensor. My idea was simply to monitor for a static distance beyond the range of the car but the challenge proved that the distance sensor constantly returns different values. Thus, I need to create an inactivity timer and then tie that to an acceptable variance returned from the distance sensor, before I shut down the displays.

After uploading the code and waiting for the timeout period I found the current had dropped to 0.05A. Unfortunately, that still only provides about 10 hours of use on a single 9 volt battery.

Thus, I am now using an AC power adapter to power the unit for now. However, I will have to look into ways that I can reduce the power consumed by the Arduino Uno I think.

Garage Sensor–Code

image

This is a follow on post to my:

Garage Sensor overview

and

Garage Sensor – Genesis

What I want to do here is spend some time looking at the code, which can be found here:

https://github.com/directorcia/Azure/blob/master/Iot/Arduino%20Uno%20R3/Garage%20distance/main.cpp

First steps are to have the include statements, which are:

#include <Wire.h>
#include “SparkFun_Alphanumeric_Display.h”
#include <VL53L1X.h>
#define DISPLAY_ADDRESS 0x70

I then need to create an instance of both the display and distance sensor, which is done via:

HT16K33 display;
VL53L1X sensor;

by default, the display will be at address 0x70 and the distance sensor will be 0x29 for I2C communications.

Next, I define some constants:

const uint16_t POT_PIN = A0;             // Analog pin for potentiometer
const uint16_t mid_point = 1380;         // Optimal distance from wall
const uint16_t adjust = 334;             // potentiometer midpoint value;
const uint16_t average_number = 10;      // Number for averaging distance readings

The pot to allow distance trimming will be at analog port 0. I define the mid point of this pot. Anything past the middle will extend (i.e. add) the optimal distance and anything below will subtract from my optimal distance. I found the total value range (i.e. low and high) of the pot simply by measuring the input from the pot in different positions directly from the analog port.

I define my optimal distance from the wall. Here, 1380 mm.

I define the number of repetition I want to use and then average my readings across as 10 here.

int potvalue;
int SWITCH_PIN = 8;                 // Debug Switch pin
int LED_UNDER_RED = 3;              // LED pin for under red
int LED_UNDER_YELLOW = 4;           // LED pin for under yellow
int LED_WHITE = 5;                  // LED pin for white
int LED_OVER_YELLOW = 6;            // LED pin for over yellow
int LED_OVER_RED = 7;               // LED pin for over red

Next I define a variable for my pot and the digital pins on which each LED is connected.

// Initialize I2C communication
Wire.begin();


// Initialize the display
if (display.begin(DISPLAY_ADDRESS) == false) {
   Serial.begin(9600);
   Serial.println(“Display not found. Check wiring.”);
   while (1);
}


// Initialize the VL53L1X sensor
sensor.setTimeout(500);
if (!sensor.init()) {
   Serial.begin(9600);
   Serial.println(“Failed to detect and initialize sensor!”);
   while (1);
}
sensor.startContinuous(50);
sensor.setDistanceMode(VL53L1X::Long);
sensor.setMeasurementTimingBudget(100);


// Clear the display
display.clear();
display.write(“Boot”);

In my setup look I start I2C communications, initialise the LED display along with the distance sensor.

// pinmodes
pinMode(SWITCH_PIN, INPUT_PULLUP);
pinMode(POT_PIN, INPUT);
pinMode(LED_UNDER_RED, OUTPUT);
pinMode(LED_UNDER_YELLOW, OUTPUT);
pinMode(LED_WHITE, OUTPUT);
pinMode(LED_OVER_YELLOW, OUTPUT);
pinMode(LED_OVER_RED, OUTPUT);
delay(100);
digitalWrite(LED_UNDER_RED, HIGH);
delay(100);
digitalWrite(LED_UNDER_YELLOW, HIGH);
delay(100);
digitalWrite(LED_WHITE, HIGH);
delay(100);
digitalWrite(LED_OVER_YELLOW, HIGH);
delay(100);
digitalWrite(LED_OVER_RED, HIGH);
delay(100);

I define my pin modes for the LEDS and set them all to high so I know they work on each boot.

// average pot readings
unint16_t sum = 0;
for (int i = 0; i < average_number; i++) {
   sum += analogRead(POT_PIN);
   delay(2);
}

I then take a number of analog readings from the location of the pot and average them to come to a single value to be used to adjust the optimal distance.

In my loop

// average distance readings
uint16_t sum = 0;
for (int i = 0; i < average_number; i++) {
     sum += sensor.read();
     delay(2);
}
uint16_t stableDistance = sum / average_number;

I firstly get an average distance from my sensor.

uint16_t midvalue = mid_point + potvalue – adjust;      // Adjusted midpoint value
uint16_t under_red = 0.8 * midvalue;                    // Under red zone
uint16_t under_yellow = 0.96 * midvalue;                // Under yellow zone
uint16_t over_yellow = 1.04 * midvalue;                 // Over yellow zone
uint16_t over_red = 1.2 * midvalue;                     // Over red zon
e

I use this average distance, less any adjustment via the pot to set the distance zones for each LED.

int reading = digitalRead(SWITCH_PIN);

I then see if the debug switch has been set.

if (reading == LOW) { // if Debug mode
     int adjustvalue;
    
     // average pot readings
     uint16_t sum = 0;
     for (int i = 0; i < average_number; i++) {
         sum += analogRead(POT_PIN);
         delay(2);
     }
     potvalue = sum / average_number;


    // Turn on all LEDs
     digitalWrite(LED_UNDER_RED, HIGH);
     digitalWrite(LED_UNDER_YELLOW, HIGH);
     digitalWrite(LED_WHITE, HIGH);
     digitalWrite(LED_OVER_YELLOW, HIGH);
     digitalWrite(LED_OVER_RED, HIGH);
     delay(100);


    // Display the pot value          
     snprintf(buffer, sizeof(buffer), “%4d”, (potvalue – adjust));
     display.write(buffer);

If it has then I turn on all the LEDs and display the pot value on the display. The idea is that in debug mode you adjust the pot to set any desired offset in distance for your unique circumstance.

If the debug switch isn’t on then I display the current distance on the 4 digit LED display and turn teh appropriate LED on the and the others off. I manage that in a case statement.

Thus, I keep looping through reporting distance from teh sensor to the 4 digit LED display and setting the proximity LEDs unless the debug switch is on. If the switch switch is set, then I display the pot setting so that it can be adjusted.

The idea is you power up the unit in debug mode, ensure all LEDs are working and adjust the pot to setting to create an offset from the define optimal of 1380mm. You then turn off debug mode and the 4 digit LED display will show the distance from the wall in mm and the proximity LEDs will display based on the range from the wall.

Garage Distance Sensor–genesis

image

In a previous post I provided an initial overview of my Garage distance sensor.

The aim of the project is to provide a way to report the distance of a vehicle as it parks in a garage. It does this by sensing and showing the distance from a wall in the garage.

Initially, I was simply going to display a distance reading in millimetres, but the I thought that this may be confusing and at times hard to read if you were sitting inside the vehicle trying to park.

I settled on 4 digit LED display Sparkfun Qwiic Alphanumeric Display – pink because it was already pre-wired, relatively large digits and easy to read from a distance. Would I have liked larger digits? Sure, but for now, in test mode, these are more than adequate.

I also added a set of 5 LEDs to act as distance indicators. They are:

Red – Large away distance

Yellow – Medium away distance

White – Paring zone distance

Yellow – Medium close distance

Red – Large close distance

The driver is ultimately aiming to be in the white LED zone when parking. Anything else let’s them know, too far or too close. The idea with these LEDs on top of the distance display is that it is easier for the driver to see a single LED colour rather than having to read and then comprehend a distance in millimetres. If you are worried about parking you car, the less you have to worry about the better I believe.

To actually measure and report the distance I opted for a Adafruit VL53L1X Time of Flight Distance Sensor because its range is from 30 to 4000mm and it uses a Qwiic connector, which means less soldering. Given that I have already built projects with the VL53L0X sensor (30 – 1000mm):

Displaying distance on LCD screen

I would be able to reuse a lot of knowledge and code. The VL53L1X will give me out to four metres, which is right on song for something in a garage.

I decided to use an original Arduino Uno R3 controller for this project as well to gain some experience with the board. There are certainly more powerful and featured controllers, but it is more than adequate for this project.

As I developed the project I realised that I would need to work out the required distance manually and then code that in to the controller. This would mean that any adjustment of that parameter would mean updating the controller. Thus, I added a potentiometer that could used to make slight distance adjustments if required. That is, using the potentiometer, you can make the optimal distance either closer or further away. This means the distance can be adjusted without reprogramming.

To make this adjustment in distance if required, I added a simple switch to put the things into a ‘debug mode’. When the switch is ‘active’ you can use the potentiometer to adjust the sensor optimal distance offset. This offset is then detected when the unit returns to ‘normal mode’, and added (or subtracted) from teh coded optimal distance. Also, while in ‘debug mode’ all the LEDs will light so you know they are all operating.

The idea is then that you mount the garage distance sensor on a wall. When the the sensor detects the car it will display a distance in millimetres as well as display the appropriate LED based on the distance. The coded optimal distance value can be adjusted via an offset that is configured in ‘debug mode’ when the switch is set.

Hopefully, that gives you a better idea of what I was trying to achieve with my Garage distance sensor. In upcoming articles, I’ll break down each component and how I built it.