Motor_Driver

tools
tools/Motor_Driver.h
tool stable stable

Tool: Motor_Driver Abstraction haut niveau d'un moteur DC piloté au travers d'un canal d'un crepp::drivers::L293D_Handler. Contrairement à crepp::tools::Motor (qui pilote directement 3 broches), Motor_Driver délègue toute la commande électrique au driver L293D :

Méthodes publiques

Méthode Description Paramètres Retour
Motor_Driver()
Motor_Driver();
Constructeur / Destructeur Le destructeur arrête le moteur (roue libre) s'il était attaché. /
Motor_Driver()
Motor_Driver();
Constructeur / Destructeur Le destructeur arrête le moteur (roue libre) s'il était attaché. /
begin()
begin(L293D_Handler& driver, L293D_Channel channel, bool invert = false);
Attachement au driver Associe ce moteur à un canal d'un L293D_Handler déjà initialisé (begin() du driver doit avoir été appelé au préalable). câblage physique du moteur est inversé) / driver: Référence vers le driver L293D partagé
channel: Canal du driver utilisé par ce moteur
invert: Inverse le sens logique de rotation (utile si le câblage physique du moteur est inversé) /
configurée()
configurée (setRampRate) ;
setSpeed()
setSpeed(int8_t speed, bool immediate = false);
Commande de vitesse Définit la vitesse cible du moteur. Par défaut, la vitesse est atteinte progressivement via la rampe configurée (setRampRate) ; il faut appeler update() régulièrement (dans loop()) pour que la rampe progresse. speed: Vitesse cible de -100 à 100 (le signe donne le sens)
immediate: Si true, applique la vitesse immédiatement sans rampe /
update()
update();
Mise à jour de la rampe A appeler régulièrement (typiquement à chaque tour de loop()). Rapproche la vitesse réelle de la vitesse cible d'au plus `rampStep` points à chaque appel. /
setRampRate()
setRampRate(uint8_t stepPerUpdate);
Configure l'incrément maximal de vitesse appliqué à chaque update() (rampe d'accélération / décélération). / stepPerUpdate: 0 = pas de rampe (vitesse appliquée instantanément) /
stop()
stop();
Arrêt roue libre immédiat (annule aussi la rampe en cours). /
brake()
brake();
Freinage actif immédiat (court-circuit des bobines). /
getTargetSpeed()
getTargetSpeed() const {
getCurrentSpeed()
getCurrentSpeed() const {
getState()
getState() const {
isInitialized()
isInitialized() const {
Indique si begin() a été appelé avec un driver initialisé. /
getStatus()
getStatus() const {

Méthodes privées


            applySpeed(int8_t speed);;
begin(115200);;
begin(L293D_IN1A, L293D_IN2A, L293D_ENA,
              L293D_IN1B, L293D_IN2B, L293D_ENB);;
begin(l293d, crepp::drivers::L293D_Channel::CHANNEL_A);;
begin(l293d, crepp::drivers::L293D_Channel::CHANNEL_B, true);;
setRampRate(15);;
setRampRate(15);;
setSpeed(100);;
setSpeed(100);;
update();;
update();;
delay(20);;

                    

Variables membres


            return _targetSpeed;
return _currentSpeed;
return _state;
return _initialized;
return _status;

                    

Code source


        #pragma once
#include <Arduino.h>
#include "../StatusDevice.h"
#include "../drivers/L293D_Handler.h"

namespace crepp::tools {

using crepp::drivers::L293D_Channel;
using crepp::drivers::L293D_Handler;

/**
 * @brief Etat courant d'un Motor_Driver.
 */
enum class MotorState : uint8_t {
    STOPPED = 0, ///< Moteur à l'arrêt (roue libre)
    RUNNING = 1, ///< Moteur en mouvement (vitesse != 0)
    BRAKING = 2  ///< Freinage actif en cours
};

/*
 * =========================
 * Tool: Motor_Driver
 * -------------------------
 * Abstraction haut niveau d'un moteur DC piloté au travers d'un
 * canal d'un crepp::drivers::L293D_Handler.
 *
 * Contrairement à crepp::tools::Motor (qui pilote directement 3 broches),
 * Motor_Driver délègue toute la commande électrique au driver L293D :
 * on "attache" le moteur à un canal (CHANNEL_A ou CHANNEL_B) d'un
 * L293D_Handler déjà initialisé. Cela permet :
 *  - de piloter 2 moteurs avec un seul objet driver partagé,
 *  - d'ajouter une rampe d'accélération / décélération logicielle,
 *  - d'inverser le sens de rotation par configuration (câblage inversé)
 *    sans toucher au reste du code.
 *
 * @badge tool
 * @badge stable
 *
 * Fonctionnalités :
 * - Attachement à un canal d'un L293D_Handler (begin)
 * - Commande de vitesse avec rampe progressive (setSpeed + update)
 * - Application immédiate optionnelle (bypass de la rampe)
 * - Inversion de sens configurable (câblage moteur inversé)
 * - Arrêt roue libre (stop) et freinage actif (brake)
 * - Lecture de l'état (vitesse cible, vitesse réelle, état moteur)
 * =========================
 */
class Motor_Driver {
public:
    /*
     * =========================
     * Constructeur / Destructeur
     * -------------------------
     * Le destructeur arrête le moteur (roue libre) s'il était attaché.
     */
    Motor_Driver();
    ~Motor_Driver();

    /*
     * =========================
     * Attachement au driver
     * -------------------------
     * Associe ce moteur à un canal d'un L293D_Handler déjà initialisé
     * (begin() du driver doit avoir été appelé au préalable).
     *
     * @param driver  Référence vers le driver L293D partagé
     * @param channel Canal du driver utilisé par ce moteur
     * @param invert  Inverse le sens logique de rotation (utile si le
     *                câblage physique du moteur est inversé)
     */
    void begin(L293D_Handler& driver, L293D_Channel channel, bool invert = false);

    /*
     * =========================
     * Commande de vitesse
     * -------------------------
     * Définit la vitesse cible du moteur. Par défaut, la vitesse est
     * atteinte progressivement via la rampe configurée (setRampRate) ;
     * il faut appeler update() régulièrement (dans loop()) pour que la
     * rampe progresse.
     *
     * @param speed     Vitesse cible de -100 à 100 (le signe donne le sens)
     * @param immediate Si true, applique la vitesse immédiatement sans rampe
     */
    void setSpeed(int8_t speed, bool immediate = false);

    /*
     * =========================
     * Mise à jour de la rampe
     * -------------------------
     * A appeler régulièrement (typiquement à chaque tour de loop()).
     * Rapproche la vitesse réelle de la vitesse cible d'au plus
     * `rampStep` points à chaque appel.
     */
    void update();

    /**
     * @brief Configure l'incrément maximal de vitesse appliqué à
     *        chaque update() (rampe d'accélération / décélération).
     * @param stepPerUpdate 0 = pas de rampe (vitesse appliquée instantanément)
     */
    void setRampRate(uint8_t stepPerUpdate);

    /**
     * @brief Arrêt roue libre immédiat (annule aussi la rampe en cours).
     */
    void stop();

    /**
     * @brief Freinage actif immédiat (court-circuit des bobines).
     */
    void brake();

    /// Vitesse cible demandée (avant application de la rampe)
    int8_t getTargetSpeed() const { return _targetSpeed; }

    /// Vitesse réellement appliquée au moteur à cet instant
    int8_t getCurrentSpeed() const { return _currentSpeed; }

    /// Etat courant du moteur (arrêté / en marche / freinage)
    MotorState getState() const { return _state; }

    /**
     * @brief Indique si begin() a été appelé avec un driver initialisé.
     */
    bool isInitialized() const { return _initialized; }

    StatusDevice getStatus() const { return _status; }

private:
    L293D_Handler* _driver = nullptr;
    L293D_Channel _channel = L293D_Channel::CHANNEL_A;
    bool _invert = false;
    bool _initialized = false;

    int8_t _targetSpeed = 0;   ///< Vitesse demandée par l'utilisateur
    int8_t _currentSpeed = 0;  ///< Vitesse réellement appliquée (après rampe)
    uint8_t _rampStep = 10;    ///< Incrément max de vitesse par update()

    MotorState _state = MotorState::STOPPED;
    StatusDevice _status = StatusDevice::DEVICE_ERROR_INIT;

    /// Applique une vitesse brute sur le driver, en tenant compte de _invert
    void applySpeed(int8_t speed);
};

/*
@example

@include
#include <crepp/drivers/L293D_Handler.h>
#include <crepp/tools/Motor_Driver.h>
@end_include

@macro
#define L293D_IN1A 2
#define L293D_IN2A 3
#define L293D_ENA  4
#define L293D_IN1B 5
#define L293D_IN2B 6
#define L293D_ENB  7
@end_macro

@instance
crepp::drivers::L293D_Handler l293d;
crepp::tools::Motor_Driver motorLeft;
crepp::tools::Motor_Driver motorRight;
@end_instance

@setup
  Serial.begin(115200);

  l293d.begin(L293D_IN1A, L293D_IN2A, L293D_ENA,
              L293D_IN1B, L293D_IN2B, L293D_ENB);

  motorLeft.begin(l293d, crepp::drivers::L293D_Channel::CHANNEL_A);
  motorRight.begin(l293d, crepp::drivers::L293D_Channel::CHANNEL_B, true); // true = sens inversé

  motorLeft.setRampRate(15);
  motorRight.setRampRate(15);
@end_setup

@loop
  motorLeft.setSpeed(100);
  motorRight.setSpeed(100);

  // La rampe doit être mise à jour régulièrement
  motorLeft.update();
  motorRight.update();

  delay(20);
@end_loop

@end_example
*/

} // namespace crepp::tools