risorse | sviluppare per arduino con scite

Sviluppare per Arduino con SciTE

L'editor fornito dall'IDE di Arduino non offre particolari agevolazioni per la scrittura di codice sorgente, tanto che l'ambiente permette di utilizzarne uno esterno (vedi voce Use External Editor del menu Preferences). In questa modalità tuttavia l'autonomia non è completa: se lo sketch può essere lavorato con l'editor di testo preferito, la compilazione e l'upload del firmware deve avvenire comunque attraverso l'IDE.

A partire dalla versione 1.5.2, l'IDE di Arduino offre un'interfaccia a linea di comando attraverso la quale un programma esterno può richiedere la compilazione di uno sketch o il suo caricamento sulla scheda. Le regole d'uso sono riportate sul sito ufficiale.

Questi appunti mostrano come interfacciare SciTE all'IDE di Arduino per compilare e fare l'upload del programma nella scheda direttamente dalla finestra dell'editor.

Nota 1: gli esperimenti sono stati condotti con Arduino IDE 1.6.5 e SciTE 3.7.1 su Ubuntu 14.04 64 bit.

Nota 2: per la corretta compilazione degli sketch, la toolchain di Arduino richiede che il codice sorgente sia salvato in un file con estensione *.ino all'interno di una cartella con lo stesso nome del file.

Nota 3: i due comandi principali dell'IDE di Arduino, Verify e Upload, sono stati mappati per analogia nei comandi Compile (Ctrl+F7) e Build (F7) di SciTE rispettivamente.

Configurazione di SciTE

Prima di eseguire un qualunque comando è necessario specificare il percorso al programma dell'IDE di Arduino, il tipo di scheda Arduino con cui si intende lavorare, nonché la porta USB alla quale questa è connessa. A tal scopo sono state definite tre variabili:

arduino.program=/path/to/the/arduino/ide/executable
arduino.board=package:architecture:board
arduino.port=/path/to/the/usb/port

Fare riferimento alla documentazione ufficiale per il formato e il significato dei parametri. Segue un esempio reale di configurazione dalla quale si evince che si sta utilizzando una scheda originale Arduino Uno collegata alla prima porta USB del computer:

#
# arduino sketches support
#
arduino.program=/opt/arduino-1.6.5-r5/arduino
arduino.board=arduino:avr:uno
arduino.port=/dev/ttyACM0

Segue la definizione del comando di accesso all'interfaccia:

arduino.command=$(arduino.program) --board $(arduino.board) --port
$(arduino.port)

Si procede con la definizione del nuovo tipo di file Arduino Sketch (*.ino), includendolo nella categoria “All Source” e nell'elenco dei tipi di file disponibili della maschera Open File:

# arduino file type
file.patterns.arduino=*.ino
*source.patterns.arduino=$(file.patterns.arduino);
filter.arduino=Arduino Sketch (*.ino)|$(file.patterns.arduino)|
*filter.arduino=$(filter.arduino)

Si passa a definire il supporto per l'evidenziazione della sintassi dichiarando di voler utilizzare il parser del linguaggio C++ — gli sketch Arduino sono di fatto dei frammenti di programma C++ — e specificando quali sono i nomi di funzione che si vogliono enfatizzati:

# arduino syntax highlight
lexer.$(file.patterns.arduino)=cpp

# arduino keywords and library function names
arduino.library.keywords=pinMode \
digitalWrite \
digitalRead \
analogReference \
analogRead \
analogWrite \
analogReadResolution \
analogWriteResolution \
tone \
noTone \
shiftOut \
shiftIn \
pulseIn \
millis \
micros \
delay \
delayMicroseconds \
min \
max \
abs \
constrain \
map \
pow \
sqrt \
sin \
cos \
tan \
isAlphaNumeric \
isAlpha \
isAscii \
isWhitespace \
isControl \
isDigit \
isGraph \
isLowerCase \
isPrintable \
isPunct \
isSpace \
isUpperCase \
isHexadecimal \
randomSeed \
random \
lowByte \
highByte \
bitRead \
bitWrite \
bitSet \
bitClear \
bit \
attachInterrupt \
detatchInterrupt \
interrupts \
noInterrupts \
Serial \
Stream

arduino.lcd.keywords=begin \
clear \
home \
setCursor \
write \
print \
cursor \
noCursor \
blink \
noBlink \
display \
noDisplay \
scrollDisplayLeft \
scrollDisplayRight \
autoscroll \
noAutoscroll \
leftToRight \
rightToLeft \
createChar

arduino.wire.keywords=begin \
requestFrom \
beginTransmission \
endTransmission \
write \
available \
read \
onReceive \
onRequest

keywords.$(file.patterns.arduino)=$(keywordclass.cpp)
keywords2.$(file.patterns.arduino)=$(keywordclass2.cpp) \
$(arduino.library.keywords) \
$(arduino.lcd.keywords) \
$(arduino.wire.keywords)

La configurazione precedente presuppone che la variabile keywordclass.cpp contenga l'elenco delle parole chiave del C++, mentre la variabile keywordclass2.cpp contenga i nomi delle funzioni della libreria standard del linguaggio:

# list of c++ keywords
keywordclass.cpp=alignas \
alignof \
and \
and_eq \
...
xor \
xor_eq

# list of c/c++ library function names
keywordclass2.cpp=abort \
abs \
acos \
...
vscanf \
vsscanf
keywords2.$(file.patterns.cpp)=$(keywordclass2.cpp)

Entrambe le variabili possono essere lasciate vuote o non essere dichiarate affatto, nel qual caso verrebbero evidenziati solo i nomi specificati nelle variabili arduino.*.keywords, perdendo di fatto un po' del potere espressivo disponibile in SciTE. È da tener conto che l'evidenziazione delle parole chiave e delle chiamate a funzione avviene solamente se sono stati definiti gli stili appropriati:

# style for the C++ "keywords"-class words
style.cpp.5=...

# style for the C++ "keywords2"-class words
style.cpp.16=...

Essendo gli sketch di Arduino dei frammenti di C++ veri e propri, conviene sfruttare l'aiuto che SciTE può fornire circa la parametrizzazione delle funzioni della libreria standard del linguaggio, se disponibile:

# arduino api specs
api.$(file.patterns.arduino)=$(SciteUserHome)/.scite/api/cpp.api

Resta da specificare la corrispondenza tra i comandi di SciTE e quelli dell'IDE Arduino:

# arduino commands
if PLAT_UNIX
command.compile.$(file.patterns.arduino)=$(arduino.command) --verify $(FilePath)
command.build.$(file.patterns.arduino)=$(arduino.command) --upload $(FilePath)

Pagina modificata il 05/12/2016