Introduction: Carro Ultrassom + Arduino
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); } }