comportement différent en 5V et 12V externe

Bonjour,

j’ai un projet de pilotage d’un ruban LED et un ventilateur par un Arduino Uno Rev2.

J’ai fait pour cela une petite carte d’interface.

J’alimente le tout par un bloc secteur 12V externe.

Chose étrange c’est que quand j’alimente le tout par l’alim 12V cela ne fonctionne pas (boutons, encodeur et LEDs inactifs). Par contre quand je connecte le tout à l’USB pour transférer mon programme (le tout toujours alimenté en 12V) tout fonctionne ! Le plus étrange étant qu’une fois dans cet état, même en enlevant le cable USB cela continue de fonctionner… Si j’éteins le 12V et que je rallume, cela ne fonctionne plus de nouveau.

Une suggestion ? Problème matériel ? logiciel ?

Ci joint mon schéma et mon code.

#include <TM1637Display.h>

#define ROTARY_CLK 2
#define ROTARY_DT 3
#define ROTARY_SW 4

#define DISPLAY_CLK 9
#define DISPLAY_DIO 7

#define BUTTON_PIN 6
#define LED_PIN 8     

int buttonState = 0;         // variable for reading the pushbutton status

int timerSec = 0;
int timerMin = 0;
int timerSetMode = 1; // toggle set of min or sec. Default = seconds

int rot_clkValue = LOW;
int rot_dtValue;
int rot_lastState = LOW;
int rot_swState;
unsigned long lastRotarySwPress = 0; // tempo 50ms to avoid click errors
unsigned long lastRotClk = 0; // tempo 50ms to avoid rotation errors

TM1637Display display = TM1637Display(DISPLAY_CLK, DISPLAY_DIO);
int allON[] = { 0xff, 0xff, 0xff, 0xff };
int allOFF[] = { 0x00, 0x00, 0x00, 0x00 };


void setup() {
  pinMode(ROTARY_CLK, INPUT);
  pinMode(ROTARY_DT, INPUT);
  pinMode(ROTARY_SW, INPUT_PULLUP);

  pinMode(DISPLAY_CLK, INPUT);
  pinMode(DISPLAY_DIO, INPUT);

  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN,LOW);

  pinMode(BUTTON_PIN, INPUT); 

  display.setBrightness(1);
  display.clear();
  
  //Serial.begin(9600);

  attachInterrupt(digitalPinToInterrupt(ROTARY_CLK), onRotaryClkChange, CHANGE);
}

void loop() {

  // read the state of the pushbutton value:
  buttonState = digitalRead(BUTTON_PIN);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(LED_PIN, HIGH);
  } else {
    // turn LED off:
    digitalWrite(LED_PIN, LOW);
  }


  // Read the Rotary button state
  int rot_swState = digitalRead(ROTARY_SW);

  //If we detect LOW signal, button is pressed
  if (rot_swState == LOW) {
    //if 50ms have passed since last LOW pulse, it means that the
    //button has been pressed, released and pressed again
    if (abs(millis()) - lastRotarySwPress > 50) {
          timerSetMode *=-1;
    }

    // Remember last button press event
    lastRotarySwPress = millis();
  }
}

void onRotaryClkChange() {
  String msg; // DEBUG !!
  rot_clkValue = digitalRead(ROTARY_CLK);
  if (rot_lastState == LOW && rot_clkValue == HIGH) {
    rot_dtValue = digitalRead(ROTARY_DT);
    if (rot_dtValue == LOW) {
          if (timerSetMode == 1) {
            timerSec++;
            msg = "\nOrientation : Positif / Mode : Sec / timerSec : " + String(timerSec);
            Serial.println(msg);
          }
          else {
            timerMin++;
            msg = "\nOrientation : Positif / Mode : Min / timerMin : " + String(timerMin);
            Serial.println(msg);
          }
    }
    else {
         if (timerSetMode == -1) {
            timerSec--;
            msg = "\nOrientation : Negatif / Mode : Sec / timerSec : " + String(timerSec);
            Serial.println(msg);
          }
          else {
            timerMin--;
            msg = "\nOrientation : Negatif / Mode : Min / timerMin : " + String(timerMin);
            Serial.println(msg);
          }
    }

    display.showNumberDecEx(timerSec, 0b01000000, false, 2, 2);
    display.showNumberDecEx(timerMin, 0b01000000, false, 2, 0);
    }
  rot_lastState = rot_clkValue;

  }

Bonjour,

12V sur le régulateur de la carte, ça passe mais ça commence à faire beaucoup à dissiper. Entre la consommation propre de ta UNO et celle de l’afficheur, il se peut que ce soit la cause du problème.

En USB, le régulateur n’étant pas utilisé, tu dispose de plus de puissance ce qui explique un fonctionnement correct.

Idéalement mets en place un régulateur 5v pour alimenter ta carte et ton afficheur

Humm... ok. Ca semble logique. Ceci dit en regardant sur le net, je tombe sur des projets similaires tout alimenté sans régulateur externe...

Au passage, je viens de me rendre compte que si je supprime la résistance pull down du bouton (R6 sur le schéma) le bandeau de LED s'allume et le ventilo tourne... Si je remet la résistance, tout fonctionne comme prévu !

J'ai l'impression de faire un truc de travers sur mon schéma...

Ceci dit en regardant sur le net, je tombe sur des projets similaires tout alimenté sans régulateur externe...

Tu es pourtant au minimum : display.setBrightness(1);

Vois ici : https://forum.arduino.cc/index.php?topic=591571.0

La UNO a certainement une surface de refroidissement supérieure à la NANO mais le principe est le même. Avec 12V : I = P/I = 1W/12V-5V = 1W/7 = 140mA maxi Réduis ta tension d'alimentation, mais pas en dessous de 6.5V.

Si je remet la résistance, tout fonctionne comme prévu !

C'est normal. La résistance R6 est une pull-down. Étant donné la très haute impédance de l'entrée, elle se comporte comme une antenne.

Tu pourrais utiliser pinMode(D5, INPUT_PULLUP) et ensuite inverser la logique de lecture de lecture digitalRead(D5) == LOW au lien de digitalRead(D5) == HIGH.

hbachetti: C'est normal. La résistance R6 est une pull-down. Étant donné la très haute impédance de l'entrée, elle se comporte comme une antenne.

Justement l'idée c'est de garder l'entrée à LOW. Mais en appuyant sur le bouton elle devrait passer à HIGH et en relachant la résistance de nouveau tirer l'entrée à LOW ? C'est d'ailleurs ce qu'il se passe une fois la résistance retirée et ré-intégrée (le bouton fonctionne bien)...

Oui mais tu pourrais te passer de cette résistance. pinMode(D5, INPUT_PULLUP) active une résistance interne pullup. Donc l'entrée devient HIGH par défaut. Il faut donc câbler le bouton entre entrée et GND. C'est juste pour éviter l'emploi d'une résistance externe.

Ok. Je vais tester, c’est toujours ça de moins à souder :slight_smile:

Hello à vous,

Bon j'ai eu quelques petits soucis de routage de pistes mais rien de grave. Par contre il s'avère effectivement que la puissance des interfaces externes était un peu trop gourmande pour le régulateur de l'Arduino ce qui "semblait" fonctionner, mais de manière instable.

J'ai donc tout repensé et refait une plaque intégrant un ATMega328P autonome et un régulateur de tension un peu plus costaud et tout fonctionne à merveille !

Merci à vous pour votre temps et vos suggestions

Bonne journée à vous !

Bonne continuation