Go Down

Topic: Porte automatique pour poulailler (Read 67329 times) previous topic - next topic

etibou

Bonjour;

Je ne vois pas le soucis. Il faut décomposer les fonctions pour déterminer ce qui ne marche pas.
Le fichier ino joint teste le moteur. Rotation dans un sens puis dans l'autre.
A suivre.

kate77

bonsoir,

bon, je démonte tout, et refait les branchements en pas à pas en réalisant les tests par étapes.

Merci pour le code de test moteur.

Je vous tiens informés

à bientôt

kate77

bonjour à tous,

avancée des tests avec alimentation faite par usb arduino


tests : carte nano : ok
module uln2003 : ok
moteur ok mais très lent avec modification du code stepper de cette façon, je pense qu'il sera plus rapide sur du 12v.

#include <Stepper.h>

const int stepsPerRevolution = 64;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution,  2, 4, 3, 5);

void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(100);
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(400);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(400);
}

Je continue les tests avec l'ajout des fin de courses puis de la photoresistance.

A bientôt

etibou

Hello,

Une bonne nouvelle sauf qu'il me semble que la vitesse de rotation d'un moteur pas à pas ne dépend pas de sa tension d'alimentation si celle-ci est dans sa plage de fonctionnement sauf si l'intensité de la source de courant est trop faible..

A suivre.

thom13

Bonjour à tous,

merci pour toutes ces informations, après avoir épluché l'internet et les 6 pages de ce forum, je suis rendu avec un Arduino uno, un capteur de luminosité BH1750, un shield moteur Adafruit V2 et un moteur pas à pas Nema 17.

J'essaye de faire quelque chose de simple car je suis loin d'être un programmeur, et c'est la que je bloque, le moteur réagi très bien au capteur de luminosité pour l'ouverture et la fermeture de la porte, sauf qu'il ne s'arrête jamais de tourner...

Voici mon code:
Code: [Select]
/*
  BH1750.h pour lecture de la luminosité (modele GY-30)
  Adafruit MotorShield V2 pour la gestion du moteur Stepper Nema17
  Sur Arduino Uno
*/

#include <Wire.h>
#include <BH1750.h>
#include <Adafruit_MotorShield.h>

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);

// Connect a stepper motor with 200 steps per revolution (1.8 degree)
// to motor port #2 (M3 and M4)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

BH1750 lightMeter;

void setup(){

  Serial.begin(9600);

  // Initialize the I2C bus (BH1750 library doesn't do this automatically)
  Wire.begin();
  // On esp8266 you can select SCL and SDA pins using Wire.begin(D4, D3);

  lightMeter.begin(BH1750::ONE_TIME_HIGH_RES_MODE);
  //lightMeter.setMTreg(69);  // not needed, only mentioning it

  Serial.println(F("BH1750 Test begin"));

  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Stepper test!");

  AFMS.begin();  // create with the default frequency 1.6KHz
  //AFMS.begin(1000);  // OR with a different frequency, say 1KHz
 
  myMotor->setSpeed(10);  // 10 rpm   
}



void loop() {
  float lux = lightMeter.readLightLevel(true); //lecture de la luminosité
  Serial.print(F("Light: "));
  Serial.print(lux);
  Serial.println(F(" lx"));

if (lux > 10) {
   
    myMotor->step(200, FORWARD, SINGLE);
    Serial.println(F("Ouverture porte"));
}
    else if (lux < 10) {
      myMotor->step(200, BACKWARD, SINGLE);
      Serial.println(F("Fermeture porte"));
    }
}


Si une âme charitable voudrait m'indiquer ce qu'il manque dans mon code.

J'avais aussi l'idée de le mettre sur mon réseau MySensors qui fonctionne avec Domoticz, je vais me pencher la dessus, cela permettrait la gestion des heures du levé et couché du soleil a travers Domoticz. Mais bon une étape a la fois...

etibou

#80
Nov 06, 2018, 08:24 am Last Edit: Nov 06, 2018, 08:26 am by etibou
Bonjour,

Il y a un petit problème dans la logique du code car une fois que le niveau de lumière détecté et que tu as donné l'ordre de fermer ou d'ouvrir, il faut mémoriser le statut par un boolean afin qu'à la boucle suivante tu ne renvoi pas l'ordre si le seuil de lumière est toujours atteint.
Exemple

Si Lux > 10 et porteFermée alors j'ouvre et portefermée = faux.
Si Luv < 10 et non portefermée alors je ferme et portefermée = vrai.

Reste à gérer le statut initial (démarrage du programme porte ouverte ou fermée).
Généralement avec des détecteur de lumière, on détermine un seuil bas et un seuil haut afin d'éviter le phénomène de porte qui se ferme et qui s'ouvre alternativement à la bascule du seuil.

Bon courage.



nolo

Bonjour, Je cherche une personne pour me faire un petit programme ,et comme tu as proposé à certain ,je me permet de te demander se service car je galère quant ont approche les 70 ans cela peut se comprendre .

Mon projet  Une balance piloté par le fameux moto réducteur 28byj 48 est controlé par un endstop   0  _ 5 volts  .

Le fonctionnement est assez simple  un levier avec un contre poids  équilibre une balance sous une ruche qui prend du poids ou en pert .  Le moto réducteur sert à déplacer le contre poids comme ont peut le faire sur les balance manuel .

QUANT le endstop me donne une tention >à 4 volts  >5  le moteur se déplace de 10 pas en avant  (  moins ou plus à voir )
Quant le   endstop me donne une tention  de 2 à volts4 volts  le moto ne fait rien
Quant le   endstop me donne une tention < à 2 volts      le moteur se déplace de 10 pas en arriere  .

La prise de poids est trés lente  1 à 2 kg par 24 heures ,le temps de la boucle reste à déterminée ;
La mécanique fonctionne comme décrite plus haut avec le endstop .

Le nombre de pas du motoréduc   en  plus ou moins  devras etre stoké dans un compteur et multiplier par un coef quime donne le poids de la ruche .

Merci pour pour ton aide si possible  Nolo



etibou

#82
Nov 11, 2018, 07:23 am Last Edit: Nov 11, 2018, 07:24 am by etibou
Bonjour,

C'est pas très compliqué, je t'écris un petit bout code mais es-tu certain du fonctionnement du endstop car généralement les fin de course sont tout ou rien, c'est à dire 0 ou 5V.
Avec l'age, il faut prendre un peu plus de temps, je connais bien le problème même si je n'ai pas 70, je n'ai plus 20 ans..
A+

Artouste

#83
Nov 11, 2018, 12:45 pm Last Edit: Nov 11, 2018, 12:46 pm by Artouste
Bonjour, Je cherche une personne pour me faire un petit programme ,et comme tu as proposé à certain ,je me permet de te demander se service car je galère quant ont approche les 70 ans cela peut se comprendre .

Mon projet  Une balance piloté par le fameux moto réducteur 28byj 48 est controlé par un endstop   0  _ 5 volts  .

Le fonctionnement est assez simple  un levier avec un contre poids  équilibre une balance sous une ruche qui prend du poids ou en pert .  Le moto réducteur sert à déplacer le contre poids comme ont peut le faire sur les balance manuel .

QUANT le endstop me donne une tention >à 4 volts  >5  le moteur se déplace de 10 pas en avant  (  moins ou plus à voir )
Quant le   endstop me donne une tention  de 2 à volts4 volts  le moto ne fait rien
Quant le   endstop me donne une tention < à 2 volts      le moteur se déplace de 10 pas en arriere  .

La prise de poids est trés lente  1 à 2 kg par 24 heures ,le temps de la boucle reste à déterminée ;
La mécanique fonctionne comme décrite plus haut avec le endstop .

Le nombre de pas du motoréduc   en  plus ou moins  devras etre stoké dans un compteur et multiplier par un coef quime donne le poids de la ruche .

Merci pour pour ton aide si possible  Nolo



Bonjour
Pour faire de la pesée de ruche , il y a plus simple (pour peu que ta méthode soit réellement envisageable avec ce que tu à choisi , ce dont je doute fortement 8)  )
regarde déjà ce sujet pèse ruche de Lacuzon

etibou

Bonjour,

Dans le projet mentionné, ils utilisent un capteur d'une balance électronique qu'ils amplifient.
Si tu veux conserver le fonctionnement de contrepoids avec un déplacement par un moteur pas à pas, c'est possible.
Il faut 2 contacts fin de course sur le balancier, un pour le poids en diminution, un pour le poids en augmentation.
Dès que l'un des contacts est actionné, le moteur déplace le contrepoids jusqu'à ce que le contact disparaît.
Le système peut fonctionner dans un sens ou dans l'autre.(prise ou perte de poids).
Reste le pb de la précision et de la plage de mesure car cela dépendra de la valeur du contrepoids.
Une petite valeur = précision élevée mais plage de mesure réduite (dépend de la longueur de course du contrepoids).. Attention aux perturbations extérieures qui peuvent fausser la mesure.
Une valeur plus importante = précision moindre mais page de mesure plus grande et moins sensible aux
 perturbations extérieures.

Je peux t'écrire un bout de code suivant ce scénario.
Le résultat cumulé du poids sera envoyé par la ligne série.
Pour avoir le poids total de la ruche, il faudra gérer une tare.
Je t'envoi un code à tester rapidement.
Bonne soirée.
Etibou




etibou

Bonsoir,

Voici le code promis.
Du coup, il peut gérer soit des contacts fin de course soit une entrée analogique.
Il suffit de commenter ou dé-commenter les #define non utiles
Le fonctionnement avec les contacts a été testé (moteur 28BYJ6-48 5v)
Reste à tester le fonctionnement avec l'entrée analogique et bien définir le sens des corrections.
A tester..
Bon courage.
Etibou

philippe6philoux

Bonjour,
j'ai réalisé une porte poulailler à guillotine, avec 2 fin de courses haut et bas, et le moteur est une foreuse sans fils.
Au niveau mécanique ça fonctionne très bien.
Pour la programmation c'est un Arduino uno.
détection nuit/ jour par une cellule photo-résistance.
le problème est que j'ai voulus ajouter une temporisation à la fermeture (qui fonctionne bien)
mais il y a un problème à l'ouverture: on dirait que il ne tient pas compte de la temporisation.

Pour le moment j'utilise une horloge pour retarder l'ouverture....
et j'ai mis des // dans mon programme, je pense que j'ai un problème de compréhention des if et else, ou des lignes de conditions en général
Voici le progamme

Code: [Select]
const char ledbleu = 2; // variable broche 2 (vraie), Une LED bleu  pour détection crépuscule, s'il fait sombre
const char fermeture = 7;  // variable pour broche 7 (vraie), pour fermer porte
const char capteur = 0; // broche A0 sur laquelle va être connecté le pont diviseur de tension

float tension = 0;             // variable qui va enregistrer la tension lue en sortie du capteur
float seuilObscurite = 4.2;    // valeur en V, seuil qui détermine le niveau auquel l'obscurité est présente
int x=0;
void setup()
        {
           // définition des broches utilisées
           pinMode(ledbleu, OUTPUT);
           pinMode(fermeture, OUTPUT);
           digitalWrite(ledbleu, HIGH);
           digitalWrite(fermeture, HIGH);
           Serial.begin(9600); // la voie série pour monitorer
        }
void loop()
{
    // conversion de cette valeur en tension
    tension = (analogRead(capteur) * 5.0) / 1024;

    if(tension >= seuilObscurite)  //Pour FERMETURE
          {
            x=x+1;
                 if (x==1)digitalWrite(ledbleu, LOW);               // detection seuil obscurité On allume la LED bleu         
                 if (x==1)delay(240000);                              // délai pour ne fermer porte que aprés 4 minutes ( 240 000)
                 x=2;     
             digitalWrite(fermeture, LOW);                           //  On ferme la porte apres x secondes
             digitalWrite(ledbleu, HIGH);                           // On éteint la LED bleu
          }     
    if(tension < seuilObscurite)  //Pour OUVERTURE
              {
                x=3;
                //Serial.print(" x=  ");
               //if (x==3)delay(240000);//délai pour ouvrir la porte que aprés 4 minutes
                if (x==3)digitalWrite(fermeture, HIGH); // on ouvre la porte
         x=0;
     }

    // délai pour ne prendre des mesures que toutes les 60-secondes (60 000)
    delay(60000);
   
                   //Serial.print(" x=  ");
                    Serial.println(x);
}

etibou

Hello,

C'est pas mal mais il faut tenir compte de quelques règles.
Quand on mesure la tension d'une cellule photo-résistance et qu'on détermine un niveau de luminosité pour déclencher l'ouverture et la fermeture d'une porte, il est préférable d'avoir deux seuils de détection différents pour éviter que la porte fasse le yo-yo au moment du passage du seuil. Une autre possibilité est de travailler avec une valeur moyennée.
Je pense que le pb vient de la variable x. Il est préférable d'utiliser un booléen pour mémoriser l'état de la porte et engager une seule fois l'ordre d'ouverture et de fermeture.
Voici un exemple de code avec les 2 seuils de détection (valeurs arbitraire) et un booléen pour mémoriser l'état de la porte. (Attention code non testé)
Code: [Select]

const char ledbleu = 2; // variable broche 2 (vraie), Une LED bleu  pour détection crépuscule, s'il fait sombre
const char fermeture = 7;  // variable pour broche 7 (vraie), pour fermer porte
const char capteur = 0; // broche A0 sur laquelle va être connecté le pont diviseur de tension

float tension = 0;             // variable qui va enregistrer la tension lue en sortie du capteur
float seuilObscurite = 4.2;    // valeur en V, seuil qui détermine le niveau auquel l'obscurité est présente
float seuilLumonisite = 4;    // valeur en V, seuil qui détermine le niveau auquel la luminosité est présente
boolean PorteFermee = false;  // statut de la porte ou démarre toujours le programme porte ouverte
int x = 0;
void setup()
{
  // définition des broches utilisées
  pinMode(ledbleu, OUTPUT);
  pinMode(fermeture, OUTPUT);
  digitalWrite(ledbleu, HIGH);
  digitalWrite(fermeture, HIGH);
  Serial.begin(9600); // la voie série pour monitorer
}
void loop()
{
  // conversion de cette valeur en tension
  tension = (analogRead(capteur) * 5.0) / 1024;

  if ((tension >= seuilObscurite) && !PorteFermee) //Pour FERMETURE
  {

    digitalWrite(ledbleu, LOW);             // detection seuil obscurité On allume la LED bleu
    delay(240000);                            // délai pour ne fermer porte que aprés 4 minutes ( 240 000)

    digitalWrite(fermeture, LOW);                           //  On ferme la porte apres x secondes
    digitalWrite(ledbleu, HIGH);                           // On éteint la LED bleu
    PorteFermee = true;
  }

  if ((tension < seuilLumonisite) && PorteFermee) //Pour OUVERTURE
  {

    //Serial.print(" x=  ");
    delay(240000);//délai pour ouvrir la porte que aprés 4 minutes
    digitalWrite(fermeture, HIGH); // on ouvre la porte
    PorteFermee = false;
  }

  // délai pour ne prendre des mesures que toutes les 60-secondes (60 000)
  delay(60000);

  //Serial.print(" x=  ");
  Serial.println(x);
}


Bon courage..

philippe6philoux

Bonjour,
merci pour cette réponse, en effet les problèmes viennent surement de là, je vais tester et je vous tient au courant.
Bonne journée.

philippe6philoux

Voilà, j'ai testé, et tout fonctionne bien , je peux régler la temporisation, comme je le voulais, merci Etibou ton code était bon dés le départ.
Je pense que je vais essayer de mesurer aussi la tension du moteur pour mettre une sécurité supplémentaire en cas de blocage du moteur.

Go Up