From d29724470564726888302b24097c9694b12bcea8 Mon Sep 17 00:00:00 2001 From: sfaguet <sebastienfaguet@gmail.com> Date: Sat, 13 Feb 2021 17:17:03 -0500 Subject: [PATCH] =?UTF-8?q?D=C3=A9placement=20par=20clavier/souris=20+=20g?= =?UTF-8?q?estion=20des=20tirs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/canon.h | 15 ++++ Inc/pilotes.h | 32 ++++++++ Inc/receiver_RadioController.h | 1 + Inc/traitement.h | 1 + MDK-ARM/RobotMaster_allRobots.uvoptx | 30 ++++--- MDK-ARM/RobotMaster_allRobots.uvprojx | 13 ++- Src/BoardA_handle.c | 3 +- Src/canon.c | 78 ++++++++++++++++++ Src/main.c | 8 +- Src/pilotes.c | 36 +++++++++ Src/receiver_RadioController.c | 12 ++- Src/traitement.c | 109 +++++++++++++++++++------- 12 files changed, 290 insertions(+), 48 deletions(-) create mode 100644 Inc/canon.h create mode 100644 Inc/pilotes.h create mode 100644 Src/canon.c create mode 100644 Src/pilotes.c diff --git a/Inc/canon.h b/Inc/canon.h new file mode 100644 index 0000000..8c60fa1 --- /dev/null +++ b/Inc/canon.h @@ -0,0 +1,15 @@ +/**************** + Description : Gestion du cannon + Auteur : Sébastien FAGUET +*****************/ + +#ifndef CANON +#define CANON + +#include "main.h" + + +void canon_shoot(float speed, float rate); +void traitement_shoot(void); +void canon_shoot_end(void); +#endif diff --git a/Inc/pilotes.h b/Inc/pilotes.h new file mode 100644 index 0000000..e093cc2 --- /dev/null +++ b/Inc/pilotes.h @@ -0,0 +1,32 @@ +/**************** + Description : Configuration du robot + Auteur : Sébastien FAGUET +*****************/ + +#ifndef PILOTE +#define PILOTE + +#include "main.h" + +#define PILOTE_ANTONIN 0 + +typedef struct +{ + float sensitivity_ch_1; + float sensitivity_ch_2; + float sensitivity_mouse_x; + float sensitivity_mouse_y; + + double sensitivity_chassis_RC_Vx; + double sensitivity_chassis_RC_Vy; + double sensitivity_chassis_RC_W; + float sensitivity_chassis_keyboard_Vx; + float sensitivity_chassis_keyboard_Vy; + float sensitivity_chassis_mouse_W; +} pilote_t; + + +/* Fonction qui premet de configurer le pilote */ +void piloteInit(uint8_t pilote_id); + +#endif diff --git a/Inc/receiver_RadioController.h b/Inc/receiver_RadioController.h index 621aa56..ca0b04b 100644 --- a/Inc/receiver_RadioController.h +++ b/Inc/receiver_RadioController.h @@ -72,6 +72,7 @@ struct receiver_RadioController_data struct receiver_RadioController { + char keyboard_mode; //0: RC, 1: Mouse and keyboard struct receiver_RadioController_data data; struct receiver_RadioController_data last_data; uint16_t state; diff --git a/Inc/traitement.h b/Inc/traitement.h index 418c53d..e075d0f 100644 --- a/Inc/traitement.h +++ b/Inc/traitement.h @@ -23,4 +23,5 @@ void traitement_pids_compute(void); /* Fonctions qui fait les liens entre les entrées (capteurs, radio controller, CV, ...) et les sorties (consignes moteurs), on peut créer plusieurs traitements */ void traitement_1(void); +void chassis_consigne(double Vx, double Vy, double W); #endif diff --git a/MDK-ARM/RobotMaster_allRobots.uvoptx b/MDK-ARM/RobotMaster_allRobots.uvoptx index 92e16ed..f61020c 100644 --- a/MDK-ARM/RobotMaster_allRobots.uvoptx +++ b/MDK-ARM/RobotMaster_allRobots.uvoptx @@ -525,7 +525,7 @@ <Group> <GroupName>Application/User</GroupName> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <cbSel>0</cbSel> <RteFlg>0</RteFlg> @@ -533,7 +533,7 @@ <GroupNumber>4</GroupNumber> <FileNumber>23</FileNumber> <FileType>1</FileType> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <bDave2>0</bDave2> <PathWithFileName>../Src/main.c</PathWithFileName> @@ -653,7 +653,7 @@ <Group> <GroupName>Libraries</GroupName> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <cbSel>0</cbSel> <RteFlg>0</RteFlg> @@ -673,7 +673,7 @@ <Group> <GroupName>BoardA</GroupName> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <cbSel>0</cbSel> <RteFlg>0</RteFlg> @@ -693,7 +693,7 @@ <Group> <GroupName>Devices</GroupName> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <cbSel>0</cbSel> <RteFlg>0</RteFlg> @@ -737,7 +737,7 @@ <GroupNumber>7</GroupNumber> <FileNumber>38</FileNumber> <FileType>1</FileType> - <tvExp>1</tvExp> + <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <bDave2>0</bDave2> <PathWithFileName>..\Src\referee_system.c</PathWithFileName> @@ -784,12 +784,12 @@ <File> <GroupNumber>7</GroupNumber> <FileNumber>42</FileNumber> - <FileType>5</FileType> + <FileType>1</FileType> <tvExp>0</tvExp> <tvExpOptDlg>0</tvExpOptDlg> <bDave2>0</bDave2> - <PathWithFileName>..\Inc\jetson.h</PathWithFileName> - <FilenameWithoutPath>jetson.h</FilenameWithoutPath> + <PathWithFileName>..\Src\pilotes.c</PathWithFileName> + <FilenameWithoutPath>pilotes.c</FilenameWithoutPath> <RteFlg>0</RteFlg> <bShared>0</bShared> </File> @@ -813,6 +813,18 @@ <RteFlg>0</RteFlg> <bShared>0</bShared> </File> + <File> + <GroupNumber>8</GroupNumber> + <FileNumber>44</FileNumber> + <FileType>1</FileType> + <tvExp>0</tvExp> + <tvExpOptDlg>0</tvExpOptDlg> + <bDave2>0</bDave2> + <PathWithFileName>..\Src\canon.c</PathWithFileName> + <FilenameWithoutPath>canon.c</FilenameWithoutPath> + <RteFlg>0</RteFlg> + <bShared>0</bShared> + </File> </Group> <Group> diff --git a/MDK-ARM/RobotMaster_allRobots.uvprojx b/MDK-ARM/RobotMaster_allRobots.uvprojx index b05b14a..0f71675 100644 --- a/MDK-ARM/RobotMaster_allRobots.uvprojx +++ b/MDK-ARM/RobotMaster_allRobots.uvprojx @@ -10,7 +10,7 @@ <TargetName>RobotMaster_allRobots</TargetName> <ToolsetNumber>0x4</ToolsetNumber> <ToolsetName>ARM-ADS</ToolsetName> - <pCCUsed>5060960::V5.06 update 7 (build 960)::ARMCC</pCCUsed> + <pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed> <uAC6>0</uAC6> <TargetOption> <TargetCommonOption> @@ -619,9 +619,9 @@ <FilePath>..\Src\jetson.c</FilePath> </File> <File> - <FileName>jetson.h</FileName> - <FileType>5</FileType> - <FilePath>..\Inc\jetson.h</FilePath> + <FileName>pilotes.c</FileName> + <FileType>1</FileType> + <FilePath>..\Src\pilotes.c</FilePath> </File> </Files> </Group> @@ -633,6 +633,11 @@ <FileType>1</FileType> <FilePath>..\Src\traitement.c</FilePath> </File> + <File> + <FileName>canon.c</FileName> + <FileType>1</FileType> + <FilePath>..\Src\canon.c</FilePath> + </File> </Files> </Group> <Group> diff --git a/Src/BoardA_handle.c b/Src/BoardA_handle.c index c3e7423..ffacb2b 100644 --- a/Src/BoardA_handle.c +++ b/Src/BoardA_handle.c @@ -105,7 +105,7 @@ void uart_debug(){ return; } tickstart = HAL_GetTick(); - snprintf(buff2, 1000, " PITCH(%f/%f) YAW(%f/%f)\r\n", motors[TOURELLE_PITCH].info.angle_360, motors[TOURELLE_PITCH].consigne, motors[TOURELLE_YAW].info.angle_360, motors[TOURELLE_YAW].consigne); + snprintf(buff2, 1000, "Keyboard Z%i S%i Q%i D%i\r\n", receiver_RadioController.data.kb.bit.Z, receiver_RadioController.data.kb.bit.S, receiver_RadioController.data.kb.bit.Q, receiver_RadioController.data.kb.bit.D); HAL_UART_Transmit_DMA(&huart8, (uint8_t*)buff2, strlen(buff2)); /* uart_debug_command("[2J"); //Clear entire screen @@ -137,6 +137,7 @@ void uart_debug_command(char* command){ HAL_UART_Transmit(&huart8, (uint8_t*) BUF, 4, 10); } /** + * @brief enable global uart it and do not use DMA transfer done it * @param[in] huart: uart IRQHandler id * @param[in] pData: receive buff diff --git a/Src/canon.c b/Src/canon.c new file mode 100644 index 0000000..f4dc583 --- /dev/null +++ b/Src/canon.c @@ -0,0 +1,78 @@ +/**************** + Description : Gestion du cannon + Auteur : Sébastien FAGUET +*****************/ + + +#include "canon.h" + +#define TIME_BEFORE_START_FEEDER 10 +#define TIME_BEFORE_STOP 100 + +extern motor_t motors[MAX_MOTORS]; +uint32_t begin_canon_shoot = 0; //0: Pas de séquence de début de tir initialisé sinon temps du début de la séquence +uint32_t end_canon_shoot = 0; //0: Pas de séquence de fin de tir initialisé sinon temps du début de la séquence +uint32_t shooting = 0; //0: Pas de séquence de tir initialisé sinon temps du début de la séquence +float shoot_rate = 0; //Cadance de tir + +//Demande de tirer +void canon_shoot(float speed, float rate){ + // Si une des valeurs est null, on demande l'arret des tirs + if(speed == 0 || rate == 0){ + canon_shoot_end(); + }else{ + //Si nous ne sommes pas entrain de tirer, nous débutons la séquence de tir + if(begin_canon_shoot == 0 && end_canon_shoot == 0 && shooting == 0){ + begin_canon_shoot = HAL_GetTick(); + + PWM_SetAllDuty(&htim1, speed, speed); //Démarage des snails + shoot_rate = rate; //Sauvegarde de la cadance de tir + } + + //Prise en compte des nouvelles valeurs que si nous sommes entrain de tirer + if(begin_canon_shoot == 0 && end_canon_shoot == 0 && shooting != 0){ + PWM_SetAllDuty(&htim1, speed, speed); //Changement de la vitesse + motors[FEEDER].consigne = rate; //Changement de la cadance de tir + shoot_rate = rate; //Changement de la cadance de tir + } + } +} + + + +//Fonction de traitement des tirs, a appeler à chaque boucle +void traitement_shoot(){ + //Si on a demandé de commencer de tirer il y a plus de x ms, on démare maintenant le feeder + if(begin_canon_shoot != 0 && HAL_GetTick() - begin_canon_shoot > TIME_BEFORE_START_FEEDER){ + begin_canon_shoot = 0; + end_canon_shoot = 0; + shooting = HAL_GetTick(); + + motors[FEEDER].consigne = shoot_rate; //Démarage du feeder + } + + //Si on a demandé d'arreter de tirer il y a plus de x ms, on arrete tout + if(end_canon_shoot != 0 && HAL_GetTick() - end_canon_shoot > TIME_BEFORE_STOP){ + begin_canon_shoot = 0; + end_canon_shoot = 0; + shooting = 0; + + PWM_SetAllDuty(&htim1, 0, 0); //Arret des snails + motors[FEEDER].consigne = 0; //Arret du feeder + } +} + + +//Demande l'arret des tirs +void canon_shoot_end(){ + begin_canon_shoot = 0; + if(shooting != 0){ + // Si nous étions entrain de tirer + motors[FEEDER].consigne = -7000; //On enlève les balles + shooting = 0; + } + if(end_canon_shoot == 0){ + //Si nous n'avons pas encore commencer la séquence de fin de tir + end_canon_shoot = HAL_GetTick(); //Début de la séquence de fin de tir + } +} diff --git a/Src/main.c b/Src/main.c index b256529..57de24d 100644 --- a/Src/main.c +++ b/Src/main.c @@ -26,6 +26,8 @@ #include "tim.h" #include "usart.h" #include "gpio.h" +#include "pilotes.h" +#include "canon.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ @@ -111,7 +113,8 @@ int main(void) can1_init(); robotInit(5); //Initialise le robot comme un standard, l'objectif c'est que l'initialisation de fasse par le referee system extern motor_t motors[MAX_MOTORS]; - + extern pilote_t pilote; + piloteInit(PILOTE_ANTONIN); /* USER CODE END 2 */ /* Infinite loop */ @@ -120,8 +123,9 @@ int main(void) { signOfLife(); //LEDs BLINK //oled_debug(); //Display debug menu on OLED - //uart_debug(); //Display debug menu on UART + uart_debug(); //Display debug menu on UART traitement_1(); //Calcul les consignes des moteurs + traitement_shoot(); //Traitement du canon traitement_pids_compute(); //Calcul les commandes des moteurs can_send_command(); //Envoie des commandes des moteurs diff --git a/Src/pilotes.c b/Src/pilotes.c new file mode 100644 index 0000000..7d00eec --- /dev/null +++ b/Src/pilotes.c @@ -0,0 +1,36 @@ +/**************** + Description : Gestion des pilotes, sauvegarde de leur configuration + Auteur : Sébastien FAGUET +*****************/ + +#include "pilotes.h" + +pilote_t pilote; + +/* Fonction qui premet de configurer le robot */ +void piloteInit(uint8_t pilote_id){ + /* + Robot ID: + 0: Antonin; + */ + pilote.sensitivity_ch_1 = 0.00005; + pilote.sensitivity_ch_2 = 0.00005; + pilote.sensitivity_mouse_x = 0.000005; + pilote.sensitivity_mouse_y = 0.000005; + + pilote.sensitivity_chassis_RC_Vx = 10; + pilote.sensitivity_chassis_RC_Vy = 10; + pilote.sensitivity_chassis_RC_W = 3; + + pilote.sensitivity_chassis_keyboard_Vx = 500; + pilote.sensitivity_chassis_keyboard_Vy = 500; + pilote.sensitivity_chassis_mouse_W = 2; + + switch(pilote_id){ //Configuration personnalisée + /* Antonin */ + case PILOTE_ANTONIN: + break; + default: + while(1); + } +} diff --git a/Src/receiver_RadioController.c b/Src/receiver_RadioController.c index 474e283..114914a 100644 --- a/Src/receiver_RadioController.c +++ b/Src/receiver_RadioController.c @@ -8,7 +8,8 @@ uint8_t uart1_rx_buff[UART1_RX_BUFFLEN]; -receiver_RadioController_t receiver_RadioController; +receiver_RadioController_t receiver_RadioController = {false}; + /* On récupère les variables exterieurs */ extern uint32_t signOfLife_Receiver_RadioController_tick; @@ -59,7 +60,7 @@ void receiver_RadioController_callback_handler() if ((abs(receiver_RadioController.data.ch4) > 660)) receiver_RadioController.data.ch4 = 0; receiver_RadioController.data.mouse.x = uart1_rx_buff[6] | (uart1_rx_buff[7] << 8); // x axis - receiver_RadioController.data.mouse.y = uart1_rx_buff[8] | (uart1_rx_buff[9] << 8); + receiver_RadioController.data.mouse.y = -(uart1_rx_buff[8] | (uart1_rx_buff[9] << 8)); receiver_RadioController.data.mouse.z = uart1_rx_buff[10] | (uart1_rx_buff[11] << 8); receiver_RadioController.data.mouse.l = uart1_rx_buff[12]; @@ -69,6 +70,13 @@ void receiver_RadioController_callback_handler() receiver_RadioController.data.wheel = (uart1_rx_buff[16] | uart1_rx_buff[17] << 8); receiver_RadioController.data.wheel -= 1024; + if(receiver_RadioController.data.mouse.x != 0 || + receiver_RadioController.data.mouse.y != 0 || + receiver_RadioController.data.mouse.z != 0 || + receiver_RadioController.data.mouse.l != 0 || + receiver_RadioController.data.kb.key_code != 0){ + receiver_RadioController.keyboard_mode = true; + } } diff --git a/Src/traitement.c b/Src/traitement.c index d944c4b..32919b2 100644 --- a/Src/traitement.c +++ b/Src/traitement.c @@ -5,12 +5,15 @@ #include "traitement.h" +#include "pilotes.h" +#include "canon.h" #define MAX_BASE_SPEED_COEFF 10 /* On récupère les variables exterieurs */ extern receiver_RadioController_t receiver_RadioController; extern motor_t motors[MAX_MOTORS]; +extern pilote_t pilote; /* Calcul les pids de tous les moteurs (calcul des commandes en fonction des consignes */ void traitement_pids_compute(){ @@ -24,36 +27,82 @@ void traitement_pids_compute(){ /* Fonctions qui fait les liens entre les entrées (capteurs, radio controller, CV, ...) et les sorties (consignes moteurs), on peut créer plusieurs traitements */ void traitement_1(){ - add_consigne_position(&motors[TOURELLE_PITCH], (float)receiver_RadioController.data.ch2_float, 0.00005); - add_consigne_position(&motors[TOURELLE_YAW], (float)receiver_RadioController.data.ch1_float, 0.00005); - + if(receiver_RadioController.keyboard_mode){ + double chassis_w; + double tourelle_yaw; + if(receiver_RadioController.data.kb.bit.CTRL){ + chassis_w = -receiver_RadioController.data.mouse.x; + tourelle_yaw = 0; + }else{ + chassis_w = 0; + tourelle_yaw = receiver_RadioController.data.mouse.x; + } + add_consigne_position(&motors[TOURELLE_PITCH], receiver_RadioController.data.mouse.y, pilote.sensitivity_mouse_y); + add_consigne_position(&motors[TOURELLE_YAW], tourelle_yaw, pilote.sensitivity_mouse_x); + + chassis_consigne(receiver_RadioController.data.kb.bit.W - receiver_RadioController.data.kb.bit.S, + receiver_RadioController.data.kb.bit.D - receiver_RadioController.data.kb.bit.A, + chassis_w); + + + if(receiver_RadioController.data.mouse.l){ + canon_shoot(0.15, 2000); + }else if(receiver_RadioController.data.mouse.r){ + canon_shoot(0.20, 5000); + }else{ + canon_shoot_end(); + } + }else{ + add_consigne_position(&motors[TOURELLE_PITCH], receiver_RadioController.data.ch2_float, pilote.sensitivity_ch_2); + add_consigne_position(&motors[TOURELLE_YAW], receiver_RadioController.data.ch1_float, pilote.sensitivity_ch_1); - switch(receiver_RadioController.data.sw1){ - case 1: - motors[FEEDER].consigne = 0; - break; - case 3: - motors[FEEDER].consigne = 5000; - break; - case 2: - motors[FEEDER].consigne = 10000; - break; - } - switch(receiver_RadioController.data.sw2){ - case 1: - PWM_SetAllDuty(&htim1, 0.0, 0.0); - break; - case 3: - PWM_SetAllDuty(&htim1, 0.25, 0.25); - break; - case 2: - PWM_SetAllDuty(&htim1, 0.50, 0.50); - break; + switch(receiver_RadioController.data.sw1){ + case 1: + motors[FEEDER].consigne = 0; + break; + case 3: + motors[FEEDER].consigne = 5000; + break; + case 2: + motors[FEEDER].consigne = 10000; + break; + } + switch(receiver_RadioController.data.sw2){ + case 1: + PWM_SetAllDuty(&htim1, 0.0, 0.0); + break; + case 3: + PWM_SetAllDuty(&htim1, 0.25, 0.25); + break; + case 2: + PWM_SetAllDuty(&htim1, 0.50, 0.50); + break; + } + + chassis_consigne(receiver_RadioController.data.ch4, receiver_RadioController.data.ch3, receiver_RadioController.data.wheel); } - - - motors[FRONT_LEFT].consigne = MAX_BASE_SPEED_COEFF*(receiver_RadioController.data.ch4 - receiver_RadioController.data.ch3 - 0.3*receiver_RadioController.data.wheel); - motors[FRONT_RIGHT].consigne = -MAX_BASE_SPEED_COEFF*(receiver_RadioController.data.ch4 + receiver_RadioController.data.ch3 + 0.3*receiver_RadioController.data.wheel); - motors[BACK_RIGHT].consigne = -MAX_BASE_SPEED_COEFF*(receiver_RadioController.data.ch4 - receiver_RadioController.data.ch3 + 0.3*receiver_RadioController.data.wheel); - motors[BACK_LEFT].consigne = MAX_BASE_SPEED_COEFF*(receiver_RadioController.data.ch4 + receiver_RadioController.data.ch3 - 0.3*receiver_RadioController.data.wheel); } + +void chassis_consigne(double Vx, double Vy, double W){ + /* + Vx: Avant / Arrière + Vy: Translation gauche / Droite + W: Rotation + */ + double sensitivity_Vx; + double sensitivity_Vy; + double sensitivity_W; + if(receiver_RadioController.keyboard_mode){ + sensitivity_Vx = pilote.sensitivity_chassis_keyboard_Vx; + sensitivity_Vy = pilote.sensitivity_chassis_keyboard_Vy; + sensitivity_W = pilote.sensitivity_chassis_mouse_W; + }else{ + sensitivity_Vx = pilote.sensitivity_chassis_RC_Vx; + sensitivity_Vy = pilote.sensitivity_chassis_RC_Vy; + sensitivity_W = pilote.sensitivity_chassis_RC_W; + } + motors[FRONT_LEFT].consigne = sensitivity_Vx*Vx - sensitivity_Vy*Vy - sensitivity_W*W; + motors[FRONT_RIGHT].consigne = -(sensitivity_Vx*Vx + sensitivity_Vy*Vy + sensitivity_W*W); + motors[BACK_RIGHT].consigne = -(sensitivity_Vx*Vx - sensitivity_Vy*Vy + sensitivity_W*W); + motors[BACK_LEFT].consigne = sensitivity_Vx*Vx + sensitivity_Vy*Vy - sensitivity_W*W; +} -- GitLab