Durante el desarrollo necesitamos un conversor análogo digital el cual esta incluido en la placa del Arduino UNO R3, su función es medir una tensión de entrada(señal análoga) y convertirla a un numero (señal digital). La resolución de este conversor A/D es de 10 bits para un rango entre 5V - 0V, es decir, la resolución del A/D es de 1024 números, en donde 5V equivale al numero 1023 y 0V equivale al numero 0; (para hallar la equivalencia de los números se utiliza una regla de 3).
Sketch del Arduino

https://www.dropbox.com/s/hbawi4416ch72g8/Osciloscopio.ino
El programa se comunica por puerto serial con matlab, mas adelante se explicara el código utilizado en matlab, y así funciona:
Arduino espera a que reciba una bandera (-1) para saber que tiene que empezar a muestrear, luego espera a recibir la frecuencia de muestreo, después de haber recibido estos dos datos Arduino empieza a muestrear la señal y luego a enviar los datos por el puerto serial. Para este fin se utilizo la velocidad maxima soportada por el Arduino en el envío de datos por el puerto serial la cual es 115200 Baudios, esto significa, 115200 bits por segundo (esta información es relevante para evitar tomar mas datos de los que puedo alcanzar a enviar en un tiempo determinado). Midiendo los tiempos de ejecución de las lineas de código (utilizamos la función micros() del arduino) y ademas calculando el tiempo que tarda en enviar los datos, encontramos que el Sketch funciona perfectamente a unas frecuencias de muestreo entre [4-2700] Hz. "Teóricamente debe funcionar a los 7200 Hz :)"
Recomendaciones a Leer Acerca de las Interrupciones en el Micro del Arduino UNO R3:
Recomendaciones a Leer Acerca de las Interrupciones en el Micro del Arduino UNO R3:
MATLAB
En matlab utilizamos una GUI (Interfaz de Usuario) bastante sencilla con el fin de no hacer tan lento el programa. Se recomienda para una comprensión total de este código leer acerca de las funciones en matlab que aparecen en el mismo, ademas relacionarse con GUIDE de matlab.
Como idea general el programa utiliza un ciclo while que se ejecuta al presionar el botón "iniciar", este ciclo se mantiene siempre y cuando la bandera de arranque 'BandArranque' este activa y para desactivarla se usa el botón "Finalizar" en el panel de "Recepción de Datos", dentro del while se toman los datos, se modifican ('Offset', 'Escalamiento') y se almacenan en un "Buffer" para luego ser graficados; ademas dentro de este mismo código existe un segmento que permite guardar la información en un archivo 'Datos.txt', ademas se guarda un archivo 'ControlTimes.txt' que contiene los tiempos de ejecución por ciclo, tiempo por muestra leída en cada ciclo y la cantidad de Bytes antes de iniciar un ciclo en el Buffer, estos tres datos son importantes puesto que dentro del archivo Osciloscopio.m se explica el origen de una cuarta variable importante llamada NBytes, la cual es la cantidad de Bytes leídas en un ciclo, todas estas variables se pueden ver fácilmente al ejecutar el archivo Resultados_Tiempos.m.
Nota 1 El valor mínimo de 'PeriodRefresco' la cual especifica cada cuanto tiempo graficar, por defecto esta en 3 [mSeg], y este valor se puede modificar puesto que es relativo a la maquina, se recomienda antes de modificar, hacer una prueba con un PeriodRefresco = 5mSeg, ejecutar el proceso de guardar y seguidamente de finalizarlo, ejecutar el script Resultados_Tiempos.m, luego analizar la primera grafica y determinar el valor minimo que se encuentre, este valor es el que se recomienda cambiar como limite minimo de PeriodRefresco, estos limites se modifican en las lineas 112,113,232,233 y 347 del archivo Osciloscopio.m reemplazando el 0.03 por el valor encontrado.
Nota 2 Limite la variable PeriodCiclo a 0.01 porque para ese valor el InputBuffer se mantenía relativamente estable, es decir, sin muchos picos grandes, esto se ve en la gráfica 3 al ejecutar el script Resultados_Tiempos.m después de una toma de datos, si se desea se puede disminuir o aumentar este valor y mirar los resultados al ejecutar el script, recordando que lo ideal es que el InputBuffer se mantenga estable, para así prevenir cambios bruscos y por tanto perdidas de información.
Importante: La función Datos2int.m tiene que estar en la carpeta donde se encuentren todos los archivos.
Nota 2 Limite la variable PeriodCiclo a 0.01 porque para ese valor el InputBuffer se mantenía relativamente estable, es decir, sin muchos picos grandes, esto se ve en la gráfica 3 al ejecutar el script Resultados_Tiempos.m después de una toma de datos, si se desea se puede disminuir o aumentar este valor y mirar los resultados al ejecutar el script, recordando que lo ideal es que el InputBuffer se mantenga estable, para así prevenir cambios bruscos y por tanto perdidas de información.
Importante: La función Datos2int.m tiene que estar en la carpeta donde se encuentren todos los archivos.
Archivos:
Recomendaciones a Leer en el Help de Matlab:
- set
- get
- Serial
- fopen
- fclose
- fprintf
- fscanf
- fread
- drawnow
- save
- axis
- eval
- instrfind
- try/catch
- Declaración de variables globales
El programa incluye dos funciones que nos ayudan a obtener información sobre las variables y a cambiar los valores de estas variables importantes.
- cambiar('Variable',Valor)
- variables() //Sirve para obtener información acerca de todas las variables
hola sera que puedes volver a subir el fichero del .ino de arduino
ResponderEliminarhola, por favor podrías compartir nuevamente el archivo. Gracias
ResponderEliminar