Slot et Arduino : Première

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.

L'installation

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

Le schéma

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.

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.

Commentaires

Pas encore de commentaire.

Ajouter un commentaire

Vous pouvez utiliser la syntaxe Markdown dans votre commentaire.

Fil Atom des commentaires