Getting the most out of your hobby servo

Overview

ServoProject

by Adam Bäckström

Getting the most out of your hobby servo

Robot

Theory

The control system of a regular hobby servo looks something like this:

loop1

This control scheme is good at holding and moving fast between position, but not so good at following a smooth predefined motion. Which is what you want when you build a robot.

Industrial servo controllers use a cascade based control scheme instead, which looks something like this:

loop2

This is the control scheme used in this project.

The main benefit of this approach is that it also takes the velocity and torque into account. This allows for a much tighter motion tracking.

Backlash control

When dealing with cheap gearboxes, backlash is always a problem. The hacked servos in this project uses two encoders to compensate for backlash. One AS5048a magnetic encoder or a potentiometer on the output shaft and one custom optical encoder inside the DC-motor. The benefit of having the extra encoder inside the motor is getting higher resolution and a main control loop which is backlash free. If one would only use the AS5048a for controlling, the backlash would enter the control loop as a time delay. This limits the control loop performance.

The backlash compensation is done by moving the main control loops reference-position so that the output encoder reaches the correct position.

Project structure

ArduinoSketch

This folder contains the Arduino project for the Adafruit ItsyBitsy M0 Express boards.

When compiling, the active configuration is selected by modifying the #include "*.h" line in the config/config.h file to include the desired config file. The configSelector.py and the configurationWizard.py scripts can be used to to simplify the config selecting process by giving a drop-down list with all configs in the config folder.

The folder also holds a Makefile which can be used to compile and transfer the project. One benefit of using the Makefile is that the configSelector script always is executed prior to compiling. To be able to use the Makefile you must first install arduino-cli.

Setup

setupStep1

  1. Create the base configuration

setupStep2

  1. Make the new configuration the active configuration by selecting it in the drop-down and transfer the project to the microcontroller. Either with the Arduino IDE or the make script.

setupStep3

  1. Calibrate the optical encoder

setupStep4

  1. Calibrate the pwm nonlinearity compensation

setupStep5

  1. Generate the system model (auto tune control loops)

setupStep6

  1. Calibrate the output encoder nonlinearity compensation

MasterCommunication

Holds the example master project.

To compile run make. This creates the program ./executable with the following options.

Allowed options:
  --playPath            play the path defined in createPath()
  --output arg          data output file
  --simulate            simulate servos

Obsolete options:
  --servoNr arg         servo nr
  --recOpticalEncoder   record optical encoder data of given servo
  --recSystemIdentData  record system ident data of given servo
  --recMomentOfInertia  record moment of inertia data of given servo
  --amp                 amplitude for recMomentOfInertia
  --frq                 frequency for recMomentOfInertia
  --pwmAmp              pwm amplitude for recOpticalEncoder and recSystemIdentData
  --fricPwmAmp          pwm amplitude to overcome friction for recSystemIdentData

MasterCommunication/view.kst

Kst2 project file which can be used to view the recorder data in test.txt from --playPath option. Run

./executable --playPath --output test.txt

to start robot movement and update plots.

USB_To_Serial

Basic Arduino project to turn an arm based Arduino into a fast usb-to-serial-converter. The resulting communication delay becomes much lower than FTDI based converters. This is important since the master has to be able to send and receive from all six servos every 18 ms.

CadFiles

Holds all .stl and the original Freecad files

PcbDesignes

Holds all KiCad projects for the electronics

Dependencies

ArduinoSketch

ArduinoSketch/configSelector.py

  • Python >= 3.8.2
  • python3-gi

ArduinoSketch/configurationWizard.py

  • Python >= 3.8.2
  • matplotlib >= 3.2.1
  • numba
  • numpy >= 1.18.5
  • python3-gi
  • scipy >= 1.5.0
  • serial

ArduinoSketch/Makefile

  • GNU Make >= 4.2.1
  • arduino-cli

MasterCommunication/Makefile

  • GNU Make >= 4.2.1
  • gcc >= 9.3.0
  • boost >= 1.71.0
  • Eigen >= 3.4.0

Hardware

Parts list

Modified normal size servo

Cad and stl files for 3D printing:

CadFiles/Servo

Electrical schematic:

PcbDesignes/Servo

Modified micro servo

Cad and stl files for 3D printing:

CadFiles/MicroServo

Electrical schematic:

PcbDesignes/MicroServo

Gripper

  • 1 x SG90 servo

".stl" files for 3D printing:

CadFiles/Robot/stl/GripperBase.stl
CadFiles/Robot/stl/GripperClip.stl
CadFiles/Robot/stl/GripperFinger1.stl
CadFiles/Robot/stl/GripperFinger2.stl
CadFiles/Robot/stl/GripperMount.stl

Robot

Cad and stl files for 3D printing:

CadFiles/Robot

Normal size servo modification (Turnigy MG959)

Build MainPcb and AS5048aEncoderBoard

A video on how to build the MainPcb and AS5048aEncoderBoard can be found at https://youtu.be/YQpAAr5RPSE?t=60. This video is for an older version but the building instructions are the same.

Servo gearbox with 3D printed parts

PCB Assemblies

How to mount the PCBs to servo

Build the Optical Encoder

  1. Take the motor, use pliers to bend out the four indents in the metal housing and bend up the motor lid.
  1. Remove the two steel brushes from the lid carefully by cutting the lid into pieces. Take the 3D printed motor lid and insert the two steel brushes and two ITR8307 into the new lid. Solder the ITR8307 according to:
PcbDesignes/Servo/OpticalEncoder/OpticalEncoder.sch
  1. Take the motor with the lid removed. Paint the rotor with black nail polish and glue in the optical encoder wheel on top as shown in the middle image. The dimensions of the encoder wheel can be found in:
CadFiles/Servo/OpticalEncoderWheelDimensions.png

Then carefully put the new lid on the motor without bending the steel brushes.

  1. Solder the four leads from the optical encoder on top of ItsyBitsy board as shown in this image.

Micro servo modification (MG90S or SG90)

  1. Open the servo, desolder the motor and the potentiometer
  1. Bend down the motor terminals and remove the plastic back axis cover so the motor looks like the one in the last image
  1. Place one of the holes on a servo horn over the axis. Then use a screw and a vice to push out the motor axis about 1 mm so it looks like the motor in the last image.
  1. Then solder two wires to the motor terminals. Use super glue to mount the optical encoder wheel to the back axis and mount the 3D printed "OpticalEncoderSensorMount" part over the back of the motor.
  1. Place the two IR sensors next to each other on a piece of tape and put some hot glue over them. Fold pin 4 of the lower sensor like the middle picture shows. Then fold in the rest of the ground pins, cut them to length and solder them together.
  1. Place the four resistors next to each other on a piece of tape, in the order 6.8k, 120, 1.5k and 120 ohm from right to left. Put some hot glue over them to hold them together and remove the tape. Fold the top leg of the 6.8k resistor like the middle picture shows. Then fold in the rest of the 3.3V pins and solder them together.
  1. Connect the two 120 ohm resistors to pin 1 on the IR sensors and the 6.8k and 1.5k ohm resistors to pin 3.
  1. Solder three wires to the potentiometer.
  1. Connect the potentiometers 3.3V and ground to the optical encoder sensors while soldering on a 5 wire flat cable to the assembly. Then connect the third wire of the flat cable to the potentiometer sens wire and connect the fourth and fifth wires to the IR sensors third pin. This wires up the flat cable so that from right to left we have: 3.3V, GND, output shaft potentiometer, optical encoder channel A and lastly channel B.
  1. Glue the optical encoder sensors to the "OpticalEncoderSensorMount". Cut the screws to a length so that they fit with the servo lid removed.
  1. Put back the motor and the potentiometer into the servo. See "PcbDesignes/MicroServo/MainPcb/MainPcb.sch" for info on how to connect the microcontroller and motor driver.

License

Open Source License

ServoProject is free software. You can redistribute it and/or modify it under the terms of Creative Commons Attribution 3.0 United States License.

To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/

Comments
  • Accuracy achievable

    Accuracy achievable

    Hi Adam, An awesome project. I was looking greater accuracy in servos for my automatic turret. Can you please tell me how accurate are the modified servos in degrees ?

    opened by vkumarsinghnoida 9
  • No current sensor?

    No current sensor?

    What a great project! I noticed that previous versions had current sensors and corresponding control codes。 However, in the latest version, there is no current sensor on the circuit diagram. However, there is still a current sampling part in the code. Is that right?

    opened by pzh11001 6
  • Alternative boards and code

    Alternative boards and code

    Hi My questions are regarding how to make the servo without custom pcb as given in coreless servo build. How many boards are required to control 2 servos? How exactly do we connect the board and use which software ? And can we use the original potentiometer instead of the magnetic encoder ?

    opened by vkumarsinghnoida 5
  • Compatibility with DS3218 servos

    Compatibility with DS3218 servos

    Hi adam,

    First congratulations for your work, your results with theses cheap servos are really impressive

    i'm verry interested in building five of them but before checkout on JLCPB, i would like to have your opinion about the PCB compatibility with DS3218 servos.

    i think its ok because the only difference with 3225 servos seems to be height , and obviously the final torque.

    what do you think ?

    Regards,

    opened by PJfixer 2
  • Brushed servos

    Brushed servos

    For building the robot you mention to use 3x coreless modified servos + 3x micro modified servos. Brushed servos are not required? Finding ATSAMD21G18A-A at a reasonable price for a custom PCB is very difficult this days. So, can we build the robot just with off the shelf boards?

    opened by Telepresent 1
Releases(v3.1)
자동 건강상태 자가진단 메크로 서버전용

Auto-Self-Diagnosis-for-server 자동 자가진단 메크로 서버전용 이 프로그램은 SaidBySolo님의 auto-self-diagnosis를 참고하여 제작하였습니다. 개인 사용 목적으로 제작하였기 때문에 추후 업데이트는 진행하지 않습니다. 의존성 G

JJooni 3 Dec 04, 2021
Lightweight, scriptable browser as a service with an HTTP API

Splash - A javascript rendering service Splash is a javascript rendering service with an HTTP API. It's a lightweight browser with an HTTP API, implem

Scrapinghub 3.8k Jan 03, 2023
Language-agnostic HTTP API Testing Tool

Dredd — HTTP API Testing Framework Dredd is a language-agnostic command-line tool for validating API description document against backend implementati

Apiary 4k Jan 05, 2023
0hh1 solver for the web (selenium) and also for mobile (adb)

0hh1 - Solver Aims to solve the '0hh1 puzzle' for all the sizes (4x4, 6x6, 8x8, 10x10 12x12). for both the web version (using selenium) and on android

Adwaith Rajesh 1 Nov 05, 2021
User-interest mock backend server implemnted using flask restful, and SQLAlchemy ORM confiugred with sqlite

Flask_Restful_SQLAlchemy_server User-interest mock backend server implemnted using flask restful, and SQLAlchemy ORM confiugred with sqlite. Backend b

Austin Weigel 1 Nov 17, 2022
Enabling easy statistical significance testing for deep neural networks.

deep-significance: Easy and Better Significance Testing for Deep Neural Networks Contents ⁉️ Why 📥 Installation 🔖 Examples Intermezzo: Almost Stocha

Dennis Ulmer 270 Dec 20, 2022
Integration layer between Requests and Selenium for automation of web actions.

Requestium is a Python library that merges the power of Requests, Selenium, and Parsel into a single integrated tool for automatizing web actions. The

Tryolabs 1.7k Dec 27, 2022
The pytest framework makes it easy to write small tests, yet scales to support complex functional testing

The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. An example o

pytest-dev 9.6k Jan 02, 2023
Python Projects - Few Python projects with Testing using Pytest

Python_Projects Few Python projects : Fast_API_Docker_PyTest- Just a simple auto

Tal Mogendorff 1 Jan 22, 2022
Useful additions to Django's default TestCase

django-test-plus Useful additions to Django's default TestCase from REVSYS Rationale Let's face it, writing tests isn't always fun. Part of the reason

REVSYS 546 Dec 22, 2022
Selenium-python but lighter: Helium is the best Python library for web automation.

Selenium-python but lighter: Helium Selenium-python is great for web automation. Helium makes it easier to use. For example: Under the hood, Helium fo

Michael Herrmann 3.2k Dec 31, 2022
Data-Driven Tests for Python Unittest

DDT (Data-Driven Tests) allows you to multiply one test case by running it with different test data, and make it appear as multiple test cases. Instal

424 Nov 28, 2022
Flexible test automation for Python

Nox - Flexible test automation for Python nox is a command-line tool that automates testing in multiple Python environments, similar to tox. Unlike to

Stargirl Flowers 941 Jan 03, 2023
To automate the generation and validation tests of COSE/CBOR Codes and it's base45/2D Code representations

To automate the generation and validation tests of COSE/CBOR Codes and it's base45/2D Code representations, a lot of data has to be collected to ensure the variance of the tests. This respository was

160 Jul 25, 2022
a plugin for py.test that changes the default look and feel of py.test (e.g. progressbar, show tests that fail instantly)

pytest-sugar pytest-sugar is a plugin for pytest that shows failures and errors instantly and shows a progress bar. Requirements You will need the fol

Teemu 963 Dec 28, 2022
buX Course Enrollment Automation

buX automation BRACU - buX course enrollment automation Features: Automatically enroll into multiple courses at a time. Find courses just entering cou

Mohammad Shakib 1 Oct 06, 2022
Fidelipy - Semi-automated trading on fidelity.com

fidelipy fidelipy is a simple Python 3.7+ library for semi-automated trading on fidelity.com. The scope is limited to the Trade Stocks/ETFs simplified

Darik Harter 8 May 10, 2022
A pytest plugin, that enables you to test your code that relies on a running PostgreSQL Database

This is a pytest plugin, that enables you to test your code that relies on a running PostgreSQL Database. It allows you to specify fixtures for PostgreSQL process and client.

Clearcode 252 Dec 21, 2022
Baseball Discord bot that can post up-to-date scores, lineups, and home runs.

Sunny Day Discord Bot Baseball Discord bot that can post up-to-date scores, lineups, and home runs. Uses webscraping techniques to scrape baseball dat

Benjamin Hammack 1 Jun 20, 2022
A python bot using the Selenium library to auto-buy specified sneakers on the nike.com website.

Sneaker-Bot-UK A python bot using the Selenium library to auto-buy specified sneakers on the nike.com website. This bot is still in development and is

Daniel Hinds 4 Dec 14, 2022