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.
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.
Versão: 2.1
Compatibilidade: Android 4.1.x+ (Jelly Bean)
Desenvolvedor: Andi.Co
Faça o download do software aqui
// 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);
}
}