Hola a todos, estoy armando un proyecto con arduino y tengo un sensor E18-D80NK que monte sobre un servo. programe el sensor para detectar obstaculos al frente y el codigo funciona pero cuando le agregue el codigo del servo que hace un paneo de 0 a 180 y de 180 a 0 con un siclo for se me complico, ya que al compilar no me muestra ningun error pero el servo llega a o y vuelve a 180 y se queda ahi y no se mueve mas y no me doy cuenta cual es el error. Como soy nuevo en el mundo de Arduino y es mi primer proyecto es que recurro a ustedes y desde ya muchas gracias. Les comparto el codigo para ver que me dicen. Saludos
#include <Servo.h>
int pos = 0;
int escucha=1;
Servo servo1;
void servosensor();
void sensor();
void setup() {
Serial.begin(9600); //Start serial communication boud rate at 9600
pinMode(5,INPUT); //Pin 5 as signal input
servo1.attach(11);
}
void loop() {
servosensor();
sensor();
}
void servosensor(){
for (pos = 0; pos <= 180; pos += 1) { // inicia el servo en 0 y suma de a uno hasta 180
servo1.write(pos); // escribe donde se encuentra el servo en pos
delay(10); // espera 15ms en el lugar
}
//delay (10);
for (pos = 180; pos >= 0; pos -= 1) { // desiende de 180 a 0
servo1.write(pos);
delay(20);
}
}
void sensor() {
while(escucha==1) {
delay(500);
if(digitalRead(5)==LOW) {
// detecta la colicion
Serial.println(" Collision Detected.");
}
else {
// si no detecta imprime...
Complicas la lectura a quienes te quieren ayudar si no pones el código entre los tags, si además tienes faltas ortográficas (las tienes hasta en los comentarios de tu código) y encima usas expresiones de tu país: (paneo) la cual he tenido que ir a buscar a la RAE.
¿Imaginas que todos hablásemos aquí con los términos y expresiones de cada zona? Además según la RAE se usa sólo para cámaras.
Respecto al error es por hacer copy & paste. Has unido dos cosas y ya.
Resumen a simple vista: una variable inicializada en 1 que no cambia su valor está en la condición del While que a su vez está dentro de la estructura loop.
El código hace lo que tú le has dicho, mueve el servo y después entra en un bucle infinito (sin salida) donde leerá el valor pero con un pedazo delay() de medio segundo.
Con lo cual aparte te invito a revisar la función millis() o micros() entre otras cosas.
Además no tiene sentido que el servo se mueva todo el rato, deberá moverse cuando la función sensor() retorne un boolean con el valor del infrarrojo.
EDITO: (ahora que tengo tiempo)
Quita el While que es el causante del problema al no darle una salida (bucle infinito).
Elimina la variable escucha que no la estás usando.
Cambia el void sensor() por boolean sensor() y hazle un return al valor del infarrojo.
Poner if en el loop -> if(sensor()) servosensor();
Si se trata de hacer un vehículo que detecte colisiones al girar el servo llamas nuevamente a sensor() y mueve la dirección en base a los ángulos que estén libre (Seleccionar uno / el primero encontrado)
Recomendación: usar timers con millis(), no delays