Go Down

Topic: Mover Servo y Encender led a la ves (Read 1 time) previous topic - next topic

Eduort

Hola, into hacer que el arduino mueva un servo y prenda un led, pero cuando agrego el codigo del led y mando la señal para que se mueva el servo a veces solo prende el led y el servo no hace el movimiento, este es el codigo que uso:
Quote

#include <Servo.h>
Servo servo1;
int pos1 = 90;

void setup()
   {
     Serial.begin(9600);   
     Serial.flush();
     servo1.attach(2);
     servo1.write(0);
     servo1.write(pos1);
     delay(15);
     pinMode(13,OUTPUT);

void loop()
{
   if (Serial.available() > 0) {         
    data = Serial.read();
    }
   if ((data == 'E') || (data == 'e')) {
   pos1 += 10;
   servo1.write(pos1);         
   delay(15);         
   }
   if ((data == 'F') || (data == 'f')) {
   pos1 -= 10;
   servo1.write(pos1);         
   delay(15);         
   }
   
if (Serial.available()) {         
    data = Serial.read();
   }
   if ((data == 'F') || (data == 'f')) {
   digitalWrite(13, HIGH);   
   delay(15);   
   digitalWrite(13, LOW);   
   delay(15);   
         }

Podrian decirme que esta mal? es todo y gracias de antemano.

ionhs

Primero comentar que arriba pones:
     servo1.write(0);
     servo1.write(pos1);

Pos1=90 por lo que mandas 2 instrucciones seguidas de 0 y 90 no se si tiene alguna utilidad pero yo quitaría una de las dos.

Por otra parte, en el programa yo quitaría el segundo

if (Serial.available()) {         
    data = Serial.read();
   }

que has puesto. De esa manera creo que te funcionaría. Salu2

yOPERO

@Eduort

Tienes que usar lo que se llama time triggered patters.

Básicamente es crear un control de tiempo mediante un tic, luego ejecutas cada función cuando lo necesites. No se ejecutan en paralelo real pero es una simulación cercana.

Aquí tienes una explicación buenísima en español para crear un tic en arduino escrita por IgorR:
http://real2electronics.blogspot.com.es/2011/01/timer-2.html

Y aquí un libro en inglés con explicación exhaustiva de Time-Triggered Patterns
http://www.tte-systems.com/books/pttes


Resumiendo tienes que usar interrupciones y quitar cualquier delay.
Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

Eduort


@Eduort

Tienes que usar lo que se llama time triggered patters.

Básicamente es crear un control de tiempo mediante un tic, luego ejecutas cada función cuando lo necesites. No se ejecutan en paralelo real pero es una simulación cercana.

Aquí tienes una explicación buenísima en español para crear un tic en arduino escrita por IgorR:
http://real2electronics.blogspot.com.es/2011/01/timer-2.html
No le entendi mucho a eso, pero segun

Y aquí un libro en inglés con explicación exhaustiva de Time-Triggered Patterns
http://www.tte-systems.com/books/pttes


Resumiendo tienes que usar interrupciones y quitar cualquier delay.

No podrias decirme un pequeño ejemplo de como hacer eso? esque no tengo mucha experiencia con el arduino y no entendi muy bien lo que dice ahi, y otra duda que tengo, no se podria hacer que se hagan las funcionas seguidas pero con una pequeña diferencia de tiempo?

yOPERO

Si has leído en enlace que te he dado:

http://real2electronics.blogspot.com.es/2011/01/timer-2.html

Verás que tiene  un ejemplo de cómo usar el Timer2 para controlar diferentes tareas.
En ese ejemplo, conmuta el estado de dos pines (pin 13 y pin 2 de Arduino) a dos frecuencias diferentes.

Si tienes poca experiencia te recomendaría probar lo siguiente:

http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

ionhs

Si no te quieres poner a controlar los registros del Timer y las señales que hay que enviar al servo, otra posibilidad es que en vez que esté parpadeando todo el rato el led, haz que se encienda cuando empiece a moverse el servo y cuando se pare se apague el led. Mola más que parpadee pero tiene mucho trabajo.

Eduort


Si no te quieres poner a controlar los registros del Timer y las señales que hay que enviar al servo, otra posibilidad es que en vez que esté parpadeando todo el rato el led, haz que se encienda cuando empiece a moverse el servo y cuando se pare se apague el led. Mola más que parpadee pero tiene mucho trabajo.

Como podria hacer eso? hasta ahora solo logre que cuando envio la señal de movimiento se prenda el LED, pero el problema es que se paga hasta que vuelvo a mandar la señal de que se mueva el servo, entonces podria quedarse encendido aunque el servo ya no se mueva.

ionhs

Ya no se exactamente lo que quieres hacer pero empieza quitando el segundo

Code: [Select]
if (Serial.available()) {         
    data = Serial.read();
   }
   if ((data == 'F') || (data == 'f')) {


que sirve para encender y apagar los leds y mete las instrucciones de encender y apagar los leds donde mandas moverse al servo.

Code: [Select]

digitalWrite(13, HIGH);
servo1.write(pos1);
digitalWrite(13, LOW);


Esto es una idea luego puedes modificarlo a tu gusto. Salu2

Go Up