samedi 29 septembre 2012

Mesurer une température avec un Arduino

Le projet est simple:  construire un thermomètre au moyen d'un Arduino, d'un capteur de température et d'un afficheur à cristaux liquides.

Option 1:  le capteur numérique DS18B20

Je me suis procuré sur eBay une sonde constituée d'un capteur DS18B20 enfermé dans une capsule métallique hermétique et muni d'un câble d'environ 1 mètre de long (cherchez "Digital Temperature Sensor Probe DS18B20").

Les branchements du capteur à l'Arduino sont extrêmement simples:
  • fil rouge du capteur:  5 V de l'Arduino
  • fil noir du capteur: GND de l'Arduino
  • fil bleu du capteur:  entrée numérique 8 de l'Arduino
  • résistance de 4,7 K placée entre le fil rouge et le fil bleu
La sonde est précalibrée, les résultats sont extrêmement stables, et vous pouvez en principe mesurer n'importe quelle température entre -55°C et +125°C avec une résolution d'un demi degré.  En plus, puisque chaque DS18B20 dispose de sa propre adresse encodée en usine, vous pouvez relier plusieurs dizaines de capteurs de température à votre Arduino en n'utilisant qu'une seule entrée numérique!

Le seul inconvénient que je pourrais y voir, c'est que le décodage du message numérique reçu en provenance du DS18B20 est à mon avis un peu plus compliqué qu'un traditionnel signal analogique, mais la librairie "OneWire" fait le gros du travail.  Pour dire la vérité, je me suis contenté de modifier légèrement un sketch trouvé sur le site Hacktronics, sans me poser trop de questions sur la signification profonde du code.   Pour bien comprendre ce qui se passe, je vous conseille plutôt cet excellent tutoriel en français.


En ce qui concerne les branchements de l'afficheur à cristaux liquides (LCD), vous pouvez vous référer au schéma publié ici.



Option 2:  le capteur analogique LM35DZ

J'ai aussi essayé le LM35, qui est un capteur de température analogique:  il émet une tension proportionnelle à la température en degrés Celsius (10,0 mV par degré).   Il permet de mesurer des températures similaires au DS18B20:  de -55°C à 150°C, avec une résolution de 0,5°C.  Toutefois, la mesure d'une température négative avec un Arduino entraîne quelques complications, car on ne veut pas acheminer une tension négative à une entrée analogique...

J'ai fabriqué ma propre sonde hermétique en enfermant un LM35DZ dans une gaine thermorétractable et en ajoutant un peu de silicone.

En principe, les branchements à l'Arduino sont ridiculement simples:
  • broche GND du LM35 : GND de l'Arduino
  • broche Vout du LM35:  Entrée analogique 0 de l'Arduino
  • broche Vs du LM35:  Sortie 5 V de l'Arduino
Mais avec environ 1 mètre de câblage entre l'Arduino et le capteur, les résultats étaient un brin décevants:  la température affichée oscillait constamment sur une gamme d'environ 3 degrés.  L'ajout d'une résistance de 68 Ω et d'un condensateur de 1 µF en série entre l'entrée analogique 0 et le GND a permis de stabiliser l'affichage de façon spectaculaire:  il est maintenant très stable et parfaitement en accord avec la mesure obtenue au moyen du DS18B20.

Autre précaution utile:  puisque la tension qui provient à l'entrée analogique de l'Arduino ne dépassera guère 1 V, aussi bien utiliser une valeur de référence de 1,1 V plutôt que la valeur habituelle de 5 V (auquel cas l'appareil n'utiliserait que 20% de la plage disponible).  C'est fait dans le sketch au moyen de l'instruction "analogReference(INTERNAL);".


En ce qui concerne les branchements de l'afficheur à cristaux liquides (LCD), vous pouvez vous référer au schéma publié ici.


D'autres options?

Le LM335 est un autre capteur analogique qui peut être utilisée à la place du LM35 (il s'agit d'une diode Zener dont la tension de rupture est proportionnelle à la température.

Un thermocouple pourrait aussi être utilisé si vous désirez mesurer des températures très élevées (dans un four, par exemple).  Et il y a la bonne vieille thermistance, dont la résistance varie avec la température.  Dans ces cas, le calcul d'une température exacte en degrés Celsius à partir du signal mesuré peut par contre se révéler assez complexe.

Yves Pelletier (Twitter: @ElectroAmateur)

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)

    dimanche 2 septembre 2012

    Stellaris LM4F120 LaunchPad pour $5

    J'ai réservé mon exemplaire du nouveau Stellaris LM4F120 LaunchPad (une carte de développement munie d'un puissant microcontrôleur 32 bits) sans trop savoir ce que je vais en faire, pour la simple raison qu'à un prix de lancement de $4.99 (frais de livraison inclus), ça semble une bonne affaire!

    Je devine que le nouveau-né de Texas Instruments sera aussi chiant à programmer que le MSP430 Launchpad pouvait l'être avant la création d'Energia, je croise donc les doigts pour qu'il soit un jour possible de le programmer au moyen d'Energia ou d'un logiciel similaire...

    Yves Pelletier (Twitter: @ElectroAmateur)