Programar con arduino “The good way”

Por si alguien no lo sabe, soy un gran fan de Arduino. Llevo un buen puñado de años aprendiendo y siempre me ha encantado. Bueno, como diría un ilustre “todo me ha encantado, salvo alguna cosa”. En este caso es el IDE y la gestión de proyectos grandes. En este post trataré cómo lo he solucionado hasta dejarlo todo a mi gusto: un buen IDE y buena gestión del proyecto para un desarrollo agradable y mantenible. Dejo claro que esto no es una guía de programar Arduino sino que es puramente del entorno de desarrollo. No va sobre hardware sino 100% sobre software. Dicho esto comencemos.

Primero voy a describir la situación. El IDE de arduino es excelente para iniciarse. Te permite escribir un programa y cargarlo sin demasiadas preguntas, bien! Pero a lo largo de tiempo esta simplicidad acaba siendo un problema. Para hacer programas guarros está de lujo pero cuando quieres hacer algo más grande se te va de madre. Voy a enumerar los problema que le veo al IDE de Arduino:

  • Cada archivo del proyecto se abre como una pestaña: Yo soy de los que le gusta tener decenas de ficheros así que imagina. Abre un proyecto como Marlin (software para impresoras 3D) y verás lo que te digo. Si esa gente ha programado Marlin con el IDE de Arduino merecen una estatua o algo.
  • Nula gestión de dependencias: Algo como un bower en javascript, composer en php o requiremenets.txt en python. Algo que le diga “quiero esta biblioteca” y ello solo la descargue e instale. En arduino te toca descargarlas e instalarlas a mano (y todas sus dependencias) además de necesitar reiniciar el IDE cada vez que pones alguna nuevas. Yo soy de los de “si algo existe, lo uso” en contra de otros que piensan “pero si es muy fácil, me hago mi biblioteca en 2 minutos” y por eso me gusta poder manejar de manera muy sencilla las dependencias.
  • Indentación mejorable: Simplemente no indenta a mi gusto, pero no creo que sea cosa mía porque el resto de IDEs sí lo hacen.
  • Prácticamente nulo análisis de código: Algo sí tiene, pero apenas marca errores como que una clase no existe o variable indefinida (y en un contexto muy reducido). De código redundante o poco recomendable (malas prácticas) ni hablamos. Algún gurú dirá “vaya noob, si necesitas eso es que no tienes ni puta idea ni de programar ni del lenguaje”. Puede ser, pero yo me considero más un ingeniero de software que un artesano de software. Cuando escribo código lo hago sabiendo que voy a cometer fallos (obvio) así que cualquier método que me ayude a reducir esas posibilidades de error será bienvenido.
  • Autocompletado de código: Lo mismo, a mi me gusta que el IDE me complete. Es realmente útil para escribir código correcto a la primera. De esta manera es como que el IDE te va realimentando diciendo “¿Esto es lo que querías hacer? Si es así vamos bien”, simbiosis entre máquina y humano. En el IDE de arduino muchas veces una letra, barra baja o cualquier pijada te tirará el proceso de compilación. Y es un coñazo. Y sí, soy vago, si el IDE me incluye las cabeceras cuando quiero usar una clase de un paquete, pues que lo haga él. Ahorramos tiempo y posibilidades de fallo. Como en el caso anterior, para un purista esto será sacrilegio porque “tu cerebro es el mejor autocompletador”. Muy bien, es otra manera de verlo.
  • Resto de utilidades que un IDE de verdad si tiene como buscar clases, textos, comparar código, múltiples ventanas, tema oscuro, coloreado de sintaxis…
  • Peta, peta como un demonio. En Linux por lo menos te suelta una traza (inmensa, pero por lo menos tira algo). Y yo habituado al guardado automático me hace especialmente daño (aunque el IDE de arduino guarda cada vez que subes el programa a la placa).

Por hacer un resumen, el IDE de arduino viene a ser un bloc de notas de Windows pero con un atajo para subir los programas a tu placa. Pero no tenemos que culparlos a ellos (los mantenedores de Arduino), su misión y objetivo es hacer el framework Arduino (un excelente trabajo) y no un IDE (de los que hay un montón y muy buenos). Bastante hay que agradecer el IDE que para recién iniciados es ideal. Por hacer una comparativa, es como si Arduino sería el “.Net Framework” y el IDE sería “Visual Studio” pero te lo dan junto. Mucha gente asocia Arduino a la “interfaz gráfica” y no, es el framework.

Llegados a este punto espero haberte convencido. Si es así te alegrará saber además que la solución es bien sencilla y se reduce a una palabra: platformio

Si has pinchado el enlace igual estás pensando “que coño es esto” y la respuesta es fácil “es la polla”. Ahora en serio, este software lo que hace es unificar el proceso de compilación y gestión de dependencias. Además trae soporte para bastantes IDE (Arduino, Atom, CLion, Eclipse, Energia, Qt Creator, Sublime Text, Vim, Visual Studio). Lo de unificar el proceso de compilación es que tu le dices a platformio “oye compílame este código para X” donde X puede ser arduino o una de las muchas plataformas (demasiadas como para listarlas aquí). Sin comandos raros ni específicos. La gestión de dependencias es que le dices a platformio “tío mira a ver si me instalas la biblioteca X” y él obediente te lo hace (lo mismo para actualizar dependencias). Claro que también puedes buscar. Por ejemplo si estás buscando una biblioteca para un sensor te muestra unas cuantas disponibles y eliges la que más te guste. Desde aquí http://platformio.org/#!/lib puedes navegar por las bibliotecas disponibles (y si no está la que te gusta, puedes mandarla).
De la misma manera también se encarga de subir el programa a la placa. El IDE de Arduino te encapsula muy bien este paso, pero si has intentado hacerlo a mano verás que es una movida.

Y por supuesto todo esto se puede hacer desde línea de comandos, lo que te permite hacer scripts para automatizar tareas. Una bendición. Tiene un montón de cosas más descritas en su web así que si de verdad te interesa esta herramienta te recomiendo recorrerte su web.

El autocompletado viene dado por tu IDE favorito, en mi caso CLion pero Eclipse también va bien. Los demás no los conozco.

 

Ejemplo de uso

Básicamente voy a describir cómo usarlo. Es realmente sencillo (y si has intentado usar arduino en eclipse me darás la razón).

Lo primero es instalar platformio

pip install -U pip setuptools
pip install -U platformio

Ale, instalado. Como es un programa python se puede instalar automáticamente (ves la maravilla de disponer de un repositorio de dependencias?). Ahora puedes escribir en la línea de comandos “platformio” para ver si funciona.

platformio1

El siguiente paso es inicializar el proyecto. Aquí tienes que tener claro cual es tu placa. Pero no te preocupes, si cambias de placa (por ejemplo de arduino UNO a DUE es cambiarlo en un fichero de configuración). En mi caso que uso arduino nano el comando sería:

platformio init --board=nanoatmega328

Para ver todas las placas soportadas y elegir la tuya escribe el comando

platformio boards

Recuerda que la plataforma usada por arduino es atmelavr, que usa los microcontroladores atmega principalmente (en la lista aparecen los primeros, así que te tocar hacer scroll hacia arriba). Si tu placa es la típica arduino uno pues buscando en la lista vemos que es simplemente “uno” así que el comando sería

platformio init --board=uno

Y así, es poner lo que aparece en la columna Type (si tu terminal muestra colores, sale en un colo azulito). Como ves hay un huevo de placas. El motivo de tener que especificar la placa es que tanto la compilación como la subida es diferente para cada placa (cada microcontrolador lleva una frecuencia de reloj diferente por ejemplo) y eso platformio debe saberlo. Recuerda que si vas a utilizar algún IDE también tienes que indicárselo (básicamente para que el autocompletado de arduino funcione bien). En mi caso, que uso clion

platformio init --board=uno --ide clion

Si usas eclipse (u otro de los soportados) pues cambias clion por el tuyo.

platformio2

Básicamente te dice que el proyecto se creará en ese directorio y demás mandanga. Si quieres que cuando ejecutes el comando “run” también se suba dile que sí (escribiendo “y”). En el ejemplo he puesto que sí por comodidad, pero me parece más práctico decirle que no (o no marcar nada, la N mayúscula indica el valor por defecto). Así el comando “run” sólo compila y cuando quieres subir el programa usas se lo dices explícitamente (como veremos un poco más abajo). El proceso de “init” crea el fichero “platformio.ini” con la configuración de tu placa (puedes mirarlo, son unas pocas líneas) y los directorios “src” (donde va tu codigo, en arduino el archivo .ino y demás) y “lib” donde instalará todas las librerías que no gestiona platformio (las de tu propio proyecto o alguna que no sea pública). Tengo que decir que de momento no existe una equivalencia al “requirements.txt” de python pero teniendo listada la lista de dependencias de momento se soluciona (en el fondo es una lista de IDs).

Una vez tenemos el fichero con nuestro código en el directorio “src” (ej main.ino) ejecutamos el comando para subir el programa a la placa:

platformio run –target upload

Y tendrás que ver algo de este tipo

platformio4.1

platformio4.2

Tienes que ver el OK, si no es que algo ha ido mal (y te dice el por qué). Si se queda atascado reintentando, lo más probable es que hayas puesto mal el tipo de placa. Por defecto busca y utiliza el primer puerto que pilla así que si tienes más arduinos conectados, utiliza el parámetro –upload-port para especificar cual quieres usar.

El proceso de instalación de librerías es muy ameno. Puedes ir a la web http://platformio.org/#!/lib

O desde la consola. Supongamos que queremos usar el sensor de temperatura DHT11. Pues podemos buscar de esta manera:

platformio lib search dht

Te aparece una lista de librerías que encajan con esa búsqueda. Miras el ID de la librería que te gusta y haces

platformio lib search ID

Donde ID es un número. Y ya está! Olvídate de descargar un zip, descomprimir, copiar y pegar… (igual es que soy muy vago)

Por supuesto puedes listar, eliminar y actualizar las liberias (usa el comando “platformio lib” para ver todas las opciones).

En la url http://docs.platformio.org/en/latest/ tienes una documentación realmente excelente. No dudes en mirarla si vas usar platformio.

Y para finalizar, una impresión de pantalla de mi entorno

platformio5

Como puedes ver utilizo en “libs” tengo ciertas librerías. Que no están disponibles en platformio. Cuando hice este programa, la biblioteca para el sensor BH1750 no estaba disponible pero ahora ya sí. La envié yo y poco después la validaron y la pusieron disponible (qué chicos más eficientes!). Las demás con cosas mías (de mi huerto solar autónomo) que son públicas (en mi github) pero lo suficientemente maduras (están en desarrollo) como para pedir que me la incluyan.

En src tengo básicamente el main.ino que hace cuatro cosillas, el meollo está en las bibliotecas.

Cuando pruebes platformio verás que te lleva más tiempo leer este post que en aprender a utilizar esta herramienta, y una vez lo hagas te engancharás. Además no te altera para nada tus programas de arduino, puedes coger el mismo sketch, abrirlo con el IDE de arduino y te compila igual (siempre y cuando hayas instalado manualmente todas las librerías). Una maravilla. Si yo fuera mantenedor de Arduino, valoraría seriamente utilizar esta herramienta oficialmente la verdad. Yo la encontré de casualidad y seguro que mucha gente está buscando algo parecido y no lo encuentra.

Como resumen general, dispongo de toda la potencia de mi IDE favorito y ya puedo decir que me siento cómodo programando Arduino!

You may also like...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *