I’ve been using the example script for using a button and it has been working great to go to the next step. Now I want to add a button so that when I push this second button the controller will do the previous step instead of the next step like the first button is doing. Can someone help me with this please?
I moved your post to the “Servo controllers and servos” category of the forum since it is specific to the Maestro.
Unfortunately, adding the multiple button feature you described would not be a trivial modification to the “Using a button or switch to control servos” example from the “Example scripts” section of the Maestro user’s guide. There are a few ways you could write that kind of script. How many positions are you switching between? Have you tried writing a script that does what you described? If so, could you post what you have here?
goto main_loop # Run the main loop when the script starts (see below). # This subroutine returns 1 if the button is pressed, 0 otherwise. # To convert the input value (0-1023) to a digital value (0 or 1) representing # the state of the button, we make a comparison to an arbitrary threshold (500). # This subroutine puts a logical value of 1 or a 0 on the stack, depending # on whether the button is pressed or not. sub button 0 get_position 500 less_than return # This subroutine uses the BUTTON subroutine above to wait for a button press, # including a small delay to eliminate noise or bounces on the input. sub wait_for_button_press wait_for_button_open_10ms wait_for_button_closed_10ms return # Wait for the button to be NOT pressed for at least 10 ms. sub wait_for_button_open_10ms get_ms # put the current time on the stack begin # reset the time on the stack if it is pressed button if drop get_ms else get_ms over minus 10 greater_than if drop return endif endif repeat # 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 button if get_ms over minus 10 greater_than if drop return endif else drop get_ms endif repeat # An example of how to use wait_for_button_press is shown below: # Uses WAIT_FOR_BUTTON_PRESS to allow a user to step through # a sequence of positions on servo 1. main_loop: begin 2000 frame 2000 frame 2000 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 9800 frame 2000 frame 2000 frame 2000 frame repeat sub frame wait_for_button_press 1 servo return
This is what I have at the moment.
You may be wondering why some many 9800 are in a row and then why so many 2000 are in a row. The reason for this is because there are only two positions the servo needs two be in during the cycle and the button/switch gets pushed 21 times each cycle. It is critical that it stays in rhythm, three 2000’s, fifteen 9800’s, three 2000’s, and then repeat all over again. This is all working great, but now I’m wanting to update the script so that at any point in the cycle if a second button is pushed it will do the previous action.
As I mentioned before, it would not be trivial to have that particular script “reverse” like you are describing because of the way it is set up.
With only two positions for the servo, but 21 button states, it is probably easier to write a new script from scratch that essentially uses a dummy servo channel as a state variable. To do that, you can choose a servo channel you are not using (e.g. channel 5) and use the target position of that channel as a reference (reading it with the
GET_POSITION command and updating it with the
If you are interested in this method, I would encourage you to give it a try. Since you are new to Maestro scripting, I recommend starting slow; for example, writing a script that just uses two buttons (without debouncing), and increases or decreases the dummy servo’s position by 1 depending on which button is pressed. If you try this and run into problems, you can post what you have so far along with your question and I would be happy to help.