jeudi 9 janvier 2014

[RaspberryPI] Sécurité, un détecteur d'ouverture de porte qui alerte par email

Les sources qui m'ont permis de réaliser ce tuto :
lien1 : http://learn.adafruit.com/playing-sounds-and-using-buttons-with-raspberry-pi/overview
lien2 : http://www.cyberciti.biz/tips/linux-use-gmail-as-a-smarthost.html

Dans ce tuto, nous allons mettre en place un détecteur d'ouverture de porte qui alertera par mail à chaque ouverture de porte.

Pré-requis

1) Avoir une RaspberryPI fonctionnelle avec Raspbian Wheezy chargé sur la carte SD
2) La carte aura un accès internet configuré en Wifi ou Ethernet
3) Un accès SSH configuré

Matériel

On utilisera
- une RaspberryPI
- un dongle Wifi (ou un cable réseau si la box n'est pas loin),
- un bouton poussoir
- une résistance de 10KOhms
- des fils pour connecter le tout

Envoyer des emails depuis une RaspberryPI

Tout d'abord, il faut se créer une nouvelle adresse email qui servira à envoyer les emails. J'ai choisi d'utiliser gmail, mais vous pouvez utiliser n'importe quelle fournisseur (free, yahoo, etc...).
1) Une fois le compte créé, connectez vous sur la RaspberryPI en SSH.

On va mettre à jour le dépot avant toute chose :
sudo apt-get update

On va installer ssmtp pour envoyer des emails car c'est la solution la plus simple que j'ai trouvé...
sudo apt-get install ssmtp

Ensuite on va rentrer les paramètres du compte mail créé. Placez vous à la fin du fichier /etc/ssmtp/ssmtp.conf et ajoutez les lignes suivantes en modifiant les champs en fonction du compte créé :
AuthUser=[identifiant]@gmail.com
AuthPass=[pass]
FromLineOverride=YES
mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
On va ensuite exécuter quelques commandes pour assurer à ssmtp de prendre en charge l'envoi des mails
1) Arrêt des services sendmails
service sendmail stop
2) Créer un dossier de backup de sendmail et y placer l'ancien sendmail
mkdir /root/.backup
mv /usr/sbin/sendmail /root/.backup
3) Créer un lien de sendmail vers le dossier ssmtp 
ln -s /usr/sbin/ssmtp /usr/sbin/sendmail

Il est temps de tester, lancer la commande suivante en entrant une adresse mail à la fin
echo "test" | mail -s "test" votreAdresse@mail.com
NB : ceci enverra un mail votreAdresse@mail.com

Le bouton et la gestion de l’événement sur la RaspberryPI

On va utiliser python pour surveiller le bouton et la librairie permettant de gérer les port GPIO via python.
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio

Branchement

Pour le branchement, c'est assez simple on va procéder comme sur une carte Arduino. On va utiliser un bouton poussoir et une résistance de rappel (pour ne pas générer d'erreurs).

Brancher de cette manière (désolé pour le schéma) :
5V --- bouton --|-- résistance 10KOhms --- GND
                          |
                   GPIO17

Code 

Place au code python!
Créez un fichier raspi_button.py dans un dossier dédié de votre home :
sudo nano raspi_button.py

et insérer le code suivant (en prenant soin de modifier l'adresse mail) :
#!/usr/bin/env python

from time import sleep
import os
import RPi.GPIO as GPIO

#On initialise la pin GPIO17
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)

while True:
        #Si un événement push est relevé on rentre dans la boucle, si on veut l'inverse on remplace True par False
        if ( GPIO.input(17) == True ):
                print('open!')
                #on envoit un mail
                os.system('echo "La porte est ouverte" | mail -s "Ouverture" votreAdresse@mail.com
                #on attend 5 secondes avant de laisser le programme repartir
                sleep(5);
        sleep(0.1);

Test

Lancer le programme 
sudo python raspi-button.py

Et appuyer sur le bouton, un mail devrait arriver

Evolution

C'est un programme assez simple et qu'on peut facilement transformer. Evidemment à chaque fois qu'on appui, un mail est envoyé, il faudrait ajouter des créneaux horaires d'alerte.

mercredi 1 janvier 2014

[Arduino Leonardo] Faire bouger le pointeur de la souris à l'aide d'un joystick

On va utiliser les 2 articles précédents sur les joysticks.



Dans ce tuto, on va faire bouger la souris de l'ordinateur à l'aide du joystick. Un peu comme le NunChuk de la console Wii (Oui on pourrait utiliser directement un NunChuk mais ici on réutilise les vieux composants d'une vieille manette! UpCycling!)

Programme


int sensorPinX = A0;
int sensorValueX = 0;
int sensorPinY = A1;
int sensorValueY = 0;
int speedMax = 50;
int baseMin = 450;
int baseMax = 550;


void setup() {
  Serial.begin(9600);
  Mouse.begin();
}

void loop() {
  sensorValueX = analogRead(sensorPinX);    
  sensorValueY = analogRead(sensorPinY);    
  if(sensorValueX>baseMax || sensorValueX<baseMin){
    float posX = map(sensorValueX, 0, 1023, -speedMax, speedMax);
    Mouse.move(0, posX, 0);
  }
  if(sensorValueY>baseMax || sensorValueY<baseMin){
    float posY = map(sensorValueY, 0, 1023, -speedMax, speedMax);
    Mouse.move(posY, 0, 0);
  }
  Serial.print(sensorValueX);
  Serial.print(";");
  Serial.println(sensorValueY);
  delay(50);
}
 
On a repris le même programme que l'article précédent en ajoutant la gestion de la souris.
On ajoute dans le setup la déclaration de la gestion de souris.
Dans le loop j'ai ajouté 2 conditions car je ne voulais pas avoir un mouvement de souris continu. Je ne traite les valeurs uniquement lorsque le joystick n'est plus en position repos (comprise entre 450 et 550 mais on peut revoir ces valeurs).

Uploadez le programme sur votre carte Arduino Leonardo (ca ne marchera pas avec une carte Arduino Uno) et testez.

La vitesse se règle avec la variable speedMax.
ATTENTION à ne pas trop rapprocher les valeurs de baseMin et baseMax sinon la souris va bouger sans arrêt. Si tout devient incontrôlable vous pouvez tout arrêter le processus en appuyant sur le bouton reset de l'Arduino.

[ARDUINO] Récupérer la position du joystick

Comme on a vu dans l'article précédent, il est très facile de récupérer des pièces électroniques. Réfléchissez avant de jeter vos vieux caméscopes, imprimantes, et autres matos électroniques!

Nous avons donc récupérer ceci
Dans l'article précédent on a identifié les connections au fil :
Rouge = 5v
Noir = data
Blanc = Ground (Gnd)

On laisse tomber les fils verts pour l'instant!

On connecte les fils

On saisit notre carte, et on branche les fils rouges sur le 5v de la carte, le blanc sur le Ground.
Les 2 fils noirs restant correspondent aux données de chaque axe X et Y. On branche un fil sur Analog0 et l'autre sur Analog1.

Programme

int sensorPinX = A0;
int sensorValueX = 0;
int sensorPinY = A1;
int sensorValueY = 0;


void setup() {
  Serial.begin(9600);
}

void loop() {
  sensorValueX = analogRead(sensorPinX);    
  sensorValueY = analogRead(sensorPinY);    
  Serial.print(sensorValueX);
  Serial.print(";");
  Serial.println(sensorValueY);
  delay(100);
} 

La méthode setup, qui je rappelle est exécuté à l'initialisation de la carte, démarre le serial à 9600 bauds, ce qui va nous permettre de visualiser la position du joystick.
Dans la méthode loop, qui je rappelle s’exécute sans arrêt, on va récupérer la valeur du A0 et A1 et écrire ces valeurs dans le serial séparé par un point-virgule. Et pause 100 millisecondes avant de redémarrer.

Branchez votre carte Arduino sur le port USB et uploadez le programme sur la carte.

Résultat

Si des chiffres s'affichent, c'est bon signe!
En position repos (sans effectuer de pression sur le joystick) les chiffres devraient être d'environ 500. Environ la moitié de 1023, puisque la valeur est comprise entre 0 et 1023.

Votre imagination sera votre seule limite!

[Arduino] S'interfacer avec un joystick de manette de console de jeux

 Je vais régulièrement à la pêche aux accessoires auprès de mes amis. Ils ont tous dans leurs placards des tas d'objets électroniques qu'ils n'utilisent plus.
Un d'eux m'a ramené une manette de Playstation 2.


J'ai tout de suite pensé à l'adapter avec la librairie qui permet d'utiliser une manette PS2 sur Arduino.
http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/
Malheureusement cette manette s'est avérée non compatible.
Ni une ni deux, je la démonte!

On y trouve 2 moteurs vibrants et surtout 2 joysticks.

On va dans ce tuto s'intéresser aux joysticks.

Comment ça marche?

Un joystick est souvent composé de 2 résistances variables X et Y ainsi qu'un bouton central.
Grâce à une carte Arduino, on va pouvoir récupérer la position exact du joystick en X et en Y comme si on récupérait la valeur d'un potentiomètre.
La valeur peut varier de 0 à 1023 et par défaut le joystick est positionné au milieu des 2 axes.

Vérifier qu'il fonctionne

Pour vérifier que le joystick fonctionne, on va le tester à l'aide d'un multimètre. Cette étape va nous aider à identifier les bornes du joystick!
Dans mon cas, j'ai 8 fils sur la broche. Chaque axe comporte 3 fils (rouge, blanc et noir) et le bouton centrale comporte 2 fils (vert). Il se peut que votre joystick n'est pas de bouton central, il n'y aura pas de fils verts...

Bref adaptez!

Les fils de chaque axe X et Y doivent être regroupés. Identifier les 3 fils d'un axe. Prenons à présent le multimètre et positionnez le sur résistance ou ohms, et placez le fil rouge du multimètre sur le fil rouge de l'axe X ou Y du joystick. Ensuite placez le fil noir du multimètre sur un des 2 autres fils du même axe. Si votre bouton est en position central et que vous obtenez environ 10kohms, vous avez identifié le ground (GND) si vous avez une valeur d'environ 5kohms, vous avez identifié la sortie analogique.
Si vous êtes dans le 2ème cas, essayez de bouger le bouton tout en conservant les connexions. Vous devriez voir la valeur du multimètre varier entre 0 et 1023.
Faites de même avec l'autre axe et n'hésitez pas à faire un schéma pour ne pas oublier.

Vous êtes prêt à utiliser le Joystick avec un microcontrôleur type Arduino (cf. article suivant).