Aller au contenu


Photo
- - - - -

Projet de fin d'année Très important

Programmation 4wd sensor

  • Veuillez vous connecter pour répondre
74 réponses à ce sujet

#61 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 173 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é 26 avril 2019 - 07:51

Du coup, tu as bien un robot qui avance, qui s'arrête quand il détecte un obstacle puis tourne à droite pendant 2 secondes, puis soit il s'arrête à nouveau si il y a toujours un obstacle et tourne a nouveau, en boucle tant qu'il y a un obstacle, soit il repart en avant (dès qu'il ne détecte plus d'obstacle. 

C'est bien ça ? C'est le comportement que tu voulais ou pas?


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  

 

 

 


#62 Juventin19

Juventin19

    Nouveau membre

  • Membres
  • 38 messages

Posté 26 avril 2019 - 10:18

Du coup, tu as bien un robot qui avance, qui s'arrête quand il détecte un obstacle puis tourne à droite pendant 2 secondes, puis soit il s'arrête à nouveau si il y a toujours un obstacle et tourne a nouveau, en boucle tant qu'il y a un obstacle, soit il repart en avant (dès qu'il ne détecte plus d'obstacle. 

C'est bien ça ? C'est le comportement que tu voulais ou pas?

c'est bien ça.

 

A moitié car je veux que sa s'arrête puis il dit tourné a 360 degrés puis soit il s’arrête et il repart soit il part directement.

Pour qu'il tourne à 360 degrés, faut il changer le delay?

(je ne sais pas si on peut mettre une vidéo)



#63 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 173 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é 26 avril 2019 - 01:56

Pour mettre des vidéo ou tout autre type de contenu il y a ce lien qui explique comment faire

 

Sur le principe oui en mettant la bonne valeur de delay tu parviendra à faire faire un 360° complet au robot. Mais c'est pas la meilleur façon de faire si tu veux que ton robot fasse précisément 360° et pas approximativement environ 1 tour ... Pour cela tu peux utiliser des capteurs qui sont fait pour : des codeurs pour faire de l'odométrie ou bien un gyroscope pour mesurer la vitesse de rotation. 

 

Mais sur le principe pourquoi tu veux que ton robot fasse un tour sur lui même ? Si il y a un obstacle et qu'il fait un tour complet , le robot va se retrouver nez à nez avec ce même obstacle ... 


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  

 

 

 


#64 Juventin19

Juventin19

    Nouveau membre

  • Membres
  • 38 messages

Posté 26 avril 2019 - 02:50

Malheureusement je n'ai plus le temps d’utilisé un capteur, je fais quelque mesure pour un tour.

Le robot doit faire un parcours sur le sable plat avec un capteur ultrason pour le mur et le capteur d'humidité pour le sable mouillé.

voici le code entier:

#include "Ultrasonic.h"
Ultrasonic ultrasonic(7);
int sensorPin = A0;
int humidity = 0;
const byte vitesseMotAPin = 3;
const byte sensMotA1Pin = 5;
const byte sensMotA2Pin = 4;
const byte vitesseMotBPin = 11;
const byte sensMotB1Pin = 13;
const byte sensMotB2Pin = 12;
 
 
void setup () 
{ 
  Serial.begin(9600);
  pinMode(vitesseMotAPin, OUTPUT);
  pinMode(sensMotA1Pin, OUTPUT);
  pinMode(sensMotA2Pin, OUTPUT); 
  pinMode(vitesseMotBPin, OUTPUT);
  pinMode(sensMotB1Pin, OUTPUT);
  pinMode(sensMotB2Pin, OUTPUT);
  stop(); 
  delay(3000);
}
 
void stop()
{
  digitalWrite(vitesseMotAPin, LOW);
  digitalWrite(vitesseMotBPin,LOW);
}
 
void avance()
{
  digitalWrite(sensMotA1Pin,LOW); 
  digitalWrite(sensMotA2Pin,HIGH);
  digitalWrite(sensMotB1Pin,LOW); 
  digitalWrite(sensMotB2Pin,HIGH); 
  analogWrite(vitesseMotBPin,50);
  analogWrite(vitesseMotAPin, 50);
}
 
void droite()
{
  digitalWrite(sensMotA1Pin,LOW); 
  digitalWrite(sensMotA2Pin,HIGH);
  digitalWrite(vitesseMotBPin,LOW);
  analogWrite(vitesseMotAPin, 40);
  delay(2000);
}
 
void gauche()
{
  digitalWrite(sensMotB1Pin,LOW); 
  digitalWrite(sensMotB2Pin,HIGH); 
  analogWrite(vitesseMotBPin,40);
  digitalWrite(vitesseMotAPin, LOW);
  delay(2000);
}
 
void loop()
{
  long distance;
  distance = ultrasonic.MeasureInCentimeters();
  Serial.print("La distance est de: ");
  Serial.print(distance);
  Serial.println(" cm");
  humidity = analogRead(sensorPin);
  Serial.print("Moisture = " );
  Serial.println(humidity);
 
  if(humidity <= 100)
  {
    avance();      
  }
  else
  {
    stop();
    delay(1000);
    droite();
  }
  if(distance >= 20)
  {
    avance();      
  }
  else
  {
    stop();
    delay(1000);
    droite();
    
  } 
}

 

le parcours ainsi que la vidéo du robot en pièces jointes 

Fichier(s) joint(s)



#65 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 173 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é 26 avril 2019 - 10:17

Il sera très difficile de faire aller droit ton robot sans GPS, odometrie ou gyroscope ... ton robot n'a aucune info ... en gros il ne pourra que faire des allers retour entre mur et sable mouillé sans faire de trajets droits...


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  

 

 

 


#66 Juventin19

Juventin19

    Nouveau membre

  • Membres
  • 38 messages

Posté 26 avril 2019 - 10:57

Je vois mais quand si tu regarde la vidéo, pour quil tourne à droite jai bloqué les roues de gauche et il fait un démon tout mais ne revient pas sur ses pas, il attaque une autre ligne

#67 Juventin19

Juventin19

    Nouveau membre

  • Membres
  • 38 messages

Posté 30 avril 2019 - 02:48

Vous validez ?:)

#68 Romaric

Romaric

    Nouveau membre

  • Membres
  • 47 messages

Posté 30 avril 2019 - 02:59

En théorie tu as raison, mais malheureusement dans la pratique ton robot ne sera pas capable de faire un virage à 180° et le décalage que tu auras rendra tes trajectoires non parallèles.



#69 Forthman

Forthman

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 983 messages
  • Gender:Not Telling
  • Location:Montauban (82)

Posté 30 avril 2019 - 03:16

Comme le dit Mike, si tu n'a qu'une temporisation pour déterminer la position de ton robot ça ne fonctionnera pas.

 

si les roues étaient pilotées indépendamment et de type mécanum ça marcherait... presque.

 

Mais là le ripage donnera un résultat totalement différent suivant le terrain



#70 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 140 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 01 mai 2019 - 08:25

Donc en gros, il faut un module GPS?


Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#71 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 160 messages
  • Gender:Male
  • Location:Autriche

Posté 01 mai 2019 - 10:49

Donc en gros, il faut un module GPS?

Il faut une méthode de localisation qui s'appuie pas que sur la commande du robot mais sur des éléments de l'environnment. Donc soit la position GPS, soit une estimation par SLAM avec un laser ou une caméra par exemple.

L'autre technique (que je ne recommande pas ;) ), c'est des déplacements aléatoires dans la zone ; au bout d'un temps, le robot aura couvert tout l'espace, mais le temps tend à l'infini (et la crise écologique est déjà là). Voir la méthode des robots Roomba.


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

#72 Juventin19

Juventin19

    Nouveau membre

  • Membres
  • 38 messages

Posté 19 mai 2019 - 05:50

Finalement le robot tourne bien quand il y a un mur avec le capteur ultrason et même chose pour le capteur d'humidité.

Mais j'ai envie de encore améliorer, en effet j'ai remarqué que quand le robot détecte un mur il tourne (par exemple a droite) mais s'il rencontre un obstacle après avoir tourné, il retournera dans le même sens (à droite) et non dans l'autre sens (à gauche), il tournera en rond.

 

Mon professeur m'a proposé de faire une incrémentation, quand i=1 alors i+1 tourne  a gauche (je ne sais pas si c'est bon), 

 

Alors voici le code, le problème est que celui tourne a droite puis automatiquement il tourne a gauche, il avance pas (normalement  le robot doit détecte un obstacle il s’arrête il tourne à droite et avance mais la la roue de droite tourne puis la gauche puis la droite automatiquement)

#include <Ultrasonic.h>
Ultrasonic ultrasonic(7);
int sensorHum = A0;
int humidity = 0;
const byte vitesseMotAPin = 3;
const byte sensMotA1Pin = 5;
const byte sensMotA2Pin = 4;
const byte vitesseMotBPin = 11;
const byte sensMotB1Pin = 13;
const byte sensMotB2Pin = 12;
const int buttonPin = A2;
int buttonState = 0;
int i=0;
 
void setup () 
{ 
  Serial.begin(9600);
  pinMode(sensorHum,INPUT); 
  pinMode(buttonPin, INPUT);
  pinMode(vitesseMotAPin, OUTPUT);
  pinMode(sensMotA1Pin, OUTPUT);
  pinMode(sensMotA2Pin, OUTPUT); 
  pinMode(vitesseMotBPin, OUTPUT);
  pinMode(sensMotB1Pin, OUTPUT);
  pinMode(sensMotB2Pin, OUTPUT);
  stop(); 
  delay(3000);
}
 
void stop()
{
  digitalWrite(vitesseMotAPin, LOW);
  digitalWrite(vitesseMotBPin,LOW);
}
 
void avance()
{
  digitalWrite(sensMotA1Pin,LOW); 
  digitalWrite(sensMotA2Pin,HIGH);
  digitalWrite(sensMotB1Pin,LOW); 
  digitalWrite(sensMotB2Pin,HIGH); 
  analogWrite(vitesseMotBPin,30);
  analogWrite(vitesseMotAPin, 30);
}
 
void droite()
{
  digitalWrite(sensMotA1Pin,LOW); 
  digitalWrite(sensMotA2Pin,HIGH);
  digitalWrite(vitesseMotBPin,LOW);
  analogWrite(vitesseMotAPin, 40);
  delay(4500);
}
 
void gauche()
{
  digitalWrite(sensMotB1Pin,LOW); 
  digitalWrite(sensMotB2Pin,HIGH); 
  analogWrite(vitesseMotBPin,40);
  digitalWrite(vitesseMotAPin, LOW);
  delay(4500);
}
 
void loop()
{  
  long distance;
  distance = ultrasonic.MeasureInCentimeters();
  Serial.print("La distance est de: ");
  Serial.print(distance);
  Serial.println(" cm");
  humidity = analogRead(sensorHum);
  Serial.print("Le sable mouillé est de: " );
  Serial.println(humidity);
 
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) 
  {
    analogWrite(vitesseMotBPin,30);
    analogWrite(vitesseMotAPin, 30);
  if(humidity <= 100)
  {
    avance();      
  }
  else
  {
    stop();
    delay(1000);
    droite();
  }
  
  if(distance >= 55)
  {
   i=i+1;
    if (i>1)
    {
      avance(); 
      stop();
      delay(1000);
      droite();
    }     
  }
  else
  {
    avance(); 
    stop();
    delay(1000);
    gauche();
  } 
   }
    else 
    {
      digitalWrite(vitesseMotAPin, LOW);
      digitalWrite(vitesseMotBPin, LOW);
    }
}
 
voici la vidéo finale avec comme condition une plage parfaite sans obstacle 
 
ps: je tiens a vous remercier pour l'aide que vous m'avez a porté


#73 Amhnemus

Amhnemus

    Membre passionné

  • Membres
  • PipPipPip
  • 588 messages
  • Gender:Male
  • Location:Montigny-le-bretonneux

Posté 19 mai 2019 - 07:47

Et tu ne peux pas mettre 2 capteurs un de chaque côté pour la distance a droite et a gauche sinon la il tournera que a droite puisque tu met i=i+1 et tu n'a qu'une conditions pour le faire tourner et il tournera a droite et la suite de ton programme lui dit de tourner à gauche si la distance est inférieure a 55.

Pour ton soucis est qu'il te faut deux conditions une pour tourner a gauche et une pour tourner a droite. Si tu choisis l'incrementation pour varier les plaisirs il faut que tu fasse si i=1 il tourne a droite a la fin de ton programme de tourner a droite tu mets i++ donc a la fin d'avoir tourner a droite ton i vaudra 2 donc si tu rajoute une conditions qui dit que la distance est de ... et qu'il doit tourné et que i = 2 alors il tourne a gauche. Je sais pas si c'est clair mais pas envie de mâché tout ton boulot ;) mais si tu as besoin de plus d'explications je m'en ferais un plaisir
1ère place Robot Warrior 2019 humanoïdes autonome

#74 Juventin19

Juventin19

    Nouveau membre

  • Membres
  • 38 messages

Posté 20 mai 2019 - 08:31

Je vois un peu, donc je déclare ma variable i=0
Puis dans ma section void(droite) je rajoute un i++
Et je modifier le côté if(distance.. car je lui mettre une condition
Cest bien sa ?

#75 Amhnemus

Amhnemus

    Membre passionné

  • Membres
  • PipPipPip
  • 588 messages
  • Gender:Male
  • Location:Montigny-le-bretonneux

Posté 20 mai 2019 - 08:40

Ton if (distance ) te sers a faire ta condition pour tourner et il te faut un if (i= 0 ) pour tourner a droite et un if (i=1) pour tourner a gauche dans ton void droite tu met i++ pour lui dire que tu as déjà tourner a droite et dans ton void gauche sois tu met i= 0 sois i-- pour dire que tu as déjà tourner a gauche. C'est a paufiner je te laisse le soin mais tu as compris effectivement après c'est comme ça que je ferais pas forcément la meilleure cela pourra peut être t'inspirer.

Tu peut aussi te faire 2 if (distance et i = ) un pour tourner a droite et un autre a gauche ça serait mieux je pense et t'es pas obligé de rajouter dans ton void l'incrementation de i tu peux le mettre après ton appel de fonction ça serait mieux.

Après c'est ma façon de voir les choses. Bon courage et très sympa ton projet pas tout lu mais bien envie de lire et de le réaliser aussi mais plus tard
1ère place Robot Warrior 2019 humanoïdes autonome





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

0 members, 0 guests, 0 anonymous users