Introduction: Carro Ultrassom + Arduino

English version

Diferente do carro segue-linha, que precisa de uma linha no chão para seguir, esse é completamente autônomo, já que consegue saber a distância que as coisas estão dele e desviar delas.

Step 1: Materiais

1 x Sensor Ultrassom HC-SR04

1 x Servo Motor

3 x Botões (usei como sensores de emergência)

1 x Controlador L298N

1 x Chassi

4 x ou 2 x Motores (No meu caso usei os 4 que vieram com o chassi)

1 x Arduino (eu usei e recomendo Mega 2560. OBS: em outras versões de Arduino o funcionamento e as ligações podem variar)

Step 2: Eletrônica

Como o Ultrassom tem um ângulo de visão de 15 graus, usei o servo para ampliar esse campo. Os sensores de emergência, como o nome diz estão ali para o caso de uma emergência, quando um deles é ativado, o carro vai para trás e depois verifica pra qual lado deve ir.

O Servo foi ligado no pino 8 do Arduino

Sensores de Emergência | Arduino

1 = 22

2 = 24

3 = 26

Ultrassom | Arduino

echo = 13

trig = 12

Pinos do Controlador de motor | Arduino

in1 = 6

in2 = 5

ena = 7

in3 = 4

in4 = 3

enb = 2

Step 3: Programação

//Comandos por Serial Monitor
int incomingByte = 0;
//Sensores de emergência
int buttonPin1 = 22;
int buttonPin2 = 24;
int buttonPin3 = 26;
//Servo
const int servo = 8;
//Ultrassom
const int echoPin = 13;
const int trigPin = 12;
//Motores
//Motor A – direita
int in1 = 6;
int in2 = 5;
int ena = 7;
//Motor B – esquerda
int in3 = 4;
int in4 = 3;
int enb = 2;
long duration = 0;
long distanciaFrente = 0;
long distanciaEsquerda = 0;
long distanciaDireita = 0;
void setup ()
{
//Comandos por Serial Monitor
Serial.begin(9600);
//Sensores de emergência
pinMode(buttonPin1,INPUT);
//Servo
pinMode(servo, OUTPUT);
//Ultrassom
Serial.begin(9600);
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
//Motores
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(ena, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enb, OUTPUT);
}
//Motores
// ***** MOTOR *****
//função de nível 1 para movimentação do motor da direita
void nv1_motor_direita(int p_velocidade)
{
int v_in1;
int v_in2;
int t_ena;
int v_velocidade = abs(p_velocidade);
if (p_velocidade>0) { v_in1 = HIGH; v_in2 = LOW; } else { v_in1 = LOW; v_in2 = HIGH; }
if (v_velocidade == 255 || v_velocidade == 0) { t_ena = 1; } else {t_ena = 0 ; }
//aciona motor
digitalWrite(in1, v_in1);
digitalWrite(in2, v_in2);
if (t_ena == 1) { digitalWrite(ena, v_velocidade); } else { analogWrite(ena, v_velocidade); }
}
//função de nível 1 para movimentação do motor da esquerda
void nv1_motor_esquerda(int p_velocidade)
{
int v_in3;
int v_in4;
int t_enb;
int v_velocidade = abs(p_velocidade);
if (p_velocidade>0) { v_in3 = LOW; v_in4 = HIGH; } else { v_in3 = HIGH; v_in4 = LOW; }
if (v_velocidade == 255 || v_velocidade == 0) { t_enb = 1; } else {t_enb = 0 ; }
//aciona motor
digitalWrite(in3, v_in3);
digitalWrite(in4, v_in4);
if (t_enb == 1) { digitalWrite(enb, v_velocidade); } else { analogWrite(enb, v_velocidade); }
}
//***** FIM ACIONAMENTO MOTOR *****
void loop ()
{
incomingByte = 0;
//*****ACIONAMENTO SERVO E ULTRASSOM*****
//*****Esquerda*****
digitalWrite(servo, HIGH);
delayMicroseconds(2000);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(2000);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(2000);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanciaEsquerda = duration /29 /2 ;
Serial.print(“Esquerda: “);
Serial.println(distanciaEsquerda);
//*****Frente*****
digitalWrite(servo, HIGH);
delayMicroseconds(1500);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(1500);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(1500);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = 0;
duration = pulseIn(echoPin, HIGH);
distanciaFrente = duration /29 /2 ;
Serial.print(“Frente: “);
Serial.println(distanciaFrente);
//*****Direita*****
digitalWrite(servo, HIGH);
delayMicroseconds(1000);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(1000);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(1000);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanciaDireita = duration /29 /2 ;
Serial.print(“Direita: “);
Serial.println(distanciaDireita);
//*****Frente*****
digitalWrite(servo, HIGH);
delayMicroseconds(1500);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(1500);
digitalWrite(servo, LOW);
delay(50);
digitalWrite(servo, HIGH);
delayMicroseconds(1500);
digitalWrite(servo, LOW);
//*****FIM DO ACIONAMENTO SERVO E ULTRASSOM*****
//*****ACIONAMENTO MOTOR *****
if ((distanciaFrente<=5) && (distanciaFrente!=0) || (distanciaEsquerda<=5) && (distanciaEsquerda!=0) || (distanciaDireita<=5) && (distanciaDireita!=0)) {
nv1_motor_direita(-255);
nv1_motor_esquerda(-255);
Serial.println(“## Re”);
}
if ((distanciaFrente>20) && (distanciaFrente!=0) && (distanciaEsquerda>20) && (distanciaEsquerda!=0) && (distanciaDireita>20) && (distanciaDireita!=0)){
nv1_motor_direita(255);
nv1_motor_esquerda(255);
Serial.println(“## Frente”);
}
if ((distanciaFrente<=20) && (distanciaFrente>5)) {
if (distanciaDireita=distanciaEsquerda){
nv1_motor_direita(-255);
nv1_motor_esquerda(255);
Serial.print(“## FrenteDireita”);
}
}
if ((distanciaDireita<=20) && (distanciaDireita>5)) {
nv1_motor_direita(255);
nv1_motor_esquerda(-255);
Serial.println(“## Esquerda”);
}
if ((distanciaEsquerda<=20) && (distanciaEsquerda>5)) {
nv1_motor_direita(-255);
nv1_motor_esquerda(255);
Serial.println(“## Direita”);
}
//***** FIM ACIONAMENTO MOTOR *****
//***** SENSORES DE EMERGÊNCIA *****
if (digitalRead(buttonPin1)==LOW) {
nv1_motor_direita(-255);
nv1_motor_esquerda(-255);
delay(3000);
if (distanciaDireita=distanciaEsquerda){
nv1_motor_direita(-255);
nv1_motor_esquerda(255);
Serial.print(“## FrenteDireita”);
}
}
if (digitalRead(buttonPin2)==LOW) {
nv1_motor_direita(-255);
nv1_motor_esquerda(-255);
delay(3000);
if (distanciaDireita=distanciaEsquerda){
nv1_motor_direita(-255);
nv1_motor_esquerda(255);
Serial.print(“## FrenteDireita”);
}
}
if (digitalRead(buttonPin3)==LOW) {
nv1_motor_direita(-255);
nv1_motor_esquerda(-255);
delay(3000);
if (distanciaDireita=distanciaEsquerda){
nv1_motor_direita(-255);
nv1_motor_esquerda(255);
Serial.print(“## FrenteDireita”);
}
}
//***** FIM SENSORES DE EMERGÊNCIA *****
//***** COMANDOS POR SERIAL MONITOR *****
if (Serial.available() > 0) {
incomingByte = Serial.read();
Serial.print(“I received: “);
Serial.println(incomingByte, DEC);
}
//r
if (incomingByte == 114){
nv1_motor_direita(-255);
nv1_motor_esquerda(-255);
delay(1000);
}
//f
if (incomingByte == 102){
nv1_motor_direita(255);
nv1_motor_esquerda(255);
delay(1000);
}
//d
if (incomingByte == 100){
nv1_motor_direita(-255);
nv1_motor_esquerda(255);
delay(1000);
}
//e
if (incomingByte == 101){
nv1_motor_direita(255);
nv1_motor_esquerda(-255);
delay(1000);
}
//s
if (incomingByte == 115){
nv1_motor_direita(0);
nv1_motor_esquerda(0);
delay(1000);
}
//R
if (incomingByte == 82){
nv1_motor_direita(-255);
nv1_motor_esquerda(-255);
delay(3000);
}
//F
if (incomingByte == 70){
nv1_motor_direita(255);
nv1_motor_esquerda(255);
delay(3000);
}
//D
if (incomingByte == 68){
nv1_motor_direita(-255);
nv1_motor_esquerda(255);
delay(3000);
}
//E
if (incomingByte == 69){
nv1_motor_direita(255);
nv1_motor_esquerda(-255);
delay(3000);
}
//S
if (incomingByte == 83){
nv1_motor_direita(255);
nv1_motor_esquerda(-255);
delay(3000);
}
}
First Time Author Contest 2016

Participated in the
First Time Author Contest 2016

Sensors Contest 2016

Participated in the
Sensors Contest 2016

Robotics Contest 2016

Participated in the
Robotics Contest 2016