Why won't my Arduino run the program except when I plug it into a laptop?

I have a 5V-10A power supply for the Arduino to run a robotic arm and control it via Bluetooth through my phone using the HC-05 module. However, when I disconnect the connection between the Arduino and my laptop, I am unable to control the robot arm anymore. I'm not sure why this is happening. Please help me.

Part list: 5V-10A power supply, Adruino Uno R3, HC-05, Robot arm with 7 servor MG996r.

My program:

#include <SoftwareSerial.h>
#include <Servo.h>

Servo servo01;
Servo servo02;
Servo servo03;
SoftwareSerial Bluetooth(3, 4); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX)

int servo1Pos, servo2Pos, servo3Pos; // current position
int servo1PPos, servo2PPos, servo3PPos; // previous position
int servo01SP[50], servo02SP[50], servo03SP[50]; // for storing positions/steps
int speedDelay = 20;
int index = 0;
String dataIn = "";

void setup() {
  servo01.attach(5);
  servo02.attach(6);
  servo03.attach(7);
  
  Bluetooth.begin(9600); // Default baud rate of the Bluetooth module
  Bluetooth.setTimeout(1);
  delay(20);
  // Robot arm initial position
  servo1PPos = 90;
  servo01.write(servo1PPos);
   servo2PPos = 70;
  servo02.write(servo2PPos);
  servo3PPos = 70;
  servo03.write(servo3PPos);
  
}

void loop() {
  // Check for incoming data
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.readString();  // Read the data as string
    
    // If "Base" slider has changed value - Move Servo 1 to position
    if (dataIn.startsWith("s1")) {
      String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120"
      servo1Pos = dataInS.toInt();  // Convert the string into integer
      // We use for loops so we can control the speed of the servo
      // If previous position is bigger then current position
      if (servo1PPos > servo1Pos) {
        for ( int j = servo1PPos; j >= servo1Pos; j--) {   // Run servo down
          servo01.write(j);
          delay(20);    // defines the speed at which the servo rotates
        }
      }
      // If previous position is smaller then current position
      if (servo1PPos < servo1Pos) {
        for ( int j = servo1PPos; j <= servo1Pos; j++) {   // Run servo up
          servo01.write(j);
          delay(20);    // defines the speed at which the servo rotates
        }
      }
      servo1PPos = servo1Pos;
    }
    //Servo2 If "Shoulder" slider has changed value - Move Servo 2 to position
    if (dataIn.startsWith("s2")) {
    String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s2140" to "140"
    servo2Pos = dataInS.toInt();  // Convert the string into integer
    // We use for loops so we can control the speed of the servo
    // If previous position is bigger then current position
    if (servo2PPos > servo2Pos) {
    for ( int j = servo2PPos; j >= servo2Pos; j--) {   // Run servo down
      servo02.write(j);
      delay(50);    // defines the speed at which the servo rotates
    }
  }
    //  If previous position is smaller then current position
    if (servo2PPos < servo2Pos) {
    for ( int j = servo2PPos; j <= servo2Pos; j++) {   // Run servo up
      servo02.write(j);
      delay(50);    // defines the speed at which the servo rotates
    }
  }
  servo2PPos = servo2Pos;
}

   //Servo3 If "Shoulder" slider has changed value - Move Servo 3 to position
if (dataIn.startsWith("s2")) {
  String dataInS = dataIn.substring(2, dataIn.length()); // Extract only the number. E.g. from "s2140" to "140"
  servo3Pos =140 - dataInS.toInt();  // Convert the string into integer
  // We use for loops so we can control the speed of the servo
  // If previous position is bigger then current position
  if (servo3PPos > servo3Pos) {
    for ( int j = servo3PPos; j >= servo3Pos; j--) {   // Run servo down
      servo03.write(j);
      delay(50);    // defines the speed at which the servo rotates
    }
  }
  //  If previous position is smaller then current position
  if (servo3PPos < servo3Pos) {
    for ( int j = servo3PPos; j <= servo3Pos; j++) {   // Run servo up
      servo03.write(j);
      delay(50);    // defines the speed at which the servo rotates
    }
  }
  servo3PPos = servo3Pos;
}


//     If button "SAVE" is pressed
    if (dataIn.startsWith("SAVE")) {
      servo01SP[index] = servo1PPos;  // save position into the array
      index++;                        // Increase the array index
    }
    // If button "RUN" is pressed
    if (dataIn.startsWith("RUN")) {
      runservo();  // Automatic mode - run the saved steps 
    }
     // If button "RESET" is pressed
    if ( dataIn == "RESET") {
      memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
      index = 0;  // Index to 0
    }
  }
}
// Automatic mode custom function - run the saved steps
void runservo() {
  while (dataIn != "RESET") {   // Run the steps over and over again until "RESET" button is pressed
    for (int i = 0; i <= index - 2; i++) {  // Run through all steps(index)
      if (Bluetooth.available() > 0) {      // Check for incomding data
        dataIn = Bluetooth.readString();
        if ( dataIn == "PAUSE") {           // If button "PAUSE" is pressed
          while (dataIn != "RUN") {         // Wait until "RUN" is pressed again
            if (Bluetooth.available() > 0) {
              dataIn = Bluetooth.readString();
              if ( dataIn == "RESET") {     
                break;
              }
            }
          }
        }
        // If speed slider is changed
        if (dataIn.startsWith("ss")) {
          String dataInS = dataIn.substring(2, dataIn.length());
          speedDelay = dataInS.toInt(); // Change servo speed (delay time)
        }
      }
      // Servo 1
      if (servo01SP[i] == servo01SP[i + 1]) {
      }
      if (servo01SP[i] > servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j >= servo01SP[i + 1]; j--) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      if (servo01SP[i] < servo01SP[i + 1]) {
        for ( int j = servo01SP[i]; j <= servo01SP[i + 1]; j++) {
          servo01.write(j);
          delay(speedDelay);
        }
      }
      

    }
  }
}

Here is some image:


Where do the servos get their power from ?

1 Like

Please post a wiring diagram.

1 Like

Is that external voltage going into the top 'shield' there just available for the motors; not available, separate from '5V' (supplied from USB)?

1 Like

Sensor Shield V5.0 - ProtoSupplies

I edited the post and added wiring diagram.

They get from 5V-10A PSU, big yellow wire

1 Like

But, a fictional diagram... there is no shield shown. Or any big yellow wire... however it does look like the answer is in the shield config.

1 Like

I will make one soon.

Pull the yellow jumper first.

1 Like

image

I just edit again, do you know what wrong with the shield and how to fix it?

Sorry, I'm having trouble trying to understand what you mean. English is not my strong suit. Could you please explain the problem in more detail and provide instructions on how to fix it.

I saw it in the photo. I'm referring to the diagram. But, I think you've hit on the solution, if the OP will acknowledge it.

Consult the sensor shield documentation. Use machine translation if you don't understand, but there should be diagrams there to help...

"how to fix it"... see reply #11, it's labelled "SEL"

Thank you.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.