Aller au contenu


Photo
* * * * * 1 note(s)

Probleme de code


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

#1 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 31 janvier 2014 - 08:38

Bonjour,
Mon robot autonome "evolubot" est actuellement bloqué au niveau du code,
je m'explique:
Je voudrais que mon robot,quand il detecte un obstacle,doit tourner,mais,
j'ai beau essayer et reesayer plusiuer code deuis une semaine,
il m'est impossible de reussir a arreter un moteur quand mon capteur detecte un "mur".
S'il vous plait pourriez vous m'aidez avec mon code?
#include <Servo.h>
// Pin de controle du module HC-SR04
Servo myservoR; // servo droit
Servo myservoL; // servo gauche
  
const int trigPin = 3;
const int echoPin = 2;
// Pin pour la LED verte
const int greenLEDPin = 10;
// Pin pour la LED rouge
const int redLEDPin = 12;
// Pin pour le buzzer
const int buzzerPin = 7;
// Distance minimale correcte
const int min_dist = 200;
// Distance pour declancher l alerte
const int alerte_dist = 100;
// Variable pour la distance calculee
long distance;

// Fonction pour le parametrage
void setup()
{
  myservoR.attach(5); 
  myservoL.attach(6);
  // Initialisation des broches
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(greenLEDPin, OUTPUT);
  pinMode(redLEDPin, OUTPUT);
  pinMode(buzzerPin,OUTPUT);
  // Definition de la vitesse de transmission pour la console
  Serial.begin(9600);
}

// Fonction de boucle
void loop()
{
  // Duree du signal emis par la sonde. Il y a un aller et un retour
  int duree;
  // Activation de la sonde
  digitalWrite(trigPin, HIGH);
  // Attente
  delayMicroseconds(1000);
  // Desactivation de la sonde
  digitalWrite(trigPin, LOW);
  // Demande de la duree a la sonde
  duree = pulseIn(echoPin, HIGH); 
  // Calcul en centimetre (division par 2 pour un aller simple puis par 29 la distance parcourue par micro seconde)
  distance = duree/58;

  if (distance >= min_dist || distance <= 0) {     Serial.print(distance);     Serial.println(" hors limite");   } else {     Serial.println(distance);     if(distance >0 && distance < alerte_dist)     {       blink(distance, redLEDPin, true);     }     else if(distance >= alerte_dist)
    {
      blink(distance, greenLEDPin, false);
      
      
    }
    if (20 <= distance)
    {
      myservoL.writeMicroseconds(1000);
      myservoR.writeMicroseconds(100);
      delay(100);
      myservoR.writeMicroseconds(1000);
      myservoL.writeMicroseconds(1000);
  }
  }
}
// Fonction pour faire clignoter une LED en fonction de la distance detectee
// Le buzzer peut etre active

void blink(int pause, int ledPin, int buzzer)
{
  pause = distance * 10;
  digitalWrite(ledPin, HIGH);
  if (buzzer) digitalWrite(buzzerPin,HIGH);
  delay(10);
  digitalWrite(ledPin, LOW);
  if (buzzer) digitalWrite(buzzerPin,LOW);
  delay(pause);
}
Merci d'avance,
Rbot99
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#2 olivthill

olivthill

    Membre occasionnel

  • Membres
  • Pip
  • 143 messages
  • Gender:Male
  • Location:Normandie
  • Interests:Robots humanoides.

Posté 31 janvier 2014 - 11:11

1. Le code est peu lisible.
2. Il manque des lignes de code disant au robot de s'arrêter quand il est proche du mur.
3. Les instructions pour faire bouger les servos ne sont pas bonnes.

1. Le code est peu lisible

Argh, la longue ligne au milieu.
J'ai tout de même réussi à la lire, pour finalement m'apercevoir qu'elle ne fait que déclencher l'allumage de diodes.

La ligne suivante est écrite à l'envers (je sais que certains profs rebelles aiment bien ce genre d'acrobaties pour éviter le piège de la confusion entre le signe égal et le double signe égal, mais lorsqu'il a une relation d'ordre au lieu d'une relation d'égalité, l'inversion n'a aucune justification).
if (20 <= distance) {
La ligne est beaucoup plus lisible en la mettant à l'endroit, ce qui donne :
if (distance > 20) {
Et puis, il faut faire un minimum d'efforts pour indenter correctement les lignes, pour mettre un espace et un seul entre if et la parenthèse qui suit, etc.

2. Il manque des lignes de code disant au robot de s'arrêter quand il est proche du mur.

La seule partie dans le code qui contrôle du mouvement est :
if (distance > 20) {
         myservoL.writeMicroseconds(1000);
         myservoR.writeMicroseconds(100);
         delay(100);
         myservoR.writeMicroseconds(1000);
         myservoL.writeMicroseconds(1000);
      }

Il manque des lignes de code disant au robot de s'arrêter quand il est proche du mur, lorsque la distance est inférieure ou égale à 20 centimètres.

3. Les instructions pour faire bouger les servos ne sont pas bonnes

Je suppose que ce sont des servos à rotation continue.
Ces servos ne fonctionnent que sur la plage de fréquence de 1000 à 2000 Hz.
Donc la ligne suivante n'a aucun sens.
myservoR.writeMicroseconds(100);

Pour arrêter un servomoteur à rotation continue, il faut lui envoyer
myservoR.writeMicroseconds(1500);
Si on ne fait pas ça, le servomoteur continue toujours d'avancer en suivant son ancienne instruction.

Pour arrêter ce robot qui avance par deux servomoteurs, il faut lui envoyer
myservoR.writeMicroseconds(1500);
         myservoL.writeMicroseconds(1500);


#3 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 31 janvier 2014 - 11:33

Merci de ta réponse
Mes servo sont a rotation normal mais je les ai débridé (se sont de Gower pro 995)
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#4 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 31 janvier 2014 - 11:42

Malheureusement,
Cela ne fonctionne pas,
Je continue mes recherches
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#5 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 31 janvier 2014 - 09:05

Désolé du triple post,
Mais si il vous plait,
Aidez moi,
J'ai passe plus d'une semaine a chercher en vain...
Ça va être ma deuxième nuit blanche
Édit:
Svp,
Je vais vraiment m'arracher les cheveux :(
Si je ne trouve pas rapidement je vais être chauve a 14 ans ^^
Merci d'avance
Alex
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#6 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 01 février 2014 - 09:47

Up!
Pitié aidez un pauvre petit internautes dans le besoin qui ne réussit pas a terminer son code,
Je sais que j'ai un mauvais passif sur le forum mais svp aidez moi :(
J'ai vraiment besoin d'aide
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#7 R1D1

R1D1

    Modérateur et Membre passionné

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

Posté 01 février 2014 - 02:52

Up!
Pitié aidez un pauvre petit internautes dans le besoin qui ne réussit pas a terminer son code,
Je sais que j'ai un mauvais passif sur le forum mais svp aidez moi :(/>
J'ai vraiment besoin d'aide


Fais des tests unitaires : débranche tout ce qui n'est pas ton servo, dans ton code, n'écris que ce qui est nécessaire à le piloter. Ca facilitera le débugguage.
Cherche le neutre de ton servo : je suppose que tu as fait un truc comme ça pour le modifier. Selon les resistances que tu as mis, le neutre n'est pas exactement la valeur médiane des angles possibles. D'ailleurs, pourquoi travailler sur la valeur de l'impulsion et pas l'angle directement ?
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#8 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 01 février 2014 - 03:41

On ta deja dit que t'étais intelligent?
Je n'est pas remplacer mon potar,je l'est juste mis en dehors du cache qui l'entraine,
Ce qui fait que des que je bouge le moteur le potar peut bouger un peut.
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#9 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 02 février 2014 - 01:07

J'ai mes valeur neutres,
Je vais faire d'autre test mais si vous avez une idée,
Svp marquez la.
Cordialement
Alex
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#10 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 02 février 2014 - 09:18

Déjà, merci de ne pas faire de double posts à moins de 5 jours d'invervale !! Si tu as un autre message à poster, alors édite ton message !
Secondo, on n'est pas payé pour te répondre dans la seconde et il n'est pas rare qu'il se passe plusieurs jours avant qu'on te réponde, donc ça ne sert à rien de s’exciter comme ça ! Soit patient !

Bonjour,
Mon robot autonome "evolubot" est actuellement bloqué au niveau du code,
je m'explique:
Je voudrais que mon robot,quand il detecte un obstacle,doit tourner,mais,
j'ai beau essayer et reesayer plusiuer code deuis une semaine,
il m'est impossible de reussir a arreter un moteur quand mon capteur detecte un "mur".
S'il vous plait pourriez vous m'aidez avec mon code?


Tu as bien un capteur ultrason branché sur les pin 2 et 3 ?
Et tes servo moteurs sur les pin 5 et 6 ?

Mon site internet : http://ferdinandpiette.com/


#11 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 02 février 2014 - 09:59

Tu as bien un capteur ultrason branché sur les pin 2 et 3 ?
Et tes servo moteurs sur les pin 5 et 6 ?

Oui mes moteur ANSI que mes capteur son correctement branché.
Après je pensais que je pourrais utiliser:
myservo.writeMicroseconds(1000)
Puis
myservod.détach() pour arrêter mes moteurs
Et
myservo.attach(pin) pour les redémarrer
Vous en pense quoi?
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore

#12 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

Posté 02 février 2014 - 10:30

Après je pensais que je pourrais utiliser:
myservo.writeMicroseconds(1000)
Puis
myservod.détach() pour arrêter mes moteurs
Et
myservo.attach(pin) pour les redémarrer
Vous en pense quoi?


Mauvaise idée. Il vaut mieux envoyé explicitement la commande d'arrêt au moteur plutôt que de désactiver le module servomoteur.
Regarde le message de olivthill : c'est très bien expliqué.

Mon site internet : http://ferdinandpiette.com/


#13 Leon

Leon

    Membre passionné

  • Membres
  • PipPipPipPip
  • 1 289 messages
  • Gender:Male

Posté 02 février 2014 - 10:38

Après je pensais que je pourrais utiliser:
myservo.writeMicroseconds(1000)
Puis
myservod.détach() pour arrêter mes moteurs
Et
myservo.attach(pin) pour les redémarrer
Vous en pense quoi?

Pourquoi ne pas essayer tout simplement? Tu sais, c'est ça bricoler : essayer des trucs, voir si ça marche ou pas.
Avec des servos analogiques, ça risque de fonctionner. Et contrairement à BlackTemplar, je pense que ça peut être une bonne solution. "Detach" revient juste à arrêter d'émettre des tops.
Mais avec des servos numériques, c'est peu probable que ça fonctionne, car ils gardent en mémoire la dernière consigne, pendant au moins quelques dixièmes de secondes.

Leon.

BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)


#14 rbot99

rbot99

    Membre passionné

  • Membres
  • PipPipPip
  • 514 messages
  • Gender:Male

Posté 03 février 2014 - 04:56

Pourquoi ne pas essayer tout simplement? Tu sais, c'est ça bricoler : essayer des trucs, voir si ça marche ou pas.
Avec des servos analogiques, ça risque de fonctionner. Et contrairement à BlackTemplar, je pense que ça peut être une bonne solution. "Detach" revient juste à arrêter d'émettre des tops.
Mais avec des servos numériques, c'est peu probable que ça fonctionne, car ils gardent en mémoire la dernière consigne, pendant au moins quelques dixièmes de secondes.

Leon.


@black:
J'ai essayer se que me disais olivthil mais ,je ne sais pas si s'est mon code qui n'interraqgit pas correctement avec l'instruction: servo.writeMicroseconds();

@leon:
Merci ;)
Ce coup ci, je tiens les bon bout!
Pour le moment quand je passe la main devant le capteur;
Le m?moteur se met a tourner!
Je n'ai plus qu'a inverser le mouvement.
Je pense faire un if pour l'arrêter et un else pour le demarer
Cdlt
Alex
N'entretiens pas l'espoir de ce qui ne peut être espéré , Pythagore




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

0 members, 1 guests, 0 anonymous users