diff --git a/CMakeLists.txt b/CMakeLists.txt
index fdfe7c6..208c5b0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,6 +19,7 @@ add_executable(Mon_Projet
Geometrie.c
i2c_maitre.c
messagerie.c
+ messagerie_applicative.c
Moteurs.c
Localisation.c
main.c
diff --git a/Messagerie_propulsion2026.ods b/Messagerie_propulsion2026.ods
new file mode 100644
index 0000000..8a7ece9
Binary files /dev/null and b/Messagerie_propulsion2026.ods differ
diff --git a/Readme.md b/Readme.md
index 92cb5c3..2328981 100644
--- a/Readme.md
+++ b/Readme.md
@@ -6,12 +6,19 @@ Basé sur le code du PAMI 2025 de l'équipe Poivron Robotique.
Principales évolutions:
- Ajout de la communication USB
+- Définition des messages applicatifs
Méthode de test
---------------
+
* Éteindre la LED avec la trame : `echo -e "\xFF\xFF\x06rD\x00\x01\x36\x00" > /dev/ttyACM0`
+
* Allumer la LED avec la trame : `echo -e "\xFF\xFF\x06rD\x00\x01\x06\x00" > /dev/ttyACM0`
+* Tester la réception de la position
+
+ `echo -e "\xFF\xFF\x11rP\x00\x0C\x01\x01\x01\x01\x05\x05\x05\x05\x09\x09\x09\x09\x00" > /dev/ttyACM0`
+
Difficultés
-----------
Il suffit d'une petite modification du code (ajout d'un `printf` par exemple), pour que la communication se bloque côté PC
@@ -19,3 +26,107 @@ Il suffit d'une petite modification du code (ajout d'un `printf` par exemple), p
L'utilisation du second cœur pour envoyer la télémétrie peut perturber le débug avec printf => Augment grandement le délai de réponse
La communication crash rapidement : à cause de la danse du PAMI => Suppression de la dance du PAMI (c'était codé à l'arrache)
+
+Les points des trajectoires sont des `double`, il faut les mettre en `float`.
+
+Pas de trajectoire rotation sur soi-même ?
+
+Annexes
+=======
+
+Tables des registres
+--------------------
+
+
+Table des registres :
+---------------------
+
+| Adresse | R/W | Type | Donnée |
+| ------- | --- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 0x00 | RW | flottant 32 bits | Position X en mm |
+| 0x01 | RW | flottant 32 bits | Position X en mm |
+| 0x02 | RW | flottant 32 bits | Position X en mm |
+| 0x03 | RW | flottant 32 bits | Position X en mm |
+| 0x04 | RW | flottant 32 bits | Position Y en mm |
+| 0x05 | RW | flottant 32 bits | Position Y en mm |
+| 0x06 | RW | flottant 32 bits | Position Y en mm |
+| 0x07 | RW | flottant 32 bits | Position Y en mm |
+| 0x08 | RW | flottant 32 bits | Orientation en radian |
+| 0x09 | RW | flottant 32 bits | Orientation en radian |
+| 0x0A | RW | flottant 32 bits | Orientation en radian |
+| 0x0B | RW | flottant 32 bits | Orientation en radian |
+| 0x0C | R | Boolean | Mouvement en cours : 1
Mouvement terminé : 0 |
+| 0x0D | RW | uint8_t | Mode
0 : arrêt des moteurs
1 : pilotage des moteurs PWM
2 : pilotage en vitesse des roues
3 : pilotage avec la loi de commande
4 : Trajectoire |
+| 0x0E | RW | int_16 | Commande PWM moteur gauche |
+| 0x0F | RW | int_16 | Commande PWM moteur gauche |
+| 0x10 | RW | int_16 | Commande PWM moteur droit |
+| 0x11 | RW | int_16 | Commande PWM moteur droit |
+| 0x12 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x13 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x14 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x15 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x16 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x17 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x18 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x19 | RW | Flottant 32 bits | Consigne vitesse gauche en mm/s |
+| 0x1A | RW | Flottant 32 bits | Consigne d’avance du robot |
+| 0x1B | RW | Flottant 32 bits | Consigne d’avance du robot |
+| 0x1C | RW | Flottant 32 bits | Consigne d’avance du robot |
+| 0x1D | RW | Flottant 32 bits | Consigne d’avance du robot |
+| 0x1E | RW | Flottant 32 bits | Consigne de rotation du robot |
+| 0x1F | RW | Flottant 32 bits | Consigne de rotation du robot |
+| 0x20 | RW | Flottant 32 bits | Consigne de rotation du robot |
+| 0x21 | RW | Flottant 32 bits | Consigne de rotation du robot |
+| 0x22 | RW | Enum 8 bits | Trajectoire, type :
0 : Droite
1 : Circulaire
2 : Bézier
3 : Composée
4 : Rotation |
+| 0x23 | RW | Flottant 32 bits | Point 1, X |
+| 0x24 | RW | Flottant 32 bits | Point 1, X |
+| 0x25 | RW | Flottant 32 bits | Point 1, X |
+| 0x26 | RW | Flottant 32 bits | Point 1, X |
+| 0x27 | RW | Flottant 32 bits | Point 1, Y |
+| 0x28 | RW | Flottant 32 bits | Point 1, Y |
+| 0x29 | RW | Flottant 32 bits | Point 1, Y |
+| 0x2A | RW | Flottant 32 bits | Point 1, Y |
+| 0x2B | RW | Flottant 32 bits | Point 2, X |
+| 0x2C | RW | Flottant 32 bits | Point 2, X |
+| 0x2D | RW | Flottant 32 bits | Point 2, X |
+| 0x2E | RW | Flottant 32 bits | Point 2, X |
+| 0x2F | RW | Flottant 32 bits | Point 2, Y |
+| 0x30 | RW | Flottant 32 bits | Point 2, Y |
+| 0x31 | RW | Flottant 32 bits | Point 2, Y |
+| 0x32 | RW | Flottant 32 bits | Point 2, Y |
+| 0x33 | RW | Flottant 32 bits | Point 3, X |
+| 0x34 | RW | Flottant 32 bits | Point 3, X |
+| 0x35 | RW | Flottant 32 bits | Point 3, X |
+| 0x36 | RW | Flottant 32 bits | Point 3, X |
+| 0x37 | RW | Flottant 32 bits | Point 3, Y |
+| 0x38 | RW | Flottant 32 bits | Point 3, Y |
+| 0x39 | RW | Flottant 32 bits | Point 3, Y |
+| 0x3A | RW | Flottant 32 bits | Point 3, Y |
+| 0x3B | RW | Flottant 32 bits | Point 4, X |
+| 0x3C | RW | Flottant 32 bits | Point 4, X |
+| 0x3D | RW | Flottant 32 bits | Point 4, X |
+| 0x3E | RW | Flottant 32 bits | Point 4, X |
+| 0x3F | RW | Flottant 32 bits | Point 4, Y |
+| 0x40 | RW | Flottant 32 bits | Point 4, Y |
+| 0x41 | RW | Flottant 32 bits | Point 4, Y |
+| 0x42 | RW | Flottant 32 bits | Point 4, Y |
+| 0x43 | RW | Flottant 32 bits | orientation_debut_rad |
+| 0x44 | RW | Flottant 32 bits | orientation_debut_rad |
+| 0x45 | RW | Flottant 32 bits | orientation_debut_rad |
+| 0x46 | RW | Flottant 32 bits | orientation_debut_rad |
+| 0x47 | RW | Flottant 32 bits | orientation_fin_rad |
+| 0x48 | RW | Flottant 32 bits | orientation_fin_rad |
+| 0x49 | RW | Flottant 32 bits | orientation_fin_rad |
+| 0x4A | RW | Flottant 32 bits | orientation_fin_rad |
+| 0x4B | RW | Flottant 32 bits | rayon mm |
+| 0x4C | RW | Flottant 32 bits | rayon mm |
+| 0x4D | RW | Flottant 32 bits | rayon mm |
+| 0x4E | RW | Flottant 32 bits | rayon mm |
+| 0x4F | RW | Flottant 32 bits | Angle début rad |
+| 0x50 | RW | Flottant 32 bits | Angle début rad |
+| 0x51 | RW | Flottant 32 bits | Angle début rad |
+| 0x52 | RW | Flottant 32 bits | Angle début rad |
+| 0x53 | RW | Flottant 32 bits | Angle fin rad |
+| 0x54 | RW | Flottant 32 bits | Angle fin rad |
+| 0x55 | RW | Flottant 32 bits | Angle fin rad |
+| 0x56 | RW | Flottant 32 bits | Angle fin rad |
\ No newline at end of file
diff --git a/Trajectoire.c b/Trajectoire.c
index 063ec36..89ee335 100644
--- a/Trajectoire.c
+++ b/Trajectoire.c
@@ -135,17 +135,14 @@ struct point_xyo_t Trajectoire_get_point(struct trajectoire_t * trajectoire, dou
switch(trajectoire->type){
case TRAJECTOIRE_DROITE:
point_xyo.point_xy = Trajectoire_droite_get_point(trajectoire, abscisse);
- point_xyo.orientation = Trajectoire_get_orientation_rad(trajectoire, abscisse);
break;
case TRAJECTOIRE_CIRCULAIRE:
point_xyo.point_xy = Trajectoire_circulaire_get_point(trajectoire, abscisse);
- point_xyo.orientation = Trajectoire_get_orientation_rad(trajectoire, abscisse);
break;
case TRAJECTOIRE_BEZIER:
point_xyo.point_xy = Trajectoire_bezier_get_point(trajectoire, abscisse);
- point_xyo.orientation = Trajectoire_get_orientation_rad(trajectoire, abscisse);
break;
case TRAJECTOIRE_COMPOSEE:
diff --git a/Trajectoire.h b/Trajectoire.h
index a072781..7bcd770 100644
--- a/Trajectoire.h
+++ b/Trajectoire.h
@@ -11,12 +11,11 @@ enum trajectoire_type_t{
};
struct point_xy_t{
- double x, y;
+ float x, y;
};
struct point_xyo_t{
struct point_xy_t point_xy;
- float orientation;
};
struct trajectoire_t {
diff --git a/Trajet.c b/Trajet.c
index 7808b21..1abfee1 100644
--- a/Trajet.c
+++ b/Trajet.c
@@ -76,7 +76,6 @@ enum etat_trajet_t Trajet_avance(float pas_de_temps_s){
position.x_mm = point.point_xy.x;
position.y_mm = point.point_xy.y;
- position.angle_radian = point.orientation;
position_consigne=position;
Asser_Position(position);
diff --git a/main.c b/main.c
index bbc28c1..981d803 100644
--- a/main.c
+++ b/main.c
@@ -14,6 +14,7 @@
#include "i2c_maitre.h"
#include "Localisation.h"
#include "messagerie.h"
+#include "messagerie_applicative.h"
#include "Moteurs.h"
#include "Strategie.h"
#include "Servomoteur.h"
@@ -104,9 +105,9 @@ void main(void)
// TODO: A remettre - quand on aura récupéré un capteur
if(get_identifiant() != 0){
//multicore_launch_core1(gestion_VL53L8CX);
- multicore_launch_core1(gestion_affichage);
+ //multicore_launch_core1(gestion_affichage);
}else{
- multicore_launch_core1(gestion_affichage);
+ //multicore_launch_core1(gestion_affichage);
}
@@ -132,6 +133,64 @@ void main(void)
// données[1]: id de la carte
// données[2]: 1er registre
// données[3 à tailles_données -1]: valeurs
+ struct message_applicatif_t message_applicatif;
+
+ memcpy(&message_applicatif, message.donnees, message.taille_donnees);
+ printf("id_carte:%c %d\n", message_applicatif.id_carte, message_applicatif.id_carte);
+
+
+ if(message_applicatif.id_carte == 'P'){
+
+ mise_a_jour_position = false;
+ mise_a_jour_mode = false;
+ mise_a_jour_pwm = false;
+ mise_a_jour_vitesse_roues = false;
+ mise_a_jour_vitesse_robot = false;
+ mise_a_jour_trajectoire = false;
+
+ // Copie des données dans la mémoire d'échange
+ // Et actualisation des variables "mise_a_jour_..."
+ for (int num_octet=0; num_octet' pour des logs
- uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C)
- uint8_t adresse_registre; // Adresse du registre lu
+ uint8_t type; // 'b' pour binaire, '>' pour des logs
uint8_t taille_donnees;
- uint8_t donnees[255];
+ uint8_t donnees[255];
};
struct message_requete_t{
@@ -17,6 +16,20 @@ struct message_requete_t{
uint8_t taille_donnees;
};
+struct message_applicatif_t{
+ uint8_t commande; // 'r' : réception de données, 'd' : demande de données
+ uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C)
+ uint8_t adresse_registre; // Adresse du registre lu ou écrit
+ uint8_t taille_donnees;
+ union{
+ uint8_t donnees[100];
+#ifdef MESSAGE_PROPULSION_H
+ struct msg_propulsion_position_t msg_propulsion_position;
+#endif
+
+ }donnees_applicative;
+
+};
bool messagerie_message_disponible();
struct message_t messagerie_get_message();
diff --git a/messagerie_applicative.c b/messagerie_applicative.c
new file mode 100644
index 0000000..44b86a5
--- /dev/null
+++ b/messagerie_applicative.c
@@ -0,0 +1,50 @@
+#include
+#include "messagerie_applicative.h"
+
+uint8_t memoire_echange[200];
+
+
+
+bool mise_a_jour_position = false;
+bool mise_a_jour_mode = false;
+bool mise_a_jour_pwm = false;
+bool mise_a_jour_vitesse_roues = false;
+bool mise_a_jour_vitesse_robot = false;
+bool mise_a_jour_trajectoire = false;
+
+void get_données_reçues(uint8_t * dst, unsigned int taille, unsigned int registre){
+ memcpy(dst, &(memoire_echange[registre]), taille);
+}
+
+
+void écriture_données(unsigned int adresse, uint8_t donnée){
+ if( adresse <= 11){
+ // Position du robot
+ mise_a_jour_position = true;
+ }else if(adresse <= 12){
+ // Read only
+
+ }else if(adresse <= 13){
+ // Mode
+ mise_a_jour_mode = true;
+ }else if(adresse <= 17){
+ // PWM moteur
+ mise_a_jour_pwm = true;
+ }else if(adresse <= 25){
+ // Vitesse roues
+ mise_a_jour_vitesse_roues = true;
+ }else if(adresse <= 33){
+ // Vitesse robot
+ mise_a_jour_vitesse_robot = true;
+ }else if(adresse <= 86){
+ // Trajectoire
+ mise_a_jour_trajectoire = true;
+ }else if(adresse >86){
+ // Hors mémoire
+ return;
+ }
+
+ memoire_echange[adresse] = donnée;
+
+
+}
diff --git a/messagerie_applicative.h b/messagerie_applicative.h
new file mode 100644
index 0000000..cf05b5f
--- /dev/null
+++ b/messagerie_applicative.h
@@ -0,0 +1,12 @@
+#include
+#include
+
+void écriture_données(unsigned int adresse, uint8_t donnée);
+void get_données_reçues(uint8_t * dst, unsigned int taille, unsigned int registre);
+
+extern bool mise_a_jour_position;
+extern bool mise_a_jour_mode;
+extern bool mise_a_jour_pwm;
+extern bool mise_a_jour_vitesse_roues;
+extern bool mise_a_jour_vitesse_robot;
+extern bool mise_a_jour_trajectoire;
\ No newline at end of file
diff --git a/messages_propulsion.h b/messages_propulsion.h
new file mode 100644
index 0000000..8317e15
--- /dev/null
+++ b/messages_propulsion.h
@@ -0,0 +1,27 @@
+#ifndef MESSAGE_PROPULSION_H
+#define MESSAGE_PROPULSION_H
+#define USB_ID_PROPULSION 'P'
+
+#define REG_PROPULSION_POSITION 0x00
+#define REG_PROPULSION_MODE 0x0D
+#define REG_PROPULSION_PWM 0x0E
+#define REG_PROPULSION_VITESSE_ROUES 0x12
+#define REG_PROPULSION_VITESSE_ROBOT 0x1A
+
+struct msg_propulsion_position_t{
+ float position_x_mm, position_y_mm, orientation_rad;
+};
+
+struct msg_propulsion_pwm_t{
+ uint16_t pwm_gauche, pwm_droit;
+};
+
+struct msg_propulsion_vitesse_roues_t{
+ float vitesse_gauche_mm_s, vitesse_droite_mm_s;
+};
+
+struct msg_propulsion_vitesse_robot_t {
+ float avance_mm_s, rotation_rad_s;
+};
+
+#endif
\ No newline at end of file