' COSTUME MASK ANIMATRONICS SEQUENCER ' ----------------------------------- ' COPYRIGHT (C) 1996 BY KEVIN KELM ' ALL RIGHTS RESERVED ' PERMISSION TO USE GRANTED FOR HOBBY, NON-PROFIT USE ONLY. ' CONTACT kkelm@triggur.org FOR ALL OTHER USAGE PERMISSIONS. ' ' VERSION: 1.0 ' 1.0: initial creation, testing. 12/28/96 nummotors CON 2 ' # motors in costume maxmotor CON nummotors-1 numpositions CON 6 ' # positions in sequence maxpos CON numpositions-1 positionsize CON nummotors numsequences CON 4 ' # sequences in memory maxseq CON numsequences-1 sequencesize CON nummotors * numpositions + 1 buflen CON numsequences * sequencesize buf DATA WORD (buflen) i VAR WORD ' general looping j VAR WORD ' general looping btmp0 VAR BYTE ' for debounce btmp1 VAR BYTE ' for debounce btmp2 VAR BYTE ' for debounce btmp3 VAR BYTE ' for debounce btmp4 VAR BYTE ' for debounce rtmp VAR WORD ' for randomizing progit VAR IN11 ' program or run mode? thumb CON 7 ' thumb button fore VAR IN6 ' forefinger button middle VAR IN5 ' middle finger button nseq CON 11 ' next sequence/program selector npos CON 12 ' next position nmot CON 13 ' next motor mdec CON 14 ' motor decrement minc CON 15 ' motor increment baud CON 84+$4000 ' baud rate to motion controller delta CON 1 ' ticks to move the motor (pgrm mode) cseq VAR WORD ' current sequence # seqptr VAR WORD ' pointer to cseq cpos VAR WORD ' current position # maxposseq VAR WORD ' max pos # in cseq ' WARNING: maxposseq currently not used cmot VAR WORD ' current motor # countdown VAR WORD ' ticks til next move countdownreset CON 30 ' 30 * 100ms = 3s delay maxrandval CON 15 ' because 'RANDOM' seems broken randvals DATA 1,2,5,4,1,0,3,5,1,2,0,4,1,2,5,3 crand VAR BYTE ' current 'random' offset dirs = 0 ' set I/O pin directions dir0 = 1 btmp0 = 0 btmp1 = 0 btmp2 = 0 btmp3 = 0 btmp4 = 0 cseq = 0 crand = 0 GOSUB new_sequence IF progit = 1 THEN do_program ' goto program mode if sequence on do_run: ' move motors in sequence BUTTON thumb,1,255,100,btmp0,1,do_rseq PAUSE 100 countdown = countdown - 1 IF countdown > 0 THEN do_run1 READ randvals+crand,cpos crand = crand + 1 IF crand <= maxrandval THEN do_run2 crand = 0 do_run2: cpos = cpos // numpositions GOSUB set_motors countdown = countdownreset do_run1: GOTO do_run do_rseq: ' new sequence selected cseq = fore * 2 + middle ' value 0..3 GOSUB new_sequence GOTO do_run do_program: IF progit = 1 THEN do_program ' wait for button up prog_loop: BUTTON nseq,1,255,100,btmp0,1,do_pseq BUTTON npos,1,255,100,btmp1,1,do_ppos BUTTON nmot,1,255,100,btmp2,1,do_pmot BUTTON mdec,1,250,1,btmp3,1,do_pdec BUTTON minc,1,250,1,btmp4,1,do_pinc GOTO prog_loop do_pseq: ' select a new sequence cseq = cseq + 1 IF cseq <= maxseq THEN do_pseq1 cseq = 0 do_pseq1: GOSUB new_sequence GOTO prog_loop do_ppos: ' select a new position cpos = cpos + 1 IF cpos <= maxposseq THEN do_ppos1 cpos = 0 do_ppos1: GOSUB set_motors GOTO prog_loop do_pmot: ' select a new motor cmot = cmot + 1 IF cmot <= maxmotor THEN do_pmot1 cmot = 0 do_pmot1: GOSUB set_motors GOTO prog_loop do_pdec: ' decrement motor pos READ cpos * positionsize + seqptr + cmot,j IF j > delta THEN do_pdec1 j = 0 GOTO do_pdec2 do_pdec1: j = j - delta do_pdec2: WRITE cpos * positionsize + seqptr + cmot, j GOSUB set_motors GOTO prog_loop do_pinc: ' increment motor pos READ cpos * positionsize + seqptr + cmot,j IF 254 - delta > j THEN do_pinc1 j = 254 GOTO do_pinc2 do_pinc1: j = j + delta do_pinc2: WRITE cpos * positionsize + seqptr + cmot, j GOSUB set_motors GOTO prog_loop set_motors: ' move all motors FOR i = 0 TO maxmotor READ cpos * positionsize + seqptr + i, j SEROUT 0,baud,1,[255,i,j] NEXT RETURN new_sequence: seqptr = cseq * sequencesize ' READ seqptr,maxposseq maxposseq = maxpos seqptr = seqptr + 1 countdown = countdownreset cpos = 0 GOSUB set_motors RETURN
Click here to go back to the main construction page.