Chronomètre d’escalade
Thème 2023 : l’ingénierie au service du sport
Mission du système
Lors d’une épreuve d’escalade chronométrée, il est parfois difficile aux juges de démarrer et arrêter le chronomètre à temps.
Le chronomètre d’escalade est constitué de deux parties :
- une au sol pour déclencher le chronomètre lorsque le grimpeur commence l’épreuve (et le remettre à zéro en appuyant à nouveau dessus)
- une en haut du mur pour arrêter le chronomètre à la fin de l’épreuve
Un afficheur numérique affiche le temps écoulé.
Fonctionnement
Le système se compose de deux parties (une en haut et une en bas), chacune alimentée par une batterie rechargeable Li-ion.
Les deux systèmes comportent chacun un microcontrôleur et communiquent par ondes radio.
Composants utilisés
Microcontrôleur
Arduino
Alimentation
Batterie lithium-ion type 18560
Régulateur de type 134N3P
Communication
Module transmetteur sans fil nRF24L01+
Documentation (autre ressource – exemple sur arduino.blaisepascal.fr)
Afficheur 7 segments DFRobot DFR0645-G
Acquisition
Microrupteur
Ressource : le bouton poussoir
Boitier et pièces diverses
Conçu avec un modeleur volumique (Onshape – voir lien personnalisé en haut de page))
Contacteur-afficheur_BAS
Imprimé en 3D PLA et découpe laser
Contacteur_HAUT
Impression 3D et assemblage
Programme
Voici un exemple de programme qui permet de créer un chronomètre géré avec 2 boutons poussoirs. Il utilise les interruptions.
const int boutonStart = 2; // ports 2 et 3 obligatoires pour interruptions const int boutonStop = 3; // sur Arduino UNO volatile unsigned long time0; // instant initial (début du chrono en ms) volatile bool running = false; // état du chrono volatile unsigned long chrono = 0; // valeur du chrono (en ms) void setup() { pinMode(boutonStart, INPUT); pinMode(boutonStop, INPUT); Serial.begin(9600); // les ISR (fonctions) exécutées quand on agit sur les boutons attachInterrupt(digitalPinToInterrupt(boutonStart), start, CHANGE); attachInterrupt(digitalPinToInterrupt(boutonStop), stop, CHANGE); } void loop() { if (running) { // Actualisation du chrono (uniquement si démarré) chrono = millis()-time0; } // Affichage du chrono Serial.print(float(chrono)/1000); Serial.println(" s"); delay(100) ; // affichage tous les 1/10 secondes } void start() { if (digitalRead(boutonStart) == HIGH) { // le bouton start vient d'être appuyé : remise à zéro chrono = 0; running = false; } else { // le bouton start vient d'être relâché : démarrage chrono running = true; time0 = millis(); Serial.println("############### START"); } } void stop() { if (digitalRead(boutonStop) == HIGH) { // le bouton stop vient d'être appuyé : arrêt chrono running = false; Serial.println("STOP ###############"); } else { // le bouton stop vient d'être relâché : ??? } }
Feuille de route
- Réaliser un diagramme (draw.io) représentant les chaînes fonctionnelles de ce système
- Mettre en œuvre une communication sans fil entre deux arduinos
- Mettre en œuvre un chronomètre avec démarrage/arrêt par deux microrupteurs
- Compléter la maquette volumique en y incluant les composants et en concevant les pièces nécessaires à leur intégration
- Construire le système (impressions, montage, câblage, …)
- Tester !