Code de demonstration du pilotage des moteurs

This commit is contained in:
Samuel 2025-01-15 11:06:48 +01:00
parent 44b17271d4
commit 15c9f9b6c5
5 changed files with 124 additions and 41 deletions

View File

@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake) include(pico_sdk_import.cmake)
project(PAMI_Cours_temps C CXX ASM) project(PAMI_Cours_Moteurs C CXX ASM)
set(CMAKE_C_STNDARD 11) set(CMAKE_C_STNDARD 11)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
@ -10,27 +10,30 @@ set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})
pico_sdk_init() pico_sdk_init()
add_executable(PAMI_Cours_temps add_executable(PAMI_Cours_Moteurs
main.c main.c
Moteurs.c
Teleplot.c Teleplot.c
Temps.c Temps.c
) )
target_include_directories(PAMI_Cours_temps PRIVATE ${CMAKE_CURRENT_LIST_DIR}) target_include_directories(PAMI_Cours_Moteurs PRIVATE ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(PAMI_Cours_temps target_link_libraries(PAMI_Cours_Moteurs
hardware_uart hardware_uart
hardware_pwm
pico_stdlib pico_stdlib
pico_multicore pico_multicore
pico_cyw43_arch_lwip_poll pico_cyw43_arch_lwip_poll
) )
pico_enable_stdio_usb(PAMI_Cours_temps 1) pico_enable_stdio_usb(PAMI_Cours_Moteurs 1)
pico_enable_stdio_uart(PAMI_Cours_temps 1) pico_enable_stdio_uart(PAMI_Cours_Moteurs 1)
pico_add_extra_outputs(PAMI_Cours_temps) pico_add_extra_outputs(PAMI_Cours_Moteurs)
add_custom_target(Flash add_custom_target(Flash
DEPENDS PAMI_Cours_temps DEPENDS PAMI_Cours_Moteurs
COMMAND sudo picotool load -f ${PROJECT_BINARY_DIR}/PAMI_Cours_temps.uf2 COMMAND sudo picotool load -f ${PROJECT_BINARY_DIR}/PAMI_Cours_Moteurs.uf2
) )

86
Moteurs.c Normal file
View File

@ -0,0 +1,86 @@
#include "hardware/pwm.h"
#include "Moteurs.h"
#define MOTEUR_A_SENS1 7
#define MOTEUR_A_SENS2 13
#define MOTEUR_A_VITESSE 27 //5B
#define MOTEUR_B_SENS1 10
#define MOTEUR_B_SENS2 5
#define MOTEUR_B_VITESSE 9 //4B
uint slice_moteur_A, slice_moteur_B, slice_moteur_C;
/// @brief Initialisation les entrées / sorties requises pour les moteurs
void Moteur_init(){
gpio_init(MOTEUR_A_SENS1);
gpio_init(MOTEUR_A_SENS2);
gpio_init(MOTEUR_B_SENS1);
gpio_init(MOTEUR_B_SENS2);
gpio_set_dir(MOTEUR_A_SENS1, GPIO_OUT);
gpio_set_dir(MOTEUR_A_SENS2, GPIO_OUT);
gpio_set_dir(MOTEUR_B_SENS1, GPIO_OUT);
gpio_set_dir(MOTEUR_B_SENS2, GPIO_OUT);
gpio_put(MOTEUR_A_SENS1, 0);
gpio_put(MOTEUR_A_SENS2, 0);
gpio_put(MOTEUR_B_SENS1, 0);
gpio_put(MOTEUR_B_SENS2, 0);
gpio_set_function(MOTEUR_A_VITESSE, GPIO_FUNC_PWM);
gpio_set_function(MOTEUR_B_VITESSE, GPIO_FUNC_PWM);
pwm_set_wrap(5, (uint16_t)65535);
pwm_set_wrap(4, (uint16_t)65535);
pwm_set_chan_level(5, PWM_CHAN_B, 0);
pwm_set_chan_level(4, PWM_CHAN_B, 0);
pwm_set_enabled(5, true);
pwm_set_enabled(4, true);
Moteur_set_commande(MOTEUR_A, 0);
Moteur_set_commande(MOTEUR_B, 0);
}
/// @brief Configure le PWM et la broche de sens en fonction de la vitesse et du moteur
/// @param moteur : Moteur (voir enum t_moteur)
/// @param vitesse : Vitesse entre -32767 et 32767
void Moteur_set_commande(enum t_moteur moteur, int16_t vitesse ){
uint16_t u_vitesse;
// Le PWM accepte 16 bits de résolution, on se remet sur 16 bits (et non sur 15 + signe)
if (vitesse < 0){
u_vitesse = -vitesse;
}else{
u_vitesse = vitesse;
}
u_vitesse = u_vitesse * 2;
switch(moteur){
case MOTEUR_A:
pwm_set_chan_level(5, PWM_CHAN_B, u_vitesse);
if(vitesse > 0){
gpio_put(MOTEUR_A_SENS1, 0);
gpio_put(MOTEUR_A_SENS2, 1);
}else{
gpio_put(MOTEUR_A_SENS1, 1);
gpio_put(MOTEUR_A_SENS2, 0);
}
break;
case MOTEUR_B:
pwm_set_chan_level(4, PWM_CHAN_B, u_vitesse);
if(vitesse < 0){
gpio_put(MOTEUR_B_SENS1, 0);
gpio_put(MOTEUR_B_SENS2, 1);
}else{
gpio_put(MOTEUR_B_SENS1, 1);
gpio_put(MOTEUR_B_SENS2, 0);
}
break;
}
}
void Moteur_stop(void){
Moteur_set_commande(MOTEUR_A, 0);
Moteur_set_commande(MOTEUR_B, 0);
}

15
Moteurs.h Normal file
View File

@ -0,0 +1,15 @@
#include "pico/stdlib.h"
#ifndef MOTEURS_H
#define MOTEURS_H
enum t_moteur {
MOTEUR_A=0,
MOTEUR_B=1
};
#endif
#define MOTEUR_MAX_COMMANDE 32767
void Moteur_init(void);
void Moteur_set_commande(enum t_moteur moteur, int16_t vitesse );
void Moteur_stop(void);

View File

@ -1,9 +1,10 @@
De lart de déplacer un robot avec classe - Câblage des moteurs De lart de déplacer un robot avec classe - Commande des moteurs
=============================================================== ================================================================
Le but est de vous proposer une série darticles vous présentant les arcanes du déplacement dun robot, en fournissant à chaque étape une idée de démonstration et les principales pistes de débogage. Les articles sont disponibles ici : [Wiki Eurobot](https://www.eurobot.org/wiki/fr/informatics/de_l_art_de_deplacer_son_robot_avec_classe) Le but est de vous proposer une série darticles vous présentant les arcanes du déplacement dun robot, en fournissant à chaque étape une idée de démonstration et les principales pistes de débogage. Les articles sont disponibles ici : [Wiki Eurobot](https://www.eurobot.org/wiki/fr/informatics/de_l_art_de_deplacer_son_robot_avec_classe)
Câblage des moteurs Commande des moteurs
------------------- -------------------
Le code principal permet de tester le bon fonctionnement des moteurs, afin de valider leur câblage. Ajout des fichiers pour gérer les moteurs. Le code principal fait évoluer la vitesse des moteurs progressivement en fonction du temps.

34
main.c
View File

@ -4,9 +4,11 @@
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
#include "pico/stdlib.h" #include "pico/stdlib.h"
#include "Moteurs.h"
#include "Teleplot.h" #include "Teleplot.h"
#include "Temps.h" #include "Temps.h"
#include <stdio.h> #include <stdio.h>
#include <math.h>
void setup(void); void setup(void);
void loop(void); void loop(void);
@ -25,35 +27,11 @@ void setup(void){
stdio_init_all(); stdio_init_all();
Teleplot_init(); Teleplot_init();
Temps_init(); Temps_init();
Moteur_init();
// Broches des moteurs gérées en GPIO
gpio_init(7);
gpio_init(13);
gpio_init(27);
gpio_init(5);
gpio_init(10);
gpio_init(9);
// Broches des moteurs en sortie
gpio_set_dir(7, true); // M1 Sens 1
gpio_set_dir(13, true); // M1 Sens 2
gpio_set_dir(27, true); // M1 Vitesse
gpio_set_dir(5, true); // M2 Sens 2
gpio_set_dir(10, true); // M2 Sens 1
gpio_set_dir(9, true); // M2 Vitesse
// Commande des broches
gpio_put(7, 0);
gpio_put(13, 1);
gpio_put(27, 1);
gpio_put(5, 0);
gpio_put(10, 1);
gpio_put(9, 1);
} }
void loop(void){ void loop(void){
tight_loop_contents(); float t = (float) Temps_get_temps_ms() / 1000. ;
Moteur_set_commande(MOTEUR_A, sin(t * 3.14) * MOTEUR_MAX_COMMANDE) ;
Moteur_set_commande(MOTEUR_B, sin(t * 3.14) * MOTEUR_MAX_COMMANDE) ;
} }