2 minute read

You can find full code here. This page is just for recording what I learned from the project, so it doesn’t include all the code.

In version 1 of the RC car code, the car cannot drive and steer at the same time. However, by adding the steering slider on the RC app, I was able to solve this problem. The following code receives data from the app and processes it.

  String input;
  String drive;
  String steerStr;
  int steer;
  int commaIndex;
  
  if (BtSerial.available()){
    input = BtSerial.readStringUntil('\n');

  commaIndex = input.indexOf(",");
  drive = input.substring(0, commaIndex);
  steerStr = input.substring(commaIndex + 1);
  steer = steerStr.toInt();

First, Bluetooth must get driving data and steering angle data from RC app. But, Bluetooth module cannot get 2 data at once. So, I have to use a way get a String data. To get a String data, I must use readStringUntil('\n') instead of read().

Arduino don’t know the end of the String data unless I specify the endpoint. (Computers are the same way.) This is why we use the endpoints in low-level languages, and the newline character is the most common type.

  //Stop
  if (drive == "S"){
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    analogWrite(speed_a , 0);
    analogWrite(speed_b , 0);
  }

  //Forward
  else if (drive == "F"){
    //More Left
    if (1 <= steer && steer < 256){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      analogWrite(speed_a, steer);
      analogWrite(speed_b, 255);
    }

    //Neutral and left
    else if (256 <= steer && steer <= 512){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      analogWrite(speed_a, steer - 257);
      analogWrite(speed_b, 255);
    }

    //Right
    else if (513 <= steer && steer <= 768){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      analogWrite(speed_a, 255);
      analogWrite(speed_b, 767 - steer);
    }

    //More Right
    else if (769 <= steer && steer <= 1023){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(speed_a, 255);
      analogWrite(speed_b, steer - 768);
    }
  }

  //Backward
  else if (drive == "B"){
    //More Left
    if (1 <= steer && steer <= 255){
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(speed_a, steer);
      analogWrite(speed_b, 255);
    }

    //Neutral and left
    else if (256 <= steer && steer <= 512){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(speed_a, steer -257);
      analogWrite(speed_b, 255);
    }

    //Right
    else if (513 <= steer && steer <= 767){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      analogWrite(speed_a, 255);
      analogWrite(speed_b, 767 - steer);
    }

    //More right
    else if (769 <= steer & steer <= 1023){
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      analogWrite(speed_a, 255);
      analogWrite(speed_b, steer - 768);
    }
  }
  }
}

After finding a slider UI, the way to steering became so simple. It’s just had to slow down the wheel of side of the turn. Doing the math manually was far too tedious.

Updated:

Leave a comment