Configurando una cadena de herramientas GCC para programar Arduino en C
Que vaya por delante que no soy un experto en Arduino pero cuando decidà empezar con ello tenÃa claro que querÃa programarlo en C puro y duro, y que de entrada comprarÃa algo compatible en lugar que el original para ver si me iba a interesar o no. Probablemente porque sea programador me pareció mucho más interesante lidiar con los detalles de bajo nivel, datasheets1 y ese tipo de cosas, en lugar que permitir que el Arduino IDE y sus librerÃas me ocultaran cosas. Tampoco le veÃa mucho sentido a aprender o usar un pseudo C++ sabiendo ya C.
En estas últimas semanas, desde que Qualcomm ha comprado Arduino, he visto que hay un montón de "preocupación" por parte de la gente sobre qué va a pasar ahora, sobre si Qualcomm va a fastidiarlo todo con las tÃpicas prácticas corporativas y demás. Parece ser que mi decisión de hacer las cosas en C y no usar el software de Arduino ha sido más que acertada ya que ahora mismo a mi no me afecta en absoluto lo que sea que haga Qualcomm.
En este pequeño howto voy a explicarte cómo instalar una cadena de herramientas basada en GCC para que tu también puedas programar tu Arduino en C, o si lo prefieres en C++, y te voy a enseñar todos los pasos desde hacer un pequeño programa hasta cargarlo en tu placa sin utilizar el software oficial de Arduino.
Empezamos instalando los programas necesarios. Probablemente tu sistema operativo POSIX ya tenga todos los paquetes. En este howto vamos a ver cómo se hace con FreeBSD y Devuan GNU+Linux.
pkg install avr-gcc avr-binutils avr-libc avrdude # FreeBSD
sudo apt install gcc-avr binutils-avr avr-libc avrdude # Devuan
Una vez instalados los programas, abre tu editor de textos favorito y escribe el programa que viene a continuación. Este programa es el tÃpico que hace parpadear la luz del Arduino y lo vamos a usar para probar la cadena de herramientas y ver cómo encaja todo. Para que puedas seguir los pasos de este howto guarda este archivo con el nombre blink.c.
#include <avr/io.h>
#define F_CPU 16000000UL /* necesario para <util/delay.h> */
#include <util/delay.h>
#define DELAY 1500 /* milisegundos */
int
main (void) {
DDRB |= _BV(DDB5);
for(;;) {
PORTB |= _BV(PORTB5);
_delay_ms(DELAY);
PORTB &= ~_BV(PORTB5);
_delay_ms(DELAY);
}
}
La constante F_CPU debe coincidir con la frecuencia de la CPU (velocidad de reloj) de tu Arduino. Yo tengo una placa compatible con Arduino UNO y en mi caso este valor es 16MHz
A continuación toca compilar el programa. Para ello teclea lo siguinte en tu terminal:
avr-gcc -Os -mmcu=atmega328p -o blink blink.c
Ahora hay que convertir el archivo binario blink, a un binario compatible con Arduino:
avr-objcopy -O ihex -R .eeprom blink blink.hex
Ha llegado el momento de conectar tu Arduino a uno de los puertos USB de tu ordenador. Comprueba en qué puerto se ha conectado. Para ello puedes usar, por ejemplo, el comando dmesg. En mi Devuan la salida de dicho comando, una vez conectada mi placa, es la siguiente:
[3975174.307519] usb 2-1: new full-speed USB device number 79 using xhci_hcd
[3975174.456593] usb 2-1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
[3975174.456606] usb 2-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[3975174.456612] usb 2-1: Product: USB2.0-Serial
[3975174.458699] ch341 2-1:1.0: ch341-uart converter detected
[3975174.459258] usb 2-1: ch341-uart converter now attached to ttyUSB0
Esto quiere decir que la placa está conectada a /dev/ttyUSB0 (/dev/ttyU0 en mi FreeBSD). Para cargar el programa en tu placa Arduino utiliza el comando siguiente (sustituye /dev/ttyU0 o /dev/ttyUSB0 por el dispositivo que corresponda a tu caso):
avrdude -F -V -c arduino -p m328p -P /dev/ttyU0 -U flash:w:blink.hex # FreeBSD
avrdude -F -V -c arduino -p m328p -P /dev/ttyUSB0 -U flash:w:blink.hex # Devuan
La salida del comando anterior deberÃa parecerse a esta:
avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e950f (probably m328p)
avrdude: Note: flash memory has been specified, an erase cycle will be performed.
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file blink.hex for flash
with 176 bytes in 1 section within [0, 0xaf]
using 2 pages and 80 pad bytes
avrdude: writing 176 bytes flash ...
Writing | ################################################## | 100% 0.06 s
avrdude: 176 bytes of flash written
Tal y como decÃa antes, el programa es el tÃpico que hace parpadear la luz del Arduino asà que comprueba si la luz del tuyo está parpadeando. Si parpadea significa que todo ha ido como la seda. ¡Felicidades! Ya tienes tu cadena de herramientas operativa y ya sabes los rudimentos para crear y cargar tus programas en tu placa Arduino.
Espero que este howto te haya servido para dar tus primeros pasos a la hora de programar tu Arduino en C y ten en cuenta que esto es solo un punto de partida por lo que te recomiendo que leas la documentación y/o la ayuda de todos los programas y comandos que has visto.