Go Down

Topic: fusion de programmes , capteur ultra sonore et gestion de commande  (Read 124 times) previous topic - next topic

bengloo59

bonjours je souhaite fusionné deux programme adapté à mes besoin par mes soins chacun des programme fonctionne parfaitement à par,
le premier permet de détecter via des capteurs ultra sonore  un obstacle à moins de 200 mm en prenant en conte que les détections répété et non ponctuel

Code: [Select]
/*
 * Code d'exemple pour un capteur à ultrasons HC-SR04.
 */

//asignation des variables des capteurs ultrat sonord
const byte TRIGGERun = 52;const byte ECHOun = 53;  //broche de transmission par numéro de capteur.
const byte TRIGGERdeux = 50; const byte ECHOdeux = 51;  
const byte TRIGGERtrois = 48; const byte ECHOtrois = 49;    
const byte TRIGGERquatre = 46; const byte ECHOquatre = 47;    
const byte TRIGGERcinq = 44; const byte ECHOcinq = 45;  
const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s constante de calcule
const float SOUND_SPEED = 340.0 / 1000; //vitesse du son
long measureun;long measuredeux;long measuretrois;long measurequatre;long measurecinq; //doné récupéré
float distanceun;float distancedeux;float distancetrois;float distancequatre;float distancecinq; //distance déduite
int bufer = 5;
int margesecu =200;

int danger =0;


void setup() {
  
  /* Initialise le port série */
  Serial.begin(2000000);
  
  /* Initialise les broches des capteur ultrat sonord */
  pinMode(TRIGGERun, OUTPUT);
  digitalWrite(TRIGGERun, LOW);
  pinMode(ECHOun, INPUT);

   pinMode(TRIGGERdeux, OUTPUT);
  digitalWrite(TRIGGERdeux, LOW);
  pinMode(ECHOdeux, INPUT);

   pinMode(TRIGGERtrois, OUTPUT);
  digitalWrite(TRIGGERtrois, LOW);
  pinMode(ECHOtrois, INPUT);

   pinMode(TRIGGERquatre, OUTPUT);
  digitalWrite(TRIGGERquatre, LOW);
  pinMode(ECHOquatre, INPUT);

   pinMode(TRIGGERcinq, OUTPUT);
  digitalWrite(TRIGGERcinq, LOW);
  pinMode(ECHOcinq, INPUT);
}
 
/** Fonction loop() */
void loop() {
  
//mesure des distance par les cpteurs ultrat sonord  
 digitalWrite(TRIGGERun, HIGH);
 digitalWrite(TRIGGERun, LOW);
long measureun= pulseIn(ECHOun, HIGH, MEASURE_TIMEOUT);
  float distanceun = measureun/ 2.0 * SOUND_SPEED;
 
  
    digitalWrite(TRIGGERdeux, HIGH);
  digitalWrite(TRIGGERdeux, LOW);
 long measuredeux= pulseIn(ECHOdeux, HIGH, MEASURE_TIMEOUT);
  float distancedeux = measuredeux/ 2.0 * SOUND_SPEED;
 
    digitalWrite(TRIGGERtrois, HIGH);
  digitalWrite(TRIGGERtrois, LOW);
  long measuretrois= pulseIn(ECHOtrois, HIGH, MEASURE_TIMEOUT);
  float distancetrois = measuretrois/ 2.0 * SOUND_SPEED;
 
    
  digitalWrite(TRIGGERquatre, HIGH);
  digitalWrite(TRIGGERquatre, LOW);
   long measurequatre= pulseIn(ECHOquatre, HIGH, MEASURE_TIMEOUT);
  float distancequatre = measurequatre/ 2.0 * SOUND_SPEED;

    
 digitalWrite(TRIGGERcinq, HIGH);
  digitalWrite(TRIGGERcinq, LOW);
  long measurecinq= pulseIn(ECHOcinq, HIGH, MEASURE_TIMEOUT);
  float distancecinq = measurecinq/ 2.0 * SOUND_SPEED;
  
  

  if((((distanceun>0)&&(distanceun<margesecu))|| ((distancedeux>0)&&(distancedeux<margesecu))||((distancetrois>0)&&(distancetrois<margesecu))||((distancequatre>0)&&(distancequatre<margesecu))||((distancecinq>0)&&(distancecinq<margesecu)))&&(bufer<=10)){
  bufer += 1; }
  else{if (bufer>0){bufer -=1;}}
  if (bufer>5){danger=1;}
  else{danger =0;}
  
  /* Affiche les résultats en mm*/
  Serial.println(distanceun);
  Serial.println(bufer);
  Serial.println(danger);
 
}

 

le second code et la gestion spatial et la commande des moteurs pas à pas du robot il sera lié à l'autre programme par la variable danger qui bloquera le robot.
voici ce que j'ai pus obtenir en fusionnant les deux code:

bengloo59

Code: [Select]
//programme de detection de danger par capteur ultrat sonord
 //résiste au décablage d'un capteur , le m'et hors service sans pertuber les autres capteur
 //résiste au valeur ponctuelle avec un buffer de donnée ( ne decte pas une mouche qui passe...)
 
 // variable temporelle
  float tempjeu = 0.0;//temps depuis le lenssement du jeux
  float tempprog = 0.0;// temps soustrayant les poses du aux arrets imprévus sur le parcour et les periodes de rotation.
  const float finjeu = 100000.0; // temps de fin de jeux en mili seconde arréte le robot dans tout ces déplacement et action  
  float tempboucle = 0.0; // temp entre chaque boucle pour calculer l'étape la position à chaque boucle  
  float ecartp = 0.0; // variable calcule servant de repaire au tempboucle
//variable de condition
  int contact = 1; // varible on off coup d'envois
  int danger = 0;// détection d'un obstacle imprévus arrêt du véicule
//variable de calcule spatial
  const float sud = 1500*PI;const float nord = PI*500;const float est = 0.0;const float ouest = PI*1000;// orientation primaire utile en milli radiant
  const float vmaxrec = 0.05;// vitesse max sur sol plat en mm par milli seconde
  const float vmaxcirc = PI/12;//vitesse max circulaire sur sol plat  en milliradant par milliseconde
  float x = 0.0; // position d'origine en x en mm
  float y = 0.0; // position d'origine en y en mm
  float oriente ;//angle de destination à l'étape doné
  float n = 2.0;// marge de degrée pr arivé à l'orientation voulu se calcule en faisant vmaxcirc*tempbouclemax
  float tempbouclemax = 0; //permet de calculé la magre de degrée n en fonction de la vitesse minimal du programe
  float degresReel = PI*500; //direction de la tête du robot dans le repére x y en mradiant radiant au démarage
//Câblage moteur 1
  int ENAun=8; int IN1un=9; int IN2un=10; int ENBun=13; int IN3un=11; int IN4un=12;
//cablaage moteur 2
  int ENAdeux=2; int IN1deux=3; int IN2deux=4; int ENBdeux=7; int IN3deux=5; int IN4deux=6;
// etape de 1 à 8 des moteurs pas à pas
  int etapemoteurun = 1;int etapemoteurdeux =1;
//asignation des variables des capteurs ultrat sonord
  const byte TRIGGERun = 52;const byte ECHOun = 53;  //broche de transmission par numéro de capteur.
  const byte TRIGGERdeux = 50; const byte ECHOdeux = 51;  
  const byte TRIGGERtrois = 48; const byte ECHOtrois = 49;    
  const byte TRIGGERquatre = 46; const byte ECHOquatre = 47;    
  const byte TRIGGERcinq = 44; const byte ECHOcinq = 45;  
  const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s constante de calcule
  const float SOUND_SPEED = 340.0 / 1000; //vitesse du son
  long measureun;long measuredeux;long measuretrois;long measurequatre;long measurecinq; //doné récupéré
  float distanceun;float distancedeux;float distancetrois;float distancequatre;float distancecinq; //distance déduite
  int bufer = 5; //le risque doit étre vérifier cinq fois pr étre valide
  int margesecu =200; //les distance de sécurité entre le robot et les obstacle

//tableau des trajectoire
  int etape = 0; // étape dans l'avancement du programme  
  const int B = 5; //nombre d'étape
  float parcour [3][B]{{500.0,600.0,600.0,200.0,4000.0},// déterminé la distance en mm
                       {nord,est,est,ouest,PI*250},//déterminer la direction tableau servant d'interface pour stocker la trajectoire et les action à réaliser en degrée
                       {0.0,0.0,0.0,0.0,0.0,}}; // temprograme équivalent à l'éatape
//led de test sans moniteur
  int pinledtest =36;                
  void setup() {
  Serial.begin(2000000);
//configurer led
  pinMode(pinledtest,OUTPUT);
//configurer les sortit moteur
  pinMode(ENAun,OUTPUT);pinMode(ENBun,OUTPUT);pinMode(IN1un,OUTPUT);pinMode(IN2un,OUTPUT);pinMode(IN3un,OUTPUT);pinMode(IN4un,OUTPUT);//Les 6 pins configurées en sorties
  pinMode(ENAdeux,OUTPUT);  pinMode(ENBdeux,OUTPUT);pinMode(IN1deux,OUTPUT);pinMode(IN2deux,OUTPUT);pinMode(IN3deux,OUTPUT);pinMode(IN4deux,OUTPUT);//Les 6 pins configurées en sorties
//Enable A et B, utiliser les 2 ponts en H
  digitalWrite(ENAun,HIGH);digitalWrite(ENBun,HIGH);digitalWrite(ENAdeux,HIGH);digitalWrite(ENBdeux,HIGH);
// Initialise les broches des capteur ultrat sonord
  pinMode(TRIGGERun, OUTPUT);digitalWrite(TRIGGERun, LOW); pinMode(ECHOun, INPUT);
  pinMode(TRIGGERdeux, OUTPUT);digitalWrite(TRIGGERdeux, LOW);pinMode(ECHOdeux, INPUT);
  pinMode(TRIGGERtrois, OUTPUT);digitalWrite(TRIGGERtrois, LOW); pinMode(ECHOtrois, INPUT);
  pinMode(TRIGGERquatre, OUTPUT);digitalWrite(TRIGGERquatre, LOW); pinMode(ECHOquatre, INPUT);
  pinMode(TRIGGERcinq, OUTPUT);digitalWrite(TRIGGERcinq, LOW); pinMode(ECHOcinq, INPUT);
//remplire la derniére ligne du tableau  
  oriente = parcour [1][0];
  parcour [2][0]= parcour [0][0] / vmaxrec;
  for (int i = 0 ; i <= B-1 ; i++){
    parcour [2][i+1] = parcour [2][i] + (parcour [0][i+1] / vmaxrec);}
}
  
void loop() {
// detecter le coup denvois
  if (contact == 1){
//prise des valeurs de distance par les capteurs ultrat sonord//
    digitalWrite(TRIGGERun, HIGH);digitalWrite(TRIGGERun, LOW);long measureun= pulseIn(ECHOun, HIGH, MEASURE_TIMEOUT);float distanceun = measureun/ 2.0 * SOUND_SPEED;
    digitalWrite(TRIGGERdeux, HIGH);digitalWrite(TRIGGERdeux, LOW);long measuredeux= pulseIn(ECHOdeux, HIGH, MEASURE_TIMEOUT);float distancedeux = measuredeux/ 2.0 * SOUND_SPEED;
    digitalWrite(TRIGGERtrois, HIGH);digitalWrite(TRIGGERtrois, LOW);long measuretrois= pulseIn(ECHOtrois, HIGH, MEASURE_TIMEOUT);float distancetrois = measuretrois/ 2.0 * SOUND_SPEED;
    digitalWrite(TRIGGERquatre, HIGH);digitalWrite(TRIGGERquatre, LOW);long measurequatre= pulseIn(ECHOquatre, HIGH, MEASURE_TIMEOUT);float distancequatre = measurequatre/ 2.0 * SOUND_SPEED;
    digitalWrite(TRIGGERcinq, HIGH);digitalWrite(TRIGGERcinq, LOW);long measurecinq= pulseIn(ECHOcinq, HIGH, MEASURE_TIMEOUT);float distancecinq = measurecinq/ 2.0 * SOUND_SPEED;
 // detecter un obstacle imprévut celon margesecu et avec un bufer ignorant les detection ponctuel
  if((((distanceun>0)&&(distanceun<margesecu))|| ((distancedeux>0)&&(distancedeux<margesecu))||((distancetrois>0)&&(distancetrois<margesecu))||((distancequatre>0)&&(distancequatre<margesecu))||((distancecinq>0)&&(distancecinq<margesecu)))&&(bufer<=10)){
  bufer += 1; }
  else{if (bufer>0){bufer -=1;}}
  if (bufer>5){danger=1;}
  else{danger =0;}
  
 //lecture détape //
    if ( tempprog >= parcour [2][etape]){etape = etape + 1;}// faire evoluer la trajectoire
    oriente = parcour [1][etape];//lire l'orientation visé
    if (danger == 0){
 //gestion spatial//
    //determiné la marge de précision de rotation en fonction de la vitesse du programe
      if ((tempboucle>tempbouclemax)&&(tempprog>1)){tempbouclemax = tempboucle;
      n = tempbouclemax*vmaxcirc/2;}
    //gestion d'avancé rectiligne
      if(((cos(oriente/1000)<cos(n/1000))&&(abs(oriente-degresReel)<=n))||((oriente-n<=0)&&((degresReel<=oriente+n)||(degresReel>=oriente-n+2000*PI)))||((oriente+n>=2000*PI)&&((degresReel<=oriente+n-2000*PI)||(degresReel>=oriente-n)))){ //si degresReel  convient  à l'orientation demandé avec une marge n (prenant en conte les écart n entre N et 2PI- n)
                          /* x = x + cos(degresReel / 1000) * tempboucle * vmaxrec ;//calculé x y théorique en m m, possiblement remplacé par un accélérométre dans la boucle principal
                          y = y + sin(degresReel / 1000) * tempboucle * vmaxrec ;*/
                          if(millis()%20<=tempbouclemax){
                          etapemoteurun += 1;
                          etapemoteurdeux -= 1;
                          aplicationmoteur();}
                          }
  


la suite arive

bengloo59

Code: [Select]

//gestion de rotation
    else{ //si degresReel ne convient pas à l'orientation demandé avec une marge n (prenant en conte les écart n entre N et 2PI- n
                        if (((degresReel<oriente)&&(oriente-degresReel<1000*PI)&&(oriente-degresReel>0))||((degresReel>oriente)&&(oriente-degresReel<-1000*PI)&&(oriente-degresReel>-2000*PI))){
                        degresReel = degresReel + vmaxcirc * tempboucle;//calculer degresReel possiblement remplacé par un giroscope dans la cboucle principal et tourné dans le sens trigo
                        if(millis()%20<=tempbouclemax){
                        etapemoteurun += 1;
                        etapemoteurdeux += 1;
                        aplicationmoteur();}
                        }
                        else{degresReel = degresReel - vmaxcirc * tempboucle;//calculer degresReel possiblement remplacé par un giroscope dans la cboucle principal et tourné dans le sens horaire
                        if(millis()%20<=tempbouclemax){
                        etapemoteurun -= 1;
                        etapemoteurdeux -= 1;
                        aplicationmoteur();}
                        }
      }
                        }
          
}
while (degresReel < 0){ degresReel += PI*2000;} //rendre positif degresReel
while (degresReel >= PI*2000){degresReel -= PI*2000;} // le réduire sous PI*2000

//gestion temporelle//
    if (tempjeu > finjeu){danger = 1;}//si le temp de jeux et dépassé arrété tout
    if (contact == 1){ tempjeu = tempjeu + tempboucle;
        if ((danger == 0)&&(((cos(oriente/1000)<cos(n/1000))&&(abs(oriente-degresReel)<=n))||((oriente-n<=0)&&((degresReel<=oriente+n)||(degresReel>=oriente-n+2000*PI)))||((oriente+n>=2000*PI)&&((degresReel<=oriente+n-2000*PI)||(degresReel>=oriente-n))))){
          tempprog = tempprog + tempboucle;}}
tempboucle = millis() - ecartp;
ecartp = millis();
Serial.println (distanceun);
Serial.println(bufer);
Serial.println(danger);
Serial.println (tempboucle);
Serial.println ("   ");
}
void aplicationmoteur (){//agire sur les moteur en fonction des etape de pas de ceux ci
if (etapemoteurun == 9){etapemoteurun = 1;}
if (etapemoteurdeux == 9){etapemoteurdeux = 1;}
if (etapemoteurun == 0){etapemoteurun = 8;}
if (etapemoteurdeux == 0){etapemoteurdeux = 8;}
 if( etapemoteurun == 1){digitalWrite(IN1un,LOW); digitalWrite(IN2un,HIGH); digitalWrite(IN3un,HIGH);digitalWrite(IN4un,LOW);}//0110  A-B
 if( etapemoteurun == 2){digitalWrite(IN1un,LOW); digitalWrite(IN2un,HIGH);digitalWrite(IN3un,LOW);digitalWrite(IN4un,LOW);}//1010  AB
 if( etapemoteurun == 3){digitalWrite(IN1un,LOW); digitalWrite(IN2un,HIGH);digitalWrite(IN3un,LOW);digitalWrite(IN4un,HIGH);}//0101  A-B-
 if( etapemoteurun == 4){digitalWrite(IN1un,LOW); digitalWrite(IN2un,LOW);digitalWrite(IN3un,LOW);digitalWrite(IN4un,HIGH);}//1010  AB
 if( etapemoteurun == 5){digitalWrite(IN1un,HIGH); digitalWrite(IN2un,LOW);digitalWrite(IN3un,LOW);digitalWrite(IN4un,HIGH);}//1001  AB-
 if( etapemoteurun == 6){digitalWrite(IN1un,HIGH);digitalWrite(IN2un,LOW);digitalWrite(IN3un,LOW);digitalWrite(IN4un,LOW);}//1010  AB
 if( etapemoteurun == 7){digitalWrite(IN1un,HIGH);digitalWrite(IN2un,LOW);digitalWrite(IN3un,HIGH);digitalWrite(IN4un,LOW);}//1010  AB
 if( etapemoteurun == 8){digitalWrite(IN1un,LOW);digitalWrite(IN2un,LOW);digitalWrite(IN3un,HIGH);digitalWrite(IN4un,LOW);} //1010  AB



 if( etapemoteurdeux == 1){digitalWrite(IN1deux,LOW);digitalWrite(IN2deux,HIGH);digitalWrite(IN3deux,HIGH);digitalWrite(IN4deux,LOW);}//0110  A-B
 if( etapemoteurdeux == 2){digitalWrite(IN1deux,LOW);digitalWrite(IN2deux,HIGH); digitalWrite(IN3deux,LOW);digitalWrite(IN4deux,LOW);}//1010  AB
 if( etapemoteurdeux == 3){digitalWrite(IN1deux,LOW);digitalWrite(IN2deux,HIGH);digitalWrite(IN3deux,LOW);digitalWrite(IN4deux,HIGH);}//0101  A-B-
 if( etapemoteurdeux == 4){digitalWrite(IN1deux,LOW);  digitalWrite(IN2deux,LOW);digitalWrite(IN3deux,LOW);digitalWrite(IN4deux,HIGH);}//1010  AB
if( etapemoteurdeux == 5){
 digitalWrite(IN1deux,HIGH);
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,LOW);
 digitalWrite(IN4deux,HIGH);}//1001  AB-
 if( etapemoteurdeux == 6){
 digitalWrite(IN1deux,HIGH);  
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,LOW);
 digitalWrite(IN4deux,LOW);}//1010  AB
if( etapemoteurdeux == 7){
 digitalWrite(IN1deux,HIGH);  /
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,HIGH);
 digitalWrite(IN4deux,LOW);}/1010  AB
if( etapemoteurdeux == 8){
 digitalWrite(IN1deux,LOW);  
 digitalWrite(IN2deux,LOW);
 digitalWrite(IN3deux,HIGH);
 digitalWrite(IN4deux,LOW);}//1010  AB
}

voila , je précise également que je travaille sur carte méga.

68tjs

Et la question est ?

D'une manière très générale un programme avec l'IDE Arduino comprend à miminima une fonction setup() qui ne s'éxécute qu'une fois et une fonction loop() qui tourne en boucle.
Chacune de ces deux fonctions peut appeler d'autres fonctions écrites par l'auteur du programme.

Il faut réunir dans la fonction setup() tout ce qui ne s'exécute qu'une fois, en gros c'est pour les initialisations, et mettre le programme proprement dit dans la fonction loop().

Lors de la réunion de deux programmes il faut veiller à éliminer les incompatibilités comme l'utilisation des mêmes   E/S (ça c'est vu) ou la redéfinition du débit de l'interface série avec une ligne Serial.begin(9600) et une autre Serial.begin(115200) (cela c'est aussi vu).
Veiller aussi à la double utilisation des timers, etc   etc.

Le sujet a été abordé de nombreuses fois, pour consulter les réponses déjà données utilise le moteur de recherche du forum (icône "loupe" en haut à droite)

Information : le compilateur reçoit un vrai fichier C/C++, il ne reçoit pas le fichier *.ino que tu écris.
C'est l'IDE qui transforme le fichier *.ino en un vrai fichier *cpp.

Go Up