Hey! This thing is still a Work in Progress. Files, instructions, and other stuff might change!

Parametric Rotary Encoder Gray and Natural Code

by fpetrac, published

Parametric Rotary Encoder Gray and Natural Code by fpetrac Dec 25, 2016

Design Tools

OpenSCAD gcc

Liked By

View All

Give a Shout Out

If you print this Thing and display it in public proudly give attribution by printing and displaying this tag.

Print Thing Tag

Thing Statistics

3185Views 623Downloads Found in Robotics


It is an absolute angle encoder using the Gray code or binary natural code.
The encoder is parametric, the main parameters are:

  • number of bits;
  • lenght of cells;
  • first cell radius;
  • axis size.

I also provided the reader consistent with the disc and with some common phototransistor pakage T1 e T1 3/4 (eg SFH309 or SFH313).

Update Bug Fix 04/02/2017
Change Reader, added NEMA17 support, improve phototransistor mount.
New example file.
Update: Reader.scad Example.scad .

Si tratta di un encoder angolare assoluto utilizzante il codice di Gray o il codice binario naturale.
L'encoder è parametrico, i parametri principali definibili sono:

  • numero di bit;
  • lunghezza celle;
  • raggio della prima cella;
  • dimensione asse.

Ho anche previsto il lettore compatibile con il disco e con alcuni fototransistor comuni nei pakage T1 e T1 3/4 (eg SFH309 or SFH313)

Update Bug Fix 04/02/2017
Cambiato il Reader, agginto il supporto per motori NEMA17, migliorato il supporto per i fototransistor.
Nuovo Esempo.
Update: Reader.scad Example.scad .

Print Settings


to print the disc more simply, I thought of dividing the axis of the disk into two parts: one joined to the disc and the other separate which will be bound to the disc from the motor pinion.
But you can still define the disc with the axis passing through the "axis_c" variable (v.note)

per stampare il disco più semplicemente, ho pensato di dividere l'asse del disco in due parti: una unita al disco, l'altra separata. Quest ultima sarà vincolata al disco dal pignone del motore.
E' comunque possibile definire il disco con l'asse passante tramite la variabile "axis_c" (v.note)

How I Designed This

Gray Encoder Animate

Encoder disk

It is possible to choose between the encoding disc with Gray code or Natural binary code.
Also, the following parameters are configurable on the encoder disc:

  • nbit= number of bit;
  • lenght= hole length;
  • r1 = radius of first cell;
  • h = height of disk;
  • axis_din = internal diameter;
  • axis_dout = external diameter;
  • axis_k = key thick;
  • axis_h = height of axis;
  • axis_c = center of axis on Z;
  • f = optional rapport between full and empty of the hole [0.1 1.9];
  • filled = optional, disk filled when 0 or filled when 1.

due to limitations of SCAD language, I created the words of Gray code in GrayArray.scad files with a simple program written in C (gray.c).
The GrayArray.scad file allows for coding words of Gray up to 16 Bit. I chose this limit to excess, in fact: already with a 16-bit word the angle of the least significant BIT is LSB = 360/2 ^ 16, this means that for a window of 0.1mm on the least significant bit, the disc must be having a radius of (2 ^ 16 / 2PI) * 0.1mm = 1043mm ! Moreover, the file with the 16-bit words is still manageable.
For simplicity, the Natural Encode Disk is instead drawn by exploiting the symmetries of the natural binary code.


The following parameters are configurable on the reader:

  • nbit=number of bit;
  • lenght=length of cell;
  • r1=ray of first circle;
  • h=heigt of photo window (parallax);
  • type=type of BJT (e.g. [PT204-6B1, QSD8T120B] [1,2]);
  • axis_din,axis_dout,axis_h: axis dimension.

The Reader is easily customizable for other phototransistor / photodiodes I explicitly provided a function that defines the size of the cell in which it will be put. Adding to that function the size of the BJT to be used.


For mounting on a pinion:

  1. insert the driveshaft;
  2. insert the reader module (emission);
  3. insert the encoder disk;
  4. insert the reader module (reading);
  5. merge the two player modules through the coupling module with two M3 nuts in the intended cavity and then secure them with their M3 screws;
  6. constrain therefore the module and attached to the structure where the engine.

Natural Binary Encoder Animated

Encoder disk (IT)

È possibile scegliere tra disco di codifica con codice di Gray o codice naturale binario
Inoltre, i seguenti parametri sono configurabili per il disco di codifica:

  • nbit = numero di bit;
  • lenght = lunghezza foro;
  • r1 = raggio della prima cella;
  • h = altezza del disco;
  • axis_din = diametro interno;
  • axis_dout = diametro esterno;
  • axis_k = spessore della chiave;
  • axis_h = altezza dell'asse;
  • axis_c = centro di asse su Z;
  • f = 1 opzionale, rapporto tra pieno e vuoto del foro [0.1 1.9]
  • filled = 0 opzionale, disco riempito quando 0 o quando 1.

a causa delle limitazioni di linguaggio di SCAD, ho generato le parole del codice di Gray nel file GrayArray.scad con un semplice programma scritto in C (gray.c).
Il file GrayArray.scad permette di codificare parole di Gray fino a 16 Bit. Ho scelto questo limite per eccesso, infatti: già con una parola di 16 bit l'angolo del BIT meno significativo è LSB = 360/2^16, ciò significa che per una finestra di 0.1mm sul bit meno significativo, il disco deve essere avere raggio (2^16/2PI) *0.1mm=1043mm ! Inoltre il file con parole di 16 bit è ancora gestibile.
Per semplicità, il Natural Encoder Disk è invece disegnato sfruttando le simmetrie del codice binario naturale.

Reader (IT)

I seguenti parametri sono configurabili sul lettore:

  • nbit = numero di bit;
  • lenght = lunghezza della cella;
  • r1 = raggio del primo cerchio;
  • h = altezza della finestra di lettura (ai fini della parallasse);
  • type = tipo di BJT (e.g. [PT204-6B1, QSD8T120B] [1,2]);
  • axis_din, axis_dout, axis_h: dimensione asse.

Il Reader è facilmente customizzabile per altri foto-transistor/fotodiodi. Ho previsto esplicitamente una funzione che definisce la dimensione della cella in cui andrà inserito il BJT. Aggiungendo a tale funzione le dimensioni del componente che si intende utilizzare.

Montaggio (IT)

Per il montaggio su un pignone:

  1. inserire il semiasse;
  2. inserire il modulo reader (emissione);
  3. inserire il disco encoder;
  4. inserire il modulo reader (lettura);
  5. unire i due moduli lettore attraverso il modulo di accoppiamento con due dadi M3 nelle cavità previste e poi fissarli con le relative viti M3;
  6. vincolare quindi il modulo alla struttura dove e fissato il motore.

More from Robotics

view more

All Apps

Auto-magically prepare your 3D models for 3D printing. A cloud based 3D models Preparing and Healing solution for 3D Printing, MakePrintable provides features for model repairing, wall thickness...

App Info Launch App

Kiri:Moto is an integrated cloud-based slicer and tool-path generator for 3D Printing, CAM / CNC and Laser cutting. *** 3D printing mode provides model slicing and GCode output using built-in...

App Info Launch App
KiriMoto Thing App

With 3D Slash, you can edit 3d models like a stonecutter. A unique interface: as fun as a building game! The perfect tool for non-designers and children to create in 3D.

App Info Launch App

Quickly Scale, Mirror or Cut your 3D Models

App Info Launch App

one of the coolest designs I've seen on Thingiverse- thanks!

really i had fun designing it. :-)