Go Down

Topic: Code qui boucle en permanence (Read 6496 times) previous topic - next topic

lesept

Les clignotements, ce n'est pas normal. Mais quelle version utilises-tu ? Moi je n'ai nulle part dans ma version le message
Code: [Select]
Moteur gauche ok , Moteur droit arrété

Pour le test sans obstacle, je vois que dfgh a fait une modif, que je défais...
Code: [Select]
  // Les tests
  // if (BtnContactG && !VirageG && BtnContactD && !VirageD  && cm >= DistMax)
  if (BtnContactG && BtnContactD && cm >= DistMax)
et j'ajoute:
Code: [Select]
  { // Pleine eau
    state = AvantToute;//=1
    chrono1 = millis();
    chrono2 = millis();
    VirageD = false;
    VirageG = false;
  }


Pour qu'on ait tous les deux la même version, voici mon code:
Code: [Select]
#include <Ultrasonic.h>
Ultrasonic ultrasonic(8, 7);

// paramètres
#define DistMin 15  // cm : distance minimale
#define DistMax 50  // cm : distance maximale

// constants set pin numbers:
const int DetecteurPin1 = 2;  // the number of the pushbutton pin  le numero du pin du bouton  commande automatique(presse-bouton)
const int DetecteurPin2 = 4;
const int moteur_D =  3;      // the number of the motor pin    le numero du pin du moteur
const int moteur_G = 11;

// Liste des états et déclaration des variables états courant et précédent
enum States {AvantToute, VirageDroite, VirageGauche, Stop, Null};
enum States state;
enum States oldstate = Null;

// variables
bool BtnContactG;
bool BtnContactD;
bool VirageG = false;
bool VirageD = false;
bool tourneADroite = true;
long chrono1 = 0;
long chrono2 = 0;
long delaiVirage = 5000;
long cm = 0;

void setup() {
  //Serial.begin(115200);//
  Serial.begin(9600);//
  // initialise les moteurs en sortie
  pinMode(moteur_D, OUTPUT);
  pinMode(moteur_G, OUTPUT);
  digitalWrite(moteur_D, LOW);
  digitalWrite(moteur_G, LOW);

  // initialise les pushbuttons pins a input
  pinMode(DetecteurPin1, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance
  pinMode(DetecteurPin2, INPUT_PULLUP); // remplace INPUT permet de mettre un simple poussoir sans résistance

  chrono1 = millis();
  chrono2 = millis();
}

void loop()
{ //delay(1000);
  Mesures ();
  // Les tests
  // if (BtnContactG && !VirageG && BtnContactD && !VirageD  && cm >= DistMax)
  if (BtnContactG && BtnContactD && cm >= DistMax)
  { // Pleine eau
    state = AvantToute;//=1
    chrono1 = millis();
    chrono2 = millis();
    VirageD = false;
    VirageG = false;
  }
  else if (cm <= DistMin) // Obstacle à moins de 15 cm droit devant
  {
    if (millis() - chrono1 < delaiVirage)
    {
      //      Serial.print(" Temporisation ms : ");
      //      Serial.println(millis() - chrono1);
      state = (tourneADroite) ? VirageDroite : VirageGauche;
      //        if (tourneADroite)
      //      {
      //        state = VirageDroite;//=2
      //      }
      //      else
      //      {
      //        state = VirageGauche;//=3
      //      }
    }
    else
    {
      chrono1 = millis();
      chrono2 = millis();
      tourneADroite = !tourneADroite;
    }
  }
  else if (!BtnContactG || VirageD)
  { // Contact bouton gauche
    if (VirageD) Serial.println("Contact à gauche ! ");
    //    Serial.print("VirageD = "); Serial.println(VirageD);
    if (millis() - chrono2 < delaiVirage)
    {
      state = VirageGauche;
      //      Serial.print("state = "); Serial.println(VirageGauche);
      VirageD = true;
      //      Serial.println("Virage droite pour 5 secondes");
    } else
    {
      state = AvantToute;
      Serial.println("Avant toute");
      VirageD = false;
      chrono2 = millis();
    }
  }
  else if (!BtnContactD || VirageG)
  { // Contact bouton droit
    if (VirageG) Serial.println("Contact à droite ! ");
    //    Serial.print("VirageG = "); Serial.println(VirageG);
    if (millis() - chrono2 < delaiVirage)
    {
      state = VirageDroite;
      //     Serial.print("state = "); Serial.println(VirageDroite);
      VirageG = true;
      //      Serial.println("Virage gauche pour 5 secondes");
    }
    else
    {
      state = AvantToute;
      //     Serial.print("state = "); Serial.println(AvantToute);
      Serial.println("Avant toute");
      VirageG = false;
      chrono2 = millis();
    }
  }  // Fin des tests

  if (state != oldstate)// Mise à jour des commandes moteurs
  {
    //    Serial.print("old state = "); Serial.println(oldstate);
    switch (state)
    {
      case AvantToute:
        EnAvant();
        break;
      case VirageDroite:
        ADroite();
        break;
      case VirageGauche:
        AGauche();
        break;
      case Stop:
        Arret();
        break;
    }
    oldstate = state;
  }
}

void Mesures () { // Lecture capteur US et boutons
  // Mesure distance obstacle devant
  cm = ultrasonic.distanceRead();
  if (cm == 0) cm = 1000;
  //  Serial.print("Distance mesurée : ");
  //  Serial.print(cm);
  //  Serial.println(" cm" ); // read the state of the pushbutton values
  BtnContactG = digitalRead(DetecteurPin1);
  BtnContactD = digitalRead(DetecteurPin2);
  //  Serial.print ("Etat Bouton gauche : ");
  //  Serial.print (BtnContactG);
  //  Serial.print (" - Etat Bouton droit : ");
  //  Serial.println (BtnContactD);
}

/*
    Les 4 états possibles (si on ne va pas en arrière)
*/

void EnAvant () { // Avant Toute ! Pas d'obstacle devant et pleine eau
  Serial.print("Avant toute !");
  digitalWrite(moteur_D, HIGH);
  digitalWrite(moteur_G, HIGH);
}

void ADroite () { // Virage droite
  Serial.println("Moteur droit OFF, moteur gauche ON fait tourner a droite");
  digitalWrite(moteur_D, LOW);
  digitalWrite(moteur_G, HIGH);
}

void AGauche () { // Virage gauche
  Serial.println("Moteur gauche OFF, moteur droit ON, fait tourner a gauche");
  digitalWrite(moteur_D, HIGH);
  digitalWrite(moteur_G, LOW);
}

void Arret () { // Moteurs stoppés
  Serial.print("Moteurs éteints.");
  digitalWrite(moteur_D, LOW);
  digitalWrite(moteur_G, LOW);
}
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ArduinoFree

j'étais sur la version de dfgh.
Mais comme vous modifiez si vite le code que je n'arrive pas à suivre…. mais je ne m'en plains pas :D


Donc avec ton code, les moteurs ne fonctionnent que SI le btn associé est appuyé. En clair si c'est une impulsion  brève, le moteur fonctionne brièvement.
Si je reste appuyé longtemps le moteur tourne lentement


C'est bon à priori

Code: [Select]

Avant toute !Moteur gauche OFF, moteur droit ON, fait tourner a gauche


********************** Impulsion btn gauche*************************
Contact à gauche !
Contact à gauche !
Contact à gauche !
Contact à gauche !

Avant toute !Moteur droit OFF, moteur gauche ON fait tourner a droite

********************** Impulsion btn droit*************************
Contact à droite !
Contact à droite !
Contact à droite !
Contact à droite !

Avant toute !Moteur droit OFF, moteur gauche ON fait tourner a droite

********************** RIEN devant*************************
Avant toute !Moteur droit OFF, moteur gauche ON fait tourner a droite
Avant toute !Moteur droit OFF, moteur gauche ON fait tourner a droite

*************Alternance gauche droite 5 sec*************
Moteur gauche OFF, moteur droit ON, fait tourner a gauche
Moteur droit OFF, moteur gauche ON fait tourner a droite
Moteur gauche OFF, moteur droit ON, fait tourner a gauche
Moteur droit OFF, moteur gauche ON fait tourner a droite
Moteur gauche OFF, moteur droit ON, fait tourner a gauche
Moteur droit OFF, moteur gauche ON fait tourner a droite
Avant toute !

lesept

Je ne comprends pas :

  • Tant qu'il n'y a pas d'obstacle, les deux moteurs doivent fonctionner : est-ce OK ?
  • Si tu appuies sur le bouton gauche (par exemple), on doit avoir un moteur allumé pendant 5 secondes puis les deux allumés : est-ce OK ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ArduinoFree

#108
Jun 10, 2018, 09:45 pm Last Edit: Jun 10, 2018, 10:10 pm by ArduinoFree
1 C'est bon: on va tout droit avec les 2 moteurs en même temps


2 C'est bon aussi .
J' appuie sur le bouton gauche (par exemple), le  moteur gauche s'allume pendant 5 secondes puis les deux moteurs sont allumés .
Et si physiquement , les 5 sec ne sont pas suffisantes pour réorienter le bateau vers le centre du bateau je passerai à 6 ou 7

Merci à vous deux, c'est à ma fille maintenant de construire sa maquette.

lesept, es-tu toujours partant pour la version V1 ?
Dans ce cas je fais un autre post pour y voir plus clair

lesept

OK pour la V1, je reprends le code que tu as posté hier.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ArduinoFree

#110
Jun 10, 2018, 10:21 pm Last Edit: Jun 10, 2018, 10:37 pm by ArduinoFree
C'est vraiment sympa de ta part de m aider autant.
Je t' en suis trés reconnaissant

Je vous laisse, demain je vais jouer de la pelle et de la pioche.

A demain en fin de journée

lesept

A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

ArduinoFree

#112
Jun 11, 2018, 12:39 pm Last Edit: Jun 11, 2018, 12:41 pm by ArduinoFree Reason: s
oui !

Je viens juste de les poser pour manger

Je fais un post Maquette bateau V1 ?

Je reste un peu avec vous pendant ma pause repas

dfgh

je vais continuer à jeter un oeil sur votre post. sans poster de code, car à deux, ça devient vite impossible
donc je laisse la main à notre ami "lesept"qui te soutient depuis le début.

j'ai regardé ta V1.
j'ai du mal à comprendre que dans ta loop, tu surveilles les 3 possibilités par portions de 20 secondes.
autrement, tu as rajouté un gouvernail. tes moteurs ne font plus que marche avant/arrière ou tu gardes l'effet de poussée par un seul moteur pour dégager des coins?.
nota: dans ta V1 tu n'appelles jamais la fonction ultras sons.
tu mets les pompes lorsque le bateau est pres des bords,  dans quel but?

ArduinoFree

#114
Jun 11, 2018, 01:19 pm Last Edit: Jun 11, 2018, 01:21 pm by ArduinoFree
je vais continuer à jeter un oeil sur votre post. sans poster de code, car à deux, ça devient vite impossible
donc je laisse la main à notre ami "lesept"qui te soutient depuis le début.
Effectivement c'est plus simple.
Merci

j'ai regardé ta V1.
j'ai du mal à comprendre que dans ta loop, tu surveilles les 3 possibilités par portions de 20 secondes.
autrement, tu as rajouté un gouvernail.
Tes moteurs ne font plus que marche avant/arrière ou tu gardes l'effet de poussée par un seul moteur pour dégager des coins?.
Pour c'est deux j'ai mal codé apparemment, j'ai bien rajouté un gouvernail pour aider à tourner en utilisant un servo moteur.

Dans les coins 1 moteur pour s'en dégager

Le programme fait des cycles de 10 mn
10 mn en pleine eau en évitant les bords                                         ( c'est la programmation de la VO)
10 mn en se collant sur le bord de la piscine par le coté gauche du bateau
10 mn en pleine eau en évitant les bords
10 mn en se collant sur le bord de la piscine par le coté droit du bateau
10 mn de pause

Les 20 sec étaient pour vérifier sur mon montage avec des leds


nota: dans ta V1 tu n'appelles jamais la fonction ultras sons.
tu mets les pompes lorsque le bateau est pres des bords,  dans quel but?
La V1 (ancienne) était l'amélioration de la V0, qui elle aussi avait ce pb d'ultrasons
les pompes c'est pour faire effet pompier  ( lance à incendie)


A ce soir, je retourne à ma pelle et pioche
et je créée le post Bateau V1

Go Up