Bonjour. Le C traditionnel affiche hello world sur l'écran. On s'intéresse plus à interagir avec le monde réel et on a affiché, on a fait clignoter des LED. Mais ça peut être aussi intéressant de transmettre des textes et des paramètres sur l'écran et c'est ce qu'on va voir. On s'intéressera aussi aux nombres aléatoires. Notre microcontrôleur est en communication avec le PC via la ligne USB qui nous sert à charger les programmes, et maintenant, ce qu'on veut faire c'est que le microcontrôleur envoie de l'information sur l'écran, ou que des caractères tapés au clavier puissent arriver au mircrocontrôleur. Alors, il faut établir ce lien au niveau du setup, et ça c'est l'instruction serial begin dans laquelle il faut définir la vitesse de communication, c'est traditionnellement de 1600 bits par seconde. Une fois cette communication établie et qu'on a sélectionné au niveau de, du PC, l'affichage de cette information, et bien, on peut utiliser le serial print avec des paramètres, ou serial println, il y aura un retour, un passage à la ligne automatique. Alors, au niveau d'Arduino, euh, c'est extrêmement pauvre, les possibilités d'affichage puisque ça va plutôt me dépanner, alors que quand on fait du C sur écran, c'est vraiment une des fonctions de base avec toutes sortes de petits gadgets pour exprimer. Alors, si je prends l'écran, maintenant, de notre Arduino, vous avez peut-être remarqué, vous le savez déjà , qu'il y a une possibilité de cliquer serial monitor quand le programme s'exécute, et on va avoir, affichés, les résultats. Le programme de test que nous commandons maintenant, vous avez serial begin de 1600 dans le setup, et ensuite on a déclaré une variable qui valait 45. On l'imprime, un espace, on l'imprime en décimal, c'est la même chose. Par défaut, les variables sont décimales. On peut l'imprimer en hexadécimal. On peut imprimer un texte entre guillemets, et puis, on peut ici, euh, imprimer des, des nombres successifs pour voir comment ça se présente. Alors, 45, 45, deux D, la valeur exacte, compte, et puis on remarque, ici, zéro, un, deux, trois, 15, que les zéros non significatifs sont éliminés. Donc, le programme se rapproche de nos habitudes de lecture des nombres. Euh, un exemple typique, vous avez un capteur de lumière, vous devez commander un moteur. Toutes les dix millisecondes, vous faites un calcul qui décide de la vitesse du moteur par rapport à l'intensité lumineuse. Ces calculs, cette formule, c'est bien de pouvoir la vérifier et en fonction des conditions lumineuses, en étant, euh, immobile. Donc, on va, toutes les 10 millisecondes, on va faire les calculs, mais on ne va pas afficher toutes les 10 millisecondes. Ça remplirait l'écran, euh, beaucoup trop vite. Donc, on va décider que toutes les 0,5 secondes, toutes les 50 mesures, on va afficher la valeur de la lumière et puis la vitesse du moteur, le pwm. Donc, toutes les 10 millisecondes, on passe à travers ce programme, mais avec un petit comptage de 50, ce n'est que toutes les 50 fois qu'on va afficher le capteur de lumière. C'est bien de mettre un signe explicif. Je me méfie de ce, euh, graphe qui probablement ne passera pas. La valeur de la lumière, la valeur du moteur, la valeur du PWM, donc on aura ceci sur une ligne, vous avez le ln, ici, euh, toutes les 0.5 secondes. Alors, ceci va très bien pour les tests, mais d'abord, si elle recommence à bouger, on peut pas le suivre avec un, avec un PC portable, c'est pas confortable. Et l'autre élément, c'est que transmettre cette information, À 9600 bits par seconde, ça fait une milliseconde. Donc, ça fait de l'ordre de 50, euh, millisecondes, et en plus de ça, ça va utiliser 2000 bytes en mémoire. Donc, on se préoccupe d'optimiser les applications, et on ne pourra pas mettre en service, même via, euh, des communications radio, ce genre d'affichage pendant l'exécution. On peut s'intéresser aussi à aller dans l'autre sens, c'est-à -dire à taper en caractères sur le clavier, puis à le récupérer dans votre programme. Mais là , c'est un petit peu plus compliqué, parce que, euh, votre programme peut naturellement attendre sur une touche du clavier à ne rien faire d'autre pendant ce temps-là , mais c'est pas ça qui nous intéresse. Ce qu'on voudrait, c'est pouvoir taper sur le clavier quand on veut, et le programme, quand il a besoin de l'information, vient la chercher. Et ce qui est programmé, c'est un tampon. Les caractères qu'on envoie depuis la clavier viennent, euh, se stocker dans une mémoire tampon. Vous avez un compteur. Alors, le premier caractère arrive, ici, et puis, on compte que il y a un caractère, ici, dans une variable qui s'appelle serial available. Et si vous avez un deuxième caractère, et bien, ça sera incrémenté. Donc, votre programme va surveiller ce, cette variable serial available, et si elle est différente de zéro, lire le caracttère, donc, vider le tampon. Le serial available passera à zéro, et maintenant, si votre programme, euh, n'est pas du tout attentif à ce qui arrive, et bien, euh, ça peut se remplir. On peut lire les caractères les uns après les autres, euh, dans votre boucle de lecture. Donc, au niveau d'une petite, d'un petit programme de test, on attend un caractère, if serial available supérieur à zéro, ça veut dire que il y a un caractère en attente. On transfère dans la variable recu, et puis, on peut s'amuser à faire un nom, un petit texte, euh, disant j'ai tapé, la valeur recu, et elle va apparaître en décimal. Je peux dire, et bien, sa valeur en hexadécimal, et bien, la voilà . Et puis, on va revenir pour imprimer le caractère suivant. Alors, on a tapé un un, on a rentré ce programme. Il faut avertir que cette lettre a été tapée, et puis on va avoir le texte j'ai tapé, 65 qui est le code ascii du A en décimal, ou zéro x 41 qui est le code ascii en hexadécimal de cette lettre A. Donc, vous voyez que vous tapez une lettre, mais vous récupérez le code de cette lettre. Ça peut être intéressant de récupérer un nombre, et pour cela, il y a une fonction qui est mal documentée, peu connue, qui est serial parselnt. Alors parsing, c'est faire une analyse syntaxique. Donc, ce programme va reconnaître plusieurs caractères que vous tapez, il va lire les chiffres que vous tapez. Vous tapez trois, vous tapez deux, vous tapez sept, chaque fois le programme doit, euh, mettre ces chiffres ensemble et calculer, dans le fond, une valeur décimale qui va calculer en binaire, naturellement, euh, et puis préparer cette variable qui sera transmise plus loin, au moment où vous tapez le carriage return. Donc, euh, le type, alors, si on, si on veut utiliser cette fonction, il faut d'abord, dans le programme, se préoccuper à ce qu'un premier caractère arrive. Si ce premier caractère arrive, alors, la fonction serial parse va atteindre tous les caractères jusqu'au carriage return, jusqu'à la touche enter. Donc, on est dans un état bloqué, hein, bloquant. Rien d'autre ne s'exécute au niveau de votre microcontrôleur, sauf d'attendre que vous tapiez le carriage return, et si vous le tapez pas, et bien, ça ne progressera pas. Alors, une fois que vous avez tapé le, le retour de chariot, la touche enter, vous pourrez continuer dans le programme, afficher la valeur qui apparaîtra en décimal, l'afficher en hexadécimal. Donc, vous voyez, euh, le programme doit faire quelque chose de compliqué pour fabriquer un nombre binaire à partir de ce que vous avez tapé. Ensuite, ici, il doit le reconvertir en décimal pour l'afficher, 327. Et puis, ici, il va le reprendre en binaire, et puis, le convertir pour l'afficher, cette fois, en hexadécimal, par tranches de quatre bits. Alors, voilà pour cette possibilité d'affichage. On peut le, profiter de l'utiliser maintenant, pour comprendre les nombres aléatoires. Alors, générer un nombre au hasard est quelque chose qui n'est pas évident du point de vue programmation. Il y a des algorithmes qui génèrent des nombres, euh, successifs, mais un algorithme va toujours calculer de la même façon. Donc, c'est comme un robot qui jouerait au dés en partant d'un dé qui a toujours la même position et dans les mêmes conditions physiques. Et bien, chaque fois qu'il lance le dé avec le même programme, euh, le dé va donner toujours la même valeur. Alors, au niveau d'Arduino, il y a une fonction qui s'appelle random, type long, qui est très facile à utiliser, mais elle utilise de nouveau, quelque, quelque 1000 bytes. Vous pouvez écrire random, valeur maximum. Ça vous va, vous donner un nombre entre zéro, et puis max moins un. C'est des nombres entiers, bien sûr, hein. Et puis, vous avez random entre deux valeurs min et max, min et max moins un. Et comme petit exemple, pour être sûrs qu'on a bien compris, et bien, on fait un programme for. On va afficher 20 nombres successifs sur l'écran, i de zéro à 20. On imprime la valeur aléatoire de zéro à trois. On met un espace entre deux, et voilà ce que ça donne, trois, un, un, et cetera. Euh, il faudrait faire une petite statistique pour vérifier que l'aléatoire est, est valable. Et on affiche un retour de chariot pour préparer un avenir, et on attend avec le while 1, on ne fait plus rien. Alors maintenant, si je presse sur la touche reset, je vais afficher une deuxième ligne et j'obtiens exactement la même séquence aléatoire puisque, euh, le programme s'exécutait à partir de zéro. Il a appelé la routine qui est toujours la même, qui part des paramètres par défaut. Donc, ça peut être assez gênant, dans certaines applications, que le programme génère toujours les mêmes séquences aléatoires. Alors, c'est pour ça qu'il y a une fonction supplémentaire qui s'appelle random seed, qui va en fait modifier ces conditions initiales. Mais évidemment, maintenant, vous avez un paramètre, ici. Si vous mettez toujours le même, et bien, vous générerez toujours la même séquence aléatoire. Donc ce qu'il faut, c'est arriver à trouver quelque part un paramètre qui n'aura pas la même valeur, et, euh, la solution, euh, utilisée, c'est de lire une entrée analogique et d'utiliser le fait que ces entrées fluctuent, et ça va, euh, changer un tout petit peu, dans le fond, cette, cette graine utilisée pour démarrer les valeurs aléatoires. On pourrait aussi trouver un compteur, mais il faut que ce compteur, effectivement, euh, change d'une exécution à l'autre. Alors, en réutilisant ce même programme avec random seed, et bien, vous voyez que chaque fois, la séquence qui a démarré, euh, n'était pas la, n'est pas la même, et c'est l'intérêt de ce random seed. Alors, un petit exemple avec un dé électronique, hein. Euh, vous pouvez très facilement le programmer en disant, et bien, voilà , si le poussoir est actif, on allume le dé avec la valeur aléatoire de zéro à cinq. Cette, cette procédure allumeDe, euh, on écrit quelque chose de très similaire en affichant les chiffres de ce segment de zéro à 10. Donc, il suffit de ressortir le même genre de table. Et puis, on attend une seconde pour relâcher, relâcher la touche. Donc là , on, on fait vraiment le programme le plus simple possible, on pourrait attendre que la touche soit relâchée pour se préparer à afficher une autre valeur. Donc, si on maintient pressé, on va générer, toutes les secondes, un nouveau nombre aléatoire. Alors, une variante que l'on utilise dans ce dé, pour lequel vous avez un tout petit processeur, ici, donc, on va pas charger une librairie de nombres aléatoires qui remplit la moitié de la mémoire, c'est de dire, je compte à toute vitesse. Dans une boucle, euh, je compte zéro, un, deux, trois, quatre, cinq, et cetera, tant que je n'appuie pas sur le poussoir. Et au moment où j'appuie sur le poussoir, je transmets la valeur, euh, à la routine allumeDe. Et puis, je peux attendre un certain temps pour que l'on ait relâché le poussoir. Donc while, ici, ça vous coûte, euh, une dizaine des bytes en mémoire. Ici, ça vous en coûte quelque un millier, et c'est clair que quand on programme en temps réel, on se contente parfaitement de solutions aléatoires comme celle-là , où l'aléatoire est généré par l'être humain qui n'est pas capable de, de répéter des durées de pression, toujours les mêmes. Donc, on est certain d'avoir, ici, une distribution aléatoire tout à fait correcte. Voilà , on vient de voir que le moniteur série est très utile pour afficher des variables et obtenir aussi des variables pour changer les paramètres d'exécution. On a également vu que les nombres aléatoires peuvent se générer de différentes façons, et ce qui compte c'est de bien comprendre l'application et de choisir les bonnes facilités de programmation.