tag:blogger.com,1999:blog-63155377846077454452024-03-06T00:47:03.142-08:00ElectroInfoDIYMini tutoriel Arduino, RaspberryUnknownnoreply@blogger.comBlogger17125tag:blogger.com,1999:blog-6315537784607745445.post-8746780183330709812014-01-09T06:03:00.002-08:002014-01-09T08:18:42.050-08:00[RaspberryPI] Sécurité, un détecteur d'ouverture de porte qui alerte par emailLes sources qui m'ont permis de réaliser ce tuto :<br />
lien1 : <a href="http://learn.adafruit.com/playing-sounds-and-using-buttons-with-raspberry-pi/overview">http://learn.adafruit.com/playing-sounds-and-using-buttons-with-raspberry-pi/overview</a><br />
lien2 : <a href="http://www.cyberciti.biz/tips/linux-use-gmail-as-a-smarthost.html">http://www.cyberciti.biz/tips/linux-use-gmail-as-a-smarthost.html</a><br />
<br />
Dans ce tuto, nous allons mettre en place un détecteur d'ouverture de porte qui alertera par mail à chaque ouverture de porte.<br />
<br />
<h2>
Pré-requis</h2>
1) Avoir une RaspberryPI fonctionnelle avec Raspbian Wheezy chargé sur la carte SD<br />
2) La carte aura un accès internet configuré en Wifi ou Ethernet<br />
3) Un accès SSH configuré<br />
<h2>
Matériel</h2>
On utilisera<br />
- une RaspberryPI<br />
- un dongle Wifi (ou un cable réseau si la box n'est pas loin),<br />
- un bouton poussoir<br />
- une résistance de 10KOhms<br />
- des fils pour connecter le tout<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpJUr5rXcamgC5jU2D-4qQxAPQp9liT_D-cGwBcsUYkF3AKfC8PYOQ-p8O0-wh4bNrcBxLw4p7SMLAkp60oycX0J7sK_94HCDLHYm4UYaod9B3kQ_q_C2CUMFmOPaeM-fZd2GQS-LdWNY/s1600/IMG_20140109_141531631.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpJUr5rXcamgC5jU2D-4qQxAPQp9liT_D-cGwBcsUYkF3AKfC8PYOQ-p8O0-wh4bNrcBxLw4p7SMLAkp60oycX0J7sK_94HCDLHYm4UYaod9B3kQ_q_C2CUMFmOPaeM-fZd2GQS-LdWNY/s1600/IMG_20140109_141531631.jpg" height="179" width="320" /></a></div>
<br />
<h2>
Envoyer des emails depuis une RaspberryPI</h2>
<div>
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...).</div>
<div>
1) Une fois le compte créé, connectez vous sur la RaspberryPI en SSH.</div>
<div>
<br /></div>
<div>
On va mettre à jour le dépot avant toute chose :</div>
<pre>sudo apt-get update</pre>
<div>
<br /></div>
<div>
On va installer ssmtp pour envoyer des emails car c'est la solution la plus simple que j'ai trouvé...</div>
<pre>sudo apt-get install ssmtp</pre>
<div>
<br /></div>
<div>
Ensuite on va rentrer les paramètres du compte mail créé. Placez vous à la fin du fichier <i>/etc/ssmtp/ssmtp.conf</i> et ajoutez les lignes suivantes en modifiant les champs en fonction du compte créé :</div>
<pre>AuthUser=[identifiant]@gmail.com
AuthPass=[pass]
FromLineOverride=YES
mailhub=smtp.gmail.com:587
UseSTARTTLS=YES</pre>
<div>
</div>
<div>
On va ensuite exécuter quelques commandes pour assurer à ssmtp de prendre en charge l'envoi des mails</div>
<div>
1) Arrêt des services sendmails</div>
<pre>service sendmail stop</pre>
<div>
2) Créer un dossier de backup de sendmail et y placer l'ancien sendmail</div>
<pre>mkdir /root/.backup</pre>
<pre>mv /usr/sbin/sendmail /root/.backup</pre>
<div>
3) Créer un lien de sendmail vers le dossier ssmtp </div>
<pre>ln -s /usr/sbin/ssmtp /usr/sbin/sendmail</pre>
<div>
<br /></div>
<div>
Il est temps de tester, lancer la commande suivante en entrant une adresse mail à la fin</div>
<pre>echo "test" | mail -s "test" votreAdresse@mail.com</pre>
<div>
<i>NB : ceci enverra un mail votreAdresse@mail.com</i></div>
<br />
<h2>
Le bouton et la gestion de l’événement sur la RaspberryPI</h2>
<div>
On va utiliser python pour surveiller le bouton et la librairie permettant de gérer les port GPIO via python.</div>
<pre>sudo apt-get install python-dev</pre>
<pre>sudo apt-get install python-rpi.gpio</pre>
<br />
<h3>
Branchement</h3>
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).<br />
<br />
Brancher de cette manière (désolé pour le schéma) :<br />
5V --- bouton --|-- résistance 10KOhms --- GND<br />
|<br />
GPIO17<br />
<br />
<h3>
Code </h3>
Place au code python!<br />
Créez un fichier<i> raspi_button.py</i> dans un dossier dédié de votre <i>home :</i><br />
<pre>sudo nano raspi_button.py</pre>
<br />
et insérer le code suivant (<b>en prenant soin de modifier l'adresse mail</b>) :<br />
<pre>#!/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" <i style="font-family: 'Times New Roman'; white-space: normal;"><b>votreAdresse@mail.com</b></i>
#on attend 5 secondes avant de laisser le programme repartir
sleep(5);
sleep(0.1);
</pre>
<h2>
Test</h2>
<div>
Lancer le programme </div>
<pre>sudo python raspi-button.py</pre>
<div>
<br /></div>
<div>
Et appuyer sur le bouton, un mail devrait arriver</div>
<br />
<h2>
Evolution</h2>
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.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-48829254007804165162014-01-01T15:31:00.002-08:002014-01-06T06:50:41.851-08:00[Arduino Leonardo] Faire bouger le pointeur de la souris à l'aide d'un joystickOn va utiliser les 2 articles précédents sur les joysticks.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnzowaUw4Tl6mktqWj8BAMDz_Htsiglor-6azXEkH78n_-w00XzPisOp1KtGuKhkh6w-JCpI1c2aTFl2BjPU5FTaTUComwLkoAKrmPCBO_hoM1d-avxuPF3LykvwydQfHC9krrNK8_7iM/s1600/IMG_1595.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnzowaUw4Tl6mktqWj8BAMDz_Htsiglor-6azXEkH78n_-w00XzPisOp1KtGuKhkh6w-JCpI1c2aTFl2BjPU5FTaTUComwLkoAKrmPCBO_hoM1d-avxuPF3LykvwydQfHC9krrNK8_7iM/s1600/IMG_1595.JPG" height="239" width="320" /></a></div>
<br />
<br />
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!)<br />
<br />
<h2>
Programme</h2>
<br />
<pre>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);
}</pre>
<pre> </pre>
On a repris le même programme que l'article précédent en ajoutant la gestion de la souris.<br />
On ajoute dans le setup la déclaration de la gestion de souris.<br />
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).<br />
<br />
Uploadez le programme sur votre carte <b>Arduino Leonardo</b> (ca ne marchera pas avec une carte Arduino Uno) et testez.<br />
<br />
La vitesse se règle avec la variable speedMax.<br />
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. Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-19900768611734875712014-01-01T15:11:00.002-08:002014-01-01T15:11:40.801-08:00[ARDUINO] Récupérer la position du joystickComme 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!<br />
<br />
Nous avons donc récupérer ceci<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnzowaUw4Tl6mktqWj8BAMDz_Htsiglor-6azXEkH78n_-w00XzPisOp1KtGuKhkh6w-JCpI1c2aTFl2BjPU5FTaTUComwLkoAKrmPCBO_hoM1d-avxuPF3LykvwydQfHC9krrNK8_7iM/s1600/IMG_1595.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnzowaUw4Tl6mktqWj8BAMDz_Htsiglor-6azXEkH78n_-w00XzPisOp1KtGuKhkh6w-JCpI1c2aTFl2BjPU5FTaTUComwLkoAKrmPCBO_hoM1d-avxuPF3LykvwydQfHC9krrNK8_7iM/s1600/IMG_1595.JPG" height="239" width="320" /></a></div>
Dans l'article précédent on a identifié les connections au fil :<br />
Rouge = 5v<br />
Noir = data<br />
Blanc = Ground (Gnd)<br />
<br />
On laisse tomber les fils verts pour l'instant!<br />
<br />
<h2>
On connecte les fils</h2>
On saisit notre carte, et on branche les fils rouges sur le 5v de la carte, le blanc sur le Ground.<br />
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.<br />
<br />
<h2>
Programme</h2>
<pre>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);
} </pre>
<br />
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.<br />
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.<br />
<br />
Branchez votre carte Arduino sur le port USB et uploadez le programme sur la carte.<br />
<br />
<h2>
Résultat</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8vHV5LcrxygSy0F-ILecEyzLO6ovZELMbuEmCWABGyX8bmRYpBNzohgLHqVeTOxZVtvwcM95FTgDKG9e8ws-NFyA0dlz1ZPTu8q7lmNaUEwL0PXV_FCDATZleac2FUeDV92RPEHazGzE/s1600/Screenshot+from+2014-01-02+00:05:44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8vHV5LcrxygSy0F-ILecEyzLO6ovZELMbuEmCWABGyX8bmRYpBNzohgLHqVeTOxZVtvwcM95FTgDKG9e8ws-NFyA0dlz1ZPTu8q7lmNaUEwL0PXV_FCDATZleac2FUeDV92RPEHazGzE/s1600/Screenshot+from+2014-01-02+00:05:44.png" height="190" width="320" /></a></div>
Si des chiffres s'affichent, c'est bon signe!<br />
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.<br />
<br />
Votre imagination sera votre seule limite! <br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-5652139129789977542014-01-01T14:37:00.002-08:002014-01-01T14:37:59.903-08:00[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.<br />
Un d'eux m'a ramené une manette de Playstation 2.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEo8gLQzCHZWxuJNI3ZyNqAIDSC4gEFb8FmydYipAgLAQ2k0_cioiAcGDQsqS-OEYKih7VZBO9o1b2Kd2T3ZX_-w9nTTZizIwadhkzX29PLTNdrSG63Fg4QDhiVYd6B2JC_elhHHVbTo8/s1600/IMG_1590.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEo8gLQzCHZWxuJNI3ZyNqAIDSC4gEFb8FmydYipAgLAQ2k0_cioiAcGDQsqS-OEYKih7VZBO9o1b2Kd2T3ZX_-w9nTTZizIwadhkzX29PLTNdrSG63Fg4QDhiVYd6B2JC_elhHHVbTo8/s1600/IMG_1590.JPG" height="239" width="320" /></a></div>
<br />
J'ai tout de suite pensé à l'adapter avec la librairie qui permet d'utiliser une manette PS2 sur Arduino.<br />
<a href="http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/">http://www.billporter.info/2010/06/05/playstation-2-controller-arduino-library-v1-0/</a><br />
Malheureusement cette manette s'est avérée non compatible.<br />
Ni une ni deux, je la démonte!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVPNpGoWTDW_wqmtpKlmJV7yveTyDmgSmCRdZQYBQCdLSylHi6iZJbKIf3nckuEyj4ko7O4_YqWNMejUwpxiAN0cObiIQN19Mof-6ZO48dkVYaI0SzVQKmMQn8ueC2ka1vJ2wm9ktdY0s/s1600/IMG_1591.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVPNpGoWTDW_wqmtpKlmJV7yveTyDmgSmCRdZQYBQCdLSylHi6iZJbKIf3nckuEyj4ko7O4_YqWNMejUwpxiAN0cObiIQN19Mof-6ZO48dkVYaI0SzVQKmMQn8ueC2ka1vJ2wm9ktdY0s/s1600/IMG_1591.JPG" height="320" width="239" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
On y trouve 2 moteurs vibrants et surtout 2 joysticks.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnzowaUw4Tl6mktqWj8BAMDz_Htsiglor-6azXEkH78n_-w00XzPisOp1KtGuKhkh6w-JCpI1c2aTFl2BjPU5FTaTUComwLkoAKrmPCBO_hoM1d-avxuPF3LykvwydQfHC9krrNK8_7iM/s1600/IMG_1595.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAbUIsznW-GW_s-DDTWAiYofQ2neZ1Q3wnuwRmdVRmuG40ccWcfkN-Fz8mQXIL3hDUdohPqCCK86Iy8RjCQbF5NxyJcgUQDNw8jUCrMOVRcgIMnGSJPh_jePfKVQH8Sv22uC8mbniHHME/s1600/IMG_1597.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAbUIsznW-GW_s-DDTWAiYofQ2neZ1Q3wnuwRmdVRmuG40ccWcfkN-Fz8mQXIL3hDUdohPqCCK86Iy8RjCQbF5NxyJcgUQDNw8jUCrMOVRcgIMnGSJPh_jePfKVQH8Sv22uC8mbniHHME/s1600/IMG_1597.JPG" height="239" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnzowaUw4Tl6mktqWj8BAMDz_Htsiglor-6azXEkH78n_-w00XzPisOp1KtGuKhkh6w-JCpI1c2aTFl2BjPU5FTaTUComwLkoAKrmPCBO_hoM1d-avxuPF3LykvwydQfHC9krrNK8_7iM/s1600/IMG_1595.JPG" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnzowaUw4Tl6mktqWj8BAMDz_Htsiglor-6azXEkH78n_-w00XzPisOp1KtGuKhkh6w-JCpI1c2aTFl2BjPU5FTaTUComwLkoAKrmPCBO_hoM1d-avxuPF3LykvwydQfHC9krrNK8_7iM/s1600/IMG_1595.JPG" height="239" width="320" /></a></div>
<br />
On va dans ce tuto s'intéresser aux joysticks.<br />
<br />
<h2>
Comment ça marche? </h2>
Un joystick est souvent composé de 2 résistances variables X et Y ainsi qu'un bouton central.<br />
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.<br />
La valeur peut varier de 0 à 1023 et par défaut le joystick est positionné au milieu des 2 axes.<br />
<h3>
Vérifier qu'il fonctionne</h3>
Pour vérifier que le joystick fonctionne, on va le tester à l'aide d'un multimètre. <b>Cette étape va nous aider à identifier les bornes du joystick!</b><br />
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...<br />
<br />
Bref adaptez!<br />
<br />
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.<br />
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.<br />
Faites de même avec l'autre axe et n'hésitez pas à faire un schéma pour ne pas oublier.<br />
<br />
Vous êtes prêt à utiliser le Joystick avec un microcontrôleur type Arduino (cf. article suivant).Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-29521003190059632042013-09-19T08:06:00.000-07:002013-09-19T08:07:01.089-07:00Récupérer les trames NMEA d'un GPSDans cet article, nous allons récupérer les trames NMEA d'un GPS. Par la suite nous les stockerons sur la Raspberry PI afin de les afficher par la suite sur une carte Google Maps.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq3glbulZzl5SIb5IJGzSMUpAtykILhDiTgi73CFuhwPl8a0CJh9mUu_zkPO0loxo8JqeN5AmYCqx9y91HPAhVzhzG5zeqSdjvDVA6QHWbSfK8l1CaPaONhZLbsifVErRLAGRnB2NQ8LE/s1600/20130821_apresboulot.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq3glbulZzl5SIb5IJGzSMUpAtykILhDiTgi73CFuhwPl8a0CJh9mUu_zkPO0loxo8JqeN5AmYCqx9y91HPAhVzhzG5zeqSdjvDVA6QHWbSfK8l1CaPaONhZLbsifVErRLAGRnB2NQ8LE/s1600/20130821_apresboulot.PNG" height="235" width="400" /></a></div>
<br />
<br />
Matériel utilisé :<br />
- RaspberryPI<br />
- dongle Wifi<br />
- un GPS permettant de récupérer les trames NMEA (Inforad dans un premier temps et GPS Seedstudio par la suite)<br />
<br />
<h2>
Vérifier la réception des trames NMEA</h2>
<div>
Pour tout savoir sur la norme <a href="http://fr.wikipedia.org/wiki/NMEA_0183" target="_blank">NMEA</a>.</div>
<div>
<br /></div>
<div>
L'objectif est d'analyser ses trames et de récupérer les informations de base pour placer un Marker sur une carte (latitude et longitude).</div>
<div>
<br /></div>
Dans un premier temps, j'ai récupéré un "assistant à la conduite" anciennement appelé "détecteur de radar" de marque Inforad. Ces petits appareils permettent de prévenir de la présence <strike>d'un radar</strike> d'une zone de danger lorsque l'on circule sur une route.<br />
Ces appareils contiennent une base de données de radar, que l'on peut mettre à jour depuis son ordinateur, et se sert de la position GPS pour prévenir des zones à risque. Cela a évité un grand nombre <strike>d'amendes et de retraits de points</strike> d'accidents sur les routes.<br />
<br />
Bref, ces appareils sont très intéressant puisqu'ils transmettent via le port série (port USB) les trames NMEA. Ils ont été remplacés par des modèles connectés ou par des GPS indiquant eux aussi les zones à risque. Si vous avez ce type d'appareil, ressortez le du placard ou demandez à un ami, sinon on peut en trouver pour moins de 10 euros sur les sites de revente.<br />
<br />
On peut également trouver certains GPS qui envoient les trames NMEA via le port série. Chercher sur Internet ou sur la documentation du GPS la vitesse de transmission ou Bauds.<br />
Le mien par exemple, et il semble que ce soit généralement le cas transmet à 4800 Bauds.<br />
<br />
On va à présent vérifier que le GPS renvoie bien les trames NMEA. Pour cela on va brancher le GPS sur le port USB et vérifier le port COM.<br />
On va utiliser Putty, mais on peut utiliser le logiciel de notre choix qui nous permet de se connecter aux ports COM (screen pour Linux par exemple).<br />
<br />
1) Brancher le GPS sur l'ordinateur à l'aide du câble USB<br />
2) Vérifier le numéro du port COM dans la liste des périphériques<br />
3) Ouvrir Putty<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZF5gy63s09TWVLZtwke5JvYRTJ3QCjQgGWgC-424KbUO0ulsE2Qxq7rW0gii9SIyVeMTDzYhEMd-CZv3QNpKagwG0BcSDQgkiQBOXnOSkMKDVjUta-ZsoCauu6NnQirYmYHvBzvI48sw/s1600/putty-start.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZF5gy63s09TWVLZtwke5JvYRTJ3QCjQgGWgC-424KbUO0ulsE2Qxq7rW0gii9SIyVeMTDzYhEMd-CZv3QNpKagwG0BcSDQgkiQBOXnOSkMKDVjUta-ZsoCauu6NnQirYmYHvBzvI48sw/s1600/putty-start.PNG" height="306" width="320" /></a></div>
<br />
4) Sélectionner Serial dans les boutons radios puis saisir le nom du port COM ainsi que la vitesse (ici port COM28 et 4800<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii98Z5ZVVAJ1TWT5487MR5fr5e0sX_LrwBW6oyXgNLBTOw6_F6psP_fPuNwAY0hph40xlNVGGNbgF4BznuaQhq106d0wqjJqkcf2WiYhyEBBuIML6aqJc2MvfGvOfYE4Cw5LQcLFjXhXM/s1600/putty-select-com-port.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii98Z5ZVVAJ1TWT5487MR5fr5e0sX_LrwBW6oyXgNLBTOw6_F6psP_fPuNwAY0hph40xlNVGGNbgF4BznuaQhq106d0wqjJqkcf2WiYhyEBBuIML6aqJc2MvfGvOfYE4Cw5LQcLFjXhXM/s1600/putty-select-com-port.PNG" /></a></div>
<br />
5) Cliquer sur Open, un terminal s'ouvre et les lignes NMEA doivent s'afficher<br />
<br />
<br />
<br />
A venir prochainement, la récupération des traces NMEA à partir d'une RaspberryPI et l'affichage sur une carte.<br />
<br />Unknownnoreply@blogger.com13tag:blogger.com,1999:blog-6315537784607745445.post-49539035005173234152013-06-03T08:09:00.001-07:002013-06-03T08:09:31.377-07:00Arduino lent au démarrage et ouverture Outils?Votre programme Arduino est lent à l'ouverture et lorsque vous ouvrez l'onglet Outil dans le menu.<br />
Essayez de désactiver le Bluetooth de votre PC.<br />
Arduino scan tous les ports COM à l'ouverture du logiciel Arduino et à l'ouverture du menu Outil. Le périphérique Bluetooth utilise des ports COM et ralentit le logiciel Arduino<br />
src : <a href="http://arduino.cc/en/Guide/troubleshooting">http://arduino.cc/en/Guide/troubleshooting</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-37067915962247175552013-05-28T07:11:00.001-07:002016-10-28T00:52:37.919-07:00[RaspberryPI] Commander des prises de courant par radio fréquence via un émetteur 433MhzJ'ai acheté un pack de prises télécommandées de ce style :<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://images.grosbill.com/imagesproduitnew/imagesgallery/BIG/138711.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://images.grosbill.com/imagesproduitnew/imagesgallery/BIG/138711.jpg" height="320" width="320" /></a></div>
<br />
J'avais envie de les commander via une interface Web. Quoi de mieux qu'une RaspberryPI pour ca?<br />
Pour cela j'avais besoin :<br />
- une RaspberryPI<br />
- Un pack de prises télécommandées (voir ci-dessus)<br />
- Un émetteur/récepteur 433Mhz (<a href="http://www.evola.fr/product_info.php/kit-transmission-433mhz-compatible-arduino-p-162">http://www.evola.fr/product_info.php/kit-transmission-433mhz-compatible-arduino-p-162</a>)<br />
<br />
<h2>
<b>Note importante!</b></h2>
Ces prises que l'on trouve dans le commerce utilise la fréquence 433Mhz pour dialoguer. En fait elle ne dialogue pas vraiment.<br />
La télécommande est codée via 5 interrupteurs que l'on place en position 0 ou 1.<br />
La télécommande est généralement composée de 4 on/off permettant d'allumer ou d'éteindre chaque prise.<br />
Chaque prise est composée de 2 séries d'interrupteurs, le premier correspond au code de la télécommande, et l'autre au numéro de la prise (généralement ce sont des lettres).<br />
En gros lors de l'appui sur un bouton de la télécommande, elle émet un signal composé :<br />
1) du numéro de télécommande<br />
2) du numéro de prise<br />
3) de l'état voulu de la prise<br />
<br />
Le code envoyer par chaque bouton est toujours le même.<br />
<br />
Pendant ce temps là, les prises écoutes et attendent leur code de déclenchement.<br />
<br />
Il est donc très facile de sniffer le code et le renvoyer (Man in the middle) mais heureusement on ne sera pas obligé de sniffer le code puisque des gens ont déjà travaillé dessus.<br />
<br />
Nous utiliserons la librairie <a href="https://github.com/r10r/rcswitch-pi">rc-switch</a> ré-écrite pour la RaspberryPI et qui permet d'émuler, via un émetteur RF 433Mhz, une télécommande. A noter que rc-switch utilise la librairie <a href="https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/">Wiringpi</a>.<br />
La librairie rc-switch est également disponible pour Arduino et permet d'utiliser le recepteur RF.<br />
<br />
<h2>
Passons à l'installation</h2>
A présent nous allons mettre en place notre application.<br />
<h3>
Paramétrage des prises</h3>
<div>
1) Dans ce tutoriel, nous allons positionner les interrupteurs de chaque prises sur ON ou 1 (11111). Attention on va faire ca uniquement sur le code correspondant à la télécommande (celui avec 5 interrupteurs).</div>
<div>
2) Ensuite on va attribuer une lettre différente pour chaque prise (de A à D)</div>
<div>
3) Pour être sûr que cela fonctionne régler la télécommande avec le même code (11111) et brancher chacune des prises. Tester ensuite à l'aide de la télécommande pour voir si chaque prise s'allume et s'éteint.</div>
<h3>
Branchement du module RF 433Mhz sur la RaspberryPI</h3>
<div>
source : <a href="http://blog.codecentric.de/en/2013/03/home-automation-with-angularjs-and-node-js-on-a-raspberry-pi/">http://blog.codecentric.de/en/2013/03/home-automation-with-angularjs-and-node-js-on-a-raspberry-pi/</a></div>
<div>
<br /></div>
<div>
1) Relier Vcc > PIN 2 (5V)</div>
<div>
2) Relier GND > PIN 6 (GND)</div>
<div>
3) Relier output > PIN 11 (GPIO17)</div>
<h3>
Installer et configurer WiringPI</h3>
<div>
source : <a href="https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/">https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/</a></div>
<h3>
Installer RC-switch-pi</h3>
<div>
source : <a href="https://github.com/r10r/rcswitch-pi">https://github.com/r10r/rcswitch-pi</a></div>
<h3>
Tester les interrupteurs</h3>
<div>
Maintenant que tout est opérationnel, on va allumer une de nos prises.<br />
Pour cela, on va utiliser le fichier send du dossier rc-switch et on va lui passer en paramètres :</div>
<div>
1 : le code de la télécommande</div>
<div>
2 : le numéro de la prise (1=A ; 2=B ; 3=C ; 4=D)</div>
<div>
3 : l'état dans lequel on veut voir la prise (1=allumée ; 0=éteinte)</div>
<div>
Exécuter donc la commande suivante (si vous êtes dans le dossier rc-switch) qui va allumer la première prise :</div>
<div>
sudo ./send 11111 1 1 </div>
<div>
Pour l'éteindre :</div>
<div>
<div>
sudo ./send 11111 1 0 </div>
</div>
<div>
<br /></div>
<div>
Si ca ne fonctionne pas :</div>
<div>
1) vérifier que la prise n'est pas à une distance trop éloigner de l'émetteur</div>
<div>
2) vérifier les branchements de l'émetteur sur la RaspberryPI</div>
<div>
3) reprendre le tuto...</div>
<h2>
Mettre en place l'interface</h2>
<h3>
Installation du serveur lighttpd</h3>
<div>
Une fois que ca fonctionne on va pouvoir rendre accessible cette fonctionnalité via une interface Web.</div>
<div>
Pour cela on va installer lighttpd qui suffira pour ce dont on a besoin de faire :</div>
<div>
sudo apt-get install lighttpd</div>
<div>
<br /></div>
<h3>
Création de l'interface</h3>
<div>
On va utiliser la librairie ainsi qu'un thème JQuery, pour cela configurer et télécharger un thème en suivant <a href="http://jqueryui.com/themeroller/">ce lien</a>.</div>
<div>
Dézipper ce dossier.</div>
<div>
Créer un fichier index.php à la racine et y coller le code ci-dessous. Cette page va afficher 4 radio-boutons qui vont permettre d'allumer ou d'éteindre nos 4 interrupteurs.</div>
<div>
<div>
<!doctype html></div>
<div>
<html lang="us"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><head></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><meta charset="utf-8"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><meta name="viewport" content="initial-scale=1.0"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><title>Domo</title></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><link href="css/ui-darkness/jquery-ui-1.10.3.custom.css" rel="stylesheet"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><script src="js/jquery-1.9.1.js"></script></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><script src="js/jquery-ui-1.10.3.custom.js"></script></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><script></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>$(function() {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>$( "#radioset1" ).buttonset();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>$( "#radioset2" ).buttonset();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>$( "#radioset3" ).buttonset();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>$( "#radioset4" ).buttonset();</div>
<div>
<br /></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>$( ".ui-buttonset" ).change(function(){</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>var housecode=$(this).children("input[name='housecode']").val();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>var numcode = $(this).children("input[name='num']").val();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>var state = $(this).children(":checked").val();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>console.log(housecode+" : "+numcode+" : "+state);</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>$.post("sendVal.php", {housecode:housecode, numcode:numcode, state:state}, function(data){</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>console.log(data);</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>});</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>});</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>});</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></script></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><style></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>body{</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>font: 62.5% "Trebuchet MS", sans-serif;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>.demoHeaders {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>margin-top: 2em;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>#dialog-link {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>padding: .4em 1em .4em 20px;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>text-decoration: none;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>position: relative;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>#dialog-link span.ui-icon {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>margin: 0 5px 0 0;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>position: absolute;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>left: .2em;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>top: 50%;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>margin-top: -8px;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>#icons {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>margin: 0;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>padding: 0;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>#icons li {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>margin: 2px;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>position: relative;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>padding: 4px 0;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>cursor: pointer;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>float: left;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>list-style: none;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>#icons span.ui-icon {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>float: left;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>margin: 0 4px;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>.fakewindowcontain .ui-widget-overlay {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>position: absolute;</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></style></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></head></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><body></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><div id="radioset1" class="ui-buttonset"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Lumière 1 :</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="housecode" value="11111"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="num" value="1"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio1" name="radio1" class="ui-helper-hidden-accessible" value="1"><label for="radio1" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left" role="button" aria-disabled="false" aria-pressed="false"><span class="ui-button-text">Allumer</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio2" name="radio1" checked="checked" class="ui-helper-hidden-accessible" value="0"><label for="radio2" class="ui-button ui-widget ui-state-default ui-button-text-only ui-state-active" role="button" aria-disabled="false" aria-pressed="true"><span class="ui-button-text">Eteindre</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><div id="radioset2" class="ui-buttonset"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Lumière 2 : </div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="housecode" value="11111"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="num" value="2"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio3" name="radio2" class="ui-helper-hidden-accessible" value="1"><label for="radio3" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left" role="button" aria-disabled="false" aria-pressed="false"><span class="ui-button-text">Allumer</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio4" name="radio2" checked="checked" class="ui-helper-hidden-accessible" value="0"><label for="radio4" class="ui-button ui-widget ui-state-default ui-button-text-only ui-state-active" role="button" aria-disabled="false" aria-pressed="true"><span class="ui-button-text">Eteindre</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><div id="radioset3" class="ui-buttonset"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Lumière 3 : </div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="housecode" value="11111"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="num" value="3"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio5" name="radio3" class="ui-helper-hidden-accessible" value="1"><label for="radio5" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left" role="button" aria-disabled="false" aria-pressed="false"><span class="ui-button-text">Allumer</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio6" name="radio3" checked="checked" class="ui-helper-hidden-accessible" value="0"><label for="radio6" class="ui-button ui-widget ui-state-default ui-button-text-only ui-state-active" role="button" aria-disabled="false" aria-pressed="true"><span class="ui-button-text">Eteindre</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><div id="radioset4" class="ui-buttonset"></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>Lumière 4 : </div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="housecode" value="11111"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="hidden" name="num" value="4"/></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio7" name="radio4" class="ui-helper-hidden-accessible" value="1"><label for="radio7" class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left" role="button" aria-disabled="false" aria-pressed="false"><span class="ui-button-text">Allumer</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span><input type="radio" id="radio8" name="radio4" checked="checked" class="ui-helper-hidden-accessible" value="0"><label for="radio8" class="ui-button ui-widget ui-state-default ui-button-text-only ui-state-active" role="button" aria-disabled="false" aria-pressed="true"><span class="ui-button-text">Eteindre</span></label></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></div></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span></body></div>
<div>
</html></div>
</div>
<div>
<br />
On va ensuite créer un fichier sendVal.php qui va recevoir les instructions des radio-boutons à envoyer via l'émetteur RF.<br />
<?php<br />
if(isset($_POST)){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(isset($_POST['housecode']) &&<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>isset($_POST['numcode']) &&<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>isset($_POST['state'])){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$housecode = $_POST['housecode'];<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$numcode = $_POST['numcode'];<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$state = $_POST['state'];<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>$command = "sudo ./home/pi/rcswitch-pi/send ".$housecode." ".$numcode." ".$state;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>system(escapeshellcmd($command));<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>echo 'ok';<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
}<br />
<br />
?></div>
<div>
<br />
Envoyer le contenu du dossier dans le dossier /var/www de la RaspberryPI.<br />
Saisir ensuite l'IP de la RaspberryPI dans un navigateur. La page avec les 4 radio-boutons devrait s'afficher.<br />
<br />
Tester l'un des radio-boutons. Si cela fonctionne tant mieux! Sinon il faut aller jeter un œil dans les logs.<br />
Personnellement j'avais une erreur d'authentification de l'utilisateur www-data (utilisateur de lighttpd). J'ai réglé cela en ajoutant dans le fichier /etc/sudoers :<br />
www-data ALL=NOPASSWD: ALL</div>
<div>
<br /></div>
<div>
Re-tester, ca devrait fonctionner.</div>
Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-6315537784607745445.post-48373052446179975232013-05-28T05:24:00.002-07:002013-05-28T05:24:47.222-07:00[RaspberryPI] Reconnexion wifi automatiqueGrâce à un dongle wifi, la RaspberryPI (RPI) peut se connecter au réseau sans être relié par un câble Ethernet. Ceci permet de positionner sa carte n'importe ou à portée du signal wifi.<br />
<br />
Certains utilisateurs, dont moi, ont remarqué qu'ils perdaient leur connexion wifi. Il faut alors débrancher et rebrancher la carte.<br />
<br />
Pour éviter cela, il faut écrire un petit script qui va vérifier toutes les x minutes si la connexion est bien établie.<br />
source : <a href="http://www.raspberrypi.org/phpBB3/viewtopic.php?t=16054">http://www.raspberrypi.org/phpBB3/viewtopic.php?t=16054</a><br />
<br />
On va tout d'abord éditer un script shell qu'on placera dans le répertoire <i>/root</i> et qu'on nommera <i>network-check.sh</i>:<br />
<pre></pre>
<pre>#!/bin/bash
while true ; do
if ifconfig wlan0 | grep -q "inet addr:" ; then
sleep 300 #300 secondes
else
ifup --force wlan0
sleep 20
fi
done
</pre>
<pre></pre>
<div>
Il faut rendre le code éxecutable :<br />
chmod +x network-check.sh<br />
<br />
Ensuite on va exécuter le script au démarrage. Pour cela ouvrir le fichier <i>/etc/rc.local</i> et ajouter, <b>avant la ligne exit 0</b>, l'instruction suivante :<br />
/root/network-check.sh &</div>
<div>
<br /></div>
<div>
Vous pouvez à présent rebooter la carte en tapant sudo reboot et votre carte récupérera le signal Wifi dans les 5 minutes qui suit.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-70151202525964443742013-05-21T04:56:00.000-07:002013-05-21T04:56:47.561-07:00Zoneminder, Ajouter une caméra IP à l'aide d'une Raspberry PI et d'une Webcam Dans ce tutoriel, on va utiliser une Raspberry PI (RPI) comme caméra IP.<br />
Pour cela on va brancher une Webcam en USB sur la RPI.<br />
On peut soit utiliser le réseau filaire en branchant un câble Ethernet à la RPI (pas très utile), soit utiliser un dongle Wifi qui va permettre de la brancher près de n'importe quelle prise à portée du signal Wifi.<br />
<br />
Une fois les branchement fait on démarre la RPI en connectant le câble d'alimentation. Si ce n'est pas déjà fait on la configure en autorisant la connexion SSH (si vous n'avez plus l'écran de configuration taper raspi-config dans le terminal. Il faudra évidemment débrancher un des périphériques USB et brancher un clavier).<br />
<br />
A présent, on va se connecter en SSH depuis notre PC, en admettant avoir relevé l'adresse IP de la RPI précédemment, et en utilisant Putty ou autre.<br />
<br />
Installer <a href="http://doc.ubuntu-fr.org/motion">Motion</a> qui va permettre de diffuser en streaming le flux vidéo de la caméra.<br />
<br />
En local, on peut tester le bon fonctionnement en tapant http://ip-raspberry:8081/<br />
<br />
On va à présent déclarer la nouvelle source vidéo sur Zoneminder. Pour cela :<br />
1) Cliquer sur Add New Monitor<br />
2) Sélectionner 'Remote' dans Source Type<br />
3) Dans source, saisir l'adresse IP et le port et modifier la taille de l'entrée vidéo<br />
4) Cliquer sur Save<br />
<br />
La source doit maintenant être visible. En modifiant la fonction 'Modect', on peut activer la détection de mouvements.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-48056554367436286602013-05-21T04:35:00.002-07:002013-05-21T04:35:29.382-07:00Mise en place de ZoneMinderRécupérer un vieux pc qui consomme peu de préférence puisqu'il sera tout le temps allumé. Personnellement j'ai récupéré un pc portable d'une amie avec l'écran cassé.<br />
<br />
Ensuite, télécharger <a href="http://ubuntu-fr.org/telechargement?variante=server">Ubuntu server</a> ou une autre distribution qui vous chante. J'ai choisie Ubuntu car la documentation est riche sur le Net avec beaucoup de tutoriels. Créer votre Live CD et installer ceci sur votre pc de récupération.<br />
<br />
<i>Je passe toutes les étapes de configuration et de création de compte Linux car ceci et déjà très bien documenté.</i><br />
<br />
Zoneminder utilise Apache Php et MySQL, il va donc falloir les installer (Choisir l'installation par paquets sur <a href="http://doc.ubuntu-fr.org/lamp">ce tuto</a>) et les configurer.<br />
<br />
Ensuite il suffit d'installer <a href="http://doc.ubuntu-fr.org/zoneminder">Zoneminder</a>. Brancher une Webcam et tester.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-77773925301577127622013-05-09T05:41:00.002-07:002013-06-03T08:11:25.604-07:00Arduino motor shield + 2 servo-moteursVoici comment utiliser le Shield Arduino motor avec 2 servo-moteurs.<br />
<div>
<br /></div>
<div>
Le shield Arduino Motor est capable de piloter 2 moteurs à courant continu ou 1 moteur pas à pas à l'aide du courant fourni par une alimentation externe. De nombreux tutoriels explique comment utiliser ces fonctionnalités (voir <a href="http://www.instructables.com/id/Arduino-Motor-Shield-Tutorial/">http://www.instructables.com/id/Arduino-Motor-Shield-Tutorial/</a>).</div>
<div>
<br /></div>
<div>
Ce shield permet également d'interfacer très facilement des capteurs ou des servo-moteurs grâce à ces 6 broches de 3 à 4 pins.</div>
<div>
2 d'entre elles sont reliées à des pins PWM de l'arduino ce qui permet d'envoyer un signal entre 0 et 1024. Nous allons nous en servir pour nos servo-moteurs.</div>
<div>
<br /></div>
<div>
J'ai utilisé des servo-moteurs Emax ES08A dans mon exemple. J'ai du modifié la position des fils sur la broche pour correspondre aux pins sur le shield (de gauche à droite (rouge (+), jaune (analog), marron (-)).<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgksMRw_4WjF9f5qpK8HUXPRdiHRmptrjJMUvfbevIt0xwwsLguOy6iuA2RuYKdAk2nQofK4MGI2yyNJ8rvnn0bSkS3cffB2FAUSV5a7t0Bb490U6YC1xmTDbkaDRW_by9iKrEmkAof5Z8/s1600/IMG_1137.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgksMRw_4WjF9f5qpK8HUXPRdiHRmptrjJMUvfbevIt0xwwsLguOy6iuA2RuYKdAk2nQofK4MGI2yyNJ8rvnn0bSkS3cffB2FAUSV5a7t0Bb490U6YC1xmTDbkaDRW_by9iKrEmkAof5Z8/s1600/IMG_1137.JPG" height="297" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Sur mon exemple j'ai branché 1 servo-moteur sur chaque broche orange du shield.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Il reste plus qu'à écrire le programme (J'ai utilisé l'exemple "sweep" et l'ai modifié pour l'adapter à mon exemple) :</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<pre>// Sweep
// by BARRAGAN <http: barraganstudio.com="">
// modified by gpilot <gpilot .pro="" gmail.com="">
// This example code is in the public domain.
#include <servo .h="">
Servo myservo, myservo2; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 0; // variable to store the servo position
void setup()
{
Serial.begin(9600);
myservo.attach(5); // attaches the servo on pin 9 to the servo object
myservo2.attach(6);
}
void loop()
{
for(pos = 0; pos < 170; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
myservo2.write(pos); // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(10); // waits 15ms for the servo to reach the position
}
for(pos = 170; pos>=0; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
myservo2.write(pos); // tell servo to go to position in variable 'pos'
Serial.println(pos);
delay(10); // waits 15ms for the servo to reach the position
}
}
</servo></gpilot></http:></pre>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-27769459944275394832013-04-03T05:31:00.000-07:002013-04-03T05:31:07.087-07:00Forcer le redémarrage de Linux à l'aide de cronPour forcer le redémarrage d'un système Linux à l'aide de la crontab, on ouvre la crontab en tant que super-utilisateur :<br />
<blockquote class="tr_bq">
sudo crontab -e</blockquote>
Et on ajoute l'entrée suivante pour redémarrer le système toutes les heures :<br />
<blockquote class="tr_bq">
0 0 */1 * * sudo shutdown -r now </blockquote>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-1382702214781234972013-02-26T08:22:00.003-08:002013-02-26T08:28:57.246-08:00[Arduino] Uploader un programme après avoir séparé les pins d'auto-reset<div class="separator" style="clear: both; text-align: left;">
Dans le précédent post, nous avons supprimer la connexion de 2 points sur la carte pour éviter le reboot au lancement du Serial.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdk3BU8sdPCXo2Bfj-B3YTM1jUneHFsO3vX36xWK_zDkRa8jK-LFPuBNX1syp3BHmHY4vRrOLxFRYsFVZ2_OdxzGvZGXyhdUjAOrIi2oot_hA-Hq5xhWZEGuxlKJk7_7EkttrWX8wNRqQ/s1600/Arduino_front_autoreset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdk3BU8sdPCXo2Bfj-B3YTM1jUneHFsO3vX36xWK_zDkRa8jK-LFPuBNX1syp3BHmHY4vRrOLxFRYsFVZ2_OdxzGvZGXyhdUjAOrIi2oot_hA-Hq5xhWZEGuxlKJk7_7EkttrWX8wNRqQ/s1600/Arduino_front_autoreset.png" height="165" width="200" /></a></div>
Si vous avez fait cette manipulation sur une de vos carte ou si vous possédez une carte n'ayant pas d'auto-reset, vous vous rendrez compte rapidement que vous ne pourrez plus Uploader de sketch et que vous obtiendrez l'erreur suivante :<br />
<blockquote class="tr_bq">
<span style="background-color: white; font-family: Times, serif; font-size: 14px; margin: 0px; padding: 0px;">Téléchargement terminée</span> </blockquote>
<blockquote class="tr_bq">
<span style="background-color: white; font-family: Times, serif; font-size: 14px; margin: 0px; padding: 0px;"><span style="color: #cc0000;">avrdude: stk500_getsync(): not in sync: resp=0x00</span></span></blockquote>
Lorsque vous appuyer sur le bouton reset de la carte arduino, le Bootloader se lance et permet pendant un cours instant d'uploader un sketch sur la carte. En supprimant le point de soudure entre les 2 points nous avons enlevé la possibilité à la carte Arduino de faire un reset de manière automatique.<br />
Il faut donc le faire manuellement.<br />
Pour cela :<br />
1) Appuyer sur le bouton reset de la carte Arduino<br />
2) Cliquer sur le bouton Uploader du logiciel Arduino<br />
3) Attendre que la Led RX clignote une fois<br />
4) Relâcher immédiatement votre doigt du bouton reset (Si une autre Led clignote le temps de lacher le bouton il faudra recommencer)<br />
5) Laisser le logiciel Uploader le sketch sur la carte Arduino<br />
<br />
Si le message Téléchargement terminé s'affiche sans message d'erreur, votre sketch a été envoyé correctement sur la carteUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-5578902529509356892013-02-26T08:08:00.001-08:002013-02-26T08:28:50.063-08:00[Arduino] Eviter le reset à l'ouverture du SerialPour éviter que la carte Arduino reboot à chaque ouverture du Serial, on peut supprimer le petit point de soudure entre 2 connexions sur la carte (voir ci-dessous).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdk3BU8sdPCXo2Bfj-B3YTM1jUneHFsO3vX36xWK_zDkRa8jK-LFPuBNX1syp3BHmHY4vRrOLxFRYsFVZ2_OdxzGvZGXyhdUjAOrIi2oot_hA-Hq5xhWZEGuxlKJk7_7EkttrWX8wNRqQ/s1600/Arduino_front_autoreset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdk3BU8sdPCXo2Bfj-B3YTM1jUneHFsO3vX36xWK_zDkRa8jK-LFPuBNX1syp3BHmHY4vRrOLxFRYsFVZ2_OdxzGvZGXyhdUjAOrIi2oot_hA-Hq5xhWZEGuxlKJk7_7EkttrWX8wNRqQ/s1600/Arduino_front_autoreset.png" height="265" width="320" /></a></div>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-65874193460878569512013-02-25T10:29:00.001-08:002013-02-26T08:28:42.254-08:00[Arduino] Lire une ligne Serial On peut avoir besoin d'interagir via une carte Arduino par Serial (USB ou RXTX) en envoyant un ou plusieurs caractères.<br />
Pour lire une ligne entrée dans le Serial, il suffit d'écrire le code suivant :<br />
<br />
<br />
<pre>String msg;
int ledPin = 13;
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop(){
if(Serial.available() > 0){
msg="";
while (Serial.available()){
delay(2);//Pour laisser le temps au buffer
char c =Serial.read();
msg += c;
}
Serial.println(msg);
}
}
</pre>
<br />
Ce code attend une entrée dans le Serial, lit les caractères entrés et les ré-écrit dans le Serial.<br />
<br />
Cela permet par exemple d'allumer/éteindre une Led branchée sur l'arduino en fonction de l'entrée dans le Serial.<br />
<br />
<pre>String msg;
int ledPin = 13;
void setup(){
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop(){
if(Serial.available() > 0){
msg="";
while (Serial.available()){
delay(2);//Pour laisser le temps au buffer
char c =Serial.read();
msg += c;
}
if(msg.equals("on")){
digitalWrite(ledPin, HIGH);
}else if(msg.equals("off")){
digitalWrite(ledPin, LOW);
}
}
}
</pre>
<br />
<div>
Avec le code suivant : </div>
<div>
- en écrivant "on", vous allumerez la led sur la pin 13</div>
<div>
<div>
- en écrivant "off", vous éteindrez la led sur la pin 13</div>
</div>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-35390663574907870662013-02-22T04:16:00.001-08:002013-02-26T00:01:12.368-08:00[Windows] Installation de node.js + premier exemple1) Aller sur <a href="http://nodejs.org/">http://nodejs.org/</a><br />
2) Cliquer sur INSTALL<br />
3) Créer un dossier dédier nodejs dans votre espace perso (C:/Users/[NOM_UTILISATEUR])<br />
4) Copier l'exemple présent en bas de page et le coller dans un fichier example.js :<br />
<pre>var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');</pre>
5) Ouvrir un prompt (Attention si vous venez d'installer node.js et que vous aviez déjà un prompt d'ouvert il faudra en ouvrir un autre pour prendre en compte le PATH)<br />
6) Aller dans le répertoire créé et taper la commande :
<br />
<pre>node example.js
</pre>
7) Ouvrer un navigateur et taper http://127.0.0.1:1337/Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6315537784607745445.post-7988073726613799952013-01-24T05:56:00.002-08:002013-01-24T08:44:08.779-08:00C'est parti!Un petit message de lancement pour la création de mon blog.
Ce blog est destiné à conserver mes idées, trouvailles et autres sujets qui m’intéressent et les partager!
Alors allons y!Unknownnoreply@blogger.com0