Après les prémices (la détection et Le pont en H), voici le premier montage qui relie slot-racing et arduino. Je récupère les principes des deux montages précédents, j'ajoute une piste (enfin une ligne droite) et un pont de détection en carton (la matière, rien de péjoratif).
Tout ça pour essayer de mesurer l'accélération, la vitesse maximale et le freinage d'une voiture de slot.
Avant le rail de détection/alimentation qu'on voit sur la photo, il y a 8 rails de 35cm pour la phase d'accélération et 6 rails après pour la phase de freinage.
L'électronique
Voici pour le schéma, je reprends le montage du pont en H. Maintenant je controle le pont par l'intermédiaire de l'arduino. J'ai aussi repris le montage de détection chronométrage.
// Définition des constantes pour les pattes
const byte ligne = 3;
const byte ligne_interrupt = 0;
const byte activer = 4;
const byte avant = 5;
const byte bouton1 = 6;
const byte bouton2 = 7;
const byte DEL = 13;
// Définition des variables
bool etat_bouton1;
bool etat_bouton2;
volatile bool fin;
volatile bool frein;
volatile bool etat_ligne;
unsigned long t0 = 0;
volatile unsigned long t1 = 0;
volatile unsigned long t2 = 0;
void setup() {
Serial.begin(9600);
pinMode(ligne, INPUT);
pinMode(bouton1, INPUT_PULLUP);
pinMode(bouton2, INPUT_PULLUP);
pinMode(DEL, OUTPUT);
pinMode(activer, OUTPUT);
pinMode(avant, OUTPUT);
// ISR de franchisement de ligne
attachInterrupt(ligne_interrupt, detection, CHANGE);
}
void loop() {
etat_bouton1 = digitalRead(bouton1);
etat_bouton2 = digitalRead(bouton2);
if ( etat_bouton1 == LOW ) {
Serial.println("Test avec frein");
frein = true;
// Allumage de la DEL interne pendant 1s
digitalWrite(DEL, HIGH);
delay(1000);
digitalWrite(DEL, LOW);
// Enregistrement du temps
t0 = millis();
// Mise en route du moteur
digitalWrite(activer, HIGH);
digitalWrite(avant, HIGH);
}
if ( etat_bouton2 == LOW ) {
Serial.println("Test avec roue libre");
frein = false;
// Allumage de la DEL interne pendant 1s
digitalWrite(DEL, HIGH);
delay(1000);
digitalWrite(DEL, LOW);
// Enregistrement du temps
t0 = millis();
// Mise en route du moteur
digitalWrite(activer, HIGH);
digitalWrite(avant, HIGH);
}
if ( fin == true ) {
fin = false;
// Affichage des résultats
Serial.println(t0);
Serial.println(t1-t0);
Serial.println(t1);
Serial.println(t2-t1);
Serial.println(t2);
}
}
void detection() {
etat_ligne = digitalRead(ligne);
if ( etat_ligne == LOW ) {
// Franchissement de ligne d'arrivée
// Enregistrement du temps
t1 = millis();
}
else {
// Dépassement de ligne d'arrivée
// Enregistrement du temps
t2 = millis();
if ( frein == true ) {
// Freinage du moteur
digitalWrite(activer, HIGH);
digitalWrite(avant, LOW);
}
else {
// Moteur en roue libre
digitalWrite(activer, LOW);
digitalWrite(avant, LOW);
}
// Fin
fin = true;
}
}
Pour le code, une subtilité l'interruption 0 que j'utilise correspond à patte 3. Ce qui explique la déclaration en deux fois pour la détection par photo transistor, "ligne" et "ligne_interrup". Selon le site arduino, j'aurais du utiliser cette ligne de code :
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
Mais ça n'a pas voulu, je pense à cause de ma version de l'IDE trop ancienne. Il faudra que je réessaie après une mise à jour.
Les résultats
J'ai du refaire quelques calculs pour obtenir les valeurs d'accélération, vitesse et décélération.
- L'accélération est obtenue à partir de la distance et du durée d'accélération,
- La vitesse maximale à partir de la longueur de la voiture et de la durée de passage sous le pont.
- La décélération à partir de la vitesse maximale et de la distance de décélération.
Voici le pdf et sa source qui détaille les calculs.
Enfin le tableau des résultats.
Bilan
Je pense que l'expérience est surtout une démonstration de faisabilité. J'ai réussi à associer l'arduino avec le slot, à détecter un passage et à contrôler le moteur. Il y a encore du chemin à parcourir mais la première étape est réussie.
Pour les tests d'accélération et de freinage, le protocole étant mal défini, les résultats ne doivent pas être exploitables.
Je n'ai fait qu'un essai de décélération en roue libre. La piste n'étant pas assez longue, la voiture a fini sa course dans un mur. Beaucoup de bruit mais pas de dégâts (ni pour la voiture, ni pour le mur).
Un petit souci, il y avait double comptage à basse vitesse. L'arduino détecter le passage de «deux voitures». À voir lors d'un prochain montage.
Les essais ont eu lieu le 7 mai 2020 depuis rien de nouveau comme montage. Il faudrait que je trouve un peu de temps pour avancer.