Toma de datos serial y graficación en MATLAB
HTML-код
- Опубликовано: 13 окт 2024
- Explicación de como tomar datos por un puerto serial y luego graficarlos en MATLAB.
Contacto Twitter:
/ ivancuadrosa
/ geekelectronica
Link de la entrada del blog Geek Electrónica
geekelectronic...
Tomar datos por puerto seriar y graficar con Simulink de MATLAB:
geekelectronic...
Gracias me has salvado tu código me salvo de mi proyecto
Ya te cite de la manera adecuada
Solo una duda de cuanto es el potenciometro que estas utilizando yo uso uno de 100k y me va muy lento la grafica me refiero a la hora de oscilar
Tengo una consulta, me gustaría saber como manipular la información, osea que en un cierto tiempo me realice un muestro de valores y que al finalizar ese tiempo me pueda decir por ejemplo ¿en cual tiempo se obtuvo un pico de la señal? y cosas así. Apreciaría mucho su ayuda.
Gracias amigo era justo ll que necesitaba aprender como plotear un proceso gracias
Buenas tardes, el video es de mucha utilidad, gracias, me preguntaba si se podria tomar los datos de un modulo TEA5767 y graficarlos, el modulo es un receptor de FM, gracias por su tiempo
Hola buena noche, disculpa en la línea 37 voltaje(contador)=valorADC(1)*5/1024 porque usas valorADC(1) y no valorADC(contador); me imagino que *5 es para tener un valor de 0 a 5 en voltaje...espero tu respuesta. Gracias!
Hola! Muy buen video!. Pregunta, ¿Puedo sustituir el Arduino por un ADC080x seguido de una interfaz USB CP2102 para la comunicación serial con la PC? ¿Ya no seria necesario un Microcontrolador?
oye ya hice el programa en matlab, pero una vez ya hecho lo tengo que compilar?, le pongo en "run"??.. o como?.. y donde tiene que estar el archivo que cree, el la carpeta de matlab??.. gracias x tu tiempo =)
Si quisiera que el eje X lo grafique en segundos, tendria que usar la frecuencia de muestreo de el arduino que es 10Khz o la transmisión del puerto serial inflería en algo??
Buenas, gran video amigo, tengo una pregunta, he probado varios codigos de toma de datos serial y en ninguno he podido ver la graficacion rapida como en este video, en todos me sale la grafica del muestreo demasiado lenta, no se si usted sabe que podria ser.
Te pregunto: Tego un arduino Nano MEGA A328P pero el paquete serial no es compatible con esta tarjeta. Tu sabes que versiones de Arduino son compatibles con el paquete serial?
hola una pregunta estoy ussando otro micro se programaria diferente o seria lo mismo gracias pr la introduccion que si me llamo la atencion
Como podria simular la lectura del sensor mlx90614 con arduino uno, usando el grarico de matlab?
Se necesita algún programa en el IDE de arduino? O solo con matlab
Hola como estas? Quiero hacer un programa para un banco de prueba de motores, pero necesito graficar el Torque (eje Y) en función de las RPM (eje X). El microcontrolador envía esos datos por el mismo puerto serie. Que debería modificar para obtener esos valores? Muchas Gracias
Antes que nada, agradecerte y felicitarte por tan detallado vídeo, ahora bien, te agradecería si me puedes ayudar con el siguiente error: Error in ADC_Serial (line 37) voltaje(contador)=valorADC(1)*5/1024....de antemano gracias por la ayuda.
creo que es =valorADC(1)*5/1023...
Exceente vídeo, muy bien explicado. Realmente gracias. DTB.
Hola, una pregunta...¿Como puedo obtener los datos de una placa de grabacion conectada a un arduino en un puerto serial? Es decir, la placa esta conectada al arduino en un pin serial, y el arduino esta conectado a la computadora. Necesito procesar estos datos en Matlab, ya tengo la vinculacion arduni-Matlab pero no se como obtener los datos.
Gracias por tu tiempo.
Buenas tardes amigo, tu video me sirvio mucho para mi tesis de grado, pero tengo un problemita, la grafica es muy lenta, es decir, cuando cambio el voltaje en el potenciometro tarda mucho en realizar el cambio en la grafica. Estoy utilizando un PIC18f4550 via RS-232 usando un cable RS-232-USB. Cual podria ser el problema?
Hola buen día.
Pueden haber muchas razones, por ejemplo cada cuanto esta enviando los datos del microcontrolador al computador?
Si no es por el tiempo de muestreo. Este metodo tiene un problema cuando se requiere tomar un numero elevado de muestras, ya que empieza a mostrar retardos en la grafica.
Si quiere tambien puede tomar los datos y graficar directamente en simulink de matlab y de esta forma obtiene mejores resultados.
En mi nuevo canal de RUclips llamado Geek Electronica, puede encontrar un vídeo explicando como hacer este proceso con simulink.
Hola estoy tratando de acceder a información que envió a un Xbee, en mi consola puedo observar como estoy recibiendo datos entre 0-1024, pero cuando intentousar el programa que muestras me sale este error Unsuccessful read: The input buffer was filled before the
Terminator was reached. Cual crees que sea el error
Hola Ivan excelente video, pero tengo un pequqñlo inconveniente:
Quiero adquirir datos de un multimetro digital mediante rs232 conectado directamente a un pc. Cuando corro el programa me aparce:
Attempted to access valorADC(1); index out of bounds because numel(valorADC)=0.
Segun entiendo la funcion numel cuenta el numero de elementos de una matriz, lo que indicaría que no logra reconocer lo que estoy midiendo. A lo mejor necesito traducir de alguna manera lo que me manda el multimetro pero no tengo idea como. Seria de gran ayuda si me puedes orientar de algun modo.
De antemano muchas gracias
Buenas, amigo quisiera saber como podría transmitir los datos del arduino por medio del puerto USB del pc, como se habilita en el codigo el puerto USB en MATLAB?
Muy buen tutorial amigo, gracias por compartirlo
Con mucho gusto.
como graficarías señales negativas usando el uart del arduino??
muy bueno amigo, consulta, ¿se puede graficar en un eje de tiempo infinito ? Muchas gracias
Hola buen día.
Me parece que MATLAB no seria el software o al menos este código no sería el adecuado para realizar una gráfica "en tiempo real" con el eje de tiempo indefinido, ya que al estar actualizando continuamente los valores de los vectores para realizar la gráfica con el comando plot en algún momento se llegaría a saturar el procesador y se verían retrasos entre los datos tomados y la gráfica.
Excelente video amigo; una consulta si quisiera luego exportas estos datos del muestreo a un libro de excel cual seria el codigo?
+Antonio Garcia Hola buen día, como esto te genera un vector en el workspace de MATLAB la forma mas facil seria abrir la variable, copiar los datos y pegarlos en un archivo de excel, pero si quieres que se haga automáticamente desde el código, puedes utilizar entonces en MATLAB el comando xlswrite.
Espero te sea de ayuda.
+Iván Cuadros Acosta Ok, gracias por responder, opte por la primera opcion que mencionaste, pero quisiera hacerlo en auto, use la instruccion xlswrite pero no lo muestra..
+Antonio Garcia depronto la sintaxis de la instrucción xlswrite quedo mal escrita, esta instrucción va de cualquiera de las siguientes formas:
* xlswrite('NombreArchivo.xlsx',variable);
* xlswrite('NombreArchivo.xlsx',variable,'nombreHojaenqueseguarda');
* xlswrite('NombreArchivo.xlsx',variable,'rangodeceldas');
* xlswrite('NombreArchivo.xlsx',variable,'nombreHojaenqueseguarda','rangodeceldas');
Disculpa una pregunta, que cambiaria si en mi caso mi arduino esta captando la temperatura constantemente, en donde ingreso los datos para que igual sean graficados?
+Omar Rdz Hola buen día, primero que todo que pena la demora, básicamente el proceso es el mismo ya que aunque la variable física que esta midiendo es la temperatura, esta sigue siendo representada por medio de un voltaje, por lo tanto el único cambio que habría que hacer es crear una variable temperatura donde se haga la conversión de voltaje a temperatura teniendo en cuenta la resolución del sensor y finalmente si graficar esta nueva variable.
Espero que te haya sido de ayuda.
Hola. Podrías compartir el montaje físico de los potenciometros con el Arduino? Muchas gracias
Hola, excelente video! Una duda si,.. Como se el tiempo de muestreo?
Supiste como hacerlo?
@@christiangallardo5815 hola! pudiste ver lo del tiempo de muestreo?
muy buen tuto!! me funciono correctamente...!!
+Natalia Ramirez.. este es elcodigo q use:
clear all
close all;
clc;
numero_muestras = 300;
y=zeros(1,1000); %Vector donde se guardarán los datos
%Inicializo el puerto serial que utilizaré
delete(instrfind({'Port'},{'COM3'}));
puerto_serial=serial('COM3');
puerto_serial.BaudRate=9600;
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
%Abro el puerto serial
fopen(puerto_serial);
%Declaro un contador del número de muestras ya tomadas
contador_muestras=1;
%Creo una ventana para la gráfica
figure('Name','Jorges Huaman, Reyes Cotrina')
title('FONOCARDIOGRAMA');
xlabel('Número de muestra');
ylabel('Voltaje (V)');
grid on;
hold on;
%Bucle while para que tome y dibuje las muestras que queremos
while contador_muestras
Excelente tutorial
y si estoy recibiendo varios datos.. en mi caso recibo 3 datos diferentes.. como podría hacerle ahí usando la misma lógica..
muy buen video! una duda, me sale error Attempted to access valor(1); index out of bounds because numel(valor)=0. a que se debe?
De mucha ayuda, muchas gracias
el linkesta caido pero el video muestra el codigo solo ai que reescribirlo cuando lo tenga pongo el link
disculpa, tendras todavia el archivo que me puedas proporcionar, estoy haciendo uno muy parecido pero me manda error, en el tamaño del vector, un vector siempre es mas grande por una unidad siempre, gracias
Esta excelente !!!! :) :) :) :) .
Oiga profe Tengo un proyecto con un 16F88 y LCD 16x2 que toma tiempos...
Y la terminar quisiera enviar ese dato a mi compu vía USB, ¿Se puede? ¿Como seria?
GRACIAS...
FELICITACIONES
Si funciona. muchas gracias
Disculpa, como puedo hacer lo mismo pero ahora observandolo en simulink o bien como puedo pasarlo a simulink.?????
Hola buen dia. Le dejo un link de un video de mi nuevo canal donde explico como hacerlo en simulink.
ruclips.net/video/fWT8Jt_yfY4/видео.html
Espero que el video le sea de ayuda.
Perfecto
Que tal, me podría comentar ¿cómo es la conexión del potenciometro? es mi única duda, gracias.
Hola buen día.
El potenciometro está conectado como un divisor de voltaje y la salida de este se conecta a una de las entradas análogas del arduino.
Ya quedo, muchas gracias!! me sirvió mucho
Excelente video ,
Disculpa me podrias ayudar con una duda , al ejecutar en Matlab me sale este error.
Warning: Unsuccessful read: Matching failure in format..
Gracias por tu ayuda.
Hola buen día.
El problema puede ser por el tipo de variable que se esta enviando desde el arduino o el microcontrolador y el tipo de variable que se está recibiendo en MATLAB (int, float, char...).
Espero que la respuesta le sea de ayuda.
Disculpa a que frecuencia estas muestreando en el arduino
Excelente vídeo !
Hola, disculpa, me funciona y todo pero tengo un retraso de al rededor de 15 segundos en la graficación, tienes idea de por qué haga esto?
Hola buen día.
Me imagino que la cantidad de datos que se esta tomando es muy grande. Con el método con el que hago la gráfica en este vídeo este es un problema que se tiene (el retraso con cantidades de datos muy altas), tal vez se pueda corregir cambiando los métodos utilizados en el plot, pero es algo que no he intentado hasta el momento.
Otra forma de hacerlo es tomar los datos y graficar directamente con simulink de MATLAB (esta opción no presenta retrasos), si le interesa este método puede seguir el link de mi blog que se encuentra en la descripción del vídeo, ahí se explica paso a paso lo hecho en este vídeo y hasta como graficar dos señales y al final de la publicación un enlace donde se explica como tomar los datos y graficar con simulink de MATLAB.
Buenas noches, y para hacer lo contrario....llevar una señal de Matlab a el Pic por puerto serial, como se haría la conexion?
Hola buen día.
Si esta manejando el mismo tipo de comunicación serial con un puerto COM, la conexión entre PC y microcontrolador no cambia, lo que debe cambiar es el programa de MATLAB, en lugar de utilizar el comando fscanf para recibir los datos que esta enviando el microcontrolador, deberia utilizar el comando fprintf para enviar los datos del PC al microcontrolador.
Espero que el video y la respuesta le hayan sido de ayuda, si quiere visitar la entrada de mi blog donde se explica cada parte del codigo utilizado en este video, puede seguir el link que se encuentra en la descripción del video.
En mi caso tengo una señal la cual tiene 4141 muestras, las cuales fueron tomadas en 4 segundos. Necesito crear el codigo donde pasado 1 segundo el programa me diga en que posicion y que valor tiene ese vector en ese tiempo determinado. o sea q debe arrojarme 4 datos en 4 segundos. e programa de matlab va por comunicacion serial al pic16f887, el cual al mismo tiempo me envía esa informacion por vía GSM....Mi pregunta es: 1) para q me de esa posicion en ese tiempo determinado que ciclo utilizo? 2)y como envio ese dato al pic?
Si ya tiene una señal fija con numero de muestras determinado que dice que son 4141 muestras que fueron tomadas en 4 segundos, quiere decir que toma aproximadamente 1035 muestras por segundo, una opción para que envié los datos de las muestras tomadas solo en los 1, 2, 3, y 4 podría ser:
Con un ciclo for ir recorriendo el vector donde tiene guardadas las muestras y ademas dentro del ciclo for tener un condicional if que compare el valor de la variable contadora del for con las posiciones que corresponden a esos segundo que solo quiere imprimir (1035, 2070, 3105 y 4140) y si son iguales entonces imprima por el puerto serial con la función fprintf el valor alojado en esas casilla.
Espero que con esto se le haya aclarado un poco las dudas que tenia.
Gracias por el video. Estoy validadnoel codigo pero sale el siguiente error:
Error in ==> ADC_Serial at 25
while contador
Me sale el mismo error
El archivo ADC_Serial.m no se encuentra disponible
Hola, oye disculpa, tengo un problema con el MAtlab. Estoy usando un STM32F103C8 y me aparece la layenda: Warning: Unsuccessful read, matching failure in format, ¿Podría darme una pista de dónde está mi error. Gracias
yo uso lgo similar, uso un STM8S105C6, y me resulta lo mismo, si grafica, pero lo hace demasiado lento y con valores diferentes a los esperados
Que crees que ya pude resolver ese problema. Tienes que revisar en tu microcontrolador como es que estás enviando los datos: en columnas, en pares, si tienes saltos de líneas, etc, para luego en el Matlab hacer la adquisición correcta. A mi me ayudó un profesor para resolverlo
Haré eso :D
Como configuro mi matlab para recibir datos?
Para obtener el voltaje se divide entre 1023 y no entre 1024, el mapeo es entre 0 y 1023.
+3E WINNING 3E Hola buen día, tiene razón cometí ese pequeño error es (2^n)-1 lo que da 1023, muchas gracias.
excelente
disculpa se callo el link te agradeciera si lo puedes volver a subir gracias
Index exceeds matrix dimensions. Me sale ese error en la linea 39.
voltaje(contador)=valorADC(1)*5/1024; %Hace la conversión a voltaje
Me podrías ayudar?
¿Pudo solucionarlo? y si pudo, ¿como? gracias
Hola el link esta caido, y como seria el codigo en arduino
hola estoy haciendo pruebas con tu codigo y me sale esto sabras por que?
function ADC_Serial(muestras) %la funcion recibe el # de muestras que debe tomar
|
Error: Function definitions are not permitted in this context.
Hola buen día, seguramente declaraste alguna variable o colocaste un código nuevo antes de la función ADC_Serial, esta clase de problemas suelen generarse en esos casos porque al llamar la función se espera que la primera linea que este en el código sea la definición de la función.
disculap el archivo para descargar no se encuentra disponible
Al pasar las 600 muestras como que lo hace mas lento, ya no esta en "tiempo real" ¿¿alguien sabe a que se deba??
ayudame con un nuevo link del programa ya desaparecio el link anterior
Alguien pudo solucionar este error?
"Index exceeds matrix dimensions."
Y sirve para graficar datos de sensores?
+Miguel Angel Mont Lükacs Hola buen día, si podría utilizarlo para graficar datos de sensores, incluso dependiendo del tipo de sensor que vaya a utilizar puede cambiar el tipo de grafica para ajustarlo a una visualización mas acorde a sus necesidades.
si quiere puede visitar mi blog por medio del link que hay en la descripción del vídeo y así revisar el código MATLAB que se encuentra explicado.
Tiene incidencia la referencia de la placa de Arduino que se este manejando? Gracias.
tego erro en el while contador
que tal disculpapor que me sale este error? Error in ADC_serial (line 11)
fopen(puerto);
Hola buen día.
Puede ser que el nombre del puerto que se creo en el computador al conectar el dispositivo sea diferente al nombre que se le colocó en el programa de MATLAB.
Si quiere puede revisar la publicación sobre este tema de mi blog Geek Electrónica donde se explica paso a paso el programa realizado en MATLAB, el link a la publicación del blog lo puede encontrar en la parte de abajo del vídeo, en la información.
En el blog también puede encontrar una publicación sobre como hacer esto mismo pero utilizando Simulink de MATLAB.
alguien sabe como define el que puerto utilizar? esque tengo un arduino uno y tiene 6 puertos analogicos
Hola, una pregunta ¿qué pasa si tengo un sistema de 16 bits?
Hola buen día.
¿Me podrías indicar que microcontrolador o dispositivo estas utilizando para hacer la transmisión de datos y así mismo que tipo de comunicación estas implementando?
Hola.
Tengo una duda acerca de la adquisición de datos, puedo de tener un programa en arduino y otro en matlab y no me afectara lo que tenga en arduino para adquirir los datos?
Hola ogc1993, buen día.
necesariamente debes tener un programa en arduino que envié los datos al pc y otro programa en MATLAB que se encargue de recibir los datos en el pc, si quieres revisar un poco mas el tema, puedes seguir el enlace que se encuentra en la descripción del vídeo que los lleva a la publicación de mi blog en donde explico paso a paso el funcionamiento de esta practica.
He probado de mil formas y siempre me sale este error: A que se debe¿
Error in ADC_Serial (line 24)
voltaje(contador)=valorADC(1)*5/1023;
x2
Amigo me sale este error Error using ADC_Serial (line 35)
Not enough input arguments. no se a que se deba
Hola buen día.
Primero que todo discúlpame por la demora en la respuesta, pero he tenido que dejar este canal un poco de lado para dedicarme a atender mi nuevo canal Geek Electronica (Si quieres puedes buscarlo acá mismo en RUclips y ver los nuevos vídeos y si te gustan podrías suscribirte a ese canal).
En cuanto a tu pregunta, me tocaría mirar específicamente que dice esa linea para saber que procedimiento esta llevando a cabo, sin embargo por el error que comentas creería que al hacer el llamado de la función no estas indicando la cantidad de mediciones que quieres realizar, por ejemplo si quieres realizar 200 mediciones al llamar la función tendrías que decir:
ADC_Serial (200);
Si quieres también puedes revisar los links que se encuentran en la descripción del vídeo que redirigen a mi blog y en donde podrás encontrar explicada cada una de las partes del código o también como tomar datos y graficarlos con simulink de MATLAB.
Muchas gracias por visitar el canal y te espero en el blog y en el nuevo canal de RUclips.
gracias Ivan, parece sencillo cuando lo explicas, voy a procurarme de los archivos y software para probar, recien comienzo con algunas pequeñas cosas en Arduino y una que me interesa es tomar datos de distintos tipos de sensores y poder graficarlos. Uno es un proyecto par mi uso personal "Estación meteorologica" y otra es una aplicacion de una balanza con celda de carga
lo podrías volver a bajar el ADC_Serial.m. gracias..
podre poner un encoder rotativo para medir tiempo basado en cada pulso.
man el codigo no se puede descargar
seria de grana ayuda
Hola disculpa molestar me bota el siguiente error, Not enough input arguments.
+Juan Sebastian Calderon Cordoba Hola buen día y disculpa la demora, seguramente no esta colocando el numero de muestras que quiere tomar en el momento de invocar la función ADC_Serial.
si quiere revisar en mi nuevo blog puede ver una entrada sobre este mismo tema. El link se encuentra en la descripción del vídeo.
Mira q lo logre pero va muy lento demasiado diria
Juan Sebastian Calderon Cordoba posiblemente estas tomando un numero demasiado elevado de muestras y con un tiempo de muestreo demasiado corto.
Si no es necesario hacer la grafica en tiempo real puedes dejar el comado plot por fuera del ciclo para que solo dibuje la señal cuando ya haya terminado de tomar las muestras.
Además este es un código de muestra que aun se puede depurar mucho mas.
Link caído.............
tambien lo necesitaba
como puedo mandar los datos obtenidos a un archivo exel?
Hola buen día.
lo mas fácil seria tomar la variable que queda en el workspace de MATLAB y copiar esos datos en un archivo de excel, pero si quiere que el archivo de excel se cree automáticamente al terminar de tomar los datos podría utilizar el comando xlswrite de MATLAB.
Espero que la respuesta haya sido de ayuda.
claro amigo me sirvio de mucho
Hola alguno que tenga el archivo me lo puede pasar, no lo puedo descargar
Porque no me acepta la función no entiendo :( ayuda
me sale error : Function definitions are not permitted in this context??
Hola, estoy usando un MPU6050 y un ArduinoUno.
Hola buen día.
Discúlpame pero ahora si no entiendo que quieres decir con sistema de 16 bits, porque el Arduino uno tiene un microcontrolador de 8 bits y la transmisión serial viene configurada por defecto también a 8 bits.
Hola, creo que me expliqué muy mal. Más bien me refería a la conversión de la señal en voltaje ¿siempre se divide entre 1023?
ahh ok. Ahora si te entendí.
la división para hacer la conversión de voltaje se trabaja con 2^(n-1) donde n es el numero de bits, para este vídeo estaba trabajando con un ADC de 10 Bits y por eso la división es el 1023, pero en tu caso que son 16 bits sería 65535
Muchas gracias, fue muy útil.
Un saludo.
Buenos días, alguien lo consiguio hacer con Raspberry?
me sale un error
buenas si tuviera tres ponteciometros como haria
Dice Enlace no válido.
hagame el favor de pasarme el codigo para la funcion ADC_serial
+Francisco Castellon Hola Buen día, primero que todo que pena la demora, en la descripción del vídeo ya coloque un nuevo link hacia mi blog donde se encuentra una entrada sobre este tema y un link para descargar el archivo.
me podrias pasar el codigo del arduino? gracias
buen video
Excelente trabajo amigo, estoy tambien desarrollando algo muy parecido pero lo que quiero graficar en 3d son las fuerzas g que me envia un acelerometro, seria un grafico que cambie de color dependiendo la fuerza, con tu experiencia en este trabajo que has hecho y que es genial me podras ayudar? es solo cambiar el tipo de grafico a uno que se genere en tiempo real algun tipo de función, crees que es posible?
De nuevo te felicito por este excelente trabajo amigo. y espero que compartamos conocimientos soy Ing Electronico y tambien me encanta el desarrollo de este tipo de proyectos.
Mi correo es icomec_@hotmail.com