some readers asked about the code.

Christopher, i am not sending it Gcode. I send it a single character followed by a carriage return.

The character is a digit 0 through 7. 0 means move up one step, 1 means up and to the right one step, 2 means move right one step, etc. everything is then calculated in a quickbasic program and sent through the serial port. now i have replaced the basic stamp board with the Arduino so now all the code is internal to it and it can run without the PC connected. i am having some problems with that setup though. when it gets toward the top of the board the steppers slip some steps and it gets lost as to where it really is. I think possibly because I am taking Vin and ground from the connector on the Arduino and the motors draw about 750 ma I am getting too much drop across that connection. I may change the driver from a unipolar design that grounds one end of the coil or the other while supplying power to the center to an H bridge driver that supplies power to one end and ground to the other and switches both to change the steps. That should supply the same amount of magnetic force while using half the current.

Here is the code to draw several pictures one after the other in quickbasic.

'WHITE BOARD PLOTTER TESTS

CLS

PI = 3.141593

GOSUB WBPSETUP

'SCREEN 12 '640 * 480 graphics

'OPEN "COM1:2400,N,8,1" FOR RANDOM AS #1

OPEN "COM1:2400,N,8,1,CD0,CS0,DS0,OP0,RS,TB2048,RB2048" FOR RANDOM AS #1

'OPEN "COM1:2400,N,8,1,RS,TB2048" FOR RANDOM AS #1

'GOTO FOURBALLO

'GOTO CESARO4

START:

HEADING = 0

CENTERX = 0

CENTERY = 0

LENGTH = 0

X = CENTERX

Y = CENTERY

FIRSTLOOP:

LENGTH = LENGTH + .3

HEADING = HEADING + 2.08

X = COS(HEADING) * LENGTH + X

Y = SIN(HEADING) * LENGTH + Y

GOSUB WBPMOVE

IF LENGTH < 18 GOTO FIRSTLOOP

FOURBALLO:

HEADING = 0

CENTERX = 0

CENTERY = 0

SIZE = 5

PHASES = 72

X = SIZE: Y = 0: GOSUB WBPMOVE

INPUT "ERASE THE BOARD AND PRESS ENTER "; N$

FOR HEADING = 0 TO (PHASES * 2 * PI) STEP (.02)

MOVCIRC = HEADING / PHASES

R = SIZE

R1 = COS(HEADING * 2)

R2 = SIN(HEADING + MOVCIRC)

R = R + R1 * R2 * SIZE

X = COS(HEADING) * R + CENTERX

Y = CENTERY + SIN(HEADING) * R

GOSUB WBPMOVE

NEXT

X = SIZE: Y = 0: GOSUB WBPMOVE

INPUT " PRESS ENTER "; N$

CESARO4:

CSIDE = 7.5

CSTAGE = 0

SIDE = CSIDE * .453 ^ CSTAGE

X = 0

Y = -(CSIDE / 3)

GOSUB WBPMOVE

INPUT "PRESS ENTER"; N$

FOR CSTAGE = 0 TO 7

SIDE = CSIDE * .453 ^ CSTAGE

FOR CUBE = 1 TO 4

STAGE = CSTAGE

GOSUB SPIKE

HEADING = HEADING + PI / 2

NEXT CUBE

HEADING = HEADING - PI / 2

NEXT CSTAGE

GOTO CESARODONE

SPIKE:

IF STAGE = 0 THEN GOSUB FORWARD: GOTO DONE

STAGE = STAGE - 1

GOSUB SPIKE

HEADING = HEADING + (84 / 180 * PI)

GOSUB SPIKE

HEADING = HEADING - (168 / 180 * PI)

GOSUB SPIKE

HEADING = HEADING + (84 / 180 * PI)

GOSUB SPIKE

STAGE = STAGE + 1

DONE:

RETURN

FORWARD:

X = X + SIDE * SIN(HEADING)

Y = Y + SIDE * COS(HEADING)

GOSUB WBPMOVE

RETURN

CESARODONE:

X = 0: Y = 0: GOSUB WBPMOVE

CLOSE

END

WBPMOVE:

WBPX = X

WBPY = Y

WBPOLDX = WBPXNOW

WBPOLDY = WBPYNOW

WBPXDELTA = WBPX - WBPXNOW

WBPYDELTA = WBPY - WBPYNOW

IF ABS(WBPXDELTA) < (WBPSTEPSIZE) AND ABS(WBPYDELTA) < (WBPSTEPSIZE) THEN GOTO WBPMOVEDONE

WBPXDIR = SGN(WBPXDELTA)

WBPYDIR = SGN(WBPYDELTA)

IF ABS(WBPYDELTA) > ABS(WBPXDELTA) THEN GOTO WBPYBIGGER

WBPXBIGGER:

FOR WBPX = WBPXNOW TO X STEP (WBPXDIR * .01)

WBPY = Y - ((X - WBPX) / WBPXDELTA) * WBPYDELTA

GOSUB WBPTRYSTEPPING

NEXT WBPX

GOTO WBPXFINISH

WBPXFINISH:

GOSUB WBPTRYSTEPPING

IF ABS(X - WBPXNOW) > WBPSTEPSIZE OR ABS(Y - WBPYNOW) > WBPSTEPSIZE THEN GOTO WBPXFINISH

GOTO WBPMOVEDONE

WBPYBIGGER:

FOR WBPY = WBPYNOW TO Y STEP (WBPYDIR * .01)

WBPX = X - ((Y - WBPY) / WBPYDELTA) * WBPXDELTA

GOSUB WBPTRYSTEPPING

NEXT WBPY

WBPYFINISH:

GOSUB WBPTRYSTEPPING

IF ABS(X - WBPXNOW) > WBPSTEPSIZE OR ABS(Y - WBPYNOW) > WBPSTEPSIZE THEN GOTO WBPYFINISH

GOTO WBPMOVEDONE

WBPTRYSTEPPING:

'try stepping in each direction and see which way gets closer to x,y

'TRY STEPPING 0

WBPLEFTTRY = WBPLEFT - WBPSTEPSIZE

WBPRIGHTTRY = WBPRIGHT - WBPSTEPSIZE

GOSUB WBPTRYDIST

WBPTRY(0) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

'TRY STEPPING 1

WBPLEFTTRY = WBPLEFT

WBPRIGHTTRY = WBPRIGHT - WBPSTEPSIZE

GOSUB WBPTRYDIST

WBPTRY(1) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

'TRY STEPPING 2

WBPLEFTTRY = WBPLEFT + WBPSTEPSIZE

WBPRIGHTTRY = WBPRIGHT - WBPSTEPSIZE

GOSUB WBPTRYDIST

WBPTRY(2) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

'TRY STEPPING 3

WBPLEFTTRY = WBPLEFT + WBPSTEPSIZE

WBPRIGHTTRY = WBPRIGHT

GOSUB WBPTRYDIST

WBPTRY(3) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

'TRY STEPPING 4

WBPLEFTTRY = WBPLEFT + WBPSTEPSIZE

WBPRIGHTTRY = WBPRIGHT + WBPSTEPSIZE

GOSUB WBPTRYDIST

WBPTRY(4) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

'TRY STEPPING 5

WBPLEFTTRY = WBPLEFT

WBPRIGHTTRY = WBPRIGHT + WBPSTEPSIZE

GOSUB WBPTRYDIST

WBPTRY(5) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

'TRY STEPPING 6

WBPLEFTTRY = WBPLEFT - WBPSTEPSIZE

WBPRIGHTTRY = WBPRIGHT + WBPSTEPSIZE

GOSUB WBPTRYDIST

WBPTRY(6) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

'TRY STEPPING 7

WBPLEFTTRY = WBPLEFT - WBPSTEPSIZE

WBPRIGHTTRY = WBPRIGHT

GOSUB WBPTRYDIST

WBPTRY(7) = SQR((WBPXDIFF * WBPXDIFF) + (WBPYDIFF * WBPYDIFF))

WBPTEMP = 0

IF WBPTRY(1) < WBPTRY(WBPTEMP) THEN WBPTEMP = 1

IF WBPTRY(2) < WBPTRY(WBPTEMP) THEN WBPTEMP = 2

IF WBPTRY(3) < WBPTRY(WBPTEMP) THEN WBPTEMP = 3

IF WBPTRY(4) < WBPTRY(WBPTEMP) THEN WBPTEMP = 4

IF WBPTRY(5) < WBPTRY(WBPTEMP) THEN WBPTEMP = 5

IF WBPTRY(6) < WBPTRY(WBPTEMP) THEN WBPTEMP = 6

IF WBPTRY(7) < WBPTRY(WBPTEMP) THEN WBPTEMP = 7

ON (WBPTEMP + 1) GOSUB WBP0, WBP1, WBP2, WBP3, WBP4, WBP5, WBP6, WBP7

FOR WBPZ = 1 TO 6000: NEXT

'CALCULATE WHERE THE PEN IS NOW

WBPS = (WBPLEFT + WBPRIGHT + WBPBASE) / 2

WBPAREA = SQR(WBPS * (WBPS - WBPLEFT) * (WBPS - WBPRIGHT) * (WBPS - WBPBASE))

'VERTICAL DISTANCE FROM SPOOLS DOWN TO THE PEN IS

WBPHEIGHT = (WBPAREA * 2) / WBPBASE

WBPWIDTH = SQR((WBPLEFT * WBPLEFT) - (WBPHEIGHT * WBPHEIGHT))

WBPXNOW = WBPWIDTH - WBPCENTERWIDTH

WBPYNOW = WBPCENTERHEIGHT - WBPHEIGHT

RETURN

GOTO WBPMOVE

WBPTRYDIST:

WBPTRYS = (WBPLEFTTRY + WBPRIGHTTRY + WBPBASE) / 2

WBPTRYAREA = SQR(WBPTRYS * (WBPTRYS - WBPLEFTTRY) * (WBPTRYS - WBPRIGHTTRY) * (WBPTRYS - WBPBASE))

'VERTICAL DISTANCE FROM SPOOLS DOWN TO THE PEN IS

WBPTRYHEIGHT = (WBPTRYAREA * 2) / WBPBASE

WBPTRYWIDTH = SQR((WBPLEFTTRY * WBPLEFTTRY) - (WBPTRYHEIGHT * WBPTRYHEIGHT))

WBPXTRY = WBPTRYWIDTH - WBPCENTERWIDTH

WBPYTRY = WBPCENTERHEIGHT - WBPTRYHEIGHT

WBPXDIFF = WBPX - WBPXTRY

WBPYDIFF = WBPY - WBPYTRY

RETURN

WBPMOVEDONE:

'THE SEMIPERIMETER IS THE DISTANCE BETWEEN THE SPOOLS PLUS

'THE LENGTH OF EACH STRING DIVIDED BY TWO

'THE AREA OF THE TRIANGLE IS THE SQUARE ROOT OF

'THE SEMIPERIMETER TIMES THE DIFFERENCE BETWEEN THE

'SEMIPERIMETER AND EACH SIDE

'WBPLEFT = LENGTH OF LEFT STRING

'WBPRIGHT = LENGTH OF RIGHT STRING

'WBPBASE = DISTANCE BETWEEN SPOOLS

WBPS = (WBPLEFT + WBPRIGHT + WBPBASE) / 2

WBPAREA = SQR(WBPS * (WBPS - WBPLEFT) * (WBPS - WBPRIGHT) * (WBPS - WBPBASE))

'VERTICAL DISTANCE FROM SPOOLS DOWN TO THE PEN IS

WBPHEIGHT = (WBPAREA * 2) / WBPBASE

WBPWIDTH = SQR((WBPLEFT * WBPLEFT) - (WBPHEIGHT * WBPHEIGHT))

WBPXNOW = WBPWIDTH - WBPCENTERWIDTH

WBPYNOW = WBPCENTERHEIGHT - WBPHEIGHT

'FOR WBPZ = 1 TO 10000: NEXT

RETURN

WBP0:

PRINT #1, 0

WBPLEFT = WBPLEFT - (WBPSTEPSIZE)

WBPRIGHT = WBPRIGHT - (WBPSTEPSIZE)

RETURN

WBP1:

PRINT #1, 1

WBPRIGHT = WBPRIGHT - (WBPSTEPSIZE)

RETURN

WBP2:

PRINT #1, 2

WBPLEFT = WBPLEFT + (WBPSTEPSIZE)

WBPRIGHT = WBPRIGHT - (WBPSTEPSIZE)

RETURN

WBP3:

PRINT #1, 3

WBPLEFT = WBPLEFT + (WBPSTEPSIZE)

RETURN

WBP4:

PRINT #1, 4

WBPLEFT = WBPLEFT + (WBPSTEPSIZE)

WBPRIGHT = WBPRIGHT + (WBPSTEPSIZE)

RETURN

WBP5:

PRINT #1, 5

WBPRIGHT = WBPRIGHT + (WBPSTEPSIZE)

RETURN

WBP6:

PRINT #1, 6

WBPLEFT = WBPLEFT - (WBPSTEPSIZE)

WBPRIGHT = WBPRIGHT + (WBPSTEPSIZE)

RETURN

WBP7:

PRINT #1, 7

WBPLEFT = WBPLEFT - (WBPSTEPSIZE)

RETURN

WBPSETUP:

'48 STEPS IS ONE TURN OF THE MOTOR

'20 TURNS IS ABOUT TWO FEET

'468 STEPS IS ABOUT 12 INCHES, 39 STEPS PER INCH

'THE WHITE PART OF THE BOARD IS 34.5 INCHES WIDE * 22.5 INCHES TALL

'THE CENTER OF THE SPOOLS ARE 33.875 INCHES APART

'THE CENTER OF THE SPOOLS ARE ABOUT .75 INCHES ABOVE THE BOARD

'IF BOTH STRINGS ARE 24 INCHES LONG

'THE PEN IS ABOUT 16.5 INCHES BELOW THE TOP OF THE BOARD

'THE SEMIPERIMETER IS THE DISTANCE BETWEEN THE SPOOLS PLUS

'THE LENGTH OF EACH STRING DIVIDED BY TWO

'THE AREA OF THE TRIANGLE IS THE SQUARE ROOT OF

'THE SEMIPERIMETER TIMES THE DIFFERENCE BETWEEN THE

'SEMIPERIMETER AND EACH SIDE

'WBPLEFT = LENGTH OF LEFT STRING

'WBPRIGHT = LENGTH OF RIGHT STRING

'WBPBASE = DISTANCE BETWEEN SPOOLS

'WBPS=(WBPLEFT + WBPRIGHT + WBPBASE)/2

'WBPAREA = SQR(WBPS*(WBPS-WBPLEFT)*(WBPS-WBPRIGHT)*(WBPS-WBPBASE))

'VERTICAL DISTANCE FROM SPOOLS DOWN TO THE PEN IS

'WBPHEIGHT = (WBPAREA*2)/WBPBASE

'WBPBASE = 33.875

'50.5 INCHES BETWEEN THE CUPHOOKS

'32 INCHES FROM THE LEFT HOOK TO THE CENTER OF THE BOARD

WBPSTEPSIZE = 11.125 / 500

PRINT "POSITION THE PEN AT THE CENTER OF THE BOARD."

INPUT "PRESS ENTER"; N$

INPUT "ENTER THE LENGTH OF THE LEFT STRING "; WBPLEFT

'WBPLEFT = 28.5

INPUT "ENTER THE LENGTH OF THE RIGHT STRING "; WBPRIGHT

'WBPRIGHT = 27.75

'INPUT "ENTER THE DISTANCE BETWEEN SPOOL CENTERS "; WBPBASE

'WBPBASE = 33.875

WBPBASE = 50.5

'INPUT "ENTER THE HEIGHT OF THE WHITE AREA "; WBPTALL

WBPTALL = 22.5

'INPUT "ENTER THE WIDTH OF THE WHITE AREA "; WBPWIDE

WBPWIDE = 34.5

WBPS = (WBPLEFT + WBPRIGHT + WBPBASE) / 2

WBPAREA = SQR(WBPS * (WBPS - WBPLEFT) * (WBPS - WBPRIGHT) * (WBPS - WBPBASE))

WBPHEIGHT = (WBPAREA * 2) / WBPBASE

WBPCENTERHEIGHT = WBPHEIGHT

PRINT "WBPCENTERHEIGHT="; WBPCENTERHEIGHT

WBPCENTERWIDTH = SQR((WBPLEFT * WBPLEFT) - (WBPCENTERHEIGHT * WBPCENTERHEIGHT))

PRINT "WBPCENTERWIDTH="; WBPCENTERWIDTH

RETURN

## No comments:

## Post a Comment