URL: https://linuxfr.org/news/taptempo-pour-arduino-uno Title: TapTempo pour Arduino Uno Authors: xulops Ysabeau đŸ§¶ et BenoĂźt Sibaud Date: 2020ćčŽ12月18æ—„T16:40:11+01:00 License: CC By-SA Tags: arduino et taptempo Score: 35 Puisqu’elle n’existe pas encore, voici une version de TapTempo pour Arduino Uno, utilisant Arduino IDE sous Linux. Arduino est une marque italienne proposant des cartes de dĂ©veloppement open-source basĂ©es sur des micro-contrĂŽleurs AVR, ARM et Cortex-A3. L’Arduino Uno est la carte la plus connue et la plus accessible : compter environ deux euros en Chine pour des copies d’Arduino, et moins de dix euros en France. Elle est Ă©quipĂ©e d’un micro-contrĂŽleur Atmel ATmega328P, dont les caractĂ©ristiques techniques sont : architecture Atmel AVR, 16MHz, 8bit, 32ko Flash, 1ko EEPROM, 2ko de SRAM. On est donc loin des PC avec CPU en GHz et RAM en Go. ---- [Le projet TapTempo](https://linuxfr.org/wiki/taptempo) [TapTempo en Verilog](https://linuxfr.org/news/taptempo-en-verilog) [Portage de TapTempo en VHDL](https://linuxfr.org/news/portage-de-taptempo-en-vhdl) [Page wikipĂ©dia Arduino](https://fr.wikipedia.org/wiki/Arduino) [Site officiel Arduino](https://www.arduino.cc/) [Installation d’Arduino IDE sous Linux](https://www.arduino.cc/en/guide/linux) [Site sur les IoT Ă  base d’Arduino, ESP8266, ESP32 et leurs capteurs/accessoires](https://randomnerdtutorials.com/) ---- # Les avantages de la carte Les avantages de cette carte sont : - 14 entrĂ©es/sorties numĂ©riques, dont 6 PWM ; - 6 entrĂ©es analogiques ; - port sĂ©rie, bus I2C et SPI ; - consommation Ă©lectrique autour de 50mA sous 5V ; - un nombre phĂ©nomĂ©nal de capteurs et accessoires en tous genres et pas chers (shield moteur, capteurs ultrason, tempĂ©rature, pression, humiditĂ©, vibration...) ; - un port USB pour transfĂ©rer le programme dans le micro-contrĂŽleur, et retourner des infos au PC via le port sĂ©rie de la carte ; - un IDE (Arduino IDE sous GPL 2.0) qui fonctionne sous Linux et prend en charge toute la partie transfert du code. Il fait Ă©galement office de moniteur sĂ©rie, et plotter/grapheur bien pratique pour suivre l’évolution de valeurs de capteurs dans le temps. C’est donc une carte simple et idĂ©ale pour apprendre Ă  faire des robots, automatiser sa serre de jardin ou son aquarium, faire une serrure Ă  carte sans contact, etc. Pour l’exemple TapTempo, j’utilise une « Funduino UNO », copie chinoise Ă  bas prix, un Ă©cran LCD de deux lignes de 16 caractĂšres avec interface I2C, et un bouton poussoir cĂąblĂ© entre l’entrĂ©e numĂ©rique n°2 et la masse. ![Copie chinoise d’Arduino Uno](https://xulops.net/image/autre/arduino_uno_compatible.jpg) Comme je n’aime pas les cĂąbles Dupont mĂąles, j’utilise ici une carte supplĂ©mentaire qui vient se poser sur l’Arduino Uno, qui ne fait que rendre plus accessible les pins de connexion (un sensor shield). C’est facultatif et ça marche trĂšs bien sans. Le cĂąblage est d’ailleurs simple Ă  rĂ©aliser. ![CĂąblage du TapTempo sur Arduino Uno](https://xulops.net/image/autre/schema_cablage.png) # Le programme Le programme est Ă©crit dans Arduino IDE qui permet de faire du C et C++. On peut utiliser d’autres IDE et d’autres langages (LUA, microPython). Voici le TapTempo basique : ```c #include #include LiquidCrystal_I2C lcd(0x27,16,2); // parametres de l'ecran Ă  cristaux liquides // quelques constantes et variables globales const byte TAP_PIN = 2; // bouton poussoir connectĂ© sur l'entrĂ©e 2 bool bouton_status = true; unsigned long t[6]; // stocke 6 taps pour avoir 5 intervalles byte i; byte n; unsigned long tempo; void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("TapTempo Arduino"); lcd.setCursor(0,1); lcd.print("Tempo : ...."); pinMode(TAP_PIN, INPUT_PULLUP); // on s'Ă©vite une rĂ©sistance for (i = 0; i < 6; i++) t[i] = 0; } void loop() { if (! bouton_status) { bouton_status = digitalRead(TAP_PIN); } else { bouton_status = digitalRead(TAP_PIN); if (! bouton_status) { // ok, un appui est detectĂ© for (i = 0; i < 5; i++) t[i] = t[i + 1]; t[5] = millis(); if (t[5] - t[4] < 3000) { // calcul de la moyenne des 5 derniers taps tempo = 0; n = 0; for (i = 1; i < 6; i++) { if (t[i - 1]> 0) { tempo += t[i] - t[i - 1]; n++; } } tempo = 60000 / (tempo / n); // affichage du resultat lcd.setCursor(8, 1); lcd.print(tempo); lcd.print(" "); } else { // premier tap, on attend le suivant } } else { if (millis() - t[5]> 3000) { // rien depuis 3s (tempo < 20), on reinitialise lcd.setCursor(8, 1); lcd.print("...."); for (i = 0; i < 6; i++) t[i] = 0; } } } delay(10); // pour ne pas se taper le rebond du bouton } ``` # Les fonctions setup et loop Arduino IDE impose la prĂ©sence de deux fonctions : _setup_ et _loop_. La fonction _setup_ ne s’exĂ©cute qu’une seule fois, lorsque l’Arduino Uno est mis sous tension ou aprĂšs un _reset_ (le tranfert d’un nouveau code dans le micro-contrĂŽleur est toujours automatiquement suivi d’un _reset_). Elle est assez facile Ă  comprendre, elle initialise l’écran (facultatif), les entrĂ©es/sorties utilisĂ©es (ici uniquement le pin 2 pour le bouton poussoir), et le tableau des taps. On peut juste s’appesantir un peu sur le INPUT_PULLUP qui indique au micro-contrĂŽleur qu’il doit activer la rĂ©sistance interne de pullup de cette entrĂ©e. Si cette entrĂ©e est dĂ©clarĂ©e en INPUT seulement, il faut alors ajouter une rĂ©sistance (10kOhm par exemple) entre l’entrĂ©e 2 et le 5V, afin de ramener l’entrĂ©e proche de 5 volts (HIGH, true) lorsque le bouton n’est pas pressĂ©. Sinon l’entrĂ©e ne serait connectĂ©e Ă  rien, donc avec un potentiel Ă©lectrique indĂ©terminĂ©. Lorque le bouton est pressĂ©, l’entrĂ©e est en connexion directe avec la masse, donc quasiment Ă  0V (LOW, false). La fonction _loop_, comme son nom l’indique, s’exĂ©cute en boucle. On commence par regarder si le bouton Ă©tait pressĂ© Ă  la fin de la boucle prĂ©cĂ©dente (bouton_status Ă  false), si oui, on lit l’état du bouton jusqu’à relĂąchement. Sinon, le bouton Ă©tait relĂąchĂ©, on peut donc regarder si maintenant il est pressĂ© ou pas. Suit le classique calcul du tempo basĂ© sur les 5 derniĂšres mesures et l’affichage. L’affichage et le tableau se rĂ©initialisent si pas de tap pendant plus de 3 secondes. La fonction _loop_ se termine par un mystĂ©rieux dĂ©lai de 10 ms, dont l’unique but est de ne pas capter le rebond du bouton. En effet, un bouton poussoir ne passe pas toujours franchement d’un Ă©tat ouvert Ă  l’état fermĂ©, il rebondit, pouvant donner des sĂ©ries d’ouvertures-fermetures perturbantes pendant quelques millisecondes. Sur ce bouton, la transition est normale (avec lĂ©gĂšre surtension pendant 2ms) au moins 9 fois sur 10, mais des rebonds sont prĂ©sents sur environ un dixiĂšme des taps. Ces rebonds ne dĂ©passent toutefois jamais les 3ms. ![Rebonds du bouton](https://xulops.net/image/autre/rebonds.jpg) Avec un dĂ©lai de 10 ms, il n’y a donc pas de risques que les rebonds viennent perturber le programme. Patienter un centiĂšme de seconde ne gĂȘne pas Ă  l’usage, j’ai mesurĂ© avec prĂ©cision (Ă  l’unitĂ© prĂšs, je ne pense pas que descendre sous la virgule soit d’un grand intĂ©rĂȘt musical) entre 20 BPM et 240 BPM, l’erreur la plus grande vient de mon doigt qui appuie sur le bouton (et du cerveau qui commande le doigt), bref je n’arrive pas Ă  suivre, faudrait faire un robot (Ă  base d’Arduino Uno ?) qui appuie sur le bouton Ă  ma place. ![Montage en fonctionnement](https://xulops.net/image/autre/taptempo_montage.jpg) # Usage mĂ©moire En incluant les bibliothĂšques I2C (wire.h) et LiquidCrystal pour l’écran LCD, la compilation donne : - 4092 octets de FLASH utilisĂ©s sur les 32ko disponibles ; - 323 octets de SRAM utilisĂ©s sur les 2ko disponibles. En n’utilisant pas l’écran LCD et en envoyant le tempo mesurĂ© sur le port sĂ©rie : - 2454 octets de FLASH utilisĂ©s ; - 218 octets de SRAM utilisĂ©s. Pour comparaison, pour un programme vide (juste les deux fonctions sans autre ligne de code), la compilation donne respectivement 444 octets de FLASH et 9 octets de SRAM utilisĂ©s. Ça peut sembler bizarre, mais le compilateur ajoute toujours un appel pour surveiller les Ă©vĂ©nements sur le port sĂ©rie. Pas de drame, tout cela reste lĂ©ger. # Avec d’autres micro-contrĂŽleurs Les ESP8266 et ESP32, qui sont des micro-contrĂŽleurs wifi de la sociĂ©tĂ© Expressif, ont aussi la cote en ce moment, principalement pour les remontĂ©es de mesures Ă  distance, alertes par courriel... Pour ces micro-contrĂŽleurs bien mieux Ă©quipĂ©s (160 MHz, 4 Mo RAM) qu’un Arduino Uno, le programme serait le mĂȘme, Arduino IDE se chargeant de compiler et transfĂ©rer le programme au micro-contrĂŽleur. Il faudra penser cependant Ă  ajouter une rĂ©sistance de pullup suivant les modĂšles, tous les micro-contrĂŽleurs ne sont pas pourvus de ces rĂ©sistances internes. L’ESP32 est pourvu d’entrĂ©es tactiles (capacitive touch sensor), il serait intĂ©ressant de remplacer le bouton poussoir par une simple plaque mĂ©tallique et regarder s’il est possible de s’affranchir des problĂšmes de rebonds.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /