panneau solaire arduino et moteur 12v unipolaire

Portrait de kate77

Bonjour à tous,

désolée pour ce long post, mais j'essaye de vous donner le plus d'informations.

suite à la construction d'un poulailler, j'ai pu créer avec l'aide d'internautes, un petit programme arduino sur la carte nano pour commander l'ouverture de la porte selon la luminosité.

Tout est maintenant construit, poulailler, porte, boîtiers avec carte arduino, branchements), et je voudrais maintenant aller plus loin en alimentant tout cela avec des panneaux solaires :

la carte nano : je me suis basée sur la vidéo Comment réaliser un chargeur solaire  (panneau solaire, batterie lithium 3.7v, tp4056, et step up. tout est ok la batterie charge bien.

Pour le moteur, je rencontre des problèmes, je voudrais l'alimenter séparément en 12V,

j'ai une batterie lithium : capacité: 1800 mAh  tension d'entrée: 12.6 V tension de sortie: 10.8 ~ 12.6 DC

courant de sortie: 1-2.4A

j'ai deux panneaux solaires 12 v 2.5W montés en série (le convertisseur de charge acceptant jusqu'à 30V) 

un convertisseur de charge : 3A 3.7 V 7.4 V 11.1 V Auto

tension : 11.1V
courant de charge nominal : 3A
courant de charge nominale : 3A
un accès maximum : 36w
tension d’entrée : ≤30v

Les branchements sont faits, (mesures prises 17 h ce jour)

j'ai 20.9 V en sortie des panneaux,

14.2 v en entrée du convertisseur lorsque je connecte les panneaux

13.1 v en sortie vers la batterie et idem en sortie de batterie (mais cela uniquement lorsque les panneaux fonctionnent)

c'est avec la charge de la batterie que je rencontre un problème elle charge très peu (3.25v après deux jours de charge alors que le temps est au très beau).

j'ai essayé aussi avec un module HW 632, mais impossible de l'allumer et donc de régler la puissance.

il y a certainement une erreur de débutant... mais je ne sais laquelle.

Pouvez vous, si vous ne perdez pas patience sur ce long post, voir cela pour m'aider ?

je vous en remercie d'avance

Catherine

Portrait de Cédric29

Bonjour,

2.5W / panneau , c'est ridiculement bas non ?

Portrait de brossden

Peut on avoir un schéma électrique de l'ensemble de la réalisation ?

Pour Cedric29

2.5w x 2 = 5 w

5w x 8 heures d'ensoleillement = 40 w disponibles

40 w suffisent pour alimenter un moteur pendant quelques secondes ! Cherchez où se trouve le ridicule !

Portrait de Cédric29

Avec un calcul comme ça tu devrais vendre des panneaux solaires  dans une émission de télé shopping

Portrait de kate77

bonjour,

désolée d'être ridicule, mais comme je l'ai indiqué, je découvre cet environnement. 

le but de ces posts est je pense d'être constructif et le travail d'équipe est fait pour aller de l'avant !

Comme demandé par Brossden, j'annexe le schéma électrique pour la partie moteur, voir si vous avez besoin de la partie carte arduino-capteur de luminosité-interrupteur de course ?, cela fonctionne avec une alimentation séparée.

Le but est que tout fonctionne sous les batteries, et les panneaux doivent recharger les batteries pour la consommation de J pour qu'elles restent chargées.

j'ai rajouté dans la doc les caractéristiques techniques du moteur.

Utilisation : 

lever du jour : activation moteur si capteur fin de course bas activé ==> utilisation moteur 12V durant 5 minutes pour ouvrir la porte.

coucher du jour : activation moteur si capteur fin de course haut activé ==> utilisation moteur durant 5 minutes pour fermer la porte.

Si les panneaux sont faibles, il faudra certainement une longue période pour charger les batteries (ou alors les charger sur secteur avant de les mettre en place ?), à voir si l'installation est suffisante pour la consommation quotidienne.

Merci d'avance pour votre analyse,

je reste à votre disposition pour toute question complémentaire.

Très bonne journée

Portrait de Alex

Bonjour,

Il y a une chose qui me m'a sautée aux yeux dans ton schéma, c'est la batterie li-ion qui alimente directement le driver de moteur. Je te recommande fortement de passer par un régulateur de tension pour alimenter ton driver.

Dans ton schéma, ajoute également les courant max de chaque bloc si possible.

Les panneaux solaires font 12v mais mesurés en charge ou tension à vide?

Portrait de brossden

Kate

Pour ton montage nul n'est besoin de régulateur de charge. Étant donné la puissance minime de tes panneaux solaire et la taille de tes batteries branches les directement sur la batterie sans autre chose qu'une simple diode anti retour style 1N4007 ou équivalente. Les régulateurs sont nécessaires quand les panneaux solaires ont une puissance beaucoup plus importante par rapport à la capacité des accus et dans ton cas il sont la principale source de consommation des tes panneaux.

Par contre comme le préconise Alex il te faut impérativement un convertisseur de tension (12 volts vers 5 volts) si tu utilises le moteur pas à pas qui est représenté sur ton schéma car sa tension utilisation est de 5 Volt et non 12 Volt !

Je te déconseille aussi d'utiliser la bibliothèque fournie dans Arduino car elle est développée n'importe comment et il vaut mieux réaliser sa propre fonction pour avoir un bien meilleur rendement et une consommation optimisée. Dans ce cas je serais heureux de te communiquer un programme bien plus performant.

Dans ton schéma je ne vois pas de module arduino ni de capteur de lumière qui déclencheraient ouverture ou fermeture de ton poulailler !

En ce qui concerne Cédric29 il vaut mieux ignorer cet individu qui n'a jamais donné une seule idée concrète sur ce site. Voir les deux topics dont il est l'auteur dans les lignes qui précèdent.

Voilà j'espère t'avoir permis d'avancer un peu plus dans ton projet.

Bonne journée à tous

Portrait de kate77

Merci pour ton retour Brossden,

je vais donc revoir le circuit sans les régulateurs de charge, par contre pour le moteur je te confirme qu'il s'agit bien d'un 12V il en existe deux modèles un de 5V et un de 12V, j'ai bien acheté celui de 12V. ils indiquent bien dans la doc une tension nominale de 12 VDC.

si tu as une bibliothèque plus performante, je serais ravie de l'avoir si cela peut tout optimiser.

Pas de souci pour Cédric29 !

pour la partie arduino et capteur, je t'adresse le début de tuto que j'ai réalisé avec toutes les informations que j'ai pu collecter (avec les sources bien sûr), tu peux y voir la partie arduino.

Bonne journée

Portrait de kate77

bonjour,

Donc brancher l'alimentation sur les deux sorties load du contrôleur de charge présent  dans le shéma ?

pour les panneaux, mesures prises hier vers 17 H

j'ai 20.9 V en sortie des panneaux à vide,

14.2 v à charge lorsque que les panneaux sont en entrée du convertisseur de charge

bien cordialement

Portrait de brossden

Non pas de controleur de charge !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Les panneaux directement sur la batterie via une diode anti retour pour la nuit !

Portrait de kate77

re-moi,

en annexe le schéma avec les puissances max par bloc.

30 v max pour le contrôleur de charge

30 v max pour Uln2003

merci

Portrait de kate77

pour respecter la chronologie, je replace le message, pour le tuto, le fichier est trop lourd, je vais le retravailler pour pouvoir ensuite vous l'adresser.

Merci pour ton retour Brossden,

je vais donc revoir le circuit sans les régulateurs de charge, par contre pour le moteur je te confirme qu'il s'agit bien d'un 12V il en existe deux modèles un de 5V et un de 12V, j'ai bien acheté celui de 12V. ils indiquent bien dans la doc une tension nominale de 12 VDC.

si tu as une bibliothèque plus performante, je serais ravie de l'avoir si cela peut tout optimiser.

Pas de souci pour Cédric29 !

pour la partie arduino et capteur, je t'adresse le début de tuto que j'ai réalisé avec toutes les informations que j'ai pu collecter (avec les sources bien sûr), tu peux y voir la partie arduino.

Bonne journée

Portrait de brossden

Désolé mais le code que j'avais posté ici était pour un type de moteur différent donc je l'ai supprimé !

Portrait de kate77

merci à tous pour ces retours très fructueux.

 Je vais commander des diodes et revoir les alimentations,

et étudier le code

bonne journée

Portrait de brossden

" pour la partie arduino et capteur, je t'adresse le début de tuto que j'ai réalisé avec toutes les informations que j'ai pu collecter (avec les sources bien sûr), tu peux y voir la partie arduino. "

Je ne vois rien ??

Portrait de kate77

Bonjour,

j'ai dû splitter le fichier, je vais l'adresser en 4 parties.

c'est un draft, tu peux m'adresser tous tes commentaires.

Bonne fin de journée

bonne lecture, 

Portrait de kate77

partie 2

Portrait de kate77

partie 3

Portrait de kate77

partie 4 (dernier fichier)

Portrait de Walter

Beau projet!

Brossden tu pourrais détailler pourquoi le régulateur n'est pas nécessaire?
Je me demande sûrement naïvement en fait si l'utilisation des moteurs pendants 10 min par jour, ne devrais pas trop consommer quelques centaines de mA, du coup la batterie sera peut déchargé par les moteurs.
Donc le panneau ne va-t-il pas charger plus que de la décharge de la batterie?

Portrait de brossden

Bonjour Walter

pas besoin de régulateur car la puissance des panneaux est tellement faible que les batteries ne risquent absolument pas d'être soumise à une tension trop importante, la force contre-électro-motrice des batteries de ne risque pas d'être dépassée par ces panneaux

Pour les moteurs pas à pas ce n'est pas moi qui est fait ce choix, mais avec mon ma solution le moteur ne consomme absolument rien à l'arrêt chose impossible avec la bibliothèque stepper qui est complètement désorganisée.

Voilà as tu d'autres questions ?

Portrait de Walter

Merci pour ta réponse,

Une autre petite question, je n'ai pas regardé la bibliothèque en question, mais n'est-elle pas dédié au maintient du moteur en position fixe, malgré une charge potentiel?
A priori le projet de Kate77 utilise une porte battante, donc il n'y a pas le soucis.
Après effectivement c'est dommage de ne pas pourvoir simplement ne plus alimenter le moteur, à certaine position fixe.

Portrait de brossden

Le problème c'est que les moteurs pas à pas sont toujours alimentés quand on les arrête il restent sur le dernier pas programmé et continue à consommer et même le fait de rester sur le même pas ils ont tendance à consommer plus que lorsqu'ils tournent. Avec le driver fourni avec les micro moto-réducteur pas à pas Arduino qui n'est pas réellement un driver mais plus un étage de puissance. Les sorties sont pilotées par les 4 entrées commandées par les 4 sorties Arduino. pour stopper totalement la consommation il suffit de passer toutes ces sorties au même potentiel, LOW de préférence, donc nul besoin de relais pour cela. comme le moto-réducteur utilisé est pratiquement irréversible donc reste dans la dernière position mécaniquement. Certains drivers comme les TB6600 ont une entrée "Enable" qui permet la même chose !

Bonne journée à tous

Portrait de kate77

bonjour,

j'ai essayé de comprendre le code, tout n'est pas très clair.

Ma compréhension :

int x = 1950; utilisé comme délai
int pos = 0; 
const char DIN_RECEPTEUR_INFRAROUGE = 2;      // capteur infrarouge (je ne vois pas où cette donnée est utilisée
void setup() reconnait les bobines du moteur pas à pas unipolaire et leur attribue des paramètres
{

  pinMode(8, OUTPUT); détermine pin en sortie
  pinMode(9, OUTPUT);idem
  pinMode(10, OUTPUT);idem
  pinMode(11, OUTPUT);idem
  digitalWrite(8, LOW); non actif
  digitalWrite(9, HIGH);actif
  digitalWrite(10, LOW);non actif
  digitalWrite(11, LOW);non actif
  Serial.begin(9600);
}
void MesPas()
{
  int ret = digitalRead(9) + 10 * digitalRead(8) + 100 * digitalRead(10) + 1000 * digitalRead(11);
  Serial.println(ret); détermine la valeur de ret en utilisant la formule ci dessus, mais je ne la comprends pas
  delayMicroseconds(x);
}
void MyStep(int Pas) détermine le sens du moteur et applique un nombre de pas à effectuer
{
  int s;
  Serial.println(Pas);
  if (Pas > 0)
  {
    s = 1;
  }
  if (Pas < 0)
  {
    s = -1;
    Pas = s * Pas;
  }
  Serial.println(s); 
  for (pos = Pas; pos >= 0; pos -= 1) { condition selon valeur de pos, mais pour moi pos =0
    int ret = s * (digitalRead(9) + 10 * digitalRead(8) + 100 * digitalRead(10) + 1000 * digitalRead(11));
    switch (ret) { on applique le sens de rotation et le résultat nombre de pas
      case 1: puis on active ou désactive les bobines du moteur pour le faire fonctionner, ou pas. par contre  comment sont appliqués ces différents cas ?
        digitalWrite(8, HIGH);
        break;
      case 11:
        digitalWrite(9, LOW);
        break;
      case 10:
        digitalWrite(10, HIGH);
        break;
      case 110:
        digitalWrite(8, LOW);
        break;
      case 100:
        digitalWrite(11, HIGH);
        break;
      case 1100:
        digitalWrite(10, LOW);
        break;
      case 1000:
        digitalWrite(9, HIGH);
        break;
      case 1001:
        digitalWrite(11, LOW);
        break;
      case -1001:
        digitalWrite(9, LOW);
        break;
      case -1000:
        digitalWrite(10, HIGH);
        break;
      case -1100:
        digitalWrite(11, LOW);
        break;
      case -100:
        digitalWrite(8, HIGH);
        break;
      case -110:
        digitalWrite(10, LOW);
        break;
      case -10:
        digitalWrite(9, HIGH);
        break;
      case -11:
        digitalWrite(8, LOW);
        break;
      case -1:
        digitalWrite(11, HIGH);
        break;
    }
    delayMicroseconds(x);
  }
}
void loop()
{
  MyStep(4080);
  delay(1360);
  MyStep(-4080);
  delay(500);

}

Bon, tu vois, beaucoup de questions, mais je voudrais bien comprendre ce code avant qu'il ne soit intégré dans le code que j'utilise actuellement (voir partie 4 des documents).

Si tu pouvais m'expliquer cela, et m'indiquer comment l'intégrer proprement dans le code que j'utilise.

Merci d'avance.

Très belle journée

Portrait de kate77

Au fait, la porte utilisée est une porte à guillotine. voir fichier en annexe.

Bien cordialement

Portrait de brossden

Kate77

Je n'ai pas trop le temps, mais pourquoi ne pas utiliser un simple moteur electrique qui entrainerait une tige filetée dont l'écrou serait solidaire de la porte ce qui me semble t'il serait beaucoup plus facile à réaliser et surtout beaucoup plus fiable que des poulies renvois etc...

Portrait de Walter

Je vais essayer de te répondre sur ma compréhension du code.

int ret = digitalRead(9) + 10 * digitalRead(8) + 100 * digitalRead(10) + 1000 * digitalRead(11);
  Serial.println(ret); détermine la valeur de ret en utilisant la formule ci dessus, mais je ne la comprends pas
  delayMicroseconds(x);

pour moi cela sert uniquement comme affichage, comme on a du binaire (0,1), cela va t'afficher l'état de chaque sortie (ex 1001, pour 9=On, 8=Off, 10=Off, 11=ON)

for (pos = Pas; pos >= 0; pos -= 1) { condition selon valeur de pos, mais pour moi pos =0
    int ret = s * (digitalRead(9) + 10 * digitalRead(8) + 100 * digitalRead(10) + 1000 * digitalRead(11));
    switch (ret) { on applique le sens de rotation et le résultat nombre de pas
      case 1: puis on  active ou désactive les bobines du moteur pour le faire fonctionner, ou pas. par contre  comment sont appliqués ces différents cas ?

c'est une boucle for => for (initialisation ; test ; itération) opération;

donc initialisation => "pos" vaut la valeur de "pas"
test => tant que la condition est vrai on exécute le corps de la boucle (opération)
itération => instruction exécutée à la fin de chaque boucle, avant de vérifier si on peut encore faire une boucle.
Ce qui donne pour notre cas "pos" vaut "pas" tant que que "pos" est supérieur ou égale à zéro on continue, à la fin d'un tour de boucle, on décrémente de 1 "pos"

je ne suis pas sûre de comprendre ta question, je n'ai pas regarder en profondeur, mais le principe à priori c'est qu'il n'y a qu'une seul sortie à l'état haut en même temps, donc on lit l'état de chaque sortie et construit un entier ou chaque chiffre décimal représente un état comme pour l'affichage de ret précédemment.
Et en fonction de notre état, on passe au suivant sortie 9 = 1, donc on va activé la sortie 8
Après il faut regarder plus précisément comment fonctionne un moteur pas à pas, comment activé chaque pas du moteur 4 fils

Si tu as d'autre question sur le code en lui même, n'hésite pas !

Portrait de kate77

bonjour Walter,

merci pour ce retour, je vais regarder cela demain et je vais faire des tests pour voir comment cela fonctionne avec mes autres variables (luminosité et capteur de position), et voir comment paramètrer la vitesse du moteur pas à pas qui doit je pense être indiquée.

bon week end 

Portrait de Walter

Bonjour,

pour la vitesse, ici c'est x = 1950 qui donne 1 pas toutes les 1950 secondes, plus la fréquence d'appel de Mystep si tu fractionne le déplacement en plusieurs appel, ex Mystep(64), a priori ton moteur fait 64 pas / tour ?

Pour ma pars, pour commencer j'essayerais de faire en sorte que tu puisse appeler une seule fois la fonction Mystep, lorsque la luminosité change d'état. puis dans un second temps construire la fonction qui gère l'ouverture complète de ta porte, qui remplacera l'appel unitaire de la fonction Mystep.

Bon test :) 

Portrait de brossden

Bonjour Catherine 

Je serais de retour au environ du 10 et si tu veux je te ferais un programme spécialement pour ton projet, le code que j'ai posté fait partie d'un autre projet plus complexe que j'ai simplifié. 

Si tu veux bien patienté jusque là. 

Portrait de kate77

bonjour Brossden,

c'est vraiment très aimable de ta part, je ne suis pas pressée.

pour l'instant je vais suivre le temps de chargement des batteries, j'ai reçu les diodes hier et j'ai refait tous les branchements des deux alimentations.

je vais tout de même faire des tests, j'ai pu hier refaire un doublon de toute l'installation du poulailler pour tester en étant connecter à mon ordinateur, cela va m'aider à bien comprendre le fonctionnement et Walter me donne des informations.

bien cordialement et belle journée

Portrait de kate77

bonjour,

un petit retour sur les tests. J'ai intégré le code de brossden dans celui que j'utilisais pour remplacer la bibliothèque stepper, mais bien que les contrôles de luminosité et ceux des capteurs de positions fonctionnent et déclenchent ou arrêtent le pilote moteur  (l'ULN2003), je n'arrive pas à faire tourner le moteur, il vibre (des fois) mais ne tourne pas du tout Dans le code avec stepper j'utilise : vitesse 3, nombre de pas 2048, nombre de pas en commande 2048 et -2048. avec le nouveau code je sèche complètement, de plus l'uln2003 reste allumé sur 1 ou 2 des pôles moteur, ce qui montre que la consommation ne s'arrête pas....

ce n'est vraiment pas mon domaine de compétence,

à voir avec Brossden à son retour.

Bonne journée à tous

Portrait de brossden

Kate77, si j'ai bien compris tu veux que suivant la luminosité extérieure, tu commandes un moteur pas à pas dans un sens ou dans l'autre !

Si la luminosité est forte un photo résistance détecte cette luminosité ce qui entraîne que  le moteur démarre et lorsque le fin de course est activé par la position haute de la porte le moteur s'arrête et n'est plus alimenté pour réduire la consommation.

A la tombé de la nuit la même photo résistance détecte le manque de luminosité ce qui entraîne que le moteur démarre dans le sens inverse et le fin de course bas stoppe le moteur une fois la porte refermée dans les mêmes conditions que précédemment .

Est ce bien ton problème ?

Portrait de kate77

bonjour Brossden,

oui il s'agit bien de cela, le code que j'utilise (celui d'étibou) prend le niveau de luminosité à travers une photo resistance, et si sa moyenne atteint les niveaux indiqués dans le code par exemple si luminosité >= x et si capteur haut non actif alors le moteur se déclenche pour ouvrir la porte et s'arrête lorsque le capteur de position haut est actif et inversement pour fermer la porte si luminosité <= à x. Une moyenne est utilisée pour éviter une ouverture ou fermeture intempestive (phare d'une voiture, orage...).

tu peux trouver le code dans la doc 4

Catherine

Portrait de brossden

Chose promise ...  poulailler1.rar

Le programme ci dessous a été testé sur un Arduino UNO et parfaitement fonctionnel sauf si je n'ai pas testé toutes les possibilités !

//Programme Poulailler par Brossden
boolean Jour = false; // En période de jour passe à true
boolean Nuit = false ; // En période de Nuit passe à true
int LuminJour = 600; // Valeur analogique pour une luminosité de Jour
int LuminNuit = 200;// Valeur analogique pour une luminosité de Nuit
int Luminosite = A0; // Port de Lecture luminosité
int ValeurLumin; // Valeur de la Luminosité
int Temporisation; // Etat de la Temporisation pour éviter les battement (phare voiture par exemple)
int DureeMini = 15; // Durée en seconde de la Temporisation
double Delais = 1350;//1350; // Délais entre deux pas moteur la vitesse est au détriment du couple moteur
int Pas; // Numéro du pas moteur
int FinCourseBas  = 11; // Port fin de course bas
int FinCourseHaut = 12; // Port fin de course haut
int IN1 = 2;
int IN2 = 3;
int IN3 = 4;
int IN4 = 5;
String Action; // Peut prendre les valeurs "Fermeture","Fermee" "Ouverture", "Ouverte"
double Time; // Tempo de sécurité voir plus bas
void setup() {
  Serial.begin(230400);
  pinMode(FinCourseBas, INPUT_PULLUP); // Fin de course entre GND et ce port
  pinMode(FinCourseHaut, INPUT_PULLUP); // Fin de course entre GND et ce port
  for (int port = IN1; port < IN4 + 1; port++) { // déclaration des ports des entrées IN1 à IN4
    pinMode(port, OUTPUT);
    digitalWrite(port, 0);
  }
}

void loop() {
  delay(1000);
  Affichage(); // affichage dur le console série
  ValeurLumin = analogRead(Luminosite);
  Temporisation = 0;

  while (ValeurLumin > LuminJour && Jour == false) {
    Temporisation ++;
    Affichage();

    if (Temporisation >= DureeMini) { // Dans ce cas c'est certainement le "Jour"
      Jour = true;
      Nuit = false;
      OuvrePorte(); // Commande d'Ouverture de la porte
    }
    delay(1000); // Délais entre deux lectures
    ValeurLumin = analogRead(Luminosite);
  }
  Temporisation = 0;
  while (ValeurLumin < LuminNuit && Nuit == false) {
    Temporisation ++;
    Affichage();
    if (Temporisation >= DureeMini) {// Dans ce cas c'est certainement la "Nuit"
      Jour = false;
      Nuit = true;
      FermePorte();// Commande de Fermeture de la porte
    }
    delay(1000);
    ValeurLumin = analogRead(Luminosite);
  }
}
void OuvrePorte() {
  if (Action != "Ouverture") {
    Action = "Ouverture";
    Temporisation = 0 ;
    Serial.println(Action);
    Time = millis() + 60000;// 60000 est ici le temps maxi pour que la porte soit ouverte (sécurité à régler en millisecondes)
    while (millis() < Time) {
      Marche('O'); //Marche moteur sens ouverture
      if (digitalRead(FinCourseHaut) == 0) {
        Time = millis();
      }
      for (int port = IN1; port < IN4+1; port++)// Consommation Nulle du moteur
        digitalWrite(port, 0);
      Action = "Ouverte";
    }
  }
}
void FermePorte() {
  if (Action != "Fermeture") {
    Action = "Fermeture";
    Time = millis();
    Temporisation = 0 ;
    Serial.println(Action);
    Time = millis() + 60000;// 60000 est ici le temps maxi pour que la porte soit fermée (sécurité à régler en millisecondes)
    while (millis() < Time) {
      Marche('F'); //Marche moteur sens fermeture
      if (digitalRead(FinCourseBas) == 0) {
        Time = millis();
      }
      for (int port = IN1; port < IN4+1; port++)// Consommation Nulle du moteur
        digitalWrite(port, 0);
      Action = "Fermée";
    }
  }
}

void Affichage() {
  Serial.print("Jour/Nuit :");
  if (Jour == true)
    Serial.println("Jour");
  else if (Nuit == true)
    Serial.println("Nuit");
  else
    Serial.println("inconnu");

  Serial.print("Porte : ");
  Serial.println(Action);
  Serial.print("Temporisation = ");
  Serial.print(Temporisation);
  Serial.println(" secondes");
  Serial.print("Luminosité = ");
  Serial.println(ValeurLumin);
  Serial.println(" ");
}
void Marche(int Sens) {
  if (Sens == 'O') Pas++;
  else  Pas--;
  if (Pas <= 0) Pas = 8;
  if (Pas == 9) Pas = 1;
  Serial.println(Pas);
  switch (Pas) {

    case 1:
      digitalWrite(IN1, 1); digitalWrite(IN2, 0);digitalWrite(IN3, 0); digitalWrite(IN4, 0);
      break;
    case 2:
      digitalWrite(IN1, 1); digitalWrite(IN2, 1);digitalWrite(IN3, 0); digitalWrite(IN4, 0);
      break;
    case 3:
      digitalWrite(IN1, 0); digitalWrite(IN2, 1);digitalWrite(IN3, 0); digitalWrite(IN4, 0);
      break;
    case 4:
      digitalWrite(IN1, 0); digitalWrite(IN2, 1);digitalWrite(IN3, 1); digitalWrite(IN4, 0);
      break;
    case 5:
      digitalWrite(IN1, 0); digitalWrite(IN2, 0);digitalWrite(IN3, 1); digitalWrite(IN4, 0);
      break;
    case 6:
      digitalWrite(IN1, 0); digitalWrite(IN2, 0);digitalWrite(IN3, 1); digitalWrite(IN4, 1);
      break;
    case 7:
      digitalWrite(IN1, 0); digitalWrite(IN2, 0);digitalWrite(IN3, 0); digitalWrite(IN4, 1);
      break;
    case 8:
      digitalWrite(IN1, 1); digitalWrite(IN2, 0);digitalWrite(IN3, 0); digitalWrite(IN4, 1);

      break;
  }
 delayMicroseconds(Delais);
 
}

Si tu trouves un mauvais fonctionnement essaye de le décrire du mieux possible pour que je puisse le reproduire chez moi !

Bonne journée à tous

Portrait de brossden

Kate J'ai modifié le programme pour qu'il fonctionne avec les numéros de ports que tu utilises. Fais un copier coller pour récupérer le programme !

Je viens de rajouter le fichier .rar modifié

Portrait de kate77

bonjour,

le code est maintenant tout simplement parfait. Je remercie Brossden pour sa créativité et son aide. 

très belle journée à tous

et un grand remerciement des poules !!!

Portrait de brossden

Bonjour Kate77 (Catherine)

Je suis heureux que tu aies obtenu ce que tu voulais, mais je reste persuadé que la solution moto-réducteur simple serait la meilleure solution pour ton projet dans le style de celui-ci  ce dernier piloté par une platine à deux relais de dans le style de celle-ci .

Couple beaucoup plus important donc moins de temps de fonctionnement et certainement moins de consommation électrique. Attention choisir un modèle irréversible pour que le poids de la porte ne fasse pas tourner le moteur lorsqu'il n'est plus alimenté !!! Attention encore Reversible en Anglais n'a pas tout à fait la même signification !!!! (mais fonctionne dans les deux sens )

Bonne journées à tous

Portrait de kate77

Hello brossden, 

je pense que tu as raison, ce moteur pas à pas me semble "léger", il fonctionne, lentement, en tests, donc en situation, je ne sais pas du tout (je pensais l'installer ce week end).

au tout début de mon projet j'avais vu un tuto du même type avec un moteur d'essuie glace piloté par un pont en H. J'ai déjà un module L298 qui permet de piloter un moteur bipolaire, pour les branchements, pas de pb je vais ressortir mes notes. Mais, ici tu te donnes du travail, cela oblige à revoir le code puisse que l'on passe de 4 fils à 2 (non ?).

Mais avec cela le projet sera plus pérenne c'est certain.

Bon, j'avais de toute façon une commande à passer sur ce site, je vais y rajouter ce moteur !

merci pour ces conseils

A très plus

Portrait de brossden

je n'ai pas bien compris, tu veux que je modifie le programme pour l'adapter à un moto réducteur à courant continu avec deux relais ? 

Portrait de kate77

bonjour,

non, je vais essayer de le faire cela me fera un bon exercice, par contre je te contacterai si j'ai des questions, si tu es d'accord.

J'ai commandé le moteur j'espère le recevoir fin de semaine prochaine.

bon week end

Portrait de brossden

Pas de soucis Kate77 je suis à ton service !

Portrait de kate77

bonjour Brossden,

je viens d'essayer d'adapter ton code (moteur pas à pas) vers moteur cc, surtout pour voir si j'avais bien compris tout le mécanisme !

mais ce n'est pas forcément correct, alors je demande, une fois de plus, ton aide sur le sujet.

Voici ce que j'ai fait, peux tu voir si cela peut fonctionner ainsi ?, je ferai mes tests lorsque je recevrai le moteur, mais si tu pouvais me dire s'il n'y a pas trop d'incohérences et me dire sinon où je dois intervenir pour corriger. (j'essaye de progresser...)

Merci d'avance pour ton aide.

//Programme Poulailler par Brossden
boolean Jour = false; // En période de jour passe à true
boolean Nuit = false ; // En période de Nuit passe à true
int LuminJour = 600; // Valeur analogique pour une luminosité de Jour
int LuminNuit = 185;// Valeur analogique pour une luminosité de Nuit
int Luminosite = A0; // Port de Lecture luminosité
int ValeurLumin; // Valeur de la Luminosité
int Temporisation; // Etat de la Temporisation pour éviter les battement (phare voiture par exemple)
int DureeMini = 20; // Durée en seconde de la Temporisation
int Vitesse = 127;// 0 = 0% 127 = 50% 255 = 100%
int Vitessestop = 0;//arrêt vitesse
int FinCourseBas  = 11; // Port fin de course bas
int FinCourseHaut = 12; // Port fin de course haut
int IN1 = 2;// port 1 moteur A
int IN2 = 3;// Port 2 moteur A
int Enable = 5; //enable PWM
String Action; // Peut prendre les valeurs "Fermeture","Fermee" "Ouverture", "Ouverte"
double Time; // Tempo de sécurité voir plus bas

void setup() {
  Serial.begin(230400);
  pinMode(FinCourseBas, INPUT_PULLUP); // Fin de course entre GND et ce port
  pinMode(FinCourseHaut, INPUT_PULLUP); // Fin de course entre GND et ce port
  for (int port = IN1; port = IN2) { // déclaration des ports des entrées IN1 à IN2
    pinMode(port, OUTPUT);
    pinMode(Enable, OUTPUT);
    digitalWrite(port, 0);
    
  }
}

void loop() {
  delay(1000);
  Affichage(); // affichage dur le console série
  ValeurLumin = analogRead(Luminosite);
  Temporisation = 0;

  while (ValeurLumin > LuminJour && Jour == false) {
    Temporisation ++;
    Affichage();

    if (Temporisation >= DureeMini) { // Dans ce cas c'est certainement le "Jour"
      Jour = true;
      Nuit = false;
      OuvrePorte(); // Commande d'Ouverture de la porte
    }
    delay(1000); // Délais entre deux lectures
    ValeurLumin = analogRead(Luminosite);
  }
  Temporisation = 0;
  while (ValeurLumin < LuminNuit && Nuit == false) {
    Temporisation ++;
    Affichage();
    if (Temporisation >= DureeMini) {// Dans ce cas c'est certainement la "Nuit"
      Jour = false;
      Nuit = true;
      FermePorte();// Commande de Fermeture de la porte
    }
    delay(1000);
    ValeurLumin = analogRead(Luminosite);
  }
}
void OuvrePorte() {
  if (Action != "Ouverture") {
    Action = "Ouverture";
    Temporisation = 0 ;
    Serial.println(Action);
    Time = millis() + 6000;// 6000 est ici le temps maxi pour que la porte soit ouverte (sécurité à régler en millisecondes)
    while (millis() < Time) {
      Marche('O'); //Marche moteur sens ouverture
      if (digitalRead(FinCourseHaut) == 0) {
        Time = millis();
      }
      for (int port = IN1; port = IN2;)// Consommation Nulle du moteur
        digitalWrite(port, 0);
        digitalWrite(Enable, Vitessestop);
      Action = "Ouverte";
    }
  }
}
void FermePorte() {
  if (Action != "Fermeture") {
    Action = "Fermeture";
    Time = millis();
    Temporisation = 0 ;
    Serial.println(Action);
    Time = millis() + 6000;// 6000 est ici le temps maxi pour que la porte soit fermée (sécurité à régler en millisecondes)
    while (millis() < Time) {
      Marche('F'); //Marche moteur sens fermeture
      if (digitalRead(FinCourseBas) == 0) {
        Time = millis();
      }
      for (int port = IN1; port = IN2;)// Consommation Nulle du moteur
        digitalWrite(port, 0);
        digitalWrite(Enable, Vitessestop);
      Action = "Fermée";
    }
  }
}

void Affichage() {
  Serial.print("Jour/Nuit :");
  if (Jour == true)
    Serial.println("Jour");
  else if (Nuit == true)
    Serial.println("Nuit");
  else
    Serial.println("inconnu");

  Serial.print("Porte : ");
  Serial.println(Action);
  Serial.print("Temporisation = ");
  Serial.print(Temporisation);
  Serial.println(" secondes");
  Serial.print("Luminosité = ");
  Serial.println(ValeurLumin);
  Serial.println(" ");
}
void Marche(int Sens){
  if (Sens == 'O'){
    digitalWrite(IN1, 0);
    digitalWrite(IN2, 1);
    analogWrite (Enable,Vitesse);
    Serial.print("+");
} else(Sens == 'F'){  
    digitalWrite(IN1, 1);
    digitalWrite(IN2, 0);
    analogWrite (Enable,Vitesse);
    Serial.print("-");
}
{
delayMicroseconds(3000);
}
}

Portrait de brossden

Catherine !!

Pourquoi faire simple quand on peut faire compliqué lol !!!

Je te fais un bout de code demain promis !

Portrait de kate77

Hé, stop, c'est le week end, donc repos avec ce temps estival. le code peut bien attendre !

et, promis j'abandonne le code... mais bon j'essaye de comprendre.

bon week end

Portrait de brossden

Pourquoi abandonner le code ?

Il faut persévérer, c'est à la portée de tous ! M^me une femme MDR !

Jusqu'au void Loop') tu peux garder mais après dans chaque fonction,tu colles un relais ou l'autre suivant jour ou nuit et tu l'arrêtes par le fin de course qui lui correspond. Ce n'est pas compliqué ! Mais il y a une façon de câbller les deux relais et le moteur pou inverser le sens de marche, ce n'est pas très compliqué mais il faut réfléchir un peu !!

Je suis à le retraire donc tout les jours sont samedi pour moi ! lol lr Dimanche pouahh on ne peut pas faire grand chose !

Mais surtout ne te vexe pas si je te taquine un peu !

Tu es dans la région parisienne ? Mariée ? un métier ? des enfants ?

Bonne journée

Portrait de kate77

ok, ok, même une femme en faisant plusieurs choses à la fois !

pas de pb pour la plaisanterie, je ne me prends pas au sérieux même si je fais les choses sérieusement. 

je suis, presque à la retraite mais ne travaille plus, deux grands enfants et grand mère, un chat, un chien, un coq, trois poules, des poissons... c'est la liste de Prévert. région parisienne (est), pas mariée ce qui me permet de gérer mon temps presque à ma guise.

mais ce dimanche tu peux regarder la finale ! ou pas. alors, bon code ou bon foot.

je ne vais pas abandonner pour le code, mais je trouve que ma logique n'est effectivement pas simple, il faut que je me remette en cause, c'est très bien. je me suis inspirée de codes (internet) qui fonctionnent avec le pilote L298N que je vais utiliser avec le moteur.

et toi, d'autres occupations que le code ?

A plus et bonne fin de journée

Portrait de brossden
Si au bout de quelques secondes les deux relais collent en même temps (Leds allumées) supprimer tous le "!" devant "LOW" et devant "HIGH" car certaine cartes relais fonctionnent à l'inverse !!!

//Programme Poulailler par Brossden Moteur CC
// Déclaration Variables*

boolean Jour = false; // En période de jour passe à true
boolean Nuit = false ; // En période de Nuit passe à true
int LuminJour = 600; // Valeur analogique pour une luminosité de Jour
int LuminNuit = 200; // Valeur analogique pour une luminosité de Nuit
int Luminosite = A0; // Port de Lecture luminosité
int ValeurLumin; // Valeur de la Luminosité
int Temporisation; // Etat de la Temporisation pour éviter les battement (phare voiture par exemple)
int DureeMini = 15; // Durée en seconde de la Temporisation
int FinCourseBas  = 11; // Port fin de course bas
int FinCourseHaut = 12; // Port fin de course haut
int RelFerm = 2; //Relais fermeture Porte
int RelOuvr = 3; //Relais ouverture Porte
String Action; // Peut prendre les valeurs "Fermeture","Fermee" "Ouverture", "Ouverte"
unsigned long Time; // Tempo de sécurité voir plus bas

void setup() {
  Serial.begin(230400);
  pinMode(FinCourseBas, INPUT_PULLUP); // Fin de course entre GND et ce port
  pinMode(FinCourseHaut, INPUT_PULLUP); // Fin de course entre GND et ce port
  pinMode(RelFerm, OUTPUT);
  pinMode(RelOuvr, OUTPUT);
  digitalWrite(RelFerm, !LOW);
  digitalWrite(RelOuvr, !LOW);
} // Fin Setup

void loop() {
  delay(1000);
  Affichage(); // affichage dur le console série
  ValeurLumin = analogRead(Luminosite);
  Temporisation = 0;

  while (ValeurLumin > LuminJour && Jour == false) {
    Temporisation ++;
    Affichage();

    if (Temporisation >= DureeMini) { // Dans ce cas c'est certainement le "Jour"
      Jour = true;
      Nuit = false;
      OuvrePorte(); // Commande d'Ouverture de la porte
    } //Fin if (Temporisation >= DureeMini)
    delay(1000); // Délais entre deux lectures
    ValeurLumin = analogRead(Luminosite);
  } // Fin while (ValeurLumin > LuminJour && Jour == false)
  Temporisation = 0;
  while (ValeurLumin < LuminNuit && Nuit == false) {
    Temporisation ++;
    Affichage();
    if (Temporisation >= DureeMini) {// Dans ce cas c'est certainement la "Nuit"
      Jour = false;
      Nuit = true;
      FermePorte();// Commande de Fermeture de la porte
    } // Fin if (Temporisation >= DureeMini)
    delay(1000);
    ValeurLumin = analogRead(Luminosite);
  } // Fin while (ValeurLumin < LuminNuit && Nuit == false)
} // Fin loop

void OuvrePorte() {
  if (Action != "Ouverture") {
    Action = "Ouverture";
    Serial.println(Action);
    Temporisation = 0 ;
    Time = millis() + 6000;// 6000 est ici le temps maxi pour que la porte soit ouverte (sécurité à régler en millisecondes)
    digitalWrite(RelOuvr, !HIGH);
    digitalWrite(RelFerm, !LOW);
    while (millis() < Time) {
      Serial.print("Reste : ");
      Serial.print((Time - millis()) / 1000);
      Serial.println(" Secondes");
      //Marche moteur sens ouverture
      if (digitalRead(FinCourseHaut) == 0) {
        Time = millis();
        Action = "Ouverte";
      } // Fin if (digitalRead(FinCourseHaut) == 0)
    } //Fin while (millis() < Time) "Ouverture"
    digitalWrite(RelOuvr, !LOW);// Arrtêt Ouverture
    Action = "Ouverte";
  } // Fin if (Action != "Ouverture")
} // Fin OuvrePorte()
void FermePorte() {
  if (Action != "Fermeture") {
    Action = "Fermeture";
    Serial.println(Action);
    Temporisation = 0 ;
    Time = millis() + 6000;// 6000 est ici le temps maxi pour que la porte soit fermée (sécurité à régler en millisecondes)
    digitalWrite(RelOuvr, !LOW);
    digitalWrite(RelFerm, !HIGH);
    while (millis() < Time) {
      Serial.print("Reste : ");
      Serial.print((Time - millis()) / 1000);
      Serial.println(" Secondes");
      //Marche moteur sens fermeture
      if (digitalRead(FinCourseBas) == 0) {
        Time = millis();
        Action = "Fermée";
      } //Fin while (millis() < Time) "Fermeture"
    } // Fin while (millis() < Time)
    digitalWrite(RelFerm, !LOW);// Arrtêt Fermeture
    Action = "Fermée";
  } // Fin if (Action != "Fermeture")
} //Fin Fermeture

void Affichage() {
  Serial.print("Jour/Nuit :");
  if (Jour == true)
    Serial.println("Jour"); // pas d'accolade si une seul ligne après If
  else if (Nuit == true)
    Serial.println("Nuit");
  else
    Serial.println("inconnu");
  Serial.print("Porte : ");
  Serial.println(Action);
  Serial.print("Temporisation = ");
  Serial.print(Temporisation);
  Serial.println(" secondes");
  Serial.print("Luminosité = ");
  Serial.println(ValeurLumin);
  Serial.println(" ");
} //Fin Affichage

Et le Câblage du moteur

cablage.jpg

Tu peux remarquer qu'au repos les deux entrées du moteur sont reliées à la Masse donc pas de rotation. Si un des relais colle une des polarités  du moteur passe au positif donc marche moteur.

Si les deux relais venaient à coller (Bug ou autre) les deux entrées du moteur seraient reliées au même potentiel positif donc pas de court-circuit ni de marche moteur !

Bonne journée !

Au fait on n'entends plus parler de Cedric29 ?? serait il devenu moins STUPIDE ? Ou peut être s'en est rendu compte et n'ose plus paraître !!!!

Portrait de wiiilllll

Bonjour Kate77,

Je découvre votre discussion et votre tutoriel qui est super. J'ai exactement le même besoin, à savoir : la gestion autonome par panneau solaire de l'ouverture/fermeture d'une trappe. J'ai commencé mon projet et il s'avère que ça n'est pas aussi simple que je le pensais avant de débuter. 

Avez-vous un retour sur votre montage ? Tout fonctionne bien (rechargement batterie, puissance moteur) ? Avez-vous une version à jour de votre tutoriel avec la liste des composants nécessaires ? (j'ai commencé avec un moteur pas à pas 5V fourni par un kit arduino avec Uln2003 mais j'imagine qu'il ne sera pas assez puissant).

En tous cas, c'est déjà une bonne base de travail pour moi et bravo pour votre réalisation !! et à Brossden pour son aide !

Wil

Portrait de kate77

Bonsoir Wil,

je n'ai pas encore reçu toutes les pièces (voir recommandations de Brossden ( dans le style de celui-ci  ce dernier piloté par une platine à deux relais de dans le style de celle-ci .). moteur ok, il fonctionne vraiment bien mieux que celui que j'avais, mais je n'ai pas encore reçu le module de relais. Dès que je le reçois je vais faire les tests du programme, puis de l'alimentation que j'avais également revu (voir également conseils de Brossden ci-dessus). J'ai bien l'intention ensuite de mettre le tuto à jour, pour la liste des composants tu peux déjà l'utiliser, en faisant les modifications pour le câblage des panneaux solaires qu est bien plus simple que celui que j'avais fait, et remplacer le moteur bipolaire et son pilote par le moteur et le module relai indiqués ci dessus. Tout fonctionne en 12v.

A bientôt

Portrait de wiiilllll

Bonjour,

merci pour ces infos, je vais regarder tout ça,

A bientôt,

Wil

Pages