ESP32 ShiftRegister PWM

Bonjour à toutes et à tous,
Je travail sur un circuit à led avec deux digits vert et deux rouge, ceux-ci sont pilotés par un ESP32 et quatre registres à décalage (74HC595), tout fonctionne très bien avec un petit programme simple sans aucunes bibliothèques. Mais j'ai besoin de faire varier la luminosité des leds , sur un autre projet, j'utilisais un arduino nano avec la bibliothèque ShiftRegisterPWM.h avec succès, mais celle-ci n'est pas compatible avec l'ESP32. Quelqu'un a-t-il une biblio sous le coude, après énormément d'heures de recherche, je n'en ai trouver qu'une et elle ne fonctionne pas.

Je ne connais pas de librairie pour faire ce que tu veux,
Mais si ton programme n'est pas trop compliqué, tu peux le faire toi même relativement facilement.

Bonjour terwal,
mon programme est très simple pour le moment, il affiche seulement le chiffre 11.
je n'ai rien trouver pour faire varier la luminosité, quelle serait ta méthode?
Voici mon code:

#define DATA_PIN  2  
#define LATCH_PIN 22
#define CLOCK_PIN 21

#define NUM_SHIFT_REGS 2

const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 32;

bool registers[numOfRegisterPins];

int vitesse = 11;

void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  clearRegisters();
  writeRegisters();
}


void loop() {
  
  //setRegisterPin(0, true);
  //writeRegisters();

  int digitun = vitesse / 10; //DIGIT VERT GAUCHE
  int digitdeux = vitesse % 10; //DIGIT VERT DROIT

  switch(digitun){

    case 0:

      setRegisterPin(0, true);
      setRegisterPin(1, true);
      setRegisterPin(2, true);
      setRegisterPin(3, true);
      setRegisterPin(4, true);
      setRegisterPin(5, true);
      writeRegisters();
      break;

    case 1:

      setRegisterPin(1, true);
      setRegisterPin(2, true);
      writeRegisters();
      break;
  }

  switch(digitdeux){

    case 0:

      setRegisterPin(16, true);
      setRegisterPin(17, true);
      setRegisterPin(18, true);
      setRegisterPin(19, true);
      setRegisterPin(20, true);
      setRegisterPin(21, true);
      writeRegisters();
      break;

    case 1:

      setRegisterPin(17, true);
      setRegisterPin(18, true);
      writeRegisters();
      break;
  }
}

void clearRegisters() {
  
  for (int i = numOfRegisterPins - 1; i >= 0; i--) {
    registers[i] = LOW;
  }
}

void setRegisterPin(int index, int value) {
  
  registers[index] = value;
}

void writeRegisters() {
  
  digitalWrite(LATCH_PIN, LOW);

  for (int i = numOfRegisterPins - 1; i >= 0; i--) {
    digitalWrite(CLOCK_PIN, LOW);
    digitalWrite(DATA_PIN, registers[i]);
    digitalWrite(CLOCK_PIN, HIGH);
  }

  digitalWrite(LATCH_PIN, HIGH);
}

Je pense qu'avec ton programme tu pourrais changer la luminosité simplement en envoyant un signal PWM sur la broche OE des 74HC595.

Bonjour @d_r_elec

+1 avec @fdufnews

réunir les OE et leur envoyer un signal rectangulaire dont on module le rapport cyclique (PWM)

L"ESP32 est pourvu de moyens divers pour produire , par harware interne, ce type ce type de signaux

L'un d'eux est le bloc de PWMs nommé LEDC

il est utilisé dans l'exemple suivant fourni avec l'IDE Arduino où dans le code on fixe à volonté le paramètre duty (rapport cyclique)
https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/AnalogOut/LEDCSoftwareFade/LEDCSoftwareFade.ino

Bonjour fdufnews,
la broche OE est reliée au GND du circuit, je sais pas si ca va etre possible.
Sinon dans mon code je devrais aujouter quelque chose comme ca:

analogWrite(OE, 100)

voir au dessus , analogWrite() , il me semble n'existe pas tel quel sur ESP32, (ça a pu changer...)i prendre dans ce cas l'un des équivalents adaptés aux spécificités de cette puce

Oui par exemple (ou son équivalent). Le seul risque, c'est qu'il y ait un battement entre le rafraîchissement de l'affichage et la fréquence du PWM qui n'est pas très élevée.

Autrement il y a cette librairie

Bonjour @fdufnews

avec ledcAnalogWrite() on devrait pouvoir se libérer du soucis de battement, c'est un AnalogWrite 'de course' !

https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/ledc.html

Merci pour vos réponses, je pense partir dans un premier temps sur LEDC, mais dans tout les cas je serais obliger de faire une modif sur le circuit. je vous tiens très vite au courant de mes avancer.

bonjour,
oui effectivement cela devrait faire le job.

Bonjour , je passais par là :

  1. on peut très bien faire du dimming en utilisant des HC595 : le principe c'est de générer le grain par un latch émis périodiquement par un timer ; ce latch provoque également une interruption qui démarre l'envoi des datas qui seront entérinées par le latch suivant ; l"ESP32 est mauvais pour ce type d'opération , vu sa latence minable entre la source de l'interruption et le début de l"ISR
  2. pour renseigner rapidement des HC595 (ou tout autre suivant le principe du décalage) , il faut utiliser le périphérique SPI : il y en a 2 très rapides sur l'ESP32 , qui peuvent être matricés sur n'importe quelle broche (mais je n'ai effectivement pas de bibliothèque toute faite pour ça)
  3. analogWrite(OE, 100) : ça serait plutôt analogWrite(OE, 100 - duty) ; mais le + élégant est de laisser ainsi , et d'inverser le signal /OE dans la matrice de l'ESP32
  4. il y a 16 sorties pwm (appelées ledc) , qui peuvent être présentes sur toutes les broches , et si ça suffitpas , on doit aussi pouvoir en générer par les périphériques GPIO

Bonjour trimarco232, merci de passer par là. Je nais pas encore fait la modif sur mon circuit pour tester, par contre je comprend pas la différence entre analogWrite(OE, 100) et analogWrite(OE, 100 - duty), je le vois un peu partout, pourquoi déduire une valeur à une autre, pour moi ça n'a aucun sens.

je ne l'ai pas encore fait, mais il y a un condensateur entre le premier OE et le GND pour éviter les parasites, est ce que je peux le laisser si je les réunis tous pour utiliser analogWrite?

le pourcentage que tu veux obtenir , je l'ai appelé duty
/OE est une entrée active au niveau LOW , donc si tu mets :
100% tu obtiens 0%
0% tu obtiens100%
25% tu obtiens 75%
67% tu obtiens 33% ... etc.
donc si tu mets (100 - duty) tu obtiens ce que tu veux
mais comme dit , le + pur c'est d'inverser , au niveau de la matrice de l'ESP32 , le signal de la broche reliée à /OE
il faut absolument enlever le condensateur sur la sortie pwm de l'ESP32 : il agit en court circuit ; par contre tu peux mettre une résistance de pull-up à la place , si tu veux que les 8 sorties de tes HC595 soient en haute impédance lors de phases de reset de l'ESP32

Bonjour trimarco232,
je n'avais jamais eu cette explication dans les différents exemples trouvé sur le net, je comprend maintenant pourquoi on soustrait ces deux valeurs. Le condensateur sera enlevé, et une résistance de pull-up le remplacera, je ferai l'essai dans le weekend. Merci pour toutes ces infos.

Bonjour à tous,
désolé de cette réponse très tardive, j'ai relier tous le OE ensemble, le tout relier à une sortie de l'ESP32 en passant par une résistance de pull-up, et le tout fonctionne à merveille. je vous remercie tous pour votre aide.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.