Une autre forme de stéganographie, avez vous l’œil pour décrypter cette photo? ;-)
Mr Robot
Le blog d'un noob pour les noobs_
13 juin
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é.