Date Tags Vim

Arduino UNO

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 &gt;= 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