Aller au contenu


Photo
- - - - -

Robot Suiveur de Ligne -> Toulouse Robot Race !

voiture téléguide + arduino

59 réponses à ce sujet

#21 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 03 août 2016 - 08:21

Bon j'ai pas trouvé à quoi correspond la fonction "computeInpute", mais pour le moment voici ce que j'ai fait :

 

 

void loop()

{
 
 int resultat1 = (((-valeurLue5) + (-valeurLue4) + ((-valeurLue3*3))));
 int resultat2 = ((valeurLue2) + (valeurLue1));
  
    Serial.print("resultat1 = ");
    Serial.println(resultat1);
    Serial.print("resultat2 = ");
    Serial.println(resultat2);
    Serial.print("valeurLue5 = ");
    Serial.println(valeurLue5);
    Serial.print("valeurLue4 = ");
    Serial.println(valeurLue4);
    Serial.print("valeurLue3 = ");
    Serial.println(valeurLue3);
    Serial.print("valeurLue2 = ");
    Serial.println(valeurLue2);
    Serial.print("valeurLue1 = ");
    Serial.println(valeurLue1);
    
    Serial.println();
    
     delay(1000);
  
   // on convertit en nombre binaire la tension lue en sortie du potentiomètre
    valeurLue5 = analogRead(CapteurDroite2);
    valeurLue4 = analogRead(CapteurDroite1);
    valeurLue3 = analogRead(CapteurMillieuDroite);
    valeurLue2 = analogRead(CapteurMillieuGauche);
    valeurLue1 = analogRead(CapteurGauche1);
    

 

Je me suis arrêté la car j'ai un capteur qui envoie une valeur trop différente lorsque la surface est noire. (il faut que j'investigue lol)

 

De plus il me manque un capteur IR. Je l'aurais demain.



#22 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 192 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é 04 août 2016 - 12:37

aller je vais donner quelques indices qui peuvent aider =) 

 

 

#define SEUILMINNOIR 270  
#define SEUILMAXBLANC 70

uint8_t stateSensor[5];

void readState()   
{
    for (uint8_t i=1; i<6; i++)     // i de 1 à 5 pour les capteurs de 1 à 5 capteur 1 mis sur A1 capteur 5 sur A5
    {
      value = analogRead(i);     
      if ( value> SEUILMINNOIR )      // dans ce cas on est sur du noir
      {
          stateSensor[i-1]=1;       //  i-1 car on commence un tableau à l'index 0 ... et ici i entre 1 et 5 
      }
      else if ( value<SEUILMMINBLANC ) // dans ce cas on est sur du blanc
      {
        stateSensor[i-1]=0;        // à voir si il faut échanger 0 et 1 entre les deux lignes stateSensor en fonction de si on cherche du blanc ou du noir
      }
      else 
      {
       // Do nothing : on est entre 70 et 270 on ne sait pas sur quel couleur on est on garde l'état précédent 
      }
    }
}

int8_t computeInput()
{
  int8_t result=0;
  readState();
  for int8_t(i=0; i <5; i++ )
  {
     result = result +(i-2)*stateSensor[i];
  }
  return result;
}

Voilà une façon de faire =).

Je te laisse expliquer avec tes propres mots ce que tu comprend de la fonction computeInput =)  
 


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 ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#23 N1oN4o

N1oN4o

    Nouveau membre

  • Membres
  • 45 messages
  • Gender:Male

Posté 04 août 2016 - 08:33

Pour pondérer tes capteurs , tu peux ajouter un truc du style

int facteurSensor[5] ;

facteurSensor[0] = 10 ;
facteurSensor[1] = 10 ;
facteurSensor[2] = 10 ;
facteurSensor[3] = 10 ;
facteurSensor[4] = 10 ;

Les valeurs sont à définir expérimentalement ;)

Tu ajoute ça dans le code de mike118 ici dans computeInput() :

result = result +(i-2)*stateSensor[i]*facteurSensor[i];
Et normalement ça devrait marcher ;) !

#24 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 192 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é 04 août 2016 - 09:02

Pour pondérer tes capteurs , tu peux ajouter un truc du style

int facteurSensor[5] ;

facteurSensor[0] = 10 ;
facteurSensor[1] = 10 ;
facteurSensor[2] = 10 ;
facteurSensor[3] = 10 ;
facteurSensor[4] = 10 ;

Les valeurs sont à définir expérimentalement ;)

Tu ajoute ça dans le code de mike118 ici dans computeInput() :
 

result = result +(i-2)*stateSensor[i]*facteurSensor[i];
Et normalement ça devrait marcher ;) !

 

Juste une petite remarque : 

Le ( i-2 ) faisait déjà office de pondération =) 

il vaut -2 et +2 aux extrêmes et -1 et +1 pour les capteurs un peu à droite et à gauche. 

Cependant la remarque est parfaitement pertinente, pour changer cette pondération ajouter le tableau uint8_t facteurSensor[5] est une très bonne idée car cela permet d'avoir le facteur de ton choix indépendant pour chaque capteur ;) ( oui je préfère mettre un uint8_t , voir si besoin mon petit tuto sur les tailles des variables =) )


 


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 ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#25 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 04 août 2016 - 06:31

Oula ! On est loin de mes petits codes arduino de gamin la  :laugh1:

 

Bon je vais essayer de décomposer le code en marquant ce que je comprends et peut être dire de grosses conneries (comme Barthez dans les Guignols  :ph34r: )

uint8_t stateSensor[5]; 

On va créer 5 valeurs stateSensor non signées de 8 bits (0 à 255)

void readState() 

On va créer la fonction "readState()" qui prendra une valeur avec la fonction for qui suit

  for (uint8_t i=1; i<6; i++)     // i de 1 à 5 pour les capteurs de 1 à 5 capteur 1 mis sur A1 capteur 5 sur A5
    {
      value = analogRead(i);     
      if ( value> SEUILMINNOIR )      // dans ce cas on est sur du noir
      {
          stateSensor[i-1]=1;       //  i-1 car on commence un tableau à l'index 0 ... et ici i entre 1 et 5 
      }
      else if ( value<SEUILMMINBLANC ) // dans ce cas on est sur du blanc
      {
        stateSensor[i-1]=0;        // à voir si il faut échanger 0 et 1 entre les deux lignes stateSensor en fonction de si on cherche du blanc ou du noir
      }
      else 
      {
       // Do nothing : on est entre 70 et 270 on ne sait pas sur quel couleur on est on garde l'état précédent 
      }
    }
}

Sa j'ai compris grâce aux commentaires  :D

int8_t computeInput()

On créer la valeur signée "computeInput" (), valeurs qui peut prendre de -128 à 127.

int8_t result=0;

On créer la valeur signée "result" qui est égale à zéro.

readState();

On va lire le nombre de la fonction "readState" qui doit être la somme des 0 ou 1 de chaque capteurs (je crois dire une grosse connerie ^^)

for int8_t(i=0; i <5; i++ )
  {
     result = result +(i-2)*stateSensor[i]

On commence avec i =0 et on va jouer la boucle 5 fois (avec l'incrémentation de +1 à chaque nouvelle boucle).

 

la valeur "result" initialement à zéro sera égale = résult + (i -2)* la valeurs de stateSenor de chaque capteur (0 ou 1).

return result;

On retourne à partir de la variable "result" 

 

Voila ce que j'ai compris, désolé d'avance pour les grosses bourdes que j'ai dus écrire :sorry:  :ignat_02:

 

 



#26 N1oN4o

N1oN4o

    Nouveau membre

  • Membres
  • 45 messages
  • Gender:Male

Posté 04 août 2016 - 08:04

Donc si ton "result" est négatif , la ligne noire est à gauche , si c'est égal à zéro , elle est au milieu , si c'est positif elle est à droite !

 

(Sous réserve que ton Sensor[0] soit à l'extrême gauche , le Sensor[1] est à gauche , le Sensor[2] est au milieu , le Sensor[3] à droite , et pour finir le Sensor[4] tout à droite :D

 

Bon courage pour la suite ;) !



#27 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 05 août 2016 - 10:00

Bon j'ai commencé à mettre le code en forme mais je rencontre un problème avec la fonction return  :kez_12:

#define SEUILMINNOIR 270  
#define SEUILMAXBLANC 70


uint8_t stateSensor[5];
int value;

void setup() {

void readState(); {
    for (uint8_t i=1; i<6; i++)     // i de 1 à 5 pour les capteurs de 1 à 5 capteur 1 mis sur A1 capteur 5 sur A5
    {
      value = analogRead(i);     
      if ( value> SEUILMINNOIR )      // dans ce cas on est sur du noir
      {
          stateSensor[i-1]=1;       //  i-1 car on commence un tableau à l'index 0 ... et ici i entre 1 et 5 
      }
      else if ( value<SEUILMAXBLANC ) // dans ce cas on est sur du blanc
      {
        stateSensor[i-1]=0;        // à voir si il faut échanger 0 et 1 entre les deux lignes stateSensor en fonction de si on cherche du blanc ou du noir
      }
      else 
      {
       // Do nothing : on est entre 70 et 270 on ne sait pas sur quel couleur on est on garde l'état précédent 
      }
    }
}

}

void loop() {

int8_t computeInput();

int8_t result=0;

void readState(); {
  for (int8_t i=0; i <5; i++ )
  {
     result = result +(i-2)*stateSensor[i];
  }
  }
  return result;
}



J'ai comme code d'erreur : 

 

 

exit status 1

return-statement with a value, in function returning 'void' [-fpermissive]
 

 

Je pense que j'ai une erreur avec une fonction mal placée mais sans grande conviction  :huh:



#28 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPip
  • 1 212 messages
  • Gender:Male
  • Location:Autriche

Posté 05 août 2016 - 07:57

Salut !

(Au moins) trois erreurs :
- Pas de ";" après une déclaration de fonction, la syntaxe est la suivante :
typeDeRetour NomFonction(type1 arg1, type2 arg2, ...)
{ // ouverture du corps de la fonction

  // code

} // fermeture

- tu déclares ta fonction readState() dans le corps de la fonction loop, ce qui n'est pas autorisé.
- et enfin, l'erreur qui te renvoie le message : si on suit tes ouvertures / fermetures d'accolades, "return result;" est dans la fonction loop, qui est déclaré avec un type de retour "void". Tu ne peux pas renvoyer de valeur dans ce cas.
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#29 N1oN4o

N1oN4o

    Nouveau membre

  • Membres
  • 45 messages
  • Gender:Male

Posté 06 août 2016 - 08:26

Ya 2 fois un "void readState();" qui sert à dêclarer ta fonction donc c'est pas bon .
Elle n'est pas décrite avec un "void readState() { blablablabla } " .
Pour l'appeler un simple " readState(); " suffit ;) !

Du coup , il y a un soucis aussi avec computeInput :D

Ya une confusion à la fin avec ReadState et computeInput ;)

Et aussi des déclarations qui ne sont pas à leur place il me semble .

#30 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 07 août 2016 - 06:33

Oula cela me semble vraiment compliqué  :unsure:

void loop() {

int8_t computeInput();

int8_t result=0;

void readState(); {
  for (int8_t i=0; i <5; i++ )
  {
     result = result +(i-2)*stateSensor[i];
  }
  }
  return result;
}

Du coups je ne comprends pas du tout cette partie en fait. 

 

On se situe bien dans le void Loop ?

 

Du coups à quoi sert computeInput ? Car si je comprend bien on le déclare avec int8_t et après je ne le retrouve pas  :wacko:

#define SEUILMINNOIR 270  
#define SEUILMAXBLANC 70

int8_t computeInput();
uint8_t stateSensor[5];
int value;



void readState() 
{
    for (uint8_t i=1; i<6; i++)     // i de 1 à 5 pour les capteurs de 1 à 5 capteur 1 mis sur A1 capteur 5 sur A5
    {
      value = analogRead(i);     
      if ( value> SEUILMINNOIR )      // dans ce cas on est sur du noir
      {
          stateSensor[i-1]=1;       //  i-1 car on commence un tableau à l'index 0 ... et ici i entre 1 et 5 
      }
      else if ( value<SEUILMAXBLANC ) // dans ce cas on est sur du blanc
      {
        stateSensor[i-1]=0;        // à voir si il faut échanger 0 et 1 entre les deux lignes stateSensor en fonction de si on cherche du blanc ou du noir
      }
      else 
      {
       // Do nothing : on est entre 70 et 270 on ne sait pas sur quel couleur on est on garde l'état précédent 
      }
    }
}


void setup() {
  
int8_t result=0;

}

void loop() {
  // put your main code here, to run repeatedly:

}

Voila pour le moment ce que j'ai fait  :blush:



#31 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 192 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é 07 août 2016 - 07:20

alors en fait il est important de comprendre la structure du code qu'on veut faire =) 

// On défini le defines

#define SEUILMINNOIR 270  
#define SEUILMAXBLANC 70

// On défini les variables globale
int8_t direction =0 ; // exemple variable qui sera utilisé pour choisir la vitesse des moteurs, 0 si tout droit 
uint8_t stateSensor[5];   // les états tout ou rien des capteurs


// on définis les fonction qu'on va utiliser 

// Fonction 1 
void readState()   // Fonction qui lit les valeurs des capteurs et les range dans le tableau de états des capteurs en mode tout ou rien
{
    int16_t value=0;
    for (uint8_t i=1; i<6; i++)     // i de 1 à 5 pour les capteurs de 1 à 5 capteur 1 mis sur A1 capteur 5 sur A5
    {
      value = analogRead(i);     
      if ( value> SEUILMINNOIR )      // dans ce cas on est sur du noir
      {
          stateSensor[i-1]=1;       //  i-1 car on commence un tableau à l'index 0 ... et ici i entre 1 et 5 
      }
      else if ( value<SEUILMAXBLANC ) // dans ce cas on est sur du blanc
      {
        stateSensor[i-1]=0;        // à voir si il faut échanger 0 et 1 entre les deux lignes stateSensor en fonction de si on cherche du blanc ou du noir
      }
      else 
      {
       // Do nothing : on est entre 70 et 270 on ne sait pas sur quel couleur on est on garde l'état précédent 
      }
    }
}

// Fonction 2 qui permet de calculer un résultat , pour savoir de combien on va tourner et le retourne
uint8_t computeInput(){
  uint8_t result=0; 
  readState() ;
  for(int8_t i=0; i<5; i++ ){
   result = result +(i-2)*stateSensor[i];  // Possibilité de rajouter un facteur de Gain comme proposé par N1oN4o  
  }
  return result;
}

// Fonction 3
void setDir (int8_t dir) 
{
    // fonction à réaliser qui en fonction de "dir " définira la vitesse de rotation des moteur / l'angle de la direction à avoir
}


// Fin des déclarations des fonctions que l'on crée.



void setup() {

 // mettre ce que tu mettais déjà en setup ici

}


void loop() {
  // put your main code here, to run repeatedly:
  setDir(computeInput());  // On met la direction en fonction du résulta du calcul de compute input qui contient readState pour mettre à jour les valeurs capté.

}



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 ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#32 N1oN4o

N1oN4o

    Nouveau membre

  • Membres
  • 45 messages
  • Gender:Male

Posté 07 août 2016 - 07:23

Voila ce que je ferais , si j'ai bien compris ton besoin .. :D 

 

 

 
 
 
#define SEUILMINNOIR 270 
#define SEUILMAXBLANC 70
 
 
uint8_t stateSensor[5];
int value;
 
 
void setup()
{
}
 
/****************Fonction readState**********************/////
 
void readState() {
  for (uint8_t i=1; i<6; i++) // i de 1 à 5 pour les capteurs de 1 à 5 capteur 1 mis sur A1 capteur 5 sur A5
  {
    value = analogRead(i); 
    if ( value> SEUILMINNOIR ) // dans ce cas on est sur du noir
    {
      stateSensor[i-1]=1; // i-1 car on commence un tableau à l'index 0 ... et ici i entre 1 et 5 
    }
    else if ( value<SEUILMAXBLANC ) // dans ce cas on est sur du blanc
    {
      stateSensor[i-1]=0; // à voir si il faut échanger 0 et 1 entre les deux lignes stateSensor en fonction de si on cherche du blanc ou du noir
    }
    else 
    {
      // Do nothing : on est entre 70 et 270 on ne sait pas sur quel couleur on est on garde l'état précédent 
    }
  }
}
 
 
/****************Fonction computeInput**********************/////
 
int8_t computeInput() {
 
  int8_t result=0;
  readState();  // appel de la fonction readState 
 
  for (int8_t i=0; i <5; i++ )
  {
    result = result +(i-2)*stateSensor[i];
  }
 
  return result;
}
 
 
// focntion principale
 
void loop() {
 
  int8_t essai = 0;
 essai = computeInput();
}
 
 


#33 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPip
  • 1 212 messages
  • Gender:Male
  • Location:Autriche

Posté 07 août 2016 - 07:38

Salut !
 
Quelques petits rappels de syntaxe :
- Dans la logique Arduino, deux fonctions sont appelées : setup(), au début et une seule fois, dont le but est d'initialiser les variables de ton problème (config pin entrée/sortie, valeur de variables déclarées, BAUD rate pour la communication série, etc.), et loop(), qui est répété jusqu'à extinction ou reset.
- Une variable doit être déclarée en fonction de la portée voulue : si elle n'est utilisée que dans une fonction, elle doit être déclarée dans la fonction (donc entre les accolades de la fonction). Sinon, elle doit être globale (donc en dehors de toute paire d'accolade), et elle sera accessible depuis n'importe quel bloc de code (il faut dans ce cas être archi-rigoureux pour éviter les problèmes).
- il n'est pas possible de déclarer ou d'implémenter une fonction à l'intérieur d'une autre. L'implémentation de la fonction peut se faire avant le code qui l'appelle (dans ce cas, elle est connue tout de suite), ou après le code en question. Sa déclaration doit être faite avant tout appel pour que le compilateur connaisse la fonction quand elle est appelée.

- La déclaration consiste à écrire le prototype de la fonction :

float fonctionCompterAleatoirement(float valeurInitiale);

- l'implémentation consiste à décrire les mécanismes internes de la fonction :

float fonctionCompterAleatoirement(float valeurInitiale)
{ // on ouvre le bloc correspondant à la fonction
   float increment = rand() % 3 - 1;
   valeurInitiale += increment;

   return valeurInitiale;
}

// OU

float fonctionCompterAleatoirement(float valeurInitiale)
{
   float increment = rand() % 3 - 1;
   return valeurInitiale + increment;
}

- Enfin, on peut appeler la fonction quand on en a besoin :

void loop()
{
    float valeurMesuree = analogRead(1);
    float resultat = fonctionCompterAleatoirement(valeurMesuree);

    Serial.println(resultat);
}

Dans loop, tu n'as que le droit de faire des appels à la fonction. Pas besoin de réécrire le code, le compilateur saura quoi mettre tant que la fonction est correctement déclarée et implémentée.

 

En dehors de ces rappels de syntaxe, il faut être clair sur la logique de ton programme : tu veux lire des capteurs et calculer une commande motrice pour te recentrer. L'exemple donné par Mike est intéressant : chacune des fonctions correspond à une de ces deux actions. L'une des fonctions utilise un return et pas l'autre, mais c'est un choix d'implémentation (comme celui de séparer lecture et calcul en deux fonctions).

 

la cela me semble vraiment compliqué  Du coups je ne comprends pas du tout cette partie en fait. 
 
On se situe bien dans le void Loop ?
 
Du coups à quoi sert computeInput ? Car si je comprend bien on le déclare avec int8_t et après je ne le retrouve pas  :wacko:

 


R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#34 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 07 août 2016 - 08:32

Merci pour vos retour les gars ! 

 

Demain en sortant du travail, je bosse sur le sujet à fond !

 

Ce qui est fou c'est au final comment un robot qui semble simple de fonctionnement (suivre une ligne). Utilise un programme complexe (à mes yeux de débutant). C'est passionnant ! :)



#35 yamovince

yamovince

    Habitué

  • Membres
  • PipPip
  • 300 messages

Posté 08 août 2016 - 09:39

Salut Guigz65,

Je compte m'inscrire aussi à la course de Toulouse mais dans la catégorie bipède.

Du coup je réfléchis aussi à un système suiveur de ligne. Si j'ai bien compris tu utilises 3 TCRT5000 reliés directement à un Arduino.

De mon côté, je vais essayer d'en accrocher sur les pieds de mon robot. Je pense plutôt utiliser des Seeed Grove puisqu'ils prétendent pouvoir capter jusqu'à 5cm.

Bonne continuation et j'espère à bientôt sur Toulouse !



#36 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 08 août 2016 - 11:54

Salut Yamovince,

 

Pour le moment j'utilise 5 TCRT5000 relié à l'arduino peut être 6 à voir.

 

Dans la catégorie bipède je voudrais essayer de présenter une version modifié de mon mobbob mais le temps joue contre moi car je suis surtout sur le robot roulant en ce moment (et le temps passe tréssssss vite !)



#37 yamovince

yamovince

    Habitué

  • Membres
  • PipPip
  • 300 messages

Posté 08 août 2016 - 12:53

Ce serait top de concourir avec un mobbob héhé

Je pense que 10m, ça va faire très long ... je parle aussi pour le mien ;)



#38 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 08 août 2016 - 06:38

bonsoir tout le monde, 

 

Grace à vos conseil, je commence à avoir quelque chose de sympa, j'arrive à gérer la rotation de mon servos moteur en fonction des valeurs renvoyées par computeImput  :Koshechka_08:

const int SEUILMINNOIR = 270;
const int SEUILMAXBLANC = 70;
  
uint8_t stateSensor[5];
int value;
int angle;

int sensorValueMillieu = 0;         // the sensor value
int sensorMinMillieu = 1023;        // minimum sensor value (min seuil noir)
int sensorValueDroite2 = 0;         // the sensor value
int sensorMaxDroite2 = 0;           // maximum sensor value (max seuil blanc)

int CapteurDroite2 = A5;
int CapteurMillieu = A3;

#include <Servo.h>
Servo Direction;
 
void setup()
{
 Serial.begin(115200);
 //Servos moteur de direction
 Direction.attach(10, 1230, 1500);
 

 while (millis() < 5000) {
    sensorValueDroite2 = analogRead(CapteurDroite2);
    sensorValueMillieu = analogRead(CapteurMillieu);
    if (sensorValueMillieu < sensorMinMillieu) {
      sensorMinMillieu = SEUILMINNOIR;
      
    }
    if (sensorValueDroite2 > sensorMaxDroite2) {
      sensorMaxDroite2 = SEUILMAXBLANC;  
 }
 }
 }
 
/****************Fonction readState**********************/////
 
void readState() {
  for (uint8_t i=1; i<6; i++) // i de 1 à 5 pour les capteurs de 1 à 5 capteur 1 mis sur A1 capteur 5 sur A5
  {
    value = analogRead(i); 
    if ( value> SEUILMINNOIR ) // dans ce cas on est sur du noir
    {
      stateSensor[i-1]=1; // i-1 car on commence un tableau à l'index 0 ... et ici i entre 1 et 5 
    }
    else if ( value<SEUILMAXBLANC ) // dans ce cas on est sur du blanc
    {
      stateSensor[i-1]=0; // à voir si il faut échanger 0 et 1 entre les deux lignes stateSensor en fonction de si on cherche du blanc ou du noir
    }
    else 
    {
      // Do nothing : on est entre 70 et 270 on ne sait pas sur quel couleur on est on garde l'état précédent 
    }
  }
}
 
 
/****************Fonction computeInput**********************/////
 
int8_t computeInput() {
 
  int8_t result=0;
  readState();  // appel de la fonction readState 
 
  for (int8_t i=0; i <5; i++ )
  {
    result = result +(i-2)*stateSensor[i];
  }
 
  return result;
}
 
 
// focntion principale
 
void loop() {
 
  int8_t essai = 0;
 essai = computeInput();
 
int angle = map(essai, -3, 3, 1230, 1500);

Direction.write(angle);

 }

Maintenant il faut que je m'attaque au pilotage du moteur :)



#39 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 192 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é 08 août 2016 - 06:55

mon petit doigt me souffle que plus la valeur absolue du  résultat de compute inpute est grande et moins il faut aller vite =)


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 ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#40 Guigz65

Guigz65

    Membre occasionnel

  • Membres
  • Pip
  • 137 messages
  • Gender:Male
  • Location:33 - Nord Gironde

Posté 08 août 2016 - 07:07

:) 

 

Le mien me dit d'utiliser la fonction SetSpeed et quelque chose comme "void defVitesse(int v)"     ... Mais bon il peut se tromper  :P





Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users