Shefarol Soluções Web

Carro 2D Bluetooth - Voltar

Carro 2D Bluetooth

Aqui o objetivo é criar um carro 2D controlado via bluetooth. Isso é feito usando um celular Android habilitado para Bluetooth. Utilizaremos também o software Bluetooth RC Controller que vai facilitar muito nossa programação e o controle do carro passa a ser bem divertido.

Carro 2D Bluetooth
CURIOSIDADE
Visite este site https://sites.google.com/site/bluetoothrccar/ para obter o código do Arduino e o circuito de controle. O aplicativo permite controlar o carro com botões ou com o acelerômetro do telefone. Uma barra deslizante permite controlar a velocidade do seu carro se o circuito de controle do carro tiver esse recurso. Existem também dois botões para luzes dianteiras e traseiras. Uma luz piscante informa quando o telefone está conectado ao carro e setas acendem informando a direção do carro.
Informações

Versão: 2.1
Compatibilidade: Android 4.1.x+ (Jelly Bean)
Desenvolvedor: Andi.Co

 

Download do software

Faça o download do software aqui

 

Telas do aplicativo

Tela 01 - Bluetooth RC Car

Tela 02 - Bluetooth RC Car

Tela 03 - Bluetooth RC Car

Tela 04 - Bluetooth RC Car

Tela 05 - Bluetooth RC Car

 

Sketch básico Carro 2D Bluetooth em Arduino
// Define os pinos de utilização do Driver L298.
const int motorE1  = 9;    
const int motorE2  = 3;    
const int motorD1  = 11;   
const int motorD2  = 10;

// Variaveis para o Buzzer
float seno;
int frequencia;
const int buzzer = 12 ;      // Define o Pino 12 como pino do Buzzer.
const int frontLights = 13;  // Define a porta A0 (pino 14) para o farol da frente.
const int backLights = 8;    // Define a porta A1 (pino 15) para a luz trazeira.

// Define variáveis de estado para as luzes e o buzzer
bool frontLightsState = false;
bool backLightsState = false;
bool buzzerState = false;

// Sensor ultrassônico
const int distancia_carro = 20; // Distancia mínima inicial em centimetros
const int TRIG = A0;
const int ECHO = A1;
 
const int BTState = 2;    // Define o Pino 2 como o pino de comunicação do Bluetooth.
 
// Variáveis Úteis
int i = 0;
int j = 0;
int state_rec;
int vSpeed = 200;         // Define velocidade padrão de 0 até 255.
char state;

// Variável para armazenar o último momento em que o sensor foi verificado
unsigned long lastSensorCheck = 0; 

// Intervalo de tempo entre verificações do sensor (em milissegundos)
const unsigned long sensorInterval = 100; 
 
void setup() {
  // Inicializa as portas como entrada e saída.
  pinMode(motorE1, OUTPUT);
  pinMode(motorE2, OUTPUT);
  pinMode(motorD1, OUTPUT);
  pinMode(motorD2, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(frontLights, OUTPUT);
  pinMode(backLights, OUTPUT);

  // Luzes
  digitalWrite(frontLights, LOW);
  digitalWrite(backLights, LOW);

  // Bluetooth
  pinMode(BTState, INPUT);

  // Configuração do Sensor
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
 
  // Inicializa a comunicação serial em 9600 bits.
  Serial.begin(9600);
}
 
void loop() {

  // Atualiza o tempo atual
  unsigned long currentMillis = millis();
  
  // Para o carro quando a conexão com Bluetooth é perdida ou desconectada.
  if (digitalRead(BTState) == LOW) {
    state_rec = 'S';
  }
 
  // Salva os valores da variável 'state'
  if (Serial.available() > 0) {
    state_rec = Serial.read();
    state = state_rec;
  }

  // Verifica o sensor ultrassônico a cada 100ms
  if (currentMillis - lastSensorCheck >= sensorInterval) {
    lastSensorCheck = currentMillis;

    int distancia = meu_sensor(TRIG, ECHO);

    if (distancia <= distancia_carro) {
      digitalWrite(frontLights, HIGH);
      digitalWrite(backLights, HIGH);
      tocaBuzzer();
      analogWrite(motorE1, 0);
      analogWrite(motorE2, 0);
      analogWrite(motorD1, 0);
      analogWrite(motorD2, 0);
      delay(500);
      analogWrite(motorE1, 0);
      analogWrite(motorE2, vSpeed);
      analogWrite(motorD1, 0);
      analogWrite(motorD2, vSpeed);
      delay(500);
      analogWrite(motorE1, 0);
      analogWrite(motorE2, 0);
      analogWrite(motorD1, 0);
      analogWrite(motorD2, 0);
      noTone(buzzer);
    } else {
      digitalWrite(frontLights, LOW);
      digitalWrite(backLights, LOW);
      noTone(buzzer);
    }
  }

  // Controle dos faróis
  if (state == 'W') {  // Liga os faróis
    frontLightsState = true;
  } else if (state == 'w') {  // Desliga os faróis
    frontLightsState = false;
  }
  digitalWrite(frontLights, frontLightsState);

  // Controle das luzes traseiras
  if (state == 'U') {  // Liga as luzes traseiras
    backLightsState = true;
  } else if (state == 'u') {  // Desliga as luzes traseiras
    backLightsState = false;
  }
  digitalWrite(backLights, backLightsState);

  // Controle do buzzer
  if (state == 'V') {  // Liga o buzzer
    buzzerState = true;
  } else if (state == 'v') {  // Desliga o buzzer
    buzzerState = false;
  }
  if (buzzerState) {
    tone(buzzer, 2000);
  } else {
    noTone(buzzer);
  }
 
  // Altera a velocidade de acordo com valores especificados.
  if (state == '0') {
    vSpeed = 0;
  }
  else if (state == '4') {
    vSpeed = 100;
  }
  else if (state == '6') {
    vSpeed = 155;
  }
  else if (state == '7') {
    vSpeed = 180;
  }
  else if (state == '8') {
    vSpeed = 200;
  }
  else if (state == '9') {
    vSpeed = 230;
  }
  else if (state == 'q') {
    vSpeed = 255;
  }
 
  if (state != 'S') {
    Serial.println(state);
  }

  // 'F', o carro se movimenta para FRENTE
  if (state == 'F') {   
    Serial.println(state);
    analogWrite(motorE1, vSpeed);
    analogWrite(motorE2, 0);
    analogWrite(motorD1, vSpeed);
    analogWrite(motorD2, 0);
  }

  // 'B', o carro se movimenta para TRAS
  else if (state == 'B') {   
    Serial.println(state);
    analogWrite(motorE1, 0);
    analogWrite(motorE2, vSpeed);
    analogWrite(motorD1, 0);
    analogWrite(motorD2, vSpeed);
  }

  // 'S', o carro permanece PARADO
  else if (state == 'S') {   
    //Serial.println(state);
    analogWrite(motorE1, 0);
    analogWrite(motorE2, 0);
    analogWrite(motorD1, 0);
    analogWrite(motorD2, 0);
  }
 
  // 'R', o carro se movimenta para DIREITA
  else if (state == 'R') {
    Serial.println(state);
    analogWrite(motorE1, vSpeed);
    analogWrite(motorE2, 0);
    analogWrite(motorD1, 0);
    analogWrite(motorD2, vSpeed);
  }

  // 'L', o carro se movimenta para ESQUERDA
  else if (state == 'L') { 
    Serial.println(state);
    analogWrite(motorE1, 0);
    analogWrite(motorE2, vSpeed);
    analogWrite(motorD1, vSpeed);
    analogWrite(motorD2, 0);
  }

  // 'G', o carro se movimenta para FRENTE e ESQUERDA
  else if (state == 'G') {   
    Serial.println(state);
    analogWrite(motorE1, vSpeed / 2); // Metade da velocidade
    analogWrite(motorE2, 0); 
    analogWrite(motorD1, vSpeed); // Motor D mantém velocidade completa
    analogWrite(motorD2, 0);
  }

  // 'I', o carro se movimenta para FRENTE e DIREITA
  else if (state == 'I') {  
    Serial.println(state);
    analogWrite(motorE1, vSpeed); // Motor E mantém velocidade completa
    analogWrite(motorE2, 0); 
    analogWrite(motorD1, vSpeed / 2); // Metade da velocidade
    analogWrite(motorD2, 0);
  }
 
  // 'H', o carro se movimenta para TRAS e ESQUERDA
  else if (state == 'H') {  
    Serial.println(state);
    analogWrite(motorE1, 0);
    analogWrite(motorE2, vSpeed / 2);
    analogWrite(motorD1, 0);
    analogWrite(motorD2, vSpeed);
  }
 
  // 'J', o carro se movimenta para TRAS e DIREITA
  else if (state == 'J') {  
    Serial.println(state);
    analogWrite(motorE1, 0);
    analogWrite(motorE2, vSpeed);
    analogWrite(motorD1, 0);
    analogWrite(motorD2, vSpeed / 2);
  }

}


// Função para o funcionamento do sensor
int meu_sensor(int pinotrig, int pinoecho){
  digitalWrite(pinotrig, LOW);
  delayMicroseconds(2);
  digitalWrite(pinotrig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinotrig, LOW);

  return pulseIn(pinoecho, HIGH) / 58;
}


//Função para execução do Alarme Sonoro
void tocaBuzzer(){
  for(int x = 0; x < 180; x++){
    seno = (sin(x * 3.1416 / 180));
    frequencia = 2000 + (int(seno * 1000));
    tone(buzzer, frequencia);
    delay(2);
  }
}

 

Esquema de ligação

Esquema de ligação

 

Lista de materiais