Hola.
Estoy intentando hacer un montaje en el que sensor ultrasónico está montado sobre un servo buscando objetos. Uso, además, una pantalla LCD y un zumbador pasivo. El servo gira hasta que se detecta un objeto que está a menos de 30 cm. Cuando lo detecta se para hasta que se pulse un botón y seguirá girando hasta el próximo objeto.
El problema es que no se produce el inicio cuando se pulsa el botón. El servo se queda quieto en esa posición y no inicia de nuevo el giro.
El esquema del montaje es el siguiente:
El código que he desarrollado es el siguiente:
// Librerías
#include "SR04.h" // Librería para el sensor ultrasónico
#include "LiquidCrystal.h" // Librería para la pantalla LCD
#include "pitches.h" // Librería para el zumbador pasivo
#include "Servo.h" // Librería para el servo
//Variables
int angulo = 0; // Ángulo de giro del servo
long t; //Tiempo que tarda el sonido en ir y volver en milisegundos
long d; //Distancia al objeto en centímetros
/* Pantalla LCD:
Conexiones de la pantalla LCD (RS, E, DB4, DB5, DB6, DB7)*/
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
// Servo
Servo myservo; // Crea un objeto llamado myservo
/*Sensor ultrasónico:
Pin 12 para la entrada del sensor (Echo)
Pin 11 para la salida del sensor (Trigger)*/
SR04 sr04 = SR04(12, 11);
void setup()
{
//Sensor ultrasónico
//Inicialización de los puertos del sensor
pinMode(11, OUTPUT);
pinMode(12, INPUT);
//Desactiva la salida del sensor (Trigger)
digitalWrite(11, LOW);
// Pantalla LCD
lcd.begin(16, 2); // Selecciona el número de filas y columnas de la pantalla LCD
lcd.clear(); // Borra la pantalla LCD
// Zumbador pasivo
pinMode(8, OUTPUT); // El zumbador pasivo se conecta al pin 12 de Arduino
// Servo
myservo.attach(9); // Control del servo al pin 9
myservo.write(0); // Mueve el servo a la posición de 0º
//Botón
pinMode(10, INPUT_PULLUP);
}
void loop()
{
digitalWrite(11, HIGH); //Activa la salida del sensor
delayMicroseconds(10); //Envía un pulso de 10 microsegundos
digitalWrite(11, LOW); //Desactiva la salida del sensor
t = pulseIn(12, HIGH); //Obtiene el tiempo transcurrido
d = t*34/2000; //Obtiene la distancia en centímetros
if (d > 30) //No se detecta un obstáculo
{
lcd.clear(); // Borra la pantalla LCD
lcd.setCursor(0, 0); // Posiciona el cursor en la columna 0, fila 0
lcd.print("NO DETECTADO");
lcd.setCursor(0, 1); // Posiciona el cursor en la columna 0, fila 1
lcd.print("Angulo = " + (String) (angulo));
delay(1000);
}
else //Se detecta un obstáculo
{
lcd.clear(); // Borra la pantalla LCD
lcd.setCursor(0, 0); // Posiciona el cursor en la columna 0, fila 0
lcd.print("DETECTADO");
lcd.setCursor(0, 1); // Posiciona el cursor en la columna 0, fila 1
lcd.print("Angulo = " + (String) (angulo));
tone(8, NOTE_A5, 100);
while (digitalRead(10) == HIGH)
{
}
}
angulo += 5; //Incrementa el ángulo en 5º
if (angulo > 180) //Retorna a 0º si se superan los 180º
{
angulo = 0;
}
myservo.write(angulo); // Gira el servo al ángulo indicado
}
El bucle while lo he probado en otro montaje más simple (solo el botón y un led) y ha funcionado correctamente, pero al parecer aquí no funciona.
¿Puede alguien decirme qué es lo que estoy haciendo mal?
Gracias. Un saludo.