prog principale

Dependencies:   mbed AX12

main.cpp

Committer:
Cointepas
Date:
2017-06-07
Revision:
2:62ccfb1a8e17
Parent:
1:87582f792133

File content as of revision 2:62ccfb1a8e17:

#include <mbed.h>
#include <AX12.h>
#include <iostream>
#include <iomanip>
#include <sstream>


using namespace std;

DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

/* ************************************************************ */
/* Déclarations variables globales et fonctions pour HMC5883L   */
/* ************************************************************ */
short Bx, By, Bz;
I2C hmc(p9, p10); 
const int addr = 0x1E; // adresse d'écriture de du capteur
//int frequency(100000);
void hmc_config(void);
void hmc_lecture(void);

/* ************************************************** */
/*  Déclarations des var globales de communication    */
/* ************************************************** */
Serial conf(p9, p10);
Serial pc(USBTX, USBRX);

/* ********************************************* */
/*  Déclarations des var globales de position    */
/* ********************************************* */
int moteur1i;
int moteur2i;
int moteur3i;

/* ********************************************* */
/*  Déclarations des var globales de position    */
/* ********************************************* */
bool flag;

/* ********************************************* */
/*  Déclarations des var globales moteur         */
/* ********************************************* */
AX12 myax01 (p28, p27, 1);
AX12 myax02 (p28, p27, 2);
AX12 myax03 (p28, p27, 3);
AX12 myax04 (p28, p27, 6);

/* ********************************************* */
/*  Déclarations des var globales des relever de position         */
/* ********************************************* */
float checkmot1;
float checkmot2;
float checkmot3;
float checkmot4;

void Lecture(void);
void envoi_position(void);
void lecture_position(void);
void envoi_12octets(void);


int main() 
{ 
       led1 = 1;
       Lecture();
       led1 = 0;
       led2 = 1;
       envoi_position();
       led2 = 0;
       led3 = 1;
       hmc_config();
       led3 = 0;
       led4 = 1;
       hmc_lecture();
       led4 = 1;
       led1 = 1;
       lecture_position();
       led1 = 0;
       led2 = 1;
       envoi_12octets();
       led1 = 1;
       led2 = 1;
       led3 = 1;
       led4 = 1;
               
    
           // pc.printf("\nBx=%d, By=%d, Bz=%d\n\r",Bx*4.35,By*4.35,Bz*4.35);
           
           
         

}

/* ************************************** */
/* Fonction de confihuration de HMC5883l  */
/* Mode:single, sensibilité +/- 8Guauss   */
/*                                        */
/* ************************************** */
void hmc_config(void)
     {
         conf.baud(9600);
         //Variable interne à la fonction.
         char config_hmc[2];
         config_hmc[0]=0x00;  // adresse registre A
         config_hmc[1]=0x70;// registre A configuré en mesure normal sur 16 bits
         hmc.write(addr, config_hmc,2);
    
         config_hmc[0]=0x01;  // à commenter
         config_hmc[1]=0xE0;
         hmc.write(addr, config_hmc,2);
    
         config_hmc[0]=0x02; // à commenter
         config_hmc[1]=0x01;
         hmc.write(addr, config_hmc,2);
        
         wait(0.006); // attente imposée constructeur
         
     }    
     
  /* ************************************** */
  /* Fonction de lecture champ magnétique   */
  /* sur 3 axes, chaque lecture sur 16 bits */
  /* ************************************** */   
  
  void hmc_lecture()
      {
        //Variable interne a la fonction.
        char readhmc[6];
        
        hmc.read(addr, readhmc, 6);     // commenter
        
        Bx=((readhmc[0] << 8)|readhmc[1]); // commenter le décalage
        By=((readhmc[2] << 8)|readhmc[3]);
        Bz=((readhmc[4] << 8)|readhmc[5]);
        
        wait(0.07);    
          
      }    
   /* *********************************************  */
  /*        Fonction de lecture de la trame         */
  /* *********************************************  */

void Lecture(void) {
    
    string trame;        //Trame complète.
    stringstream sstr;   //stringstream permet de faire la liaison entre le string de départ et le int sortant.
    int cchecksum = 0;       //Octet permetant le controle de 'checksumi'.
    string moteur1;      //Octet de position moteur1.
    string moteur2;      //Octet de position moteur2.
    string moteur3;      //Octet de position moteur3.
    string checksum;     //Octet du checksum.
    int checksumi;       //'checksum' converti en int.
    char tablecture[15];  //Tableau de reception
    char reception[1];
    int tablecturei[15];  //Tableau de reception converti en int
    string tab;       //Octet de start.
    int tabi[14];         //'start1' converti en int.
    string start1;       //Octet de start.
    int start1i;         //'start1' converti en int.
    string start2;       //Octet de start.
    int start2i;         //'start2' converti en int.
    string start3;       //Octet de start.
    int start3i;         //'start1' converti en int.
    string start4;       //Octet de start.
    int start4i;         //'start2' converti en int.
    conf.baud(9600);
    
    
    //tablecture = conf.getc();
    
    for(int i = 0; i<15; i++){
       conf.gets(reception, 2);
       pc.printf("\nreception = %s \n",reception);
       trame += reception;
       //tablecture[i] = conf.getc();    //Récupère la trame complète sur 15 Octets dans un trableau de char.
       //conf.scanf("%d", &tablecture[i]);
       //pc.printf("\ntablecture[%d] = %s \n",i,tablecture[i]);
       //pc.printf("\ntablecturei[%d] = %d \n",i,tablecturei[i]);
       //trame = tablecture[i];
    }
    
    //trame = tablecture;         //Copie le contenue de 'tablecture' dans 'trame'.
    pc.printf("\ntrame = %s \n",trame);
    led1 = 1;
    
    for(int i=0; i<13; i++){
        tab = trame.substr(i,1);
        tabi[i] = tab[0];
        cchecksum += tabi[i];
        pc.printf("\ntab[%d] = %s \n", i, tab);
        pc.printf("\ntabi[%d] = %d \n", i, tabi[i]);
        pc.printf("\ncchecksum = %d \n",cchecksum);
        }
        
    pc.printf("\ncchecksum = %d \n",cchecksum);
    moteur1 = trame.substr(4,3); //Enregistrement de deux Nombres à partir de 4.
    sstr << moteur1; //Stock le contenue du string 'start2' dans le buffer 'sstr'.
    sstr >> dec >> moteur1i; //Enregistre le contenue du buffer 'sstr' en hexa dans l'int 'start2i'.
    sstr.clear();   //Vide le buffer de 'sstr'.
    pc.printf("\nmoteur1 = %s \n",moteur1);
    pc.printf("\nmoteur1i = %d \n",moteur1i);
    
    moteur2 = trame.substr(7,3); //Enregistrement de deux Nombres à partir de 6.
    sstr << moteur2;             //Stock le contenue du string 'start2' dans le buffer 'sstr'.
    sstr >> dec >> moteur2i;     //Enregistre le contenue du buffer 'sstr' en hexa dans l'int 'start2i'.
    sstr.clear();   //Vide le buffer de 'sstr'.
    pc.printf("\nmoteur2 = %s \n",moteur2);
    pc.printf("\nmoteur2i = %d \n",moteur2i);
    
    moteur3 = trame.substr(10,3); //Enregistrement de deux Nombres à partir de 8.
    sstr << moteur3;             //Stock le contenue du string 'start2' dans le buffer 'sstr'.
    sstr >> dec >> moteur3i;     //Enregistre le contenue du buffer 'sstr' en hexa dans l'int 'start2i'.
    sstr.clear();                //Vide le buffer de 'sstr'.
    led2 = 0;
    pc.printf("\nmoteur3 = %s \n",moteur3);
    pc.printf("\nmoteur3i = %d \n",moteur3i);
    
    checksum = trame.substr(13,2);   //Enregistrement de deux Nombres à partir de 10.
    sstr << checksum;                //Stock le contenue du string 'checksum' dans le buffer 'sstr'.
    sstr >> dec >> checksumi;        //Enregistre le contenue du buffer 'sstr' en hexa dans l'int 'checksumi'.
    sstr.clear();                    //Vide le buffer de 'sstr'.
    pc.printf("\nchecksum = %s \n",checksum); 
    pc.printf("\nchecksumi = %d \n",checksumi);                  
    
    cchecksum = cchecksum % 256;    //'cchecksum' % 256.
    pc.printf("\ncchecksum = %d modulo 256\n",cchecksum);
    cchecksum = cchecksum % 100;    //'cchecksum' % 100.
    pc.printf("\ncchecksum = %d modulo 100\n",cchecksum);
    
    
    if((cchecksum) == checksumi){   
        led2 = 1;
        flag = 1;
    }
    else{
        led3 = 1;
        flag = 0;
    }
}

  /* *********************************************  */
  /*       Fonction d'envoi de position moteur      */
  /* *********************************************  */
  
void envoi_position(void){
    int moteur4i;
    myax01.SetGoal(moteur1i);     //Va a la position 'moteur1i'.
    wait(0.25);                   //Attente de 0.25sec avant de commencer a placer le moteur suivant.
    myax02.SetGoal(moteur2i);     //Va a la position 'moteur2i'.
    wait(0.25);                   //Attente de 0.25sec avant de commencer a placer le moteur suivant.
    myax03.SetGoal(moteur3i);     //Va a la position 'moteur3i'.
    moteur4i = 300 - moteur3i;    //Calcul pour la position du moteur myax03.SetGoal.
    myax04.SetGoal(moteur4i);     //Va a la position 'moteur4i'.
    wait(3);
    }
      
  /* *********************************************  */
  /*      Fonction de lecture de position moteur    */
  /* *********************************************  */
  
void lecture_position(void){
    checkmot1 = myax01.GetPosition(); //Récupération de la position du moteur 'myax01'.
    checkmot2 = myax02.GetPosition(); //Récupération de la position du moteur 'myax02'.
    checkmot3 = myax03.GetPosition(); //Récupération de la position du moteur 'myax03'.
    checkmot4 = myax04.GetPosition(); //Récupération de la position du moteur 'myax04'.
    }
  /* *********************************************  */
  /*   Fonction d'envoi de la trame sur 12 Octets   */
  /* *********************************************  */
void envoi_12octets(void){
    Serial conf(p13, p14); //(tx, rx, baud)
    //Varible interne a la fonction
    int start3 = 0xFF;  //Octet de start
    int start4 = 0xFF;  //Octet de start
    int echecksum;      //Octet de Checksum
    conf.baud(9600);
    
    
    led1 = 0;
    
    conf.putc(start3);
    echecksum += start3;
    conf.putc(start4);
    echecksum += start4;
    conf.putc(checkmot1);
    echecksum += checkmot1;
    conf.putc(checkmot2);
    echecksum += checkmot2;
    conf.putc(checkmot3);
    echecksum += checkmot3;
    conf.putc(Bx);
    echecksum += Bx;
    conf.putc(By);
    echecksum += By;
    conf.putc(Bz);
    echecksum += Bz;
    conf.putc(echecksum);
        
    led3 = 1;
}