Digital Gravity Push Button

Hello Everyone!

I am very new to the world of servos, robotics, and coding so please bear with me!

I have been able to successfully create servo animation sequences using the Maestro Control Center, and I love it. What I want to do now is use a button to start the sequence.

What I have is a Mini Maestro 12 and Gravity Digital Push Button:

I have tried adding some of the sample scripts to use this, but to no avail. I have the button plugged into port 11 and set to input. I can see the response in the status window when I press the button.

With a button like this do I still need to wire a pull-up resistor?

If not, where / how exactly to I add this to the script?

I’ve added my current script below. It would be great if you could help!!

Test_Sequence

begin
750 6976 256 13120 4096 7978 0
0 0 0 0 0 frame_0…10 # Start
1000 4814 frame_1 # Frame 1
1000 256 6125 4056 frame_1…3 # Frame 2
1000 13120 4096 frame_2_3 # Frame 3
500 4160 frame_0 # Frame 4
500 6784 frame_0 # Frame 5
500 4160 frame_0 # Frame 6
500 6743 frame_0 # Frame 7
1000 2071 9714 frame_3_4 # Frame 8
1000 8763 frame_4 # Frame 9
1000 9714 frame_4 # Frame 11
1000 8763 frame_4 # Frame 12
1000 4096 7978 frame_3_4 # Frame 13
repeat

sub frame_0…10
10 servo
9 servoa
8 servo
7 servo
6 servo
5 servo
4 servo
3 servo
2 servo
1 servo
0 servo
delay
return

sub frame_1
1 servo
delay
return

sub frame_1…3
3 servo
2 servo
1 servo
delay
return

sub frame_2_3
3 servo
2 servo
delay
return

sub frame_0
0 servo
delay
return

sub frame_3_4
4 servo
3 servo
delay
return

sub frame_4
4 servo
delay
return

Hello.

If you are getting the expected behavior when you press the button, it is likely your button already has an integrated pull resistor, so you should not need to add another one. As for programming that behavior, you can see one method described in this post by BrandonM.

Keep in mind though, you will need to change the channel identified in the example script to match the channel you are using. Additionally, if your button logic is inverted, you might need to change “greater_than” to “less_than”.

- Patrick

Hi Patrick,

Thanks for the help! When I try that method, I get the following error:

The script has stopped because of an error. You must restart the device to continue.

Any ideas? Happy to respond to Brandon’s post as well.

Thanks!

Can you specify what specific error you are getting by checking the “Errors” tab in the Maestro Control Center? Also, please post your Maestro settings file; you can save your settings file from the Maestro Control Center under the “File” menu, with the Maestro connected.

- Patrick

I just noticed that you posted your script in a post on the other thread I mentioned earlier. It looks like the problem is that you added only one line of BrandonM’s example to your script instead of making a new loop that acts before the rest of your code. To do that, you need to include the begin/repeat in BrandonM’s example, and that section should be placed before the rest of your code, like this:

begin  
  11 get_position 200 greater_than while #wait in while loop until button connected to channel 11 is pushed
repeat

begin
  750 6784 256 13120 3456 10944 0
  0 0 0 0 0 frame_0…10 # Start
  1000 4814 frame_1 # Tilt Right
  1000 256 6125 frame_1_2 # Tilt Left
  1000 13120 frame_2 # Face Forward
  500 4160 frame_0 # Jaw Open 1
  500 6784 frame_0 # Jaw Closed 1
  500 4160 frame_0 # Jaw Open 2
  1000 6743 frame_0 # Jaw Closed Two
  5000 2727 8800 frame_3_4 # Start Pour
  1000 3456 10944 frame_3_4 # End Pour
repeat


#and then the rest of your code as you had it before...

- Patrick

Hi Patrick!

I’ll try this out. Thanks!

1 Like

Hello Patrick,
I’ve been going through all the posts to do my best to not ask an already answered question…I just haven’t found the answer if it’s there. I want to start a sequence with a contact (button) - I’ve found that part. My desire is to start the sequence once the contact is closed, and then ignore the contact (not have any effect on restarting the sequence. Once the sequence is complete, the contact would need to open then re-close to start again. Code is brand new to me but I’m trying my best to work through it. I’m nearly 60 and I remember thinking “punch cards” were the future. I apologize for what is probably something simple…I’ve been at it for a couple days and I’m just not getting it.
Thanks
Tim

Patrick,
I should clarify my problem. The contact to start the sequence will probably always be maintained. I just don’t want the sequence to start again until it is opened, the re-closed. Ideally, I don’t want the sequence to restart with any contact activity until it has run till complete. I have used quite a few Maestros, but I’ve always just used “run from power up” so my knowledge is basic.
Thanks
Tim

Hello, Tim.

It sounds like you just need to add another loop after your sequence that waits until the button is open. So it would be similar to the loop at the beginning of your program, but it would have the opposite condition, like this (assuming the button is connected to pin 11 as in the previous example:

begin  
  11 get_position 200 less_than while #wait in while loop until button connected to channel 11 is released
repeat

- Patrick

Patrick,
Thank you so much! I wish this stuff was around when I was younger, but I’m happy to stumble through it at any age.

2 Likes

Hello Patrick,
I think I am missing something very basic. Once I create a sequence and I then want to go in to add to the code…what is that process? I’ve been just clicking on the script tab and typing it in, then click apply settings. I must be missing something very simple, because I can duplicate code posted here and get no function. My input switch is working in the status tab…it feels like I’m not getting the added code into the script.
Any idea what am I missing?
Tim

Hello All,
I’m new to this but trying to learn. I’ve read much of the Maestro guide and went through every post I can find and I’m still having no luck. I found some helpful infor from Brandon and Patrick…but no luck so far.

From BrandonM in post #2, post:2, topic:13603"]
Probably the simplest way to start your script with a button press is to add a WHILE loop to the beginning that exits when the button is pressed. You can find some code for doing this in my post here. Please note that the code there is for a button on channel 5; you can change the 5 to a 0 to make it work for your button on channel 0.

If you put the WHILE loop before your BEGIN/REPEAT loop, the sequence will repeat forever once the button is pressed. If you want the sequence to wait for the button every cycle, you can put the WHILE loop inside of your current BEGIN/REPEAT loop.

Brandon

Can I ask what you mean when you say “inside” of the BEGIN/REPEAT loop?
I’m still having no luck getting the script to start.
My objective - when I toggle the switch on (pulling input pin 8 low), I’d like the sequence to play once, then wait until the switch is toggled off (pin 8 high), then on again before it plays the sequence once more. this is my current script

Sequence 0

begin 8 get_position 200 less_than while #switch low to start sequence
repeat
begin
3000 3986 3986 3986 3986 0 0
0 0 0 0 0 frame_0…7_9…11 # Frame 0
3000 8000 frame_0 # Frame 1
3000 3986 frame_0 # Frame 2
repeat
begin 8 get_position 200 greater_than while #switch high before restart switch low possible
repeat

I know something is wrong but I can’t figure it out. I’m not able to get the sequence to play at all
Any help would be very much appreciated
Thank you
Tim

Timbot
I apologize for my delayed response. I noticed you posted about this same issue on a few other threads. Let’s keep our discussion here so that it is all in one place. (Also, I moved the post from the new thread you started here.)

Based on the code you shared, I suspect your Maestro is probably stuck in a loop where it is constantly waiting for the button to be pressed. To produce the behavior you want, you need to put the loops for your button press and release inside the loop with your servo sequence, i.e. the button loops should be nested loops within the main loop. That will make your script look something like this:

begin

  begin 8 get_position 200 less_than while #switch low to start sequence
  repeat

  3000 3986 3986 3986 3986 0 0
  0 0 0 0 0 frame_0…7_9…11 # Frame 0
  3000 8000 frame_0 # Frame 1
  3000 3986 frame_0 # Frame 2

  begin 8 get_position 200 greater_than while #switch high before restart switch low possible
  repeat

repeat

By the way, in general, and especially when using nested loops, I strongly recommend indenting and spacing your code appropriately to keep things organized.

- Patrick

Patrick,
Thank you! I never would have figured that out! I just had to swap the less_than/greater_than to give me what I was after (switch pulling input 8 low to start sequence - one run. Switch has to go high, then low again to start sequence again - one run)
If I can ask one more question…I’m probably pushing it, but Ideally I’d like to have four different sequences on this Maestro. They all control the same components, but with different “show lengths” and timing. I would like to trigger each sequence with it’s own switch. it will have the same behavior as the switch you helped me with. I created another sequence, then I “copy all sequence to script” I then opened the script tab hoping I could just put the same switch behavior code and my eyes exploded! I should have know it wouldn’t be so easy. I have no idea where to apply the code to “sequence 1”
Can this be done? if so, will the process be the same for sequence 2 and 3? or will the script continue to multiply into a scene from the Matrix?
No matter if you can help with this or not, you’ll see another order and Pololu/covid donation from me now. What you’ve already helped me with was a life saver!
Thanks
Tim

My “Matrix” below

# Sequence 0
begin

	  begin 8 get_position 200 greater_than while #switch low to start
  repeat

  1000 3986 3986 3986 3986 0 0 
  0 0 0 0 0 frame_0..7_9..11 # Frame 0
  1000 8000 frame_0 # Frame 1
  1000 3986 frame_0 # Frame 2
  1000 8000 frame_0 # Frame 3
  1000 3986 frame_0 # Frame 4
  1000 8000 frame_0 # Frame 5
  1000 3986 frame_0 # Frame 6

  begin 8 get_position 200 less_than while #switch high then low before restart
  repeat

repeat

sub frame_0..7_9..11
  11 servo
  10 servo
  9 servo
  7 servo
  6 servo
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  delay
  return

sub frame_0
  0 servo
  delay
  return


### Sequence subroutines: ###

# Sequence 0
sub Sequence_0
  1000 3986 3986 3986 3986 0 0 
  0 0 0 0 frame_0..7_10_11 # Frame 0
  1000 8000 frame_0 # Frame 1
  1000 3986 frame_0 # Frame 2
  1000 8000 frame_0 # Frame 3
  1000 3986 frame_0 # Frame 4
  1000 8000 frame_0 # Frame 5
  1000 3986 frame_0 # Frame 6
  return
# Sequence 1
sub Sequence_1
  500 3986 0 0 3986 0 0 
  0 0 0 0 frame_0..7_10_11 # Frame 0
  500 8000 8000 frame_0_3 # Frame 1
  500 3986 3986 frame_0_3 # Frame 2
  500 8000 8000 frame_0_3 # Frame 3
  500 3986 frame_3 # Frame 4
  500 3986 8000 frame_0_3 # Frame 5
  500 8000 3986 frame_0_3 # Frame 6
  500 8000 frame_3 # Frame 7
  500 3986 3986 frame_0_3 # Frame 8
  return

sub frame_0..7_10_11
  11 servo
  10 servo
  7 servo
  6 servo
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  delay
  return

sub frame_0
  0 servo
  delay
  return

sub frame_0_3
  3 servo
  0 servo
  delay
  return

sub frame_3
  3 servo
  delay
  return

The easiest way to make something like what you are proposing would probably be to program a control structure using if statements. You can find more information about using if statements in the “The Maestro Scripting Language” section of the user’s guide, but here is a quick example I wrote for two buttons showing how it might look in your application:

begin

  8 get_position     # get the value from button connected to pin 8
  200 greater_than   # test if it is pressed
  if
    Sequence_0                                # if it is pressed, then run Sequence_0
    begin 8 get_position 200 less_than while  #  then wait until the button is released
    repeat
  endif

  9 get_position     # get the value from button connected to pin 9
  200 greater_than   # test if it is pressed
  if
    Sequence_1                                # if it is pressed, then run Sequence_1
    begin 9 get_position 200 less_than while  # then wait until the button is released
    repeat
  endif
     
repeat

- Patrick

Patrick,
Thank you! Because of my switch type (active low) I just swapped a couple of the greater than for less than and it does exactly what I want…runs each sequence one time when the pin is pulled low, and won’t run it again until the pin goes high, then low again.
Thank you very much for all your help! I really can’t thank you enough!
Tim

begin

	  8 get_position 
  200 less_than 
  if
    Sequence_0
    begin 8 get_position 200 less_than while
    repeat
  endif

  9 get_position
  200 less_than
  if
    Sequence_1
    begin 9 get_position 200 less_than while
    repeat
  endif
 
repeat

BTW, I am indenting, but when I cut and paste here it goes away

2 Likes

Hello @PatrickM sorry to butt in, I too am puzzled by coding but found this thread and implemented your recommendations in my script as I thought appropriate.

I have a single momentary push button fitted with a pull up resistor and the switch which grounds the input when pressed.

I would like my sequence to start when the button is pressed and stop at the end.

Cycling the momentary switch shows the change in state in the ‘status’ window, normally high, low when pressed.

If disconnect from the PC and power up the Pololu waits for the button to be pressed, before starting, so far so good, but at the end of the sequence it repeats again and again, etc.

When connected to my PC it runs through the sequence once as required.

BTW, I ticked the ‘Run script on start up’ box

Please could you explain what I have done wrong and help me out with a fix?

Here is my script.

# Sequence 2
begin
6 get_position 200 greater_than while #wait in while loop until switch goes low to start sequence
repeat

begin
  100 3968 6023 3968 6000 6000 0 
  0 0 0 0 0 0 
  0 0 0 0 0 frame_0..5_7..17 # Frame 0
  500 8000 frame_0 # Frame 1
  500 6023 frame_0 # Frame 2
  2000 delay # Frame 3
  2000 8000 frame_1 # Frame 4
  3000 3968 frame_1 # Frame 5
  3000 5984 frame_1 # Frame 6
  2000 delay # Frame 7
  5000 8000 frame_2 # Frame 8
  5000 3968 frame_2 # Frame 9
  5000 delay # Frame 10
  2000 8000 8000 frame_3_4 # Frame 11
  1500 6023 6023 frame_3_4 # Frame 12
  1000 3968 frame_0 # Frame 13
repeat

begin
6 get_position 200 less_than while #switch high before restart switch low
repeat 


sub frame_0..5_7..17
  17 servo
  16 servo
  15 servo
  14 servo
  13 servo
  12 servo
  11 servo
  10 servo
  9 servo
  8 servo
  7 servo
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  delay
  return

sub frame_0
  0 servo
  delay
  return

sub frame_1
  1 servo
  delay
  return

sub frame_2
  2 servo
  delay
  return

sub frame_3_4
  4 servo
  3 servo
  delay
  return

Thank you

@PatrickM I have trawled through a couple more threads like this one and I have pieced together the right places to put the wait loops!

So it works now as intended, Hoorah!

Now I can move on to building my Automaton with more confidence.

Thanks for your input to the various threads here, great repository of geekiness :0)

2 Likes

I am glad that the forum has been a useful resource to help you figured it out! Thanks for letting us know.

By the way, you might consider posting your updated script here so that others who come across this thread can see how you solved the issue.

- Patrick

Good idea, I’ll do that tomorrow when I next power up my laptop