Here’s a linear optical encoder made from printer parts, a PIC 18F4520 MCU, and an L298 motor controller:

The goal of this tutorial is to create a way to know where the ‘stage’ is, accurate to about 1/4” using optical encoding. The stage is controlled via a 12v motor so we will use an L298 motor controller for controlling the motor via a 18F4520 PIC.

The PIC will use hardware PWM generators to output the correct frequency & duty cycle. The PIC will also take the analog input from the IR detector diode to keep track of how far the stage has moved via an internal analog to digital converter (ADC).

Simple Motor Optical Encoder

How To: DIY quadrature encoder
HOW TO – Make an Optical Encoder