Having problem with arduino motor shield

Hi guys, I am using an Arduino motor shield in my robot and using 433 mhz rf modules to control it using remote. The problem is that when it is given forward command, the robot keeps running forward and doesn't take any other command, and same problem is with left, right and back command too. Please help...

(Shoot, grip and release commands are working as expected)

Below is the code of the robot.

#include <AFMotor.h>
#include <Servo.h>
#include <RH_ASK.h>
#ifdef RH_HAVE_HARDWARE_SPI
#include <SPI.h> 
#endif
// Motor definitions
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);

// Servo definitions
Servo leftservo;
Servo rightservo;

// Radio driver
RH_ASK driver(2000, 2); 

long lastcommand;
long shooterstart = 0;

// Analog pin for shooter is A0

void forward() {
  // Set motor speeds for forward movement
  motor1.setSpeed(255);
  motor1.run(FORWARD);
  motor2.setSpeed(255);
  motor2.run(FORWARD);
  motor3.setSpeed(255);
  motor3.run(FORWARD);
  motor4.setSpeed(255);
  motor4.run(FORWARD);
}

void back() {
  // Set motor speeds for backward movement
  motor1.setSpeed(255);
  motor1.run(BACKWARD);
  motor2.setSpeed(255);
  motor2.run(BACKWARD);
  motor3.setSpeed(255);
  motor3.run(BACKWARD);
  motor4.setSpeed(255);
  motor4.run(BACKWARD);
}

void left() {
  // Set motor speeds for left turn
  motor1.setSpeed(255);
  motor1.run(BACKWARD);
  motor2.setSpeed(255);
  motor2.run(BACKWARD);
  motor3.setSpeed(255);
  motor3.run(FORWARD);
  motor4.setSpeed(255);
  motor4.run(FORWARD);
}

void right() {
  // Set motor speeds for right turn
  motor1.setSpeed(255);
  motor1.run(FORWARD);
  motor2.setSpeed(255);
  motor2.run(FORWARD);
  motor3.setSpeed(255);
  motor3.run(BACKWARD);
  motor4.setSpeed(255);
  motor4.run(BACKWARD);
}

void stop() {
  // Stop all motors
  motor1.setSpeed(0);
  motor1.run(RELEASE);
  motor2.setSpeed(0);
  motor2.run(RELEASE);
  motor3.setSpeed(0);
  motor3.run(RELEASE);
  motor4.setSpeed(0);
  motor4.run(RELEASE);
}

void setup() {
  pinMode(A0, OUTPUT);
  digitalWrite(A0, HIGH);

  // Attach servos to pins
  leftservo.attach(10);
  rightservo.attach(9);

  // Set initial servo position
  leftservo.write(90);
  rightservo.write(90);

  // Initialize serial communication for debugging
  Serial.begin(9600);
  Serial.println("Start!");

  // Initialize radio communication
  if (driver.init()) {
    Serial.println("Radio initialized");
  }
}

void loop(){
  if (driver.available()) {
    // Read the incoming message
    char incomingMessage[32];
    leftservo.write(90);
    rightservo.write(90);
    
    uint8_t len = sizeof(incomingMessage);
    if (driver.recv((uint8_t *)incomingMessage, &len)) {
      incomingMessage[len] = '\0'; // Null-terminate the string
      Serial.print("Received: ");
      Serial.println(incomingMessage);

      // Your existing message handling logic here
    } else {
      Serial.println("Receive failed");
    }
      if (strcmp(incomingMessage, "forwardzzzzz") == 0) {
        forward();
      } else if (strcmp(incomingMessage, "backwardzzzz") == 0) {
        back();
      } else if (strcmp(incomingMessage, "leftzzzzzzzz") == 0) {
        left();
      } else if (strcmp(incomingMessage, "rightzzzzzzz") == 0) {
        right();
      } else if (strcmp(incomingMessage, "shootzzzzzzz") == 0) {
        digitalWrite(A0, !digitalRead(A0));
      } else if (strcmp(incomingMessage, "gripzzzzzzzz") == 0) {
        leftservo.write(0);
        rightservo.write(180);
      } else if (strcmp(incomingMessage, "releasezzzzz") == 0) {
        leftservo.write(180);
        rightservo.write(0);
      }
  }
}

Does incomingMessage change when you try to change the direction, or does it stay the same as the movement?

You can try calling the stop function after adding a delay. Like this:

void loop() {
  if (driver.available()) {
    // Read the incoming message
    char incomingMessage[32];
    leftservo.write(90);
    rightservo.write(90);
    
    uint8_t len = sizeof(incomingMessage);
    if (driver.recv((uint8_t *)incomingMessage, &len)) {
      incomingMessage[len] = '\0'; // Null-terminate the string
      Serial.print("Received: ");
      Serial.println(incomingMessage);

      // Your existing message handling logic here
    } else {
      Serial.println("Receive failed");
    }

    // Handle commands
    if (strcmp(incomingMessage, "forwardzzzzz") == 0) {
      forward();
      delay(500); // Delay for half a second
      stop();     // Stop after the delay
    } else if (strcmp(incomingMessage, "backwardzzzz") == 0) {
      back();
      delay(500);
      stop();
    } else if (strcmp(incomingMessage, "leftzzzzzzzz") == 0) {
      left();
      delay(500);
      stop();
    } else if (strcmp(incomingMessage, "rightzzzzzzz") == 0) {
      right();
      delay(500);
      stop();
    } else if (strcmp(incomingMessage, "shootzzzzzzz") == 0) {
      digitalWrite(A0, !digitalRead(A0));
    } else if (strcmp(incomingMessage, "gripzzzzzzzz") == 0) {
      leftservo.write(0);
      rightservo.write(180);
    } else if (strcmp(incomingMessage, "releasezzzzz") == 0) {
      leftservo.write(180);
      rightservo.write(0);
    }
  }
}

If you want to make a Weemos motor shield later, you can consider this:

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