PCA9685_Handler

drivers
drivers/PCA9685_Handler.h
driver experimental experimental

Driver PCA9685 Gestion du driver PCA9685 pour le contrôle des LED et des servomoteurs. Communication via I2C, 16 canaux PWM indépendants, résolution 12 bits (0-4095). Fonctionnalités : /

Méthodes publiques

Méthode Description Paramètres Retour
PCA9685_Handler()
PCA9685_Handler(uint8_t i2cAddress = 0x40);
Constructeur Initialise l'objet handler pour le PCA9685 / i2cAddress: : adresse I2C du composant (0x40 par défaut, plage 0x40-0x7F selon A0-A5) /
begin()
begin(float freqHz = 50.0f);
Méthode begin() Initialise le bus I2C, réinitialise le composant (reset logiciel) puis configure la fréquence PWM par défaut. / freqHz: : fréquence PWM souhaitée en Hz (défaut 50 Hz, typique servomoteurs) true
true si l'initialisation réussit (composant détecté sur le bus), false sinon /
reset()
reset();
Méthode reset() Effectue un reset logiciel du PCA9685 (registre MODE1). /
setPWMFreq()
setPWMFreq(float freqHz);
Méthode setPWMFreq() Règle la fréquence PWM globale du composant (commune à tous les canaux). / freqHz: : fréquence souhaitée en Hz (plage utile ~24Hz à 1526Hz) /
setPWM()
setPWM(uint8_t channel, uint16_t on, uint16_t off);
Méthode setPWM() Règle directement les compteurs ON/OFF (12 bits, 0-4095) d'un canal. / channel: : numéro du canal (0 à 15)
on: : instant de mise à 1 dans la période (0-4095)
off: : instant de mise à 0 dans la période (0-4095) /
write()
write(uint8_t channel, uint16_t value);
écriture d'un canal Ecrit un rapport cyclique dans un canal spécifique. / channel: : numéro du canal à écrire (0 à 15)
value: : valeur du rapport cyclique (0 à 4095, 12 bits)
valeur
valeur effectivement écrite, ou -1 si le canal ou la valeur est invalide /

Méthodes privées


            readRegister(uint8_t reg);;
writeRegister(uint8_t reg, uint8_t value);;
begin(115200);;
while (!Serial) {;
delay(10);;
println("Erreur d'initialisation du PCA9685 !");;
while (1);;
write(PCA9685_CHANNEL, 2048);;
print("Canal ");;
print(PCA9685_CHANNEL);;
print(" : ");;
println(value);;
delay(500);;

                    

Variables membres


            uint8_t _i2cAddress;
float _oscillatorFreq;

                    

Code source


        #pragma once
#include <Arduino.h>

#include "../StatusDevice.h"

namespace crepp::drivers {

/*
 * =========================
 * Driver PCA9685
 * -------------------------
 * Gestion du driver PCA9685 pour le contrôle des LED et des servomoteurs.
 * Communication via I2C, 16 canaux PWM indépendants, résolution 12 bits (0-4095).
 *
 * @badge driver
 * @badge experimental
 *
 * Fonctionnalités :
 * - Initialisation du driver (reset + configuration de la fréquence PWM)
 * - Réglage de la fréquence PWM globale
 * - Ecriture brute ON/OFF sur un canal
 * - Ecriture d'un rapport cyclique (0-4095) sur un canal
 * =========================
 */
class PCA9685_Handler {
public:
    /*
     * =========================
     * Constructeur
     * =========================
     * Initialise l'objet handler pour le PCA9685
     * @param i2cAddress : adresse I2C du composant (0x40 par défaut, plage 0x40-0x7F selon A0-A5)
     */
    explicit PCA9685_Handler(uint8_t i2cAddress = 0x40);

    /*
     * =========================
     * Méthode begin()
     * =========================
     * Initialise le bus I2C, réinitialise le composant (reset logiciel)
     * puis configure la fréquence PWM par défaut.
     * @param freqHz : fréquence PWM souhaitée en Hz (défaut 50 Hz, typique servomoteurs)
     * @return true si l'initialisation réussit (composant détecté sur le bus), false sinon
     */
    bool begin(float freqHz = 50.0f);

    /*
     * =========================
     * Méthode reset()
     * =========================
     * Effectue un reset logiciel du PCA9685 (registre MODE1).
     */
    void reset();

    /*
     * =========================
     * Méthode setPWMFreq()
     * =========================
     * Règle la fréquence PWM globale du composant (commune à tous les canaux).
     * @param freqHz : fréquence souhaitée en Hz (plage utile ~24Hz à 1526Hz)
     */
    void setPWMFreq(float freqHz);

    /*
     * =========================
     * Méthode setPWM()
     * =========================
     * Règle directement les compteurs ON/OFF (12 bits, 0-4095) d'un canal.
     * @param channel : numéro du canal (0 à 15)
     * @param on : instant de mise à 1 dans la période (0-4095)
     * @param off : instant de mise à 0 dans la période (0-4095)
     */
    void setPWM(uint8_t channel, uint16_t on, uint16_t off);

    /*
     * =========================
     * écriture d'un canal
     * =========================
     * Ecrit un rapport cyclique dans un canal spécifique.
     * @param channel : numéro du canal à écrire (0 à 15)
     * @param value : valeur du rapport cyclique (0 à 4095, 12 bits)
     * @return valeur effectivement écrite, ou -1 si le canal ou la valeur est invalide
     */
    int16_t write(uint8_t channel, uint16_t value);

private:
    uint8_t _i2cAddress;
    float _oscillatorFreq;

    uint8_t readRegister(uint8_t reg);
    void writeRegister(uint8_t reg, uint8_t value);
};

/*
@example

@include
#include <crepp/drivers/PCA9685_Handler.h>
@end_include

@macro
#define PCA9685
#define PCA9685_CHANNEL 0
@end_macro

@instance
crepp::drivers::PCA9685_Handler driver;
@end_instance

@setup
  Serial.begin(115200);
  while (!Serial) {
    delay(10); // Attente de la connexion série
  }

  if (!driver.begin()) {
    Serial.println("Erreur d'initialisation du PCA9685 !");
    while (1);
  }

@end_setup

@loop
  int16_t value = driver.write(PCA9685_CHANNEL, 2048); // ~50% de rapport cyclique
  Serial.print("Canal ");
  Serial.print(PCA9685_CHANNEL);
  Serial.print(" : ");
  Serial.println(value);
  delay(500);
@end_loop

@end_example
*/

} // namespace crepp::drivers