Serial plotter
wxwidgets
wxwidgets
El programa Serial plotter es una utilidad que tiene arduino en versiones 1.6 . Sirve para crear una gráfica de dos canales analógicos que representan la tensión de los pines A0 y A1 del arduino.
Había realizado un programa parecido en Gambas (Visual Basic para Linux) ardupu.zip, y como estaba haciendo programas con la librería wxwidgets, decidí hacerlo con está librería.
La programación se realiza bajo Linux Debian 9.4 y con la librería wxwidgets versión 3.1.1, esto lo especifico por su importancia.
La programación ha sido un tanto liosa y complicada.
En principio por los pocos ejemplos de dibujo en la librería de wxwidgets.
La segunda causa soy yo, no soy bueno en la programación en C++ , y en ciertas ocasiones pienso que hay tanta abstracción en la programación de objetos, que en algunos casos llega a convertirse en programación ofuscada.
El colocar los distintos botones y controles fue fácil, el problema fue el dibujado de lineas y control del repintado, me llevo bastante tiempo.
En Linux Debian 9.4 y bajo librería wxwidgets versión 3.1.1 el programa funciona perfectamente.
Pero cuando lo compile bajo Windows en las librerías librería 2.8.12 y 3.1.1, compilaba bien, pero el funcionamiento era dispar.
Bajo la librería 2.8.12 simplemente no funcionaba se quedaba colgado.
Bajo la librería 3.1.1 el funcionamiento era extraño, en principio funcionaba bien, pero cuando se interactuaba con él programa, se bloqueaba. Después de muchas pruebas el único modo de que funcionara era modificar la cantidad de datos que mandaba el arduino, de los 40 por segundo, debía rebajarse a los 10 por segundo.
Los datos que manda arduino por segundo son 40*9=360 Datos/Segundo , 360*10=3600 bps. Debería se suficiente la velocidad de 115200 del puerto serie.
Después de muchas vueltas buscando alguna solución, la encontré. Modificar los tiempos de espera entre bytes en la configuración serie. Esto se consigue cambiando los parámetros:
time_out.ReadIntervalTimeout = 10; //20;
time_out.ReadTotalTimeoutMultiplier = 1; //2;
time_out.ReadTotalTimeoutConstant = 2; //50;
También existía diferencia entre las versiones 2.8.12 y la 3.1.1 en el repintado (onPaint) . Aunque en Linux funcionaba perfectamente en las dos versiones de las librería, en Windows no pasaba lo mismo.
Para arreglar esto modifique:
#if YesWindows
dc.Blit(31,5,768,255, dcBuffer, 31, 5, wxCOPY, true);
#else
dcPantalla->Blit(31,5,768,255, dcBuffer, 31, 5, wxCOPY, true);
#endif
De esta forma funcionaba en los dos sistemas operativos.
Existe algún problema en el repintado, pero eso solo pasa si tenemos ventanas por encima de la nuestra.
También se podría realizar una rutina donde se busquen los puertos serie disponibles, es fácil, pero eso os lo dejo hacer a vosotros.
Programa funcionando.
Programa funcionando y con el código donde se muestra el programa que tiene que instalarse en el arduino.
PROGRAMA
Hasta pronto.
JUAN GALAZ
Bibliografía:
wxtutor.html
wxtem.html