Parar hasta pulsar un botón

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.

Cuando el servo arranca demanda mucha corriente y puede hacer que el regulador interno del Arduino falle. Intenta usando una fuente independiente para energizar el servo. 4 pilas AA funcionan bien.

Verifica las conexiones del protoboard. Algunos como el de la imagen tienen desconectadas las líneas laterales entre cada mitad.

Hola.

Gracias por tu respuesta. Todo solucionado. Mi protoboard tiene continuidad, no es como la de tu imagen, pero he seguido tu consejo y he aplicado corriente externa al montaje. Con la corriente externa funciona perfectamente. Únicamente he tenido que añadir un retraso, delay(200), detrás del bucle while para evitar que una pulsación del botón equivalga a varios pasos del servo (está claro que el micro es más rápido que yo levantando el dedo del botón). Con eso todo funciona como quería.

Gracias por tu ayuda. Un saludo.

:+1: :clap: :clap: :clap:

Moderador
La solución la proporcionó @mancera no tu, por eso cambié el tilde.

Hola.

Pido disculpas. Pensaba que era yo quien debía cerrar el tema una vez que todo se había resuelto. Ya lo sé para la próxima vez.

Un saludo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.