Avrdude pour Raspberry Pi

Flasher un nouveau firmwawre sur l'ATmega328 de GrovePi

Jusqu'à fin 2015, la procédure d'installation de GrovePi pour pouvoir flasher le firmware de la GrovePi était fonctionnelle. Mais le paquetage actuellement distribué sur Raspbian ne permet pas de flasher le firmware à partir de la Raspberry Pi. La procédure d'installation globale des outils nécessaires reste identique à celle décrit sur le site de Grove Pi (Installation logicielle de GrovePi). Mais avant de pouvoir flasher le fimware, il est nécessaire de remplacer la version d'avrdude qui est fournie dans le paquetage Raspbian par une version compatible avec le gpio de la Raspberry pour accéder au Atmel de la plate-forme GrovePi. Voici la procédure à suivre pour compiler et installer une version d'avrdude compatible avec le gpio.

Les commandes suivantes sont à effectuer une fois l'installation de grovepi effectuée, mais avant de lancer le flashage du firmware sur le ATmega.

Il faut tout d'abord récupérer les sources d'avrdude et les compiler

sudo apt-get install bison flex libusb-dev
wget http://download.savannah.gnu.org/releases/avrdude/avrdude-6.1.tar.gz
tar xf avrdude-6.1.tar.gz
rm avrdude-6.1.tar.gz
cd avrdude-6.1
./configure --prefix= --enable-linuxgpio
CPU=`cat /proc/cpuinfo | grep processor | wc -l`
make -j $CPU

Puis, il faut modifier le fichier de configuration pour lui ajouter les informations sur gpio.

echo "programmer
id    = \"gpio\";
desc  = \"Use the Linux sysfs interface to bitbang GPIO lines\";
type  = \"linuxgpio\";
reset = 8;
sck   = 11;
mosi  = 10;
miso  = 9;
;" >> avrdude.conf

L'installation va remplacer les fichiers installés par le paquetage avrdude de Raspbian.

sudo cp -f avrdude  /usr/bin/avrdude
sudo cp -f avrdude.conf /etc/avrdude.conf
gzip avrdude.1
sudo cp -f avrdude.1.gz /usr/share/man/man1/
gunzip avrdude.1.gz

sudo sh -c 'echo "
rpigpio.name=RPi GPIO
rpigpio.protocol=linuxgpio
" >> /usr/share/arduino/hardware/arduino/programmers.txt'

Pour tester que le programme reconnaît bien le port gpio pour faire le flashage de ATmega, lancez la commande suivante.

sudo avrdude -p atmega328p -c gpio -v -t

Compilation d'un firmware avec ino

L'étape suivante est de pouvoir produire son propre programme pour l'ATmega328 de la plate-forme GrovePi. Ceci pour va être utile pour produire un firmware qui soit adapté à nos propres besoins ou tout simplement pour produire le tout dernier firmware à partir des sources de GrovePi.

Pour la production du firmware, il est recommandé d'utiliser ino qui est un constructeur automatique de projet. Celui-ci définit automatiquement les dépendances en fonction des #include dans les sources.

Pour installer ino, il suffit de lancer la commande suivante:

sudo pip install ino

La création d'un nouveau projet et la compilation de celui-ci est réalisé de la manière suivante:

mkdir firmware && cd firmware
ino init ; # utilisé l'option -t comme dans la documentation GrovePi provoque une erreur car le template n'est pas connu
rm src/sketch.ino
cp -a ~/Src/GrovePi/Firmware/Source/v1.2/grove_pi_v1_2_7/* src/
ino list-models
ino build -m atmega328

Une fois le fichier généré, il ne reste plus qu'à le flasher sur la plate-forme GrovePi en utilisant le script fournit dans les sources de GrovePi/Firmware:

cp .build/atmega328/firmware.hex ~/GrovePi/Firmware/grove_pi_firmware.hex
cd ~/GrovePi/Firmware
sudo ./firmware_update.sh

Problème rencontré lors de la compilation

J'ai rencontré un problème lors de la compilation du firmware de GrovePi avec l'erreur suivante:

/usr/share/arduino/libraries/Robot_Control/keyboard.cpp: In member function ‘int8_t RobotControl::keyboardRead()’:
/usr/share/arduino/libraries/Robot_Control/keyboard.cpp:31:42: error: ‘KEY’ was not declared in this scope
lectura_pul = this->averageAnalogInput(KEY);

Ce problème est lié au mécanisme de ino qui calcule les dépendances de manière un peu triviale. En effet, celui-ci semble se baser sur l'ordre alphabétique dans la recherche des bibliothèques qui fournissent tel ou tel .h. Dans le cas de GrovePi, on utilise la bibliothèque Wire qui fournit Wire.h. Mais ce fichier Wire.h est aussi présent dans le dossier /usr/share/arduino/libraries/Robot_Control. Or Robot_Control est alphabétiquement avant Wire, donc ino inclus la bibliothèque Robot_Control plutôt que la simple bibliothèque Wire ce qui conduit à l'erreur ci-dessus lors de la compilation du firmware. Pour résoudre le problème, il suffit de renommer la bibliothèque Robot_Control en ZRobot_Control (donc qui alphabétiquement sera après Wire).

sudo mv /usr/share/arduino/libraries/Robot_Control /usr/share/arduino/libraries/ZRobot_Control