Randomly Alternate Multiple Servos

I’m using keypad button presses to determine whether the left or right servo motor moves and the delay time in between each move for a total of 5 repetitions. So far I’ve successfully compiled code to move just the left servo (buttons 1-3), just the right servo (buttons 4-6), and alternate left then right (buttons 7-9).

I’d like to include an additional setting that would randomly move the left or right servo motor for keys A-C. I’ve looked into the random() function, but it’s unclear to me how to use it for this scenario. I copied the entire code for reference but have not yet attempted to add the random function for buttons A-C. Can someone provide direction on how to randomize which motor moves? Thanks in advance!

#include <Keypad.h>
#include <Servo.h>
const byte rows = 4; //four rows since the keypad is full
const byte columns = 4; //four columns, same as above
char buttons[rows][columns] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowP[rows] = {9, 8, 7, 6}; //row pins of the keypad
byte columnsP[columns] = {5, 4, 3, 2}; //column pins of the keypad
Keypad pad = Keypad( makeKeymap(buttons), rowP, columnsP, rows, columns );    //create keypad
Servo myServoL;  // 
Servo myServoR;  // 
void setup(){
   Serial.begin(9600);
   myServoL.attach(12);  // attaches the servo on pin 12 to the servo object
   myServoL.write(0);// move servos to center position -> 0°
   myServoR.attach(13);  // attaches the servo on pin 13 to the servo object
   myServoR.write(0);// move servos to center position -> 0°   
}
void loop(){
  char key = pad.getKey();  //get the char from the keypad
      if(key == '1')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("1");
        myServoL.write(120);
        delay(5000);
        myServoL.write(0);
        delay(5000); 
        }               
      }
      if(key == '2')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("2");
        myServoL.write(120);
        delay(2500);
        myServoL.write(0);
        delay(2500); 
        }               
      }
      if(key == '3')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("3");
        myServoL.write(120);
        delay(1000);
        myServoL.write(0);
        delay(1000); 
        }               
      }
      if(key == '4')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("4");
        myServoR.write(120);
        delay(5000);
        myServoR.write(0);
        delay(5000); 
        }               
      }
      if(key == '5')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("5");
        myServoR.write(120);
        delay(2500);
        myServoR.write(0);
        delay(2500); 
        }             
      }
      if(key == '6')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("6");
        myServoR.write(120);
        delay(1000);
        myServoR.write(0);
        delay(1000); 
        }             
      }
      if(key == '7')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("7");
        myServoL.write(120);
        delay(5000);
        myServoL.write(0);
        delay(5000); 
        myServoR.write(120);
        delay(5000);
        myServoR.write(0);
        delay(5000); 
        }             
      }
      if(key == '8')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("8");
        myServoL.write(120);
        delay(2500);
        myServoL.write(0);
        delay(2500); 
        myServoR.write(120);
        delay(2500);
        myServoR.write(0);
        delay(2500); 
        }
      }
      if(key == '9')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("9");
        myServoL.write(120);
        delay(1000);
        myServoL.write(0);
        delay(1000); 
        myServoR.write(120);
        delay(1000);
        myServoR.write(0);
        delay(1000); 
        }
      }
      if(key == '*')
      {
        myServoL.write(120);
        Serial.println("*");
        delay(15);
      }
      if(key == '0')
      {
        myServoL.write(120);
        Serial.println("0");
        delay(15);
      }
      if(key == '#')
      {
        myServoL.write(120);
        Serial.println("#");
        delay(15);
      }
      if(key == 'A')
      {
        myServoL.write(120);
        Serial.println("A");
        delay(15);
      }
      if(key == 'B')
      {
        myServoL.write(120);
        Serial.println("B");
        delay(15);
      }
      if(key == 'C')
      {
        myServoL.write(120);
        Serial.println("C");
        delay(15);
      }
      if(key == 'D')
      {
        myServoL.write(120);
        Serial.println("D");
        delay(15);
      }
    
    
     
}

Untested, thought experiment only.

if key == A then
if(millis() & 0x1) turn left else turn right

Based on the idea millis() bit zero will randomly be T/F when you test it.

Or if you do want to try random() it could perhaps be something like

  if (key == 'A')
  {
    if (random(0, 10) < 5)  myServoL.write(120);
    else   myServoR.write(120);

    Serial.println("A");
    delay(15);
  }

Steve

Thanks for the quick replies. I ended up created “sub-functions” at the beginning for left_slow, right_slow, etc. This made it easier to implement the random function as suggested and it worked like a charm.

if (key == 'A')
      {
        for(int i = 0; i < 5; i++)
         {
          if (random(0, 10) < 5)  left_slow();
          else   right_slow();
        Serial.println("A");
        delay(15);
         }
      }

Below is the full code in case anyone finds it helpful.

#include <Keypad.h>
#include <Servo.h>
const byte rows = 4; //four rows since the keypad is full
const byte columns = 4; //four columns, same as above
char buttons[rows][columns] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowP[rows] = {9, 8, 7, 6}; //row pins of the keypad
byte columnsP[columns] = {5, 4, 3, 2}; //column pins of the keypad
Keypad pad = Keypad( makeKeymap(buttons), rowP, columnsP, rows, columns );    //create keypad
Servo myServoL;  // 
Servo myServoR;  // 
void setup(){
   Serial.begin(9600);
   myServoL.attach(12);  // attaches the servo on pin 12 to the servo object
   myServoL.write(0);// move servos to center position -> 0°
   myServoR.attach(13);  // attaches the servo on pin 13 to the servo object
   myServoR.write(0);// move servos to center position -> 0°   
}
void left_slow(){
        myServoL.write(120);
        delay(5000);
        myServoL.write(0);
        delay(5000); 
}
void left_med(){
        myServoL.write(120);
        delay(2500);
        myServoL.write(0);
        delay(2500); 
}
void left_fast(){
        myServoL.write(120);
        delay(1000);
        myServoL.write(0);
        delay(1000); 
}
void right_slow(){
        myServoR.write(120);
        delay(5000);
        myServoR.write(0);
        delay(5000); 
}
void right_med(){
        myServoR.write(120);
        delay(2500);
        myServoR.write(0);
        delay(2500); 
}
void right_fast(){
        myServoR.write(120);
        delay(1000);
        myServoR.write(0);
        delay(1000); 
}

void loop(){
  char key = pad.getKey();  //get the char from the keypad
      if(key == '1')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("1");
        left_slow();
        delay(15);
        }               
      }
      if(key == '2')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("2");
        left_med();
        delay(15);
        }               
      }
      if(key == '3')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("3");
        left_fast();
        delay(15);
        }               
      }
      if(key == '4')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("4");
        right_slow();
        delay(15);
        }               
      }
      if(key == '5')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("5");
        right_med();
        delay(15);
        }             
      }
      if(key == '6')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("6");
        right_fast();
        delay(15);
        }             
      }
      if(key == '7')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("7");
        left_slow();
        delay(15);
        right_slow();
        delay(15);
        }             
      }
      if(key == '8')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("8");
        left_med();
        delay(15);
        right_med();
        delay(15);
        }
      }
      if(key == '9')
      {
        for(int i = 0; i < 5; i++)
        {
        Serial.println("9");
        left_fast();
        delay(15);
        right_fast();
        delay(15);
        }
      }
      if(key == '*')
      {
        myServoL.write(120);
        Serial.println("*");
        delay(15);
      }
      if(key == '0')
      {
        myServoL.write(120);
        Serial.println("0");
        delay(15);
      }
      if(key == '#')
      {
        myServoL.write(120);
        Serial.println("#");
        delay(15);
      }

  if (key == 'A')
      {
        for(int i = 0; i < 5; i++)
         {
          if (random(0, 10) < 5)  left_slow();
          else   right_slow();
        Serial.println("A");
        delay(15);
         }
      }
 
      if(key == 'B')
      {
        for(int i = 0; i < 5; i++)
         {
          if (random(0, 10) < 5)  left_med();
          else   right_med();
        Serial.println("B");
        delay(15);
         }
      }
      if(key == 'C')
      {
        for(int i = 0; i < 5; i++)
         {
          if (random(0, 10) < 5)  left_fast();
          else   right_fast();
        Serial.println("C");
        delay(15);
         }
      }
      if(key == 'D')
      {
        myServoL.write(120);
        Serial.println("D");
        delay(15);
      }  
}