;; ALFI (Animatronic Lego Face for Interaction) Basic functions ;; Version 3.0 ;; To Do: ;; Fix eye speeds ;; Figure out light sensors ;; Make basic system menu 1 [run] menu 2 [asleep] menu 3 [alert] menu 4 [bored] menu 5 [eye] menu 6 [lids] ;;;;;;;;;;;;;;;;;;;;;; ;; Global Variables ;; ;;;;;;;;;;;;;;;;;;;;;; global [ear-position mouth-position eye-position lids-position state rightLevel leftLevel] ;; ear-position: 1=up, 0=down ;; mouth-position: 1=open, 0=closed ;; eye-position: 2=left, 1=right, 0=center ;; lids-position: 2=up, 1=down, 0=center ;; state: 2=bored, 1=alert, 0=asleep ;;;;;;;;;;;;;;;;;;;;;; ;; Action Functions ;; ;;;;;;;;;;;;;;;;;;;;;; ;; awake: 2=bored, 1=alert, 0=asleep to setup ;; starts off asleep setstate 0 seteye-position 0 ;; center setlids-position 1 ;; down setmouth-position 0 ;; closed setear-position 0 ;; down eye-motor setpower 1 ear-motor setpower 1 mouth-motor setpower 1 lids-motor setpower 1 end to asleep ;; transitions to "alert" only ;; comes from "bored" only if (state = 2) [ ;; was bored ear-down wait 2 lids-down setstate 0 ] end to alert ;; transitions to "bored" only ;; comes from "asleep" or "bored" if (state = 0) [ ;; was asleep ear-up mouth-open lids-up eyes-rove 2 setstate 1 ] if (state = 2) [ ;; was bored lids-up eyes-rove 2 setstate 1 ] end to bored ;; transitions to either "asleep" or "alert" ;; comes from "alert" only if (state = 1) [ ;; was alert lids-center eye-center mouth-close wait 50 yawn 2 setstate 2 ] end to run setup ;; asleep ;; wait 20 ;; alert ;; bored ;; asleep setrightLevel right-light-sense setleftLevel left-light-sense loop [ ] end ;;;;;;;;;;;;;;;;;;; ;; Ear Functions ;; ;;;;;;;;;;;;;;;;;;; ;; ear-position: 1=up, 0=down to ear ear-motor setpower 1 ear-up ear-down wait 10 ear-up end to ear-up if (not(ear-position = 1)) [ ear-motor thisway on waituntil[ear-up-sense] ear-motor off setear-position 1] end to ear-down if (not(ear-position = 0)) [ ear-motor thatway on waituntil[ear-down-sense] ear-motor off setear-position 0] end ;;;;;;;;;;;;;;;;;;;;; ;; Mouth Functions ;; ;;;;;;;;;;;;;;;;;;;;; ;; mouth-position: 1=open, 0=closed to mouth mouth-motor setpower 1 mouth-close mouth-open wait 10 mouth-close end to yawn :count repeat :count [ mouth-open wait 10 mouth-close wait 50 ] end to mouth-open if (not(mouth-position = 1)) [ mouth-motor thatway on waituntil[mouth-open-sense] mouth-motor off setmouth-position 1] end to mouth-close if (not(mouth-position = 0)) [ mouth-motor thisway on waituntil[mouth-close-sense] mouth-motor off setmouth-position 0] end ;;;;;;;;;;;;;;;;;;; ;; Eye Functions ;; ;;;;;;;;;;;;;;;;;;; ;; eye-position: 2=left, 1=right, 0=center ;; thisway = left, thatway = right to eye eye-motor setpower 1 seteye-position 0 eye-center wait 10 eye-left wait 10 eye-center eye-right wait 10 eye-center end to eyes-rove :count repeat :count [ eye-center eye-left wait 10 eye-right wait 10 eye-center ] end to eye-left if (eye-position = 0) [ ;; center to left break-beam-eye-this 25] if (eye-position = 1) [ ;; right to left break-beam-eye-this 50] seteye-position 2 end to eye-right if (eye-position = 0) [ ;; center to right break-beam-eye-that 25] if (eye-position = 2) [ ;; left to right break-beam-eye-that 50] seteye-position 1 end to eye-center if (eye-position = 2) [ ;; left to center break-beam-eye-that 25] if (eye-position = 1) [ ;; right to center break-beam-eye-this 25] seteye-position 0 end ;;;;;;;;;;;;;;;;;;;; ;; lids Functions ;; ;;;;;;;;;;;;;;;;;;;; ;; lids-position: 2=up, 1=down, 0=center to lids lids-motor setpower 1 setlids-position 0 lids-center wait 10 lids-up wait 10 lids-center wait 10 lids-down wait 10 lids-center end to lids-up if (lids-position = 0) [ break-beam-lids-up 12 setlids-position 2] if (lids-position = 1) [ break-beam-lids-up 20 setlids-position 2] end to lids-down if (lids-position = 0) [ break-beam-lids-down 12 setlids-position 1] if (lids-position = 2) [ break-beam-lids-down 20 setlids-position 1] end to lids-center if (lids-position = 2) [ break-beam-lids-down 20 setlids-position 0] if (lids-position = 1) [ break-beam-lids-up 20 setlids-position 0] end ;;;;;;;;;;;;;;;;;;;;;; ;; Helper Functions ;; ;;;;;;;;;;;;;;;;;;;;;; to break-beam-eye-this :count eye-motor thisway on repeat :count [ waituntil[(eye-sense) > 50] waituntil[(eye-sense) < 50] ] eye-motor off end to break-beam-eye-that :count eye-motor thatway on repeat :count [ waituntil[(eye-sense) > 50] waituntil[(eye-sense) < 50] ] eye-motor off end to break-beam-lids-down :count lids-motor thisway on repeat :count [ waituntil[(lids-sense) > 50] waituntil[(lids-sense) < 50] ] lids-motor off end to break-beam-lids-up :count lids-motor thatway on repeat :count [ waituntil[(lids-sense) > 50] waituntil[(lids-sense) < 50] ] lids-motor off end ;;;;;;;;;;;;;;;;;; ;; Sensor Names ;; ;;;;;;;;;;;;;;;;;; to ear-up-sense output switch 7 end to ear-down-sense output switch 8 end to mouth-close-sense output switch 9 end to mouth-open-sense output switch 10 end to eye-emit output switch 14 end to eye-sense output sensor 0 end to lids-emit output switch 15 end to lids-sense output sensor 1 end to LL-sense ;; red block output sensor 6 end to RL-sense ;; yellow block output sensor 5 end ;;;;;;;;;;;;;;;;; ;; Motor Names ;; ;;;;;;;;;;;;;;;;; to ear-motor a, end to mouth-motor b, end to eye-motor c, end to lids-motor d, end