Découverte du microcontrôleur ATTINY45

Je viens de recevoir une commande de chez Farnell : deux microcontrôleurs Atmel ATTINY45, deux modules XBee, et une caméra pour brancher sur mon Raspberry Pi.

Depuis un certain temps, je réfléchissais à une façon de faire pour programmer un microcontrôleur et l’utiliser dans un projet sans pour autant acheter à chaque fois une carte Arduino.
En fait, on peut utiliser toute une gamme de microcontrôleurs Atmel « nus », les programmer à l’aide d’une Arduino et les utiliser tels quels!

Pour les curieux, voici tous les produits fabriqués par Atmel (ça ne s’arrête pas aux microcontrôleurs).

Bref! Voyons comment utiliser notre carte Arduino Uno pour programmer le ATTINY45. La mise en place est relativement rapide.

D’abord, un grand merci à HighLowTech pour cet article.

L’idée de base, c’est d’utiliser une Arduino (dans mon cas, Uno) qui va servir d’interface entre le PC et l’ATTINY45. Manque de bol, depuis la version 1.0 de l’IDE Arduino, les puces ATTINY ne sont plus au menu :

Pour pouvoir les utiliser, il faut aller chercher ici (pour la version 1.0 ou 1.5, selon la version de l’IDE).

Une fois le zip récupéré, il faut créer un répertoire hardware dans votre dossier de sketches (donc pour moi, C:UsersnicoDocumentsArduinohardware). Dans ce dossier hardware, copier le dossier tiny trouvé dans le zip. On y est presque.

Dans le dossier tiny, il y a un fichier nommé Prospective Boards.txt. Renommons-le en boards.txt tout court.

On relance l’IDE, et là :

Yeaaaah baby! En fait, dans le fichier boards.txt, on peut commenter toutes les puces ATTINY dont on ne veut pas se servir, ça évite de polluer cette liste.

Voilà pour la préparation logicielle 🙂

Maintenant, préparons le matériel:

tuto-programmation-des-attiny45-avec-un-arduinoJ’ai honteusement repris le schéma réalisé par Semageek.com. Allez-y, ça vaut le coup!

Voici le schéma de brochage de l’ATTINY45:

Pour le condensateur connecté au reset de l’Arduino Uno, je n’avais pas de 10µF, alors j’ai utilisé un 33µF qui va tout aussi bien.

Prêts? Alors dans l’IDE, chargeons l’exemple ArduinoISP. Nous voulons l’envoyer sur la Uno, donc type de carte > Arduino Uno.

On envoie le programme, et là… Problème de synchronisation. Hé hé hé 🙂 La blague, c’est qu’il faut enlever le condensateur pour pouvoir envoyer un programme 😉

Voilà, l’Arduino Uno est maintenant utilisable comme programmateur pour notre ATTINY!

Nous pouvons reconnecter le condensateur, et dans l’IDE, définir comme type de carte : ATTINY@1MHz, et comme programmateur : Arduino as ISP.

Chargeons un programme d’exemple, disons Fade. On va juste changer le pin de la LED, mettons le sur 0. On upload le programme. Dans les messages de l’IDE Arduino, on peut lire ceci :

En fait, ce message, selon des gens avertis, on peut l’ignorer (je ne sais pas vous, mais moi j’ai bien envie de les croire).

Voici une superbe photo pour illustrer cela!ATTINY45-2J’ai connecté la LED bleue au pin 0 (broche 5) de l’ATTINY45. Et elle clignote en mode ‘fade’ 🙂

Pour être sûr, j’ai tout déconnecté (en me servant juste de la Uno comme alimentation :

ATTINY45-1Et ça marche toujours!

Reste maintenant à trouver des applications pour cette bestiole de 4Ko de mémoire, avec ses 3 entrées analogiques et 2 sorties PWM; je suis certain que ça me viendra 🙂

Un grand merci spécial à Michael, Farnell, Semageek et HighLowTech!

Piloter un afficheur LCD avec Arduino

Pour mon baromètre / altimètre, j’avais utilisé un programme fait par je ne sais plus qui (la honte) pour afficher les informations sur un écran LCD 16×2.

Mais j’aime bien faire les choses moi-même, alors j’ai récemment repris la doc de mon afficheur et je m’y suis mis. Finalement, pas bien compliqué!

Le module en question est le ELCD 162, qui dispose d’une communication série à 19200 baud/s.

J’ai écrit une classe qui permet d’initialiser l’engin, de positionner le curseur, d’écrire du texte, de faire un reset, d’afficher ou non le curseur.

C’est assez facile à utiliser. Il faut :

  • Initialiser un port série (j’utilise le SoftwareSerial, comme ça je peux toujours afficher des traces dans l’IDE Arduino avec le port série hardware)
  • Créer un objet LCD, en lui passant notre objet SoftwareSerial
  • Envoyer la purée sur l’afficheur, wouhou!

Voici un exemple de code :

Allez, c’est cadeau !

Voici le fichier la déclaration de la classe :

Et l’implémentation :

Faites-vous plaisir 🙂

*Rhaaaa mais qu’il m’énerve, ce SyntaxHighlighter avec sa perte d’indentation! Tant pis, je laisse comme ça…

Fabriquer un thermomètre / baromètre / altimètre avec Arduino, 2ème partie

Nous avons câblé le capteur, il ne reste plus qu’à écrire le programme qui nous permettra d’obtenir la température, la pression atmosphérique et l’altitude.

La première chose à faire, c’est de pouvoir communiquer avec le module BMP085. Nous aurons besoin de 2 fonctions de lecture, pour lire respectivement des valeurs de 8 et 16 bits.

Nous sommes à présent capables de lire des valeurs du module. Cool! On va en avoir besoin pour lire les 11 coefficients de calibration, stockés dans l’EEPROM du BMP085. Ces valeurs vont nous permettre de calculer la pression absolue. Il suffit de les lire une seule fois, au début du programme. Nous allons les mettre dans la fonction setup().

 

Une fois que les valeurs de calibration sont lues, il nous faut encore deux variables pour calculer la température et la pression : ut et up. Ce sont les valeurs de température et pression non compensées, notre point de départ pour déterminer les valeurs réelles de température et pression. A chaque fois qu’on veut obtenit la température ou la pression, il faut lire au préalable ces valeurs.

La température non compensée est sur 16 bits (type int), la pression sur 32 bits (type long).

 

Dans ces deux fonctions, nous utilisons la fonction delay() pour laisser le temps au BMP085 de terminer ses traitements.

Le paramètre d’oversampling (OSS) indique au capteur de calculer une moyenne de plusieurs mesures, afin d’avoir une précision accrue. Ici, il est désactivé.

La durée d’attente est le maximum indiqué dans le datasheet du module, mais nous pourrions à la place nous baser sur le pin EOC (End Of Conversion) pour connaitre avec précision le moment où le BMP05 a terminé de lire les données. Tant qu’il travaille, le pin EOC est à l’état LOW, et dès qu’il a terminé, il passe à HIGH.

 

Nous avons toutes les variables requises pour calculer la température et la pression. Dans le datasheet, une formule assez cool nous donne la température, et une autre, beaucoup, beaucoup plus barbue, nous donne la pression.

Merci à Jimbo, chez Sparkfun, d’avoir transcrit tout ça en C, ça fait vraiment plaisir 🙂

 

Bon alors là, on est pas mal ! Encore une fonction pour calculer l’altitude à partir de la pression :

 

 

Calculons tout ça dans la boucle principale, et envoyons les résultats dans le port série:

 

 

Et voilà la sortie, au chalet, par cette soirée de février :

Ce qui est assez réaliste aujourd’hui, puisqu’on estime être à 930 m rééls. Mais selon la météo, on se retrouve dans une fourchette de 870 à 1000 et quelques…

 

Je tiens une fois encore à remercier l’article de SparkFun, dont cet article est essentiellement une traduction. Je vous invite à le lire pour plus de précisions. Sans lui, je me serais tapé la tête contre le lambris… J’y serais probablement arrivé, mais en beaucoup plus de temps 🙂

 

Fabriquer un thermomètre / baromètre / altimètre avec Arduino

Ça y est, j’ai reçu mon Arduino Uno ! Je l’ai commandée chez Lextronic, livrée en 1 semaine et demie.

Dans la foulée, comme ces salopards n’offrent pas les frais de port, même pour une commande de plus de 100€, je me suis équipé en capteurs et composants divers pour amortir lesdits frais de port.

En même temps, me direz-vous, à quoi servirait une carte Arduino sans capteurs et composants divers? A rien. Bon, on est d’accord.

Du coup, j’ai commandé un capteur qui fait thermomètre et baromètre, le BMP085.

Et l’altimètre dans tout ça ? Hé bien il existe une formule qui lie la pression atmosphérique à l’altitude, elle est présentée ici.

Comme on peut le constater, cette formule utilise une pression de référence de 1013,25 hPa au niveau de la mer. Ce qui signifie que l’altitude calculée ne pourra jamais être précise et va inexorablement varier, car nous ne vivons pas dans une bulle avec une pression régulée…

Par beau temps, l’altitude calculée sera inférieure à celle calculée par mauvais temps (anticyclone vs. dépression).

Mais bon, nous ne cherchons pas à connaitre l’altitude au mètre près! Sinon, il faut s’orienter vers un module GPS, qui fournira une information bien plus précise sur l’altitude. Maiiiis pas la température ni la pression atmosphérique. Faut faire des choix dans la vie.

La carte Arduino et le module BMP085 vont discuter selon le protocole I2C, et c’est la classe Wire fournie dans la bibliothèque d’Arduino qui va nous aider dans cette discussion.

Avant tout, je tiens à préciser que les informations proviennent essentiellement du tutorial du BMP085, chez SparkFun. Je me suis hautement appuyé sur eux pour mettre en place ce montage.

Alors en fait, le capteur possède une petite EPROM qui contient des valeurs d’étalonnage. Ces valeurs vont nous servir de référence pour calculer les valeurs réelles de pression et température.

Pour extraire ces valeurs de référence, avec la librairie Wire, on donne l’adresse de la valeur dans l’EPROM, le nombre d’octets à extraire(typiquement 1 ou 2) et hop.

 

Prêt ? on y va.

Alors tout d’abord, commençons par le montage. Il faut alimenter le capteur, mais alors attention: la tension maximale acceptée est de 3.6V ! Utilisons donc la tension régulée à 3.3V fournie par notre carte Arduino. Nous allons donc connecter la masse à la borne GND et le 3.3V à la borne VCC du capteur.

Pour la communication entre la carte Arduino et la bébête, nous allons relier respectivement la borne SDA (Serial DAta) du capteur au pin A4 de l’Arduino (oui oui, dans les entrées analogiques), et la borne SCL (Serial CLock) au pin A5.

Les pins A4 et A5 de l’Arduino sont utilisés par défaut par la classe Wire pour les données et le signal d’horloge.

Pour la faire courte, donc :

VCC -> 3.3V
GND -> masse
SDA -> A4
SCL -> A5

 

Dans le prochain article, je vais vous présenter le programme qui permet d’exploiter l’engin.