bclose

Comunicación con el exterior

El puerto serie en Arduino y los tipos String
tienda online prometec

Objetivos

.

 
    • Comprender la comunicación vía puerto serie.
    • Utilizar la librería Serial.
    • Operaciones con enteros.
    • Los tipos String y char.
    • Operando con Strings.
    • La instrucción while.

 

Material requerido.

ArduinoUNO  Arduino Uno o similar. Un PC con el entorno de Arduino correctamente instalado y configurado.

 

 

Comunicación Serie con el mundo exterior

 

Más antes que después, vamos a necesitar comunicar nuestro Arduino con nuestro PC. Las razones son varias, enviarle órdenes o recibir información o señales por ejemplo.

Los PCs disponen de teclados, pantallas y adaptadores de red, pero con Arduino tenemos que usar el puerto USB que establecerá una conexión en serie con nuestro PC.

La comunicación en serie es muy sencilla, bastan dos hilos para enviar una diferencia de tensión entre ellos y poder marcar niveles alto (5V) y bajo(0V) y con esto podemos transmitir información digital. Ahora solo nos falta pactar dos cosas entre quien envía y quien recibe:

 
  • Un código común para codificar los caracteres que enviamos.
  • Un acuerdo de velocidad para saber a qué ritmo hay que leer los datos.
 

El código común que vamos a usar con Arduino se llama código ASCII y es estándar en todos los PCs. Es una forma de codificar las letras mediantes números que representas estos caracteres. Recordad que solo podemos transmitir unos y ceros.

Así por ejemplo la letra A se representa por el numero 65, la B el 66, C el 67…   Prácticamente todos los PCs actuales utilizan este código y eso incluye a Windows, Mac y Linux (y por eso podemos leer emails enviados desde distintas plataformas), pero es importante comprender que esté es uno más entre varios códigos de caracteres posibles (EBCDIC por ejemplo).

 
  • Actualmente, en realidad, se suele usar una extensión del código ASCII (llamada Unicode) que permita el uso de caracteres no incluidos en la tabla original, y que permita representar caracteres como las Ñ, o acentos para el español, pero también alfabetos distintos como el Kanji chino o el alfabeto cirílico. Y este es el motivo por el que podéis leer las letras chinas o rusas en las páginas de internet de estos países..
 

El otro factor a pactar para realizar una comunicación serie es la velocidad. Dado que solo disponemos de dos hilos para transmitir, necesitamos saber cuándo hay que leer la línea y esto se hace estableciendo un acuerdo de velocidad. Si la velocidad de envío es distinta de la velocidad de lectura, el mensaje final será irreconocible.

Buena parte de los errores de comunicación serie programando con Arduino se suelen deber a una diferencia de velocidad entre el emisor y el receptor.

Esta velocidad se mide en bits por segundo y vamos a ver que Arduino soporta diferentes velocidades de comunicación serie.

 

Estableciendo la comunicación Serie

.

Arduino dispone de una librería serie incluida llamada Serial, que nos permite envía información al PC y para usarla simplemente tenemos que pedirle en nuestro setup() que la incluya. La instrucción que se encarga es:

Serial.begin( velocidad )  ;
 
  • Nótese que Serial tiene la S mayúsculas y que C++ diferencia entre mayúsculas y minúsculas
 

La velocidad es una valor entre 300 y 115.200 bits por segundo. Y suele ser costumbre establecerla en 9600 (el valor por defecto) pero no hay ninguna razón para ello y esta no es una velocidad especialmente alta.

Para enviar un mensaje desde Arduino a nuestro PC podemos usar  las funciones Serial.print() y Serial.println().Veamos un ejemplo:

     int LED = 10 ; int boton = 6 ;
     bool estado = false ;
     void setup()
          {  
              Serial.begin(9600) ;                 // Inicializa el Puerto seria 9600 bits por segundo
          }
     void loop()
         { 
              int i = 54 ;                 
              Serial.println( i );
         }

El println()  enviara el valor de i al puerto serie de Arduino (repetidamente). Para leerlo en nuestro PC necesitamos un monitor de puerto serie. El IDE de Arduino incluye uno muy sencillo, pero suficiente que se invoca con el botón del monitor:

Img_7_1

 

Necesitamos además asegurarnos de que la velocidad de conexión es la misma en ambos extremos. Fíjate en la parte inferior derecha del monitor serie:

Img_7_2

Normalmente la velocidad por defecto son los 9600 bits por segundo o baudios en los que hemos programado nuestra puerta serie, y si lo desplegáis, veréis las diferentes velocidades aceptables para Arduino.

 
  • Estrictamente hablando, bits por segundo y baudios no son exactamente lo mismo salvo bajo ciertas condiciones particulares que en Arduino se cumplen, por lo que aquí podemos usarlos como sinónimos.
  • En el mundo Arduino parece haber un acuerdo de usar velocidades bajas como 9600 en lugar de más altas como 115200, para evitar problemas. Esto es algo que hace años estaba justificado por problemas de transmisión, pero con la tecnología actual no hay motivo para ello. Es más, en cuanto necesitemos utilizar dispositivos de comunicaciones como adaptadores Ethernet o BlueTooth para comunicarnos, la velocidad tendrá que subir necesariamente.
 

Ahora que sabemos enviar  información y resultados al PC, vamos a ver cómo podemos operar con enteros y mostrar el resultado en la puerta serie. En C++ los operadores numéricos son los normales en cálculo (y algunos menos frecuentes):

 
  • Adición:                +
  • Resta:                   –
  • Multiplicación:        *
  • División entera:      /              Cociente sin decimales (puesto que operamos con enteros
  • Resto:                  %            Devuelve el resto de una división.
 

En C++ tenemos que expresar las operaciones matemáticas en una sola línea y utilizar paréntesis para garantizar que se opera como necesitamos. Vamos con algunos ejemplos:

Operación Resultado Comentario
int i = 4 * 2 resultado =  8
int i = 4 * 2 / 3 resultado = 2 Porque desprecia los decimales al ser entero
int i = 14 % 3 resultado = 2 El resto de 14 entre 3
Int i = 2 + 8 / 2 resultado = 6 Calcula primero la división.
Int i = (2+8) / 2 resultado = 5 El paréntesis fuerza a que se realice primero la suma

Dada una expresión, la precedencia de operadores indica que operaciones se realizaran antes y cuales después en función de su rango. Para los que se inician en C++ no es fácil saber que operadores tienen preferencia, por lo que es más seguro que ante la duda uséis paréntesis.

Los paréntesis fuerzan las operaciones de una forma clara y conviene utilizarlos ante la duda porque de otro modo, detectar los errores de operación puede volverse muy difícil especialmente cuando uno empieza a programar.

El operador resto es más útil de lo que parece a primera vista porque nos permite saber si un numero es múltiplo de otro.  Supongamos que queremos saber si un número dado es par.

Podríamos escribir un programa como este:

     void setup()
          {
             Serial.begin(9600) ; // Inicializa el Puerto serie
          }
     void loop()
         { 
            int i = 27 ; //El número en cuestión
            if ( i % 2 == 0)
                 Serial.println("Es par.") ;
           else
                 Serial.println("Es impar");
         }

Dando a i distintos valores podemos comprobar cómo funciona el operador resto %. Volveremos sobre esto cuando veamos algunos ejemplos de cómo calcular números primos.

En este programa hemos usado de un modo diferente el Serial.println() pasándole una String de texto entrecomillada. Serial.print() envía el texto ( entrecomillado) que le pongamos pero no da salto de línea cuando termina. En cambio Serial.println() hace lo mismo e incluye al final ese salto de línea.

     void setup()
          {
             Serial.begin(9600) ; // Inicializa el Puerto serie
          }
     void loop()
          { 
               Serial.print("Buenos ") ;
               Serial.print("Dias ") ;
               Serial.println("a todos.") ;
          }

C++ dispone de un tipo de variables llamadas Strings, capaces de contener textos. Podemos operar con ellas simplemente definiéndolas como cualquier otro tipo de C++:

      void loop()
           { 
               int resultado = 25 ;
               String s = “ El resultado es: ” ; // Nótese que la S de string es mayúscula.
               Serial.print( s) ;
               Serial.println( resultado); 
           }

Un tipo String se define simplemente poniendo entre comillas dobles un texto, y se puede operar con ellas de una forma similar a como operamos con enteros. Prueba:

void loop()
    { 
        String a = "hola " ;
        String b = "a todos." ;
        Serial.println( a + b);  
    }

Y también podemos construir  un String sobre la marcha así:

void loop()
    { 
        int resultado = 25 ;
        String s = "El resultado es: " ;
        Serial.println( s + String( resultado ));   
    }

Donde  imprimimos el resultado de concatenar  s String, y la conversión de un int a String (El operador + añade un  String al final de otro).

Recibiendo mensajes  a través del puerto Serie

.

Hasta ahora solo hemos enviado mensajes desde Arduino hacia el PC, ¿Pero como recibimos mensajes en Arduino?

En primer lugar disponemos de una función llamada Serial.parseInt() que nos entrega lo que se escribe en el monitor serie convertido a entero:

     void loop()
          { 
              if (Serial.available() > 0)
                  {
                      int x = Serial.parseInt();
                      Serial.println ( x) ;
                  }
          }

Este programa simplemente recibe en x los números que nos tecleen en la consola (cuando pulsemos intro) y si es un texto, lo interpreta como cero.

Hemos utilizado otra función de Serial : Available() que es un booleano. Conviene por costumbre comprobar que antes de leer el puerto serie hay algo que nos han enviado.  Si lo hay Available() es True y en caso contrario es False.

Para leer un String del puerto serie tenemos que complicarnos un poco más y hablar del tipo char.

Uno de de las mayores quebradero de cabeza al iniciarse en C++ es comprender la diferencia, anti-intuitiva, entre char y String. char es un tipo que representa un único carácter y se define con comillas simples, a diferencia de String que necesita comillas dobles:

char  c = ‘a’  ;
String s =”a”  ;

Aunque parezca lo mismo para C++ son muy distintos.

Para leer una cadena desde el puerto serie necesitamos leer un carácter cada vez y después montar un String a partir de ellos, pero antes, asegúrate de seleccionar ambos NL & CR en la parte inferior del monitor serie, para garantizar que se envía el carácter de fin de línea:

Seleccion de ajuste de linea

Un programa para leer la consola sería algo así:

     void setup()
            { Serial.begin(9600); }

     void loop ()
          { 
              char c = ' ' ;
              String mensaje ="" ;
              if (Serial.available()) //Comprobamos si hay algo esperando
                   {
                      while( c != '\n') //Si lo hay, lo leemos hasta el intro
                          { 
                            mensaje = mensaje + c ; // Añadimos lo leído al mensaje
                            c = Serial.read(); //Leer 1 carácter
                            delay(25);
                          }
                      Serial.println( mensaje); //Al salir imprimir el mensaje
                      mensaje = "" ; //Bórralo para la próxima vez
                   }
          }

Aquí usamos otra instrucción de C++ llamada while. Es similar a if, Ejecuta repetidamente  el bloque que le sigue mientras se cumpla la condición que le pasamos entre paréntesis:

     while ( condición)
                 {   ……… }

Cuando lee el intro final de lo que escribimos, La condición c != ‘\n’ se torna falso y sale del while.

Por lo demás, comprobamos si hay algo disponible en la puerta serie y de ser así montamos el mensaje leyendo un char cada vez y sumándoselo a mensaje para construir un String que podamos imprimir al salir.

 
  • El motivo del delay(25) es que a una velocidad tan lenta, enviar un char de 8 bits por la puerta serie, tarda mucho más de lo que tarda Arduino en ejecutar las instrucciones del while y volver a empezar. Por eso si se suprime el delay (y os recomiendo la prueba) leerá un carácter bueno (de la palabra escrita y como 10 caracteres basura para un Arduino UNO o Mega).
  • Si subimos la velocidad de comunicación a 115200 bits por segundo, comprobareis que no hay este problema ya que al multiplicar la velocidad de envío por más de 10 Arduino ya no tiene tiempo de volver a por más caracteres antes de que lleguen.
 

 

Resumen de la sesión

.

 
    • Hemos visto como establecer la comunicación con el PC externo, tanto para enviar como para recibir mensajes enteros y de texto.
    • Hemos presentado los tipos String y char.
    • Hemos visto las reglas básicas para operar con enteros y con Strings.
    • Presentamos una nueva instrucción: while.

 

 

 

 

(83) Comments

  • Hola.
    Por lo que veo, cuando se carga un programa en la placa de Arduino, no hay forma de borrarlo. Si se pulsa el botón de “Reset” , Arduino simplemente reinicia el programa (pero no lo borra). Si se quita la alimentación, el programa permanece, y en cuanto recupera alimentación, el programa vuelve a ejecutarse. La única forma que yo he visto, es cargar un programa vacío (como el que aparece al comenzar con el IDE-Arduino).
    Pero el problema se agudiza al máximo cuando el último programa cargado (el que está en ejecución) es un programa que utiliza el Puerto-Serie. En ese caso, el programa mantiene ocupado el Puerto-Serie, que es por donde se podría cargar cualquier programa, por lo que entonces si que resulta imposible borrar el programa que está en ejecución.
    ¿ En que me estoy equivocando ?
    Muchas gracias por su amabilidad.

    • Creo que tu equivocación es en realidad un error de concepto.
      Intentaré explicarlo de forma sencilla: La placa Arduino al recibir el programa compilado desde el “IDE Arduino” escribe de forma permanente en el chip microcontrolador Atmel las instrucciones traducidas a su lenguaje; estas instrucciones quedan escritas en el chip aunque no haya corriente eléctrica. Cuando está nueva la placa Arduino trae el programa de parpadeo del led interno, y este programa se puede reemplazar reprogramando el chip. El botón de Reset reinicia el programa escrito en el chip.

      Se puede utilizar la placa Arduino de otra forma, por ejemplo usando “S4A – Scratch for Arduino” (en lugar del IDE Arduino), y de esta manera las instrucciones se envían desde el pc, y al desconectar la placa, o dejarla sin corriente, el programa se detiene, ya que en realidad el chip microcontrolador no queda “programado”; tan sólo recibe las instrucciones desde el pc. Así funciona también el Lego We Do, y es una forma gráfica de programar relativamente fácil. Esta forma de usar la placa recibiendo funciones en tiempo real desde el pc es la que usan también los programas MatLab y LabView.
      La mayoría preferimos dejar la placa Arduino con el chip programado para que funcione de forma independiente al ordenador, utilizando el IDE Arduino. Otras formas de programar el chip microcontrolador y que funcione independiente del ordenador es con Visualino, Bitbloq, ArduBlock, o CodeBender.
      El uso del Monitor Serie es independiente de la programación del chip.
      Saludos.

    • Antonio

    En primer lugar quiero agradecerte la enorme labor de divulgación que estás haciendo y animarte a que sigas en ello. Utilizo los tutoriales para introducir a mi hijo en el mundo de la electrónica y la robótica y están impecables, gracias.
    Y ahora mi libro…
    Al introducir números por el teclado para que se representen en el terminal siempre obtengo dos líneas. La primera con el número y la segunda con un 0. Supongo que se vuelve a escribir el valor del buffer (vacío) pero no estoy seguro. Quisiera saber la verdadera razón y cómo evitarlo y ver solo el número que quiero representar. Gracias.
    Mi código es el siguiente:
    void setup() {
    Serial.begin(9600);
    Serial.println(“Introduce un número:”);
    }
    int n;
    void loop() {
    if (Serial.available()>0) //Comprobamos si hay algo esperando
    {
    n=Serial.parseInt();
    Serial.println(n); //Al salir imprimir el número
    }
    }

    • Hola Antonio, la verdad es que no sé porque es, pero a mi también me ocurre. Lo he arreglado poniendo abajo “Sin ajuste de línea”

  • Tus publicaciones me están siendo de muchísima utilidad. Podrías explicarme por qué en este programa mete un carácter que no existe? Es una variación del ejemplo que pones para que no salga el espacio al inicio, pero aparece este símbolo ⸮ en la segunda posición
    void setup()
    { Serial.begin(115200); }

    void loop ()
    {
    char c;
    String mensaje =”” ;
    if (Serial.available())
    do{
    c = Serial.read();
    mensaje = mensaje + c ;
    }while( c != ‘\n’);
    Serial.println( mensaje);
    mensaje = “” ;
    }
    }

    • Pues no veo nada raro en tu codigo

      • FEAR

      Puede ser que estés introduciendo algún carácter con tilde?

      Recuerda, usa ASCII

  • Otro tema interesante, todo ok.

    • Francisco cayetano

    hola muy buenas tardes tengo una duda necesito sumar dos datos que envio por el puerto serial el problema no es leerlos een el arduino sino como sumar esos valor ya que si mando un 1 y un 2 me los ejecuta por separado y nececito que los sume para qe sea 3 para ejecutar el valor de 3 como le podre hacer ayudaaaa

    • Hola Francisco, no estoy seguro de entenderte. Si lo que quieres es sumar valores que introduzcas por el puerto serie podría valerte algo como esto:

      int suma = 0;
      int x = 0 ;

      void setup()
      {
      Serial.begin(9600) ; // Inicializa el Puerto seria 9600 bits por segundo
      }

      void loop()
      {
      if (Serial.available() > 0)
      {
      x = Serial.parseInt();
      Serial.println ( x) ;
      }
      suma = suma + x;
      Serial.println(suma);
      }

    • Jorge Escobar

    Saludes admin, definitivamente no me funciona el programa mas basico:

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

    void loop() {
    // put your main code here, to run repeatedly:
    Serial.println(Serial.available());
    // if (Serial.available()>0)
    // {
    int x=Serial.parseInt();
    // Serial.println(x);
    // }

    }
    soy profano en esto, pero me gusta estudiar, que estoy haciendo mal???
    gracias de anemano

    • Hola Jorge, la doble barra // sirve para comentar cosas en el programa. De esta forma al compilar el código no se tienen en cuenta esas líneas, lo que nos permite hacer comentarios para ayudarnos a la hora de leer el programa.

      Lo que ocurre es que tú has comentado líneas que sí son necesarias para el programa. Descoméntalas y seguro que te funciona. Un saludo.

    • Antoni

    hola admin muy vacanos tus tutoriales, y tengo una consulta que hacerte ojala me puedas responder lo mas pronto posible lo que pasa es que tengo dos arduinos con shiel de xbee y sus xbee mandandole a un arduino mediciones de temperatura que se ven por el monitor serie,
    como hago para que me mande esas mediciones cuando le mande una señal y no que me las mande constantemente

  • Una duda en este código:
    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    }

    void loop() {
    // put your main code here, to run repeatedly:
    char c=’ ‘;
    String s=””;
    while(Serial.available()){
    c=Serial.read();
    s=s+c;
    }
    Serial.print(s);
    delay(1000);
    }
    El string solo se me escribe una vez, ¿por qué no se escribe a cada segundo de nuevo?
    Gracias de antemano y tambien por los tutoriales
    un saludo

    • Hola Pedro, como declaras las variables en el loop cada vez que se ejecuta vacía el valor de s y c. Si quieres que te lo escriba todo el rato declaralas como variables globales antes del setup. Un saludo.

    • Javo84

    Hola Buenos Días
    Estaba viendo esta capitulo y en la ultima configuración no he entendido estos comentarios

    while( c != ‘\n’) //Si lo hay, lo leemos hasta el intro

    Que significa esta variable ‘\n’
    si me pudieran dar un poco mas a detalle esta instruccion
    y que significa el comentario de //Si lo hay, lo leemos hasta el intro

    • ‘\n’ es el carácter (char) que envía el teclado cuando aprietas el intro. Por eso lo del comentario: Mientras c es distinto de un intro (while c != ‘\n’) leemos todos los caracteres pulsados.

    • Lucas

    Hola a todos. ¿Como puedo encender un LED desde el puerto serie de Arduino utilizando cadenas de texto?. Ya lo he intentado de varias formas pero no me funciona, la única que me ha funcionado hasta ahora es encendiéndolo mediante un solo carácter. Les agradecería mucho que me pudieran ayudar.
    Saludos.

    • Hola Lucas, puedes ir guardando los caracteres que te lleguen por el puerto serie en un string y luego comprobar esa cadena. En la segunda parte de esta sesión puedes ver como ir guardando los caracteres en una variable https://www.prometec.net/comunicacion-exterior/

      Luego sólo tendrías que hacer un condicional con ella. Un saludo.

    • Juanrayo

    Hola gente, primero que todo agradecer por su ayuda..por hacer comunidad.
    Estoy en un problema y quizas alguien me puede dar una mano, se trata de lo siguiente

    Me gustaria enviar datos desde el puerto serial al arduino …una serie de números que representan tiempos de inicio y parada de actividades, para lo cual pienso que enviando un vector de datos y descomponiendo este segun su posición…de ahi utilizar esos datos y pegarlos en las funciones de tiempo correspondiente resultaría…y ahí estoy!!…no consigo consigo enviar un array y descomponerlo…alguien tiene alguna sugerencia?…
    he encontrado la siguiente información..un sketch obtiene valores a partir de una cadena de caracteres que hemos recibido por ejemplo por puerto serie. como puedo enviar una cadena y ponerle comas entremedio para que el sketch entienda que son dos numeros?…les adjunto el link con la libreria que se menciona en el sketch…agradecido por su ayuda

    char cadena[] = “Numeros 56, FF, -34, 432, 2FA”;
    int numeroobtenido =0;

    #include “CharToInt.h”

    void setup()
    {
    Serial.begin(9600);

    Serial.println(cadena);

    Serial.print(“Numero en la posicion 8 “);
    numeroobtenido=calculadesdeASCII(cadena,8);
    Serial.println(numeroobtenido,DEC);

    }

    void loop()
    {

    }

    http://forum.arduino.cc/index.php/topic,69309.0.html
    agradecido de antemano…saludos

  • Hola ,muy buenas a todos.
    Estoy trasteando con el monitor serial y hay algo que no me gusta.
    Cuando me muestra los datos.lo hace en filas llenando toda la pantalla,desde arriba hasta abajo.
    Para algunas aplicaciones lo veo bien,porque puedes ir moviéndote y ver los datos anteriores.
    Pero para otras lecturas como temperatura me gustaria que solo mostrara una linea,no que me llenara la pantalla de mediciones.
    Que lo mostrara como en la lcd,que se vaya refrescando.
    ¿Sabéis que tipo de comando tengo que utilizar para eso?.
    Gracias.

    • Fijate cuando abras la consola, que al final a la derecha hay un menu en el que te conviene elegir CR+LF y veras como tu problema mejora

    • Javier Reinoso

    Bueno, unas mejoras, para una placa con 8 canales, con reset:

    http://depositfiles.com/files/ndip135pb
    o
    http://www.astrology7.com/downloads/ArduinoUNOR3_VB2010_Controlar_8_Reles_CodeForInternet.rar

    Saludos…

    • Javier Reinoso

    Un error en el archivo de despositfiles, es este:

    http://depositfiles.com/files/si0jhqmt8

    Saludos de nuevo…

    • Javier Reinoso

    Una pregunta Admin, las placas nuevas algunas ya no llevan Puerto Serial, hay posibilidad de comunicarse entre Arduino y el Pc sin Puerto Serial, solamente usando el USB???

    Se que hay placas peques que convierten USB a Serial, pero se puede obviar esto y usar solo Arduino y USB y comunicar entre el Pc y el Arduino???

    Un saludo y gracias de antemano…

    • Hola Javier, Todos los Arduinos que conozco hasta la fecha, usan una conexion USB con el exterior. La puerta serie de la que hablamos en esta sesion no es fisica sino simulada a traves del USB(Que al final es un puerto serie un poco mas complicado)

        • Javier Reinoso

        Gracias Admin por tu pronta Respuesta…

        Bueno, yo no tenia ni idea de Arduino, y hecho de menos algunas cosas basicas, hoy recibi mi primera placa Arduino con una Placa con 8 Reles, y despues de moverme un poco, ya consegui hacer funcionar los Reles y todo Ok…

        He hecho un Archivo rar con los codigos fuente, por si alguien le viene bien:

        ArduinoUNOR3_VB2010_Controlar_4_Reles_CodeForInternet:
        http://dfiles.eu/files/xe3mhbgyi

        ArduinoUNOR3_VB2010_Controlar_4_Reles_CodeForInternet:
        http://www.astrology7.com/downloads/ArduinoUNOR3_VB2010_Controlar_4_Reles_CodeForInternet.rar

        Pero eso, hecho de menos algunas cosas basicas como estas que puse en otro Foro:

        //////////////////////
        Tambien hecho de menos unas breves explicaciones que pueden ayudar a quitar unas cuantas horas, como por ejemplo que no hace falta que la placa base de un Pc tenga Puerto Serie, que Arduino se deja libre de memoria al subir un nuevo codigo – me dio un poco de susto que el subi un codigo y dejaron de encenderse los Reles, pense si me habia cargado la placa, y busque como dejar el Arduino UNO R3 como al Inicio, hasta que encontre que con solo subir un nuevo codigo, la memoria de la placa Arduino se renueva, es una tonteria, pero estas cosas basicas a los que no tenemos ni idea de entrada nos pueden ayudar mucho, intentare poner en el RAR que he hecho un archivo de texto con estas respuestas basicas -, que para manejar una placa de reles puede funcionar sin fuente añadida o externa, y algunas mas, muy basicas, pero que pueden aclarar mucho a quien empieza de 0…
        //////////////////////

        Pero muchas gracias admin, pena no saber tu nombre…

        Saludos sinceros!!!

        • Un placer Javier, mi nombre es Charly para lo que necesites

  • Admin, Gracias por tu pronta respuesta.
    Te comento que a partir de la comunicación con de una PC utilizando el Hiperterminal puede adquirir los datos del equipo. Es un campo de datos separados por comas del tipo strem. El código que le envío del hiperterminal no es mas que SNDA. Nota: el dispositivo medico solo responde si recibe un retorno de carro(). Es aquí mi duda si realmente le estoy enviando ese retorno de carro.
    Desde el hiperterminal enviando el código SNDA y ENTER los puedo recibir.
    Si no es mucho molestia te envío el código que estoy programando en el arduino para saber si hay algo mal escrito o no estoy enviando este retorno de carro a través de la consola arduino.
    La idea es probar enviar el código por el serial del arduino (a través de la consola arduino-USB) y lo copie en la salida del serial1 (conectado al RS 232 del equipo) para leerlo por serial1 del mismo Serial1 (tal ves ese sea el problema).

    void setup() {
    Serial.begin(9600);
    Serial1.begin(9600);
    }
    void loop()
    {
    char c=’ ‘;
    String mensaje=” “;

    if (Serial.available())
    {
    while(c != ‘\n’) {
    mensaje=mensaje + c;
    c=Serial.read();
    delay (25);
    }
    Serial1.println(mensaje); //creo que este mensaje(“SNDA”) no lleva el retorno de carro, por eso que en mensaje1 nos devuelve lo mismo
    mensaje = ” “;
    }

    char d=’ ‘;
    String mensaje1=” “;

    if (Serial1.available())
    {
    while(d!= ‘\n’) {
    mensaje1 =mensaje1 + d;
    d=Serial1.read();
    delay (25);
    }
    Serial1.println(mensaje1);
    mensaje1 = ” “;
    }
    }

    Seria muy importante tu ayuda, ya que es para mi proyecto final de la Facultad de Ing. Biomedica en Favaloro, Buenos Aires
    Muchas gracias
    Atte.
    Maximiliano

    • hola max, estoy de vacacilnes ypor eso n puedo prlbartj ñrlgrama ñerl jna idea que pjede servirte es que la maylr parte de los ñrlvramas interpretan el fin del mensaje con CR+LF, y este podria ser tu ñroblema. asgurate de poner en la consola arduino ambos valres en la utima lnea

  • Estimado Admin, Ante todo, excelentes los tutoriales y tu dedicación en los problemas planteados. Te comento, estoy tratando de comunicarme con un dispositivo medico a través del puerto RS 232. Ya puede adaptar los niveles de tensión a TTL y verificar que el arduino MEGA envíe y reciba datos utilizando el puerto RS232 de una PC y la interface Hiperterminal. De esta forma también chequeamos la entrega de datos del equipo a través del puerto RS232 con el hiperterminal enviándole el código de comunicación propio del equipo (cuatro letras ). Ahora bien, cuando programo mi arduino para que el mismo le envíe ese código y lo pueda visualizar en la consola arduino, programando los puertos correspondientes, no obtengo el campo de datos que me entrega el equipo, y en cambio vuelvo a recibir el código de comunicación, como que en realidad no pudiera responderme el dispositivo medico o no esta interpretando el enter o algo con el tiempo de respuesta. El setedo de velocidad de comunicación es de 9600 tanto para el arduino como para el disp medico, y lo chequee. Se te ocurre en que me estaría equivocando?

    • Hola Machi, No se que decirte con tan poca informacion, pero parece que la comunicacion es correcta y el problema parece que el equipo medico no responde adecuadamente ¿Podria ser un problema de que requiere ciertos comandos por la puerta serie para enviar informacion?

  • Admin como siempre excelentes Post, tengo una consulta, yo quiero hacer un programa que envie por LABVIEW una serie de variables a nuestro arduino, desde labview tengo el problema resuelto a cada variable le agrego un carácter al principio que identifica cada variable, pero tengo el problema para identificarlo desde arduino, hay alguna forma de preguntar cual es el primer carácter del dato recibido y almacenar el mismo desde el segundo en adelante????
    Desde ya muchas Gracias, saludos

    • Hoa, Tomas por supuesto que si. Revisa las funciones string de arduino tales como substr y left. Ves que es de lo mas sencillo

  • Este es el error de el último programa

    Prog_8_3:8: error: ‘If’ was not declared in this scope

    If (Serial.available()) //Comprobamos si hay algo esperando

    ^

    Prog_8_3:9: error: expected ‘;’ before ‘{‘ token

    {

    ^

    Prog_8_3:19: error: expected ‘}’ at end of input

    }

    ^

    exit status 1
    ‘If’ was not declared in this scope

    • Hola Alex, el error esta en que el If es sin mayúsculas, o sea if (Serial.available()) //Comprobamos si hay algo esperando. Esto de los correctores de ortografía automáticos… Ya está corregido en la sesión. Un saludote.

Give a Reply

WordPress Anti-Spam by WP-SpamShield