Time is good

Dependencies:   RoboClaw mbed

Fork of Robot2016_2-0 by ARES

Files at this revision

API Documentation at this revision

Comitter:
sype
Date:
Mon Apr 25 12:38:58 2016 +0000
Parent:
45:b53ae54062c6
Child:
48:03da1aead032
Commit message:
ajout de la carte boutons ;

Changed in this revision

AX12/AX12.h Show annotated file Show diff for this revision Revisions of this file
Functions/func.cpp Show annotated file Show diff for this revision Revisions of this file
Functions/func.h Show annotated file Show diff for this revision Revisions of this file
Odometry/Odometry.cpp Show annotated file Show diff for this revision Revisions of this file
Odometry/Odometry.h Show annotated file Show diff for this revision Revisions of this file
RoboClaw.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
main.cpp.orig Show diff for this revision Revisions of this file
--- a/AX12/AX12.h	Wed Apr 13 12:47:47 2016 +0000
+++ b/AX12/AX12.h	Mon Apr 25 12:38:58 2016 +0000
@@ -48,7 +48,7 @@
 #define AX12_CW 1
 #define AX12_CCW 0
 
-#/** Servo control class, based on a PwmOut
+/** Servo control class, based on a PwmOut
  *
  * Example:
  * @code
--- a/Functions/func.cpp	Wed Apr 13 12:47:47 2016 +0000
+++ b/Functions/func.cpp	Mon Apr 25 12:38:58 2016 +0000
@@ -2,106 +2,106 @@
 
 void pressed(void)
 {
-    if(i==0) {
-        roboclaw.ForwardM1(ADR, 0);
-        roboclaw.ForwardM2(ADR, 0);
-        i++;
+    if(SIMON_i==0) {
+        roboclaw.ForwardM1(0);
+        roboclaw.ForwardM2(0);
+        SIMON_i++;
     }
 }
 
 void unpressed(void)
 {
-    if(i==1) {
-        i--;
+    if(SIMON_i==1) {
+        SIMON_i--;
     }
 }
 
 void ELpressed(void)
 {
-    //bleu = 1;
-    EL = true;
+    bleu = 1;
+    SIMON_EL = true;
 }
 void ELunpressed(void)
 {
-    //bleu = 0;
-    EL = false;
+    bleu = 0;
+    SIMON_EL = false;
 }
 
 void EZpressed(void)
 {
-    //blanc = 1;
-    EZ = true;
+    blanc = 1;
+    SIMON_EZ = true;
 }
 void EZunpressed(void)
 {
-    //blanc = 0;
-    EZ = false;
+    blanc = 0;
+    SIMON_EZ = false;
 }
 
 void ERpressed(void)
 {
-    //rouge = 1;
-    ER = true;
+    rouge = 1;
+    SIMON_ER = true;
 }
 void ERunpressed(void)
 {
-    //rouge = 0;
-    ER = 0;
+    rouge = 0;
+    SIMON_ER = 0;
 }
 
 void JPO(void)
 {
     char c = logger.getc();
     if(c=='z') {
-        if (state != 1) {
-            state = 1;
+        if (SIMON_state != 1) {
+            SIMON_state = 1;
             logger.printf("Avant (Z) \r\n");
-            roboclaw.SpeedAccelM1(ADR, accel_angle, vitesse_angle);
-            roboclaw.SpeedAccelM2(ADR, accel_angle, vitesse_angle);
+            roboclaw.SpeedAccelM1(accel_angle, vitesse_angle);
+            roboclaw.SpeedAccelM2(accel_angle, vitesse_angle);
         }
     } else if(c == 's') {
-        if (state != 2) {
-            state = 2;
+        if (SIMON_state != 2) {
+            SIMON_state = 2;
             logger.printf("Stop (S) \r\n");
-            roboclaw.SpeedAccelM1(ADR, accel_angle, 0);
-            roboclaw.SpeedAccelM2(ADR, accel_angle, 0);
+            roboclaw.SpeedAccelM1(accel_angle, 0);
+            roboclaw.SpeedAccelM2(accel_angle, 0);
         }
     } else if(c == 'd') {
-        if (state != 3) {
-            state = 3;
+        if (SIMON_state != 3) {
+            SIMON_state = 3;
             logger.printf("Droite (D) \r\n");
-            roboclaw.SpeedAccelM1(ADR, accel_angle, -vitesse_angle);
-            roboclaw.SpeedAccelM2(ADR, accel_angle, vitesse_angle);
+            roboclaw.SpeedAccelM1(accel_angle, -vitesse_angle);
+            roboclaw.SpeedAccelM2(accel_angle, vitesse_angle);
         }
     } else if(c == 'q') {
-        if (state != 4) {
-            state = 4;
+        if (SIMON_state != 4) {
+            SIMON_state = 4;
             logger.printf("Gauche (Q)\r\n");
-            roboclaw.SpeedAccelM1(ADR, accel_angle, vitesse_angle);
-            roboclaw.SpeedAccelM2(ADR, accel_angle, -vitesse_angle);
+            roboclaw.SpeedAccelM1(accel_angle, vitesse_angle);
+            roboclaw.SpeedAccelM2(accel_angle, -vitesse_angle);
         }
     } else if(c == 'x') {
-        if (state != 5) {
-            state = 5;
-            roboclaw.SpeedAccelM1(ADR, accel_angle, -vitesse_angle);
-            roboclaw.SpeedAccelM2(ADR, accel_angle, -vitesse_angle);
+        if (SIMON_state != 5) {
+            SIMON_state = 5;
+            roboclaw.SpeedAccelM1(accel_angle, -vitesse_angle);
+            roboclaw.SpeedAccelM2(accel_angle, -vitesse_angle);
         }
     } else {
-        if (state != 0) {
-            roboclaw.SpeedAccelM1M2(ADR, accel_angle, 0, accel_angle, 0);
-            state = 0;
+        if (SIMON_state != 0) {
+            roboclaw.SpeedAccelM1M2(accel_angle, 0, accel_angle, 0);
+            SIMON_state = 0;
         }
     }
 }
 
 void goHome(void)
 {
-    while(EZ==false) ZMot.step(1, 0, DELAY);
-    while(ER==false) RMot.step(1, 0, DELAY);
-    RMot.step(10, 1, DELAY);
+    //while(EZ==false) ZMot.step(1, 0, DELAY);
+    while(SIMON_ER==false) RMot.step(1, 0, DELAY);
+    RMot.step(10, 1, DELAY+0.01);
     RMot.step(5, 0, DELAY);
-    while(EL==false) LMot.step(1, 0, DELAY);
-    LMot.step(10, 1, DELAY);
+    while(SIMON_EL==false) LMot.step(1, 0, DELAY);
+    LMot.step(10, 1, DELAY+0.01);
     LMot.step(5, 0, DELAY);
 }
 
@@ -135,20 +135,36 @@
 
 void init_interrupt(void)
 {
+    CAMP.fall(&changeCamp);
+    CAMP.rise(&changeCampoff);
+    START.rise(&letsgo);
+    START.fall(&letsgooff);
     mybutton.fall(&pressed);
     mybutton.rise(&unpressed);
-
     EndL.fall(&ELpressed);
     EndL.rise(&ELunpressed);
     EndZ.fall(&EZpressed);
     EndZ.rise(&EZunpressed);
     EndR.fall(&ERpressed);
     EndR.rise(&ERunpressed);
-    ticker.attach_us(&update_main,dt); // 100 Hz
+}
+
+void changeCamp(void)
+{
+    LEDV = 1;
 }
 
-void update_main(void)
+void changeCampoff(void)
+{
+    LEDV = 0;
+}
+
+void letsgo(void)
 {
-    odo.update_odo();
-    checkAround();
+    LEDR = 0;
+}
+
+void letsgooff(void)
+{
+    LEDR = 1;
 }
\ No newline at end of file
--- a/Functions/func.h	Wed Apr 13 12:47:47 2016 +0000
+++ b/Functions/func.h	Mon Apr 25 12:38:58 2016 +0000
@@ -9,7 +9,6 @@
 #include "AX12.h"
 
 #define SEUIL 0.25
-#define dt 10000
 
 extern Serial logger;
 extern RoboClaw roboclaw;
@@ -28,12 +27,19 @@
 extern InterruptIn EndL;
 extern AX12 left_hand;
 extern AX12 right_hand;
-extern Ticker ticker;
 extern Odometry odo;
+extern InterruptIn CAMP;
+extern InterruptIn START;
+extern DigitalOut LEDR;
+extern DigitalOut LEDV;
 
-extern int i, state;
-extern bool EL, EZ, ER;
+extern int SIMON_i, SIMON_state;
+extern bool SIMON_EL, SIMON_EZ, SIMON_ER;
 
+void changeCamp(void);
+void changeCampoff(void);
+void letsgo(void);
+void letsgooff(void);
 void ELpressed(void);
 void ELunpressed(void);
 void EZpressed(void);
@@ -49,6 +55,5 @@
 void init_interrupt(void);
 void goHome(void);
 void checkAround(void);
-void update_main(void);
 
 #endif
\ No newline at end of file
--- a/Odometry/Odometry.cpp	Wed Apr 13 12:47:47 2016 +0000
+++ b/Odometry/Odometry.cpp	Mon Apr 25 12:38:58 2016 +0000
@@ -8,9 +8,9 @@
     m_distPerTick_left = diameter_left*PI/quadrature;
     m_distPerTick_right = diameter_right*PI/quadrature;
 
-    roboclaw.ForwardM1(ADR, 0);
-    roboclaw.ForwardM2(ADR, 0);
-    roboclaw.ResetEnc(ADR);
+    roboclaw.ForwardM1(0);
+    roboclaw.ForwardM2(0);
+    roboclaw.ResetEnc();
     // Erreur autorisée sur le déplacement en angle
     erreur_ang = 0.01;
 
@@ -28,7 +28,7 @@
 }
 void Odometry::getEnc()
 {
-    logger.printf("EncM1 : %d\tEncM2 : %d\n\r", roboclaw.ReadEncM1(ADR), roboclaw.ReadEncM2(ADR));
+    logger.printf("EncM1 : %d\tEncM2 : %d\n\r", roboclaw.ReadEncM1(), roboclaw.ReadEncM2());
 }
 
 void Odometry::setX(double x)
@@ -48,8 +48,8 @@
 
 void Odometry::update_odo(void)
 {
-    int32_t roboclawENCM1 = roboclaw.ReadEncM1(ADR); 
-    int32_t roboclawENCM2 = roboclaw.ReadEncM2(ADR); 
+    int32_t roboclawENCM1 = roboclaw.ReadEncM1(); 
+    int32_t roboclawENCM2 = roboclaw.ReadEncM2();
     int32_t delta_right = roboclawENCM1 - m_pulses_right;
     m_pulses_right = roboclawENCM1;
     int32_t delta_left = roboclawENCM2 - m_pulses_left;
@@ -84,7 +84,6 @@
     theta += deltaTheta;
     while(theta > PI) theta -= 2*PI;
     while(theta <= -PI) theta += 2*PI;
-    
 }
 
 void Odometry::GotoXY(double x_goal, double y_goal)
@@ -108,7 +107,6 @@
 
 void Odometry::GotoThet(double theta_)
 {
-    led = 0;
     //pos_prog++;
     //logger.printf("Theta : %3.2f\n\r", theta_*180/PI);
     //arrived = false;
@@ -138,21 +136,19 @@
     //logger.printf("X : %3.2f\tY : %3.2f\tTheta : %3.2f\n\r", getX(), getY(), getTheta()*180/PI);
     //logger.printf("M1 %6d\tM2 %6d\n\r",distance_ticks_right, distance_ticks_left);
 
-    roboclaw.SpeedAccelDeccelPositionM1M2(ADR, accel_angle, vitesse_angle, deccel_angle, distance_ticks_right, accel_angle, vitesse_angle, deccel_angle, distance_ticks_left, 1);
+    roboclaw.SpeedAccelDeccelPositionM1M2(accel_angle, vitesse_angle, deccel_angle, distance_ticks_right, accel_angle, vitesse_angle, deccel_angle, distance_ticks_left, 1);
 
     //logger.printf("IniR:%6d\tDistR:%6d\tIniL:%6d\tDistL:%6d\n\r", pos_initiale_right, distance_ticks_right, pos_initiale_left, distance_ticks_left);
 
     while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); //logger.printf("%6d\t%6d\t%6d\t%6d\t%6d\n\r",m_pulses_right - pos_initiale_right, distance_ticks_right, m_pulses_left - pos_initiale_left, distance_ticks_left);
     wait(0.4);
     setTheta(theta_);
-    led = 1;
     //arrived = true;
     //logger.printf("arrivey %d\n\r",pos_prog);
 }
 
 void Odometry::GotoDist(double distance)
 {
-    led = 0;
     //pos_prog++;
     //logger.printf("Dist : %3.2f\n\r", distance);
     //arrived = false;
@@ -162,13 +158,12 @@
     int32_t distance_ticks_right = (int32_t) distance/m_distPerTick_right + pos_initiale_right;
     int32_t distance_ticks_left = (int32_t) distance/m_distPerTick_left + pos_initiale_left;
 
-    roboclaw.SpeedAccelDeccelPositionM1M2(ADR, accel_dista, vitesse_dista, deccel_dista, distance_ticks_right, accel_dista, vitesse_dista, deccel_dista, distance_ticks_left, 1);
+    roboclaw.SpeedAccelDeccelPositionM1M2(accel_dista, vitesse_dista, deccel_dista, distance_ticks_right, accel_dista, vitesse_dista, deccel_dista, distance_ticks_left, 1);
 
     //logger.printf("IniR:%6d\tDistR:%6d\tIniL:%6d\tDistL:%6d\n\r", pos_initiale_right, distance_ticks_right, pos_initiale_left, distance_ticks_left);
     
     while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); //logger.printf("PR:%6d\tIR:%6d\tDR:%6d\tPL:%6d\tIL:%6d\tDL:%6d\n\r",m_pulses_right, pos_initiale_right, distance_ticks_right, m_pulses_left, pos_initiale_left, distance_ticks_left);
     wait(0.4);
-    led = 1;
     //logger.printf("arrivey %d\n\r",pos_prog);
     //logger.printf("X : %3.2f\tY : %3.2f\tTheta : %3.2f\n\r", getX(), getY(), getTheta()*180/PI);
 }
@@ -188,7 +183,7 @@
         distance_ticks_right = (int32_t) pos_initiale_right - (erreur_theta*m_v/2)/m_distPerTick_right;
     }
     
-    roboclaw.SpeedAccelDeccelPositionM1M2(ADR, accel_angle, vitesse_angle, deccel_angle, distance_ticks_right, accel_angle, vitesse_angle, deccel_angle, distance_ticks_left, 1);
+    roboclaw.SpeedAccelDeccelPositionM1M2(accel_angle, vitesse_angle, deccel_angle, distance_ticks_right, accel_angle, vitesse_angle, deccel_angle, distance_ticks_left, 1);
     
     while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); 
     wait(0.4);
@@ -200,11 +195,10 @@
     int32_t distance_ticks_right = (int32_t) i/m_distPerTick_right + pos_initiale_right;
     int32_t distance_ticks_left = (int32_t) i/m_distPerTick_left + pos_initiale_left;
 
-    roboclaw.SpeedAccelDeccelPositionM1M2(ADR, accel_dista, vitesse_dista, deccel_dista, distance_ticks_right, accel_dista, vitesse_dista, deccel_dista, distance_ticks_left, 1);
+    roboclaw.SpeedAccelDeccelPositionM1M2(accel_dista, vitesse_dista, deccel_dista, distance_ticks_right, accel_dista, vitesse_dista, deccel_dista, distance_ticks_left, 1);
 
     //logger.printf("IniR:%6d\tDistR:%6d\tIniL:%6d\tDistL:%6d\n\r", pos_initiale_right, distance_ticks_right, pos_initiale_left, distance_ticks_left);
     
     while((m_pulses_right != distance_ticks_right)&&(m_pulses_left != distance_ticks_left)); //logger.printf("PR:%6d\tIR:%6d\tDR:%6d\tPL:%6d\tIL:%6d\tDL:%6d\n\r",m_pulses_right, pos_initiale_right, distance_ticks_right, m_pulses_left, pos_initiale_left, distance_ticks_left);
     wait(0.4);
-    led = 1;
 }
\ No newline at end of file
--- a/Odometry/Odometry.h	Wed Apr 13 12:47:47 2016 +0000
+++ b/Odometry/Odometry.h	Mon Apr 25 12:38:58 2016 +0000
@@ -25,7 +25,6 @@
 */
 
 extern Serial logger;
-extern DigitalOut led;
 
 /** Permet la gestion de l'odometrie du robot **/
 class Odometry
--- a/RoboClaw.lib	Wed Apr 13 12:47:47 2016 +0000
+++ b/RoboClaw.lib	Mon Apr 25 12:38:58 2016 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/ARES/code/RoboClaw/#ece8a8cdf4b0
+https://developer.mbed.org/teams/ARES/code/RoboClaw/#af0e3da221a9
--- a/main.cpp	Wed Apr 13 12:47:47 2016 +0000
+++ b/main.cpp	Mon Apr 25 12:38:58 2016 +0000
@@ -3,18 +3,32 @@
 #define ATTENTE 0
 #define GO 1
 #define STOP 2
+#define ADR 0x80
+#define dt 10000
 
 /* Déclaration des différents éléments de l'IHM */
+
+/* Carte boutons, la NUCLEO n'arrive pas à récupérer les signaux CAMP et START */
+InterruptIn CAMP(PH_0);
+InterruptIn START(PH_1);
+DigitalOut LEDR(PC_2);
+DigitalOut LEDV(PC_3);
+
 InterruptIn mybutton(USER_BUTTON);
 DigitalIn button(USER_BUTTON);
-DigitalOut led(LED1);
+
+DigitalIn ChannelA1(PA_1);
+DigitalIn ChannelB1(PA_0);
+DigitalIn ChannelA2(PA_5);
+DigitalIn ChannelB2(PA_6);
+
 DigitalOut bleu(PC_5);
 DigitalOut blanc(PC_6);
 DigitalOut rouge(PC_8);
 
-/* AX12 */
-AX12 left_hand(PA_15, PB_7, 4, 250000);
-AX12 right_hand(PA_15, PB_7, 1, 250000);
+/* AX12 - non fonctionnels, je pense que le souci vient de la bibliothèque car la trame n'est pas correcte (analyseur logique) */
+AX12 left_hand(PA_9, PA_10, 4, 250000);
+AX12 right_hand(PA_9, PA_10, 1, 250000);
 
 /* Sharp */
 AnalogIn capt1(PA_4);
@@ -23,9 +37,9 @@
 AnalogIn capt4(PC_0);
 
 /* Moteurs pas à pas */
-Stepper RMot(NC, PB_10, PA_8);
-Stepper ZMot(NC, PB_5, PB_4);
-Stepper LMot(NC, PB_3, PA_10);
+Stepper RMot(NC, PA_8, PC_7);
+Stepper ZMot(NC, PB_4, PB_10);
+Stepper LMot(NC, PB_5, PB_3);
 /* Fins de course */
 InterruptIn EndR(PB_15);
 InterruptIn EndZ(PB_14);
@@ -34,14 +48,15 @@
 Ticker ticker;
 
 Serial logger(USBTX, USBRX);
-//Serial logger(PA_9, PA_10);
-RoboClaw roboclaw(460800, PA_11, PA_12);
+//Serial logger(PA_2, PA_3);
+RoboClaw roboclaw(ADR, 460800, PA_11, PA_12);
 Odometry odo(61.7, 61.8, ENTRAXE, 4096, roboclaw);
 
-int i = 0, state = 0;
-bool EL = false, EZ = false, ER = false;
+int SIMON_i = 0, SIMON_state = 0;
+bool SIMON_EL = false, SIMON_EZ = false, SIMON_ER = false;
 
 void init(void);
+void update_main(void);
 
 /* Debut du programme */
 int main(void)
@@ -52,20 +67,22 @@
 
 void init(void)
 {
-    roboclaw.ForwardM1(ADR, 0);
-    roboclaw.ForwardM2(ADR, 0);
     logger.baud(9600);
     logger.printf("Hello from main !\n\r");
-    wait_ms(500);
-    bleu = 1, blanc = 1, rouge = 1;
-    wait_ms(1000);
-    bleu = 0, blanc = 0, rouge = 0;
-    
+    roboclaw.ForwardM1(0);
+    roboclaw.ForwardM2(0);
+    LEDV = 1;
     while(button);
-    wait(1);
-    
-    init_ax12();
+    LEDV = 0;
+    roboclaw.ResetEnc();
     init_interrupt();
+    ticker.attach_us(&update_main, dt); // 100 Hz    
     wait_ms(100);
     logger.printf("End init\n\r");
 }
+
+void update_main(void)
+{
+    odo.update_odo();
+    //checkAround();
+}
\ No newline at end of file
--- a/main.cpp.orig	Wed Apr 13 12:47:47 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-#include "Odometry.h"
-/** Dependencies :
-    Map/Point.h
-    Map/define.h
-    Map/Obstacles/Obstacle.h
-
-    Test en cours :
-    * Un obstacle seulement
-    * Radius du robot réduit à 1 (defines.cpp)
-    * Nombreux
-*/ 
-#include "Map/Map.h"
-
-#define dt 10000
-#define ATTENTE 0
-#define GO 1
-#define STOP 2
-
-InterruptIn mybutton(USER_BUTTON);
-DigitalIn button(USER_BUTTON);
-DigitalOut led(LED1);
-Ticker ticker;
-//Serial pc(USBTX, USBRX);
-Serial pc(PA_9, PA_10);
-RoboClaw roboclaw(460800, PA_11, PA_12);
-Odometry odo(63.2, 63.3, 252, 4096, roboclaw);
-
-int i = 0;
-
-void update_main(void);
-void init(void);
-void pressed(void);
-void unpressed(void);
-
-/** Debut du programme */
-int main(void)
-{
-    double angle_v = 2*PI/5;
-    double distance_v = 200.0;
-    std::vector<SimplePoint> path;
-    Map map;
-    
-    init();
-    //Construction des obstacles
-    map.build();
-    map.Astar(0, 1000, 2000, 1000);
-    path = map.path;
-    
-    for(int i=0; i<path.size();i++) {
-        odo.GotoXYT(path[i].x, path[i].y, 0);
-    }
-        
-    //odo.GotoXYT(500, 50, 0);
-    //odo.GotoXYT(200, 0, 0);
-    //odo.GotoXYT(0, 0, 0);
-
-    //odo.GotoThet(-PI/2);
-    wait(2000);
-    //odo.GotoXYT(2250,500,0);
-    while(1);
-}
-
-void init(void)
-{
-    pc.baud(9600);
-    pc.printf("Hello from main !\n\r");
-    wait_ms(500);
-    
-    odo.setPos(0, 0, 0);
-    roboclaw.ForwardM1(ADR, 0);
-    roboclaw.ForwardM2(ADR, 0);
-    
-    while(button);
-    wait(1);
-    mybutton.fall(&pressed);
-    mybutton.rise(&unpressed);
-    ticker.attach_us(&update_main,dt); // 100 Hz
-}
-
-void update_main(void)
-{
-    odo.update_odo();
-    //pc.printf("X : %3.2f\tY : %3.2f\tTheta : %3.2f\n\r", odo.getX(), odo.getY(), odo.getTheta()*180/PI);
-    //if(pc.readable()) if(pc.getc()=='l') led = !led;
-}
-
-void pressed(void)
-{
-    if(i==0) {
-        roboclaw.ForwardM1(ADR, 0);
-        roboclaw.ForwardM2(ADR, 0);
-        //pc.printf("X : %3.2f\tY : %3.2f\tTheta : %3.2f\n\r", odo.getX(), odo.getY(), odo.getTheta()*180/PI);
-        i++;
-    }
-}
-
-void unpressed(void)
-{
-    if(i==1) {
-        i--;
-    }
-}
\ No newline at end of file