Programación de AVR en ArchLinux
NOTE
las herramientas señaladas en cursiva son paquetes disponibles en ArchLinux
Instalación
Para programar una placa de desarrollo Arduino con procesador AVR (UNO R3, Nano) se deben realizar los siguientes pasos
Instalar el Toolchan avr-gcc, el cual contiene el compilador para la familia de microcontroladores AVR.
Instalar un programador, en este caso avrdude el cual permitirá cargar y comprobar el firmware en el microcontrolador.
Disponer de un editor de código (opcional), proporciona una interfaz gráfica cómoda para editar el código
pacman -S avr-gcc avrdudePermisos UDEV
para permitir al usuario manejar interfaces seriales a través de USB es necesario establecer reglas para udev (gestor de dispositivos del kernel Linux). Para permitir a usuario acceder globalmente a USB seriales se crea o modifica el archivo
/etc/udev/rules.d/01-ttyusb.rules
SUBSYSTEMS=="usb-serial", TAG+="uaccess"también se puede especificar el acceso solo a dispositivos especifico udev - ArchWiki
Para programar con C/C++
- Instalar las librerías avr-libc, contiene los headers necesarios para compilar en C
pacman -S avr-libcCompilación
El compilador avr-gcc permite compilar en C, C++ y Ada. Por defecto compila, ensambla y vincula
avr-gcc ./main.c -o ./main.elfal compilador es necesario pasar ciertos macro, el mas importante es el de arquitectura de conjunto de instrucciones (ISA) o dispositivo, este puede ser pasado a través del argumento -mmcu Ej. (-mmcu=atmega328p o -mmcu=avr5), o declarando el macro correspondiente en el archivo con el codigo del programa.
// Tipo de dispositivo
#define __AVR_ATmega328P__
// CPU Freq
#define F_CPU 1000000UL // 1MhzTambién se le puede pasar la frecuencia a la que trabajara el dispositivo al arrancar (ciertos dispositivos permiten cambiar dicha frecuencia durante la ejecución) con el argumento -DF_CPU Ej. (-DF_CPU=16000000UL 16Mhz) o con el macro F_CPU
Convertir en iHEX (Opcional)
Para programar el microcontrolador es necesario transformarlo en formato intel HEX, con el comando.
avr-objcopy -j .text -j .data -O ihex ./main.elf ./main.hexDonde el argumento -j .text -j .data especifica que la sección .text (contenedora del codigo ejecutable) y .data (que contiene las variables globales y datos que deben ser cargados al inicializar) y -O ihex especifica el formato de salida intel HEX.
Resultado en ASM
Para obtener el resultado del codigo compilado en assembler se usa el comando avr-objdump, donde -m establece la arquitectura del codigo compilado y -D muestra las nemotecnias del codigo assembler en base a la arquitectura
avr-objdump -D -mavr5 ./main.hexavr-objdump -D -mavr5 ./main.elfProgramar
para programar un microcontrolador AVR se usa la herramienta avrdude. Donde se debe especificar que microcontrolador esta conectado al programador con el argumento -p (Ej. ATmega328P -p m328p). El programador que se esta usando con el argumento -c (Ej. para un Arduino UNO R3 -c arduino), el puerto al que esta conectado con el argumento -P. Y especificar que se va hacer una operación en memoria con el argumento -U señalando que memoria se va a programar (flash), el tipo de operación (escritura w), el nombre del archivo a programar (main.hex) y opcionalmente su formato (Ej i para intel HEX, e para ELF)
ejemplo para un Arduino UNO
avrdude -p m328p -c arduino -P /dev/ttyUSB0 -U flash:w:main.hexavrdude permite recibir archivos ELF como entrada, pudiendo distinguir entre iHEX y ELF sin especificar el formato, lo que permite omitir el paso de convertir en iHEX
ejemplo para un Arduino UNO
avrdude -p m328p -c arduino -P /dev/ttyUSB0 -U flash:w:main.elf:ePara los argumentos de cada microcontrolador, programador y demás configuraciones consulte la documentación de avrdude
NOTE
También se suele especificar el baudrate, esta suele ser provista por el programador, de ser necesario se puede especificar con el argumento -b
WARNING
Habitualmente se encuentra el uso de el argumento -F el cual ignora la firma del microcontrolador, lo cual puede ser util bajo ciertos casos (errores de dispositivo, memoria corrupta o sin formato etc.). Y también es habitual la opción -V que no comprueba si los datos fueron escritos correctamente. No se recomienda su uso si no es necesario.
Para programar con RUST
Para compilar en avr con rust en necesario usar la version nightly del compilador de rust asi como su componente rust-src. Haciendo uso de la herramienta rustup
rustup toolchain install nightlyrustup component add rust-src --toolchain nightly- Instalar las librerías avr-libc
pacman -S avr-libccon Hardware Abstraction Layer (HAL)
La manera mas sencilla de programar un embebido en Rust es con algún HAL (con el objetivo de no trabajar con memoria directamente con rust). Una de las mas usadas es avr-hal
Uso de Plantilla (Opcional)
cargo-generate permite utilizar plantillas para proyectos en rust
cargo install cargo-generatePara crear nuevo proyecto con la plantilla avr-hal-template
cargo generate --git https://github.com/Rahix/avr-hal-template.gitNOTE
Esta plantilla por defecto proporciona dos perfiles de compilación dev (predeterminado) y release, ambos con información de depuración. Para obtener una compilación optimizada y sin información para depuración puede crear o modificar el profile
[profile.release]
panic = "abort"
codegen-units = 1
debug = false
lto = true
opt-level = "s"Solo compilar
cargo build --profile=releaseCompilar y cargar
cargo run --profile=releaseProgramación
cargo install ravedudePara Programar sketch Arduino con Arduino CLI
se instala el paquete arduino-cli
pacman -S arduino-cliSe inicializa la configuración para arduino-cli
arduino-cli config initCrea un Sketch, reemplazando NombreDelSketch con el nombre del proyecto
arduino-cli sketch new NombreDelSketchConfigurar Placa de desarrollo
Actualiza la lista plataforma y librerías disponibles
arduino-cli core update-indexConecta el equipo arduino al PC y usa el siguiente comando para reconocer el FQBN (Fully Qualified Board Name) y el ID de la plataforma.
arduino-cli board listDe obtener un resultado como el siguiente, o de no tener el dispositivo se puede buscar manualmente
arduino-cli board list
Port Protocol Type Board Name FQBN Core
/dev/ttyUSB0 serial Serial Port (USB) Unknownarduino-cli board search nombreABuscarNOTE
dicho comando busca entre los Board Name, Platform ID y FQBN Core de buscar mas de una palabra debe estar entre comillas bash arduino-cli board search "UNO R4" no se suele identificar la plataforma por el microcontrolador ni arquitectura. Se recomienda solo usar palabras claves en la búsqueda.
Ejemplo de resultado
arduino-cli board search uno
Board Name FQBN Platform ID
Arduino UNO R4 Minima arduino:renesas_uno
Arduino UNO R4 WiFi arduino:renesas_uno
Arduino UNO WiFi Rev2 arduino:megaavr
Arduino Uno arduino:avr:uno arduino:avr
Arduino Uno Mini arduino:avr:unomini arduino:avr
Arduino Uno WiFi arduino:avr:unowifi arduino:avr
ESP32vn IoT Uno esp32:esp32:esp32vn-iot-uno esp32:esp32
WEMOS D1 R32 esp32:esp32:d1_uno32 esp32:esp32En base al ID de la plataforma se instala con el siguiente comando, reemplazando IDPlataforma
arduino-cli core install IDPlataformaen el caso del Arduino UNO como ejemplo
arduino-cli core install arduino:avrCompilación
Para compilar un sketch se usa la siguiente nomenclatura, reemplazando FQBN y NombreDelSketch
arduino-cli compile --fqbn FQBN NombreDelSketchNOTE
Adicionalmente su puede agregar el argumento --build-path ./build para definir el directorio de trabajo del compilador. para la version 1.0.3 de Arduino CLI no es posible programar desde un --build-path definido por el usuario
NOTE
De necesitar solo el resultado de la compilación se puede usar el argumento -e, o el argumento --output-dir ./build para exportar los resultados de la compilación en un directorio especifico
para el Arduino UNO como ejemplo
arduino-cli compile --build-path ./build --fqbn arduino:avr:uno BlinkProgramar
Siguiendo la siguiente nomenclatura reemplazando Puerto, FQBN y NombreDelSketch
arduino-cli upload -p Puerto --fqbn FQBN NombreDelSketchEjemplo
arduino-cli upload -p /dev/ttyUSB0 --fqbn arduino:avr:uno Blink