[Resolu] Compatibilité PWM et librairies Wire sur MEGA2560

Je rencontre un problème étrange (pour moi).

Sur une Arduino Mega, j’utilise (entre autre) 3 sorties (2,3 et 5) qui pilotent des moteurs en PWM via des MOSFET.
Ces sorties utilisent le Timer3 (qui est prescalé dans le Setup, mais çà n’a pas d’influence sur le problème).
Les sorties sont pilotées dans le loop().

Pour mémoire :
Sortie 2 : OC3B / INT4 / PE4
Sortie 3 : OC3C / INT5 / PE5
Sortie 5 : OC3A / INT1 / PE3

Tout fonctionnait correctement jusqu’à ce que je décide d’upgrader mon installation, et d’y rajouter une DS1307 en I2c. Avec inclusion des librairies ‘wire’ et ‘RTClib’. GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC Arduino library

Pour mémoire sur la MEGA, l’I2C est raccordé sur les Pins 20 (SDA / INT1 / PD1) et 21 (SCL / INT0 / PD0).

Le programme fonctionne correctement tant que la sortie 3 n’est pas commandée. Le programme se plante dès que cette sortie est commandée. Les sorties 2 et 5 ne posent pas de problème.
Et choses plutôt étranges que je n’explique pas :

  • Si le MOSFET n’est pas chargé (câble en aval du MOSFET débranché) la carte ne plante pas. Alors que tout fonctionnait bien auparavant.
  • Sans rien dé-câbler, en réinjectant le soft précédent (donc sans déclarer les lib ‘wire’ et ‘RTClib’) tout re-fonctionne.

Y a-t-il une interaction entre le port de la sortie 3 et la librairie ‘wire’ (I2C) ?
Comment contourner le problème ?

Franck

Un bout de code pour tester
(J'ai laissé les librairies utilisées par ailleurs)

// Inclusion des librairies
  #include <Servo.h>           // Intègre la librairie servomoteurs
  #include <EasyTransfer.h>    // Intègre la librairie Easy Transfert pour liaison série vers UNO
  #include <EEPROM.h>          // Intègre la librairie EEPROM pour sauvegarde des modifications de données
  #include <RTClib.h>          // Intègre la librairie RTC "Horloge temps réel"
  #include <Wire.h>  

                      
  boolean BPtest = A8;         
  int Pompe = 0;
  int Seconde = 0;
  
   RTC_DS1307 RTC;
 

void setup() {  // DEBUT DE SETUP
  
   TCCR3B = TCCR3B & 0b11111000 |1;// Accélère le timer 3 (sorties 2, 3 et 5)

  // Adressage des entrées et mise en oeuvre des pull-up
  pinMode (BPtest, INPUT);       // Déclaration de l'entrée A8
  digitalWrite(BPtest, HIGH);    // Activation du pullup de l'entrée A8
 
  // Initialise les liaisons séries
  Serial.begin(38400);           // Initialise la liaison série Hard

  // Initialise la liaison I2C
  Wire.begin();
  
  
  // Initialise la librairie Horloge
  RTC.begin();
        // Décommenter cette ligne pour mettre à jour l'heure dans la puce Horloge
        // RTC.adjust(DateTime(__DATE__, __TIME__));
        
  
   delay(50);
 
}      // FIN DE SETUP



void loop() { // DEBUT PROGRAMME LOOP 

 DateTime now = RTC.now();
               
           
  if (digitalRead (BPtest) == 0)  Pompe = 80;
       else { Pompe = 0;}
         
  analogWrite (3, Pompe);           
                      
  if (Seconde != now.second()) {
    Seconde = now.second();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    }
        
        delay(333);
        
}

Salut,

il faut bien avouer que c'est un problème très singulier que tu présente là :slight_smile:

Le fait qu'il suffise de débrancher un câble d'une broche configurée en tant que sortie pour débloquer le système me laisserait plutôt penser que le problème est plus côté hardware que software. Quand tu dis que le programme plante, quels sont les symptômes exacts : est-ce que l'exécution s'arrête complètement (et si oui comment est-ce que tu t'en rends compte) ? ou bien il fonctionne de manière erratique ?

Serait-il possible également d'avoir une schéma du circuit utilisé ? (à condition qu'il représente fidèlement la façon dont les composants sont physiquement branchés), ou bien éventuellement un photo ?

J'ai la vague sensation que le problème est en fait extrêmement simple, mais je n'arrive pas à mettre le doigt dessus... :frowning:

Bonjour, et merci.

Lors du plantage, la sortie reste bloquée à vitesse 80, et le moniteur ne reçoit plus les print.

C'est une hypothèse que j'avais explorée. J'ai inversé plusieurs sorties pompes, et c'est toujours la même qui génère le problème, quel que soit le moteur raccordé.

Mais je n'avais pas pour autant testé en inversant les sorties à la carte. Je viens de tester, et si je déplace le pin de sortie en même temps que le N° de sortie dans le soft, le problème est toujours présent. Donc :
Mon problème doit provenir du circuit d'interface 'MOSFET' entre la sortie Mega et le bornier moteur. Bizarre, mais je ne vois pas d'où cela peut provenir. J'ai 3 lignes identiques en parallèle, Seule celle-ci pose problème. (Une soudure sèche ?). (Shéma en PJ)

J'ai retesté également en déconnectant la carte RTC, le problème n'apparait plus. J'imagine un problème de parasitage du flux I2C.
J'avais envisagé une chute de tension, mais le 5V d'alimentation du circuit RTC est pris sur un 5V externe régulé, indépendant du 12V utilisé par les Mosfets et le 6V de la MEGA.
J'ai tenté de rajouter des 10K en Pull-up entre VCC(5V) et SDA et SCL. la MEGA ne lit plus.

Je vais redémonter le C-Imprimé pour voir si je vois quelque chose.

Printing Interface 5V 12V-sch.pdf (9.38 KB)

J'ai tenté de rajouter des 10K en Pull-up entre VCC(5V) et SDA et SCL. la MEGA ne lit plus.

C'est sans doute normal si des pullups sont déjà présentes sur ton module RTC : en ajouter d'autres revient à placer des résistances en parallèle, et donc à diminuer la résistance équivalente.

À part ça, il apparaît presque sûr désormais que le problème vient du driver de moteur comme tu le dis. Je serais toi je jetterai un oeil à R2, ou autour de R2, genre un truc en (presque) court-circuit.

Bon, b'en rien ne va plus

Après avoir démonté, photographié, et retesté. En fait, ce sont les 3 sorties qui posent problème, à plus ou moins long terme. Le plantage n'intervient pas du premier coup, mais dans certains cas. Très certainement au moment du transfert de données entre le circuit RTC et la Mega. :~

Sur la dernière photo, on voit au dessus de la rangée des 3 Mosfet les 2 régulateur 5 et 6V.
Se peut-il que le 5V chope le rayonnement des Mosfet ?
Celui qui m'a posé le plus rapidement problème est le plus proche du régulateur 5V d'alim de la RTC

Il est possible que les PWM génèrent suffisamment de « bruit » pour que la sortie du régulateur 5V ne soit pas stable, ce qui ferait planter la RTC. Si tu as un oscilloscope tu pourrais regarder ce qui se passe à ce niveau là (mais je suppose que ce n'est pas le cas, tu l'aurais probablement déjà fais sinon :slight_smile:

Autre chose, pourquoi alimenter la carte Mega avec 6 Volts ?

Bonjour

Malheureusement non, je n’ai pas d’oscillo à ma disposition. :frowning:

J’ai en tête plusieurs pistes :

  • Utiliser le 5V de la Mega à la place de ce 5V ‘externe’ pour alimenter le circuit RTC, (Pin 5V et Gnd pour commencer, et si ok, basculer sur 2 pins de sorties (HIGH et LOW) pour faire l’alim.

  • Autre idée : Contourner la lib wire en utilisant la lib SoftWire (Peut-être que celle-ci sera moins sensible). C’est une option que j’avais en tête avant de penser que le problème était coté Hardware.

  • Le 5V de la carte est utilisé pour alimenter des interfaces de mesure (pH ; T°, …).
  • Le 6V pour des servos, relais, entrées (via 2 ULN2803 cachés sous la Mega 1 pour les entrées TOR, l’autre pour les sorties).
    Ce 6V permet dans le même temps d’alimenter la Mega (le 12V d’entrée me semblant moins opportun)

OK, mais ce que je ne comprends pas c'est pourquoi 6 Volts : d'un côté ça fait beaucoup si c'est branché sur la broche +5V, de l'autre c'est trop peu pour Vin.

haifger:
c'est trop peu pour Vin.

Tu as peut-être bien mis le doigt là où çà cloche. Il faut que je vérifie.

J'ai maintenant un doute sur l'alim de la Mega (entre le 6V et le 12V). Effectivement, 6V serait limite, et expliquerait les décrochages sur chute de tension liée à l'utilisation des moteurs. Quoi que j'en doute un peu, vu la tension d'alim du régulateur (12V), et le condo de filtrage.

Le fil rose qui sort du 5V Mega sert à alimenter les ULN2803. Ce n'est pas une alim. L'alim est le fil rouge (qui doit être du 12V)

Je ne pourrais vérifier que demain matin.

Bonjour,

Et bien, çà y est. Plus aucun plantage depuis que j'utilise le 5V généré par la Mega pour alimenter le circuit RTC.

J'en déduis :

  • La liaison I2C est donc sensible aux parasites. (Et ien n'a été prévu dans le soft pour gérer la défaillance)
  • Mon 5V est pourri (surprenant que je ne rencontre pas de problème par ailleurs).
    Par souci de nettoyage pour le reste du circuit, il va falloir que j'emprunte un oscillo, et que je filtre ces parasites à la source (Mosfet).

Merci encore pour ton aide haifger.

Franck