Limitantes en Biblioteca “SoftwareSerial” de Arduino

Standard

Que tal amigos lectores, me da gusto estar con ustedes de nuevo. Les comparto que en particular este post me alegra mucho redactarlo, ya que la empresa decidió apostar por contar con mis servicios de forma oficial, es decir no seré más un practicante, sino un desarrollador mecatrónico, fuck yeah! Por supuesto que en lo personal es algo que me motiva mucho,ya que desde un inicio me sentí feliz de encontrar un lugar donde aplico los conocimientos de mi perfil profesional y además día con día continuo desarrollando nuevas habilidades. Por lo cual estoy muy agradecido con esta empresa quien ahora me da la oportunidad de seguirme formando profesionalmente.

Pero bueno, continuemos con lo que nos compete en este blog. En la empresa he realizado labores en particular de 3 grandes áreas de la ingeniería mecatrónica. He realizado actividades de diseño mecánico, de diseño electrónico y de programación de microcontroladores. Trabajando hace poco tiempo en un proyecto donde estaba involucrado en la parte de diseño electrónico y programación, me topé con pared de una forma verdaderamente absurda por querer hacer las cosas de una manera “sencilla” y “práctica”. Sin embargo durante las pruebas finales las cosas no resultaron como lo esperábamos mi jefe directo y amigo, Jesús Quintero y yo. Pero bueno, todo comenzó de la siguiente manera.


Se estaba desarrollando un proyecto donde en un principio solo se requería un sensor que se comunica mediante el protocolo I2C, un Xbee, este último se comunica a través del puerto serial, y que el prototipo se alimentara mediante una pequeña celda solar. Todas las actividades que involucraron electrónica y programación se me asignaron, en ese mismo instante Jesús me comentó que él anteriormente había diseñado un circuito muy similar y tuvo la amabilidad y confianza de facilitarme el desarrollo anterior. Con ello me ponía las cosas muy sencillas y mis actividades se compactaron sobre todo en el diseño electrónico ya que solo tuve que realizar algunos ajustes para concluir el diseño electrónico. El resultado de dicha actividad fue la siguiente imagen:

circuitobrd

Repito, aquí solo tuve que ajustar ese diseño de acuerdo a las necesidades del proyecto. No me tomó mucho tiempo realizarlo. Como pueden ver el microcontrolador es un Atmega328P el mismo que utilizan los ArduinoUno. Y si, tal y como lo están pensando se desarrolló el software con Arduino IDE. En otras palabras esa plaquita es un Arduino diseñado por nosotros. Desarrollar todo el software necesario tampoco me tomó mucho tiempo. Una vez realizada esta etapa, se me pidió que al diseño anterior le agregara una pantalla LCD en la que se mostrarían los datos arrojados por la medición del sensor. La pantalla LCD que se le agregó tiene la característica que es RGB y que cuenta con un pequeño controlador que facilita enormemente su manejo ya que hace que toda la transferencia de datos se logre mediante comunicación serial.

lcd lcd1

Y es aquí donde comienza a oscurecerse el panorama. El chip ATmega328P solamente cuenta con un puerto serial físico que ya estaba ocupado por el Xbee. Pero para solucionar esto existe una biblioteca en Arduino que se llama <SoftwareSerial> que lo que hace es que te permite crear puertos seriales virtuales en los pines del chip. Entonces pensé “ok, sencillo, solamente agrego las conexiones de la LCD al diseño del circuito y agrego un poco de software”. Y en efecto si fue sencillo y si funcionó. Ahora tenía todos los requerimientos que en ese momento el cliente pidió y tenía un puerto serial físico, y un puerto serial virtual funcionando de forma correcta. Pasaron los días y durante una plática con el cliente, éste determinó que a ese desarrollo le agregáramos un GPS. Y en la empresa ya disponíamos de algunos GPS que nos servirían para este desarrollo. Y casualmente también se comunicaban por puerto serial.

gps

Volví a pensar, “sencillo, creo otro puerto serial virtual, agrego más software y listo”. Y alegremente empezamos a trabajar Jesús y Yo. Con el apoyo de Jesús, el desarrollo lo tendríamos mucho antes de lo esperado y entregaríamos los resultados al cliente mucho antes de lo esperado. Entonces una vez que realizamos las modificaciones necesarias y fabricamos el circuito, lo programamos y comenzamos las pruebas. Y fue ahí donde comenzamos a detectar anomalías. El Xbee se encontraba funcionando correctamente porque recibíamos datos, aunque recibíamos pura basura, donde se suponía deberíamos ver los valores que arroja el GPS el Xbee estaba cumpliendo con su función, además de eso la pantalla LCD no desplegaba ningún valor, solamente se iluminaba. Lo primero que procedimos a revisar es si alguna parte de hardware estaba mal. Y después de un buen rato concluimos que todo estaba correcto. Después procedimos a revisar el software, donde aparentemente para nosotros no había problema, pero para asegurarnos pedimos el apoyo de nuestro Gerente Operativo Jorge Macías quien nos apoyó a revisar de manera conjunta la programación del sistema.

Después de un largo rato se concluyó que tal vez habría conflictos con la comunicación de los dispositivos. Y repito el hardware no estaba mal. Pero tampoco teníamos la certeza que es lo que podría estar causando el conflicto. Entonces en un momento de desesperación comenzamos a hacer algo que debimos realizar desde el inicio del proyecto. Nos pusimos a estudiar la biblioteca. La verdad no fue difícil encontrar la respuesta al problema que estábamos enfrentando, el problema era que esta biblioteca tiene ciertas limitantes, y una de ellas es que para la transferencia de datos solamente se puede realizar con un solo puerto serial virtual! Uno solo!. Efectivamente se pueden crear muchos puertos seriales virtuales, pero no pueden trabajar al mismo tiempo. SOLAMENTE TRABAJA UNO. Y para mi sorpresa ciertos pines de los microcontroladores de Atmel no se pueden utilizar para este propósito. Y aunque no estábamos metidos en algo que comprometiera el entregable al cliente, si tuvimos que trabajar a marchas forzadas para rediseñar toda la parte electrónica del proyecto, ya que cambiamos de microcontrolador.

El Atmega2560 que cuenta con 4 puertos seriales físicos, es el chip que manejan las distribuciones de ArduinoMega. Y con ese chip efectivamente ya no tuvimos problemas y alcanzamos a entregar en tiempo y forma los resultados al cliente, muy fatigados mentalmente, pero a fin de cuentas cumplimos con el objetivo. Personalmente esta experiencia me deja muy clara una cosa, siempre que vayamos a utilizar herramientas computacionales como la biblioteca hay que estudiar tanto sus ventajas como sus desventajas. De haber hecho, lo anterior nos hubiéramos ahorrado una enorme frustración y simplemente las cosas hubieran resultado de mejor manera.

Pero bueno amables lectores, espero que esta experiencia que les comparto les sirva para no caer en la misma trampa y así se eviten algunas canas en su cabello, de mi parte ha sido todo por el momento.

Me despido de ustedes mandándoles un fuerte abrazo. Hasta la próxima!

Leave a Reply

Your email address will not be published. Required fields are marked *