Aller au contenu


Photo
- - - - -

Bug dans la programmation introuvable..


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

#1 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 24 février 2015 - 12:22

Bonsoir à tous !
Je reviens vers vous, j'ai encore un problème que je n'arrive pas à résoudre..
Je viens de faire la partie pan/tilt de la tête du robot. J'avais deja fait des essais et ça avait pourtant fonctionné..
j'ai depuis écrit d'autres petit programme et maintenant ça bug!
 
En fait le suivi sur l'axe y fonctionne toujours, c'est l'axe x qui est dans les choux: lorsque je décale ma tête un tout petit peu vers la gauche, au lieu de me suivre il tourne completement la tête (le sens où il tourne la tête est par contre correct).
 
 

 

 voila le code:


#include <string.h>
#include <Servo.h> 

int analog=5;
Servo myservox;  
Servo myservoy;
int val;
char data[9]={0,0,0,0,0,0,0,0,0};
  
int incrx;
int incry;

char *distancex;
char *distancey;
char *a;
int x;
int y;

int anglex = 90;
int angley = 60;
int anglex2;
int angley2;
int k=0;

int led =2;
int incrled;
int sens=0;
int dd=10;
int gg=9;
int d=6;
int faceled=15;
int valdd;
int valgg;
int vald;
int valfaceled;
 long cmdd;
/////////////////////////////////////////////////////////////////////////////////horloge


#include <DS1302.h>
#include <String.h>

DS1302 rtc(6, 7, 8);// pin pour i2c
unsigned long t;
char* i;
char* s1;
char* s2;
char* s3;
unsigned long se3;
unsigned long se2;
unsigned long se1;
unsigned long difsec;
unsigned long difsec2;
int bascule;
int bascule2;
int bascule_s;
int attente;
int attente2;
int tempsatt;
int tempsatt2;
int tempsinc;
int tempsinc2;
unsigned long temps_s;
int dif_s;
int t_s;
int nosignal;
 /////////////////////////////////////////////////////////////////////////////////////// 


void setup() 
{ 
  Serial.begin(9600);

  myservox.attach(2); 
    myservoy.attach(3);    
  myservox.write(anglex);
 myservoy.write(angley);
 
 ////////////////////////////////////////////////////////////////////////horloge
 rtc.halt(false);
  rtc.writeProtect(true);
 // rtc.setDOW(MONDAY);        // réglage du jour
 // rtc.setTime(21, 51, 0);     // réglage de l'heure
 // rtc.setDate(23, 2, 2015);   // réglage de la date
  bascule=0;
  bascule2=0;
  bascule_s=0;
  t_s=3;
  nosignal=0;
} 
////////////////////////////////////////////////////////////////////////void loops


void capteurs(){
  
valdd=analogRead(dd);
valgg=analogRead(gg);
vald=analogRead(d);
valfaceled=analogRead(vald);


//Serial.println(t);

}

void suivi(){
  
if(x<-215){return;
    //rien
  }
  else if (x>-215){
    incrx = map(abs(x), 0, 216, 1, 6);
    if(x < -15) {
      anglex= anglex-incrx;
      anglex=constrain(anglex, 25,155);
      myservox.write(anglex); 
    }
 incrx = map(abs(x), 0, 216, 1, 6);

    if (x>15){
      anglex=anglex+incrx;
      anglex=constrain(anglex, 25, 155);
      myservox.write(anglex);
      {

      } 
    }
  }
  
  
  if(y<-119){return;
    //rien
  }
  else if (y>-119){
    incry = map(abs(y), 0, 120, 1, 6);
    if(y < -15) {
      angley= angley-incry;
      angley=constrain(angley, 25,155);
      myservoy.write(angley); 
    }
 incry = map(abs(y), 0, 120, 1, 6);

    if (y>15){
      angley=angley+incry;
      angley=constrain(angley, 25, 155);
      myservoy.write(angley);
      {

      } 
    }
  }

  }


void horloge(){
   
 
s1= strtok_r(rtc.getTimeStr(),":",&a);
se1=atoi(s1);

s2= strtok_r(NULL,":",&a);
se2=atoi(s2);

s3= strtok_r(NULL,":",&a);
se3=atoi(s3);

t=se1*3600+se2*60+se3;

  
 
}

/////////////////////////////////////////////////////////////////quand y'a rien

void rien(){
  
  if(nosignal==1 && (t>(temps_s+t_s))){

if(bascule==0){difsec=t;tempsatt=random(1,3);attente=tempsatt;bascule=1;bascule=1;bascule=1;tempsinc=random(5,15);anglex2=random(30,110);}
if(bascule2==0){difsec2=t;tempsatt2=random(1,7);attente2=tempsatt2;bascule2=1;bascule2=1;bascule2=1;tempsinc2=random(15,40);angley2=random(50,80);}


if(t>difsec+attente && bascule==1){bascule=2;}
if(t>difsec2+attente2 && bascule2==1){bascule2=2;}

if(bascule==2){
if(anglex==anglex2){bascule=0;nosignal=0;bascule_s=0;}
if(anglex>anglex2){anglex--; myservox.write(anglex);delay(tempsinc);}
if(anglex<anglex2){anglex++; myservox.write(anglex);delay(tempsinc);}
if(tempsinc>100){tempsinc=100;}
if(abs(anglex-anglex2)<20){tempsinc++;}
}


if(bascule2==2){
if(angley==angley2){bascule2=0;nosignal=0;bascule_s=0;}
if(angley>angley2){angley--; myservoy.write(angley);delay(tempsinc2);}
if(angley<angley2){angley++; myservoy.write(angley);delay(tempsinc2);}
if(tempsinc2>80){tempsinc2=80;}
if(abs(angley-angley2)<20){tempsinc2++;}
 }

 

}}
  
  
//////////////////////////////////////////////////////////////////////////////lit roborealm
void com(){
  if(Serial.available()){bascule=0;nosignal=0;bascule_s=0;//verrification si roborealm envoie des octets
    while (k<9){
      data[k] = Serial.read();
      k++;delay(1);
         }}else{if( bascule_s==0){temps_s=t; bascule_s=1; nosignal=1;}}
           
           
        
distancex = strtok_r(data,";",&i);
distancey = strtok_r(NULL,";",&i);
x = atoi(distancex);
y = atoi(distancey);
k=0;
 }



//////////////////////////////////////////////////////////////////////////////////

void loop() 
{
  
  
com();

horloge();

capteurs();

rien();

suivi();
}



J'ai isolé uniquement la partie void com() et void suivi() dans une fenêtre à part et téléchargé le programme : le bug est toujours là, donc les fonctions horloge(), capteurs() et rien() sont apparemment hors de cause. 

Comme le suivi sur y fonctionne, j'ai repris le code de la partie y, c'est a dire

if(y<-119){
    //rien
  }
  else if (y>-119){
    incry = map(abs(y), 0, 120, 1, 6);
    if(y < -10) {
      angley= angley-incry;
      angley=constrain(angley, 0,180);
      myservoy.write(angley); 
    }
 incry = map(abs(y), 0, 120, 1, 6);

    if (y>10){
      angley=angley+incry;
      angley=constrain(angley, 0, 180);
      myservoy.write(angley);
      {

      } 
    }
  }

et j'ai remplacé les y par des x, le problème est toujours la..

je n'y comprends rien..  je passe peut être a côté d'un truc gros comme une maison..

J'ai aussi echangé les moteurs, sans succés.

Mon code n'est pas indenté, mais si il l'est je me perds dans les if.. else..

 

Pour que ce soit plus simple pour vous, voila comment fonctionne le dernier bout de programme:

 

-y est la coordonnée de l'axe y de l'objet détecté.

-incry est la valeur que je vais ajouter à mon angle actuel, il augment lorsque l'objet s'éloigne du centre.

-angley c'est la valeur actuelle de l'angle du moteur de l'axe y.

 

*Quand je capte rien, j'ai la valeur -120 pour y.

*Quand je capte qqch, mon incry est compris entre 1 et 6 en fonction de la distance du centre.

*Mais il decidera de bouger la tête que si le nombre de pixel entre le centre et y est superieur à 10.

*Si c'est le cas alors je rajoute incry a l'angle actuel.

 

Et c'est la même musique pour x.

 

Je sais que ce n'est pas évident de rentrer dans un programme de quelqu'un d'autre donc n'hésiter pas à demander des précisions.

Merci d'avoir lu le pavé ! Si vous avez ne serait-ce qu'un bout d'idée, je prends !

 



#2 Microrupteurman

Microrupteurman

    Pilier du forum

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

Posté 24 février 2015 - 12:54

 

 

incry = map(abs(y), 0, 120, 1, 6);

incry = map(abs(y), -120, 0, 1, 6);

 

 

essaye ça .


 
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 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 333 messages
  • Gender:Male

Posté 24 février 2015 - 01:09

Toujours pas, j'observe le même défaut. Mais merci !




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

0 members, 0 guests, 0 anonymous users