Aller au contenu


Photo
- - - - -

aide programmation


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

#1 axelou19

axelou19

    Membre

  • Membres
  • 21 messages
  • Gender:Male

Posté 25 novembre 2011 - 05:25

bonjour

j'ai deux problèmes:

-le premier étant que je ne comprend pas les valeurs des capteur Sharp
pourquoi la valeurs 180 signifie 10 cm et la valeur 100 signifie 30 cm??

-mon deuxième problème est que je voulait modifier roddy pour qu'il tourne en rond tout le temps et que quand il repère
un objet il le suive en gardant sa distance , si l'objet s’approche de roddy il reculera et si l'objet s’éloigne il le suivra.

j ai essaye de modifier le code original de roddy pour qu'il fasse ce que je voulait mais en vain
je n'y arrive pas! :(


pourriez-vous m'aidez pour mes 2 problèmes.
merci d'avances.

axelou19

#2 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 210 messages
  • Gender:Male
  • Location:Aquitaine,Gironde

Posté 25 novembre 2011 - 05:52

Salut, pour la capteur, il te renvoi une valeur qui correspond a la distance, tu peut lui faire sortir des cm avec une petite operation .

quand il repère
un objet il le suive


Ceci ne marche qu'en exterieur ou dans des zones degagé, par ce que si il detecte un objet (meuble) et qu'il le sui, ca va etre problematique !!


cherche, il y a un sujet recent similaire de seb03000 sur le fofo.

 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#3 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 25 novembre 2011 - 09:08

Bon commençons par le début

pourquoi la valeurs 180 signifie 10 cm et la valeur 100 signifie 30 cm??


Tout simplement parceque la distance est inversement proportionnelle a la valeur retournée ar le capteur...
te dire ou chercher a comprendre pourquoi n'a pas vraiment d’intérêt.
Il faut le savoir c'est tout.
En plus, si tu regarde bien les valeurs ne sont pas linéaires.
Donc la meilleur facon de proceder et te re creer un tableau.
Pour cela,
- Tu te met face à un mur
- Tu prend une longueur de Scotch ou de bande adhésive quelconque
- Tu la colle perpendiculairement à ton mur sur le sol
- Tu la gradue en en Cm (ou tu fixe un mettre à ruban au sol)
- Tu positionne ton robot avec le capteur face au mur
- Tu renvois la valeur renvoyée par le capteur sur le Serial monitor
- Tu avance progressivement ton robot du mur en notant les valeurs retournées en fonction de la distance par rapport au mur.
- Tu note ces valeurs et tu saura exactement quelle valeur tester en fonction de la distance à laquelle tu souhaites une réaction.

Je me suis fais ca avec différents modèles de capteur IR Sharp et différents modèles de capteur US.
Je me suis même amusé a afficher la valeur retournée sur un écran LCD.

Je garde précieusement ces valeurs et je sais exactement
- Quelle est la plage de précision de mes capteurs
j'ai une échelle précise pour chaque capteur ce qui me permet de tester la valeur souhaité en fonction de la distance a laquelle je souhaite declancher une action.

Mais savoir pourquoi tant de volt a telle distance n'est pas un réel problème à mon avis.

Pour ta deuxième question, difficile de te répondre sans voir ton code.
Mais si tu veux que ton robot tourne en rond, il suffit qu'un des deux moteurs tourne plus vite que l'autre.

Cdlt
Yves

 


#4 axelou19

axelou19

    Membre

  • Membres
  • 21 messages
  • Gender:Male

Posté 25 novembre 2011 - 10:06

merci beaucoup Astondb8 pour ton aide sur les capteur et pour ce qui est du code je suis sur le code de roddy et j'arrive a faire tourner le robot en rond mais pas a ce que quand il détecte un objet il le suive , il continue de tourner en rond .


voila le code original:


int #include <Servo.h>
 
#define AVANT 1
#define ARRIERE 0
#define GAUCHE 2
#define DROITE 3
 
#define SERVOG 1
#define SERVOD 0
 
#define UPDDG 3
#define UPDDD 4
 
#define SHARP 4
 
#define VMAX 5
 
Servo servog;
Servo servod;
 
int vLdr = 5;
 
int getNeutral(int s)
{
  if(s == SERVOG)
    return 86;
  else
    return 84;
}
 
 
void handleS(int s, int speed)
{
  //Vitesse :
  // 0 -> 0; 1 -> 1; 2 -> 3; 3 -> 8; 4 -> 10; v => 5 -> 30
  int tab[6] = {0,1,3,8,10,30};
  int pos = getNeutral(s);
 
  int acc;
  if (speed < 0)
    acc = - tab[abs(speed)];
  else
    acc = tab[speed];
   
  if(s == SERVOG)
      servog.write(pos += acc);
  else
      servod.write(pos -= acc);
}
 
 
void move(int direction)
{
  int m1 = 0, m2 = 0;
  switch(direction)
  {
    case DROITE: m1 = 1; m2 = -1; break;
    case GAUCHE: m1 = -1; m2 = 1; break;
    case AVANT: m1 = 1; m2 = 1; break;
    case ARRIERE: m1 = -1; m2 = -1; break;
  }
  handleS(SERVOG, m1*VMAX);
  handleS(SERVOD, m2*VMAX);  
}  
 
void handleUPDD(int updd)
{
  if(digitalRead(updd) == HIGH)
  {
    move(ARRIERE);
    delay(500);
   
    if (updd == UPDDG)
    {
      move(DROITE);
    }
    else
    {
      move(GAUCHE);
    }
     delay(800);
  }
}
 
void sharp()
{
   int v =  analogRead(SHARP);
      if (v >= 180)
      {
        move(ARRIERE);
        delay(300);
        move(DROITE);
        delay(900);
      }
      else if (v >= 100)
      {
        handleS(SERVOG, VMAX);
        handleS(SERVOD, 0);
        delay(1500);
      }
}
void setup()
{
  pinMode(UPDDG, INPUT);  
  pinMode(UPDDD, INPUT);
 
  Serial.begin(9600);
  servog.attach(10);
  servod.attach(9);
  move(AVANT);
}
 
void loop()
{
     handleUPDD(UPDDG);
     handleUPDD(UPDDD);
     sharp();
     move(AVANT);
    delay(100);
}


et voila le code que j'ai essaye de faire mais qui ne marche pas ( j'ai supprimer les micro-rupteur, jai modifier vood sharp() et jai modifier vood loop() pour qu'il tourne en rond au debut)


int
#include <Servo.h>
 
#define AVANT 1
#define ARRIERE 0
#define GAUCHE 2
#define DROITE 3
 
#define SERVOG 1
#define SERVOD 0
 
#define SHARP 4
 
#define VMAX 5
 
Servo servog;
Servo servod;
 
int vLdr = 5;
 
int getNeutral(int s)
{
  if(s == SERVOG)
    return 86;
  else
    return 84;
}
 
 
void handleS(int s, int speed)
{
  //Vitesse :
  // 0 -> 0; 1 -> 1; 2 -> 3; 3 -> 8; 4 -> 10; v => 5 -> 30
  int tab[6] = {0,1,3,8,10,30};
  int pos = getNeutral(s);
 
  int acc;
  if (speed < 0)
    acc = - tab[abs(speed)];
  else
    acc = tab[speed];
   
  if(s == SERVOG)
      servog.write(pos += acc);
  else
      servod.write(pos -= acc);
}
 
 
void move(int direction)
{
  int m1 = 0, m2 = 0;
  switch(direction)
  {
    case DROITE: m1 = 1; m2 = -1; break;
    case GAUCHE: m1 = -1; m2 = 1; break;
    case AVANT: m1 = 1; m2 = 1; break;
    case ARRIERE: m1 = -1; m2 = -1; break;
  }
  handleS(SERVOG, m1*VMAX);
  handleS(SERVOD, m2*VMAX);  
}  
 
 
void sharp()
{
   int v =  analogRead(SHARP);
      if (v >= 180)
      {
        move(ARRIERE);
      }
      else if (v <= 180)
      {
        move(AVANT);
      }
}
void setup()
{

  Serial.begin(9600);
  servog.attach(10);
  servod.attach(9);
  move(AVANT);
}
 
void loop()
{

     sharp();
     move(AVANT);
    delay(100);
}


#5 axelou19

axelou19

    Membre

  • Membres
  • 21 messages
  • Gender:Male

Posté 28 novembre 2011 - 06:25

personne pour m'aider :(

#6 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 29 novembre 2011 - 03:34

personne pour m'aider :(


Bonsoir

Pour répondre a cette question ainsi qu'au MP je vais tacher de te donner une réponse satisfaisante (du moins je l’espère) Mais je ne répond jamais en MP a des questions qui ne sont pas de l'ordre privé. Les réponses quelles quelles soient sont faites pour être partagées.

Donc, Comment tester un capteur Sharp et écrire un code ne prenant en compte que ce capteur. et renvoyer le rendu sur le Serial Monitor.

Il te faut en premier lieu,
Faire un branchement de ton capteur sur une pin analogique (par exemple la Pin A0)
Bien sur alimenter ta carte (dans ce cas l'USB est suffisant)
et si tu choisie un autre type d'alimentation connecter le câble USB a ton PC.
Ce câble devra rester branché tout au long des tests puisque c'est par lui que transiteront les informations vers le Serial Monitor.

Voila pour les Branchements (simple non ?)

Ensuite, il faut écrire le code (est c'est pas bien plus compliqué)

De quoi as tu besoin ?

Déclarer la Pin A0 en entrée
Déclarer une variable qui va contenir la lecture du capteur
Déclarer l'ouverture du du port Com (en lui donnant une vitesse de transfert)
Afficher la valeur retournée par le capteur (donc le contenu du capteur) sur le Serial Monitor
Boucler cette action en donnant un temps de répétition ?

Voila c'est tout

donc
Comment déclarer la Pin A0 en entrée ?
Comment clavarder une variable ?
Comment ouvrir le Port Com ?
Comment afficher la valeur de la variable sur le Serial Monitor ?
Comment boucler cette action toute les demies secondes par exemple ?

Traduit en code ça donnerait :
int sensorVal = 0; // initialise une variable appelée "sensorVal" et lui donne la valeur 0
sensorVal = analogRead(0); // Met la lecteur de la Pin A0 dans la variable "sensorVal"
Serial.begin(9600); // Ouvre le port Com et lui affecte une vitesse de transfert de 9600 Baude/s
Serial.println(sensorVal); // Affiche sur le Serial Monitor le contenu de la variable sensorVal et retourne à la ligne
delay(500); // attend 500 millisecondes (oit 1/2 seconde) avant de poursuivre l’exécution du code.

Voila donc les lignes de code dont tu as besoin pour effectuer ce test.

Reste a savoir ou le mettre dans ton Sketch

Certaines de ces commandes sont des commandes d’initialisation et ne doivent etre exécutées qu'une seule fois
D'autres doivent être bouclées pour être répétées

Il y a deux fonctions que nous retrouvons dans presque tous les programmes Ardiono
void setup()
et
void loop()

Tu as 99% de ton code. Je dirais même 100%
Il te reste à mettre ces lignes dans ton Sketch

A toi de jouer ;)
Si je te fais tout ce ne sera pas pédagogique non ?
Le but étant que tu apprennes et que tu ne fasse pas un simple copié collé.

Je n'en ferais pas un Tuto car ce qu'il y a de mieux dans le genre a été fait par Julien (Luj sur Pobot)

Mais tu te rendra rapidement compte que ces capteurs fonctionne bien mieux avec un antiparasite
Voici un autre Tuto de Julien sur la pose de cet antiparasite

Toujours par Julien, voici un autre Tuto pour utiliser deux capteurs Sharp sans qu'ils ne se perturbent mutuellement.

Je te donne des Lien Pobot, mais ce ne sont que des exemples. Google te donnera des dizaines de réponses et des dizaines de codes. Toute l'info est là, il suffit de la chercher ;)

Cdlt
Ybes

 


#7 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 29 novembre 2011 - 10:24

Que dire de plus..........parfaite très bien expliqué! ^_^

#8 axelou19

axelou19

    Membre

  • Membres
  • 21 messages
  • Gender:Male

Posté 29 novembre 2011 - 08:46

merci encore
j'ai trouver le donc et j'ai donc put tester mon capteur et connaître ses valeurs
j'ai aussi regarder le site pobot qui est assez instructif au sujet de la robotique.

encore merci




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

0 members, 0 guests, 0 anonymous users