terça-feira, 19 de novembro de 2013

Meu primeiro robô utilizando Arduino - TAC I



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);
}

2 comentários:

  1. Legal Amigo!
    Parabé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.

    ResponderExcluir
  2. Olha so, ao compilar da este este erro
    tac1.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

    ResponderExcluir