Raspberry Pi / ATmega bridge : installation

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…

About Captain Stouf

Spécialiste en systèmes informatiques, Développeur matériel et logiciel, Inventeur, Maker : électronique, Systems on Chip, micro-controlleurs, Internet of Things, Modélisation / Scan / Impression 3D, Imagerie...

9 thoughts on “Raspberry Pi / ATmega bridge : installation

  1. Diff
    04/11/2014 at 23 h 45 min

    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 !

  2. Emilio
    04/12/2014 at 16 h 12 min

    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 🙂

    1. Captain Stouf
      04/12/2014 at 16 h 25 min

      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.

      1. Diff
        04/12/2014 at 17 h 26 min

        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 !

      2. Emilio
        04/12/2014 at 19 h 25 min

        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ù 😉

        1. Diff
          05/12/2014 at 10 h 54 min

          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.

          1. Emilio
            05/12/2014 at 12 h 45 min

            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.

  3. Diff
    05/12/2014 at 17 h 22 min

    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 ».

Laisser un commentaire