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 pinosUltrasonic 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 buzzervoid ligarBuzina(){ digitalWrite(2, HIGH); }
//desligar buzzervoid 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