samedi 8 septembre 2012

Fabriquer son propre Arduino (sur un breadboard)

Pourquoi voudrait-on fabriquer son propre Arduino au moyen d'un microprosseur Atmega 328?

  • Pour économiser quelques dollars
  • Pour créer une carte Arduino "améliorée" répondant à des besoins particuliers (par exemple, un Arduino comportant déjà un afficheur LCD, ou un pilote de moteur, etc.)
  • Pour finaliser un projet Arduino arrivé à terme (remplacer les headers par des soudures permanentes)
  • Pour prouver qu'on est capable de le faire (et s'en vanter sur son blog!)

Je me suis donc procuré un Atmega 328 sans bootloader ($3,50 chez Tayda).  Pour l'instant, il s'agit d'expérimenter: pas question de souder quoi que ce soit de permanent.  Pour éviter de casser certaines des broches du microcontrôleur en l'insérant dans un breadboard (ça m'est déjà arrivé avec un PIC...), j'ai utilisé un petit module de socket ZIF ("zero insertion force") que j'avais préalablement monté:  les broches du socket sont reliées à un header femelle, il est donc facile d'effectuer des branchements temporaires vers un breadboard.  Les sockets ZIF sont munis d'un levier qui libère complètement les broches du microcontrôleurs, donc aucun risque de l'endommager.


Gravure du bootloader

Il est plus facile (et plus économique) de se procurer un Atmega 328 vierge, ne contenant pas de bootloader.  Le processus de gravure du bootloader s'est révélé tellement simple que je vois mal pourquoi quelqu'un paierait plus cher simplement pour obtenir un Atmega déjà muni de son bootloader.

Pour graver le bootloader, j'ai utilisé les instructions disponibles ici.  Un Arduino Duemilanove m'a servi de programmeur.  Au départ, j'ai téléchargé le sketch "ArduinoISP" dans le Duemilanove (vous trouverez ce sketch dans le menu "Exemples" du logiciel Arduino).

Les branchements à effectuer sont:
  • broche 1 de l'Atmega :  Résistance de 10K : 5 V de l'Arduino
  • broche 1 de l'Atmega : broche 10 de l'Arduino
  • broche 7 de l'Atmega : 5 V de l'Arduino
  • broche 8 de l'Atmega : GND de l'Arduino
  • broche 17 de l'Atmega : broche 11 de l'Arduino
  • broche18 de l'Atmega : broche 12 de l'Arduino
  • broche 19 de l'Atmega : broche 13 de l'Arduino
  • broche 20 de l'Atmega : 5 V de l'Arduino
  • broche 22 de l'Atmega : GND de l'Arduino
  • Une des broches d'un cristal de 16 MHz est relié à la broche 9 de l'Atmega, l'autre broche du cristal est relié à la broche 10 de l'Atmega.  De plus, un condensateur d'environ 20 pF est placé entre chaque broche du cristal et GND.


J'ai aussi ajouté les trois LEDs indicatrices suggérées dans le sketch "ArduinoISP" aux broches 7, 8 et 9 de l'Arduino (ça aurait pu être utile en cas de problème).

Il ne reste plus qu'à régler le logiciel (IDE) Arduino de la façon suivante:
  • Outils : Type de carte : Arduino Duemilnove w/ Atmega 328
  • Outils : Ports série : (port de votre Arduino)
  • Outils : Programmateur :  Arduino as ISP
  • Outils : Graver la séquence d'initialisation
Pendant la gravure, la LED reliée à la broche 7 devrait clignoter (celle de la broche 8 devrait rester éteinte), et après quelques dizaines de secondes, le logiciel devrait confirmer la réussite de l'opération.  (Dans mon cas, ça a fonctionné du premier coup).

Télechargement d'un sketch

Le sketch "Blink" (qui fait clignoter une LED) semble gravé dans l'Arduino en même temps que le bootloader, mais puisque son utilité est plutôt limitée, vous désirerez probablement télécharger un autre sketch dans l'Atmega...

Pour ce faire, j'ai utilisé le "FTDI Basic Breakout" apparemment mis au point par Sparkfun, mais comme à mon habitude j'ai opté pour une contrefaçon chinoise à $8.  Ce minuscule circuit comporte un connecteur "mini-usb" qui permet le téléchargement (upload) d'un sketch vers l'Atmega.   Si vous souhaitez construire votre propre Arduino pour économiser de l'argent, l'achat de ce composant limitera sensiblement les possibilités d'économie...par contre vous pouvez utiliser le même breakout pour plusieurs Atmegas différents.

Pour la suite, je me suis fié essentiellement sur les instructions disponibles ici.  Dans un premier temps, vous enlevez toutes les connections menant à l'Arduino, ainsi que les trois LEDs indicatrices si vous les aviez utilisées.

Les branchements suivants, déjà effectués pour graver le bootloader, demeurent utiles:










  • broche 1 de l'Atmega :  Résistance de 10K : 5 V 
  • broche 7 de l'Atmega : 5 V 
  • broche 8 de l'Atmega :  GND 
  • broche 20 de l'Atmega :  5 V
  • broche 22 de l'Atmega : GND 
  • Une des broches du cristal de 16 MHz est relié à la broche 9 de l'Atmega, l'autre broche du cristal est relié à la broche10 de l'Atmega.  De plus, un condensateur d'environ 20 pF est placé entre chaque broche du cristal et le GND.


  • Puis vous ajoutez le branchements suivants:

    broche 21 de l'Atmega : 5 V

    Et finalement, vous ajoutez le FTDI Basic Breakout qui, en plus de transmettre le sketch de l'ordinateur vers l'Atmega, permettra aussi d'alimenter l'Atmega à partir du port USB de votre ordinateur.

    Les branchements du FTDI Basic Breakout sont:
    • GRN/DTR : Condensateur de 0,47 microfarads : broche 1 de l'Atmega
    • RXI : broche 3 (Tx) de l'Atmega
    • TXO : broche 2 (Rx) de l'Atmega
    • 5 V : pour alimenter votre ligne de 5 V où vous avez déjà branché  les broches 7 et 20 de l'Atmega.
    • BLK/GND :  aux autres GND
    Je n'ai pas la moindre idée de l'utilité de la broche "CTS", je n'ai pas eu besoin de la brancher.  Et je n'ai pas installé de bouton reset.

    Voilà!  Il ne reste plus qu'à brancher le tout à votre ordinateur au moyen d'un câble USB.  Si vous branchez une LED à la broche 19 de l'Atmega, elle devrait clignoter (à cause de l'exemple "Blink" déjà téléchargé lors de la gravure du booloader).  Mais vous pouvez évidemment remplacer ce sketch par ce que vous voulez!

    Ce schéma vous sera utile pour connaître la correspondance entre les broches d'un Arduino et celles de l'Atmega.

    Cet article a maintenant une suite: Fabrication d'un Arduino conçu pour utilisation sur breadboard

    Yves Pelletier (Twitter: @ElectroAmateur)

    12 commentaires:

    1. Salut, vraiment je te lis depuis un moment déjà et tes articles sont géniaux même si tu ne poste pas aussi souvent que ça ^^
      Sinon vraiment super l'idée de se faire un Arduino à moins de 3€ surtout que l'Arduino coute 10 fois plus !
      J'ai juste une petite question, dans mon Arduino que j'ai acheter il y'a pleins de petits trucs genre à coté de RX - TX - ON -ET EN (103) - RUR 117 5... des trucs que je ne peux pas mettre dans mon arduino fais maison ^^"
      Bonne continuation ;-)

      RépondreSupprimer
    2. Bonjour,
      Je souhaite utiliser votre tuto pour minimiser les coûts( je suis actuellement en arduino mini) d'une alarme que j'ai crée.
      J'aimerai savoir, une fois le tuto terminer:faut il brancher ses compos sur le microcontronleur ou laisser le crystal la resistance et les condensateurs ?

      RépondreSupprimer
    3. Bjr, merci pour ce post sympa, clair qui donne envie de s'y mettre à fond ! Cordialement. Michel

      RépondreSupprimer
    4. bonjour,
      j'ai un ftdi qui fonctionne quand je flashe les prominis
      j'ai essayé un mega328 avec bootloader uno sur breadboard, la led pin13 clignote, je branche le ftdi comme expliqué dans votre tuto
      et j'ai l'erreur not in sync 0x00
      le bootloader uno est prévu pour communiquer avec le sérial-usb monté sur une carte uno qui n'est pas un ftdi ?
      un boot UNO est-il capable de communiquer avec un ftdi ?
      dois je charger un bootloader dueminalove avec un usbpap ?


      merci

      RépondreSupprimer
      Réponses
      1. Bonjour,
        Je l'ai fait une fois avec un bootloader uno et ça avait fonctionné, mais j'ai le vague souvenir que j'avais eu besoin de modifier quelque chose dans le circuit. Je vais tenter de retrouver ça dans mes notes.

        Supprimer
    5. Salut !
      Ça fait un moment que l'article est sorti, mais il manque quelque chose d'assez capital : tu as acheté ton unité UART (le convertisseur usb vers serial) pour rien !

      Il est en effet possible d'utiliser le convertisseur intégré d'un arduino.
      Une solution pas pratique est d'enlever le µc d'un arduino et de connecter la puce à programmer au pin 0 (rx) et au pin 1 (rx) de l'arduino.
      Mais un peut aussi relier la la pin RESET de l'arduino au GND (via une résistance de 20k par exemple), et du coup, le µc de l'arduino n'interfère pas avec la liaison série, et les pins 0 et 1 s'adresseront à la puce à programmer.

      Ça mérite peut être une correction d'article, non ? ;-)

      RépondreSupprimer
    6. Bonjour :)

      Déja merci pour ce tuto très bien fait!
      J'aimerais faire appel à vous car j'utilise les arduino depuis pas mal de temps maintenant et j'ai voulu créer un clone de l'arduino Uno (ATmega8U2 + ATmega328p) et aujourd'hui je n'arrive à téléverser le sketch dans le ATmega 328p. En fait si j'arrive à le programmer mais seulement en ICSP grâce à une arduino MEGA 2560 que je possède.

      J'ai suivi tous les tutoriels que j'ai pu trouver sur internet mais impossible de programmer mon ATmega328p via le port série. Lorsque je lance l'upload la led RX clignote 3 fois et les erreurs apparaissent :

      avrdude: stk500_recv(): programmer is not responding
      avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x82
      .
      .
      .
      .
      Autre fait troublant que j'ai remarqué hier soir, lorsque je téléverse (en ICSP) un sketch avec des "Serial.print" avec une initialisation à 9600 bauds, je ne lis pas correctement les caractères dans le moniteur lui-même configuré en 9600.

      Quelqu'un voit-il le problème? Je suis à court d'idées ^^
      merci!!

      RépondreSupprimer
    7. Bonjour,

      Merci votre tutoriel ! Pour moi, il n'y manque que la précision avec si possible une image pour l'exécution du chargement en mode "Arduino as ISP", soi la commande du menu "Croquis", "Téléverser avec programmateur" ou au clavier les touches Ctrl+Maj+U. C'est un oubli dans les tutoriels qui parle de l'Arduino sur planche d'expérimentation.

      L'ami René
      Réf. : https://1technophile.blogspot.ca/2015/04/chargement-du-bootloader-8mhz-puis-un.html?showComment=1469379435741

      RépondreSupprimer
    8. Bonjour, est-il possible de flasher le bootloader avec n'importe quel arduino ?

      RépondreSupprimer
    9. Ouais enfin sur aliexpress on peut avoir des arduinos no name pour le même prix que juste ici.

      Gagner quelques dollars à l'achat oui, mais il faut aussi prendre en compte le coût du temps, servant à faire le "Soi-même", on est pas si souvent gagnant à le faire soi-même :P

      Par contre y'a la satisfaction de l'avoir fait soi-même :D

      En tout cas vu les prix des arduino no name, on ne peut pas vraiment parler ici d'économie, mais plus de projet didactique ;)

      RépondreSupprimer
      Réponses
      1. L'article a été publié en 2012, à un moment où la différence de prix était appréciable. De plus, il s'adresse à des gens pour qui l'électronique est un passe-temps; dans ce contexte, le "coût du temps" est un concept qui s'applique assez mal.

        Supprimer
    10. Le gros avantage est de pouvoir faire un arduino minimaliste sans régulateur de tension ( a alimenter en 5v5 ) et sans le convertisseur usb intègré qui sont de gros consommateur d'énergie. A méditer pour tous les projets embarqués alimenté par batterie...

      RépondreSupprimer