Module communication
This commit is contained in:
commit
4458f231ff
9
CMakeLists.txt
Normal file
9
CMakeLists.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
project(Mod_Communication C)
|
||||||
|
|
||||||
|
add_library(Mod_Communication
|
||||||
|
Servomoteur.c
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(Mod_Communication
|
||||||
|
pico_stdlib
|
||||||
|
)
|
||||||
65
Readme.md
Normal file
65
Readme.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
Submodule Servomoteurs pour le RP2040
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Ceci est un submodule git pour intégrer facilement le support des servomoteurs à un projet.
|
||||||
|
On crée ce Submodule en se servant de la documentation disponible ici : https://git-scm.com/book/en/v2/Git-Tools-Submodules
|
||||||
|
|
||||||
|
Utilisation
|
||||||
|
===========
|
||||||
|
|
||||||
|
Ajout du sub-module
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Ajouter ce submodule à votre projet. Dans un terminal, dans le répertoire de votre projet, entrez :
|
||||||
|
|
||||||
|
git submodule add https://git.poivron-robotique.fr/Keuronde/RP2040_Servomoteurs.git
|
||||||
|
|
||||||
|
Ajouter le fichier nouvellement créé .gitmodules à votre projet.
|
||||||
|
|
||||||
|
git add .gitmodules
|
||||||
|
|
||||||
|
Configuration de la compilation
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Dans le fichier CMakeLists.txt, ajouter le dossier du sub module:
|
||||||
|
|
||||||
|
add_subdirectory(RP2040_Servomoteurs)
|
||||||
|
|
||||||
|
Dans le fichier CMakeLists.txt, ajouter la bibliothèque RP2040_Servomoteur :
|
||||||
|
|
||||||
|
target_link_libraries(Modele_RPiPico
|
||||||
|
...
|
||||||
|
RP2040_Servomoteur
|
||||||
|
)
|
||||||
|
|
||||||
|
Intégration au code source
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Ajout du fichier d'include :
|
||||||
|
|
||||||
|
#include "RP2040_Servomoteurs/Servomoteur.h"
|
||||||
|
|
||||||
|
Initilisation du module :
|
||||||
|
|
||||||
|
Servomoteur_Init();
|
||||||
|
|
||||||
|
Envoie d'une consigne au servomoteur :
|
||||||
|
|
||||||
|
Servomoteur_set(num_gpio, position);
|
||||||
|
|
||||||
|
Avec :
|
||||||
|
- num_gpio : le numéro de la GPIO du RP2040
|
||||||
|
- position : la position du servomoteur, qui correspond à un temps haut du signal compris généralement en 0,5 et 2,5 ms (en fonction des servomoteurs). le fichier _Servomoteur.h_ contient des valeurs d'exemple.
|
||||||
|
|
||||||
|
Cas où vous clonez un projet contenant des submodules
|
||||||
|
-----------------------------------------------------
|
||||||
|
|
||||||
|
Après avoir cloné le projet, initilisez les submodules:
|
||||||
|
|
||||||
|
git submodule init
|
||||||
|
|
||||||
|
git submodule update
|
||||||
|
|
||||||
|
Pour récupérer les dernières mise à jour des sub-modules :
|
||||||
|
|
||||||
|
git submodule update --remote
|
||||||
151
communication.c
Normal file
151
communication.c
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
#include "pico/error.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "communication.h"
|
||||||
|
#include "messagerie.h"
|
||||||
|
#include "tusb.h"
|
||||||
|
|
||||||
|
#define TAMPON_TAILLE 1020
|
||||||
|
|
||||||
|
struct com_reception_buffer_t{
|
||||||
|
char tampon[TAMPON_TAILLE]; // Tampon tournant - 1er niveau de tampon
|
||||||
|
unsigned int index_tampon_ecriture, index_tampon_lecture;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct com_reception_buffer_t com_reception_buffer;
|
||||||
|
|
||||||
|
|
||||||
|
void communication_init(){
|
||||||
|
com_reception_buffer.index_tampon_ecriture=0;
|
||||||
|
com_reception_buffer.index_tampon_lecture=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Incrémente l'index du tampon tournant
|
||||||
|
/// @param index
|
||||||
|
/// @return
|
||||||
|
void increment_index(unsigned int *index){
|
||||||
|
*index = 1 + *index ;
|
||||||
|
if((*index) >= TAMPON_TAILLE){
|
||||||
|
*index = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief augmente la position l'index du tampon tournant
|
||||||
|
/// @param index
|
||||||
|
/// @return
|
||||||
|
void augmente_index(unsigned int *index, unsigned int offset){
|
||||||
|
*index = offset + *index ;
|
||||||
|
if((*index) >= TAMPON_TAILLE){
|
||||||
|
*index -= TAMPON_TAILLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Vérifie si des caractères ont été reçu par la liaison série
|
||||||
|
/// et analyse si un message valide a été reçu.
|
||||||
|
void communication_reception_message(){
|
||||||
|
int input_char;
|
||||||
|
int chaîne_octets_reçus[TAMPON_TAILLE];
|
||||||
|
unsigned int index_chaine_recue;
|
||||||
|
unsigned int index_tampon;
|
||||||
|
struct message_t message;
|
||||||
|
// Si un caractère est reçu, ajout du caractère au tampon tournant
|
||||||
|
|
||||||
|
/// TODO: Tester le code suivant à la place de while get_char();
|
||||||
|
/*
|
||||||
|
char nb_recu=0;
|
||||||
|
if(tud_cdc_available()){
|
||||||
|
char tampon_usb[128];
|
||||||
|
nb_recu = tud_cdc_read(tampon_usb, 128);
|
||||||
|
// copie dans le tampon tournant
|
||||||
|
for(int i=0; i<nb_recu; i++){
|
||||||
|
input_char = tampon_usb[i];
|
||||||
|
com_reception_buffer.index_tampon_ecriture++;
|
||||||
|
if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){
|
||||||
|
com_reception_buffer.index_tampon_ecriture = 0;
|
||||||
|
}
|
||||||
|
com_reception_buffer.tampon[com_reception_buffer.index_tampon_ecriture] = input_char;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
input_char = stdio_getchar_timeout_us(0);
|
||||||
|
while(input_char != PICO_ERROR_TIMEOUT){
|
||||||
|
com_reception_buffer.index_tampon_ecriture++;
|
||||||
|
if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){
|
||||||
|
com_reception_buffer.index_tampon_ecriture = 0;
|
||||||
|
}
|
||||||
|
com_reception_buffer.tampon[com_reception_buffer.index_tampon_ecriture] = input_char;
|
||||||
|
|
||||||
|
// Caractère suivant ?
|
||||||
|
input_char = stdio_getchar_timeout_us(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copie du tampon tournant dans une chaine
|
||||||
|
// Parce que c'est plus simple à traiter
|
||||||
|
index_chaine_recue = 0;
|
||||||
|
index_tampon = com_reception_buffer.index_tampon_lecture;
|
||||||
|
if(index_tampon != com_reception_buffer.index_tampon_ecriture){
|
||||||
|
while(index_tampon != com_reception_buffer.index_tampon_ecriture){
|
||||||
|
chaîne_octets_reçus[index_chaine_recue] = com_reception_buffer.tampon[index_tampon];
|
||||||
|
index_chaine_recue++;
|
||||||
|
increment_index(&index_tampon);
|
||||||
|
}
|
||||||
|
chaîne_octets_reçus[index_chaine_recue] = com_reception_buffer.tampon[index_tampon];
|
||||||
|
index_chaine_recue++;
|
||||||
|
increment_index(&index_tampon);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Traitement
|
||||||
|
// Si on trouve le début du message
|
||||||
|
// Si on trouve la taille du message
|
||||||
|
// Si le caractère de fin est bien à la fin du message
|
||||||
|
int fin_message = 0;
|
||||||
|
for(int i=0; i<index_chaine_recue; i++){
|
||||||
|
int index_fin_message = 0;
|
||||||
|
// Com v2
|
||||||
|
// OxFF OxFF <taille> ... ... <fin (0x00)>
|
||||||
|
if(i + 2 < index_chaine_recue){
|
||||||
|
// Test début message
|
||||||
|
if(chaîne_octets_reçus[i] == 0xFF && chaîne_octets_reçus[i+1] == 0xFF){
|
||||||
|
//printf("Debut message: 0xFF 0xFF\n");
|
||||||
|
// Taille du message (sans l'entête)
|
||||||
|
uint8_t offset = chaîne_octets_reçus[i+2];
|
||||||
|
if(i + 2 + offset < index_chaine_recue){
|
||||||
|
// printf("Message totalement reçu, taille %d\n", offset);
|
||||||
|
// Test fin message
|
||||||
|
if(chaîne_octets_reçus[i + 2 + offset] == 0x00){
|
||||||
|
// printf("Fin message OK\n");
|
||||||
|
// Lecture du message
|
||||||
|
message.type = 'b'; // Message binaire (par opposition à un message Texte)
|
||||||
|
message.taille_donnees = offset - 1;
|
||||||
|
for(int index_donnees = 0; index_donnees < message.taille_donnees; index_donnees++){
|
||||||
|
message.donnees[index_donnees] = chaîne_octets_reçus[index_donnees + i + 3];
|
||||||
|
}
|
||||||
|
fin_message = i + 2 + offset;
|
||||||
|
messagerie_put_message(message);
|
||||||
|
}else{
|
||||||
|
// printf("Fin message NOK, attendu 0x00, recu %x\n", chaîne_octets_reçus[i + 2 + offset]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(chaîne_octets_reçus[i] == '>'){
|
||||||
|
message.type = chaîne_octets_reçus[i];
|
||||||
|
message.taille_donnees=0;
|
||||||
|
while(message.taille_donnees + i < index_chaine_recue){
|
||||||
|
message.donnees[message.taille_donnees] = chaîne_octets_reçus[i+message.taille_donnees];
|
||||||
|
if(message.donnees[message.taille_donnees] == '\n'){
|
||||||
|
i = i + message.taille_donnees;
|
||||||
|
message.taille_donnees++;
|
||||||
|
message.donnees[message.taille_donnees] = '\0';
|
||||||
|
messagerie_put_message (message);
|
||||||
|
fin_message = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
message.taille_donnees++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mettre à jour l'index de lecture du tampon tournant
|
||||||
|
augmente_index(&(com_reception_buffer.index_tampon_lecture), fin_message);
|
||||||
|
|
||||||
|
}
|
||||||
3
communication.h
Normal file
3
communication.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
void communication_reception_message(void);
|
||||||
|
void communication_init(void);
|
||||||
61
messagerie_applicative.c
Normal file
61
messagerie_applicative.c
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include "messagerie_applicative.h"
|
||||||
|
|
||||||
|
uint8_t memoire_echange[0xFF];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
bool mise_a_jour_config_trajet = false;
|
||||||
|
bool mise_a_jour_cde_inv_traj = false;
|
||||||
|
|
||||||
|
void get_données_reçues(uint8_t * dst, unsigned int taille, uint8_t registre){
|
||||||
|
memcpy(dst, &(memoire_echange[registre]), taille);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mise_données_dans_échange(uint8_t * source, unsigned int taille, uint8_t registre){
|
||||||
|
memcpy(&(memoire_echange[registre]), source, taille);
|
||||||
|
}
|
||||||
|
|
||||||
|
void écriture_données(unsigned int adresse, uint8_t donnée){
|
||||||
|
if( adresse < 11){ // 0x0B
|
||||||
|
// Position du robot
|
||||||
|
mise_a_jour_position = true;
|
||||||
|
}else if(adresse <= 12){ // 0x0C
|
||||||
|
// Read only
|
||||||
|
|
||||||
|
}else if(adresse <= 13){ // 0x0D
|
||||||
|
// Mode
|
||||||
|
mise_a_jour_mode = true;
|
||||||
|
}else if(adresse <= 17){ // 0x11
|
||||||
|
// PWM moteur
|
||||||
|
mise_a_jour_pwm = true;
|
||||||
|
}else if(adresse <= 25){ // 0x19
|
||||||
|
// Vitesse roues
|
||||||
|
mise_a_jour_vitesse_roues = true;
|
||||||
|
}else if(adresse <= 33){ // 0x21
|
||||||
|
// Vitesse robot
|
||||||
|
mise_a_jour_vitesse_robot = true;
|
||||||
|
}else if(adresse <= 0x59){ //
|
||||||
|
// Trajectoire
|
||||||
|
mise_a_jour_trajectoire = true;
|
||||||
|
}else if(adresse <= 0x61){
|
||||||
|
// Trajet config
|
||||||
|
mise_a_jour_config_trajet = true;
|
||||||
|
}else if(adresse <= 0x62){
|
||||||
|
// Trajet config
|
||||||
|
mise_a_jour_cde_inv_traj = true;
|
||||||
|
}else {
|
||||||
|
// Hors mémoire
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memoire_echange[adresse] = donnée;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
17
messagerie_applicative.h
Normal file
17
messagerie_applicative.h
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
void écriture_données(unsigned int adresse, uint8_t donnée);
|
||||||
|
void get_données_reçues(uint8_t * dst, unsigned int taille, uint8_t registre);
|
||||||
|
void mise_données_dans_échange(uint8_t * source, unsigned int taille, uint8_t registre);
|
||||||
|
|
||||||
|
extern uint8_t memoire_echange[];
|
||||||
|
|
||||||
|
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;
|
||||||
|
extern bool mise_a_jour_config_trajet;
|
||||||
|
extern bool mise_a_jour_cde_inv_traj;
|
||||||
Loading…
Reference in New Issue
Block a user