WC Project

Après un moment d’abscence je reviens avec un nouveau projet!
Quelle est l’idée générale? Et bien il m’est venu à l’esprit qu’en soirée, le seul moment où l’on peut être tranquille, c’est aux toilettes. J’ai donc imaginé un sorte de boîte de nuit qui se déclencherait dès que quelqu’un essaierai d’y aller (c’est à dire musique + néons + strobo)… (Quelle idée!). En fait l’application n’est pas des plus intéressantes, mais c’est plutôt la façon de faire qui l’est. De plus, ça peut être marrant une fois finie =)

Matériel:

De quoi avons nous besoin? Et bien nous sommes dans la section raspberry pi, c’est donc un premier élément de réponse. Ensuite nous avons besoin de:
– Néon à lumière noire
– Stroboscope
– Capteur à effet hall (réglable par potentiomètre si possible)
– Carte 2 relais minimum
– Aimants à fort champ magnétique

Pour l’instant, je n’ai que le capteur à effet hall. Ce dernier est en fait une résistance sensible au champ magnétique. On pourra donc le mettre près d’une porte, ajouter des aimants “super puissance” sur le battant, et donc détecter l’état de la porte (ouverte / fermée). Il est conseillé d’en prendre un avec potentiomètre, pour régler le seuil (le capteur renvoie 0 ou 1 en fonction du seuil), c’est donc plus facile à utiliser.

Détecter l’état de la porte

porte

Voici la partie que j’ai déjà effectué. Ca attendra pour la suivante vu que je n’ai pas encore tout le matériel. Pour effectuer tout cela, je me suis aidé de deux tutos écris par idleman (que je remercie au passage pour la clarté de ses articles):

Raspberry PI ~ 13 : Détecter l’ouverture des portes et fenêtres


http://blog.idleman.fr/raspberry-pi-07-allumerteindre-une-vraie-lampe-ou-faire-de-la-domotique-pour-pas-cher/

Le branchement du capteur à effet hall:

ouverture_thumb

J’ai ensuite écrit un petit programme en C qui va gérer tout ça. Il faut savoir que le RPI ne doit pas simplement envoyer son + éclairage lorsque la porte est ouverte, mais aussi lorsque l’on est à l’intérieur de la pièce porte fermée. En gros:

0 = état d'origine (porte femée) 	
1 = porte ouverte = lancement musique (entrée)
2 = porte fermée = musiqe en cours...
3 = porte ouverte = musique (sortie)
4 = porte fermée = fin musique (plus personne -> remise à  zéro)

Le soft va créer un processus à chaque lancement du son + éclairage (processus fls). Le père enverra un SIGKILL (arrêt du processus) à son fils dès la sortie du bonhome.

Le code:

a13_algo

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
/*
Programme permettant de détecter l'ouverture d'une porte:
Tant que la personne est à l'intérieur d'une pièce, alors jouer musique + allumer éclairage
Pour compiler: g++ -o OpenSensor OpenSensor.cpp -lwiringPi
By Valou
*/

#define LIGHT_1 2;
#define LIGHT_2 7;    

using namespace std;
//Numero de pin du capteur a effet hall
int pin = 0;
int main()
{
//Si wiringPi n'est pas présente, on arrete le programme
if(wiringPiSetup() == -1)
{
	cerr << "Librairie WiringPi introuvable...nPensez à lier la librarie..." << endl;
	exit(1);
}
cout << "nn=============== WC_Project ===============nn" << endl;
//Commande à envoyer au systeme des detection d'une ouverture
string command = "mpg123 --random /home/pi/Music/*";
string stopCommand = "killall mpg123";
/* Etat de la porte:
0 = etat d'origine (porte femee)
1 = porte ouverte -> lancement musique (entree)
2 = porte fermée -> musiqe
3 = porte ouverte -> musique (sortie)
4 = porte fermée -> fin musique (plus personne -> remise à zero)
*/
int state = 0;
//Processus pour fork
pid_t idp;
//Etat du pin à t-1
int pinState = 0;
//Pin en mode lecture
pinMode(pin, INPUT);
//Calibration:
cout << "Veuillez fermer la porte pour calibrer le capteur..." << endl;
sleep(5);
cout << "Calibration effectuée!n" << endl;
//Boucle principale contenant l'action à effectuer lors d'une ouverture
//Actualisation toutes les 500 ms
while(1)
{
	//Si changement
	if(digitalRead(pin) == (1 - pinState))
	{
		pinState = digitalRead(pin);
		switch(state)
		{
			case 0:
			{
				cout << "Ouverture detectee! Lancement musique...n" << endl;
				state++;
				//Activation des luminaires
				pinMode(LIGHT_1, OUTPUT);
				pinMode(LIGHT_2, OUTPUT);
				//Création d'un fils pour lancer la musique
				if ((idp = fork()) == -1)
				{
					cerr << "Erreur lors du fork..." << endl;
					exit(2);
				}
				else if(idp == 0) // Si le fils est en run
				{
					system(command.c_str());
					exit(-1);
				}
				break;
			}
			case 1:
			{
				cout << "nFermeture détecte! Musique en cour (entree)..." << endl;
				state++;
				break;
			}
			case 2:
			{
				cout << "Ouverture porte! Musique en cours (sortie)..." << endl;
				state++;
				break;
			}
			case 3:
			{
				cout << "Fermeture porte! Fin musique (sortie définitive)..." << endl;
				state = 0;
				//Desactivation des luminaires
				pinMode(LIGHT_1, INPUT);
				pinMode(LIGHT_2, INPUT);
				system(stopCommand.c_str());
				wait(); //Dézombification du fils
				break;
			}
		}
		sleep(1);
	}
	delay(500);
}
return 0;
}

Info:
- Il vous faudra la librairie wiringPi qui sert à utiliser les ports GPIO. Pour l'installer:https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/
- Pour lire un MP3 en ligne de commande (utilisation de mpg123):
http://www.framboise314.fr/ca-va-faire-du-bruit-chez-les-framboise314-comment-configurer-le-son-sur-le-raspberry-pi/

Ajout d'un néon + strombo:

C'est ici qu'intervient la carte relais. Notre petit RPI ne peut envoyer que du 5V ou 3.3V. Pour des luminaires, ce n'est pas assez. Comment faire? Eh bien on branche d'un côté les luminaires sur le secteur, et de l'autre on les commandes avec le RPI qui agira sur la carte relais (celle-ci servant d'interrupteur). En gros: RPI (allumer lampes) --> Carte relais (Fermer le circuit 220V) --> Lampes allumées

[EDIT] Projet presque terminé! Tout fonctionne, aussi le code a été mis à jour! Cependant voici quelques commentaires:

- Je ne sais pas pourquoi, mais pour allumer un relais, je passe le pin correspondant en mode OUTPUT et en INPUT pour l'éteindre... au lieu d'écrire 1 ou 0 (que ce soit en C, python ou en bash avec gpio). Si quelqu'un peut m'expliquer le pourquoi du comment, il est le bienvenue!

- Pour une utilisation en toute sécurité, il est conseillé d'utiliser une alimentation externe pour le relais (alimenté en 5V).

Bien, il me semble avoir oublié un dernier détail: comment utiliser un relais? Eh bien voici une photo d'un des deux branchement luminaire / relais:

IMAG0153

Chaque relais correspondant à un pin du Raspberry Pi, il suffit de l'ouvrir ou de le fermer (ou plutôt de le passer en position NO / NC) en utilisant la méthode ci-dessus.

Voici une photo générale de mon montage (bien dégueu au passage):

IMAG0152

 

Il ne reste plus qu'à brancher les prises et à mettre tout ça dans un boitier correctement! Une petite vidéo de démonstration (elle aussi bien dégueue, j'en posterai une de meilleure qualité tantôt)..

Voili voilou! Hésitez pas à poser des questions si quelque chose vous échappe, ou si vous voulez de plus amples explications =)

Tagués avec :
2 commentaires sur “WC Project
  1. Coco dit :

    Ben j’ai rien compris mais ça a l.air bien …

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.