Aller au contenu


Photo
- - - - -

Problème Urgent avec Roby


32 réponses à ce sujet

#1 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 14 janvier 2011 - 10:25


Si je vous envoie ce message aujourd'hui, c'est parce que j'ai un gros problème.

En effet, je suis en ère S SI, et comme chaque année, il nous faudrait faire un tpe, et moi, j'ai donc choisi un sujet qui me tient à coeur : la robotique.

Je suis donc en train de réaliser le robot "Roby" : mais il y a quelques modifications : mes servomoteur ne sont pas modifiés, car ils sont à rotation continue (n'ont pas de butée). De plus, je ne souhaite pas mettre sur le robot des capteurs de contact, seulement un capteur infrarouge.

Ensuite, j'ai réalisé donc un câblage sur ma plaque d’essai, exactement comme sur le schéma ci joint, mais ce n'est peut être pas bon.

Pouvez vous m'aider ?

Sachant qu'il me faut rendre le TPE dans 3 semaines !


Merci par avance

Valentin SYLVAIN[/left]

#2 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 14 janvier 2011 - 11:08

Tu n'as pas joint ton schéma. Tu n'as pas joint ton programme. Tu n'expliques toujours pas ta panne...
Qu'est-ce qui ne marche pas ?

Je me demande bien pourquoi je prends la peine de répondre à ton message privé si c'est pour que tu ne fasses pas ce que je te dis. :o
Bon après c'est pour toi hein... Si tu veux des réponses, sois plus explicite.

#3 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 09:29




Image IPB



Voici mon image, seule petite erreur, j'ai noté capteur de contact, mais en fait, c'est un capteur infrarouge.



Je vous joint ensuite mon programme :







#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);

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);

}[/code]









Ensuite, j'utilise un capteur infrarouge de 30 à 150 cm (capteur Sharp)

Après, pour le problème, je ne sait pas d'ou cela peut provenir. A noter que ma carte arduino est alimenté comme il se doit (la LED verte s'allume) lorsque j'ai tout branché.



J'ai testé tout les composants à part, ils marchent tous.



Peut etre que le schéma que j'ai fait présente des erreurs.



Merci tout de même de votre aide !





PS : Désolé pour hier soir, c'est vrai que mon message de forum était incomplet.

#4 lordcuty

lordcuty

    Habitué

  • Membres
  • PipPip
  • 298 messages

Posté 15 janvier 2011 - 11:16

alors d’abord
[/code]
sa permettra plus de lisibilité

#5 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 15 janvier 2011 - 11:31

Pour moi, il y a une erreur dans ton schéma.
Pourquoi pars-tu des sorties PWM 3 et 4 de l'arduino pour arriver sur l'alimentation (5V) du capteur ?

Les deux parties en oranges sont à enlever, selon moi. Elles servaient pour les capteurs de contacts. Mais si tu décides de les enlever, tu dois aussi enlever le cablage qui allait avec et pas le rebrancher n'importe où.

#6 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 11:52


Mais je vais essayer de tirer cette partie du circuit.

Ensuite, pensez vous que le capteur infrarouge est bien branché ?

Y a t'il d'autres erreurs pour vous (dans le code ou le câblage) ?[/left]

#7 alex54-RX

alex54-RX

    Membre

  • Membres
  • 37 messages
  • Gender:Male

Posté 15 janvier 2011 - 12:08

Bonjour,



Moi j'aurais plus tôt fais sa pour le schéma :






Puis pour le code :



#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);

delay(300);

move(DROITE);

delay(900);

}

else if (v >= 100)

{

handleS(SERVOG, VMAX);

handleS(SERVOD, 0);

delay(1500);

}

}

void setup()

{







Serial.begin(9600);

servog.attach(10);

servod.attach(9);

move(AVANT);

}



void loop()

{



sharp();

move(AVANT);

delay(100);

}[/code]



#8 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 12:12


Je vais donc essayer de faire ce montage. En espérant fortement qu'il marche.

Et pour la partie programmation ? Est ce que c'est bon ?[/left]

#9 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 12:22


En parlant de programmation, est ce que je dois entrer les valeurs de mon capteur lorsqu'il est à 10 mètres, et celle de mes servomoteur pour lorsqu'ils sont à l'arrêt ?

Un grand merci à toi Alex.

PS : As tu déjà construit ce robot ?[/left]

#10 alex54-RX

alex54-RX

    Membre

  • Membres
  • 37 messages
  • Gender:Male

Posté 15 janvier 2011 - 12:22

Pour la partie programmation je pense que c'est bon

Oui j'ai construit ce robot mais moi j'ai le capteur infrarouge,les capteur a contact puis j'ai rajouté des effets lumineux.

Les valeurs du capteurs dans le code sont ceux du tuto pour faire roby .



Voila ce qui est dit dans le tuto pour Roby : si v était supérieur à 180 (obstacle à 10 cm), alors il fallait reculer pour éviter l'obstacle, alors que si v est supérieur à 100 (obstacle à 30 cm) il suffisait de ralentir d'un coté pour éviter l'obstacle.



J’espère que sa marchera.Mais je ne comprend toujours pas ton problème ?

#11 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 12:35


C'est peut être ici ou sa peut bloquer, vu que l'on à laissé la valeur 180 (10 cm), alors qu'il ne pourra pas détecter. Il ne faudrait pas changer de valeur, et la remplacer par 100 (30 cm).

Ou au pire, on mets exactement le même capteur, mais il faudra en acheter un autre, parce que je trouve sa un peut bête de reculer quand on a un obstacle à 30 cm devant soit.

Ou alors, on supprime le mode "reculer".[/left]

#12 alex54-RX

alex54-RX

    Membre

  • Membres
  • 37 messages
  • Gender:Male

Posté 15 janvier 2011 - 12:40

Ah oui en effet j'avais pas vu que ce n'était pas le même :)

Pour remplacer les valeur c'est simple puis si tu ne veut pas qu'il recule quand il y'a un obstacle a 30cm ben faut juste supprimer.Donc il faut remplacer (v >=180) et (v >=100).Après cela dépend à combien de distance tu veut qu'il détecte.


{

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);

}

}[/code]



#13 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 12:47


Sinon, je le ferai enclencher le virage à 30 cm de l'obstacle, et je supprimerai la fonction qui le fait reculer.

Je voulais juste savoir : à quoi bon mettre une fonction pour qu'il recule si il est à 10 cm de l'obstacle, alors que logiquement il l'évite à 30 cm ?[/left]

#14 alex54-RX

alex54-RX

    Membre

  • Membres
  • 37 messages
  • Gender:Male

Posté 15 janvier 2011 - 12:51

ça je ne sais pas,sinon pour le code ça va ou pas ?

#15 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 01:01

Ben écoute, je te dirai ça lundi, vu que mon robot est au lycée, et que je vais le modifier lundi.

Merci quand même pour tous, je pense que sa va bien m'aider.

#16 lordcuty

lordcuty

    Habitué

  • Membres
  • PipPip
  • 298 messages

Posté 15 janvier 2011 - 01:10

alors obstacle à 10cm, c'est un obstacle qui apparaît brutalement(ta chaussure...)
pour 40 il faut que tu calibre ton détécteur et que tu remplace la valeur donnée par celle à 40cm:
tu mesure sa te donne une valeur, tu la mets à la place de 30cm
bref essaie de calibrer ton capteur

#17 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 01:15

Sa marche, je pense que je vais faire comme sa.

#18 alex54-RX

alex54-RX

    Membre

  • Membres
  • 37 messages
  • Gender:Male

Posté 15 janvier 2011 - 01:18

Ok tu nous dira lundi,bonne chance :) .

#19 valentin81320

valentin81320

    Membre

  • Membres
  • 17 messages

Posté 15 janvier 2011 - 01:26

OK en tout cas, un gros merci à vous.

#20 zeqL

zeqL

    Membre passionné

  • Membres
  • PipPipPip
  • 393 messages
  • Gender:Male

Posté 15 janvier 2011 - 02:27

Tu regarde la datasheet du capteur, tu auras la courbe de tension en fonction de la distance.

Sinon plus simple tu code un petit programme pour tester les valeurs de retour de ton capteur selon la distance.



Répondre à ce sujet



  


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

0 members, 0 guests, 0 anonymous users