Go Down

Topic: Necessito ajuda em projeto ultrasônico + Servomotor + LCD (Read 118 times) previous topic - next topic

DBSN

Tive um problema com o meu projeto. A idéia é um sensor ultrassônico colado no atuador de um servomotor com giro de 180 graus (restringido de 15 a 165 graus no projeto), e um LCD para escrever a ditância medida pelo sensor. Eu queria que o LCD mostrasse cada nova medida de distância que o sensor faz a cada grau que ele gira. 15 graus, escreve uma medida, 16 graus, escreve outra, etc. O problema é que o LCD só está transcrevendo as medidas obtidas pelo sensor quando o ciclo de rotação do sensor acaba e volta a posição de 15 graus; de 16 a 165 e voltando de 165 a 16 ele não escreve nada.

Aqui está meu código:

Code: [Select]
#include <LiquidCrystal.h>
#include<Servo.h>
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
int trigPin=8;
int echoPin=9;
float duracao;  //duracao da viagem do ping
float alvoDistancia;
float velocidadeDoSom=1224;
Servo servo;

void setup()
{
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  servo.attach(10);
  lcd.begin (16, 2);
  lcd.setCursor(0,0);
  lcd.print("distancia alvo");
}

void loop(){
  
  digitalWrite(trigPin, LOW);
  delayMicroseconds(200);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(10);
  
  duracao = pulseIn(echoPin, HIGH);  //duracao covertida para microsegundos
  duracao=duracao/1000000.; //convertendo para segundos
  duracao=duracao/3600.; //convertendo pra horas
  alvoDistancia= velocidadeDoSom*duracao;  //velocidade estara em quilometros
  alvoDistancia=alvoDistancia/2; //divide em 2 porque viagem do ping é ida e volta
  alvoDistancia= alvoDistancia*100000;    //converte quilometros em centimetros
  
  lcd.setCursor(0,1);  //colocar cursor na primeira coluna da segunda linha
  lcd.print("                ");//escrever nada para limpar a linha
  lcd.setCursor(0,1);   //colocar cursor na primeira coluna da segunda linha novamente
  lcd.print(alvoDistancia); //escrever ditancia medida
  lcd.print(" cm");  //escrever "cm"
  delay(250);

//rotação do servo
  for(int i=15;i<=165;i++){
    servo.write(i);
    delay(100);}
    
 for(int i=165;i>15;i--){
    servo.write(i);
    delay(100);}
}
  


Eu acho que o problema seja que a rotina de giro do servo impeça as outras partes do programa de rodarem normal, mas saber mesmo oque está errado eu não sei.  

Aqui estão algumas fotos, tenho certeza que o problema não é físico mas é sempre bom mandar...










Se for necessário mandar um vídeo do funcionamento do projeto pra que se entenda melhor oque está errado eu mando.

Tem como alguém me ajudar com esse problema? Agradeço desde já.   :smiley:


tecdiego

  O problema está no "for", tenta entender: você manda o lcd imprimir as informações, seu servo está em 15°, depois de você manda no primeiro "for" ele ir de 15º para 165º, logo em seguida você manda ele de 165° para 15°.
  Quando ele dá o loop o servo está em 15º, logo a leitura que o sensor de distância é quando ele está em 15°.
  O ideal seria a cada ciclo do programa ele incrementasse o valor do grau.

Code: [Select]

#include <LiquidCrystal.h>
#include<Servo.h>
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
const int trigPin=8;
const int echoPin=9;
float duracao;  //duracao da viagem do ping
float alvoDistancia;
float velocidadeDoSom=1224;
Servo servo;
int grauServo = 15;
boolean sentidoGiro = false;


void setup()
{
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  servo.attach(10);
  lcd.begin (16, 2);
  lcd.setCursor(0,0);
  lcd.print("distancia alvo");
}

void loop(){
 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(200);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(10);
 
  duracao = pulseIn(echoPin, HIGH);  //duracao covertida para microsegundos
  duracao=duracao/1000000.; //convertendo para segundos
  duracao=duracao/3600.; //convertendo pra horas
  alvoDistancia= velocidadeDoSom*duracao;  //velocidade estara em quilometros
  alvoDistancia=alvoDistancia/2; //divide em 2 porque viagem do ping é ida e volta
  alvoDistancia= alvoDistancia*100000;    //converte quilometros em centimetros
 
  lcd.setCursor(0,1);  //colocar cursor na primeira coluna da segunda linha
  lcd.print("                ");//escrever nada para limpar a linha
  lcd.setCursor(0,1);   //colocar cursor na primeira coluna da segunda linha novamente
  lcd.print(alvoDistancia); //escrever ditancia medida
  lcd.print(" cm");  //escrever "cm"
  delay(250);

  if((sentidoGiro == false) && (grauServo<165)){

  grauServo++;
 
 } else if ((sentidoGiro == true) && (grauServo>15)){

  grauServo--;
 
 }
   if(grauServo== 165) {
    sentidoGiro = true;
  }

  if (grauServo== 15){
    sentidoGiro = false;
  }

  servo.write(grauServo);
  delay(100);
}
 

Go Up