1. Introduction

Pour mieux comprendre la programmation, le projet sera basé sur la mise en place d’actions plus ou moins complexes sur un microcontrôleur Arduino muni d’un LCD. En effet, il existe des milliers de choses différentes que l’on peut faire avec Arduino, avec à peine quelques lignes de code. Ceci inclut par exemple deux pixels se chassant, des motifs traversant l’écran, écrire du texte qui passe sur l’écran, etc. Le but est de faire tous ces différents éléments pour comprendre ce que veulent dire les lignes de code, les relations qu’il y a entre elles et leur enchaînement logique, pour ensuite pouvoir (re)créer quelque chose d’original à partir de ces connaissances acquises, comme par exemple une suite d’énigmes, dont la réponse est donnée lors d’un clic, ou encore faire une horloge digitale. Qui ne s'est jamais demandé ce qu'il se passait dans son réveil? Nous verrons que ce n'est pas si dur que ça.

2. Matériel et méthodes

Le matériel utilisé consiste en un simple kit Arduino Redboard, possédant un LCD.

Voici le montage pour qu'un LCD fonctionne, avec lequel nous pouvons déjà faire une multitude d'actions:

Capture_d_ecran_2014-05-12_a_13.13.49.png

2.1 Texte traversant l'écran

Commençons avec du texte qui traverse l'écran. Ceci se fait en deux étapes. La première est de faire apparaître du texte, qui s'introduit avec "print". Cette commande se trouve dans le "void setup", car ce n'est pas une action répétée. Au contraire, pour que le texte aille de droite à gauche (ou l'inverse), nous devons l'écrire dans le "void loop", avec la commande lcd.scrollLeft.

2.2 Caractères spéciaux

Ecrire du texte peut paraître assez simple, car le programme arduino reconnaît déjà les lettres et a le code correspondant. Pour les caractères spéciaux, par contre, il faut lui décrire pixel par pixel le caractère voulu, au moyen de la commande createChar. Si nous prenons comme exemple un smiley à trois yeux, nous devrions le décrire de la façon suivante:

byte(smiley[0]){
B10101,
B10101,
B00000,
B10001,
B01110,
B00000,
};

Nous voyons ici qu'un caractère du LCD est de 5x6 pixels, où chaque 1 veut dire "allumé" et chaque 0 veut dire "éteint". Il suffit ensuite seulement d'invoquer le caractère dans le "void setup" avec

print.byte[0].

Maintenant que nous connaissons ceci, nous pouvons nous amuser à créer une multitude de caractère, puis les combiner pour former des effets divers, comme l'effet serpentin.

2.3 Horloge digitale

Nous pouvons à présent nous amuser, en tout combinant pour faire une horloge digitale. Le code qui vient avec le code de base du LCD, contient un compteur. Nous allons utiliser ce compteur et le tordre de façon à ce qu'il marque les secondes (bien que lui compte en millisecondes), les minutes et les heures, en recommençant toutes les 24 heures. Avant de commencer il faut définir les variables "millisecondes", "secondes", "minutes" et "heures". Aussi, au début de la boucle, il faut préciser qu'il s'agit d'un "unsigned long", pour qu'il compte jusque'à environ quelque milliards de millisecondes. Ceci devrait permettre une autonomie d'autour de 50 jours.

Donc, pour que l'Arduino ne compte pas à l'infini, nous utilisons la commande "while", qui n'applique pas l'action décrite tant que la condition n'est pas vraie. Dans le cas des minutes, le programme n'écrira pas une minute tant qu'il n'y a pas 60 secondes. Ceci va de même pour les heures, les secondes ainsi que pour les millisecondes. Il suffit ensuite d'invoquer la commande lcd.print pour que le LCD montre chaque unité. Nous excluons les millisecondes, car même si l'Arduino compte en millisecondes, ces valeurs nous importent peu. Entre ces valeurs, nous écrivons (avec "print", évidemment), les unités.

Nous pouvons mentionner qu'il s'agit de l'heure (ici avec la précision que c'est GMT+1), ainsi que mettre un smiley à trois yeux, mais ça ne sont que des détails. Une chose, par contre, qui pourrait s'avérer utile est le fait de pouvoir régler l'horloge, au moyen de boutons. Nous allons nous limiter au réglage des minutes et des heures, en raison du nombre limité de boutons. Nous utilisons un code très basique, où on lui dit que si un bouton est pressé, il doit faire une action. Cette action est qu'il doit rajouter une minute ou une heure, en fonction du bouton pressé. Il ne faut toutefois pas oublier de mettre un délai ("delay(millisecondes)"), car il compte extrêmement vite, sans quoi il avancerait de 50 secondes si nous pressons pendant une seconde. Aussi, nous pouvons mettre un délai plus grand pour les heures que pour les secondes, ayant 5 fois plus de secondes que d'heures.

Alarme

Maintenant que nous avons mis tout ceci en place, nous pouvons commencer à rajouter des détails, comme l'alarme. Dans le cas présent, nous utiliserons une LED, qui simulera le bruit d'alarme traditionnel. Pour ce faire, il faut rajouter une condition. Lorsque la valeur des heures et la valeur des minutes égalisent l'heure voulue, allumer la LED. Pour poser une condition, il y a une multitude d'introductions possibles, avec la complication que l'alarme dépend de deux variables différentes. Il faut donc définir comment l'alarme doit se comporter. Dans notre cas, le code a été opté pour que l'alarme (la LED) reste allumée pendant une minute. Par conséquent, nous faisons l'utilisation du "if" suivi de la condition que si la valeur des heures et (introduit avec &&, pour qu'il fasse l'action si et seulement si les deux conditions sont remplies) des minutes est celles voulues. Nous avons donc une horloge muni d'une alarme! Elle ne s'éteint qu'après une minute inconditionnellement, mais de nouveau, plus de boutons pour l'éteindre.

3. Résultats

Les résultats ont étés variés, mais à la fin, une horloge digitale à l'apparence traditionnelle a été obtenue.

Voici le circuit muni des boutons et de la LED:

Capture_d_ecran_2014-05-20_a_10.46.38.png

Précision: la carte montrée est un Arduino Uno, alors qu'en réalité c'est un Arduino RedBoard. Ce dernier est assez récent, alors le programme Fritzing, avec lequel ce schéma à été réalisé, ne l'a pas encore mis comme option.

Avec l'addition des boutons régleurs et de l'alarme, nous obtenons un circuit très plein de câbles, ce qui peut paraître désordonné, mais ça a un côté fait-maison qui fait que ce soit beau:

Photo_du_20.05.14_a_11.38.jpg

En ce qui concerne la précision de l'horloge, comme elle ne comporte pas de compteur externe (ayant un cristal en quartz), elle n'est pas extrêmement précise; elle perd environ deux secondes toutes les heures.

4. Discussion

4.1 Résultats

Les résultats ont été en général satisfaisants. Le résultat du projet, à savoir un écran qui indique l'heure, peut paraître simple, mais il est quand même bon de savoir qu'il suffit de quelques lignes de code à peine pour faire un objet que nous utilisons tous les jours.

4.2 Problèmes rencontrés

Pendant la réalisation de ce projet, le plus grand problème était l'écriture du code. En effet, nous pouvons assez facilement trouver le code sur Internet. Le défi était donc de l'écrire soi-même, faire tous les enchaînements logiques à partir des commandes de base. La seule partie venant d'Internet est le calcul de différence de millisecondes. Une difficulté supplémentaire était que l'horloge digitale ne comporte pas de compteur externe. Il a donc fallu se baser sur le compteur du microcontrôleur.

Dans la catégorie "syntaxe", il a plusieurs fois fallu réécrire le code en raison d'absences de définitions de variables, des variables en trop, des calculs illogiques (comme par exemple avec les secondes, remettre à zéro au lieu de faire - 60 secondes), etc.

Pour la précision, la solution serait d'insérer dans le code, dans la partie "hours" une addition de deux secondes, pour que chaque heure, il ajoute les secondes perdues. Cela pourrait paraître bizarre si à chaque heure, l'horloge fait un saut de deux secondes, mais ça ne devrait pas déranger les personnes qui aiment la précision. C'est autre chose pour les personnes qui n'aiment pas les "bugs". Pour satisfaire ces personnes-là, il faudrait faire en sorte que le compteur compte légèrement plus vite.

Dans la partie matérielle, il y a eu quelques fois des problèmes d'ordre, avec la masse de fils allant dans toutes les directions (comme vu sur la photo). En effet, une prochaine étape serait de trouver une manière d'optimiser les connections pour avoir un résultat plus "propre".

4.3 Apprentissage réalisés

Ce projet a permis l'apprentissage de petites commandes indispensables qui seules ne font pas beaucoup, mais qui en les combinant font des choses incroyables. Il a aussi permis d'apprendre que ces commandes requièrent un ordre spécial, une syntaxe spéciale, mais qui, après que nous les ayions utilisés quelques fois, sont logiques.

5. Conclusion

La morale de l'histoire (ou du projet) est que nous pouvons nous amuser énormément avec une carte Arduino et un LCD. Dans le cas de l'horloge, nous pouvons ajouter des choses beaucoup plus drôles et cool. Pour éteindre l'alarme, nous pourrions utiliser le senseur de flexibilité, ou encore le combiner avec le projet Laze-Light, pour l'éteindre au moyen d'un pistolet laser, etc. Pour ce qui est montré sur l'écran, nous pourrions encore mettre le jour, la date, peut-être même la météo. En avant pour plus de complications!