This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Comunicacion Arduino-serial
#1
Buenas, estoy intentando manejar dos servomotores a traves del monitor serial del ide de arduino, para ello lo que quiero es que cuando le mande el valor "0" los servos se paren, cuando el valor sea "1" avancen, y cuando sea "2", retrocedan.
El problema es que solo soy capaz de que me reconozca el valor "1".
Os adjunto el codigo a ver si alguno puede ayudarme.
Muchisimas gracias!! Mola Mola

Código:
#include <Servo.h>
Servo servoIzq;
Servo servoDer;
int posicion;


void setup()
{
servoIzq.attach(3);
servoDer.attach(9);
Serial.begin(9600);
  
}

void loop()
{
posicion=Serial.read();
if (Serial.available()>0)
{
     if (posicion=1) //avanzar
      {
       servoIzq.write(180);
       servoDer.write(180);
      }
      if(posicion=2) //retroceder
       {
         servoIzq.write(0);
         servoDer.write(0);  
       }
       if(posicion=0) //paro
        { servoIzq.write(83);
         servoDer.write(83);
        }
}
}
Ayudanos a crear el mapa de usuarios de Spain Labs!!!
  Responder
#2
posicion=0 no es lo mismo que posicion==0

Lo primero es una asignación, lo segundo comparación.
  Responder
#3
Cierto, tienes toda la razon, se nota que hacia muchisimo que no programaba nada...
De todas formas sigue sin funcionar, es que no se muy bien si la comunicacion serial-arduino estoy haciendola bien.
Ayudanos a crear el mapa de usuarios de Spain Labs!!!
  Responder
#4
Pon unos Serial.print() y vete trazando lo que va llegando por el puesto serie. Es que no sé como lo tienes conectado. ¿Es sólo arduino y 2 servos?
  Responder
#5
Un ejemplillo que a lo mejor te viene bien:

http://playground.arduino.cc/Learning/Si...rvoExample
  Responder
#6
Si, son unicamente dos servos, uno conectado al pin 3 y otro al pin 9.
Ahora me miro eso a ver si soy capaz de sacar algo en claro jaja.
Muchas gracias!!
Ayudanos a crear el mapa de usuarios de Spain Labs!!!
  Responder
#7
Es una tontería, seguro que das con ello.

Asegurate de poner la misma velocidad en el monitor serie que la que has declarado en el setup, en tu código, 9600.
  Responder
#8
No es por nada, pero si primero lees, y despues consultas si hay algo nuevo escrito, nunca habra nada xk lo acabas de leer.
El funcionamiento es al reves, espera ocupada a que el puerto serie tenga algo que leer, y despues leerlo.

Código:
void loop(){
if (Serial.available()>0){
     posicion=Serial.read();
     if (posicion==1){ //avanzar
      
       servoIzq.write(180);
       servoDer.write(180);
      }
      if(posicion==2){ //retroceder
      
         servoIzq.write(0);
         servoDer.write(0);  
       }
       if(posicion==0){ //paro
         servoIzq.write(83);
         servoDer.write(83);
        }
}
}

Intenta eso. Y si tienes dudas consulta el manual:

http://arduino.cc/en/Serial/Available
http://arduino.cc/en/Serial/read

Muchas veces ahi tienes la respuesta.
  Responder
#9
Cachis, no me había fijado en eso.
  Responder
#10
Nada, no hace nada
Cada vez que le mando algo desde serial, el led RX del arduino parpadea, no se si eso indicara que la comunicacion se realiza bien.
Esta tarde ya le echare otro vistazo,
Muchas gracias a ambos!!
Ayudanos a crear el mapa de usuarios de Spain Labs!!!
  Responder
#11
Se me olvidaba, copie tu codigo alegremente, perdon, hay un error muy gordo XD

Read no devuelve un entero. Date cuenta que si escribes una letra, que entero es la A?. Bueno lo que lee son bytes, y esa interpretacion corresponde con un numero segun la tabla ascii. Vamos que el caracter 1, no es el entero uno, en realidad es el entero 49. La letra A es el entero 65, y el entero 1 es el caracter no imprimible SOH que significa comienzo de cabecera de una trama de enlace.

posicion, debe ser declarado como char. Y los numeros con comillas, para especificar que son caracteres y no enteros. Ademas te habria quedado mas elegamente utilizar un switch, o un if else.

El tratamiento correcto es:

Código:
#include <Servo.h>
Servo servoIzq;
Servo servoDer;
char posicion;


void setup(){
servoIzq.attach(3);
servoDer.attach(9);
Serial.begin(9600);
}

void loop(){
if (Serial.available()>0){
     posicion=Serial.read();
     if (posicion=='1'){ //avanzar
    
       servoIzq.write(180);
       servoDer.write(180);
      }else if(posicion=='2'){ //retroceder
      
         servoIzq.write(0);
         servoDer.write(0);  
       }else if(posicion=='0'){ //paro
         servoIzq.write(83);
         servoDer.write(83);
        }
  }
}

Ademas, posicion no se utiliza fuera de la funcion loop, por lo que deberias mover ahi su declaracion, y no usarlo como variable global.
Por otro lado, debes escoger mejor el nombre de las variables. Posicion, deberia llamarse caracter. puedes ahorrar memoria simplificando el codigo y utilizando una variable para la escritura (cuyo nombre cuadraria mejor con el de posicion, que supongo es lo que querias hacer).

Tambien recuerda iniciar siempre las variables, aunque no sea necesario. Evita errores despues con copypastes.


Código:
int posicion = 0;
      if (caracter=='1') posicion = 180;
      else if(caracter=='2') posicion=0;
      else if(caracter=='0') posicion=83;
      servoIzq.write(posicion);
      servoDer.write(posicion);

Creo que no hay mas errores inexperados.
  Responder
#12
Ahora ya si que si, muchas gracias por ayudarme, ya entiendo un poquito mas sobre el serial Mola
Ahora a pelearme con el modulo bluetooth... jajaja

Código:
#include <Servo.h>
Servo servoizq;
Servo servoder;
char caracter;


void setup()
{
  servoizq.attach(3);
  servoder.attach(9);
  Serial.begin(9600);
  
}

void loop()
{
int posicion = 83;
if(Serial.available()>0)
  caracter=Serial.read();
  {
     if (caracter=='1')
      posicion=180;
      else
       if (caracter=='2')
        posicion=0;
        else
         if(caracter=='0')
          posicion=83;
  }
servoizq.write(posicion);
servoder.write(posicion);
}
Ayudanos a crear el mapa de usuarios de Spain Labs!!!
  Responder
#13
Sonrisa
  Responder
#14
Siento decirte que es codigo esta mal. Mira cerca de serial.avalible(). Ten cuidado con los corchetes. Y la variable caracter no deberia estar declarada global, esto estaria bien para rematar aunque eso no te dara error.
  Responder
#15
La funcion de los servos tb esta mal colocada, se ejecuta siempre aunque no escribas. Estoy desde el movil, cuando llegue a casa te lo escribo xk eres un desastre jejjje. Te das cuenta de lo que te digo?
  Responder
#16
La verdad es que te funciona xk unos errores se corrigen con otros. Madre de dios, que puta carambola. No creo que tengas tanta suerte la proxima vez. De todas formas sigue estando mal y chapucero aunque te "funcione"
  Responder
#17
Jajaja, se nota qe hace demasiado que no programo nada, con lo que me gustaba.... Jajaja
Acabo de darme cuenta de lo qe dices, sólo que ya no tengo el ordenador que también estoy con el móvil. A ver sí mañana puedo arreglarlo.
Muchas gracias!!
Ayudanos a crear el mapa de usuarios de Spain Labs!!!
  Responder
#18
Prueba con esto:

Código:
#include <Servo.h>
Servo servoIzq;
Servo servoDer;


void setup()
{
   servoIzq.attach(3);
   servoDer.attach(9);
   Serial.begin(9600);
}


void loop()
{
  
   if( Serial.available() > 0 )
   {
      byte posicion = Serial.read();
      Serial.flush();
  
      switch(posicion)
      {
         // Para
         case '0':
            servoIzq.write(83);
            servoDer.write(83);        
            break;
        
         // Avanza
         case '1':
            servoIzq.write(180);
            servoDer.write(180);        
            break;

         // Retrocede
         case '2':
            servoIzq.write(0);
            servoDer.write(0);          
            break;
      }
   }
  
}

Mola
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#19
La forma correcta con lo que te he añadido es esta:
Código:
#include <Servo.h>
Servo servoizq;
Servo servoder;

void setup(){
  servoizq.attach(3);
  servoder.attach(9);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()>0){
    int posicion = 0;
    char caracter=Serial.read();
    if (caracter == '1')
      posicion = 180;
    else if (caracter == '2')
      posicion = 0;
    else if(caracter == '0')
      posicion = 83;
    servoizq.write(posicion);
    servoder.write(posicion);
  }
}

Si lo prefieres con Switch:

Código:
#include <Servo.h>
Servo servoizq;
Servo servoder;

void setup(){
  servoizq.attach(3);
  servoder.attach(9);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()>0){
    int posicion = 0;
    char caracter=Serial.read();
    switch (caracter){
      case '1':
        posicion = 180;
        break;
      case '2':
        posicion = 0;
        break;
      case '3':
        posicion = 83;
        break;
    }
    servoizq.write(posicion);
    servoder.write(posicion);
  }
}


Espero que te ayude. Yo abandonaria la forma de empezar con corchetes una nueva linea. Tabulando bien es mas limpio y facil de seguir.

Tb te puedo decir que muchos de tus errores son por programar con el arduino. El arduino es un simple resaltador de sintaxis, no te ayuda en nada.
Te recomiendo que programes en eclipse. Te asiste, te ayuda a completar funciones, variables, te avisa si estas escribiendo mal alguna condicion, te ayuda a tabular inteligentemente y te formatea el texto si eres de los vagos en tabular, en fin, es mil veces mas completo, y es lo que se usa profesionalmente. Ninguno de los programas que veas por ahi estan hechos con el IDE de arduino a no ser que sean una chorrada.
  Responder
#20
giltesa escribió:Prueba con esto:

Código:
#include <Servo.h>
Servo servoIzq;
Servo servoDer;


void setup()
{
   servoIzq.attach(3);
   servoDer.attach(9);
   Serial.begin(9600);
}


void loop()
{
  
   if( Serial.available() > 0 )
   {
      byte posicion = Serial.read();
      Serial.flush();
  
      switch(posicion)
      {
         // Para
         case '0':
            servoIzq.write(83);
            servoDer.write(83);        
            break;
        
         // Avanza
         case '1':
            servoIzq.write(180);
            servoDer.write(180);        
            break;

         // Retrocede
         case '2':
            servoIzq.write(0);
            servoDer.write(0);          
            break;
      }
   }
  
}

Mola

OverCraft escribió:La forma correcta con lo que te he añadido es esta:

Código:
#include <Servo.h>
Servo servoizq;
Servo servoder;

void setup(){
  servoizq.attach(3);
  servoder.attach(9);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()>0){
    int posicion = 0;
    char caracter=Serial.read();
    if (caracter == '1')
      posicion = 180;
    else if (caracter == '2')
      posicion = 0;
    else if(caracter == '0')
      posicion = 83;
    servoizq.write(posicion);
    servoder.write(posicion);
  }
}

Si lo prefieres con Switch:

Código:
#include <Servo.h>
Servo servoizq;
Servo servoder;

void setup(){
  servoizq.attach(3);
  servoder.attach(9);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available()>0){
    int posicion = 0;
    char caracter=Serial.read();
    switch (caracter){
      case '1':
        posicion = 180;
        break;
      case '2':
        posicion = 0;
        break;
      case '3':
        posicion = 83;
        break;
    }
    servoizq.write(posicion);
    servoder.write(posicion);
  }
}

Espero que te ayude. Yo abandonaria la forma de empezar con corchetes una nueva linea. Tabulando bien es mas limpio y facil de seguir.

Tb te puedo decir que muchos de tus errores son por programar con el arduino. El arduino es un simple resaltador de sintaxis, no te ayuda en nada.
Te recomiendo que programes en eclipse. Te asiste, te ayuda a completar funciones, variables, te avisa si estas escribiendo mal alguna condicion, te ayuda a tabular inteligentemente y te formatea el texto si eres de los vagos en tabular, en fin, es mil veces mas completo, y es lo que se usa profesionalmente. Ninguno de los programas que veas por ahi estan hechos con el IDE de arduino a no ser que sean una chorrada.

Muchisimas gracias a ambos, mañana cuando coja el arduino de nuevo lo pruebo!! Mola

Lo de empezar con corchetes es por culpa de una asignatura que tuve donde teniamos que programar en Verilog, y si no empezabamos con los corchetes nos daba error, porque cuando me enseñaron a programar en C era de los que hacia los programas super ordenados con sus tabulaciones, mientras que el resto de la gente escribia directamente al principio, pero de eso hace mucho y estoy un poco oxidado jaaja
Con respecto al IDE de Arduino tienes razon, de hecho tengo instalado una edicion de Codeblocks para Arduino, y si te digo la verdad no se porque no he empezado a usarla...

Muchas gracias den nuevo, a partir de ahora aprovecharé que tengo el Codeblocks instalado y sino me convence me paso al Eclipse Mola
Ayudanos a crear el mapa de usuarios de Spain Labs!!!
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Error en función Serial.printIn Bear 6 1,048 30-05-2021, 08:54 PM
Último mensaje: Bear
  Arduino - Matlab conexión Serial silth 0 1,474 31-05-2015, 04:20 PM
Último mensaje: silth
  [CONSULTA]Arduino - serial silth 3 1,961 27-02-2015, 11:53 AM
Último mensaje: Triggerr
  [AYUDA]Arduino comunicación Serial silth 2 1,806 02-02-2015, 09:59 PM
Último mensaje: silth
  Comunicacion con nRF905 calpanxo 5 2,732 10-06-2014, 04:06 PM
Último mensaje: hectorri