Pompe à eau solaire

Bonjour, je veux faire une pompe solaire pour un bassin. J'ai donc un panneau solaire 12v 95W, une batterie 12V de voiture en bon état, un arduino. Je vais m'achter un régulateur solaire pour gérer le chargement de la batterie, ainsi qu'un step down 12v vers 5V pour alimenter l'arduino.

L'idée est de commander l'alimentation de la pompe via un mosfet (j'ai des IRL530N en stock), pour la faire fonctionner lorsque la batterie est au dessus d'une certaine tension (je pense à une tension d'environ 12.6 V pour ne pas trop décharger la batterie), puis la couper lorsque cette batterie passe en dessous de cette tension, et laisser un certain temps avant de la rallumer pour laisser la batterie se charger.

Pour capter la tension de la batterie je vais utiliser un pont diviseur avec des résistances : R1 = 680Ohm et R2 = 330 Ohm, avec une tension d'entrée de 15V, et de sortie (à 15V) de 5V. J'ai calculé en prenant 15V pour prendre une petit marge et ne jamais avoir plus de 5V a rentrer dans l'arduino. Pour le code c'est ok je pense savoir comment faire.

La ou je ne sais pas comment faire, ou j'ai essayé maintes fois de comprendre comment l'utiliser, c'est les transistors MOSFET (N ici). J'avais déjà essayé d'en utiliser un pour controler un moteur DC en PWM, et c'éatit un échec (parfois ça marchait parfois non).
Donc j'aimerais trouver des explications sur comment utiliser un mosfet en mettant 5V sur la Gate pour piloter du 12V (seulement quelques ampères au maximum).

Voici mon premier jet de code

/*                                                    programme pour mesurer une tension max de 15VDC pour batterie 12V, et gérer un mosfet pour commander une pompe à eau 12V
 *schema de montage pont diviseur de tension         VIN 15vdc        R1 = 680Ohm     R2 = 330Ohm    Vout = 5V quand Vin 15v
 * 
 * broche mosfet gate = d3
 * broche sortie pont diviseur = A0
*/
void setup() {

}

void loop() {

  tension = analogRead(A0);

  while(tension > 860) {   //produit en croix : 5V*12.6V/15V = 4.2V     5V = 1023 donc 1023*12.6/15= 860
    digitalWrite(3, HIGH);
    delay(60000);
  }

  if(tension < 870) {
    digitalWrite(3, LOW);
    
    while(tension < 914) {     //produit en croix : 5V*13.4V/15V = 4.47V     5V = 1023 donc 1023*13.4/15= 914       en gros, tant que la tensions batterie est inferieure à 13.4v, la pompe est éteinte
      delay(600000) attends 10 minutes
    }
  }


}

Bonjour,

Commande du mosfet;
Cde-Mos (1)
Remarque: les résistances de ton pont de 680/330Ω sont faibles et vont tirer inutilement sur la batterie. Tu peux multiplier leur valeur par 10 ou par 50.

Les valeurs de résistances de 330Ohm et 1kOhm sont calculées ?

Je vais donc déjà tester le pont diviseur avec des résistances de 68k et 33k (respectivement R1 et R2). Ou sinon 6.8k et 3.3k ?

La résistance de 330Ω est pour limiter l'appel de courant lors de la commutation. Au grand max l'appel de courant sera 5V/330Ω=15mA ce qui est largement acceptable pour les sorties. Tu pourait aussi mettre 220Ω.
La résistance de 100k est pour éviter que la gate ne soit flottante lorsqu'elle n'est pas commandée (pendant l'initialisation du micro par exemple). Sa valeur n'est vraiment pas critique. C'est inutile qu'elle soit trop faible et au delà de 1MΩ ça commence à être trop élevé pour être efficace.

Personnellement je choisirai 68k/33k. L'impédence d'entrée du micro est négligeable devant 33k.

C'est à dire ? :confused:

J'ai remarqué que j'avais des transistors PNP TIP121 qui conviendraient peut-être un peu mieux pour mon projet (ils peuvent laisser passer 5A en normal et 8A en pic, sachant que ma pompe fera sans doute une 20 aine de W, donc largement en dessous des 60W accepté).
En utiliser un à la place du mosfet initial serait mieux pour moi car je n'ai pas beaucoup de mosfets.

Dans ce cas, le circuit de branchement serait le même ? (avec les deux résistances ?)

C'est à dire que l'impédance de l'entrée analogique est très grande devant la résistance de 33k et que tu peux la négliger dans le calcul du pont.

Le TIP121 est un transistor NPN et non un transistor PNP. L'utilisation est plus facile qu'un transistor PNP.
Il faut une seule résistance dans la base. Pour la calculer il faut diviser le courant collecteur par le gain. Comme le gain est très élevé, en général une résistance de 1k convient.

Personnellement j'utiliserai plutôt un mosfet qui va provoquer moins de chute de tension, mais si tu disposes de TIP121 ils conviendront aussi.

Oui, c'est aussi mon avis.
Un TIP121 est un darlington. Il provoquera une chute de tension de 2V pour quelques ampères de courant collecteur.
Un IRL530 a une résistance RDSon faible : 0.1Ω. Il provoquera une chute de tension de 0.2V pour 2A, donc 10 fois moins qu'un TIP121.
Mais rien ne t'empêche d'essayer les deux.
Pour info le gain du TIP121 est de 1000, donc si la pompe consomme 2A, le courant de base sera de 2mA.
La résistance de base Rb = (5V - Vbe) / Ib = (5V - 2V) / 0.002 = 1500Ω
Divise cette valeur par 2 ou 4 pour que la saturation soit correcte.

Le MOSFET serait meilleur, et plus facile à calculer. En fait il n'y a aucun calcul, contrairement à un transistor bipolaire.

Oui, sauf que :

  • la tension de référence de 5V doit être très stable et peu bruitée. Un convertisseur à découpage apportera t-il cette stabilité ? Pas sûr.
  • il est possible d'utiliser la sortie 3.3V de l'ARDUINO comme tension de référence. Dans ce cas, il faut recalculer le pont.
  • dans un cas comme dans l'autre il faut mesurer la tension de référence pour en tenir compte dans le code.

De toute manière, je n'ai pas besoin d'une précision importante. Mon pont diviseur va juste servir à savoir quand la batterie est déchargée, et donc commander à l’Arduino de couper la pompe via le MOSFET (je vais finalement utiliser le MOSFET d'après vos conseils). Je compte mesurer environ au dixième de volt. J'ai déjà testé cette partie, et j'arrive à mesurer la même tensions qu'avec un multimètre, au demi-dixième près !

Etant donné la valeur dans le code (5V pile) il était légitime de se poser la question.

La fonction loop() s'exécute déjà dans une boucle while(), pas la peine d'en ajouter.
Si la variable tension n'est pas mise à jour dans la boucle, il sera difficile d'en sortir. Idem pour la deuxième.
Je verrais plutôt des instructions if().
Et j'ai l'impression que les valeurs de seuil sont inversées.

1 Like

Quand le moteur tournera, la mesure sera probablement beaucoup plus bruitée.

Oula, ça fait longtemps que je n'ai pas utilisé d'Arduino moi :rofl: ...

/*                                                    programme pour mesurer une tension max de 15VDC pour batterie 12V, et gérer un mosfet pour commander une pompe à eau 12V
 *schema de montage pont diviseur de tension         VIN 15vdc        R1 = 680Ohm     R2 = 330Ohm    Vout = 5V quand Vin 15v
 * 
 * broche mosfet gate = d3
 * broche sortie pont diviseur = A0
*/
float valeur = 0;
float tension = 0;

void setup() {

}

void loop() {

  valeur = analogRead(A0);
  tension = ((valeur*5)/1023)*3; //on calcule Vbatt
  

  if(tension < 12.40) {   //petite marge de sécurité
    digitalWrite(3, LOW);
    
    while(tension < 914) {     //produit en croix : 5V*13.4V/15V = 4.47V     5V = 1023 donc 1023*13.4/15= 914       en gros, tant que la tensions batterie est inferieure à 13.4v, la pompe est éteinte
      delay(600000);  // attends 10 minutes
      valeur = analogRead(A0);
      tension = ((valeur*5)/1023)*3;
    }
  }

}

Bonjour,
Ceci fait les calculs en entier et le résultat va être soit 0 soit 3.
Pour faire les calculs en flottant:
tension = ((valeur*5.0)/1023)*3; //on calcule Vbatt

Il me semble que tu mélanges tension et valeur ADC.
Et la mise en route de la pompe a disparu.
Encore un petit effort ...

J'ai reçu tous mes composants (pompe 12V 19W, régulateur pour panneau solaire), j'ai fini mon code et ai fait mon schéma. Je pense que ça devrait marcher mais je n'ai pas envie de cramer de composants : je ne suis pas sûr pour les valeurs des condensateurs pour le 7805.

Pouvez-vous me confirmez ces valeurs, ou sinon m'en proposer d'autres ?

Le code :

/*                                                    programme pour mesurer une tension max de 15VDC pour batterie 12V, et gérer un mosfet pour commander une pompe à eau 12V
 *schema de montage pont diviseur de tension         VIN 15vdc        R1 = 680Ohm     R2 = 330Ohm    Vout = 5V quand Vin 15v
 * 
 * broche mosfet gate = d3
 * broche sortie pont diviseur = A0
*/
float valeur = 0;
float tension = 0;

int pompe = 3; //définit la sortie D3 pour la pompe

void setup() {

}

void loop() {

  valeur = analogRead(A0);
  tension = ((valeur*5.0)/1023)*3; //on calcule Vbatt
  

  if(tension < 12.40) {   //petite marge de sécurité, normalement on peut utiliser une batterie plomb en dessous des 12v
    digitalWrite(pompe, LOW);
    
    while(tension < 13.40) {     //tant que la tensions batterie est inferieure à 13.4v, la pompe est éteinte
      delay(600000);  // attends 10 minutes
      valeur = analogRead(A0);
      tension = ((valeur*5)/1023)*3;
    }

   digitalWrite(pompe, HIGH);    //on allume la pompe
  }

}

Le schéma électrique (réalisé sur fritzing)

La valeur des condensateurs est toujours précisée dans la datasheet des régulateurs :

Page 7

Effectivement j'avais vu le 0.33µF sur la datasheet, mais le problème est que je n'ai pas de condensateurs à ces valeurs (que ce soit en neuf ou de récupération). Je peux mettre des valeurs les plus proches possibles ou je dois me conformer à la datasheet ?

Non, les valeurs indiquées sont un minimum.

1 Like

Bonjour,

Astuce: Pour éviter les captures d'écran dans Fritzing, exporter l'image du schéma en allant dans ''Fichier/Exporter/comme image/JPG"

A+