Go Down

Topic: Problema con servo al arrancar (Read 353 times) previous topic - next topic

dozentBent23

hola chicos! tengo un problema con el servo SG90.

estoy haciendo un proyecto sobre un estacionamiento donde si un sensor me da 0 como entrada digital el servo se mueve 90º luego regresa a 0º, este movimiento lo hace a una velocidad controlada.
el detalle es que cada que se resetea el servo se mueve 90º a su maxima velocidad aun sin haber alguna instruccion que pida eso y regresa a 0º ya con la velocidad controlada.

necesito que no se mueva desde el comienzo, es decir que se mantenga en 0º siempre excepto cuando el sensor detecta algo.

si alguien puede ayudarme a resolver ese detalle se lo agradecere mucho.

Code: [Select]
void entrada(struct pt *pt){
  PT_BEGIN(pt);
  static long t=0;
  //setup
  pinMode(PinSensor1,INPUT);
  servo1.attach(PinServo1);
  //loop
  do{
    servo1.write(0);
    s1 = digitalRead(PinSensor1);
    if(s1!=aux1){
      if(s1==HIGH){
        t=millis();
        PT_WAIT_WHILE(pt, (millis()-t)<2000);
        for(ang1=90;ang1>=0;ang1--){
          servo1.write(ang1);
          t=millis();
          PT_WAIT_WHILE(pt, (millis()-t)<20);
        }
      }else{     
        Serial.println("in");
        for(ang1=0;ang1<=90;ang1++){
          servo1.write(ang1);
          t=millis();
          PT_WAIT_WHILE(pt, (millis()-t)<10);
        }
      }
      aux1 = s1;
      }
    t=millis();
    PT_WAIT_WHILE(pt, (millis()-t)<100);
  }while(true);
  PT_END(pt);
}


nota: estoy usando threads porque son dos servos y necesito que funcionen en paralelo

surbyte

Y a ver.. ya que has puesto un código parcial, te voy a responder parcialmente tmb.
Que te parece que debería hacer el Arduino que ahora no hace cuando se resetea para que el servo mantenga posicion y velocidad?


tauro0221

Hi,
El problema es que no estas condicionando el servo para que vaya a la posicion de 0 cuando inicias el programa. Mira el sketch adjunto.

Code: [Select]
void setup() {
  // put your setup code here, to run once:
  servo.attach(PinServo1); //
  servo.write(0); //lleva el servo a la posicion 0 cuandp empieza el programa.
}

void loop() {
  // put your main code here, to run repeatedly:

}


 



dozentBent23

bueno este es el codigo completo

se trata de dos sensores y dos servos (un par para la entrada del estacionamiento y otro para la salida), en la entrada (1) cuando el servo se mueve (se abre la puerta) manda por serial "in" para que otra app haga sus cosas.

despues en la salida (2) pide un dato a la app por serial, el arduino lo lee y si esta bandera esta en 1 la puerta se abre, de lo contrario se mantiene cerrada, bueno se supone que sea asi
la cosa es que cuando el sensor detecta un auto y con la bandera en 0 pasa un tiempo despues de quitar el obstaculo y el servo hace el mismo movimiento que cuando arranca.

pero cuando la bandera esta en 1 y el sensor detecta algo se habre y cierra con normalidad
por eso pienso que resolviendo el problema de mantener cerrada la puerta desde cuando comienza solucionaria el de la salida

Code: [Select]
#include <Servo.h>
#include <pt.h>

int s1,s2;
int aux1,aux2;
int ang1=0,ang2=0;
const int PinSensor1 = 2, PinSensor2 = 4;
const int PinServo1 = 9, PinServo2 = 10;
Servo servo1;
Servo servo2;

struct pt in;
struct pt out;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  PT_INIT(&in);
  PT_INIT(&out);
}

void loop() {
  // put your main code here, to run repeatedly:
  entrada(&in);
  salida(&out);
}

void entrada(struct pt *pt){
  PT_BEGIN(pt);
  static long t=0;
  //setup
  pinMode(PinSensor1,INPUT);
  servo1.attach(PinServo1);
  //loop
  do{
    s1 = digitalRead(PinSensor1);
    if(s1!=aux1){
      if(s1==HIGH){
        t=millis();
        PT_WAIT_WHILE(pt, (millis()-t)<2000);
        for(ang1=90;ang1>=0;ang1--){
          servo1.write(ang1);
          t=millis();
          PT_WAIT_WHILE(pt, (millis()-t)<20);
        }
      }else{     
        Serial.println("in");
        for(ang1=0;ang1<=90;ang1++){
          servo1.write(ang1);
          t=millis();
          PT_WAIT_WHILE(pt, (millis()-t)<10);
        }
      }
      aux1 = s1;
      }
    t=millis();
    PT_WAIT_WHILE(pt, (millis()-t)<100);
  }while(true);
  PT_END(pt);
}
/*para la puerta de salida es necesario validar que el auto
ha pagado y que el sensor detecte un vehiculo*/
void salida(struct pt *pt){
  PT_BEGIN(pt);
  static long t=0;
  static int pago=0;
  //setup
  pinMode(PinSensor2,INPUT);
  servo2.attach(PinServo2);
  //loop
  do{
    s2 = digitalRead(PinSensor2);
    if(s2!=aux2){
        if(s2==HIGH){
          t=millis();
          PT_WAIT_WHILE(pt, (millis()-t)<2000);
          for(ang2=90;ang2>=0;ang2--){
            servo2.write(ang2);
            t=millis();
            PT_WAIT_WHILE(pt, (millis()-t)<20);
          }
        }
        //bandera que indica si el pago esta hecho
        pago=readData();
        if(s2==LOW&&pago==1){
          Serial.println(" out");
          for(ang2=0;ang2<=90;ang2++){
            servo2.write(ang2);
            t=millis();
            PT_WAIT_WHILE(pt, (millis()-t)<10);
          }
        }
      aux2 = s2;
      }
    t=millis();
    PT_WAIT_WHILE(pt, (millis()-t)<100);
  }while(true);
 
  PT_END(pt);
}
int readData(){//lee un dato meidiante comunicacion serial
  if (Serial.available()){
    int data = Serial.read();
    Serial.write(data);
    if(data==49){
      return 1;
    }else{
      return 0;
    }
  }
}

tauro0221

Hi,
No veo donde en el setup condiconas los servos a se vayan a la posicion 0. Tienes que al empenzar en el setup  el programa pongas los servos donde  deben estar los servos. Cuando los prendes  van estas en cualquier posicion. En el setup anade este comando   servo.write(0); //lleva el servo a la posicion 0 cuandp empieza el programa.

dozentBent23

chicos, he intentado agregar: servo.write(0); en el setup pero sigue comportandose igual:/

tauro0221

Hi,
Tengo una pregunta como un tipo servo SG90
Quote
(un par para la entrada del estacionamiento y otro para la salida), en la entrada (1)
puede abrir una entrada y salida de un estacionamiento.

dozentBent23

#7
Oct 21, 2019, 12:41 am Last Edit: Oct 21, 2019, 12:49 am by surbyte
bueno no es literal es solo en una maqueta

surbyte

Entiendes el código, o solo lo has copiado?

Porque haces esto en entrada y salida

Code: [Select]
pinMode(PinSensor2,INPUT);

Las configuraciones de los pines se hacen en el setup y solo se reprograman cuando ese pin tiene doble funcionalidad Entrada/Salida, sino no tiene sentido que por cada loop tu lo pongas como entrada una y otra vez.

Lo mismo ocurre con esto

Code: [Select]
  servo2.attach(PinServo2);

Para que asignas una y otra vez el Pin al servo, cuando basta con hacerlo una vez en el setup? Son simplemente cuestiones que se hacen de un modo.

Es un error? No, pero es algo evitable.

Cambia algo de lo que ahora no te funciona, por supuesto que no.

Respondo tu consulta:
Bueno, lo que quieres hacer implica que tu sistema tenga una especie de UPS que mantenga la energía cuando se corte la alimentación del Arduino. Si logras eso y lo detetas entonces puedes guardar el estado y al reiniciar leeras ese estado para volver a donde estaba, pero tal como esta hecho lo veo dificil, no iimposible.

Bueno, veo que malentendí tu consulta

Quote
el detalle es que cada que se resetea el servo
Como es que se resetea el servo, no lo entiendo?

AlexLPD

Hola, es una cuestion del Servo, cada que arranca y le llega energía se mueve a su posición 0, esta en el mismo servo y hasta donde yo se, no hay manera de evitarlo sin tener que modificar el mismo,
Lo mas sencillo; poner el 0 del servo en el punto de incio,  mecanicamente y ajustar la posición deseada acorde, de esta manera cada que haya una interrupción el servo se pondra en su lugar de incio.

Espero te ayude.

-Alex.

Go Up