Página principal
Serial
plotter
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