Go Down

Topic: servo (Read 21183 times) previous topic - next topic

taper

no gracias a ti

noter

A ver si hay suerte.
Code: [Select]



const int LED =4 ,LED2 = 3,LED3 = 2,LED4 = 1,
      PAP1=8, PAP2=9, PAP3=10, PAP4=11;
const int pasosPorVuelta = 512;
const int velocidad=1200;
int pasoActual=0;
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
const int BUTTON = 7;
 
int val = 0;
int old_val = 0;
bool state = false;
 
 
void setup(){
      pinMode(LED, OUTPUT);
      pinMode(LED2, OUTPUT);
      pinMode(LED3, OUTPUT);
      pinMode(LED4, OUTPUT);
      pinMode(PAP1, OUTPUT);
      pinMode(PAP2, OUTPUT);
      pinMode(PAP3, OUTPUT);
      pinMode(PAP4, OUTPUT);
      pinMode(BUTTON,INPUT);
      step(-50); //Inicio del problema: ¿dónde estamos al arrancar?
}
 
 
void loop()
{
      val = digitalRead(BUTTON);
      if((val ==HIGH) && (old_val == LOW)){
            state = !state;
            if (state){
                  toright();
            } else {
                  toleft();
            }
      }
      old_val = val;
}
 
 
 
void step(int numPasos)
{
        if (numPasos<0){
                while(numPasos<0){
                        pasoActual--;
                        if(pasoActual<0) pasoActual=8;
                        numPasos++;
                        setOutput(pasoActual);
                        delayMicroseconds(velocidad);
                }
        } else {
                while(numPasos>0){
                        pasoActual++;
                        if(pasoActual==8) pasoActual=0;
                        numPasos--;
                        setOutput(pasoActual);
                        delayMicroseconds(velocidad);
                }
        }
}
 
void setOutput(int out)
{
  digitalWrite(PAP1, bitRead(lookup[out], 0));
  digitalWrite(PAP2, bitRead(lookup[out], 1));
  digitalWrite(PAP3, bitRead(lookup[out], 2));
  digitalWrite(PAP4, bitRead(lookup[out], 3));
}
 
void toleft(){
      digitalWrite(LED, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, HIGH);
      step(50); // El problema es saber cuántos pasos hemos de dar
}
 
void toright(){
      digitalWrite(LED,LOW);
      digitalWrite(LED2,HIGH);
      digitalWrite(LED3,HIGH);
      digitalWrite(LED4,LOW);
      step(-50); // Mismo problema
}

taper

hola noter perdona por no haber contestado antes , te mando un pequeño video para ver lo que hace , solo he cambiado  tres cosas y mira


const int LED =4 ,LED2 = 3,LED3 = 2,LED4 = 1,
      PAP1=8, PAP2=9, PAP3=10, PAP4=11;
const int pasosPorVuelta = 512;
const int velocidad=1200;
int pasoActual=0;
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
const int BUTTON = 7;

int val = 0;
int old_val = 0;
bool state = false;


void setup(){
      pinMode(LED, OUTPUT);
      pinMode(LED2, OUTPUT);
      pinMode(LED3, OUTPUT);
      pinMode(LED4, OUTPUT);
      pinMode(PAP1, OUTPUT);
      pinMode(PAP2, OUTPUT);
      pinMode(PAP3, OUTPUT);
      pinMode(PAP4, OUTPUT);
      pinMode(BUTTON,INPUT);
      step(-0); //Inicio del problema: ¿dónde estamos al arrancar?
}


void loop()
{
      val = digitalRead(BUTTON);
      if((val ==HIGH) && (old_val == LOW)){
            state = !state;
            if (state){
                  toright();
            } else {
                  toleft();
            }
      }
      old_val = val;
}



void step(int numPasos)
{
        if (numPasos<0){
                while(numPasos<0){
                        pasoActual--;
                        if(pasoActual<0) pasoActual=8;
                        numPasos++;
                        setOutput(pasoActual);
                        delayMicroseconds(velocidad);
                }
        } else {
                while(numPasos>0){
                        pasoActual++;
                        if(pasoActual==8) pasoActual=0;
                        numPasos--;
                        setOutput(pasoActual);
                        delayMicroseconds(velocidad);
                }
        }
}

void setOutput(int out)
{
  digitalWrite(PAP1, bitRead(lookup[out], 0));
  digitalWrite(PAP2, bitRead(lookup[out], 1));
  digitalWrite(PAP3, bitRead(lookup[out], 2));
  digitalWrite(PAP4, bitRead(lookup[out], 3));
}

void toleft(){
      digitalWrite(LED, HIGH);
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, HIGH);
      step(500); // El problema es saber cuántos pasos hemos de dar
}

void toright(){
      digitalWrite(LED,LOW);
      digitalWrite(LED2,HIGH);
      digitalWrite(LED3,HIGH);
      digitalWrite(LED4,LOW);
      step(-500); // Mismo problema
}

taper

si te fijas al encenderlo siempre se enciende un led verde , pulsas y se pone todo correcto , uno verde y otro rojo

noter

No pasa nada más que al arrancar no le decimos qué hacer con los led. Añade en el setup los digitalWrite a los cuatro led para que inicie como quieres. El gran problema, al igual que con el motor es que no tenemos forma de saber de dónde partimos al encender el arduino, así que debemos decidir qué hacemos en el setup tanto con el motor como con los led. Por ello te decía que tal vez se adapte mejor el servo que el paso a paso.

taper

perdona es que voy bastante liado cuando  tenga un hueco compruebo y subo un video

Go Up