Geek Electrónica

Explicaciones, tutoriales y noticias sobre electrónica y tecnología en general

ArduinoMATLABMicrocontroladores

TOMAR DATOS POR PUERTO SERIAL COM Y GRAFICAR CON SIMULINK DE MATLAB

En una publicación anterior de Geek Electrónica se había explicado como tomar datos enviados por un puerto serial COM por medio de un script de MATLAB y graficarlos ayudados de la función plot de MATLAB, si quieren revisar dicha publicación pueden hacer siguiendo el siguiente link:
 
 
En esta ocasión les explicaremos como desde la herramienta simulink de MATLAB tomar y graficar los datos enviados al computador por medio de un microcontrolador o cualquier otro dispositivo electrónico a través de un puerto COM (emulado o real), este método es más sencillo que el explicado anteriormente con el script y además como ventaja adicional no presenta retardos en la toma de datos cuando la cantidad de muestras tomadas es elevada.
 
Toda la explicación del proceso la pueden encontrar en el siguiente vídeo.
 
 

ACTUALIZACIÓN (20 / 03 / 2017)


De acuerdo a los informes de algunos de nuestros lectores, en el simulink de MATLAB 2015 no se encuentra el bloque “Transpose”, por esta razón a continuación explicare como solucionar este problema.

Para Simulink en MATLAB 2015 el bloque “transpose” ha desaparecido como bloque individual, sin embargo se puede encontrar como una función dentro de un bloque llamado “Math Funtión” el cual agrupa varias funciones matemáticas. Para hacer uso de la función transpose se tienen que seguir los siguientes pasos.

Escribir Math Function en el buscador del Simulink Library Browser


Seleccionar el bloque “Math Function” de la librería “Math Operations” y arrastrarlo al área de trabajo de simulink.


Con el bloque ya en el área de trabajo de simulink, hacer doble clic sobre el bloque y en el menú “Function” seleccionar “transpose”.

Con esto el bloque “Math Functión” ya estará configurado para funcionar de la misma forma que el bloque “Transpose” utilizado en el vídeo con la versión de MATLAB 2013.

Además para quienes tienen dudas sobre la programación de arduino para enviar por puerto serial dos datos separados por una coma “,” en el link que se encuentra a continuación pueden descargar un archivo de arduino con una posible solución para hacer esta tarea.

Iván Cuadros Acosta

Licenciado en Electrónica y Master en desarrollo de aplicaciones móviles con experiencia en docencia universitaria. Apasionado por la electrónica y la programación.

29 comentarios en «TOMAR DATOS POR PUERTO SERIAL COM Y GRAFICAR CON SIMULINK DE MATLAB»

  • Se puede hacer una gráfica con simulink en la que el valor de datos no se asigne (como en este ejemplo que fue de 100) y se vayan guardando todos los datos conforme va avanzando la simulación hasta que la detengamos?

  • Hola buen día y gracias por visitar el blog.

    El 100 que se muestra en el vídeo no se refiere a la cantidad de datos que se van a tomar, se refiere es a la dimensión del eje x de la gráfica, osea que el eje x del scope se va a visualizar de 0 a 100, pero la toma de datos en este ejemplo es constante hasta que se pause el simulink.

    Para guardar todos los datos de la simulación tiene varias opciones, algunas de ellas son:

    * Si quiere guardarlos en una variable del workspace puede hacer una de las siguientes dos opciones:

    -En las configuraciones del scope, en la pestaña history habilitar la opción que dice "save data to workspace".

    -Agregar un bloque llamado To Workspace y conectarlo a la salida del bloque transpose.

    *Si quiere guardarlos en un archivo entonces puede agregar un bloque llamado To file y conectarlo a la salida del bloque transpose.

    Espero que la respuesta le sea de ayuda y que siga visitando el blog, el canal de YouTube y nuestras redes sociales.

  • Hola buen día y gracias por visitar el blog.

    Existe una gran cantidad de libros sobre MATLAB por ejemplo:

    * MATLAB para ingenieros – de Holly Moore
    * Matlab y sus aplicaciones en las ciencias y la ingeniería – de César Pérez
    * Solución de problemas de ingeniería con MATLAB – de Delores M. Etter

    Los anteriores explican mas que todo las bases de uso de MATLAB en diferentes áreas de la ingeniería y las ciencias, su uso para cálculos y/o uso de algunos toolbox de MATLAB, pero no presentan el uso de simulink.

    Si requiere explicación de simulink puede consultar:

    * MATLAB & SIMULINK para ingenieria – de Miguel Ataurima Arellano

    o por ultimo puede consultar en la misma pagina de mathworks los libros de soporte que ellos recomiendan.
    mathworks . com / support / books/ (Quitar espacios)

    Espero que la respuesta le haya sido de ayuda y que siga visitando el blog y nos siga en nuestras redes sociales como Twitter, Facebook y el canal de YouTube.

  • Amigos… dos consultas..
    la primera: ¿cómo puedo programar el envío de dos mediciones separadas por coma en Arduino?
    la segunda: tengo Matlab 2015a y no aparece el bloque Transpose, ¿tienen algún otro bloque que cumpla la misma función en esta versión?

    Saludos, y muchísimas gracias por la respuesta y el video!!!!

  • Hola… tampoco me aparece el bloque transpose… ayuda!

  • Coloque los bloques y todo lo demás pero no me muestra la gráfica
    Necesito algún programa para el arduino?? Xfavor cual sería??

  • Hola buen día y gracias por visitar el blog.

    Si, requiere tener un programa en el arduino o el microcontrolador que va a recibir los datos del sensor y luego enviarlos al computador, si quiere ver un ejemplo de programa que le puede servir para hacer esto, puede ver la siguiente entrada de este mismo blog:

    RECEPCIÓN DE DATOS POR PUERTO SERIAL Y GRAFICACIÓN EN MATLAB:
    https://geekelectronica.blogspot.com.co/2015/11/envio-de-datos-por-puerto-serial-y.html

  • Podrían responderme por favor?? xD .. por último que no saben o no sé jajajjaja

  • Hola buen día y gracias por visitar el blog.

    Primero que todo disculpeme no haber respondido antes, pero no se porque nunca me llego notificación de este comentario y hasta hoy que volvió a preguntar me di cuenta del comentario inicial.

    Para aclarar sus dudas ya hice una actualización a esta publicación explicando como utilizar el bloque transpose en simulink de MATLAB 2015 y deje un archivo de ejemplo mostrando una posible opción para programar el arduino para enviar dos mediciones separadas por coma.

  • Muy buen ejemplo, pero tengo un problema al correr en simulink lo hace muy lento, le cuesta hacer la lectura a mi equipo y tarda mucho en leer los datos, veo que tu programa los lee muy rápido, hay que configurar alguna opción en simulink para que corra más rápido’?

    • Hola buen día y gracias por visitar el blog.

      En cuanto a tu pregunta, las opciones de configuración utilizadas en Simulink son únicamente las que se mostraron en el vídeo, no realicé ninguna configuración extra. Si tienes problemas en la velocidad a la que se hace la lectura podrías revisar la velocidad de transmisión (Baud rate) a la que tienes configurado el arduino o microcontrolador y la que estas configurando en MATLAB, depronto están configuradas a velocidades diferentes y esto genera un problema en la comunicación entre los dispositivos.

      Otra opción es mirar cada cuanto se esta enviando un dato desde el microcontrolador hacia el computador, estos retardos entre dato y dato pueden ser lo que te esta generando el problema de lentitud, por ejemplo en el caso del vídeo yo estaba enviando datos desde el arduino cada 50 milisegundos aproximadamente, osea unos 20 datos por segundo mas o menos.

  • Excelente explicación ,además de graficar dos datos es posible asignar un eje a cada variable? Por ejemplo en el ‘eje x’ los datos de fuerza, y en el ‘eje y’ los datos obtenidos de distancia, con el fin de obtener gráfica de fuerza x distancia

    • Hola buen día y gracias por visitar el blog.

      Primero que todo disculpa por la demora en la respuesta.
      Ahora en cuanto a tu pregunta, lo que quieres hacer no se podría con el instrumento scope ya que este instrumento siempre tiene ligado al tiempo en el eje x, sin embargo si debe ser posible de llevar a cabo remplazando el scope por el instrumento XY Graph que si tiene dos entradas (una para cada eje).

      Espero que aunque tarde te sea de ayuda. Si te gusta el contenido del blog puedes estar al día en las publicaciones en las cuentas de Facebook, Twitter y el canal de YouTube.

  • Hola! Muy buena explicación! Estoy intentando hacer lectura de dos sensors ultrasonido pero está mostrando «Response from instrument was non-numeric». Hay que hacer alguna otra cosa?

    • Hola buen día y gracias por visitar el blog.

      Primero que todo disculpa por la demora en la respuesta.

      En cuanto a tu pregunta, es posible que los datos que estas enviando desde el Arduino o el microcontrolador que estes utilizando, no se encuentren en el mismo formato que estas recibiendo en MATLAB, por ejemplo tu a MATLAB le dijiste que ibas a recibir números enteros y desde Arduino estas enviando los datos en un formato completamente diferente (String o numeros pero float), ese creo que puede ser el error en primera instancia.

      Espero que aunque tarde esta respuesta te sea de ayuda.

      Por ultimo, si te gusta el contenido del blog y quieres estar al día en las publicaciones, puedes seguirnos en las cuentas de Facebook, Twitter y el canal de YouTube.

  • Buenas saludos a todos. Tengo una duda. Ya me funcionó perfecto la recepción de datos tal cual como lo explica este tutorial. Yo recibo la lectura de un sensor ultrasónico desde arduino. Pero ahora quiero enviar datos desde simulink hacia el arduino por el puerto serial también, para controlar un motor dc a través de PWM. Es decir desde simulink enviar valores entre 0 y 255 y en arduino recibirlos y asignarlo al pin de salida del puente H conectado al motor.
    ¿cómo se hace esto?

    Muchas gracias de antemano, y saludos.
    Att: Jeisson Martinez

    • Hola buen día y gracias por visitar el blog.

      Para enviar datos por el puerto COM a un dispositivo externo podrías utilizar en simulink los bloques «Serial Configuration» y «Serial Send», con el primer bloque haces la configuración general del puerto serial y con el segundo la configuración de los datos de salida. Espero que esta respuesta te haya servido.

      Recuerda que puedes seguirnos en nuestras cuentas de Facebook, Twitter y YouTube para estar pendiente de todas las nuevas publicaciones del blog.

      • Buen día, si señor ya he realizado pruebas pero con los bloques de «query instrument» y «to instrument» y me funcionan por separado muy bien, es decir si pruebo enviar datos «to instrument» funciona, si pruebo por aparte recibir datos «query instrument» funciona bien, pero al querer enviar y recibir a la vez al parecer se satura el puerto y no sé como controlar esto. Además probé los bloques «Serial send» y «serial receive» pero no tuve éxito en realizar la comunicación.

        • Tiene algún ejemplo de comunicación «enviar y recibir » entre matlab y arduino, que me pueda enseñar?
          Gracias. Saludos

          • Hola buen día Jeisson.

            El momento no tengo ningún archivo o ejemplo disponible que cumpla con lo que necesitas en el tu proyecto. Lamento no poder ayudarte.

  • Buenos dias estoy trabajando con dos tipo de sensores, con el Sensor de presión HK3022 y el Sensor de flujo de agua 1/2″ YF-S201 a traves de una tarjeta arduino ,quisiera saber si puedo obtener los datos de estos dos sensores y graficarlos en el simulink

    • Hola buen día y gracias por visitar la pagina.

      Si es posible adquirir los datos de estos dos sensores con una tarjeta arduino y luego enviarlos al PC y graficarlos en simulink, el proceso para graficarlos no deberían variar con lo que se muestra en esta publicación, sin embargo debes tener en cuenta que la forma en la que te entregan los datos cada sensor es diferente, por ejemplo el sensor de presión te entrega un valor de voltaje que debes convertir con el ADC de arduino y a partir de ese dato calcular el valor de presión, mientras el sensor de flujo lo que te entrega son pulsos y con este sensor lo que debes hacer es contar y calcular la frecuencia de los pulsos para luego si calcular el flujo. Luego que ya tengas esos dos datos calculados (presión y flujo) si puedes enviar los datos a simulink para graficarlos.

      Recuerda que si te interesa estar al tanto de las publicaciones de la pagina, puedes seguirnos en nuestras cuentas de Facebook, Twitter y YouTube.

  • Hola! Estoy intentando hacer un maquina de estado con stateflow y un arduinno mega. Para entender bien como funciona tomé tu ejemplo para aprender a comunicarme entre simulink y arduino via serial, sin embargo no lo logro, me aparece el error «Response from instrument was non-numeric». Intenté descargar el archivo de arduino que colgaste pero no me deja, podrias por favor enviarlo a mi mail? o actualizarlo?

    Te aagradezco, saludos!

    • Hola buen día y gracias por visitar la página.

      Primero que todo disculpa la demora en la respuesta, pero debido a las diferentes obligaciones que he tenido no he podido dedicarle mucho tiempo al sitio.
      En cuanto a tu pregunta el error al parecer es que estas enviando del arduino a MATLAB datos que no son completamente números (Puedes estar enviado números y otros caracteres) o puede que estés enviando números en distinto formato al formato en el que los estas recibiendo en MATLAB, por ejemplo de arduino estas enviando float pero en MATLAB tienes configurado recibir int.

      En cuanto a lo del archivo de arduino, disculpa que no esté disponible pero algún personaje mal intencionado lo reporto y no he podido restablecerlo hasta el momento.

  • hola me podrias facilitar tu codigo de arduino, tu link no me abre, gracias

    • Hola Cristian Gracias por visitar la página.

      Ya te envíe el archivo por la fanpage de facebook, espero pronto poder restablecer el link acá en la pagina.

  • Hola buen dia, realice una electrocardiografo y deseo mostrarlo por simulink, pero me dice “Response from instrument was non-numeric”. en matlab no me da errores, pero la gráfica no es muy buena.

    • Hola buen día y gracias por visita la página.

      Disculpa la demora en la respuesta. El error que mencionas es porque los datos que esta tomando el bloque Query no son de tipo numérico, puede ser que los datos que estas enviando desde el microcontrolador no sean numéricos o que en MATLAB no estés configurando bien el tipo de dato que estas recibiendo.

      Recuerda que si quieres estar al día de las publicaciones de Geek Electrónica (Pronto vienen nuevas publicaciones) puedes seguirnos en nuestras redes sociales, estamos en Twitter, facebook y YouTube.

Los comentarios están cerrados.