Hi there
I’ve done some reading about this error but I can not find the solution to my script. Probably because I am new to this and I do not understand enough about programming in general What i do understand is that the 6 channel maestro is limited to 10 subroutines and my subroutines and stack continue to add up as the script is stepped through. I do not understand how to write the script so that is drops each subroutine as it finishes it. Could it be that I just need to upgrade to a 12, 18 or 24 channel maestro. Can someone help me?
Here is my script to my over engineered Sofa Beer Fridge. I have tried to write some #notes so that you understand what I’m trying to do.
thanks Justin
# SOFA BEER FRIDGE CODE
main_loop:
begin
start_sequence
repeat quit
### Sequence subroutines: ###
sub start_sequence
wait_for_button_closed_10ms
500 3986 3986 3986 frame_3..5 # Frame 0 (ensure all motor switches to open)
1 get_position 500 greater_than if load_beer else normal_deliver endif #check proximity sensor if beer is in the delivery draw
return quit
sub load_beer
500 8000 frame_5 # Frame 5 start despencing motor (ready beer in delivery draw)
2000 delay
1 get_position 500 less_than if normal_deliver endif # waiting for proximity sensor low (detect beer in draw)
2000 delay
1 get_position 500 less_than if normal_deliver endif
2000 delay
1 get_position 500 less_than if normal_deliver endif
2000 delay
1 get_position 500 less_than if normal_deliver endif
2000 delay
1 get_position 500 greater_than if 500 3986 frame_5 endif #If fridge empty, after 10 sec sequence cancelled (There has to be a better way than this)
start_sequence
return quit
sub normal_deliver
500 3986 frame_5
wait_for_button1_closed_10ms
500 8000 frame_3# Frame 1 start draw deliver
check_draw
return quit
sub check_draw
2000 delay
1 get_position 500 greater_than if beer_removed endif
2000 delay
1 get_position 500 greater_than if beer_removed endif
2000 delay
1 get_position 500 greater_than if beer_removed endif
2000 delay
1 get_position 500 greater_than if beer_removed endif
2000 delay
1 get_position 500 less_than if beer_remain endif
return quit
sub beer_remain
500 3986 frame_3 # Frame 2 stop draw deliver
1000 delay
500 8000 frame_4 # Frame 3 start draw return
wait_for_button2_closed_10ms
500 3986 frame_4 # Frame 4 stop draw return
start_sequence
return quit
sub beer_removed
500 3986 frame_3 # Frame 2 stop draw deliver
1000 delay
500 8000 frame_4 # Frame 3 start draw return
wait_for_button2_closed_10ms
500 3986 frame_4 # Frame 4 stop draw return
1500 delay
500 8000 frame_5 # Frame 5 start beer ready
wait_for_button1_closed_10ms
500 3986 frame_5 # Frame 6
start_sequence
return quit
sub frame_3..5
5 servo
4 servo
3 servo
200 delay
return quit
sub frame_3
3 servo
200 delay
return quit
sub frame_4
4 servo
200 delay
return quit
sub frame_5
5 servo
200 delay
return quit
#START SWITCH
# Wait for the button to be pressed for at least 10 ms.
sub wait_for_button_closed_10ms
get_ms
begin
# reset the time on the stack if it is not pressed
0 get_position 500 less_than
if
get_ms over minus 10 greater_than
if drop return endif
else
drop get_ms
endif
repeat quit
#PROXIMITY SWITCH
# Wait for the button to be pressed for at least 10 ms.
sub wait_for_button1_closed_10ms
get_ms
begin
# reset the time on the stack if it is not pressed
1 get_position 500 less_than
if
get_ms over minus 10 greater_than
if drop return endif
else
drop get_ms
endif
repeat quit
#LIMIT SWITCH
# Wait for the button to be pressed for at least 10 ms.
sub wait_for_button2_closed_10ms
get_ms
begin
# reset the time on the stack if it is not pressed
2 get_position 500 less_than
if
get_ms over minus 10 greater_than
if drop return endif
else
drop get_ms
endif
repeat quit