TER Atienza Pongnot 2019 / Mbed 2 deprecated identification

Dependencies:   mbed 7366_lib TLE5206_lib

Files at this revision

API Documentation at this revision

Comitter:
natienza
Date:
Mon Mar 25 12:41:24 2019 +0000
Commit message:
A TESTER -- routine permettant une identification de la reponse indicielle selon tous les axes

Changed in this revision

7366_lib.lib Show annotated file Show diff for this revision Revisions of this file
TLE5206_lib.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/7366_lib.lib	Mon Mar 25 12:41:24 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/TER-Atienza-Pongnot-2019/code/7366_lib/#ea991921ae55
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TLE5206_lib.lib	Mon Mar 25 12:41:24 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/gpongnot/code/TLE5206_lib/#03a724b7421c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Mar 25 12:41:24 2019 +0000
@@ -0,0 +1,216 @@
+//Includes
+#include "mbed.h"
+#include "7366_lib.h"
+#include "TLE5206_lib.h"
+
+// Caractéristiques de structure
+#define RAYON_ROUE 0.025 // [m]
+#define DIST1 0.15 // [m]
+#define DIST2 0.15 // [m]
+#define DIST3 0.0075 // [m]
+#define PI 3.14159265359
+#define RESOLUTION_ENCO 14336 // = 14*1024 = rapport_reduction * nbr de top par tour
+#define ETALONNAGE_LACET 0.88
+#define ETALONNAGE_XY 1.065
+// Liaison SPI avec les compteurs 
+#define SPI_SCLK PA_5 //A4
+#define SPI_MISO PA_6 //A5
+#define SPI_MOSI PA_7 //A6
+#define SPI_CS3 PA_0//A0
+#define SPI_CS2 PA_1
+#define SPI_CS1 PA_3
+
+// Vers le pont en H
+#define H1_IN1 PA_9  //D1 - PWM1/2
+#define H1_IN2 PA_10 //D0 - PWM1/3
+#define H2_IN1 PA_8  //D9 - PWM1/1
+#define H2_IN2 PB_7  //D4 - PWM17/1
+#define H3_IN1 PB_6  //D5 - PWM16/1
+#define H3_IN2 PA_4  //A3 - PWM3/2
+
+#define DECOUP_HACH 50 //us - 20 000 kHz pour les oreilles
+#define PERIODE_AFF 500 //ms
+#define PERIODE_ASSERV 25 //ms
+
+// Constantes Asservissement
+#define GAIN_POS 1.4
+#define GAIN_ANG 5
+#define GAIN_POS_INT 0 // 1/Te
+#define GAIN_ANG_INT 0 // 1/Te
+#define ERREUR_POS 0 // transition P-PI
+#define ERREUR_ANG 0
+
+Serial pc(USBTX,USBRX);
+Timer timer;
+DigitalOut myled(LED3);
+
+SPI_7366 compt1(SPI_MOSI, SPI_MISO, SPI_SCLK,SPI_CS1);
+SPI_7366 compt2(SPI_MOSI, SPI_MISO, SPI_SCLK,SPI_CS2);
+SPI_7366 compt3(SPI_MOSI, SPI_MISO, SPI_SCLK,SPI_CS3);
+
+TLE5206 moteur1(H1_IN1,H1_IN2);
+TLE5206 moteur2(H2_IN1,H2_IN2);
+TLE5206 moteur3(H3_IN1,H3_IN2);
+
+struct Vect3{
+    double x;
+    double y;
+    double z;
+};
+
+
+struct Vect2{
+    float x;
+    float y;
+};
+
+Vect3 initVect3(){
+    Vect3 result;
+    result.x = 0;
+    result.y = 0;
+    result.z = 0;
+    return result;
+}
+
+Vect3 calculatePosition(){
+    static Vect3 theta = initVect3();
+    static Vect3 position = initVect3();
+    Vect3 dTheta;
+    double dPsi = 0;
+    
+    dTheta.x = 2*PI/RESOLUTION_ENCO*compt2.read_value() - theta.x;
+    dTheta.y = 2*PI/RESOLUTION_ENCO*compt1.read_value() - theta.y;
+    dTheta.z = 2*PI/RESOLUTION_ENCO*compt3.read_value() - theta.z;
+    theta.x += dTheta.x;
+    theta.y += dTheta.y;
+    theta.z += dTheta.z;
+    
+    dPsi = ETALONNAGE_LACET*RAYON_ROUE * ( dTheta.x + dTheta.y + dTheta.z)/(DIST1 + DIST2 + DIST3);
+
+    position.z += dPsi;// Psi actuel
+    
+    position.x += ETALONNAGE_XY*((-RAYON_ROUE * dTheta.x + DIST1 * dPsi) *  cos(position.z) + (-RAYON_ROUE * dTheta.y + DIST1 * dPsi) *  cos(position.z + 2*PI/3) + (-RAYON_ROUE * dTheta.z + DIST1 * dPsi)*cos(position.z + 4*PI/3))*2/3;
+    position.y +=-ETALONNAGE_XY*((-RAYON_ROUE * dTheta.x + DIST1 * dPsi) *  sin(position.z) + (-RAYON_ROUE * dTheta.y + DIST1 * dPsi) *  sin(position.z + 2*PI/3) + (-RAYON_ROUE * dTheta.z + DIST1 * dPsi)*sin(position.z  + 4*PI/3))*2/3;
+    
+    return position;
+}
+
+Vect3 calcErreur(Vect3 consigne, Vect3 position){
+    Vect3 erreur;
+    erreur.x = position.x - consigne.x;
+    erreur.y = position.y - consigne.y;
+    erreur.z = position.z - consigne.z;
+    return erreur;
+}
+
+Vect3 calcCommandeXYZ(Vect3 erreur){
+    
+    static Vect3 integrateur = initVect3();
+    Vect3 commande;
+    if (abs(erreur.x) > ERREUR_POS){
+        integrateur.x = 0;
+    } else {
+        integrateur.x = integrateur.x + PERIODE_ASSERV*erreur.x;
+    }
+    commande.x = GAIN_POS*(erreur.x + GAIN_POS_INT*integrateur.x);
+    
+    if (abs(erreur.y) > ERREUR_POS){
+        integrateur.y = 0;
+    } else {
+        integrateur.y = integrateur.y + PERIODE_ASSERV*erreur.y;
+    }
+    commande.y = GAIN_POS*(erreur.y + GAIN_POS_INT*integrateur.y);
+    
+    if (abs(erreur.z) > ERREUR_ANG){
+        integrateur.z = 0;
+    } else {
+        integrateur.z = integrateur.z + PERIODE_ASSERV*erreur.z;
+    }
+    commande.z = GAIN_ANG*(erreur.z + GAIN_ANG_INT*integrateur.z);
+    
+    return commande;
+    
+}
+
+Vect3 calcCommande123(Vect3 commandeXYZ, Vect3 position){
+    Vect3 commande123;
+    commande123.x = -commandeXYZ.x*cos(position.z+0*PI/3)+commandeXYZ.y*sin(position.z+0*PI/3)+commandeXYZ.z;
+    commande123.y = -commandeXYZ.x*cos(position.z+2*PI/3)+commandeXYZ.y*sin(position.z+2*PI/3)+commandeXYZ.z;
+    commande123.z = -commandeXYZ.x*cos(position.z+4*PI/3)+commandeXYZ.y*sin(position.z+4*PI/3)+commandeXYZ.z;
+    return commande123;
+}
+
+void moveBot(Vect3 commande123){
+    moteur1.write(commande123.y); 
+    moteur2.write(commande123.x);
+    moteur3.write(commande123.z);  
+}
+int main(){
+    
+    //setup
+    compt1.setup();
+    compt2.setup();
+    compt3.setup();
+    
+    moteur1.setup(DECOUP_HACH);
+    moteur2.setup(DECOUP_HACH);
+    moteur3.setup(DECOUP_HACH);
+    
+    timer.start();
+    pc.printf("SETUP effectue\n\r");
+    
+    //variables
+    Vect3 position    = initVect3();
+    Vect3 erreur      = initVect3();
+    Vect3 commandeXYZ = initVect3();
+    Vect3 commande123 = initVect3();
+    Vect3 consigne    = initVect3();
+    consigne.x = 0.50;
+    consigne.y = 0;
+    consigne.z = 0;
+
+    uint32_t seuilAffichage = PERIODE_AFF;
+    uint32_t seuilAsserv = PERIODE_ASSERV;
+    uint8_t instruction = 0;
+    int flagAsserv = -1;
+    // Loop
+    while(1) {
+        
+
+        if (pc.readable()){
+            pc.read(instruction, 1);
+            if (instruction == 0 ){
+                consigne.x = 0.50;
+                consigne.y = 0;
+                consigne.z = 0;
+                flagAsserv = 1;
+            }
+            else if (instruction == 1){
+                consigne.x = 0;
+                consigne.y = 0.50;
+                consigne.z = 0;
+                flagAsserv = 1;
+            }
+            else if(instruction ==2){
+                consigne.x = 0;
+                consigne.y = 0;
+                consigne.z = 1.6;
+                flagAsserv = 1;
+            }
+        }
+
+        if (timer.read_ms() > seuilAffichage){
+            seuilAffichage += PERIODE_AFF;
+            pc.printf("%f;%f;%f",position.x, position.y, position.z);
+            myled = !myled;
+        }
+        if (timer.read_ms() > seuilAsserv and flagAsserv == 1){
+            seuilAsserv += PERIODE_ASSERV;
+            position    = calculatePosition();
+            erreur      = calcErreur(consigne, position);
+            commandeXYZ = calcCommandeXYZ(erreur);
+            commande123 = calcCommande123(commandeXYZ, position);
+            moveBot(commande123);
+        }        
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Mar 25 12:41:24 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file