Pages: [1]   Go Down
Author Topic: [Solucionado] Problema servos  (Read 1037 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, tengo un problema con un proyecto que estoy haciendo, se trata de un servo y un sensor, por cada angulo que gira el servo obtengo un dato analógico, es decir: gira un grado, lee; gira otro grado,lee y así hasta 90º, el problema es que el servo no empieza a moverse hasta el paso 17, se queda parado, luego empieza a moverse desde la posición inicial bastante bien.
os escribo el programa:
Quote
#include <Servo.h>
 
Servo myservo;  
 
int pos = 0;    
int ldrPin = 3;  //pin de toma de datos =3 //
int valor = 0;   //valor inicial =0 //


void setup() {
  {Serial.begin(9600);}
        
{
  myservo.attach(9);  
}
 
  
}

void loop(){
  {valor = analogRead(ldrPin);
                                      Serial.println(valor);  
                                      delay(100);  }
  
{for(pos = 0; pos < 1; pos += 1)  
  {                                  
    myservo.write(pos);              
    delay(100);                      
  }
 }  
  {valor = analogRead(ldrPin);
                                      Serial.println(valor);  
                                      delay(100);  }
                                      
{for(pos = 1; pos < 2; pos += 1)  
  {                                  
    myservo.write(pos);              
    delay(100);                      
  }
 }  


{valor = analogRead(ldrPin);
                                      Serial.println(valor);  
                                      delay(100);  }

{for(pos = 2; pos < 3; pos += 1)  
  {                                  
    myservo.write(pos);              
    delay(100);                      
  }
 }  
{valor = analogRead(ldrPin);
                                      Serial.println(valor);  
                                      delay(100);  }

//................................. Sigue así cambiando los angulos..................................................//



{for(pos = 89; pos < 90; pos += 1)  
  {                                  
    myservo.write(pos);              
    delay(100);                      
  }
 }   {valor = analogRead(ldrPin);
                                      Serial.println(valor);  
                                      delay(100);  }
  {for(pos = 90; pos < 0; pos -= 90)  
  {                                  
    myservo.write(pos);              
    delay(100);                      
  }
  }
{while(1);}}
Por favor me seria muy útil vuestra ayuda, ya que estoy empezando y no se mucho.
Muchas gracias.
« Last Edit: November 10, 2011, 05:10:29 pm by dparedesroibas » Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 247
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola dparedesroibas

Sin mirar el código en detalle, me he dado cuenta de que tienes bastantes corchetes recurrentes.
quizás por eso el programa haga cosas un poco raras.

Saludos
Logged


Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 362
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Aparte del tema de los corchetes recurrentes que ha mencionado Inizul, ¿haces un for() para cada angulo?.

Veo más lógico empezar por definir valor como un array para contener las 90 mediciones.

Code:
int valor[90]; // donde se almacenará un entero en cada posición coincidiendo con el ángulo

Y ahora hacemos un bucle for() que recorra todas las posiciones entre 0 o 90 grados almacenando cada valor en el array:

Code:
for (int angulo=0; angulo < 90; angulo++)
{  // ahora si un corchete
  myservo.write(angulo);  // gira 1 grado
  delay(15);   // no hace falta más tiempo para que el servo gire 1 grado
  valor[angulo] = analogRead(ldrPin);  // hacemos la lectura y terminamos
}  // corchete de cierre

Puedes sacar los datos por el puerto serie añadiendo un Serial.print() y un delay() dentro del bucle for() o puedes hacer otro bucle for() que recorra todo el array y muestre los datos uno a uno.

Espero te sea de utilidad.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muchas gracias! si lo supiera antes de tirarme escribiendo3 horas smiley-lol
lo he probado y perfecto, muchas gracias.
¿Por cierto a que os referis con corchetes recurrentes?
Logged

Donostia
Offline Offline
God Member
*****
Karma: 3
Posts: 744
elektronikadonbosco
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Por ejemplo:

Quote
void setup() {
  {Serial.begin(9600);}
       
{
  myservo.attach(9); 
}
 
 
}

cuando con esto es suficiente:

Quote
void setup() {
  Serial.begin(9600);
  myservo.attach(9);
 }

Todo el programa está lleno de corchetes recurrentes. Salu2
Logged

Castellon, España
Offline Offline
Sr. Member
****
Karma: 7
Posts: 362
OR ganizando
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Toma:

http://www.ardumania.es/descargas/

Aquí tienes una guía en castellano con los comandos más utilizados y su sintaxis con ejemplos.

Un saludo
Logged


Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Los corchetes recurrentes solo sirven para darte errores de compilación cuando te dejas uno, no influyen en el funcionamiento del programa.

Para ver con claridad qué instrucciones están dentro de una sentencia, lo mejor es usar el tabulador (indentar o identar, nunca me acuerdo del nombre concreto). Algunos editores (IDEs incluidos) insertan 2 o 4 espacios en blanco por cada tabulación.

un ejemplo en C
Code:
#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
   
    for(i=0; i <10; i++)
    {
       j = random(100);
       if( j % 2 == 0)
       {
           printf("%d: esto es un numero par\n", j);
           i = i  * 2;
       }
       else
       {
           printf("%d: y este es un numero impar\n", j);
           i = i / 2;
       }
    }
    return 0;
}
Así se puede ver qué instrucciones están dentro de cada anidación (entre los corchetes y los tabuladores, se hace más visual).

Lo que no entiendo es que usas el for() para solo una iteración (una vuelta).
Code:

 {valor = analogRead(ldrPin);
                                      Serial.println(valor); 
                                      delay(100);  }
 
{for(pos = 0; pos < 1; pos += 1) 
  {                                   
    myservo.write(pos);             
    delay(100);                     
  }
 }   
  {valor = analogRead(ldrPin);
                                      Serial.println(valor); 
                                      delay(100);  }
                                     
{for(pos = 1; pos < 2; pos += 1) 
  {                                   
    myservo.write(pos);             
    delay(100);                     
  }
 }   

Como bien dice josemanu, es más claro poner;
Code:
for(pos = 0; pos < 90; pos += 1) 
{       
    valor = analogRead(ldrPin);
    Serial.println(valor); 
    delay(100); 

    myservo.write(pos);             
    delay(100);                     
  }

Con eso repites el bucle 90 veces (desde 0 a 89), te queda el código más legible, usas menos espacio en la memoria del procesador y es más fácil encontrar fallos. Consejo, repásate como funcionan los bucles.

Otra cosa, ¿en esto no se te queda el código colgado?

Code:
{while(1);}}

traducido sería, "mientras 1 sea cierto", pero no le das instrucciones para hacer nada, teoricamente, se quedaría ahí en un bucle infinito, esto no lo necesitas, las instrucciones están dentro del "void loop()", con lo que se repetirán constantemente.
« Last Edit: November 10, 2011, 07:27:05 am by PepeChorva » Logged

---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Antes que nada volver a daros las gracias.
Utilizo el for() por que es la forma en que me funciono, no es la mas correcta pero soy novato y todavia tengo que aprender mucho.
con el while pasa lo mismo quiero que el programa al final se pare, que no se repita una y otra vez, esta claro que no es la forma correcta pero me funciona smiley-lol la verdad es que con vuestara ayuda he simplificado todo muchisimo, otra vez muchas gracias
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

El programa me ha simplificado todo muchísimo, pero sigo teniendo el problema de que el servo no empieza a moverse hasta pasado un rato,sin embargo las lecturas empiezan al empezar el programa, ¿que puede ser?¿ Estará roto el servo? Aunque cambie los angulos que se desplaza sigue sin empezar a la vez, no se que hacer.
Gracias de antemano
Logged

Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si quieres que solo lo haga una vez, vale, aunque es matar moscas a cañonazos  smiley-mr-green

para eso, en lugar de void loop() ponle void escaneo() y lo llamas desde setup, es más claro y como dirían los expertos, más elegante smiley-razz

Code:
void setup()
{
    Serial.begin(9600);
    myservo.attach(9); 
 
    escaneo();   
}

void escaneo()
{
    ...
}

void loop()
{}


De esta forma, si luego quieres ampliarle cosas, puedes realizar una llamada a  escanear() cuando te haga falta.

Lo del servo, no se, prueba con el ejemplo del sweep, a ver si realiza todo el barrido.
Logged

---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con el Sweep me hace el barrido entero perfectamente, pero en mi programa no empieza a la vez que empiezan las lecturas,no se que hacer me esta volviendo loco.
Exactamente cuando empieza hace unas 15 lecturas y luego empieza a girar los ángulos que le mando, lo podría utilizar simplemente no haciendo caso a las 15 primeras pero claro no es lo que me gustaría.
Logged

Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Pon el bucle por aquí, a ver si entre todos vemos el fallo.
Logged

---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Esta arriba el programa entero, copiado y pegado, pero bueno ya da igual porque lo he cambiado como me habéis dicho y después de probar varias veces ya funciona, gracias por la ayuda.
Logged

Onda
Offline Offline
Jr. Member
**
Karma: 0
Posts: 91
This is personal...
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

me refería al código corregido, pero si ya va, de lujo  smiley-cool
Logged

---
Saludos,
José Chorva
www.pepechorva.com
@pepechorva on twitter

Pages: [1]   Go Up
Jump to: