Dans l’article précédent, nous avons cablé un ATmega directement aux GPIO du Raspberry Pi. Nous allons maintenant installer la partie logicielle nécessaire pour programmer le micro-contrôleur.
Pour rappel, notre ATmega328P sera ‘configuré’ pour une alimentation en 3.3V, sur son oscillateur interne à 8MHz, et une vitesse d’upload sur l’UART à 57600 baud.
Possibilité 1 – Script d’installation
Il y a pas mal d’étapes, j’ai mis tout cela sous forme de script sur GitHub. Voici donc la procédure (très) simplifiée :
cd /tmp git clone https://github.com/CaptainStouf/raspberry_isp.git cd raspberry_isp/ sudo chmod +x arduino_installer.sh sudo ./arduino_installer.sh
Après un temps plus ou moins long (selon le nombre de mises à jour à faire), le script s’achève et vous pouvez rebooter pour activer le tout. Vous pourrez alors passer à l’article suivant : initialisation et programmation en SPI.
Possibilité 2 – Installation manuelle
Mise à jour du Raspberry
sudo apt-get -y update sudo apt-get -y dist-upgrade
Installation de l’IDE Arduino classique
sudo apt-get -y install arduino
Nous récupérons et copions les deux fichiers de définitions Arduino, qui contiennent les informations sur notre programmeur et notre bootloader spéciaux. Vous devrez ajuster la définition du bootloader dans le fichier boards.txt si vous utilisez un ATmega en 5V et/ou un résonateur externe (comme l’Arduino Uno). Même chose si vous utilisez un autre modèle d’ATmega (ATmega8-16 par exemple).
wget https://raw.githubusercontent.com/CaptainStouf/raspberry_isp/master/boards.txt wget https://raw.githubusercontent.com/CaptainStouf/raspberry_isp/master/programmers.txt sudo cp boards.txt /usr/share/arduino/hardware/arduino sudo cp programmers.txt /usr/share/arduino/hardware/arduino
Installation de avrdude spécial R-Pi, utilisé dans le projet Gertboard (avrdude est le composant de l’IDE Arduino qui permet d’uploader des sketches dans l’ATmega)
cd /tmp wget http://project-downloads.drogon.net/gertboard/avrdude_5.10-4_armhf.deb sudo dpkg -i avrdude_5.10-4_armhf.deb sudo chmod 4755 /usr/bin/avrdude
Nous installons le petit hack qui permet, lors d’un upload de sketch en UART, de forcer un reset de l’ATmega via un GPIO du Raspberry.
Il est possible de modifier le GPIO utilisé en éditant le fichier « autoreset ».
wget https://github.com/CaptainStouf/avrdude-rpi/archive/master.zip sudo unzip master.zip cd /tmp/avrdude-rpi-master/ sudo cp autoreset /usr/bin sudo cp avrdude-autoreset /usr/bin sudo mv /usr/bin/avrdude /usr/bin/avrdude-original sudo ln -s /usr/bin/avrdude-autoreset /usr/bin/avrdude sudo chmod 755 /usr/bin/avrdude-autoreset sudo chmod 755 /usr/bin/autoreset
Nous avons besoin du port série du Rapberry Pi, mais par défaut dans Raspbian, il est occupé par une console. Nous allons donc désactiver cette console pour avoir accès au port série :
sudo nano /etc/inittab
Recherchez (CTRL+w) et commentez (rajoutez un #) la ligne suivante :
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Sauvegardez (CTRL+o) et quittez (CTRL+x)
Quand le Raspi démarre, il envoie toutes ses infos de démarrage sur le port série. Nous devons donc également désactiver cette fonctionnalité.
sudo nano /boot/cmdline.txt
Le contenu du fichier devrait ressembler à :
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Supprimmez toutes les références à ttyAMA0 (c’est le nom du port série). Le fichier devrait maintenant ressembler à ceci :
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Nous allons enfin créer deux ports série virtuels, ttyS8 et ttyS9, qui seront des liens dynamiques vers les ports physiques, afin que l’IDE Arduino puisse les utiliser.
sudo echo 'KERNEL=="ttyAMA0", SYMLINK+="ttyS8",GROUP="dialout",MODE:=0666' >> /etc/udev/rules.d/99-tty.rules sudo echo 'KERNEL=="ttyACM0", SYMLINK+="ttyS9",GROUP="dialout",MODE:=0666' >> /etc/udev/rules.d/99-tty.rules
Il n’y a plus qu’à rebooter pour activer le tout.
La suite logicielle (de base) permettant d’exploiter notre ATmega est prête. Ouf ! Cependant, notre ATmega n’est pas encore prêt à communiquer avec le Raspberry Pi.
Dans l’article suivant, nous verrons donc comment initialiser et utiliser notre ATmega, en SPI…
Merci pour cet excellent article, je suis très intéressé par la suite ! Où est-il possible de trouver la suite : « initialisation et programmation en SPI »
Merci d’avance !
Salut,
je serais aussi intéressé par la suite de l’article.
J’essaie actuellement de programmer un atmega328p en passant directement par le PI mais je me retrouve systématiquement avec une erreur d’avrdude « device not responding »…
J’arrive cependant à programmer des attiny85 correctement par SPI de la même façon.
(une erreur de bootloader? un pb de cristal externe absent sur mon atmega?)
Merci 🙂
Bonjour,
Je vais publier l’article dès que j’aurai un moment pour le faire, c’est promis…
A priori, si vous arrivez à programmer des attiny85 mais pas l’atmega328p, le problème peut provenir de la configuration du bootloader (il y a plusieurs types de atmega328p : au, pu, etc) ou effectivement de l’absence d’oscillateur externe (ce qui revient à une erreur de configuration du bootloader).
Une autre piste : avez-vous essayé en 5v, en passant par un arduino plutôt que le Pi ? Certains atmega328p semblent refuser la programmation en 3.3v.
Bonjour,
Depuis j’ai réussi à programmer un autre ATMEGA328, le problème venait de celui que j’avais à ce moment là qui, je pense, n’avait pas de bootloader !
Merci pour les info en tout cas, et beau travail !
Merci pour la réponse.
Je n’ai pas testé avec un arduino, j’ai acheté l’atmega seul et j’essaie de tout piloter/gérer par le raspberry.
J’ai essayé de générer une clock depuis le raspberry PI et de l’envoyer à l’atmega à la place de l’oscillateur, mais ça ne fait pas l’affaire.
Je vais essayer de trouver quelqu’un avec un arduino voir s’il peut me reprogrammer les fuse en 8Mhz oscillateur interne, après je devrais pouvoir me débrouiller avec le PI. Enfin j’espère…
Je vais suivre le prochain article au cas où 😉
Pour ma part, j’ai mixé cet article avec un autre. Je configure l’atmega en SPI, mais avec un bouton poussoir + résistance sur la pin Reset. Du coup, je n’ai que MOSI/MOSI/SCK branché sur le PI. Ensuite je configure un fichier Make, une fois le script .ino fait, un petit coup de make pour compiler le script, et une fois la compilation terminée, je fais un make upload pour tout envoyer à l’atmega. La subtilité se trouve ici, si je fais l’upload sans appuyer sur le bouton de la pin reset, j’ai le même message que toi. En appuyant sur le bouton, tout fonctionne bien. Une fois l’upload terminée, je débranche les 3 fils en le PI et l’atmega.
Salut Diff, j’ai le même principe sauf que mon reset est fait par une Pin du PI (je vais vérifier que ça se passe bien de ce côté).
Je serais intéressé par les commandes de compilation et upload de ton script pour voir si je n’ai pas une erreur de paramètres ou autre.
Alors pour le fichier « Makefile » :
ARDUINO_DIR = /usr/share/arduino
AVRDUDE_ARD_PROGRAMMER = gpio
BOARD_TAG = uno
ARDUINO_PORT = /dev/ttyAMA0
ARDUINO_LIBS =
include /usr/share/arduino/Arduino.mk
Une fois le script fait => « make » dans le même répertoire
Une fois la compilation terminée, tu tapes « make upload ». Pour moi le reset avec le PI ne fonctionnait pas, c’est pour ça que je suis passé par le bouton poussoir qu’il faut maintenir le temps du « make upload ».