Go Down

Topic: servo strobo rampa [SOLUCIONADO] (Read 169 times) previous topic - next topic

sevillalva

May 05, 2019, 10:27 pm Last Edit: May 12, 2019, 06:08 pm by surbyte
Hola, buenas noches desde Barcelona España. lo primero es agradecer al Sr. Surbyte que gracias a el he podido entrar en este foro.
Bueno soy muy nuevo en esto de Arduino y espero lo tengan en cuenta y por mi parte ajustarme a las normas del foro.
En el sketch que pongo tengo varios errores y no se como arreglarlo, por separado funciona bien pero al juntarlos no, cuando lo pongo en marcha siempre arranca en 90º y quiero que arranque en 0º o 180º y no se como hacerlo, y el strobo cuando pulso el boton1 el strobo funciona, bueno en realidad empieza a funcionar cuando conecto el Aduino, cuando el servo va de 0 a 180 o al reves se para el strobo y luego sigue funcionando,
la idea es que cuando arranque ya sea 0º o 180º este apagado, pulsando boton1 el servo gire de 0º hasta 180º y estrobo encienda hasta que apriete boton2 y se apague y el servo pase de 180º a 0º..
P.D. es para la rampa trasera o porton de un camion o trailer gracias por su ayuda por adelantado
Code: [Select]
[

#include <Servo.h>

Servo servo1;

int pos = 0;      //Posicion del servo que arranque en (0) o en (180) No en (90)
int boton1 = 2;                              //Arriba Rampa
int boton2 = 4;                              //Abajo  Rampa
int estadoLed;                                //guarda el estado del led (encendido o apagado)
int estadoLed1;                              //guarda el estado del led (encendido o apagado)
int periodo = 100;                          // tiempo que esta el LED en alto y bajo
int periodo1 = 50;                          // tiempo que esta el LED en alto y bajo
unsigned long tiempoAnterior = 0;   //guarda tiempo de referencia para comparar
unsigned long tiempoAnterior1 = 0; //guarda tiempo de referencia para comparar

void setup()
{
  servo1.attach(3);
  pinMode(boton1, INPUT);        //configura la salida del boton (Arriba Rampa)
  pinMode(boton2, INPUT);        //configura la salida del boton (Abajo Rampa)
  pinMode(5,OUTPUT);              //configura la salida
  pinMode(6,OUTPUT);              //configura la salida
}
void loop()
{
  if(digitalRead(boton1) == HIGH && digitalRead(boton2) == LOW)
  {
  for(pos = 0; pos <=180 ; pos +=1)      
  {
  servo1.write(pos);      
  delay(10);
  
  }
  }
  if(millis()>tiempoAnterior+periodo){      //si ha transcurrido el periodo programado
    estadoLed=!estadoLed;                       //cambia el estado del led cada 10ms
    digitalWrite(5,estadoLed);                   //actualiza el estado del led
    tiempoAnterior=millis();                      //guarda el tiempo actual como referencia
    }
    if(millis()>tiempoAnterior1+periodo1){  //si ha transcurrido el periodo programado
    estadoLed1=!estadoLed1;                     //cambia el estado del led cada 10ms
    digitalWrite(6,estadoLed1);                   //actualiza el estado del led
    tiempoAnterior1=millis();                     //guarda el tiempo actual como referencia
    }
  if(digitalRead(boton2) == HIGH && digitalRead(boton1) == LOW)
  {
  for(pos = 180; pos >=0 ; pos-=1)
  {
  servo1.write(pos);      
  delay(10);
  
  }
 }
}]

 

RIG

Hola, el problema está en el uso del for(), al igual que  la condicional while() debes tener cuidado como los usas, porque pueden ocasionar cosas como la que te sucede,entras en bucles no deseados, lo que pasa es que cuando presionas el boton, entras al for() y no se ejecutará nada mas que lo que esté adentro de las llaves hasta que se dejen de cumplir las condiciones, por eso es que los led(el estrobo) dejan de destellar hasta que termina de moverse el servo.
Quote
cuando lo pongo en marcha siempre arranca en 90º y quiero que arranque en 0º o 180º y no se como hacerlo,
solo inicializa en el void setup() con la posición deseada.
Quote
pulsando boton1 el servo gire de 0º hasta 180º y estrobo encienda hasta que apriete boton2 y se apague y el servo pase de 180º a 0º..
En éste caso solo tienes que poner la parte que hace destellar los led dentro de la condicion donde quieres que se ejecute.

Partiendo de tu código hice algunos cambios, en el siguiente código el servo solo se moverá mientras mantengas presionado el botón, ya sea el de subir o bajar, y el servo se detiene cuando sueltas el botón, y a la vez el estrobo esta encendido cuando presionas el boton1, básicamente es casi tu mismo código solo quitando el for() y los delay
Code: [Select]

#include <Servo.h>

Servo servo1;

int pos = 0;      //Posicion del servo que arranque en (0) o en (180) No en (90)
int boton1 = 2;                              //Arriba Rampa
int boton2 = 4;                              //Abajo  Rampa
int estadoLed;                                //guarda el estado del led (encendido o apagado)
int estadoLed1;                              //guarda el estado del led (encendido o apagado)
int periodo = 100;                          // tiempo que esta el LED en alto y bajo
int periodo1 = 50;                          // tiempo que esta el LED en alto y bajo
unsigned long tiempoAnterior = 0;   //guarda tiempo de referencia para comparar
unsigned long tiempoAnterior1 = 0; //guarda tiempo de referencia para comparar
unsigned long pausa;


void setup()
{
  servo1.attach(3);
  pinMode(boton1, INPUT);        //configura la salida del boton (Arriba Rampa)
  pinMode(boton2, INPUT);        //configura la salida del boton (Abajo Rampa)
  pinMode(5,OUTPUT);              //configura la salida
  pinMode(6,OUTPUT);              //configura la salida
  servo1.write(0);
}
void loop()
{
  if(digitalRead(boton1) && pos<=180)
  {
   if(millis()-pausa >= 10UL){
     pos++;
     pausa=millis();
   }
   servo1.write(pos);

  if(millis()>tiempoAnterior+periodo){      //si ha transcurrido el periodo programado
    estadoLed=!estadoLed;                       //cambia el estado del led cada 10ms
    digitalWrite(5,estadoLed);                   //actualiza el estado del led
    tiempoAnterior=millis();                      //guarda el tiempo actual como referencia
  }


  if(millis()>tiempoAnterior1+periodo1){  //si ha transcurrido el periodo programado
    estadoLed1=!estadoLed1;                     //cambia el estado del led cada 10ms
    digitalWrite(6,estadoLed1);                   //actualiza el estado del led
    tiempoAnterior1=millis();                     //guarda el tiempo actual como referencia
  }

}
else{
  digitalWrite(6,LOW);
  digitalWrite(5, LOW);
}


if(digitalRead(boton2) && pos >=0)
{

  if(millis()-pausa >= 10UL){
   pos--;
   pausa=millis();
 }
 servo1.write(pos);     
}

}

Ahora en el siguiente, solo necesitas presionar y soltar el boton1 y el servo se movera de 0 a 180° automaticamente hasta llegar a su recorrido, al igual que si presionas el boton2 el servo regresa a 0°, a su vez mientras el servo se mueva mas alla de 0° el estrobo permanece encendido, ademas si presionas los 2 botones al mismo tiempo el servo se detiene cualquiera que sea su posicion
Code: [Select]
#include <Servo.h>

Servo servo1;

int pos = 0;      //Posicion del servo que arranque en (0) o en (180) No en (90)
const byte boton1 = 2;                              //Arriba Rampa
const byte boton2 = 4;                              //Abajo  Rampa
bool estadoLed;                                //guarda el estado del led (encendido o apagado)
bool estadoLed1;                              //guarda el estado del led (encendido o apagado)
unsigned long periodo = 100;                          // tiempo que esta el LED en alto y bajo
unsigned long periodo1 = 50;                          // tiempo que esta el LED en alto y bajo
unsigned long tiempoAnterior = 0;   //guarda tiempo de referencia para comparar
unsigned long tiempoAnterior1 = 0; //guarda tiempo de referencia para comparar
unsigned long pausa;
bool estadoBtn1, anterior1,
     estadoBtn2, anterior2,
     subir, bajar;

void setup()
{
  servo1.attach(3);
  pinMode(boton1, INPUT);        //configura la salida del boton (Arriba Rampa)
  pinMode(boton2, INPUT);        //configura la salida del boton (Abajo Rampa)
  pinMode(5,OUTPUT);              //configura la salida
  pinMode(6,OUTPUT);              //configura la salida
  servo1.write(0);                   //inicias el servo en la posicion deseada
}
void loop()
{
   estadoBtn1=digitalRead(boton1);
   estadoBtn2=digitalRead(boton2);


  if(estadoBtn1 && !anterior1){ //si presionas boton1 el servo sube de 0 a 180°   
       subir=true;
       bajar=false;   
      }
       anterior1=estadoBtn1;

   if(estadoBtn2 && !anterior2){ //si presionas boton 2 el servo baja de 180 a 0°
       bajar=true;
       subir=false;     
       }
      anterior2=estadoBtn2;

    if(estadoBtn1 && estadoBtn2){ //por si quieres detener el servo en alguna posicion intermedia solo presionas los 2 botones al mismo tiempo
    subir=false;
    bajar=false;
    }


    if(pos>0){   //el estrobo estará encendido siempre que el servo este en una posicion mayor a 0°
   
            if(millis() - tiempoAnterior >= periodo){      //si ha transcurrido el periodo programado
            digitalWrite(5, !digitalRead(5));                   //actualiza el estado del led
            tiempoAnterior=millis();                      //guarda el tiempo actual como referencia
              }

           if(millis() - tiempoAnterior1 >= periodo1){  //si ha transcurrido el periodo programado
          digitalWrite(6, !digitalRead(6));                   //actualiza el estado del led
          tiempoAnterior1=millis();                     //guarda el tiempo actual como referencia
             }
     }

     else{          //para evitar que algun led se quede encendido al terminar el estrobo
       digitalWrite(5, LOW);
       digitalWrite(6, LOW); }


     if(subir && millis()-pausa >= 10UL){ 
         
           pos++;
           servo1.write(pos);
           pausa=millis();
            if(pos>=180)
            subir=false;       
      }


     if(bajar && millis()-pausa >= 10UL){
           
           pos--;
           servo1.write(pos);
           pausa=millis();
           if(pos<=0)
            bajar=false;       
      }
 
}




Compara los códigos para que veas los cambios, pruebalos, a mi me compilaron los 2, pero no los probé, espero no tener algun error,  y si tienes alguna duda solo pregunta

sevillalva

Hola, muchas gracias por su ayuda Sr. RIG, los dos codigos funcionan perfectamente y aun no se cual de los dos escojere para mi proyecto, ahora seguire con mi idea,que es ponerles todas las luces e intermitente y servos con ESC a mis camiones y remolques que tengo en escala 1/16 y 1/14.5
Muy agradecido y solucionado
Saludos a todos

Go Up