Pololu-Zumo-Shield-Arduino-detecter-bord

De MCHobby - Wiki
Aller à : navigation, rechercher

Ajouter des senseurs au Zumo lui permet de sentir et réagir au monde qui l'entoure. Dans les compétitions sumo où deux robots essayent de se pousser l'un l'autre hors du ring (ring circulaire), il est important que que le robot puisse détecter le bord du ring afin de ne pas dépasser la frontière. Etant donné que les rings sumo sont noir avec une bordure blanche (tout le long de la frontière), un senseur infrarouge tel que les capteurs QTR lien pololu est particulièrement bien adapté. Le réseau de senseur infrarouge du Zumo lien pololu est équipé de 6 capteurs QTR sur une carte conçue pour prendre place directement sur le connecteur d'extension situé à l'avant du shield Zumo (note: le zumo robot pre-assemblé lien pololu est déjà équipé avec le réseau de senseur infrarouge).

Pololu-Zumo-Shield-Arduino-detecter-bord-00.jpg

Un robot Zumo se préparant à attaquer un SumoBot Parallax.

Cliquer l'image pour l'agrandir

Pololu-Zumo-Shield-Arduino-ajouter-detecteur-ligne-33.jpg

Le réseau de senseur infrarouge du Robot Zumo, vue du dessous.

Cliquer l'image pour l'agrandir

Cet exemple montre comment programmer un Robot Zumo Arduino équipé du réseau de senseur infrarouge pour qu'il se balade dans sur un ring sans jamais en sortir. Notez qu'il utilise les deux senseurs situés sur chaque extrémité du réseau de capteur (ce qui est suffisant pour une détection de bordure). Après avoir installé les bibliothèques Arduino du shield Zumo, vous pouvez ouvrir le croquis/sketch en sélectionnant le point de menu Fichier > Exemples > ZumoExamples > BorderDetect.

Vous pourriez avoir besoin de modifier quelques éléments du script pour qu'il fonctionne bien avec votre Zumo:

  • S'il l'un de vos moteurs est connecté à l'envers, dé-commentez les lignes 48 et/ou 49 pour corriger leur sens de rotation.
  • Ajuster la vitesse et les temps de de pause (duration) dans lignes 13-17. D'une façon générale, des vitesses plus faibles et temps de pause plus courts fonctionnent mieux avec des moteurs rapides -tandis- que des vitesses plus élevées et temps de pause plus long seront plus adéquat avec des moteurs plus lents.
    Les valeurs par défaut fonctionnent bien avec un Zumo équipé de moteurs 75:1 HP lien pololu.
  • Pour finir, le seuil de lecture du senseur (threshold en anglais) utilisé pour différencier les surfaces noires et blanches, est définit à la ligne 10. Vous pourriez avoir besoin de changer cette valeur en fonction de votre environnement surface de votre ring). Attention: les surfaces noires lisses/en verre réfléchissent également la lumière infrarouge... il sera donc difficile, voire impossible, de distinguer la surface noire réfléchissante des surfaces blanches.

Téléversez le croquis/sketch sur l'Arduino monté sur le Zumo, Placez votre robot Zumo sur le ring (ou une grade surface noire entouré d'une bordure claire) et pressez le bouton utilisateur. Soyez prêt à rattraper votre Zumo au cas où il quitterait le ring! Si tout fonctionne comme prévu, votre Zumo devrait entamer un décompte sonot (sur le Buzzer) puis commence à se déplacer en ligne droite jusqu'à ce qu'il rencontre le bord du ring; alors, il doit reculer, tourner puis continuer son déplacement.
Essayez d'ajuster les paramètres mentionnés ci-dessus si cela ne fonctionne pas comme prévu.

Voici quelques trucs et astuces de dépannage:

  • Si le Zumo dépasse de bord du ring, essayez de diminuer la valeur de FORWARD_SPEED (vitesse en marche avant, particulièrement indiqué s'il se déplace rapidement) ou réduire la valeur de QTR_THRESHOLD (seuil de détection du senseur infrarouge).
  • Si le Zumo s'arrête sur le bord mais tourne trop (ou pas assez) avant de continuer alors ajustez la valeur de TURN_SPEED (vitesse de rotation) et/ou TURN_DURATION (temps de rotation).
  • Si vous n'entendez pas de le son du buzzer, vérifiez que le cavalier de configuration du buzzer est configuré conformément à votre modèle de carte Arduino.

La possibilité de pouvoir errer à l'intérieur du ring sumo est suffisant pour que votre robot Zumo puisse participer à des compétitions de robot sumo. C'est une fonctionnalité rudimentaire, un croquis/sketch plus avancé permettrait la détection de l'opposant pour se diriger directement sur lui. Pour améliorer votre robot Zumo, vous pourriez considérer l'ajout de plusieurs senseurs, comme ceux permettant d'évaluer la distance lien pololu (permettant ainsi de détecter un opposant plutôt que de compter sur la chance de le percuter).

Code

Voici une copie de l'exemple avec traduction des commentaires pour vous aider à mieux comprendre le fonctionnement du croquis/sketch

Nous recommandons de toujours charger l'exemple depuis les codes d'exemples de la bibliothèque Zumo.

#include <ZumoBuzzer.h>
#include <ZumoMotors.h>
#include <Pushbutton.h>
#include <QTRSensors.h>
#include <ZumoReflectanceSensorArray.h>
 
#define LED 13
 
// Cette valeur aura peut être besoin d'être ajusté pour les 
// différentes conditions d'éclairages, surfaces, etc.
#define QTR_THRESHOLD  1500 // microseconds
  
// A ajuster en en fonction des différents types de moteur
#define REVERSE_SPEED     200 // 0 est stoppé, 400 à pleine vitesse
#define TURN_SPEED        200
#define FORWARD_SPEED     200
#define REVERSE_DURATION  200 // ms
#define TURN_DURATION     300 // ms
 
ZumoBuzzer buzzer;
ZumoMotors motors;
Pushbutton button(ZUMO_BUTTON); // Bouton poussoir sur la broche 12
 
#define NUM_SENSORS 6
unsigned int sensor_values[NUM_SENSORS];
 
ZumoReflectanceSensorArray sensors(QTR_NO_EMITTER_PIN);

# Attendre après le bouton et faire le décompte
void waitForButtonAndCountDown()
{
  digitalWrite(LED, HIGH);
  button.waitForButton();
  digitalWrite(LED, LOW);
   
  // Jouer un décompte audio
  for (int i = 0; i < 3; i++)
  {
    delay(1000);
    buzzer.playNote(NOTE_G(3), 200, 15);
  }
  delay(1000);
  buzzer.playNote(NOTE_G(4), 500, 15);  
  delay(1000);
}
 
void setup()
{
  // Dé-commenter pour corriger le sens de rotation des moteurs (si nécessaire)
  //motors.flipLeftMotor(true);
  //motors.flipRightMotor(true);
   
  pinMode(LED, HIGH);
   
  waitForButtonAndCountDown();
}

void loop()
{
  if (button.isPressed())
  {
    // Si le bouton est pressé, arrêter et attente une seconde
    // pression du bouton pour continuer
    motors.setSpeeds(0, 0);
    button.waitForRelease();
    waitForButtonAndCountDown();
  }
   

  sensors.read(sensor_values);
  
  if (sensor_values[0] < QTR_THRESHOLD)
  {
    // Si le senseur le plus à gauche détecte une ligne, reculer et tourner à droite
    motors.setSpeeds(-REVERSE_SPEED, -REVERSE_SPEED);
    delay(REVERSE_DURATION);
    motors.setSpeeds(TURN_SPEED, -TURN_SPEED);
    delay(TURN_DURATION);
    motors.setSpeeds(FORWARD_SPEED, FORWARD_SPEED);
  }
  else if (sensor_values[5] < QTR_THRESHOLD)
  {
    // Si le senseur le plus à droit détecte une ligne, reculer et tourner à gauche
    motors.setSpeeds(-REVERSE_SPEED, -REVERSE_SPEED);
    delay(REVERSE_DURATION);
    motors.setSpeeds(-TURN_SPEED, TURN_SPEED);
    delay(TURN_DURATION);
    motors.setSpeeds(FORWARD_SPEED, FORWARD_SPEED);
  }
  else
  {
    // Sinon, aller tout droit
    motors.setSpeeds(FORWARD_SPEED, FORWARD_SPEED);
  }
}

Basé sur "Zumo Shield for Arduino" de Pololu (www.pololu.com/docs/0J57) - Traduit en Français par shop.mchobby.be CC-BY-SA pour la traduction
Toute copie doit contenir ce crédit, lien vers cette page et la section "crédit de traduction". Traduit avec l'autorisation expresse de Pololu (www.pololu.com)

Based on "Zumo Shield for Arduino" from Pololu (www.pololu.com/docs/0J57) - Translated to French by shop.mchobby.be CC-BY-SA for the translation
Copies must includes this credit, link to this page and the section "crédit de traduction" (translation credit). Translated with the Pololu's authorization (www.pololu.com)