Depurar un programa consiste en detectar y corregir errores de programación. 

En el mundo de la programación, los millones de líneas de código que se escriben para realizar el software que utilizamos cada día, se corrigen teniendo en cuenta aspectos lógicos y matemáticos orientados a obtener con precisión los resultados que se desean.

Un programa requiere muchas líneas de código escritas conforme a unas reglas o instrucciones propias del lenguaje de programación que se está utilizando. Por ejemplo, en lenguaje C, si escribimos,

var suma =0;  for (var i=1; i<=100; i=i*2) { suma = 1/(2*i)+suma; }

estamos pidiendo al sistema que sume 100 términos de una serie geométrica, 1/2 + 1/4 + 1/8 + … Se puede comprobar el resultado tecleando CTRL+SHIFT+I (en Chrome, F12 en I. Explorer). Se hace un «copia y pega» en la pestaña «consola» de la ventana que se abre y después se pulsa intro. En una entrada posterior explicaremos con detalle qué es lo que quiere decir cada término de la línea que hemos escrito.

cómo se depura un programa

Ejemplo de instrucción de programa en javascript

Imaginaos lo que puede suponer que falle un programa con miles de líneas escritas de esta forma. Los editores de programación cuentan con depuradores (debugger, en inglés) que permiten el ir probando instrucción tras instrucción, observando los valores intermedios.

Pero como sabéis, aquí nos interesa la robótica educativa. En concreto, la que se basa en placas compatibles con arduino. Queremos programar placas con tecnología arduino. La pregunta es, ¿tenemos un depurador de programas disponible cuando programamos una placa de arduino?

La respuesta es NO. Pero que no cunda el pánico, que para todo hay solución.

Cómo se depura un programa en robótica educativa

En un proyecto de robótica, los errores o fallos pueden deslizarse en distintos niveles. Al igual que en el flujo de un programa, es preciso ir paso a paso en cada uno de los niveles para facilitar la resolución de los problemas.

A la hora de depurar un programa que debe funcionar en nuestra placa hemos identificado cuatro niveles.

Por una parte, deberemos escribir bien el código, saber si hacen falta librerías y ver si estas pueden dar problemas. Es el nivel 1.

Debemos verificar que la ejecución del programa se ajusta al algoritmo que se ha realizado y éste da lugar a los resultados deseados. Es nuestro nivel 2.

En el nivel 3, hay que chequear todas las conexiones y los componentes que configuran nuestro proyecto. Todo debe estar bien cableado y funcionar.

Finalmente, todos nuestros proyectos van a interaccionar con el mundo exterior. Tenemos que verificar que esa interacción no provoca comportamientos extraños. Es el nivel 4.

Vamos a ir desarrollando estos 4 niveles. En esta primera parte nos ocupamos de los dos primeros.

Nivel 1: la compilación del programa

Hay que verificar que no hay «errores de escritura». Dicho de otra forma: las instrucciones de nuestro programa siguen las reglas del lenguaje de programación que estamos utilizando. Por ejemplo, en el siguiente programa nos falta un punto y coma:

cómo se depura un programa

Ejemplo de compilación errónea en el IDE de arduino

Este primer nivel queda resuelto de forma automática puesto que cuando hacemos clic en verificar o subir el programa, si hay errores el proceso no va a finalizar y se nos va a informar del error, como vemos en el ejemplo. El error, con un poco de práctica, se identifica fácilmente porque el compilador nos indica qué ha sucedido. Casi siempre.

Hay casos muy especiales en los que el programa compila perfectamente pero nuestro proyecto no funciona. Veamos un ejemplo.

Ejemplo: problemas con un motor servo y el control de un motor en un robot

Un ejemplo claro en que todo sucede sin errores pero luego nuestro proyecto no funciona es un caso real con el que tuve que lidiar hace tiempo. Utilicé un servo de posición y dos motores DC (corriente continua) para las ruedas de un robot.

Ambos motores se verificaron aparte. Para controlar los dos motores DC utilizaba un driver L298N (utiliza 4 pines digitales para el sentido de giro y 2 pines digitales PWM para la velocidad de las ruedas).

Una de las ruedas no respondía a las órdenes de movimiento. ¿Qué pasaba?

cómo se depura un programa

Servomotor de posición. La librería servo.h inhabilita el PWM en los pines 9 y 10

La principal fuente de resolución de problemas se encuentra en la referencia oficial de arduino, aunque muchas veces se encuentra en inglés. Así di con la resolución del problema: la librería servo deshabilita el PWM (la modulación por ancho de pulso) en los pines 9 y 10. Uno de estos pines lo había utilizado para el control de un motor.

Es decir, había una incompatibilidad originada del uso de una librería. Recordemos que una librería es un bloque de programa que nos permite utilizar de forma sencilla componentes muy sofisticados en nuestros proyectos de robótica.

Por tanto, a la hora de resolver un problema debemos recordar que tenemos una fuente de información muy importante en la referencia de arduino y los muchos foros que hay de robótica en Internet. Es casi seguro que, a nivel de principiante, cualquier problema que tengas ya lo haya tenido antes otra persona.

Nivel 2: Los errores lógicos y de funcionamiento

Cuando nos planteamos hacer un proyecto, tenemos una idea de lo que deseamos obtener. Para llevarlo a cabo pensamos un algoritmo. Bajo este peculiar nombre se esconden los pequeños pasos que tenemos que dar y en qué orden para que todo funcione bien. Sucede muchas veces que una vez implementado el algoritmo, vemos que nuestro proyecto no proporciona los resultados esperados.

Pueden ocurrir dos cosas:

  • El algoritmo que hemos pensado no es correcto en origen. En este caso, aunque hagamos todos los pasos necesarios de forma correcta, los resultados no van a ser buenos
  • El algoritmo es correcto pero lo hemos desarrollado mal en nuestro proyecto. Puede haber errores de programación, fallos lógicos

En el primer caso, deberemos replantear los pasos para llevar a buen puerto el proyecto. Hay que rehacer el algoritmo.

En el segundo caso, debemos ser capaces de conocer el valor real de algunos datos mientras el programa se está ejecutando. Para hacerlo, utilizaremos el monitor del sistema. El monitor del sistema, como su nombre indica, es el monitor en el que estamos escribiendo nuestros programas, ya sea en bloques o en letras.

El monitor del sistema es una ventana en nuestro ordenador donde podemos recibir datos procedentes de la placa de arduino. Para ello, deberán estar conectados a través de un cable USB la placa y el ordenador.

cómo se depura un programa

La placa de arduino está enviando datos al ordenador (derecha)

Para que la placa envíe esos datos al monitor es preciso utilizar dentro del programa que grabemos una orden de imprimir en pantalla:

cómo se depura un programa

Instrucción para imprimir datos en el monitor (arduino)

En este ejemplo se imprime por pantalla el valor de la variable potenciometro donde estamos almacenando la lectura de ese componente.

Un ejemplo muy típico de fallo de comportamiento lógico de un programa se produce con la simulación de un semáforo. hacemos el programa y en vez de encender de verde-parpadeo amarillo-rojo pasa de verde a rojo directamente. Hemos cometido un error de programación y hay que analizar la lógica de nuestro programa. Y ver si los pines de encendido de los LED están correctamente cableados. Esto ultimo forma parte de nuestro nivel 3 de depuración.

Un ejemplo para pensar

Imaginemos que tenemos unos diodos LED y que deseamos que se enciendan en función de los datos de distancia que proporciona un sensor de ultrasonidos. Añadimos dos imágenes parciales del programa. Los diodos LED están conectados a los pines 4, 5 y 6. Un sensor de ultrasonidos nos proporciona la variable distancia. El primer programa no funciona correctamente, el segundo, sí. Hay una pequeña diferencia, ¿cuál es?:

cómo se depura un programa

Imagen 1: este programa no funciona bien

cómo se depura un programa

Imagen 2: este programa funciona correctamente

Seguro que os habéis fijado que en el primer programa nos hemos olvidado de decir a nuestra placa de arduino qué hacemos cuando la variable distancia vale 30. Debemos controlar nosotros lo que deben hacer nuestros programas. En caso de duda un ordenador (o nuestra pequeña placa) no decide ni supone nada.

Muchas veces los errores de programación se ven cuando se completa el desarrollo físico, por lo que después de los niveles 3 y 4 hay que volver al nivel 2 y, si hacemos modificaciones sustanciales, al nivel 1.

En la próxima entrada hablaremos del nivel de depuración 3 (cableado y funcionamiento) y del nivel 4 (interacción con el mundo real).

ACTUALIZACIÓN 28/11/2018: acceder a la segunda parte : Depuración de programas

(Imagen de cabecera pexels, pixabay)