Time stop

I need some help. I have two servos connected to a Maestro 6 and have saved several sequences. I want to enter a 10-minute pause between the sequences. However, the Maestro 6 doesn’t allow 10 minutes; I can only enter up to about 3 minutes. So I have to enter 3 x 3 minutes. The problem is that this fills up my memory. The 124KB is full. How can I integrate these 10-minute pauses more easily?

This is a rather convoluted setup. As you can see, I have to enter the pause with multiple 30000 delays at the bottom. This obviously consumes a lot of memory. Surely there must be a better way to write this, even on a smaller device.

### Sequence subroutines: ###

# Sequence 0
begin
  500 5519 4032 0 0 0 0 frame_0..5 # Frame 0
  500 3840 frame_0 # Frame 1
  3500 delay # Frame 2
  500 5518 frame_1 # Frame 3
  3500 delay # Frame 4
  500 7232 6976 frame_0_1 # Frame 5
  3500 delay # Frame 6
  500 5552 frame_0 # Frame 7
  500 delay # Frame 8
  500 delay
  500 4032 frame_1 # Frame 9
  1500 delay # Frame 10
  
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause

# Sequence 1
sub Sequence_1
  500 5519 4032 0 0 0 0 frame_0..5 # Frame 0
  500 3840 frame_0 # Frame 1
  3500 delay # Frame 1
  500 6976 frame_1 # Frame 2 
  3500 delay # Frame 2
  500 7232 frame_0 # Frame 3
  500 5536 4032 frame_0_1 # Frame 4
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
  
# Sequence 2
sub Sequence_2
  500 5536 4032 0 0 0 0 frame_0..5 # Frame 0
  500 7232 frame_0 # Frame 1
  3500 delay # Frame 2
  500 3840 5489 frame_0_1 # Frame 3
  3500 delay # Frame 4
  500 5536 4032 frame_0_1 # Frame 5
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause

# Sequence 3
sub Sequence_3
  500 5536 4032 0 0 0 0 frame_0..5 # Frame 0
  500 5489 frame_1 # Frame 1
  3500 delay # Frame 2
  500 3840 frame_0 # Frame 3
  3500 delay # Frame 4
  500 7232 frame_0 # Frame 5
  3500 delay # Frame 6
  500 6976 frame_1 # Frame 7
  3500 delay # Frame 8
  500 5519 4032 frame_0_1 # Frame 9
  500 delay # Frame 10
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
repeat

sub frame_0..5
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  delay
  return

sub frame_0_1
  1 servo
  0 servo
  delay
  return

sub frame_0
  0 servo
  delay
  return

sub frame_1
  1 servo
  delay
  return

Hello.

I recommend using the method shown in the “Long delays” example from the “Example Scripts” section of the Maestro user’s guide. If you still have problems with memory usage using that method, please post a copy of your updated script, and I would be happy to take a look.

Brandon

1 Like

I saw this section, but unfortunately I didn’t quite understand it. Since I don’t speak English, I’m using a translator.

I’m supposed to insert a subroutine that handles this delay. I just didn’t understand how.

So I put it right at the beginning.

Of course, that didn’t work.

This is what it looks like now, after I removed all the other delays.



### Sequence test ###

begin
    10 delay_minutes
  repeat

# Sequence 0
begin
  500 5519 4032 0 0 0 0 frame_0..5 # Frame 0
  500 3840 frame_0 # Frame 1
  3500 delay # Frame 2
  500 5518 frame_1 # Frame 3
  3500 delay # Frame 4
  500 7232 6976 frame_0_1 # Frame 5
  3500 delay # Frame 6
  500 5552 frame_0 # Frame 7
  500 delay # Frame 8
  500 delay
  500 4032 frame_1 # Frame 9
  1500 delay # Frame 10
  

# Sequence 1
sub Sequence_1
  500 5519 4032 0 0 0 0 frame_0..5 # Frame 0
  500 3840 frame_0 # Frame 1
  3500 delay # Frame 1
  500 6976 frame_1 # Frame 2 
  3500 delay # Frame 2
  500 7232 frame_0 # Frame 3
  500 5536 4032 frame_0_1 # Frame 4
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
30000 delay # 1 Minute Pause
  
# Sequence 2
sub Sequence_2
  500 5536 4032 0 0 0 0 frame_0..5 # Frame 0
  500 7232 frame_0 # Frame 1
  3500 delay # Frame 2
  500 3840 5489 frame_0_1 # Frame 3
  3500 delay # Frame 4
  500 5536 4032 frame_0_1 # Frame 5

# Sequence 3
sub Sequence_3
  500 5536 4032 0 0 0 0 frame_0..5 # Frame 0
  500 5489 frame_1 # Frame 1
  3500 delay # Frame 2
  500 3840 frame_0 # Frame 3
  3500 delay # Frame 4
  500 7232 frame_0 # Frame 5
  3500 delay # Frame 6
  500 6976 frame_1 # Frame 7
  3500 delay # Frame 8
  500 5519 4032 frame_0_1 # Frame 9
  500 delay # Frame 10

repeat

sub frame_0..5
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  delay
  return

sub frame_0_1
  1 servo
  0 servo
  delay
  return

sub frame_0
  0 servo
  delay
  return

sub frame_1
  1 servo
  delay
  return

You can copy the subroutines from the example and paste them in your script so you can call them from your main code. Similarly, I recommend putting your “Sequence 0” sequence into it’s own subroutine and starting your code with the main loop. Lastly, each of your sequence subroutines should end with a return command so the script returns back to the main loop when it is done. With those three modifications, your script would look something like this:

### Main Loop ###

begin
  Sequence_0
  10 delay_minutes

  Sequence_1
  10 delay_minutes

  Sequence_2
  10 delay_minutes

  Sequence_3
  10 delay_minutes
repeat

### Long delay subroutines ###

sub delay_seconds
  begin dup while      # check if the count has reached zero
    1 minus 1000 delay # subtract one and delay 1s
  repeat
  drop return          # remove the 0 from the stack and return
 
sub delay_minutes
  begin dup while
    1 minus 60 delay_seconds # subtract one and delay 1min
  repeat
  drop return  # remove the 0 from the stack and return

### Sequence Subroutines ###

# Sequence 0
sub Sequence_0 
  500 5519 4032 0 0 0 0 frame_0..5 # Frame 0
  500 3840 frame_0 # Frame 1
  3500 delay # Frame 2
  500 5518 frame_1 # Frame 3
  3500 delay # Frame 4
  500 7232 6976 frame_0_1 # Frame 5
  3500 delay # Frame 6
  500 5552 frame_0 # Frame 7
  500 delay # Frame 8
  500 delay
  500 4032 frame_1 # Frame 9
  1500 delay # Frame 10
  return

# Sequence 1
sub Sequence_1
  500 5519 4032 0 0 0 0 frame_0..5 # Frame 0
  500 3840 frame_0 # Frame 1
  3500 delay # Frame 1
  500 6976 frame_1 # Frame 2 
  3500 delay # Frame 2
  500 7232 frame_0 # Frame 3
  500 5536 4032 frame_0_1 # Frame 4
  return
  
# Sequence 2
sub Sequence_2
  500 5536 4032 0 0 0 0 frame_0..5 # Frame 0
  500 7232 frame_0 # Frame 1
  3500 delay # Frame 2
  500 3840 5489 frame_0_1 # Frame 3
  3500 delay # Frame 4
  500 5536 4032 frame_0_1 # Frame 5
  return

# Sequence 3
sub Sequence_3
  500 5536 4032 0 0 0 0 frame_0..5 # Frame 0
  500 5489 frame_1 # Frame 1
  3500 delay # Frame 2
  500 3840 frame_0 # Frame 3
  3500 delay # Frame 4
  500 7232 frame_0 # Frame 5
  3500 delay # Frame 6
  500 6976 frame_1 # Frame 7
  3500 delay # Frame 8
  500 5519 4032 frame_0_1 # Frame 9
  500 delay # Frame 10
  return

sub frame_0..5
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  delay
  return

sub frame_0_1
  1 servo
  0 servo
  delay
  return

sub frame_0
  0 servo
  delay
  return

sub frame_1
  1 servo
  delay
  return

Brandon

Thank you very much, I’ve incorporated the changes and adjusted my entire script accordingly. However, I can only use 9 sequences here because with 10 it says that at 1070kb I’m exceeding 1024kb and that’s not possible.

Is there any way to shorten this further?


### Sequence subroutines: ###

begin
  Sequence_0
  10 delay_minutes

  Sequence_1
  10 delay_minutes

  Sequence_2
  10 delay_minutes

  Sequence_3
  10 delay_minutes

  Sequence_4
  10 delay_minutes

  Sequence_5
  10 delay_minutes

  Sequence_6
  10 delay_minutes

  Sequence_7
  10 delay_minutes

  Sequence_8
  10 delay_minutes

  Sequence_9
  10 delay_minutes

  Sequence_10
  10 delay_minutes
repeat

sub delay_seconds
  begin dup while      # Prüfen, ob der Zähler Null erreicht hat
    1 minus 1000 delay # Eins subtrahieren und 1 Sekunde verzögern
  repeat
  drop return          # Die 0 vom Stack entfernen und zurückkehren
 
sub delay_minutes
  begin dup while
    1 minus 60 delay_seconds # Eins subtrahieren und 1 Minute verzögern
  repeat
  drop return  # Die 0 vom Stack entfernen und zurückkehren

# Sequence 0
begin
sub Sequence_0
  3000 8120 7209 7100 0 0 0 frame_0..5 # Frame 0
  3000 9984 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 6464 frame_0 # Frame 3
  3000 delay # Frame 4
  3000 3968 frame_1 # Frame 5
  6000 delay # Frame 6
  3000 8120 7200 frame_0_1 # Frame 7
  6000 delay # Frame 8
  return
  
# Sequence 1
sub Sequence_1
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 3968 5236 frame_1_2 # Frame 1
  3000 delay # Frame 2
  3000 8017 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 6464 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 9984 7100 frame_1_2 # Frame 7
  3000 delay # Frame 8
  3000 8120 7200 frame_0_1 # Frame 9
  6000 delay # Frame 10 
  return
  
# Sequence 2
sub Sequence_2
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 6464 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 9984 frame_0 # Frame 3
  3000 delay # Frame 4
  3000 6771 3968 frame_0_1 # Frame 5
  3000 delay # Frame 6
  3000 8064 frame_2 # Frame 7
  3000 delay # Frame 8
  3000 5866 7100 frame_1_2 # Frame 9
  3000 delay # Frame 10
  3000 8120 8757 frame_0_1 # Frame 11
  3000 delay # Frame 12
  3000 6959 frame_0 # Frame 13
  3000 delay # Frame 14
  3000 8120 7200 frame_0_1 # Frame 15
  6000 delay # Frame 16
  return
  
# Sequence 3
sub Sequence_3
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 3968 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 8064 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 6464 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 8120 frame_0 # Frame 7
  3000 delay # Frame 8
  3000 9984 4864 frame_1_2 # Frame 9
  3000 delay # Frame 10
  3000 7200 7100 frame_1_2 # Frame 11
  6000 delay # Frame 12
  return

# Sequence 4
sub Sequence_4
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 4000 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 8000 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 6839 9984 frame_0_1 # Frame 5
  3000 delay # Frame 6
  3000 8120 7200 frame_0_1 # Frame 7
  3000 delay # Frame 8
  3000 4864 frame_2 # Frame 9
  3000 delay # Frame 10
  3000 8064 frame_2 # Frame 11
  3000 delay # Frame 12
  3000 7100 frame_2 # Frame 13
  6000 delay # Frame 14
  return

# Sequence 5
sub Sequence_5
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 9984 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 6464 frame_0 # Frame 3
  3000 delay # Frame 4
  3000 9984 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 8120 5702 frame_0_2 # Frame 7
  3000 delay # Frame 8
  3000 5428 7830 frame_1_2 # Frame 9
  3000 delay # Frame 10
  3000 6686 3968 frame_0_1 # Frame 11
  3000 delay # Frame 12
  3000 8120 7200 7100 frame_0..2 # Frame 13
  6000 delay # Frame 14
  return

# Sequence 6
sub Sequence_6
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 6464 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 4026 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 8120 7200 frame_0_1 # Frame 5
  6000 delay # Frame 6
  return

# Sequence 7
sub Sequence_7
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 4864 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 8064 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 6464 7100 frame_0_2 # Frame 5
  3000 delay # Frame 6
  3000 8120 frame_0 # Frame 7
  6000 delay # Frame 8
  return
  
# Sequence 8
sub Sequence_8
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 6651 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 9984 frame_0 # Frame 3
  3000 delay # Frame 4
  3000 7044 4464 frame_0_1 # Frame 5
  3000 delay # Frame 6
  3000 9370 frame_1 # Frame 7
  3000 delay # Frame 8
  3000 8048 frame_2 # Frame 9
  3000 delay # Frame 10
  3000 5081 frame_2 # Frame 11
  3000 delay # Frame 12
  3000 8120 7200 7100 frame_0..2 # Frame 13
  6000 delay # Frame 14
  return

# Sequence 9
sub Sequence_9
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 6464 4172 frame_0_1 # Frame 1
  3000 delay # Frame 2
  3000 9984 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 8958 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 7181 frame_0 # Frame 7
  3000 delay # Frame 8
  3000 8120 7200 frame_0_1 # Frame 9
  6000 delay # Frame 10
  return

# Sequence 10
sub Sequence_10
  3000 8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3000 4864 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 8064 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 9078 7100 frame_1_2 # Frame 5
  3000 delay # Frame 6
  3000 5369 frame_1 # Frame 7
  3000 delay # Frame 8
  3000 7200 frame_1 # Frame 9
  3000 delay # Frame 10
  return
  repeat

sub frame_0..5
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  delay
  return

sub frame_1
  1 servo
  delay
  return

sub frame_0
  0 servo
  delay
  return

sub frame_0_1
  1 servo
  0 servo
  delay
  return

sub frame_1_2
  2 servo
  1 servo
  delay
  return

sub frame_2
  2 servo
  delay
  return

sub frame_0_2
  2 servo
  0 servo
  delay
  return

sub frame_0..2
  2 servo
  1 servo
  0 servo
  delay
  return

It looks like your sequences have a lot of duplicate code (like delaying for 3 seconds after each one), so you can probably squeeze in a couple more sequences if you move some of the duplicate code into the subroutines. You can find some examples showing how to compress code to save space under the “Compressing the sequence” heading of the “Example Scripts” section of the Maestro user’s guide.

For example, you can move the 3000 delay that is called after each frame to the end of the frame subroutines. Additionally, since each frame subroutine already ends in a delay command and you are always sending 3 seconds to that as well, we can combine them and just use 6000 delay. With those modifications, your script would look like this and brings the size down to 709 bytes while still being functionally the same as what you have now (although it offers less flexibility to adjust those timings later):

begin
  Sequence_0
  10 delay_minutes

  Sequence_1
  10 delay_minutes

  Sequence_2
  10 delay_minutes

  Sequence_3
  10 delay_minutes

  Sequence_4
  10 delay_minutes

  Sequence_5
  10 delay_minutes

  Sequence_6
  10 delay_minutes

  Sequence_7
  10 delay_minutes

  Sequence_8
  10 delay_minutes

  Sequence_9
  10 delay_minutes

  Sequence_10
  10 delay_minutes
repeat

sub delay_seconds
  begin dup while      
    1 minus 1000 delay
  repeat
  drop return 
 
sub delay_minutes
  begin dup while
    1 minus 60 delay_seconds
  repeat
  drop return 

# Sequence 0
sub Sequence_0
  8120 7209 7100 0 0 0 frame_0..5 # Frame 0
  9984 frame_1 # Frame 1
  6464 frame_0 # Frame 3
  3968 frame_1 # Frame 5
  3000 delay # Frame 6
  8120 7200 frame_0_1 # Frame 7
  3000 delay # Frame 8
  return
  
# Sequence 1
sub Sequence_1
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3968 5236 frame_1_2 # Frame 1
  8017 frame_2 # Frame 3
  6464 frame_0 # Frame 5
  9984 7100 frame_1_2 # Frame 7
  8120 7200 frame_0_1 # Frame 9
  3000 delay # Frame 10 
  return
  
# Sequence 2
sub Sequence_2
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6464 frame_0 # Frame 1
  9984 frame_0 # Frame 3
  6771 3968 frame_0_1 # Frame 5
  8064 frame_2 # Frame 7
  5866 7100 frame_1_2 # Frame 9
  8120 8757 frame_0_1 # Frame 11
  6959 frame_0 # Frame 13
  8120 7200 frame_0_1 # Frame 15
  3000 delay # Frame 16
  return
  
# Sequence 3
sub Sequence_3
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3968 frame_1 # Frame 1
  8064 frame_2 # Frame 3
  6464 frame_0 # Frame 5
  8120 frame_0 # Frame 7
  9984 4864 frame_1_2 # Frame 9
  7200 7100 frame_1_2 # Frame 11
  3000 delay # Frame 12
  return

# Sequence 4
sub Sequence_4
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  4000 frame_1 # Frame 1
  8000 frame_1 # Frame 3
  6839 9984 frame_0_1 # Frame 5
  8120 7200 frame_0_1 # Frame 7
  4864 frame_2 # Frame 9
  8064 frame_2 # Frame 11
  7100 frame_2 # Frame 13
  3000 delay # Frame 14
  return

# Sequence 5
sub Sequence_5
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  9984 frame_1 # Frame 1
  6464 frame_0 # Frame 3
  9984 frame_0 # Frame 5
  8120 5702 frame_0_2 # Frame 7
  5428 7830 frame_1_2 # Frame 9
  6686 3968 frame_0_1 # Frame 11
  8120 7200 7100 frame_0..2 # Frame 13
  3000 delay # Frame 14
  return

# Sequence 6
sub Sequence_6
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6464 frame_0 # Frame 1
  4026 frame_1 # Frame 3
  8120 7200 frame_0_1 # Frame 5
  3000 delay # Frame 6
  return

# Sequence 7
sub Sequence_7
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  4864 frame_2 # Frame 1
  8064 frame_2 # Frame 3
  6464 7100 frame_0_2 # Frame 5
  8120 frame_0 # Frame 7
  3000 delay # Frame 8
  return
  
# Sequence 8
sub Sequence_8
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6651 frame_0 # Frame 1
  9984 frame_0 # Frame 3
  7044 4464 frame_0_1 # Frame 5
  9370 frame_1 # Frame 7
  8048 frame_2 # Frame 9
  5081 frame_2 # Frame 11
  8120 7200 7100 frame_0..2 # Frame 13
  3000 delay # Frame 14
  return

# Sequence 9
sub Sequence_9
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6464 4172 frame_0_1 # Frame 1
  9984 frame_1 # Frame 3
  8958 frame_0 # Frame 5
  7181 frame_0 # Frame 7
  8120 7200 frame_0_1 # Frame 9
  3000 delay # Frame 10
  return

# Sequence 10
sub Sequence_10
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  4864 frame_2 # Frame 1
  8064 frame_2 # Frame 3
  9078 7100 frame_1_2 # Frame 5
  5369 frame_1 # Frame 7
  7200 frame_1 # Frame 9
  return

sub frame_0..5
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  3000 delay
  return

sub frame_1
  1 servo
  6000 delay
  return

sub frame_0
  0 servo
  6000 delay
  return

sub frame_0_1
  1 servo
  0 servo
  6000 delay
  return

sub frame_1_2
  2 servo
  1 servo
  6000 delay
  return

sub frame_2
  2 servo
  6000 delay
  return

sub frame_0_2
  2 servo
  0 servo
  6000 delay
  return

sub frame_0..2
  2 servo
  1 servo
  0 servo
  6000 delay
  return

If you need much more than that, you might consider upgrading to a 12-channel Mini Maestro, which has 8 times the memory for script storage (8KB vs 1KB).

Brandon

I read this section, but I guess I didn’t quite understand it. The 3000 delays that repeat are meant to pause briefly after each movement so they don’t all happen at once. The droid looks right – waits briefly – looks down – waits briefly – looks left – waits briefly – and then returns to its starting position.

If there’s a way to write this without changing the sequence, that would be great.

Oh yes, is there any way to prevent the servos from jerking into position when switched on?

It happened recently that the power cut out mid-movement. And when it came back on, the servo jerked back to its starting position. It was a 12V 150kg servo. It has considerable power and tore off part of the drone in the process.

I know that the Maestros can’t retain a position when there’s no power.

So how can this be prevented? I was hoping to achieve this by slowing down the movement, but that only activates after the Maestro receives power again following the initial movement.

Hello.

As I described in my previous post, all I did was combine the delay commands that you were using into one (e.g. your subroutine already ended in a 3 second delay, then you called a separate 3 second delay afterward, so I just made that one 6 second delay instead). So, the script in my previous post should function identically to the last one you posted.

Unfortunately, the Maestro’s speed and acceleration limiting cannot be applied to the first movement after powering up. To slow down the servo movement, the Maestro breaks the movement up into many smaller incremental moves, and to do that calculation it needs to know the current position of the servo. Since servos do not make their position information available to the controller, the Maestro must assume that the servo is at the position it is sending. The best way to make sure the servos do not jerk suddenly on power up would be to have a power down routine that puts the servos in a specific position and have the Maestro start by sending that position to sync them up more gracefully.

Brandon

Ah, that means I don’t need to insert a 3000 delay after every movement, but a 6000 or 9000 at the end is sufficient?

It sounds like you are describing the modification I made correctly. To clarify, the code I posted already has that modification done and you should not need to make any further modifications to get it to behave the same as your original code.

Brandon

Thank you very much. Here is my current code, which I haven’t been able to test yet because I still need to do some work on the hardware.

begin
  Sequence_0
  10 delay_minutes

  Sequence_1
  10 delay_minutes

  Sequence_2
  10 delay_minutes

  Sequence_3
  10 delay_minutes

  Sequence_4
  10 delay_minutes

  Sequence_5
  10 delay_minutes

  Sequence_6
  10 delay_minutes

  Sequence_7
  10 delay_minutes

  Sequence_8
  10 delay_minutes

  Sequence_9
  10 delay_minutes

  Sequence_10
  10 delay_minutes
repeat

sub delay_seconds
  begin dup while      
    1 minus 1000 delay
  repeat
  drop return 
 
sub delay_minutes
  begin dup while
    1 minus 60 delay_seconds
  repeat
  drop return 

# Sequence 0
sub Sequence_0
  8120 7209 7100 0 0 0 frame_0..5 # Frame 0
  9984 frame_1 # Frame 1
  6464 frame_0 # Frame 3
  3968 frame_1 # Frame 5
  3000 delay # Frame 6
  8120 7200 frame_0_1 # Frame 7
  3000 delay # Frame 8
  return
  
# Sequence 1
sub Sequence_1
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3968 5236 frame_1_2 # Frame 1
  8017 frame_2 # Frame 3
  6464 frame_0 # Frame 5
  9984 7100 frame_1_2 # Frame 7
  8120 7200 frame_0_1 # Frame 9
  3000 delay # Frame 10 
  return
  
# Sequence 2
sub Sequence_2
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6464 frame_0 # Frame 1
  9984 frame_0 # Frame 3
  6771 3968 frame_0_1 # Frame 5
  8064 frame_2 # Frame 7
  5866 7100 frame_1_2 # Frame 9
  8120 8757 frame_0_1 # Frame 11
  6959 frame_0 # Frame 13
  8120 7200 frame_0_1 # Frame 15
  3000 delay # Frame 16
  return
  
# Sequence 3
sub Sequence_3
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  3968 frame_1 # Frame 1
  8064 frame_2 # Frame 3
  6464 frame_0 # Frame 5
  8120 frame_0 # Frame 7
  9984 4864 frame_1_2 # Frame 9
  7200 7100 frame_1_2 # Frame 11
  3000 delay # Frame 12
  return

# Sequence 4
sub Sequence_4
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  4000 frame_1 # Frame 1
  8000 frame_1 # Frame 3
  6839 9984 frame_0_1 # Frame 5
  8120 7200 frame_0_1 # Frame 7
  4864 frame_2 # Frame 9
  8064 frame_2 # Frame 11
  7100 frame_2 # Frame 13
  3000 delay # Frame 14
  return

# Sequence 5
sub Sequence_5
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  9984 frame_1 # Frame 1
  6464 frame_0 # Frame 3
  9984 frame_0 # Frame 5
  8120 5702 frame_0_2 # Frame 7
  5428 7830 frame_1_2 # Frame 9
  6686 3968 frame_0_1 # Frame 11
  8120 7200 7100 frame_0..2 # Frame 13
  3000 delay # Frame 14
  return

# Sequence 6
sub Sequence_6
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6464 frame_0 # Frame 1
  4026 frame_1 # Frame 3
  8120 7200 frame_0_1 # Frame 5
  3000 delay # Frame 6
  return

# Sequence 7
sub Sequence_7
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  4864 frame_2 # Frame 1
  8064 frame_2 # Frame 3
  6464 7100 frame_0_2 # Frame 5
  8120 frame_0 # Frame 7
  3000 delay # Frame 8
  return
  
# Sequence 8
sub Sequence_8
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6651 frame_0 # Frame 1
  9984 frame_0 # Frame 3
  7044 4464 frame_0_1 # Frame 5
  9370 frame_1 # Frame 7
  8048 frame_2 # Frame 9
  5081 frame_2 # Frame 11
  8120 7200 7100 frame_0..2 # Frame 13
  3000 delay # Frame 14
  return

# Sequence 9
sub Sequence_9
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  6464 4172 frame_0_1 # Frame 1
  9984 frame_1 # Frame 3
  8958 frame_0 # Frame 5
  7181 frame_0 # Frame 7
  8120 7200 frame_0_1 # Frame 9
  3000 delay # Frame 10
  return

# Sequence 10
sub Sequence_10
  8120 7200 7100 0 0 0 frame_0..5 # Frame 0
  4864 frame_2 # Frame 1
  8064 frame_2 # Frame 3
  9078 7100 frame_1_2 # Frame 5
  5369 frame_1 # Frame 7
  7200 frame_1 # Frame 9
  return

sub frame_0..5
  5 servo
  4 servo
  3 servo
  2 servo
  1 servo
  0 servo
  3000 delay
  return

sub frame_1
  1 servo
  6000 delay
  return

sub frame_0
  0 servo
  6000 delay
  return

sub frame_0_1
  1 servo
  0 servo
  6000 delay
  return

sub frame_1_2
  2 servo
  1 servo
  6000 delay
  return

sub frame_2
  2 servo
  6000 delay
  return

sub frame_0_2
  2 servo
  0 servo
  6000 delay
  return

sub frame_0..2
  2 servo
  1 servo
  0 servo
  6000 delay
  return

But as an example, here’s a video of the finished B1. You can see how the movements work and that there’s a short pause between them.

That’s exactly how I want it to be for this new code.

I haven’t tested this new version of the code on the B1 yet, as there was enough memory there.
B1 Head move

The shortening with the corresponding subroutines is extremely helpful, even if it’s difficult for me to understand. I’m more of a builder than a programmer.

1 Like

Hi, I’ve finally adjusted all the sequences and they’re working. No error message is displayed, but the 10-minute pause isn’t there. The sequences run through without the pause. What did I miss?

### Sequence subroutines: ###

begin
  Sequence_0
  10 delay_minutes

  Sequence_1
  10 delay_minutes

  Sequence_2
  10 delay_minutes

  Sequence_3
  10 delay_minutes

  Sequence_4
  10 delay_minutes

  Sequence_5
  10 delay_minutes

  Sequence_6
  10 delay_minutes

  Sequence_7
  10 delay_minutes

  Sequence_8
  10 delay_minutes

  Sequence_9
  10 delay_minutes
repeat

### Long delay subroutines ###

sub delay_seconds
  begin dup while      # Prüfen, ob der Zähler Null erreicht hat
    1 minus 1000 delay # Eins subtrahieren und 1 Sekunde verzögern
  repeat
  drop return          # Die 0 vom Stack entfernen und zurückkehren
 
sub delay_minutes
  begin dup while
    1 minus 60 delay_seconds # Eins subtrahieren und 1 Minute verzögern
  repeat
  drop return  # Die 0 vom Stack entfernen und zurückkehren

# Sequence 0
sub Sequence_0
begin
  3000 8001 5428 7316 0 0 0 frame_0..5 # Frame 0
  3000 6935 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 7232 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 8120 5200 frame_0_1 # Frame 5
  30000 delay # Frame 6
    
# Sequence 1
sub Sequence_1
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 6132 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 3776 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 5200 8075 frame_1_2 # Frame 5
  3000 delay # Frame 6
  3000 7140 frame_0 # Frame 7
  3000 delay # Frame 8
  3000 8120 7316 frame_0_2 # Frame 9
  30000 delay # Frame 10
  
# Sequence 2
sub Sequence_2
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 6730 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 8120 frame_0 # Frame 3
  30000 delay # Frame 4
  
# Sequence 3
sub Sequence_3
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 7097 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 7561 3776 6603 frame_0..2 # Frame 3
  3000 delay # Frame 4
  3000 8120 5200 7316 frame_0..2 # Frame 5
  30000 delay # Frame 6
 
# Sequence 4
sub Sequence_4
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 6863 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 8120 frame_0 # Frame 3
  30000 delay # Frame 4
    

# Sequence 5
sub Sequence_5
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 8576 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 7038 frame_0 # Frame 3
  3000 delay # Frame 4
  3000 4312 7316 frame_1_2 # Frame 5
  3000 delay # Frame 6
  3000 7427 6829 frame_0_1 # Frame 7
  3000 delay # Frame 8
  3000 8120 5200 frame_0_1 # Frame 9
  30000 delay # Frame 10
  
# Sequence 6
sub Sequence_6
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 3960 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 7232 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 7089 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 8120 5200 frame_0_1 # Frame 7
  30000 delay # Frame 8
  
# Sequence 7
sub Sequence_7
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 8275 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 6160 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 7316 frame_2 # Frame 5
  30000 delay # Frame 6
 
# Sequence 8
sub Sequence_8
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 7079 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 6896 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 8120 5200 frame_0_1 # Frame 5
  30000 delay # Frame 6
  
# Sequence 9
sub Sequence_9
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 8090 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 5817 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 7366 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 7316 frame_2 # Frame 7
  3000 delay # Frame 8
  3000 6617 frame_0 # Frame 9
  3000 delay # Frame 10
  3000 7960 4396 frame_0_1 # Frame 11
  3000 delay # Frame 12
  3000 8120 5200 frame_0_1 # Frame 13
  30000 delay # Frame 14
 repeat

sub frame_0..5
  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_0_1
  1 servo
  0 servo
  delay
  return

sub frame_2
  2 servo
  delay
  return

sub frame_1_2
  2 servo
  1 servo
  delay
  return

sub frame_0_2
  2 servo
  0 servo
  delay
  return

sub frame_0..2
  2 servo
  1 servo
  0 servo
  delay
  return

Hello.

I found a few issues with your script.

  1. In Sequence_0 remove the begin statement at the top of the subroutine code,
  2. Sequence_9 subroutine ends with a repeat command; replace this with a return.
    • The combination of that and the begin from Sequence_0 were making a new loop that your code was getting stuck in instead of returning to the main loop.
  3. Make sure that all of your subroutines end with a return so that the Maestro returns to the main loop after each subroutine completes.

By the way, I found these issues by using the Maestro Control Center’s “Step script” button to go through your script one line at a time to see what was going on, making sure to pay attention to what the stack showed at each step. So, in case it is not already part of your troubleshooting procedure, I recommend doing that if you continue having issues.

- Patrick

1 Like

I did indeed use the “Step script” button. The script then ran completely, but without an error message and without the 10-minute pause.

I’ve now removed the begin statement and replaced the repeat with a return statement.

Furthermore, I’ve added a return statement to each subroutine.

I’ll be back in the workshop on Monday and will gladly test it. I hope that solves the problem.

Hi, thank you so much for your help. The script finally works! Except for one small thing: it’s not repeating.

The individual sequences run through without any problems. I set the time to 3 minutes and let it run completely. But after sequence 9, it doesn’t start again; instead, it stops and outputs the code 0x0080.

Therefore, I had to start this and repeat that. I thought that’s how the loop begins. Do I need to replace the last return with a repeat?

### Sequence subroutines: ###

  Sequence_0
  3 delay_minutes

  Sequence_1
  3 delay_minutes

  Sequence_2
  3 delay_minutes

  Sequence_3
  3 delay_minutes

  Sequence_4
  3 delay_minutes

  Sequence_5
  3 delay_minutes

  Sequence_6
  3 delay_minutes

  Sequence_7
  3 delay_minutes

  Sequence_8
  3 delay_minutes

  Sequence_9
  3 delay_minutes
return

### Long delay subroutines ###

sub delay_seconds
  begin dup while      # Prüfen, ob der Zähler Null erreicht hat
    1 minus 1000 delay # Eins subtrahieren und 1 Sekunde verzögern
  repeat
  drop return          # Die 0 vom Stack entfernen und zurückkehren
 
sub delay_minutes
  begin dup while
    1 minus 60 delay_seconds # Eins subtrahieren und 1 Minute verzögern
  repeat
  drop return  # Die 0 vom Stack entfernen und zurückkehren

# Sequence 0
sub Sequence_0
  3000 8001 5428 7316 0 0 0 frame_0..5 # Frame 0
  3000 6935 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 7232 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 8120 5200 frame_0_1 # Frame 5
  
return
  
# Sequence 1
sub Sequence_1
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 6132 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 3776 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 5200 8075 frame_1_2 # Frame 5
  3000 delay # Frame 6
  3000 7140 frame_0 # Frame 7
  3000 delay # Frame 8
  3000 8120 7316 frame_0_2 # Frame 9
  
return

# Sequence 2
sub Sequence_2
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 6730 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 8120 frame_0 # Frame 3
  
return

# Sequence 3
sub Sequence_3
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 7097 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 7561 3776 6603 frame_0..2 # Frame 3
  3000 delay # Frame 4
  3000 8120 5200 7316 frame_0..2 # Frame 5
  
return

# Sequence 4
sub Sequence_4
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 6863 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 8120 frame_0 # Frame 3
  
return  

# Sequence 5
sub Sequence_5
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 8576 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 7038 frame_0 # Frame 3
  3000 delay # Frame 4
  3000 4312 7316 frame_1_2 # Frame 5
  3000 delay # Frame 6
  3000 7427 6829 frame_0_1 # Frame 7
  3000 delay # Frame 8
  3000 8120 5200 frame_0_1 # Frame 9
  
return

# Sequence 6
sub Sequence_6
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 3960 frame_1 # Frame 1
  3000 delay # Frame 2
  3000 7232 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 7089 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 8120 5200 frame_0_1 # Frame 7
  
return  

# Sequence 7
sub Sequence_7
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 8275 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 6160 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 7316 frame_2 # Frame 5
  
return

# Sequence 8
sub Sequence_8
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 7079 frame_0 # Frame 1
  3000 delay # Frame 2
  3000 6896 frame_1 # Frame 3
  3000 delay # Frame 4
  3000 8120 5200 frame_0_1 # Frame 5
  30000 delay # Frame 6
  
return

# Sequence 9
sub Sequence_9
  3000 8120 5200 7316 0 0 0 frame_0..5 # Frame 0
  3000 8090 frame_2 # Frame 1
  3000 delay # Frame 2
  3000 5817 frame_2 # Frame 3
  3000 delay # Frame 4
  3000 7366 frame_0 # Frame 5
  3000 delay # Frame 6
  3000 7316 frame_2 # Frame 7
  3000 delay # Frame 8
  3000 6617 frame_0 # Frame 9
  3000 delay # Frame 10
  3000 7960 4396 frame_0_1 # Frame 11
  3000 delay # Frame 12
  3000 8120 5200 frame_0_1 # Frame 13
  30000 delay # Frame 14
  
return

sub frame_0..5
  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_0_1
  1 servo
  0 servo
  delay
  return

sub frame_2
  2 servo
  delay
  return

sub frame_1_2
  2 servo
  1 servo
  delay
  return

sub frame_0_2
  2 servo
  0 servo
  delay
  return

sub frame_0..2
  2 servo
  1 servo
  0 servo
  delay
  return

It seems like the main code for your script (the content currently under ### Sequence subroutines: ###) is no longer set up as a loop, so try adding a begin to the top of that and replace the return at the end of that section with a repeat. By the way, “### Sequence subroutines: ###” is probably a bad label for your main code (or at minimum, it is a label in the wrong place), so I would also recommend relabelling that as something like ### Main loop: ###. After making those modifications to your code, it should look something like this:

### Main loop: ###

begin
  Sequence_0
  3 delay_minutes

  Sequence_1
  3 delay_minutes

  # blah blah blah

  Sequence_9
  3 delay_minutes
repeat


### Long delay subroutines ###

sub delay_seconds
  # Blah blah blah

sub delay_minutes
  # Blah blah blah


### Sequence subroutines: ###

# Sequence 0
sub Sequence_0
  # blah blah blah

# and so on...

- Patrick

1 Like

Finally, thank you so much! Adding begin and repeat was the last step. Now everything works: the time delay, the pauses, the speed, and the repetitions.

I can now focus on the next Maestro.

2 Likes