A plataforma Arduino é popular, independentemente de ser repreendida ou elogiada. Seus criadores conseguiram diminuir o limite de entrada para o nível de alguns cliques do mouse + algumas linhas de código e pronto - aqui você tem um LED piscando. E, em geral, para a rápida criação de protótipos de artesanato no AVR, a coisa do Arduino é extremamente conveniente. A única coisa que eles falharam foi o IDE, que é difícil de chamar. Entre as funções do IDE, ele fornece apenas uma coisa - a automação da criação e montagem de um projeto.
Para usuários do Windows, existe uma alternativa: MS Visual Studio Community + plugin
vMicro que permite escrever esboços, mas com todas as vantagens fornecidas pelo IDE. O plug-in oscila sem problemas no próprio estúdio através do menu "Ferramentas" e funciona da maneira que você deseja na avaliação. A versão paga, em teoria, suporta a depuração passo a passo, mas eles, como proprietários da cópia licenciada do vMicro, não ficaram muito impressionados.
Para usuários de Linux, tudo está como sempre: queremos um bom IDE - selecione a "vítima" e tente fixar a funcionalidade necessária. Existem soluções baseadas no
Eclipse , mas eu não gosto do eclipse, sobre o qual
já escrevi uma vez . Suponho-o como um mal inevitável, quando não há nada adequado à mão. De todos os IDEs gratuitos, eu respeito muito o poderoso e maravilhoso
Qt Creator , no qual eu e minha equipe trabalhamos há mais de um ano. Portanto, falarei sobre como transformá-lo em um ambiente de desenvolvimento para o Arduino.
1. Preparação do solo
O Qt Creator está disponível nos repositórios de qualquer distribuição Linux que se preze mais ou menos. Por exemplo, no archa, obtenha-o assim
$ sudo pacman -S qtcreator
Além disso, precisaremos de pacotes relacionados ao próprio Arduino.
$ sudo pacman -S arduino arduino-avr-core
No dia em que finalmente esquecermos o Arduino, precisaremos de outro compilador, montador, vinculador e biblioteca C padrão para o AVR, então os colocamos
$ sudo pacman -S avr-gcc avr-binutils avr-libc
Vamos testar o depurador e o emulador neste artigo, portanto, instalaremos esses pacotes
$ sudo pacman -S avr-gdb simavr
2. Crie um projeto no Qt Creator
Execute o Qt Creator e crie um novo projeto sem o Qt em C ++

Escolha um local para o projeto e dê um nome a ele

Como um sistema de construção, faça um qmake regular

Deixamos o conjunto de trabalho por padrão, corrigimos mais tarde

Sob controle de versão, adicione o projeto conforme desejado

Temos o projeto C ++ padrão

Existem apenas dois arquivos no projeto: main.cpp e led-blink.pro. O primeiro é excluído, o segundo é limpo de tudo o que está escrito lá, obtendo um projeto completamente vazio

Agora, com canetas, começamos a escrever texto em um arquivo * .pro, formando a estrutura do projeto para o Arduino
# # Arduino Core ARDUINO_DIR=/usr/share/arduino/hardware/archlinux-arduino/avr/ # (Arduino Uno, Nano, Mini) ARDUINO_MCU=atmega328p # ARDUINO_FCPU = 16000000L
Excluímos tudo relacionado ao Qt do projeto e selecionamos o modelo do projeto
# , Qt ! QT -= gui core CONFIG -= qt # - , ELF TEMPLATE = app
Definimos o diretório para o binário montado e seu nome
DESTDIR = ../bin TARGET = led-blink
Em seguida, conecte os diretórios de pesquisa de cabeçalho
# INCLUDEPATH += $$ARDUINO_DIR/cores/arduino INCLUDEPATH += $$ARDUINO_DIR/variants/standard INCLUDEPATH += $$ARDUINO_DIR/libraries INCLUDEPATH += /usr/avr/include
Definir o compilador C e suas chaves
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
e o compilador C ++ e suas chaves
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
definir o vinculador e suas chaves
QMAKE_LINK = /usr/bin/avr-gcc QMAKE_LFLAGS = -w -Os -Wl,--gc-sections -mmcu=$$ARDUINO_MCU QMAKE_LIBS = -lm
Configuramos o pós-processamento do arquivo ELF, para transformá-lo no Intel HEX para o firmware subsequente na placa
QMAKE_POST_LINK += /usr/bin/avr-objcopy -O ihex -j .text -j .data -S ${TARGET} ${TARGET}.hex
Especifique quais arquivos de cabeçalho estão incluídos no projeto.
HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h)
Definir arquivos de origem do Arduino Core
SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp)
Então, bem, quando vamos realmente começar a desenhar? Vamos começar agora, mas o que fizemos, nobres dons, é o mínimo necessário para o código do esboço funcionar.
Agora adicione a fonte do esboço ao projeto. Clique com o botão direito do mouse no projeto na árvore e selecione "Adicionar novo ..." Adicione o arquivo de origem C ++

Para organizar as fontes dentro do projeto, na próxima janela

clique em "Procurar" e crie a pasta src para arquivos * .cpp

Agora dê um nome ao arquivo

Clique na próxima janela "Concluir". Ficamos com essa imagem

O IDE adicionará esse arquivo ao script de construção led-blink.pro
HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h)
mas, para não fazer longas listas de fontes, geralmente faço assim
# 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)
Agora, faremos o que o Arduino IDE nunca fornecerá: adicione um arquivo de cabeçalho ao esboço, executando as mesmas etapas acima

Neste arquivo, adicione os cabeçalhos necessários para o projeto.
#ifndef LED_BLINK_H #define LED_BLINK_H #include <Arduino.h> #endif // LED_BLINK_H
configurar os caminhos para os cabeçalhos e fontes
# INCLUDEPATH += ./include HEADERS += $$files(./include/*.h) files(./src
e agora finalmente escreva um esboço
#include "led-blink.h"
Agora clique com o botão direito na árvore do projeto e selecione "Montar"

Nós vamos para a pasta do projeto. Agora temos o diretório bin /, que contém os produtos de trabalho do compilador

Está tudo bem, existe o ELF, que é útil na depuração e hexadecimal para firmware no controlador. Agora vamos escrever outro pisca-pisca com LED no pino 13
#include "led-blink.h" #define LED_STAND_PIN 13 unsigned long time = 0; unsigned long DELAY = 500000; bool on = false;
Nós coletamos o projeto, vamos para o bin /. Colamos na sua placa usb. No meu caso, é Uno, no meu sistema, configura uma porta com o nome / dev / ttyACM0 para programação. Execute o comando
$ avrdude -c arduino -p m328p -P /dev/ttyACM0 -b 115200 -U flash:w:led-blink.hex:i
Aqui
- -P / dev / ttyACM0 - porta do programador
- -p m328p - modelo do controlador
- -c arduino - tipo de programador: incorporado na placa Uno
- -b 115200 - velocidade da porta
- -U flash: w: led-blink.hex: i - indica a área do firmware, tipo de operação (gravação) e arquivo de firmware
Um escape semelhante a este
avrdude: AVR device initialized and ready to accept instructions Reading |
nos diz que o processo correu bem. O LED piscará na frequência de 2 Hz.
Em princípio, você pode configurar o firmware no IDE. Para fazer isso, faça as configurações de inicialização como

e optando por iniciar o projeto (pressionando Ctrl + R), executaremos o firmware e iniciaremos exatamente como o IDE do Arduino.
Conclusões
O processo de instalação descrito é um procedimento bastante demorado. Mas, em troca, temos todo o poder de um dos IDEs mais notáveis que existem em sistemas baseados no kernel Linux (e o Windows também se aplica). Autodescrição, refatoração, navegação conveniente por código - tudo isso agora pode ser usado com sucesso.
Este exemplo é feito, como se costuma dizer, "na testa". De fato, o Arduino IDE compila o Arduino Core em uma biblioteca core.a estática separada e os links para o executável. Como resultado, o firmware coletado no ambiente padrão é menor em tamanho do que no método descrito no artigo. Eu ainda tenho que descobrir essas nuances. E, ao mesmo tempo, no seguinte artigo sobre este assunto, falaremos sobre:
- a estrutura do projeto, descubra onde a função main () está localizada e mostre por que o loop excessivo no Arduino é ruim
- depuração passo a passo usando emuladores
- trataremos das opções do compilador usadas na montagem
Em geral, tentaremos esclarecer muitas questões úteis para entender os processos em andamento, sem as quais no futuro será difícil mudar do Arduino para algo mais avançado.