Table of Contents

RC Offroad Car

Autor

Robert Gogete 331CB

Introducere

Masina controlata de la distanta prin bluetooth.

Descriere generală

O sa contruiesc masina de teren controlata bluetooth prin aplicatie android, cu senzor de proximitate pentru oprire de urgenta. Masina era foarte greu de controlat cand am cumparat-o, avand doar acceleratie digitala, neputand fi modificata viteza. Pe langa asta eu o loveam de multe ori in obiecte asa ca am decis sa ii adaug un senzor de proximitate prin care sa franez de urgenta.

Schemă bloc

Hardware Design

Componente folosite:

Software Design

void setup() 
{
  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(MOTORS, OUTPUT);
  pinMode(MOTORS_DIRECTION, OUTPUT);
  pinMode(SERVO_DIRECTION, OUTPUT);
  pinMode(SERVO_DIRECTION_SPEED, OUTPUT);
  pinMode(PROXIMITY_SENSOR, INPUT_PULLUP);
}

void loop()
{
  readInput();
  resetAtInactivity();
  setMotorSpeed();
  setDirection();
}

void resetAtInactivity()
{
  if (millis() - time > 200)
  {
    controller_y = 50;
    controller_x = 50;
  }
}

void readInput()
{
  if(Serial1.available())  
  {
    time = millis();
    incoming_value = Serial1.read();

    switch(incoming_value)
    {
      case 'X':
        value_type = 1;
        setControllerCoordinates();
        controller_x_auxiliary = 0;
        break;
      case 'Y':
        value_type = 2;
        controller_y_auxiliary = 0;
        break;
      default:
          switch(value_type)
          {
            case 1:
              controller_x_auxiliary *= 10;
              controller_x_auxiliary += incoming_value - '0';
              break;
            case 2:
              controller_y_auxiliary *= 10;
              controller_y_auxiliary += incoming_value - '0';
              break;
          }
        break;
    }
  }   
}

void setMotorSpeed()
{
  int clearPath = digitalRead(PROXIMITY_SENSOR);
  Serial.println(clearPath);
  
  if (controller_y <= 50 && clearPath)
  {
    analogWrite(MOTORS, controller_y * 255 / 50);
    digitalWrite(MOTORS_DIRECTION, HIGH);
  } 
  else if (controller_y > 50)
  {
    analogWrite(MOTORS, (controller_y - 50) * 255 / 50);
    digitalWrite(MOTORS_DIRECTION, LOW);
  }
  else
  {
    analogWrite(MOTORS, 255);
    digitalWrite(MOTORS_DIRECTION, HIGH);
  }
}

void setDirection()
{
  if (controller_x < 25)
  {
    digitalWrite(SERVO_DIRECTION, HIGH);
    digitalWrite(SERVO_DIRECTION_SPEED, LOW);
  } 
  else if (controller_x > 75)
  {
    digitalWrite(SERVO_DIRECTION, LOW);
    digitalWrite(SERVO_DIRECTION_SPEED, HIGH);
  }
  else
  {
    digitalWrite(SERVO_DIRECTION, LOW);
    digitalWrite(SERVO_DIRECTION_SPEED, LOW);
  }
}

void setControllerCoordinates()
{
  controller_x = controller_x_auxiliary;
  controller_y = controller_y_auxiliary;
}

Rezultate Obţinute

Link catre video cu demo (am filmat masinuta in timp ce o controlam din telefon): https://mega.nz/file/IpAE2TqA#ABH6GDGrwyVRfZCJEqUFGSODR-stFDeneov0merYs3o

Concluzii

Proiect pe care l-am facut din placere, din care simt ca am invatat mai multa electronica decat in 2 cursuri.

Download

Export în PDF