Aller au contenu


Photo
- - - - -

Rattler : une voiture de course pour la toulouse robot race 2019


33 réponses à ce sujet

#21 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 666 messages
  • Gender:Male

Posté 30 septembre 2019 - 08:11

Pour détecter le portique, il me semble qu'une flagelle (de 1m), c'est ce qu'il y a de plus simple.
Et encore, la fixation et l'actionnement d'un switch, ce n'est pas forcement simple.
Bon courage.

#22 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 249 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 02 octobre 2019 - 04:27

Bon comme tout était assemblé, je n'avais plus qu'à taper quelques lignes de codes pour réaliser le premier essais de ce robot ... 

Et comme j'ai un couloir assez long chez moi, la piste d'essai était toute désignée... 

Voici donc la vidéo du tout premier essai réalisé en autonome, à vitesse minimale hard codé: 

Je crois que j'ai eu un peu de chance avec mes premiers réglages =)

 

Le capot de la voiture n'a pas été mis pour la vidéo car je vais encore travailler sur la voiture mais oui il sera mis à la fin ;)

 

 

Code qui a été fait pour le moment: 

J'ai combiné

 => mes explication donnée ici sur la réception des signal d'un radio commande et sur l'usage du pinchange interrupt pour avoir l'acquisition des 6 voies de ma radio en utilisant non pas un timer mais le pinchange interrupt sur le Port K ( de A8 à A13) , 

=> l'exemple de test du tf mini plus sur le Serial 1 et j'ai multiplié le code pour le faire aussi sur le serial 2 et le serial 3 afin de lire mes 3 distances 

=> Le fait de piloter un servo tout simple avec la lib servo.h qui me sert à piloter la direction et la vitesse de la voiture 

 

Contenu du code : 

 

Initialisation : 
Initialisation des pins 

initialisation des serial 

initialisation des interruptions 

 

en interruption : lecture de la radiocommande, 

 

Loop

lecture des distances 

Si channel radio reçu il y a pas trop longtemps

 si channel de controle du mode Automatique 

  modeAuto 

 sinon

  modeManuel 
Sinon 

 Arrêt

 

 

 

Le mode Auto est assez simple pour le moment : 

 

 direction = ( distanceGauche - distanceDroite)
 Si  (distanceMilieu >  distanceArrêt)
  vitesse = vitesseMinimum 

 sinon 
  Arret();
 

 

Dès que j'ai une solution pour m'arrêter à la fin du parcours je m'inscrit officiellement x) 
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#23 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 666 messages
  • Gender:Male

Posté 02 octobre 2019 - 08:27

Bon, et bien, cela m'a l'air très bien.
Où en es-tu pour la détection du portique ?

#24 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 249 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 02 octobre 2019 - 10:16

Où en es-tu pour la détection du portique ?

 

Justement ... 

 

 

Dès que j'ai une solution pour m'arrêter à la fin du parcours je m'inscrit officiellement x) 
 

 

 

Pour le moment j'ai rien ...  Je pourrais mesurer le temps que met la voiture en moyenne pour faire le circuit ... Mais bon niveau fiabilité ... 

 

Une grande perche d'1m60 sur la voiture ... 

Il y a une couleur pour l'arrivée sinon ... 

Bref ... je cherche ...

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#25 Oliver17

Oliver17

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 732 messages
  • Gender:Male
  • Interests:Glenn

Posté 03 octobre 2019 - 08:32

Et mettre un capteur de distance pointant vers le haut qui dit que lorsqu'il passe sous le portic (au bout d'un certains nombres de tours si nécessaire) et bien le véhicule stop.

En mettant un p'tit VL53L, 


signature_01.png -->

 

Mon Tipeee
 


#26 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 249 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 03 octobre 2019 - 08:48

Mettre un capteur de distance qui pointe vers le haut c'est exactement ce que je me suis résolu à faire ... D'où la question sur la largeur du portique pour savoir si il est suffisamment large pour qu'on puisse le détecter en passant dessous ... 

 

Advienne que pourra ^^ De toute façon j'ai pas le temps de faire autre chose ... J'espère que je vais réussir à pas me faire disqualifier x)
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#27 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 666 messages
  • Gender:Male

Posté 03 octobre 2019 - 09:06

Le portique a une hauteur de 90cm. C'est un demi cercle. Sa largeur doit être d'environ 20cm.
Un de tes détecteurs laser devrait faire l'affaire.
Une temporisation sur un circuit de 110m est irréaliste.
C'est ce que je vais faire, mais pour 10m.

#28 Sandro

Sandro

    Habitué

  • Membres
  • PipPip
  • 244 messages
  • Gender:Male

Posté 03 octobre 2019 - 10:25

Une idée (pas testée) serait de mettre sur le robot un détecteur de champ magnétique (un simple capteur tout/rien suffit) entouré d'un peu de fer. Ensuite tu attache un aimant au bout d'une longue tige en bois que tu place verticalement sur le fer et le capteur : la tige sera maintenue par l'aimant, et quand tu passe sous le portique elle se fera arracher par l'impact et tu détecte ainsi la disparition de l'aimant.

 

Alternativement, si tu n'as pas de capteur magnétique en stock, un bouton poussoir bien placé peut aussi faire l'affaire.

 

La difficulté est d'avoir quelque chose d'assez solide pour que ça reste en place durant la course, mais pas trop pour que ça tombe à l'arrivée.

S'il n'est pas autorisé d'abandonner des pièces du robot, alors il suffit de rajouter une ficelle ou une charnière pour éviter de perdre la tige.



#29 Thot

Thot

    Habitué

  • Membres
  • PipPip
  • 171 messages
  • Gender:Male
  • Location:Toulouse
  • Interests:Artiste Roboticien, prendre les dernières techno et les mettre sur scène... telle est ma devise.
    Gestuelle et conscience artificielle.
    Bipédie et quadrupédie

Posté 03 octobre 2019 - 12:12

Attention, pendant la course, on passe deux fois sous le portique. Il faut compter et bien initialiser le comptage au départ (l'erreur fait que le robot s'arrête au bout de 10m...)

"Il n'y a rien de plus étrange pour l'homme que son image" RUR, Karel Capek
Caliban Midi - Art - Terroir et Robotique


#30 Sandro

Sandro

    Habitué

  • Membres
  • PipPip
  • 244 messages
  • Gender:Male

Posté 03 octobre 2019 - 12:25

bon, s'il faut passer 2 fois sous le portique, alors mon idée ne marche pas



#31 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 666 messages
  • Gender:Male

Posté 03 octobre 2019 - 06:59

Attention, pendant la course, on passe deux fois sous le portique. Il faut compter et bien initialiser le comptage au départ (l'erreur fait que le robot s'arrête au bout de 10m...)

C'est vrai que le départ se situe avant le portique et non pas sous le portique.
Je trouve ton idée quand même très intéressante.
La flagelle n'est pas obligée de s'arracher. Elle pourrait osciller autour d'un axe transversal et serait retenue par élastique.
Le détecteur pourrait ainsi se trouver à une position distante. Ce n'est pas toujours possible avec un interrupteur.

#32 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 249 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 06 octobre 2019 - 06:26

Pour ceux qui n'ont pas pu voir la voiture en directe, voici quelques photo de la version finale de mon robot qui a été nommé Rattler pour l'occasion au vu des Autocollants qui étaient sur le chassis ^^ 

Avec la coque : 

 

20191006_182057.jpg

20191006_182146.jpg

Sans la coque : 

20191006_182536.jpg

 

20191006_182502.jpg

On remarquera donc le quatrième TF Mini plus qui a été ajouté à l'arrière du robot et qui permet de détecter le portique : ça marche super bien !  Au final j'ai eu plus de mal à régler " l'autopilote " qu'à valider la détection du portique. 

 

Aucune impression 3D n'a été effectuée, la chance à fait que le capteur rentrait pile poile dans le trou disponible et l'aileron arrière le maintenant parfaitement en place ... 

 

Par contre attention : Si vous souhaitez utiliser 4 TF mini sur une arduino, et si vous décidez de brancher un TF mini sur les pins RX et TX de votre arduino il vous faudra choisir une petite astuce ... Voir le sujet sur le test du TF Mini plus   Il est aussi possible d'utiliser un softSerial pour contourner ce problème ...  

Pour ma part afin de régler le problème  j'ai décidé de brancher uniquement le pin TX du TF mini plus sur le pin RX de l'arduino en passant par un interrupteur. Il me faut donc d'abord allumer le robot puis une fois qu'il est bien allumé basculer l'interrupteur pour connecter le TF Mini plus à l'arduino.  De même pour programmer l'arduino il me suffit d'appuyer sur cet interrupteur pour déconnecter le TF mini plus. 

 

Petite photo de l'interrupteur qui a été ajouté :

20191006_185740.jpg
 

C'est un interrupteur " très gros " pour le besoin ... Cela aurait parfaitement fonctionné avec un interrupteur miniature ou avec ce petit interrupteur  . Mais si j'ai choisi le plus gros, c'est surtout pour qu'il soit pratique à basculer sans le voir et qu'il y avait une place parfaitement adaptée à se taille ... 

 

On remarquera aussi le câble usb  AB de programmation, rangé dans la voiture, déjà câble sur l'arduino, prêt à être dégainer pour reprogrammer la voiture sans avoir à ouvrir le châssis. 

 

On ne le voit pas mais j'ai changé le servomoteur de la voiture d'origine par un servomoteur plus puissant et surtout plus rapide, car le servomoteur d'origine était un peu lent ... 

 

Concernant le résultat, bien que la mécanique ( avec changement de servomoteur ) était correcte et que l'électronique était au point et fiable,  j'ai manqué de temps pour la partie programmation, et surtout le " réglage de l'autopilote " . 

Mon meilleur temps fut de 1m06s pour les 110m là où le meilleur à réussi à le faire en 23s66" ... J'ai donc encore de gros progrès à faire. 

 

Voici la structure du code que j'ai utilisé et que vous pouvez réutiliser sur un projet similaire  : 

 

// Code réalisé par Mike118 de Robot Maker dans le cadre de la Toulouse Robot Race 2019
// Ce code est prévu pour une arduino méga car necessite plusieurs ports série 
// L'arduino méga contrôle une voiture de course radio commandée équipée d'un servomoteur pour la direction 
// et d'un driver de moteur brushless se pilotant comme un servomoteur pour gérer la vitesse 
// Une radio commande 6 voie standard est branchée sur les pins A8 à A13 
// 4 TF Mini plus sont branchés sur les 4 ports séries de l'arduino mega pour surveiller la présence d'obstacle en haut à gauche à droite et au milieu
// Le capteur du haut est branché sur le serial 0 en passant par un interrupteur 
// => L'arduino doit être allumée avant de connecter le TF mini sur le serial 0 avec l'interrupteur sinon l'arduino ne demarre pas
// => De même pour programmer l'arduino le TF mini ne doit pas être connecté sur le serial 0 sinon vous ne pourrez pas téléverser votre code
// Le tf mini regardant à gauche est branché sur le Serial 1, celui à droite sur le Serial 2 et celui du milieu est branché sur le sérial 3. 
// Le départ du mode autonome se fait avec le channel 2 de la radio commande 
// l'arret du mode autonome se fait par la detection d'un portique par le capteur du haut
// Un mode manuel permet de contrôler la voiture avec les channels radio 0 et 1 
// Pour plus d'info sur la Toulouse Robot Race : http://toulouse-robot-race.org/

#include <Servo.h>

#define SPEEDPIN 6      // Pin de controle du driver qui gère la vitesse commandé comme un servomoteur 
#define SPEEDMIN 1000   // Valeur en microsecondes permettant d'aller à fond en marche arrière 
#define SPEEDMAX 2000   // Valeur en microsecondes permettant d'aller à fond en marche avant 

#define DIRPIN 7        // Pin de controle du servomoteur de direction  
#define DIRMIN 600      // Valeur en microsecondes permettant de braquer à fond pour aller à droite
#define DIRMAX 2500     // Valeur en microsecondes permettant de braquer à fond pour aller à gauche

Servo speedControl;
Servo dirControl;

// RC INPUT
#define NBCHANNEL 6                   // nombre de channel de radiocommande
#define NEUTRE 1480                   // valeur du neutre de la radiocommande 
#define DIVISEUR 5                    // valeur pour remettre à l'echelle de -100 à 100 les temps reçu de la Radiocommande 
#define PORTMASK 0b00111111           // Masque permettand de définir les pins connectés à la radio 
#define PORTOFSET 0                   // Offset de pins sur le port 
#define TIMEOUT 50                    // sécurité : coupe le robot si pas de signal radio pendant 50 ms
volatile uint16_t channel[NBCHANNEL]; // Stock les temps de la radiocommande
volatile bool signalRadio = false;    // booleen indiquant qu'un signal radio a été reçu
uint32_t reftimeout = 0;              // dernière fois qu'on a reçu un signal radio 

// Distances en cm fournies par le TF Mini Plus 
uint16_t distanceGauche = 0;
uint16_t distanceDroite = 0;
uint16_t distanceMilieu = 0;
uint16_t distanceHaut = 0; 

bool isEndRun = false;
bool isAutoMode = false;

#define NBPASSAGE 1                      // nombre de fois où le robot doit passer sous le portique 
uint8_t npassage = 0;                    // nombre de passage sous l'arche 
uint32_t momentDetectionPortique = 0;    // dernière fois où on est passé sous le portique

// Setter 

void setSpeedControl(int speedValue){
  speedValue = constrain(speedValue, -100, 100);
  speedControl.writeMicroseconds(map(speedValue, -100, 100, SPEEDMIN, SPEEDMAX));
}

void setDirControl(int dirValue){
  dirValue = constrain(dirValue, -100, 100);
  dirControl.writeMicroseconds(map(dirValue, -100, 100, DIRMAX, DIRMIN));
}

// Getter 

// Retourne un signal compris entre -100 et 100 pour chaque channel radio
int getCommande(uint8_t i) {
  if(i < NBCHANNEL )  
    return constrain((int)(channel[i] - NEUTRE)/DIVISEUR, -100, 100);  // simple formule pour transformer les temps radio reçu en valeur comprise entre  -100 et +100   
  else 
    return 0; 
}


// Fonction d'initialisation du Pin Change Interrupt sur le pin donné
void pciSetup(uint8_t pin)
{
    *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));   // enable
    PCIFR  |= bit (digitalPinToPCICRbit(pin));                    // nettoyage des interruption
    PCICR  |= bit (digitalPinToPCICRbit(pin));                    // activation de interruption du groupe
}
 

ISR (PCINT2_vect) {                                     // ISR lié au port K ( PIN A8 to A15)
 static uint8_t oldetat = 0;                            // variable qui stock l'ancien état des pins de la radio sur le port K 
 static uint32_t startValue[NBCHANNEL] = {0};           // variable qui stock le temps de départ de chaque channel 
 uint8_t etatcourant = PINK & PORTMASK;                 // état courant des pins RC on met à jour tous les channels d'un coup en lisant le port complet et on met à 0 les bits lus des channels non utilisés
 if(etatcourant != oldetat) {                           // on regarde si il y a un changement entre le courant et le précédent
  uint32_t tempsUs = micros();                          // on enregistre le temps en microseconde
  signalRadio = true;                                   // On met à jour le bouléen indiquant que le signal radio est mis à jour
  
  for( uint8_t i = PORTOFSET; i < NBCHANNEL + PORTOFSET; i++) {  // pour chaque channel
   bool val = etatcourant >> i & 1;                              // on regarde l'etat actuel de ce channel
   bool old = oldetat >> i & 1;                                  // on regarde l'ancien état de channel 
   if( val != old){                                              // changement sur ce channel? 
    if(val) startValue[i] = tempsUs;                             // si oui : rising ? => on enregistre le temps start pour ce channel
    else channel[i] = tempsUs - startValue[i];                   // sinon c'est un falling => On enregistre le temps depuis le rising de ce channel 
   }  
  }
  oldetat = etatcourant;                                         // on stock l'état actuel dans l'état courant. 
 }
}

 
void setup() {  

  // initialisation de la direction et de la vitesse à 0 
  speedControl.attach(SPEEDPIN);
  setSpeedControl(0);
  dirControl.attach(DIRPIN);
  setDirControl(0);
  
  // intitialisation des ports série 
  Serial.begin(115200);
  Serial1.begin(115200);
  Serial2.begin(115200);
  Serial3.begin(115200);
  
  // initialisation des pins d'interruption de la radiocommande 
  for (int i = A8 + PORTOFSET; i < A8 + PORTOFSET + NBCHANNEL; i++) {  //
      pinMode(i,INPUT);          // même si par default c'est en entré on met le pin en entré pour que ça soit bien clair.
      pciSetup(i);               // activation de l'interruption 
  }

}
 
 
void loop() {
  
  // Lecture des TF Mini
  distanceHaut = readTFMini0();
  distanceGauche = readTFMini1();
  distanceDroite = readTFMini2();
  distanceMilieu = readTFMini3(); 

  // Traitement de la radio
  if(signalRadio) {                 // Si signal radio reçu
   if(getCommande(2) < 0) {         // commande pilotant le mode manuel 
    modeManuel();                   // on exécute le mode manuel 
    isAutoMode = false; 
   } else isAutoMode = true;       // sinon c'est qu'on lance le mode autonome        
   reftimeout = millis();          // on actualise la reference pour le timeout
   signalRadio = false;            // on remet à 0 le booléen Radio
  } else if (millis() - reftimeout > TIMEOUT ) // perte du signal radio 
    setSpeedControl(0);

  // Gestion de l'auto pilote et de l'arrêt par détection du portique 
  if(isAutoMode) {   // si on est en mode autonome
   if( distanceHaut > 70 && distanceHaut < 160 && (millis()- momentDetectionPortique) > 3000 ) {  // si on détecte le portique et qu'on l'a pas détecté dans les 3 dernières secondes 
      momentDetectionPortique = millis();                                                         // on enregistre le moment de la détection, permet d'éviter de détecter plusieurs fois le portique 
      npassage ++;                                                                                // on compte le nombre de fois qu'on a passer le portique 
      if(npassage > NBPASSAGE) {                                                                  // si on dépasse le nombre de fois qu'on doit passer sous le portique
        isEndRun = true;                                                                          // fin du run il faudra réinitialiser l'arduino pour relancer un run
        setSpeedControl(0);                                                                       // On met la vitesse à 0 
      }
    }
    if(isEndRun == false) modeAuto();     // si on est pas à la fin du run on lance le pilotage autonome
    else setSpeedControl(0);              // sinon on s'arrête 
  }
  
}

void modeAuto() {
  int autoAngle = 0;
  int autoSpeed = 0;
  
  // "add your magic here" 
  // modifier autoAngle et autoSpeed en fonction de 
  // distanceGauche distanceDroite distanceMilieu
  
  setDirControl(autoAngle);
  setSpeedControl(autoSpeed);

}

// Pilotage de la voiture en fonction des channel 0 et 1 de la radioCommande 
void modeManuel() {
 setDirControl(getCommande(0));  
 setSpeedControl(getCommande(1)); 
}

// Fonctions de réception des valeurs de TF Mini 

uint16_t readTFMini0() {
 uint8_t current;
 static uint8_t n = 0;
 static uint8_t sum = 0;
 static uint16_t distance = 0;
 static uint16_t distanceOut = 0;
 
 while(Serial.available()) {
  current = Serial.read();

  switch(n) {

   case 0:
    if(current == 0x59) {
     sum += current;
     n++;
    }
    break;

   case 1:
    if(current == 0x59) {
     sum += current;
     n++;
    } else
     n = 0;
    break;

   case 2:
    distance = current;
    sum += current;
    n++;
    break;

   case 3:
    distance += current << 8;
    sum += current;
    n++;
    break;

   case 4:
    sum += current;
    n++;
    break;

   case 5:
    sum += current;
    n++;
    break;

   case 6:
    sum += current;
    n++;
    break;

   case 7:
    sum += current;
    n++;
    break;

   case 8:
    if(sum == current)
      distanceOut = distance;
    sum = 0;
    n = 0;
    break;

  }
 }
 return distanceOut;  //  retourne toujours la dernière bonne valeur reçue.
}

uint16_t readTFMini1() {
 uint8_t current;
 static uint8_t n = 0;
 static uint8_t sum = 0;
 static uint16_t distance = 0;
 static uint16_t distanceOut = 0;
 
 while(Serial1.available()) {
  current = Serial1.read();

  switch(n) {

   case 0:
    if(current == 0x59) {
     sum += current;
     n++;
    }
    break;

   case 1:
    if(current == 0x59) {
     sum += current;
     n++;
    } else
     n = 0;
    break;

   case 2:
    distance = current;
    sum += current;
    n++;
    break;

   case 3:
    distance += current << 8;
    sum += current;
    n++;
    break;

   case 4:
    sum += current;
    n++;
    break;

   case 5:
    sum += current;
    n++;
    break;

   case 6:
    sum += current;
    n++;
    break;

   case 7:
    sum += current;
    n++;
    break;

   case 8:
    if(sum == current) 
      distanceOut = distance;
    sum = 0;
    n = 0;
    break;

  }
 }
 return distanceOut;  //  retourne toujours la dernière bonne valeur reçue.
}


uint16_t readTFMini2() {
 uint8_t current;
 static uint8_t n = 0;
 static uint8_t sum = 0;
 static uint16_t distance = 0;
 static uint16_t distanceOut = 0;
 
 while(Serial2.available()) {
  current = Serial2.read();

  switch(n) {

   case 0:
    if(current == 0x59) {
     sum += current;
     n++;
    }
    break;

   case 1:
    if(current == 0x59) {
     sum += current;
     n++;
    } else
     n = 0;
    break;

   case 2:
    distance = current;
    sum += current;
    n++;
    break;

   case 3:
    distance += current << 8;
    sum += current;
    n++;
    break;

   case 4:
    sum += current;
    n++;
    break;

   case 5:
    sum += current;
    n++;
    break;

   case 6:
    sum += current;
    n++;
    break;

   case 7:
    sum += current;
    n++;
    break;

   case 8:
    if(sum == current)
      distanceOut = distance;
    sum = 0;
    n = 0;
    break;

  }
 }
 return distanceOut;  //  retourne toujours la dernière bonne valeur reçue.  
}


uint16_t readTFMini3() {
 uint8_t current;
 static uint8_t n = 0;
 static uint8_t sum = 0;
 static uint16_t distance = 0;
 static uint16_t distanceOut = 0;
 
 while(Serial3.available()) {
  current = Serial3.read();

  switch(n) {

   case 0:
    if(current == 0x59) {
     sum += current;
     n++;
    }
    break;

   case 1:
    if(current == 0x59) {
     sum += current;
     n++;
    } else
     n = 0;
    break;

   case 2:
    distance = current;
    sum += current;
    n++;
    break;

   case 3:
    distance += current << 8;
    sum += current;
    n++;
    break;

   case 4:
    sum += current;
    n++;
    break;

   case 5:
    sum += current;
    n++;
    break;

   case 6:
    sum += current;
    n++;
    break;

   case 7:
    sum += current;
    n++;
    break;

   case 8:
    if(sum == current) 
        distanceOut = distance;
    sum = 0;
    n = 0;
    break;

  }
 }
 return distanceOut;  //  retourne toujours la dernière bonne valeur reçue.
}



// Fonctions utilitaires de debuggage pour vérifier qu'on reçoit bien des valeurs cohérentes : 

void displayChannel() {
 for(uint8_t i = 0; i < NBCHANNEL; i++) {
  for(uint8_t j = 0; j < i; j++) {
   Serial.print("===");
  }
  Serial.println(getCommande(i));
 } 
 Serial.println("");
}

void displayTfMini() {
   Serial.print(F("Time : "));
   Serial.println(millis());
   Serial.print(F(" Gauche : "));
   Serial.println(distanceGauche);
   Serial.print(F("Milieu : "));
   Serial.println(distanceMilieu);
   Serial.print(F("Droite : "));
   Serial.println(distanceDroite);
   Serial.print(F("Haut : "));
   Serial.println(distanceHaut);
   Serial.println("");
}

Il vous faudra bien entendu compléter  la fonction " modeAuto() " avec votre propre algorithme de pilotage automotique.  A vous de faire des essais ;)  


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#33 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 249 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 06 octobre 2019 - 06:41

Quelques conseils en vrac pour ceux qui souhaiteraient participer à la toulouse robot race :  

 

=> Si le but c'est de chercher à la performance, choisir des capteurs fiable en extérieur  Comme par exemple le TF Mini plus  : pas besoin d'en avoir 4, il est possible d'en utiliser que 3 voir même 2 ...   

 

=> Avoir un robot "accessible" / facile à manipuler : Prévoir de pouvoir facilement reprogrammer ou changer la batterie sans avoir à tout démonter

 

=> Prévoir quelques pièces de rechanges ( perso je n'en ai pas eu besoin mais Oracid a eu quelques soucis de servomoteurs par exemple )

 

=> Monitorer l'état de sa batterie et avoir 2 batteries avec une alarme pour lipo ( Un concurrent a eu sa batterie de morte car trop déchargée sans être monitorée ... ) et mettre en charge sa batterie dès que vous la changez. 

=> Ajouter des roulettes de protection sur les côtés pour pouvoir gentiment frotter sur le bord en toute sécurité. 

 

=> Avoir un protocole simple pour lancer le robot.

 

=> Avoir un arrêt d'urgence sans fil ... Pratique pour arrêter les robots rapide ... 

=> Avoir un bouton d'arrêt d'urgence physique ... 

 

=> Une coque de protection peut aider à protéger le robot de l'eau si il pleut par exemple ... 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 


#34 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 4 666 messages
  • Gender:Male

Posté 07 octobre 2019 - 05:17

J'ajouterais que les tests sont très importants.
A chaque essai/test, Mike progressait de 10" à chaque fois, ce qui est énorme.
Donc, venir le jour même au lieu de la veille, n'est pas un bon plan.



Répondre à ce sujet



  


1 utilisateur(s) li(sen)t ce sujet

0 members, 1 guests, 0 anonymous users