13 juin

Stereogram

Une autre forme de stéganographie, avez vous l’œil pour décrypter cette photo?  ;-)






06 juin

Poul-o-matique

Pour les besoins d'un ami, j'ai démarré un projet d'ouverture automatique de poulailler. Cette porte doit s'ouvrir au levé du soleil et se fermer au couché. Ce seuil devra être programmable grâce à un bouton qui permettra de relever la valeur reçu d'un capteur photosensible. La porte s'ouvrira en mode "pont levis". Autre contrainte : pas de source électrique donc doit fonctionner sue batterie avec recharge solaire. 2 capteurs (simple interrupteurs) permettront de valider l'ouverture et la fermeture de la porte (je préférè utiliser des capteurs que des timers de durée de déroulage ou enroulage du fil dans la poulie relié à la porte). Le processus d'ouverture ou fermeture devra se déclencher après 2 relevés de "déclenchement" (pour éviter par exemple de fermer la porte suite à une pénombre provoquée par un simple passage nuageux). Ci dessous le schéma électronique réalisé sur Proteus.

BH et BB sont les capteurs (interrupteurs) de fin de course de la porte. 


J'ai modélisé et imprimé en 3D résine un support pour pouvoir fixer ces interrupteurs.

 

 B1 est un bouton poussoir qui permet d’exécuter un relever de luminosité.


Le moteur (simple moteur de poupée "coupleu" (je sais pas si ce mot existe 😅)) est pilotée par un L293D (puce contenant un pont de diode et permet de gérer simplement le sens de rotation du moteur). Le capteur de luminosité est une résistance photosensible dont la valeur varie en fonction de l'intensité lumineuse. Et évidement le tout piloté par un Arduino (nano car tout doit tenir dans une simple boite).

Ci dessous le circuit imprimé, conçut sur Kicad et imprimé chez JLPCB (2 layers)

  

 

L'alimentation est pilotée par un régulateur (car le courant fourni par le panneau solaire n'est pas régulier), il occupe également la fonction de gestionnaire de charge batterie. Ce module sort une tension de 3,8v, il faut donc un booster pour fournir du 5v.

 

 Ci dessous le code injecté dans l'Arduino:

// Poulomatique

// Mr Robot le 30/04/2019

 

// declaration PIN capteur de lumiere LDR

int LDR1 = 0;

 

// declaration des variables

int ValLDR1 = 0; //variable pour stocker la mesure du capteur de lumière (ombre = resistance haute / lumiere = resistance basse)

int ValLDR1Moins5 = 0; //variable pour stocker la mesure du capteur de lumière -5 minutes

int SeuilN = 200; //seuil de déclenchement ouverture ou fermeture de porte

char EtatPorte = 'F'; //variable contenant l'état de la porte (ouverte ou fermée)

boolean AppuiB1 = false; //etat du bouton B1 (releve luminosite)

unsigned long DepartTimer; //variable de timing entre 2 releves

unsigned long DepartTimerPorte; //variable de durée max de déroulement ou enroulement de la porte (sécurité au cas où...)

boolean FinDeCourse = false; //variable de fin de course ouverture ou fermeture porte

 

// declaration des PIN pour le moteur

#define Moteur 5

#define DirEnr 6

#define DirDer 7

 

void setup () {

 

  // ouverture du port serie pour capturer des infos

  Serial.begin(9600);

  // configuration des mode des PIN moteur

  pinMode(Moteur, OUTPUT);

  pinMode(DirEnr, OUTPUT);

  pinMode(DirDer, OUTPUT);

 

/* Bouton 1 = releve de la luminosité

   parametrage du mode de declenchement (changement d etat du pin 2)

   RISING = detection d un etat bas a l etat haut

   premier parametre a 0 signifie port 2 donc bouton B1 */

   attachInterrupt(0, AppuiBouton1, RISING);

 

/* Capteurs = arrêt embobinage ou débobinnage pouli

   parametrage du mode de declenchement (changement d etat du pin 3)

   RISING = detection d un etat bas a l etat haut

   premier parametre a 1 signifie port 3 donc bouton Capteurs */

   attachInterrupt(1, Capteurs, RISING);

 

}

 

void AppuiBouton1() {

//mesure luminosite

  AppuiB1 = true;

}

 

void Capteurs() {

//reception d'un signal d'un des capteurs de porte

  FinDeCourse = true;

  Serial.println("Fin de course reçu");

  Serial.println(FinDeCourse);

}

 

 

void Debobinage() {

  DepartTimerPorte = millis();

    digitalWrite(DirEnr, LOW);

  digitalWrite(DirDer, HIGH);

  digitalWrite(Moteur, HIGH);

  delay(1000);

  FinDeCourse = false; //initialisation de la variable FinDeCourse à cause de la tension de rebond qui se produit quasi à chaque relachement du commutateur

 while (FinDeCourse == false) {

  if (millis() - DepartTimerPorte >= 15000) { //7000 à passer à 20 000

    FinDeCourse = true; //fin de course lié au timerporte dépassé, surement un probleme

  }

 }

  digitalWrite(Moteur, LOW);

  Serial.println("Appuie capteurs detecte ou delais de securite depasse");

  Serial.println("Porte ouverte");

  EtatPorte = 'O';

  FinDeCourse = false;

}

 

void Embobinage() {

  DepartTimerPorte = millis();

  digitalWrite(DirEnr, HIGH);

  digitalWrite(DirDer, LOW);

  digitalWrite(Moteur, HIGH);

  delay(1000);

    FinDeCourse = false; //initialisation de la variable FinDeCourse à cause de la tension de rebond qui se produit quasi à chaque relachement du commutateur

 while (FinDeCourse == false) {

   if (millis() - DepartTimerPorte >= 15000) { //7000 à passer à 20 000

    FinDeCourse = true; //fin de course lié au timerporte dépassé, surement un probleme

   }

 }

  digitalWrite(Moteur, LOW);

  Serial.println("Appuie capteurs detecte ou delais de securite depasse");

  Serial.println("Porte fermee");

  EtatPorte = 'F';

  FinDeCourse = false;

}

 

void loop() {

 

  ValLDR1Moins5 = ValLDR1;

  ValLDR1 = analogRead(LDR1);

 

  Serial.print("Releve     = "); Serial.println(ValLDR1);

  Serial.print("Releve - 5 = "); Serial.println(ValLDR1Moins5);

  Serial.print("Seuil declenchement = "); Serial.println(SeuilN);

 

 //Soleil bas = resistance haute = port ardunio (ValLDR1) bas

    if (ValLDR1 < SeuilN && ValLDR1Moins5 < SeuilN && EtatPorte == 'O') {

      Serial.println("Embobinage");

      Embobinage();

    }

 

 //Soleil haut = resistance basse = port ardunio (ValLDR1) haut

    if (ValLDR1 > SeuilN && ValLDR1Moins5 > SeuilN && EtatPorte == 'F') {

      Serial.println("Debobinage");

      Debobinage();

    }

 

  DepartTimer = millis();

  while ((millis() - DepartTimer) <= 3000) { //delais a passer à 300 000 = 5 min

    if (AppuiB1 == true) {

      SeuilN = analogRead(LDR1);

    Serial.print("Enregistrement nouveau seuil : ");Serial.println(SeuilN);

      AppuiB1 = false;

    }

  }

}

La maquette une fois assemblée ressemble à ça:


Ce projet n'a jamais été mis en place pour une raison simple : la poule peut décider de faire de faire un sit-in sur la porte, le moteur n'est pas assez puissant pour la soulever. J'aurais du plutôt partir sur une porte au format "guillotine". Malgré tout ce fut un projet intéressant de par la réflexion et les interrogations qu'il a suscité.