Table des matières:

Méthodes de synchronisation Arduino avec Millis (): 4 étapes
Méthodes de synchronisation Arduino avec Millis (): 4 étapes

Vidéo: Méthodes de synchronisation Arduino avec Millis (): 4 étapes

Vidéo: Méthodes de synchronisation Arduino avec Millis (): 4 étapes
Vidéo: VL53L1X Лазерный дистанционный датчик времени полета 400 см 2024, Juillet
Anonim
Méthodes de synchronisation Arduino avec Millis()
Méthodes de synchronisation Arduino avec Millis()

Dans cet article, nous introduisons le millis(); fonction et l'utiliser pour créer divers exemples de synchronisation.

Millis ? Rien à voir avec les lip-syncers… j'espère que vous avez reconnu milli comme étant le préfixe numérique pour les millièmes; c'est multiplier une unité de mesure par 0,001 (ou dix à la puissance moins 3).

Fait intéressant, nos systèmes Arduino compteront le nombre de millisecondes (milliers de secondes) à partir du début d'une esquisse en cours d'exécution jusqu'à ce que le nombre atteigne le nombre maximal pouvant être stocké dans le type de variable long non signé (un entier de 32 bits [quatre octets] – qui va de zéro à (2^32)-1.(2^32)-1, ou 4294967295 millisecondes converties en 49,71027 jours impairs.

Le compteur se réinitialise lorsque l'Arduino est réinitialisé, il atteint la valeur maximale ou une nouvelle esquisse est téléchargée. Pour obtenir la valeur du compteur à un moment donné, appelez simplement la fonction - par exemple:

start=millis();

Où start est une variable longue non signée. Voici un exemple très simple pour vous montrer millis() en action:

/* démonstration millis() */

début long non signé, terminé, écoulé;

void setup()

{ Serial.begin(9600); }

boucle vide()

{ Serial.println("Démarrer…"); start=millis(); retard(1000); fini=millis(); Serial.println("Terminé"); elapsed=finished-start; Serial.print(elapsed); Serial.println(" millisecondes écoulées "); Serial.println(); retard (500); }

L'esquisse stocke le nombre de millis actuel au début, puis attend une seconde, puis stocke à nouveau la valeur des millis dans terminé. Enfin, il calcule le temps écoulé du délai. Dans le vidage d'écran suivant du moniteur série, vous pouvez voir que la durée n'était pas toujours exactement de 1000 millisecondes, comme le montre l'image.

Étape 1:

Image
Image

Pour faire simple, la fonction millis utilise un compteur interne au sein du microcontrôleur ATmega au cœur de votre Arduino. Ce compteur incrémente chaque cycle d'horloge - ce qui se produit (en Arduino standard et compatibles) à une vitesse d'horloge de 16 Mhz. Cette vitesse est contrôlée par le cristal de la carte Arduino (le truc en argent avec T16.000 estampé dessus).

Étape 2:

Image
Image

La précision du cristal peut varier en fonction de la température extérieure et de la tolérance du cristal lui-même. Cela affectera à son tour la précision de votre résultat en millièmes. Une expérience anecdotique a rapporté que la dérive de la précision du chronométrage peut être d'environ trois ou quatre secondes par période de vingt-quatre heures.

Si vous utilisez une carte ou votre propre version qui utilise un résonateur en céramique au lieu d'un cristal, notez qu'elles ne sont pas aussi précises et introduiront la possibilité de niveaux de dérive plus élevés. Si vous avez besoin d'un niveau de précision de synchronisation beaucoup plus élevé, envisagez des circuits intégrés de minuterie spécifiques tels que le Maxim DS3231.

Maintenant, nous pouvons utiliser les millis pour diverses fonctions de synchronisation. Comme démontré dans l'exemple de croquis précédent, nous pouvons calculer le temps écoulé. Pour faire avancer cette idée, faisons un simple chronomètre. Cela peut être aussi simple ou aussi complexe que nécessaire, mais dans ce cas, nous allons nous orienter vers le simple.

Du point de vue matériel, nous aurons deux boutons – Start et Stop – avec les résistances pull-down de 10k ohms connectées aux broches numériques 2 et 3 respectivement. Lorsque l'utilisateur appuie sur Démarrer, le croquis note la valeur en millis – puis après avoir appuyé sur Arrêt, le croquis note à nouveau la valeur en millis, calcule et affiche le temps écoulé. L'utilisateur peut ensuite appuyer sur Démarrer pour répéter le processus, ou arrêter pour les données mises à jour. Voici le croquis:

/* Chronomètre super basique utilisant millis(); */

début long non signé, terminé, écoulé;

void setup()

{ Serial.begin(9600); pinMode(2, INPUT); // bouton de démarrage pinMode(3, INPUT); // bouton d'arrêt Serial.println("Appuyez sur 1 pour démarrer/réinitialiser, 2 pour le temps écoulé"); }

void displayResult()

{ float h, m, s, ms; non signé depuis longtemps; elapsed=finished-start; h=int(elapsed/3600000); dépassé = écoulé %3600000; m=int(plus de/60000); plus = plus de %60000; s=int(sur/1000); ms=plus de %1000; Serial.print("Temps brut écoulé: "); Serial.println(elapsed); Serial.print("Temps écoulé: "); Serial.print(h, 0); Serial.print("h "); Serial.print(m, 0); Serial.print("m "); Serial.print(s, 0); Serial.print("s "); Serial.print(ms, 0); Serial.println("ms"); Serial.println(); }

boucle vide()

{ if (digitalRead(2)==HIGH) { start=millis(); retard (200); // pour anti-rebond Serial.println("Démarré…"); } if (digitalRead(3)==HIGH) { finish=millis(); retard (200); // pour anti-rebond displayResult(); } }

Les appels à delay() sont utilisés pour éviter les rebonds – ils sont facultatifs et leur utilisation dépendra de votre matériel. L'image est un exemple de la sortie du moniteur série du croquis - le chronomètre a démarré, puis le bouton deux a été enfoncé six fois au cours des périodes.

Étape 3: Compteur de vitesse…

Image
Image

Si vous aviez un capteur au début et à la fin d'une distance fixe, la vitesse pourrait être calculée: vitesse = distance ÷ temps.

Vous pouvez également créer un compteur de vitesse pour une forme de mouvement à roues, par exemple un vélo. À l'heure actuelle, nous n'avons pas de vélo pour nous amuser, mais nous pouvons décrire le processus pour le faire – c'est assez simple. (Avertissement - faites-le à vos risques et périls, etc.)

Tout d'abord, passons en revue les mathématiques nécessaires. Vous aurez besoin de connaître la circonférence de la roue. Matériel - vous aurez besoin d'un capteur. Par exemple – un commutateur à lames et un aimant. Considérez l'interrupteur à lames comme un bouton normalement ouvert et connectez-vous comme d'habitude avec une résistance pull-down de 10 k ohms.

D'autres peuvent utiliser un capteur à effet Hall (chacun le sien). Rappelez-vous de la classe de mathématiques, pour calculer la circonférence - utilisez la formule: circonférence = 2πr où r est le rayon du cercle.

Maintenant que vous avez la circonférence de la roue, cette valeur peut être considérée comme notre « distance fixe », et donc la vitesse peut être calculée en mesurant le temps écoulé entre une rotation complète.

Votre capteur - une fois installé - devrait agir de la même manière qu'un bouton normalement ouvert qui est poussé à chaque rotation. Notre croquis mesurera le temps écoulé entre chaque impulsion du capteur.

Pour ce faire, notre exemple aura la sortie du capteur connectée à la broche numérique 2 - car elle déclenchera une interruption pour calculer la vitesse. Sinon, le croquis affichera la vitesse sur un module LCD à interface I2C normal. L'interface I2C est suggérée car elle ne nécessite que 4 fils de la carte Arduino à l'écran LCD - moins il y a de fils, mieux c'est.

Voici le croquis pour votre lecture:

/*Compteur de vitesse de base utilisant millis(); */

#include "Wire.h" // pour l'écran LCD du bus I2C

#include "LiquidCrystal_I2C.h" // pour le module LCD du bus I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // met l'adresse LCD à 0x27 pour un affichage de 16 caractères et 2 lignes

départ flottant, terminé;

flotteur écoulé, temps; float circMetric=1,2; // circonférence de la roue par rapport à la position du capteur (en mètres) float circImperial; // en utilisant 1 kilomètre = 0,62137192 milles float speedk, speedm; // contient les valeurs de vitesse calculées en métrique et impérial

void setup()

{ attachInterrupt(0, speedCalc, RISING); // interruption appelée lorsque les capteurs envoient digital 2 high (chaque rotation de roue) start=millis(); // configuration de l'écran LCD lcd.init(); // initialise l'écran lcd lcd.backlight(); // activer le rétroéclairage LCD lcd.clear(); lcd.println(" Portez un casque ! "); retard(3000); lcd.clear(); Serial.begin(115200); circImperial=circMetric*.62137; // convertir métrique en impérial pour les calculs MPH }

void speedCalc()

{ écoulé=millis()-start; start=millis(); speedk=(3600*circMetric)/elapsed; // km/h speedm=(3600*circImperial)/elapsed; // Miles par heure }

boucle vide()

{ lcd.setCursor(0, 0); lcd.print(int(vitesse)); lcd.print(" km/h "); lcd.print(int(speedm)); lcd.print(" MPH "); lcd.setCursor(0, 1); lcd.print(int(elapsed)); lcd.print(" ms/rev "); retard(1000); // ajuster selon les préférences personnelles pour minimiser le scintillement }

Il ne se passe pas grand-chose – chaque fois que la roue effectue un tour, le signal du capteur passera de bas en haut – déclenchant une interruption qui appelle la fonction speedCalc().

Cela prend une lecture de millis () et calcule ensuite la différence entre la lecture actuelle et la lecture précédente - cette valeur devient le temps pour parcourir la distance (qui est la circonférence de la roue par rapport au capteur - stocké dans

float circMetric=1,2;

et se mesure en mètres). Il calcule enfin la vitesse en km/h et en MPH. Entre les interruptions, le croquis affiche les données de vitesse mises à jour sur l'écran LCD ainsi que la valeur du temps brut pour chaque révolution par curiosité. Dans la vraie vie, je ne pense pas que quiconque monterait un écran LCD sur un vélo, peut-être qu'un écran LED serait plus pertinent.

En attendant, vous pouvez voir comment cet exemple fonctionne dans le court clip vidéo suivant. Au lieu d'une combinaison roue de vélo et interrupteur à lames/aimant, j'ai connecté la sortie d'onde carrée d'un générateur de fonctions à la broche d'interruption pour simuler les impulsions du capteur, afin que vous puissiez avoir une idée de son fonctionnement.

Étape 4:

Cela résume à peu près l'utilisation de millis() pour le moment. Il y a aussi les micros(); fonction qui compte les microsecondes.

Alors voilà – une autre fonction pratique qui peut permettre de résoudre plus de problèmes via le monde d'Arduino. Comme toujours, c'est maintenant à vous et à votre imagination de trouver quelque chose à contrôler ou de faire face à d'autres manigances.

Cet article vous est présenté par pmdway.com - tout pour les fabricants et les passionnés d'électronique, avec une livraison gratuite dans le monde entier.

Conseillé: