# Thymio-II program: Draw festive patterns # Copyright 2014 by D. Doak # CreativeCommons BY-SA 3.0 # #select shape with left/right buttons # #green = LEAF #red = BERRY #yellow = STAR # #position Thymio on paper with pen # #press forward button to draw shape # var shapeSelect = LEAF var steps = 0 var edge = 0 var temp var inc var draw = DRAW_WAIT var playTune = 0 var tuneOn = 1 var pos = 0 var tuneDeck[] = [A5,3,G5,1,F5,2,E5,2,D5,2,E5,2,Fs5,2,D5,2,E5,1,Fs5,1,G5,1,E5,1,Fs5,3,E5,1,D5,2,Cs5,2,D5,4,999,999] var tuneHark[] = [C5,4,F5,4,F5,6,E5,2,F5,4,A5,4,A5,4,G5,4,C6,4,C6,4,C6,6,Bb5,2,A5,4,G5,4,A5,8,999,999] var tuneHolly[] = [F5,4,F5,2,F5,2,F5,4,D6,4,C6,4,A5,6,F5,2,F5,2,F5,2,F5,4,D6,4,C6,6,999,999] var beat = 0 var currentNote[2] timer.period[0]=250 timer.period[1]=120 # music tempo onevent timer1 if tuneOn == 1 then call leds.circle(16,0,0,0,0,0,0,0) else call leds.circle(0,0,0,0,0,0,0,0) end if tuneOn == 1 and playTune == 1 then if beat == 0 then if shapeSelect == LEAF then currentNote[0] = tuneDeck[pos] elseif shapeSelect == BERRY then currentNote[0] = tuneHolly[pos] elseif shapeSelect == STAR then currentNote[0] = tuneHark[pos] end if currentNote[0] != 999 then if shapeSelect == LEAF then currentNote[1] = tuneDeck[pos+1] elseif shapeSelect == BERRY then currentNote[1] = tuneHolly[pos+1] elseif shapeSelect == STAR then currentNote[1] = tuneHark[pos+1] end pos=pos+2 beat = currentNote[1] call sound.freq(currentNote[0],currentNote[1]*10) else playTune = 0 pos = 0 end end beat-- if beat < 0 then beat = 0 end end onevent button.forward # start drawing if button.forward == 1 and draw == DRAW_WAIT then draw = DRAW_PART1 steps = 1 edge = 0 call sound.system(6) end onevent button.right # shape select if button.right == 1 and draw == DRAW_WAIT then temp = shapeSelect temp ++ if temp > STAR then temp = LEAF end shapeSelect = temp end onevent button.left # shape select if button.left == 1 and draw == DRAW_WAIT then temp = shapeSelect temp -- if temp < LEAF then temp = STAR end shapeSelect = temp end onevent button.center # toggle music on / off if button.center == 1 then if tuneOn == 1 then tuneOn = 0 call sound.system(5) else tuneOn = 1 call sound.system(6) end end onevent prox # top leds indicate selected shape if shapeSelect == LEAF then call leds.top(0, 32, 0) elseif shapeSelect == BERRY then call leds.top(32, 0, 0) elseif shapeSelect == STAR then call leds.top(32, 32, 0) end sub resetDraw draw = DRAW_WAIT steps = 1 motor.left.target = 0 motor.right.target = 0 # also stop tune and reset playTune = 0 beat = 0 pos = 0 onevent button.backward # stop / cancel drawing callsub resetDraw onevent timer0 #250ms = 1/4 sec if shapeSelect == LEAF then if draw == DRAW_PART1 then # count leaf edges when steps == 5 do edge++ end when steps == 10 do edge++ end if steps < 5 then # draw a forward leaf edge steps = steps + 1 motor.left.target = 290 motor.right.target = -50 elseif steps > 10 then steps = 0 else # draw a backward leaf edge steps = steps + 1 motor.left.target = 50 motor.right.target = -290 end if edge == 3 then playTune = 1 end if edge == 5 then # all leaf edges done - switch to draw leaf midrib draw = DRAW_PART2 steps = 0 motor.left.target = 0 motor.right.target = 0 end elseif draw == DRAW_PART2 then if steps < 3 then # draw leaf midrib line steps = steps + 1 motor.left.target = -100 motor.right.target = -300 else # leaf done callsub resetDraw end end elseif shapeSelect == BERRY then if draw == DRAW_PART1 then if steps < 30 then if steps == 1 then # increase BERRYSIZE if your berries are too small! motor.left.target = -300+(10*BERRYSIZE) motor.right.target = 350 # spiral outward inc = 5 end if steps == 5 then playTune = 1 end if steps == 24 then # spiral inward inc = -5 end motor.left.target = motor.left.target motor.right.target = motor.right.target + inc steps++ else # berry done callsub resetDraw end end elseif shapeSelect == STAR then if draw == DRAW_PART1 then if edge == 2 then playTune = 1 end when steps == 12 do edge++ steps = 1 end if steps < 5 then # draw a star edge steps++ motor.left.target = 150 motor.right.target = 150 else # turn steps++ #star vertex turn speed #may need adjusting to get a tidy star motor.left.target = 207 motor.right.target = -207 end if edge == 5 then # star done callsub resetDraw end end end