La plataforma Arduino es popular, independientemente de si es regañada o elogiada. Sus creadores lograron reducir el umbral de entrada al nivel de unos pocos clics del mouse + un par de líneas de código y listo, aquí tienes un LED parpadeante. Y, en general, para la creación rápida de prototipos de embarcaciones en AVR, lo de Arduino es extremadamente conveniente. Lo único que fallaron fue el IDE, que es difícil de llamar. Entre las funciones del IDE, proporciona solo una cosa: la automatización de la creación y el ensamblaje de un proyecto.
Para los usuarios de Windows, existe una alternativa: MS Visual Studio Community +
vMicro plugin que le permite escribir bocetos, pero con todas las ventajas proporcionadas por el IDE. El plug-in se balancea sin problemas en el estudio mismo a través del menú "Herramientas" y funciona tanto como desee en la versión de prueba. La versión paga en teoría admite la depuración paso a paso, pero ellos, como propietarios de la copia con licencia de vMicro, no estaban muy impresionados.
Para los usuarios de Linux, todo es como siempre: queremos un buen IDE: seleccione la "víctima" e intente asegurarle la funcionalidad necesaria. Hay soluciones basadas en
Eclipse , pero no me gusta el eclipse, sobre el que
ya escribí una
vez . Lo soporto como un mal inevitable, cuando no hay nada adecuado a la mano. De todos los IDE gratuitos, respeto mucho al poderoso y maravilloso
Qt Creator , en el que yo y mi equipo hemos estado trabajando durante más de un año. Por lo tanto, hablaré sobre cómo convertirlo en un entorno de desarrollo para Arduino.
1. Preparación del suelo
Qt Creator está disponible en los repositorios de cualquier distribución Linux más o menos respetuosa. Por ejemplo en archa obtenlo así
$ sudo pacman -S qtcreator
Además, necesitaremos paquetes con respecto al Arduino mismo.
$ sudo pacman -S arduino arduino-avr-core
El día en que finalmente olvidemos Arduino, necesitaremos otro compilador, ensamblador, enlazador y biblioteca C estándar para AVR, así que los colocamos
$ sudo pacman -S avr-gcc avr-binutils avr-libc
Probaremos el depurador y el emulador en este artículo, por lo que instalaremos dichos paquetes
$ sudo pacman -S avr-gdb simavr
2. Crear un proyecto en Qt Creator
Ejecute Qt Creator y cree un nuevo proyecto sin Qt en C ++

Elija una ubicación para el proyecto y asígnele un nombre

Como sistema de compilación, tome un qmake regular

Dejamos el conjunto de trabajo por defecto, arreglelo más tarde

Bajo control de versiones, agregue el proyecto como desee

Obtenemos el proyecto estándar de C ++

Solo hay dos archivos en el proyecto: main.cpp y led-blink.pro. El primero se elimina, el segundo se borra de todo lo que está escrito allí, obteniendo un proyecto completamente vacío

Ahora con bolígrafos, comenzamos a escribir texto en un archivo * .pro, formando la estructura del proyecto para Arduino
# # Arduino Core ARDUINO_DIR=/usr/share/arduino/hardware/archlinux-arduino/avr/ # (Arduino Uno, Nano, Mini) ARDUINO_MCU=atmega328p # ARDUINO_FCPU = 16000000L
Excluimos todo lo relacionado con Qt del proyecto y seleccionamos la plantilla del proyecto.
# , Qt ! QT -= gui core CONFIG -= qt # - , ELF TEMPLATE = app
Establecemos el directorio para el binario ensamblado y su nombre.
DESTDIR = ../bin TARGET = led-blink
A continuación, conecte los directorios de búsqueda de encabezado
# INCLUDEPATH += $$ARDUINO_DIR/cores/arduino INCLUDEPATH += $$ARDUINO_DIR/variants/standard INCLUDEPATH += $$ARDUINO_DIR/libraries INCLUDEPATH += /usr/avr/include
Definir el compilador de C y sus claves.
QMAKE_CC = /usr/bin/avr-gcc QMAKE_CFLAGS += -c -g -Os -w -ffunction-sections -fdata-sections QMAKE_CFLAGS += -MMD -mmcu=$$ARDUINO_MCU -DF_CPU=$$ARDUINO_FCPU QMAKE_CFLAGS += -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR
y el compilador de C ++ y sus claves
QMAKE_CXX = /usr/bin/avr-g++ QMAKE_CXXFLAGS += -c -g -Os -w -ffunction-sections -fdata-sections QMAKE_CXXFLAGS += -fno-exceptions -fno-threadsafe-statics QMAKE_CXXFLAGS += -MMD -mmcu=$$ARDUINO_MCU -DF_CPU=$$ARDUINO_FCPU QMAKE_CXXFLAGS += -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR
configurar el enlazador y sus claves
QMAKE_LINK = /usr/bin/avr-gcc QMAKE_LFLAGS = -w -Os -Wl,--gc-sections -mmcu=$$ARDUINO_MCU QMAKE_LIBS = -lm
Configuramos el postprocesamiento del archivo ELF, para convertirlo en Intel HEX para el firmware posterior en la placa
QMAKE_POST_LINK += /usr/bin/avr-objcopy -O ihex -j .text -j .data -S ${TARGET} ${TARGET}.hex
Especifique qué archivos de encabezado se incluyen en el proyecto.
HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h)
Definir archivos fuente de Arduino Core
SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp)
Entonces, bueno, ¿cuándo comenzaremos a dibujar? Comencemos ahora, pero lo que hemos hecho, nobles dons, es el mínimo necesario para que el código de boceto funcione.
Ahora agregue la fuente del boceto al proyecto. Haga clic derecho en el proyecto en el árbol y seleccione "Agregar nuevo ..." Agregue el archivo fuente C ++

Para organizar las fuentes dentro del proyecto, en la siguiente ventana

haga clic en "Examinar" y cree la carpeta src para archivos * .cpp

Ahora dale un nombre al archivo

Haga clic en la siguiente ventana "Finalizar". Tenemos una foto así

El IDE agregará este archivo al script de compilación led-blink.pro
HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h)
pero para no hacer largas listas de fuentes, generalmente me gusta esto
# Arduino Core HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h) # Arduino Core SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp) # SOURCES += $$files(./src/*.cpp)
Ahora haremos lo que el IDE de Arduino nunca proporcionará: agregue un archivo de encabezado al boceto, siguiendo los mismos pasos que arriba

En este archivo, agregue los encabezados necesarios para el proyecto.
#ifndef LED_BLINK_H #define LED_BLINK_H #include <Arduino.h> #endif // LED_BLINK_H
configurar las rutas a los encabezados y fuentes
# INCLUDEPATH += ./include HEADERS += $$files(./include/*.h) files(./src
y ahora finalmente escribo un boceto
#include "led-blink.h"
Ahora hacemos clic derecho en el árbol del proyecto y seleccionamos "Ensamblar"

Vamos a la carpeta del proyecto. Ahora tenemos el directorio bin /, que contiene los productos de trabajo del compilador.

Todo está bien, hay ELF, que es útil al depurar y hexadecimal para firmware en el controlador. Ahora escribamos otra luz intermitente con LED en el pin 13
#include "led-blink.h" #define LED_STAND_PIN 13 unsigned long time = 0; unsigned long DELAY = 500000; bool on = false;
Recolectamos el proyecto, vamos a bin /. Nos quedamos en su placa usb. En mi caso es Uno, en mi sistema configura un puerto con el nombre / dev / ttyACM0 para la programación. Ejecutar el comando
$ avrdude -c arduino -p m328p -P /dev/ttyACM0 -b 115200 -U flash:w:led-blink.hex:i
Aqui
- -P / dev / ttyACM0 - puerto del programador
- -p m328p - modelo de controlador
- -c arduino - tipo de programador: integrado en la placa Uno
- -b 115200 - velocidad del puerto
- -U flash: w: led-blink.hex: i - indica el área del firmware, tipo de operación (escritura) y archivo de firmware
Un escape similar a este
avrdude: AVR device initialized and ready to accept instructions Reading |
nos dice que el proceso fue bien. El LED parpadeará a una frecuencia de 2 Hz.
En principio, puede configurar el firmware en el IDE. Para hacer esto, realice la configuración de inicio como

y al elegir iniciar el proyecto (presionando Ctrl + R) ejecutaremos el firmware y lo lanzaremos exactamente como lo hace el IDE de Arduino.
Conclusiones
El proceso de configuración descrito es un procedimiento bastante lento. Pero a cambio, obtenemos toda la potencia de uno de los IDE más notables que existen en los sistemas basados en el kernel de Linux (y también se aplica Windows). Autodescripción, refactorización, navegación de código conveniente: todo esto ahora se puede utilizar con éxito.
Este ejemplo se hace, como dicen, "en la frente". De hecho, el IDE de Arduino compila el núcleo de Arduino en una biblioteca estática core.a separada y enlaza con el ejecutable. Como resultado, el firmware recopilado en el entorno estándar es más pequeño en tamaño que en el método descrito en el artículo. Todavía tengo que resolver estos matices. Y al mismo tiempo en el siguiente artículo sobre este tema hablaremos de:
- la estructura del proyecto, descubra dónde se encuentra la función main () y muestre por qué el bucle excesivo en Arduino es malo
- depuración paso a paso utilizando emuladores
- trataremos las opciones del compilador usadas en el ensamblaje
En general, intentaremos aclarar muchos problemas que son útiles para comprender los procesos en curso, sin los cuales en el futuro será difícil cambiar de Arduino a algo más avanzado.