Vi IMproved - of kortweg vim - is al jaren mijn favoriete editor als het aankomt op het schrijven van code. Het feit dat ik niet vanuit vim een nieuw bericht op mijn blog kan plaatsen stoort mij dan ook enorm .. hé wacht eens even *idee*. Dat wordt een volgend project ;)
Programmeren vind ik leuk en electronica vind ik leuk. Arduino is de liefdesbaby van deze 2. De Arduino IDE is echter de nageboorte die zo bij het grofvuil kan. Ok, dat is wel erg kort door de bocht maar ik stoor mij gewoon erg aan de manier waarop de Arduino IDE werkt. Daarbij komt dat ik de meeste tijd van de dag in vim aan het werk ben dus vind ik het een logische keuze om ook mijn Arduino-code in vim te schrijven én te compilen en uploaden naar mijn Arduino UNO natuurlijk!
Dit artikel is niet uniek maar is een cohesie van verschillende artikel die ik op de interwebs ben tegengekomen. Geen enkel artikel werkte zonder problemen dus dit is een verzameling van alles wat wél werkt. Dit is dus tevens een handleiding voor mijzelf in het geval ik mijn PC opnieuw moet installeren en mijn vim-omgeving opnieuw moet inrichten ;)
In dit artikel ga ik ervan uit dat je gebruikmaakt van Ubuntu 13.04 en dat je enige kennis van terminal-commando's hebt. Waarschijnlijk werkt deze beschrijving ook op eerdere en latere versies van Ubuntu en andere Debian-afgeleiden. Om te beginnen installeren wij de volgende 2 pakketjes.
sudo apt-get install arduino avrdude
Stap 1: Syntax highlighting
Het eerste wat vim moet kunnen doen om een beetje fatsoenlijk Arduino-code te kunnen schrijven is syntax highlighting. Download het Arduino syntax-bestand van de site van vim en plaats dit bestand in de vim syntax-directory in je home directory.
mkdir -p ~/.vim/syntax
wget http://www.vim.org/scripts/download_script.php?src_id=17108 -O ~/.vim/syntax/arduino.vim
Indien je dit nog niet aan hebt staan - wat ik sterk betwijfel, maar toch - dien je syntax highlighting aan te zetten in vim. Dit kun je doen in /etc/vim/vimrc of in je eigen \~/.vimrc bestand. Voeg de volgende regels toe of haal de commentaar-tekens weg indien je dit in /etc/vim/vimrc aanpast.
if has("syntax")
syntax on
endif
au BufRead,BufNewFile *.pde set filetype=arduino
au BufRead,BufNewFile *.ino set filetype=arduino
De laatste 2 regels zorgen ervoor dat wanneer je een Arduino sketch opent, vim automatisch het bijbehorende syntax-bestand inlaadt.
Stap 2: Arduino sketch compilen en uploaden
Nu je in vim Arduino-code kunt schrijven is het ook prettig om vanuit
vim de geschreven code direct te kunnen compilen en uploaden naar je
Arduino. Hiervoor zijn verschillende oplossingen maar de meest
aantrekkelijke vind ik deze; installeer het pakketje Arduino-mk
door
middel van het volgende commando.
sudo apt-get install arduino-mk
Dit pakketje installeert het bestand /usr/share/arduino/Arduino.mk
.
De versie die op dit moment in de Ubuntu-repository zit (0.10-1) bevat
echter een bug. Met de invoering van de nieuwe Arduino Leonardo zijn er
2 variabelen toegevoegd aan het bestand. Wanneer je dit bestand echter
gebruikt voor een niet-Leonardo Arduino, zoals de UNO, zal je de
volgende 2 foutmeldingen krijgen wanneer je een Arduino sketch probeert
te compilen.
build.vid isn't defined for the uno board, at /usr/bin/ard-parse-boards line 50.
build.pid isn't defined for the uno board, at /usr/bin/ard-parse-boards line 50.
Deze bug is eenvoudig te fixen door in het bestand /usr/share/arduino/Arduino.mk
de volgende aanpassing te doen.
ifeq ($(VARIANT),leonardo)
ifndef USB_VID
USB_VID = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.vid)
endif
ifndef USB_PID
USB_PID = $(shell $(PARSE_BOARD_CMD) $(BOARD_TAG) build.pid)
endif
endif
Indien jij een nieuwere versie dan 0.10-1 hebt geïnstalleerd kun je even proberen een sketch te compilen en kijken of je de foutmeldingen krijgt. Zo niet dan kun je het bestand lekker ongewijzigd laten.
Arduino.mk heeft nog een aantal instellingen nodig die je kunt zetten
door middel van environment variables. Deze kun je zetten door aan het
bestand ~/.bashrc
de
volgende regels toe te voegen.
export ARDUINO_DIR=/usr/share/arduino
export BOARD_TAG=uno
export ARDUINO_PORT=/dev/ttyACM0
export ARDMK_DIR=/usr
export AVR_TOOLS_DIR=/usr
Als jij een andere Arduino dan een UNO hebt dien je de variabele BOARD_TAG
aan te
passen. Waarschijnlijk is de serieële poort ARDUINO_PORT
dan
ook anders. Deze gegevens kun je nagaan in de Arduino IDE.
Meer informatie en meer variabelen kun je vinden door het bestand
/usr/share/arduino/Arduino.mk
te openen met vim.
Maak nu in de directory waar jouw Arduino sketch staat (\~/sketchbook)
een nieuw bestand aan met de naam Makefile
. Let op
de hoofdletter. Zet in dit bestand de regel include /usr/share/arduino/Arduino.mk
, zodat wanneer je deze sketch gaat
compilen het arduino.mk
bestand wordt gebruikt.
cd ~/sketchbook/MijnProject
echo "include /usr/share/arduino/Arduino.mk" > Makefile
Arduino.mk verwacht dat het header-bestand met Arduino-functies WProgram.h heet. Dit bestand heet echter Arduino.h dus dit moeten we even aanpassen. Een eenvoudige symlink volstaat. Voer hiervoor de volgende commando's uit.
Wanneer je ook oudere Arduino sketches (<v1.0) wilt kunnen compilen met deze opzet, kun je het volgende trucje toepassen.
cd /usr/share/arduino/hardware/arduino/cores/arduino
vi WProgram.h
Vul het bestand WProgram.h nu met de volgende inhoud.
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "wiring.h"
#include "pins_arduino.h"
#endif
Helaas is dit geen garantie dat je oudere sketches zullen werken maar het maakt de kans in ieder geval wel een stuk groter.
Stap 3: Aan elkaar plakken
Beide onderdelen zijn nu gereed om aan elkaar te worden gekoppeld. Dit doe je door een nieuw bestand aan te maken in de directory ~/.vim/ftplugin
met de naam arduino.vim
.
mkdir -p ~/.vim/ftplugin
vi ~/.vim/ftplugin/arduino.vim
Vul nu het bestand arduino.vim met de volgende inhoud.
setlocal errorformat=%f:%l:%c:\%m
setlocal makeprg=make
setlocal makeef=/tmp/vim##.err
Stap 4: Testen
Open nu een van je Arduino sketches in vim en type.
:make
De sketch zal nu worden gecompiled. Je kunt de sketch ook direct uploaden naar de Arduino door middel van.
:make upload
Als alles goed is gegaan zal je ongeveer de volgende output krijgen en nog veel belangrijker een Arduino die doet wat jij 'm zojuist hebt geïnstrueerd te doen.
pieter@pc-pieter:~/sketchbook/Blink$ vi Blink.ino
/usr/bin/ard-reset-arduino /dev/ttyACM0
/usr/bin/avrdude -q -V -p atmega328p -c arduino -b 115200 -P /dev/ttyACM0
-U flash:w:build-uno/Blink.hex:i
avrdude: AVR device initialized and ready to accept instructions
avrdude: Device signature = 0x1e950f
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 "build-uno/Blink.hex"
avrdude: writing flash (1078 bytes):
avrdude: 1078 bytes of flash written
avrdude: safemode: Fuses OK
avrdude done. Thank you.
Press ENTER or type command to continue
Terminal venster
Als je in je Sketch informatie wilt tonen via de serieële verbinding dan
kun je hier screen
voor gebruiken. Installeer screen door middel van het volgende commando.
sudo apt-get install screen
Het volgende commando is volledig afhankelijk van het type Arduino dat
je gebruikt en de baudrate die je hebt ingesteld voor de serieëe poort
met Serial.begin()
.
sudo screen /dev/ttyACM0 9600
Hierbij ga ik er dus vanuit dat de Arduino is verbonden via /dev/ttyACM0
en
dat de baudrate 9600 is. Om de screen-sessie weer te sluiten druk je de
volgende toetsencombinatie in.
control-a k