Este é o TAC I, seu objetivo funcional é fazer as leituras das distâncias ao seu redor e calcular o melhor percurso para seguir, desviando dos objetos através dos dados obtidos pelo sonar.
O projeto utilizou:
- 1 placa Arduino UNO Rev 3;
- 1 CI L293D (para a ponte H [imagem]);
- 1 Sensor ultrassônico (ou sonar);
- 1 Servo motor (para a rotação do sonar);
- 1 Bateria de 9v;
- 1 Protoboard;
- 2 Motores DC (neste caso eu retirei os motores de duas gavetas de CD-ROM);
- 2 Rodas de puxar papel de impressora;
- 1 Tampa/chapa de leitor de CD-ROM;
Código-fonte:
#include <Ultrasonic.h>
#include <Servo.h>
#define echoPin 13 //Pino 13 recebe o pulso do echo
#define trigPin 12 //Pino 12 envia o pulso para gerar o echo
//iniciando a função e passando os pinos
Ultrasonic ultrasonic(12,13);
Servo myservo;
void setup(){
Serial.begin(9600); //inicia a porta serial
// pino do servo
myservo.attach(9);
// pinos dos motores
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
// pinos do sonar
pinMode(echoPin, INPUT); // define o pino 13 como entrada (recebe)
pinMode(trigPin, OUTPUT); // define o pino 12 como saida (envia)
//buzzer
pinMode(2, OUTPUT);
}
void loop(){
//seta o pino 12 com um pulso baixo "LOW" ou desligado ou ainda 0
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
//seta o pino 12 com pulso alto "HIGH" ou ligado ou ainda 1
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
//seta o pino 12 com pulso baixo novamente
digitalWrite(trigPin, LOW);
andar();
}// fim do loop
void andar(){
reposicionaServoSonar();
int distancia = lerSonar();
Serial.print("Distancia em CM: ");
Serial.println(distancia);
if (distancia > 25) {
frente();
}else{
posicionaCarroMelhorCaminho();
andar();
}
}
void parar(){
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
}
void re(){
Serial.println("Aplicando a RÉ ");
ligarBuzina();
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
delay(700);
parar();
desligarBuzina();
}
void frente(){
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
delay(200);
parar();
}
void direita(){
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
delay(300);
parar();
}
void esquerda(){
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
delay(300);
parar();
}
//ligar buzzer
void ligarBuzina(){
digitalWrite(2, HIGH);
}
//desligar buzzer
void desligarBuzina(){
digitalWrite(2, LOW);
}
int lerSonar(){
return ultrasonic.Ranging(CM);
}
int calcularDistanciaCentro(){
myservo.write(90); // tell servo to go to position in variable 'pos'
Serial.print("Calculando CENTRO: ");
delay(500);
int leituraDoSonar = lerSonar();
Serial.println( leituraDoSonar);
return leituraDoSonar;
}
int calcularDistanciaDireita(){
myservo.write(10); // tell servo to go to position in variable 'pos'
Serial.print("Calculando DIREITA: ");
delay(600);
int leituraDoSonar = lerSonar();
Serial.println( leituraDoSonar);
return leituraDoSonar;
}
int calcularDistanciaEsquerda(){
myservo.write(180); // tell servo to go to position in variable 'pos'
Serial.print("Calculando ESQUERDA: ");
delay(600);
int leituraDoSonar = lerSonar();
Serial.println( leituraDoSonar);
return leituraDoSonar;
}
char calculaMelhorDistancia(){
int esquerda = calcularDistanciaEsquerda();
int centro = calcularDistanciaCentro();
int direita = calcularDistanciaDireita();
reposicionaServoSonar();
int maiorDistancia = 0;
char melhorDistancia = '0';
if (centro > direita && centro > esquerda){
melhorDistancia = 'c';
maiorDistancia = centro;
}else if (direita > centro && direita > esquerda){
melhorDistancia = 'd';
maiorDistancia = direita;
}else if (esquerda > centro && esquerda > direita){
melhorDistancia = 'e';
maiorDistancia = esquerda;
}
if (maiorDistancia <= 25) {
re();
posicionaCarroMelhorCaminho();
}
reposicionaServoSonar();
return melhorDistancia;
}
void posicionaCarroMelhorCaminho(){
char melhorDist = calculaMelhorDistancia();
Serial.print("Melhor Distancia....: ");
Serial.println(melhorDist);
if (melhorDist == 'c'){
Serial.println("Virando o carro para andar... ");
andar();
}else if (melhorDist == 'd'){
Serial.println("Virando o carro para a direita... ");
direita();
direita();
}else if (melhorDist == 'e'){
Serial.print("Virando o carro para a esquerda... ");
esquerda();
esquerda();
}else{
re();
}
reposicionaServoSonar();
}
void reposicionaServoSonar(){
myservo.write(90);
}
Legal Amigo!
ResponderExcluirParabéns pelo trabalho, eu também havia feito um robô como o seu mais com o Chassi Pronto.
Também gosto muito de programação Arduino.
Olha so, ao compilar da este este erro
ResponderExcluirtac1.ino: In function 'int lerSonar()':
tac1:112: error: 'class Ultrasonic' has no member named 'Ranging'
tac1:112: error: 'CM' was not declared in this scope
na linha
return ultrasonic.Ranging(CM);
sera que a minha biblioteca ultraonic eta errada ou com problemas?
Obrigado
manuel