Assistive Robotic Manipulator and 6-DoF Controller

A low-cost, 3D printable assistive robotic arm prototype for individuals with limited upper limb mobility.

Public Chat
Similar projects worth following
This low-cost, open-source project involves an assistive robot arm with 6 degrees of rotational freedom and a smaller 6-dimensional controller joystick which can be manipulated by the user to intuitively control the robotic arm.

A primary goal of this project is to provide students and researchers a low-cost experimental testbed for the development of joystick-based assistive robotics. For those with upper limb mobility impairments, robotic arms can increase autonomy and improve quality of life. Individual joint sensitivity of the controller can be calibrated to exploit specific mobilities of the user to provide a greater range of motion and force.

Table of Contents - Log Files

Robot arm manufacturing details

Designing controller arm

Two-finger gripper

Electronics enclosure

Software development

Future work


For those with upper extremity impairments that affect strength and reach, performing simple physical activities of daily life can prove to be insurmountable. Assistive robotic arms have been shown to be effective tools to increase user autonomy within these tasks and can significantly reduce caregiver intervention.[1

User interfaces for commercial assistive robot arms vary between products, however most are centered around standard wheelchair joysticks or keypads. Such interfaces can lead to a significant bottleneck in user efficiency that is caused by the reality of controlling a high-dimensional robot arm with a low-dimensional "conventional" joystick. That is, without the use of additional intelligent control algorithms, auxiliary buttons and low DoF joysticks are used to switch between control modes to perform compound movements. 

 Such operation is simple however, small delays from switching joints can quickly accumulate into a significant amount of time for the user. The this project is an investigation into the viability of concurrent joint operation, opposed to consecutive operation of individual joints as seen in many current systems. 

System Overview

The proposed experimental system hardware consists of a robotic arm, a controller arm, and an electronics housing. The controller arm acts as a 6-dimensional joystick, and its pose can be manipulated to proportionally control the robot arm. Calibrating sensitivity of individual joints on the joystick to exploit the user's specific abilities can allow for an increased range of motion of the robot arm. 

A functional diagram of the electrical system can be seen below.

The core assumption underlying the operation of this device is that the intended user possesses sufficient motor control to move the control joystick in at least several different directions. Not all six axis are required for operation, but the more used will allow for improved functionality in manipulation.

Controller Arm

An early version of the controller arm is shown below. The device connects to the electronics enclosure via a VGA cable. Each joint rotates about a 10k rotary potentiometer which acts as a position sensor. The kinematic structure of the controller arm is congruent to the robot arm, at approximately 1/3 scale. Each pot acts as a voltage divider and provides an analog voltage for the Teensy to interpret. With full positional and orientationally freedom, users can move the tip of the controller in any direction, and the robotic arm will match the movements in a proportional manner. 

Two Finger Hand

Robotic Arm

The design of the robotic arm used in this project is based on the Annin AR3 industrial arm, an open-source robotics platform. More information regarding this project can be found here. This is an ongoing project with detailed specifications on motor sizes, hardware, fasteners, etc.

One significant modification to the original design was that I manufactured nearly every component from plastic. There are several reasons why I chose to do this. It is much simpler to machine plastic parts, and building the arm during Covid restricted my access to large equipment that would be necessary to produce an aluminum system. Secondly, a plastic-based robot has generally reduced rigidity, weight and increased compliance compared to aluminum construction. All of these attributes are favorable in application of a collaborative robot (COBOT) where human safety is the top priority.

Additionally, I redesigned the J2 arm, adding additional support and lowering the location of the J3 motor. 

The specifications for this arm (weight, payload, reach, DOF, etc.) are very similar to the JACO ™...

Read more »


Basic control software to be flashed to the Teensy. Calibration can be performed by changing the multiplier values for each of the motors.

ino - 3.76 kB - 08/24/2021 at 01:29


Folder containing STL files for 3D printable structural components in the controller arm

x-zip-compressed - 160.23 kB - 08/18/2021 at 18:36



Full FreeCAD model of the controller arm

x-zip-compressed - 5.50 MB - 08/18/2021 at 18:35


STL files for structural components of AR3 robot arm, along with covers, spacers, and additional supports

x-zip-compressed - 6.21 MB - 08/18/2021 at 18:30


  • 1 × Teensy 3.5 MCU $24.25
  • 1 × 17HS15-1684D-HG10 NEMA-17 stepper motor (J1) $46.81
  • 1 × 23HS22-2804D-HG50 NEMA-23 stepper motor (J2) $87.20
  • 1 × 17HS15-1684D-HG50 NEMA-17 stepper motor (J3) $58.12
  • 1 × 11HS20-0674D-PG14 NEMA-11 stepper motor (J4) $34.31

View all 76 components

  • ROS functionality and simulation with ros_control and Moveit

    Michael Laffin04/04/2022 at 14:53 0 comments

  • Two-Finger Gripper

    Michael Laffin11/16/2021 at 19:23 0 comments

    This gripper is based on the Yale OpenHand research, and used a method of fabrication known as "hybrid deposition manufacturing" to produce a multi-material part which allows for superior grasping characteristics. The assembly consists of two fingers that are individually driven with 20kg servo motors. Each finger has two degrees of freedom, and is controlled by a single motor, making the device an underactuated system. Underactuated robotic hands show adaptive behavior that is allows for a wide range of objects to grasped. 

  • Future Work

    Michael Laffin08/18/2021 at 16:35 0 comments

    End Effector

  • Electronics enclosure

    Michael Laffin08/17/2021 at 19:04 0 comments

    An inside look at the controls enclosure. Mains voltage is fed in the right side inside the box and a DIN rail splits and connects two switched-mode power supplies. The larger supply on the bottom is 24V 10A for driving the stepper motors. The smaller power supply is located directly above and supplies 5V lines for the microcontrollers and accessories. The DM542T and DM320T drivers are mounted vertically (J6-left to J1-right).

    Close-up on the cable feedthroughs on the lid of the enclosure. The ribbon cable on the top left is for the controller arm, the CAT9 cables are used for high-speed encoder transmission, and the motor power cables are spaced horizontally on the bottom. On the far right there is an additional safety switch for the whole system. 

    An exterior view before the VGA port was added. I also ended up removing the key switch for a simpler rocker switch. 

  • Software Development

    Michael Laffin08/15/2021 at 21:15 0 comments

    Teensy Script

    The current control scheme that I use to control the robot is very basic and uses the Arduino framework. I used the ubiquitous AccelStepper  stepper control library which offers acceleration and deceleration functionality, as well as independent concurrent stepping with multiple motors (crucially important!). The pseudocode below explains the core process of stepping the motors concurrently.

         // Read analog value of each potentiometer
         targets = analogRead(SENSORS);
         // Assign a target value for the motors to step towards
         MOTORS.moveTo( targets * multipliers );
         // All motors perform a single step towards the target;

    Each loop iteration reads the position of all the sensors within the joystick, updates the target position for the steppers, and performs a single step towards it. Each of the stepper motor objects have different acceleration characteristics. 

    Additionally, the limit switches are configured as INPUT_PULLUP and prevent overextension on each joint.


    When using cheap components to drive large state changes within this system, it is important the the sensor readings are consistent and predictable. In this case, the analog voltage of the potentiometers in the controller arm are directly used to move joints quickly in an application involving close contact with people. The potentiometers I used are robust, but often noisy devices. To reduce jitter I added a 0.1 uF ceramic capacitor between the analog voltage and ground on each of the potentiometers in the controller arm. This creates a low-pass filter for the control signal. 

    Exponential smoothing in software

  • Designing controller arm

    Michael Laffin08/15/2021 at 21:00 0 comments

    The mechanical design of the controller arm assembly was done using the open source modeler FreeCAD. Although it may not appear similar, the structure is dimensionally congruent to the full robot arm. The potentiometers are shown in red to increase visibility, and printed components are shown in grey. Full CAD model is available here. To print individual components, simply select the part from the model list and export as an STL to be printed. 

    The spacer plate shown below was machined out of polycarbonate, however it could be printed in PLA just as effectively as the other parts. The J1 potentiometer shown below was eventually replaced with this component. Both of these are overkill electronics for this application, but when using the shaft directly in the joint I primarily want a mechanically robust part. 

    Beginning the design of the arm. The methodology that I used was to basically design the most minimal solution, and then immediately print and test the operation. After several iterations I could usually move on to the next joint within the arm with reasonable confidence. I still want to modify several parts of the design to control joint stiffness on J3 and J1.

    Mechanical progress up to the J3 hinge. You can see how I threaded the wires for J1 through the base. A hole was later drilled into the base to allow wires from the other potentiometers into the rear of the wire housing.

    J4 hinge completed. I added a set screw to allow for vertical adjustment on the J4 link. For most joints the controller has a larger range of motion than the actual robot arm, but this can be compensated for in software. 

    Soldering ribbon cable to the VGA connector in the base of the controller. I decided to use this connector simply because it contains a sufficient number of conductors, and I had several on hand already. Each conductor is marked with tics from a Sharpie, and heat shrink tubing is used to insulate.

    Functional arm shown below. The ribbon cables were grouped together using kapton tape and 1/4" plastic wiring harness. Ideally all of these cables could be harnessed within the body of the arm to reduce clutter in the final product. 

    Initial testing of full controller arm. The J6 potentiometer shaft has six degrees of freedom and can move in any position within the range of the arm. 

  • Prototyping the Robot Arm

    Michael Laffin08/15/2021 at 00:20 0 comments

    Printing Structural Components + Covers/Spacers

    All printed components in this system are PLA, and are printed at 100% infill. Everything was printed on my old da Vinci Junior 1.0. Setting tapered roller bearing seats into the J1 and J2 turret housings.

    Initial progress on the first version of the J2 arm with spindle and roller bearing installed on the left side. On the right side the J3 bearing assembly is finished, with spindle and retainer installed. To note, I've tested printing the J3 bearing cup at a lower infill, to act as an intentional break-point in the event of a collision. Ultimately this entire arm is replaced with a solid polycarbonate plate, and the spindle retainer was eventually remade in aluminum.

    J3 chain installed and tensioned. This can be seen even with the cover on in the final design! All the extra work involved in adding a chain and sprocket drive is simply to lower the mass of the J3 motor towards the base of the arm. Even though it would be much simpler to manufacture, direct driving this joint would extend the mass of the arm and involve much larger forces on the lower joints when moving. 

    The chain and sprockets are lubricated with lithium grease. Below the cover for the J2 Arm installed. The rear side contains a rigid wire harness to contain slack from the additional motors. 

    Initial work on the J5 lower assembly. The J5 motor shaft has a 200mm lead screw which drives the inner carriage back and forth on 3mm linear rods and bearings. Alignment of these components is critical, and took several attempts to get proper results. 

    Below the J4 turret housing is installed perpendicular to the J3 spindle. I had pressed a needle roller bearing inside and installed the J4 shaft. The J4 timing hub is also fixed to the shaft, along with the J5 motor mount and associated thrust bearings and washers. At this moment I was installing the J5 lower assembly.

    Another progress photo, now showing the J4 timing belt installed and tensioned. The J5 upper bearing arm is bolted to the J5 lower assembly. The J6 housing and spindle holds the 6th axis stepper motor, and is held captive to the J5 bearing arm via tapered roller bearing and cap with thrust needle-roller bearing and washers.

    The 150XL timing belt used is fixed to the J5 carriage clamp, and tensioned between the 15XL pulley and idler post on the J5 lower assembly. The rotation of the J5 shaft shaft (lead screw) drives the carriage clamp back and forth within the assembly, driving 

    J2 Redesign (above) and fabricated part made from polycarbonate plate (below).

View all 7 project logs

Enjoy this project?



Dimitri wrote 04/04/2022 at 17:56 point

Great project! Your work is very impressive.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates