DIY Project: Upgrade your Amiga Tank Mouse into a high resolution Laser Mouse. This project was one of my weekend retro projects done two years ago. At that time, I wanted to upgrade my Amiga Mouse and ended up with this hand made PCB. :)After sharing the story in a local retro computing forum, people are interested in building their own. So I have modified the design to be manufactured by a factory and ordered a small batch of PCB's. I am sharing this PCB for those who are interested in building their own. Some basic knowledge on PIC micros and a compiler is also required. HardwareThe core of the project is an ADNS9800 laser mouse sensor. A PIC micro is used to convert x-y movements into Amiga type A-B quadrature pulses. Resolution of the mouse can be adjusted by placing the CONFIG jumper. When this jumper is in place, resolution can be increased/decreased by using the mouse buttons. A 3D printed lens holder is used to fix everything to the mouse case. Lens holder 3D design will be shared to public.BOM:1 ADNS9800 + Lens1 PIC18F2XK223 3.3K 08054 100nf 08053 1uF 08053 Short M3 screw2 Micro Switch2 Pin Header1 P Ch Mosfet1 3D Printed Lens BaseSince I don't want the project to be copied and sold without spending any efforts, I will not release the PIC HEX file. But it will very easy to write a simple firmware for this project. Also for those who are interested in building this project, core code sniplets are shown below. #define HORV1 LATCbits.LATC7=0; TRISCbits.TRISC7=0;#define HORV0 LATCbits.LATC7=1; TRISCbits.TRISC7=1;#define HORQ1 LATCbits.LATC6=0; TRISCbits.TRISC6=0;#define HORQ0 LATCbits.LATC6=1; TRISCbits.TRISC6=1;#define VERV1 LATCbits.LATC4=0; TRISCbits.TRISC4=0;#define VERV0 LATCbits.LATC4=1; TRISCbits.TRISC4=1;#define VERQ1 LATCbits.LATC5=0; TRISCbits.TRISC5=0;#define VERQ0 LATCbits.LATC5=1; TRISCbits.TRISC5=1;#define LBTN1 LATBbits.LATB0=0; TRISBbits.TRISB0=0;#define LBTN0 LATBbits.LATB0=1; TRISBbits.TRISB0=1;#define RBTN1 LATBbits.LATB1=0; TRISBbits.TRISB1=0;#define RBTN0 LATBbits.LATB1=1; TRISBbits.TRISB1=1;void SetPhases(void){ if (HorPhase==0) { HORQ0 HORV0 } else if (HorPhase==1) { HORQ1 HORV0 } else if (HorPhase==2) { HORQ1 HORV1 } else if (HorPhase==3) { HORQ0 HORV1 } if (VerPhase==0) { VERQ0 VERV0 } else if (VerPhase==1) { VERQ1 VERV0 } else if (VerPhase==2) { VERQ1 VERV1 } else if (VerPhase==3) { VERQ0 VERV1 }}This is the main loop: adnsGetDelta(&x,&y); while (((x!=0) || (y!=0))) { if (x>0) { x--; HorPhase--; if (HorPhase>3) HorPhase=3; } if (x<0) { x++; HorPhase++; if (HorPhase>3) HorPhase=0; } if (y>0) { y--; VerPhase--; if (VerPhase>3) VerPhase=3; } if (y<0) { y++; VerPhase++; if (VerPhase>3) VerPhase=0; } SetPhases(); Delay100TCYx(1); // 100uSec }NOTE: You will have to find an ADNS9800 library. ADNS9800 SPI pins are bit-banged, dedicated SPI hardware is not used.Details of the project can be found below. (Unfortunately in Turkish)https://www.commodore.gen.tr/forum/index.php?topic=14749.msg182994#msg182994