Arduino UNO, Bluethoot, Servo, L298N

Hi been struggeling whit this porsject all day.

I am trying as my first arduino prosject to make a rc car whit a servo.

I made this:Cxemcar (by following this: control rc car smartphone)

That worked, but then I added a servo and started to tinker around a little,

Added this at the right places to see it it would work:

/*
 Arduino Servo Test sketch
*/
#include <Servo.h>
Servo servoMain; // Define our Servo

void setup()
{
 servoMain.attach(10); // servo on digital pin 10
}

void loop()
{
 servoMain.write(45);  // Turn Servo Left to 45 degrees
 delay(1000);          // Wait 1 second
 servoMain.write(67.5);  // Turn Servo Left to 67.5 degrees
 delay(1000);          // Wait 1 second
 servoMain.write(90);  // Turn Servo back to center position (90 degrees)
 delay(1000);          // Wait 1 second
 servoMain.write(112.5);  // Turn Servo Right to 112.5 degrees
 delay(1000);          // Wait 1 second
 servoMain.write(135); // Turn Servo Right to 135 degrees
 delay(1000);          // Wait 1 second
 servoMain.write(90);  // Turn Servo back to center position (90 degrees)
 delay(1000);          // Wait 1 second



I only made the servo work, the rest of the code is as it never was there. This is the total code that I wrote:

[table][tr][td]#include "EEPROM.h"

#define D1 2 // direction of motor rotation 1
#define M1 3 // PWM left motor
#define D2 4 // direction of motor rotation 2
#define M2 5 // PWM right motor
#define HORN 13 // additional channel 1
#include <Servo.h>
Servo servo; // Define our Servo
//#define autoOFF 2500 // milliseconds after which the robot stops when the connection

#define cmdL 'L' // UART-command for left motor
#define cmdR 'R' // UART-command for right motor
#define cmdH 'H' // UART-command for additional channel (for example Horn)
#define cmdF 'F' // UART-command for EEPROM operation
#define cmdr 'r' // UART-command for EEPROM operation (read)
#define cmdw 'w' // UART-command for EEPROM operation (write)

char incomingByte; // incoming data

char L_Data[4]; // array data for left motor
byte L_index = 0; // index of array L
char R_Data[4]; // array data for right motor
byte R_index = 0; // index of array R
char H_Data[1]; // array data for additional channel
byte H_index = 0; // index of array H
char F_Data[8]; // array data for EEPROM
byte F_index = 0; // index of array F
char command; // command

unsigned long currentTime, lastTimeCommand, autoOFF;

void setup() {
  Serial.begin(9600); // initialization UART
  servo.attach(10); // servo on digital pin 10
  pinMode(HORN, OUTPUT); // additional channel
  pinMode(D1, OUTPUT); // output for motor rotation
  pinMode(D2, OUTPUT); // output for motor rotation
    /*EEPROM.write(0,255);
    EEPROM.write(1,255);
    EEPROM.write(2,255);
    EEPROM.write(3,255);*/
  

  timer_init(); // initialization software timer
}

void timer_init() {
  uint8_t sw_autoOFF = EEPROM.read(0); // read EEPROM "is activated or not stopping the car when losing connection"
  if (sw_autoOFF == '1') { // if activated
    char var_Data[3];
    var_Data[0] = EEPROM.read(1);
    var_Data[1] = EEPROM.read(2);
    var_Data[2] = EEPROM.read(3);
    autoOFF = atoi(var_Data) * 100; // variable autoOFF ms
  }
  else if (sw_autoOFF == '0') {
    autoOFF = 999999;
  }
  else if (sw_autoOFF == 255) {
    autoOFF = 2500; // if the EEPROM is blank, dafault value is 2.5 sec
  }
  currentTime = millis(); // read the time elapsed since application start
}

void loop() {
  if (Serial.available() > 0) { // if received UART data
    incomingByte = Serial.read(); // raed byte
    if (incomingByte == cmdL) { // if received data for left motor L
      command = cmdL; // current command
      memset(L_Data, 0, sizeof(L_Data)); // clear array
      L_index = 0; // resetting array index
    }
    else if (incomingByte == cmdR) { // if received data for left motor R
      command = cmdR;
      memset(R_Data, 0, sizeof(R_Data));
      R_index = 0;
    }
    else if (incomingByte == cmdH) { // if received data for additional channel
      command = cmdH;
      memset(H_Data, 0, sizeof(H_Data));
      H_index = 0;
    }
    else if (incomingByte == cmdF) { // if received data for EEPROM op
      command = cmdF;
      memset(F_Data, 0, sizeof(F_Data));
      F_index = 0;
    }
    else if (incomingByte == '\r') command = 'e'; // end of line
    else if (incomingByte == '\t') command = 't'; // end of line for EEPROM op

    if (command == cmdL && incomingByte != cmdL) {
      L_Data[L_index] = incomingByte; // store each byte in the array
      L_index++; // increment array index
    }
    else if (command == cmdR && incomingByte != cmdR) {
      R_Data[R_index] = incomingByte;
      R_index++;
    }
    else if (command == cmdH && incomingByte != cmdH) {
      H_Data[H_index] = incomingByte;
      H_index++;
    }
    else if (command == cmdF && incomingByte != cmdF) {
      F_Data[F_index] = incomingByte;
      F_index++;
    }
    else if (command == 'e') { // if we take the line end
      Control4WD(atoi(L_Data), atoi(R_Data), atoi(H_Data));
      delay(10);
    }
    else if (command == 't') { // if we take the EEPROM line end
      Flash_Op(F_Data[0], F_Data[1], F_Data[2], F_Data[3], F_Data[4]);
    }
    lastTimeCommand = millis(); // read the time elapsed since application start
  }
  if (millis() >= (lastTimeCommand + autoOFF)) { // compare the current timer with variable lastTimeCommand + autoOFF
    Control4WD(0, 0, 0); // stop the car
  }
  {
  servo.write(45);  // Turn Servo Left to 45 degrees
  delay(1000);          // Wait 1 second
  servo.write(67.5);  // Turn Servo Left to 67.5 degrees
  delay(1000);          // Wait 1 second
  servo.write(90);  // Turn Servo back to center position (90 degrees)
  delay(1000);          // Wait 1 second
  servo.write(112.5);  // Turn Servo Right to 112.5 degrees
  delay(1000);          // Wait 1 second
  servo.write(135); // Turn Servo Right to 135 degrees
  delay(1000);          // Wait 1 second
  servo.write(90);  // Turn Servo back to center position (90 degrees)
  delay(1000);          // Wait 1 second
  }
}

void Control4WD(int mLeft, int mRight, uint8_t Horn) {

  bool directionL, directionR; // direction of motor rotation L298N
  byte valueL, valueR; // PWM M1, M2 (0-255)

  if (mLeft > 0) {
    valueL = mLeft;
    directionL = 0;
  }
  else if (mLeft < 0) {
    valueL = 255 - abs(mLeft);
    directionL = 1;
  }
  else {
    directionL = 0;
    valueL = 0;
  }

  if (mRight > 0) {
    valueR = mRight;
    directionR = 0;
  }
  else if (mRight < 0) {
    valueR = 255 - abs(mRight);
    directionR = 1;
  }
  else {
    directionR = 0;
    valueR = 0;
  }

  analogWrite(M1, valueL); // set speed for left motor
  analogWrite(M2, valueR); // set speed for right motor
  digitalWrite(D1, directionL); // set direction of left motor rotation
  digitalWrite(D2, directionR); // set direction of right motor rotation

  digitalWrite(HORN, Horn); // additional channel
}

void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4) {

  if (FCMD == cmdr) { // if EEPROM data read command
    Serial.print("FData:"); // send EEPROM data
    Serial.write(EEPROM.read(0)); // read value from the memory with 0 address and print it to UART
    Serial.write(EEPROM.read(1));
    Serial.write(EEPROM.read(2));
    Serial.write(EEPROM.read(3));
    Serial.print("\r\n"); // mark the end of the transmission of data EEPROM
  }
  else if (FCMD == cmdw) { // if EEPROM data write command
    EEPROM.write(0, z1); // z1 record to a memory with 0 address
    EEPROM.write(1, z2);
    EEPROM.write(2, z3);
    EEPROM.write(3, z4);
    timer_init(); // reinitialize the timer
    Serial.print("FWOK\r\n"); // send a message that the data is successfully written to EEPROM
  }
}

I do want to make my own android app to controll this but haven't gotten that far in the project yet, but was hoping to use this app in the mean while: Google Appstore

Anyone who can help me do this?

Whit this code I manage to go controll the 2 motors but the servo goes strait to 0 and tries to goes longer.

#include "EEPROM.h"

#define D1 2 // direction of motor rotation 1
#define M1 3 // PWM left motor
#define D2 4 // direction of motor rotation 2
#define M2 5 // PWM right motor
#define HORN 13 // additional channel 1
#include <Servo.h>
Servo servo;              // the servo

void Update();




//#define autoOFF 2500 // milliseconds after which the robot stops when the connection

#define cmdL 'L' // UART-command for left motor
#define cmdR 'R' // UART-command for right motor
#define cmdH 'H' // UART-command for additional channel (for example Horn)
#define cmdF 'F' // UART-command for EEPROM operation
#define cmdr 'r' // UART-command for EEPROM operation (read)
#define cmdw 'w' // UART-command for EEPROM operation (write)

char incomingByte; // incoming data

char L_Data[4]; // array data for left motor
byte L_index = 0; // index of array L
char R_Data[4]; // array data for right motor
byte R_index = 0; // index of array R
char H_Data[1]; // array data for additional channel
byte H_index = 0; // index of array H
char F_Data[8]; // array data for EEPROM
byte F_index = 0; // index of array F
char command; // command

unsigned long currentTime, lastTimeCommand, autoOFF;

class Sweeper
{
   Servo servo;              // the servo
   int pos;              // current servo position
   int increment;        // increment to move for each interval
   int  updateInterval;      // interval between updates
   unsigned long lastUpdate; // last update of position

 public:
   Sweeper(int interval)
   {
     updateInterval = interval;
     increment = 1;
   }

   void Attach(int pin)
   {
     servo.attach(pin);
   }

   void Detach()
   {
     servo.detach();
   }

   void Update()
   {
     if ((millis() - lastUpdate) > updateInterval) // time to update
     {
       lastUpdate = millis();
       pos += increment;
       servo.write(pos);
       Serial.println(pos);
       if ((pos >= 90) || (pos <= 0)) // end of sweep
       {
         // reverse direction
         increment = -increment;
       }
     }
   }
};

Sweeper sweeper1(15);


void setup() {
 Serial.begin(9600); // initialization UART
 servo.attach(10); // servo on digital pin 10
 pinMode(HORN, OUTPUT); // additional channel
 pinMode(D1, OUTPUT); // output for motor rotation
 pinMode(D2, OUTPUT); // output for motor rotation
 /*EEPROM.write(0,255);
   EEPROM.write(1,255);
   EEPROM.write(2,255);
   EEPROM.write(3,255);*/
 {
   Serial.begin(9600);
   sweeper1.Attach(10);

 }


 timer_init(); // initialization software timer
}

void timer_init() {
 uint8_t sw_autoOFF = EEPROM.read(0); // read EEPROM "is activated or not stopping the car when losing connection"
 if (sw_autoOFF == '1') { // if activated
   char var_Data[3];
   var_Data[0] = EEPROM.read(1);
   var_Data[1] = EEPROM.read(2);
   var_Data[2] = EEPROM.read(3);
   autoOFF = atoi(var_Data) * 100; // variable autoOFF ms
 }
 else if (sw_autoOFF == '0') {
   autoOFF = 999999;
 }
 else if (sw_autoOFF == 255) {
   autoOFF = 2500; // if the EEPROM is blank, dafault value is 2.5 sec
 }
 currentTime = millis(); // read the time elapsed since application start
}

void loop()

{



 if (Serial.available() > 0) { // if received UART data
   incomingByte = Serial.read(); // raed byte
   if (incomingByte == cmdL) { // if received data for left motor L
     command = cmdL; // current command
     memset(L_Data, 0, sizeof(L_Data)); // clear array
     L_index = 0; // resetting array index
   }
   else if (incomingByte == cmdR) { // if received data for left motor R
     command = cmdR;
     memset(R_Data, 0, sizeof(R_Data));
     R_index = 0;
   }
   else if (incomingByte == cmdH) { // if received data for additional channel
     command = cmdH;
     memset(H_Data, 0, sizeof(H_Data));
     H_index = 0;
   }
   else if (incomingByte == cmdF) { // if received data for EEPROM op
     command = cmdF;
     memset(F_Data, 0, sizeof(F_Data));
     F_index = 0;
   }
   else if (incomingByte == '\r') command = 'e'; // end of line
   else if (incomingByte == '\t') command = 't'; // end of line for EEPROM op

   if (command == cmdL && incomingByte != cmdL) {
     L_Data[L_index] = incomingByte; // store each byte in the array
     L_index++; // increment array index
   }
   else if (command == cmdR && incomingByte != cmdR) {
     R_Data[R_index] = incomingByte;
     R_index++;
   }
   else if (command == cmdH && incomingByte != cmdH) {
     H_Data[H_index] = incomingByte;
     H_index++;
   }
   else if (command == cmdF && incomingByte != cmdF) {
     F_Data[F_index] = incomingByte;
     F_index++;
   }
   else if (command == 'e') { // if we take the line end
     Control4WD(atoi(L_Data), atoi(R_Data), atoi(H_Data));
     delay(10);
   }
   else if (command == 't') { // if we take the EEPROM line end
     Flash_Op(F_Data[0], F_Data[1], F_Data[2], F_Data[3], F_Data[4]);
   }
   lastTimeCommand = millis(); // read the time elapsed since application start
 }
 if (millis() >= (lastTimeCommand + autoOFF)) { // compare the current timer with variable lastTimeCommand + autoOFF
   Control4WD(0, 0, 0); // stop the car
 }

}

void Control4WD(int mLeft, int mRight, uint8_t Horn) {

 bool directionL, directionR; // direction of motor rotation L298N
 byte valueL, valueR; // PWM M1, M2 (0-255)

 if (mLeft > 0) {
   valueL = mLeft;
   directionL = 0;
 }
 else if (mLeft < 0) {
   valueL = 255 - abs(mLeft);
   directionL = 1;
 }
 else {
   directionL = 0;
   valueL = 0;
 }

 if (mRight > 0) {
   valueR = mRight;
   directionR = 0;
 }
 else if (mRight < 0) {
   valueR = 255 - abs(mRight);
   directionR = 1;
 }
 else {
   directionR = 0;
   valueR = 0;
 }

 analogWrite(M1, valueL); // set speed for left motor
 analogWrite(M2, valueR); // set speed for right motor
 digitalWrite(D1, directionL); // set direction of left motor rotation
 digitalWrite(D2, directionR); // set direction of right motor rotation

 digitalWrite(HORN, Horn); // additional channel
}

void Flash_Op(char FCMD, uint8_t z1, uint8_t z2, uint8_t z3, uint8_t z4) {

 if (FCMD == cmdr) { // if EEPROM data read command
   Serial.print("FData:"); // send EEPROM data
   Serial.write(EEPROM.read(0)); // read value from the memory with 0 address and print it to UART
   Serial.write(EEPROM.read(1));
   Serial.write(EEPROM.read(2));
   Serial.write(EEPROM.read(3));
   Serial.print("\r\n"); // mark the end of the transmission of data EEPROM
 }
 else if (FCMD == cmdw) { // if EEPROM data write command
   EEPROM.write(0, z1); // z1 record to a memory with 0 address
   EEPROM.write(1, z2);
   EEPROM.write(2, z3);
   EEPROM.write(3, z4);
   timer_init(); // reinitialize the timer
   Serial.print("FWOK\r\n"); // send a message that the data is successfully written to EEPROM
 }
}

PLEASE edit your post and highlight all the code and click the CODE TAGS ([</>]) toolbutton and then click SAVE.

Still woundering doh