This machine consists of 2 servos controlling an aluminum arm with a pen attached.
I origionally developed this hardware using a DS5000 on a simsick.
Code
/*--------------------------------------------------------------------servo.c * Test program for drawing machines. * * This code is targeted at an 89S4051 and compiles with sdcc. * * Author: Donald Delmar Davis, * w/ Suggestions from to Bernard Winter and Dan Micheals * * Date: 28apr02 * * Status: alfa VERY alfa. * * Notes: This seems to work farely well. */ #include #define NSERVOS 3 #define SERVO0 P1.7 #define SERVO1 P1.6 #define SERVO2 P1.5 #define KFREQ 11059 #define STRIM - 693 #define ETRIM + 81 unsigned int DegreesX92delay(unsigned int DegreesX9); unsigned char CurrentServo; unsigned int SpaceDelay; unsigned int Servo0Delay; unsigned int Servo1Delay; unsigned int Servo2Delay; /* grid.h is calculated by joe2.c */ #include "grid.h" /*--------------------------------------------------------------------initservos * Initialize servo values and set up timers. * */ void initservos(unsigned char s0, unsigned char s1, unsigned char s2 ){ CurrentServo=0; SpaceDelay=65535-((20-(NSERVOS*2))*KFREQ)/12; Servo0Delay=DegreesX92delay(s0); Servo1Delay=DegreesX92delay(s1); Servo2Delay=DegreesX92delay(s2); // assembly here is // mostly to avoid having to define SERVO pins in both c and asxxx // eventually may rewrite routine in assembly. _asm clr SERVO0 clr SERVO1 clr SERVO2 _endasm; // should set flags individually to allow for other timer settings TMOD=0x01; //#%00000001 TCON=0x10; //#%00010000 TH0=0xFE; TL0=0; IE=0x82; //#%10000010 } /*--------------------------------------------------------------------servopulse * pulse servos sequentially. * */ void servopulse(void) interrupt 1 _naked { _asm clr TR0 push ACC push PSW push B clr SERVO0 clr SERVO1 clr SERVO2 mov A,_CurrentServo cjne A, #NSERVOS, $0001 mov A, #255 mov TL0,_SpaceDelay mov TH0,_SpaceDelay+1 sjmp $0007 $0001: jnz $0002 mov TL0,_Servo0Delay mov TH0,_Servo0Delay+1 setb SERVO0 sjmp $0007 $0002: cjne A, #1, $0003 mov TL0,_Servo1Delay mov TH0,_Servo1Delay+1 setb SERVO1 sjmp $0007 $0003: mov TL0,_Servo2Delay mov TH0,_Servo2Delay+1 setb SERVO2 $0007: inc A mov _CurrentServo,A pop B pop PSW pop ACC setb TR0 reti _endasm; } time1ms() /* not really a 1 ms delay with XTAL 11.0592MHz */ { int i; for (i = 0; i < 8 ; i++) ; } void delay(unsigned int n) /* do nothing n*1ms */ { int i; for (i=0; i< n ; i++) time1ms(); } unsigned int DegreesX92delay(unsigned int DegreesX9){ //delay(10); return 0-(690+(DegreesX9)); } void shoulder(unsigned int DegreesX9){ Servo0Delay=DegreesX92delay(DegreesX9 STRIM); } void elbow(unsigned int DegreesX9){ Servo1Delay=DegreesX92delay(DegreesX9 ETRIM); } void xit (unsigned char x,unsigned char y,unsigned int dly){ unsigned int s,e; unsigned char ds,de; s=angles[x][y][0]; e=angles[x][y][1]; shoulder(s);elbow(e);delay(dly); ds=(char) s - angles[x+1][y][0]; de=(char) e - angles[x+1][y][1]; ds=ds/3; de=de/3; shoulder(s+ds);elbow(e+de);delay(dly); shoulder(s);elbow(e);delay(dly); shoulder(s+ds);elbow(e+de);delay(dly); shoulder(s);elbow(e);delay(dly); shoulder(s+ds);elbow(e+de);delay(dly); shoulder(s);elbow(e);delay(dly); shoulder(s+ds);elbow(e+de);delay(dly); shoulder(s);elbow(e);delay(dly); shoulder(s+ds);elbow(e+de);delay(dly); } #if 0 #define GOTO(X,Y) shoulder(angles[X][Y][0]); elbow(angles[X][Y][1]); delay(dly); void xit (unsigned char x,unsigned char y,unsigned int dly){ unsigned char s,e,n; for (e=0;e<5;e++){ GOTO(x-1,y); GOTO(x-1,y+1); GOTO(x,y+2); GOTO(x+1,y+2); GOTO(x+2,y+1); GOTO(x+2,y); GOTO(x+1,y-1); GOTO(x,y-1); GOTO(x-1,y); } } #endif /*----------------------------------------------------------------------------main() * */ main(){ unsigned char d,e,x,y,n; initservos(angles[1][1][0],angles[1][1][1],90); d=0;e=0; for (n=0; n<50; n++){ for(x=0;x<15;x++){ if (d==0){ for(y=1;y<12;y++){ xit(x,y,500); } d=1; } else { for(y=11;y>0;y--){ xit(x,y,500); } d=0; } } e=0; } }