18 februari 2006

de eerste CNC frees momenten!

Edgar heeft inmiddels een doos stappenmotoren voor 2.50/stuk op de kop getikt en en drie stuks op de freesbank gemonteerd. Helaas bleek het te gaan om unipolaire motoren (4 spoelen die allemaal een gemeenschappelijke draad naar buiten hebben, totaal dus 5 draden) terwijl de SMC800 kaart alleen geschikt is voor bipolaire motoren (2 spoelen met ieder 2 draden, totaal dus 4 draden). Op advies van Michael hebben we de motoren opgemaakt, de gemeenschappelijke draad losgeknipt en de spoelen twee aan twee in serie geschakeld. Het ging niet altijd goed, maar ach, we hadden toch genoeg motoren en voor die prijs kan er gerust iets mis gaan. Uiteindelijk hadden we zes goede motoren, tijd om ze op de freesbank te schroeven en aan te sluiten. Onderstaande foto (reconstructie) geeft een overzicht van de opstelling. Linksboven een (oversized) voeding voor de BASIC stamp experimenteerprint, rechts daarvan de BASIC stamp print zelf, rechts daarvan de Conrad SMC800 aansturingskaart voor de stappenmotoren, en rechtsboven de voeding voor de stappenmotoren. Rechtsonder de CNC bank.



We gaan testen met de trial versie van KCAM3 v3.0.34 op een oude Windows 98 computer. Eerst de instellingen van KCAM3 goed zien te krijgen Setup --> Options: Alles op default (nog aanvullen met screendumps) Het aantal stappen per omwenteling van de gekochte stappenmotoren is onbekend. Normaal gesproken 200 stappen per omwenteling. De draadspindels in de freesbank zijn M8, met een standaard spoed van 1.25 mm, hetgeen neerkomt op 160 steps/mm. Deze waarde ingevuld in de tablesetup.

Vervolgens maar eens een vierkantje frezen. Hmm, dat ziet er bemoedigend uit! Dan maar de stoute schoenen aangetrokken en een cirkeltje van 10 mm. Oops, dat valt nu weer even tegen, we krijgen een ruit.



Na enig geklooi bleek het een kwestie van timing te zijn. De BASIC Stamp pollt de parallel poort van de PC, maar als de pulsjes sneller komen dan de tijd voor de main loop in de BASIC Stamp dan missen we natuurlijk de nodige pulsen. Door de cutting speed van KCAM lager in te stellen vangt de BASIC Stamp ze allemaal op. Als we de cutting speed in kCAM instellen op 8 [mm/min] of lager dan krijgen we een cirkel, echter een stuk groter dan verwacht. Kennerlijk toch geen 200 stappen/omwenteling motor. Opmeten van de cirkel en schalen van het aantal stappen per [mm] komt uit op 166 stappen per [mm]. Hebben we dan van die zeldzame motoren met 208 stappen/mm? Of raken we toch nog hier en daar een stapje kwijt? Verder verlagen van de snelheid helpt niet meer. Het kan natuurlijk zijn dat de pulsduur nog iets korter is dan de loop in de BASIC Stamp software, en we daardoor 4% van de pulsjes missen. Enfin, in de praktijk is de maatnauwkeurigheid voorlopig naar tevredenheid, we krijgen nu steeds een cirkeltje van 10 [mm].

Hieronder zien we de gefreesde cirkels voor de calibratie



Om het weekend af te sluiten nog even ons logo frezen:



Volgende week gaan we een stukje inlegwerk proberen....

Er rest nog een minpuntje..... het duuuuuuuuuuuuuurt zo lang met die lage snelheid. De prioriteit komt nu bij de BASIC Stamp software. Allereerst kunnen we een grote stap maken door over te gaan naar de 4 staps tabel. Dat scheelt meteen een factor 2 in de snelheid. Verder is de hardware aangepast door alles via het eerste schuifregister naar buiten te sturen en de strobe rechtstreeks vanaf een BASIC Stamp poort te sturen. Verder nog wat onnodige zaken uit de software verwijderd. Dit alles leidt tot een maximale snelheid van 30 [mm/min] en 83 [stapjes/mm]. In de 2e hardware versie van de BASIC Stamp interface waar de CONRAD kaart rechtstreeks aangestuurd wordt door de poorten van de BASIC Stamp is 40 [mm/min] zelfs haalbaar zonder stapjes te verliezen.

Voor degenen die geinteresseerd zijn in de software die in de BASIC Stamp geschoten is:

' {$STAMP BS2}
' {$PBASIC 2.5}

'---------------------------------------
' Revision history
' CNC003 - adapted hardware to speed up stepper
' moved connections TO CONRAD card TO first shift register
' moved STROBE to MIDIpin
' LTPtest004 - connected pin 1 and 2 of LTP port
' Test if LTP port is read by BASIC stamp
' LTPtest005 - test to run the stepper with LTP via X-step/dir
' CNC006 - Connected Y-step/dir and Z-step/dir
' CNC007 - read LTP bits close together
' CNC008 - only 4 steps
'---------------------------------------

' Pin layout of hardware

DataP CON 0 ' Data pin to 74HC595 for columns.
Clock CON 1 ' Shift clock to '595 for columns.
Latch CON 2 ' Moves data from shift register to output latch for columns.

DataP2 CON 3 ' Data pin to 74HC595 for rows.
Clock2 CON 4 ' Shift clock to '595 for rows.
Latch2 CON 5 ' Moves data from shift register to output latch for rows.

LTPdirZ CON 8 ' Direction of Z stepper, from PC's LTP port pin 8
LPTstepZ CON 9 ' Step pulse for Z stepper, from PC's LTP port pin 7
LTPdirY CON 10 ' Direction of Y stepper, from PC's LTP port pin 5
LPTstepY CON 11 ' Step pulse for Y stepper, from PC's LTP port pin 4
LTPdirX CON 12 ' Direction of X stepper, from PC's LTP port pin 2
LPTstepX CON 13 ' Step pulse for X stepper, from PC's LTP port pin 1
MIDIpin CON 14 ' Pin for MIDI interface, used here for STROBE
SerLCD CON 15 ' Pin for serial communication to LCD
RS232pin CON 16 ' Pin of standard RS232 communication hardware

' voor elke Strobe puls wordt een motor bijgewerkt
' voor elke motor update zijn 8 bits nodig naar het schuifregister,
' gevolgd door een STROBE puls om de gegevens in te klokken.
' we gebruiken de variable MOTOR daarvoor met
' bit0 CURRENTA1
' bit1 CURRENTA2
' bit2 CURDIRA
' bit3 CURRENTB1
' bit4 CURRENTB2
' bit5 CURDIRB
' bit6 MOTSEL1
' bit7 MOTSEL2

'---------------------------------------
' Stepper pattern table
'---------------------------------------

' table with patterns

' ^
' | IA
' |
' | --
' | -- --
' | ......--......--
' | -- --
' | --
'
' ^
' | IB
' |
' | --
' | -- --
' | ..--......--....
' | -- --
' | --
'
'

' STEP IA IB CURRENTA1 CURRENTA2 CURDIRA CURRENTB1 CURRENTB2 CURDIRB
' 1 +60 -60 1 0 0 1 0 1
' 2 +100 0 0 0 0 1 1 0
' 3 +60 +60 1 0 0 1 0 0
' 4 0 +100 1 1 0 0 0 0
' 5 -60 +60 1 0 1 1 0 0
' 6 -100 0 0 0 1 1 1 1
' 7 -60 -60 1 0 1 1 0 1
' 8 0 -100 1 1 1 0 0 1

MOTOR VAR Byte(8)

'MOTOR(0)=%00101001
'MOTOR(1)=%00011000
'MOTOR(2)=%00001001
'MOTOR(3)=%00000011
'MOTOR(4)=%00001101
'MOTOR(5)=%00111100
'MOTOR(6)=%00101101
'MOTOR(7)=%00100111

' STEP IA IB CURRENTA1 CURRENTA2 CURDIRA CURRENTB1 CURRENTB2 CURDIRB
' 1 +100 0 0 0 0 1 1 0
' 2 0 +100 1 1 0 0 0 0
' 3 -100 0 0 0 1 1 1 1
' 4 0 -100 1 1 1 0 0 1
' 5 +100 0 0 0 0 1 1 0
' 6 0 +100 1 1 0 0 0 0
' 7 -100 0 0 0 1 1 1 1
' 8 0 -100 1 1 1 0 0 1

MOTOR(0)=%00011000
MOTOR(1)=%00000011
MOTOR(2)=%00111100
MOTOR(3)=%00100111
MOTOR(4)=%00011000
MOTOR(5)=%00000011
MOTOR(6)=%00111100
MOTOR(7)=%00100111

' Other Constants

N2400 CON $418D ' for LCD. Define inverted, 2400-bps serial

' Variables

Xpos VAR Nib
Ypos VAR Nib
Zpos VAR Nib
Xstep VAR Bit
XstepOld VAR Bit
Xdir VAR Bit
Ystep VAR Bit
YstepOld VAR Bit
Ydir VAR Bit
Zstep VAR Bit
ZstepOld VAR Bit
Zdir VAR Bit

TheBegin:

'---------------------------------------
' Initialize hardware
'---------------------------------------


SHIFTOUT DataP,Clock,MSBFIRST,[0] ' Send the highbyte bits.
SHIFTOUT DataP,Clock,MSBFIRST,[0] ' Send the lowbyte bits.
PULSOUT Latch,1 ' Transfer to outputs.
SHIFTOUT DataP2,Clock2,MSBFIRST,[17] ' Send the rowbyte.
PULSOUT Latch2,1 ' Transfer to outputs.
HIGH MIDIpin
INPUT LTPdirX
INPUT LPTstepX
INPUT LTPdirY
INPUT LPTstepY
INPUT LTPdirZ
INPUT LPTstepZ

PAUSE 500

'---------------------------------------
' Show the welcome message
'---------------------------------------

TheMenu:

PAUSE 500
SEROUT SerLCD,N2400,[12, "hemey CNCsoft",13,"v CNC008"]
PAUSE 500

'---------------------------------------
' Initialize software
'---------------------------------------

Xpos=0
Ypos=0
Zpos=0
XstepOld = 1
YstepOld = 1
ZstepOld = 1


'---------------------------------------
' Main loop
'---------------------------------------

again:

Xstep = IN13
Xdir = IN12
Ystep = IN11
Ydir = IN10
Zstep = IN9
Zdir = IN8

IF (Xstep = XstepOld) THEN NoXChange
IF (Xdir = 1) THEN
Xpos = Xpos+1
ELSE
Xpos = Xpos-1
ENDIF
GOSUB StepX
XstepOld = Xstep
NoXChange:

IF (Ystep = YstepOld) THEN NoYChange
IF (Ydir = 1) THEN
Ypos = Ypos+1
ELSE
Ypos = Ypos-1
ENDIF
GOSUB StepY
YstepOld = Ystep
NoYChange:

IF (Zstep = ZstepOld) THEN NoZChange
IF (Zdir = 1) THEN
Zpos = Zpos+1
ELSE
Zpos = Zpos-1
ENDIF
GOSUB StepZ
ZstepOld = Zstep
NoZChange:

GOTO again


'---------------------------------------
' Subroutines
'---------------------------------------

StepX:
' SEROUT SerLCD,N2400,[12, "hemey CNC mot X",13, IBIN8 MOTOR(Xpos & %0111)]
' SEROUT SerLCD,N2400,[12, "hemey CNC mot X",13, Xpos]
SHIFTOUT DataP,Clock,LSBFIRST,[MOTOR(Xpos & %0111) | %00000000] ' Send
the highbyte bits.
PULSOUT Latch,1 ' Transfer to outputs.
PULSOUT MIDIpin, 1 ' Send STROBE
RETURN

StepY:
' SEROUT SerLCD,N2400,[12, "hemey CNC mot X",13, IBIN8 MOTOR(Xpos & %0111)]
' SEROUT SerLCD,N2400,[12, "hemey CNC mot X",13, Xpos]
SHIFTOUT DataP,Clock,LSBFIRST,[MOTOR(Ypos & %0111) | %01000000] ' Send
the highbyte bits.
PULSOUT Latch,1 ' Transfer to outputs.
PULSOUT MIDIpin, 1 ' Send STROBE
RETURN

StepZ:
' SEROUT SerLCD,N2400,[12, "hemey CNC mot X",13, IBIN8 MOTOR(Xpos & %0111)]
' SEROUT SerLCD,N2400,[12, "hemey CNC mot X",13, Xpos]
SHIFTOUT DataP,Clock,LSBFIRST,[MOTOR(Zpos & %0111) | %10000000] ' Send
the highbyte bits.
PULSOUT Latch,1 ' Transfer to outputs.
PULSOUT MIDIpin, 1 ' Send STROBE
RETURN