1. Introduction

En commençant ce projet j'avais une idée de ce que je voulais faire mais n'avait pas pensé aux détails. Mon projet était de mettre une puce Bluetooth dans son portefeuille et de le connecter à son smartphone, pour que, quand la connexion soit perdue, il sonne afin de ne jamais son portefeuille. J'avais aussi imaginé ajouter une puce GPS en cas de perte.(document du premier projet dans le dossier First idea) Mais après discussion avec Mr. Iglesias , on en a déduit que l'idée était intéressante mais trop complexe à mettre en place car tout l'artefact devrait tenir dans un portefeuille, ceci n'étant pas pratique Mr. Iglesias m'a communiqué par mail une variante à ce projet.

2. Matériel et méthodes

2.1 Matériel

  • 1 Raspberry Pi 3
  • 1 Pi Wedge 40-pin
  • 1 Bouton
  • Plusieurs LEDs
  • 1 Moteur à vibration
  • 1 Smartphone
  • 1 Joghurt vide
  • 1 Boîte en Carton

2.1.1 Bouton

Le bouton provient du kit de développement Raspberra fournit en début d'année par Mr. Iglesias. C'est un accesoire très simple qui a deux états (on/off). Il sert à armer et désarmer le système.

2.1.2 LEDs

Les LEDs servent d'avertisseurs lumineux pour indiquer lorsque le système est armé, désarmé, ou en alerte.
J'utilise des LEDs bleues et rouges, les bleues proviennent du kit alors que les rouges on été acheté à Jumbo sous forme d'une bande.
DSC00993.JPG

2.1.3 Moteur à vibration

Ce moteur à vibration m'a été fourni par Mr. Iglesias qui en avait en stock, mais il peut ausi commandé via https://www.sparkfun.com/products/8...

2.1.4 Smartphone et Raspberry Pi 3

Le smartphone avec lequel j'ai codé ce projet est sur une base Android, mais ça ne devrait pas poser de problème d'utiliser n'importe quelles autres appareils qui dispose du Bluetooth.
Le Raspberry Pi 3 est simplement celui fourni en cours.

2.2 Méthodes

2.2.1 Bouton

Ce bouton sert d'interrupteur pour armer et désarmer le système. J’ai essayé de faire moi-même le code d'après mon expérience. Mais le résultat n'était pas du tout convaincant, même pas exploitable, lorsque j'ai branché une LED pour le tester, elle clignotait et après que je maintienne le bouton appuyé, la LED restait aléatoirement soit allumé ou éteinte.
Ce qu’il se passait parait logique car mon code était construit d'une manière où pendant le temps d'appui du bouton des centaines d'opération “1* -1*-1*-1*...” s'effectuaient. Et donc lorsque je relâchais le bouton, le nombre était soit impaire soit paire (armé/désarmé), ça dépendait de la dernière opération.
Du coup je suis allé chercher une solution sur internet et j'ai vite trouvé.http://raspi.tv/2013/how-to-use-int...
Leur code est encore plus simple que le mien et marche bien mieux, il consiste à constamment envoyer du courant dans l'interrupteur afin d'éviter des faux signales et le code ordonne simplement d'attendre que le bouton soit pressé.

GPIO.wait_for_edge(BUTTON, GPIO.FALLING)

Et afin d’éviter d’autres erreurs j’ai rajouté un délai de 0.2 seconde une fois le bouton pressé.

time.sleep(0.2)

Après une pression sur le bouton, l’état de la machine est enregistré dans une variable, qui peut être utilisée par les LEDs, le moteur à vibrations, et autres.
Par la suite, le fait d'attendre que le bouton soit pressé mettait le code en pause jusqu'à ce que le bouton ait été pressé, cela n'étant pas pratique j'ai modifié le code.

GPIO.input(BUTTON)==0

Avec une petite pause de 0.2 seconde juste derrière et ça fonctionne comme il le faut.

2.2.2 LEDs & Moteur à vibration

Il y a deux sortes de LEDs, les bleues indiquant l'état désarmé et les rouges quand le système est armé. En début de code des variables ont été défini au numéro de pin auxquelles elles sont connectées, (blue=18, red=19) par exemple. Elles ont des actions très similaire, Lorsque les bleues clignotent, ça signifie que l'appareil Bluetooth n'est pas à proximité,

GPIO.output(blue, GPIO.HIGH)
time.sleep(0.3)
GPIO.output(blue, GPIO.LOW)
time.sleep(0.3)

une fois l'appareil Bluetooth detecté les LEDs bleues arrètent de clignoter et reste allumées pour indiquer que le système est prêt à être armé.&&&

GPIO.output(blue, GPIO.HIGH)

Et si il est armé, ce sont les LEDs rouges qui prennent le relai et qui s'allument, les bleues à la suite de cette actions s'éteignent. À ce moment là si le Raspberry perd la connexion Bluetooth à l'appareil, il vérifie deux fois pas que l'état d'alerte s'enclenche par erreur, l'alerte est lancée. En état d'alerte les LEDs rouges clignotes et le moteur à vibration s'enclenche. Là aussi le moteur a été défini par variable (VIBRATOR= 21)

GPIO.output(VIBRATOR, GPIO.HIGH)

L'astuce pour que le moteur à vibrations fassent plus de bruits, c'est de le coller sur le fond d'un joghurt vide afin d'émettre un son qui , grâce à la forme du joghurt, est en plus amplifié.
DSC00994.JPG

2.2.3 Bluetooth

Le Bluetooth est la principale partie de ce projet et celui qui a posé le plus de problème, car le Raspberry ne reste pas connecté à mon smartphone plus de 10 secondes, il renvoie une erreur disant que le téléphone n’a aucun service pour Raspberry et se déconnecte quelques secondes plus tard. En activant le partage de connexion via Bluetooth le Raspberry trouve une utilité au smartphone et est d'accord d'y rester connecté.

Les commandes

hcitool <command>

permette de travailler avec le Bluetooth du Raspberry mais seulement dans le terminal, ces commandes ne sont pas reconnues dans ‘’python ’’. Après de nombreuses heures à désespérément chercher comment travailler avec le Bluetooth en ‘’python ’’, j'abandonne et me penche vers Mr. Iglesias qui me propose de passer par le terminal dans ‘’python ’’avec cette commmande :

os.popen(<command>)

Presque tout fonctionne avec cette nouvelle commande pour le Bluetooth, il reste plus que cette histoire de le reconnecter une fois qu'il a perdu la connexion. N'arrivant à rien avec la commande

sudo hcitool cc ‘’addressbluetooth’’

, j'essaie de trouver un moyen d'accéder aux informations de qualité de signal et de connexion sans être connecté. Ne trouvant rien sur le net, j'improvise et découvre que si les commande de connexion et de qualité de signal sont enchainé rapidement, le code fonctionne.

os.popen("sudo hcitool cc " + device)
output = os.popen("hcitool rssi " + device + " 2>&1").read()

La première ligne a pour fonction de connecter le Raspberry à l'appareil, "device" étant l'adresse Bluetooth de ce dernier, elle peut être découverte en scannant les appareils à proximité.

os.popen("sudo hcitool scan")

La deuxième ligne du code précèdent permet d'affecter à une variable la qualité du signal Bluetooth, si l'appareil n'est pas connecter elle l'indique. Lorsque l'appareil n'est pas connecté "output = Not connected." . Cette information est très utile et permet de donner l'alerte lorsque l'appareil se déconnecte.

if output == 'Not connected.\n' :

2.2.4 Montage

Le montage était sans doute la partie la plus amusante du projet. Braser, couper et coller ne sont pas des choses complexes à faire mais par rapport à la partie logiciel du projet, lorsqu'il y a des erreurs en mécanique, d'après mon opinion, c'est plus facile de les réparer et de les anticiper, car à mon niveau de codage, certaines erreurs que le terminal me rendait étaient incompréhensible et m'obligeait à 'perdre du temps' sur Internet. Le seule problème, si on peut appeler ça comme ça, que j'ai eu en construisant mon projet était de tout introduire dans la boîte sans que ça déborde.

3. Résultats

Après de nombreux essais et modifications le système fonctionne bien. Il détecte bien le Bluetooth de l'appareil et sait lorsque le Bluetooth se déconnecte. Il fonctionne continuellement je veux dire par là que lorsque l'alerte ait été donné il suffit d'un clique sur le bouton afin qu'il redémarre le code.
Le seul défaut majeure est le temps qu'il prend à savoir que le Bluetooth se soit déconnecter, surement à cause de la double vérification mais sans cela le système avait tendance à donner des fausses alertes.

4. Discussion

Dans l'ensemble je suis satisfait de ce projet, mais j'ai quand même quelques regrets par rapport à l'alerte, qui était censé envoyer aussi un mail sur mon natel m'avertissant de l'oubli, mais faute d'organisation, je n'ai pas eu le temps de coder la partie du mail, j'avais commencé mais comme il y avait des erreurs par rapport aux comptes mail et à l'identité du Raspberry je'ai décider de passer outres afin de finir le projet plutôt que de perdre du temps là dessus. J'aurait aussi pû ajouté le fait que plus l'appareil est loin plus un buzzer buzz fort. J'ai codé cette partie mais la qualité étant très instable ça n'aurait rien donné mise à part une mélodie aléatoirement orchestrée. Le bout de code qui permettait de garder en mémoire la qualité du signal est assez long mais simple.

if output == 'Not connected.\n' :
        print "pas connecte"
        os.popen("sudo hcitool cc " + device)
elif output == 'RSSI return value: 36\n':
        output=36
        print output
elif output == 'RSSI return value: 35\n':
        output=35 
        print output
elif output == 'RSSI return value: 34\n':
        output=34 
        print output
elif output == 'RSSI return value: 33\n':
        output=33 
        print output
elif output == 'RSSI return value: 32\n':
        output=32 
        print output
elif output == 'RSSI return value: 31\n':
        output=31
        print output
elif output == 'RSSI return value: 30\n':
        output=30 
        print output
elif output == 'RSSI return value: 29\n':
        output=29 
        print output
elif output == 'RSSI return value: 28\n':
        output=28 
        print output
elif output == 'RSSI return value: 27\n':
        output=27 
        print output
elif output == 'RSSI return value: 26\n':
        output=26 
        print output
elif output == 'RSSI return value: 25\n':
        output=25 
        print output
elif output == 'RSSI return value: 24\n':
        output=24 
        print output
elif output == 'RSSI return value: 23\n':
        output=23
        print output
elif output == 'RSSI return value: 22\n':
        output=22
        print output
elif output == 'RSSI return value: 21\n':
        output=21
        print output
elif output == 'RSSI return value: 20\n':
        output=20
        print output
elif output == 'RSSI return value: 19\n':
        output=19
        print output
elif output == 'RSSI return value: 18\n':
        output=18
        print output
elif output == 'RSSI return value: 17\n':
        output=17
        print output
elif output == 'RSSI return value: 16\n':
        output=16
        print output
elif output == 'RSSI return value: 15\n':
        output=15
        print output
elif output == 'RSSI return value: 14\n':
        output=14
        print output
elif output == 'RSSI return value: 13\n':
         output=13
        print output
elif output == 'RSSI return value: 12\n':
        output=12
        print output
elif output == 'RSSI return value: 11\n':
        output=11
        print output
elif output == 'RSSI return value: 10\n':
        output=10
        print output
elif output == 'RSSI return value: 9\n':
        output=9
        print output
elif output == 'RSSI return value: 8\n':
        output=8
        print output
elif output == 'RSSI return value: 7\n':
        output=7
        print output
elif output == 'RSSI return value: 6\n':
        output=6
        print output
elif output == 'RSSI return value: 5\n':
        output=5
        print output
elif output == 'RSSI return value: 4\n':
        output=4
        print output
elif output == 'RSSI return value: 3\n':
        output=3
        print output
elif output == 'RSSI return value: 2\n':
        output=2
        print output
elif output == 'RSSI return value: 1\n':
        output=1
        print output
elif output == 'RSSI return value: 0\n':
        output=0
        print output
elif output == 'RSSI return value: -1\n':
        output=-1
        print output
elif output == 'RSSI return value: -2\n':
        output=-2
        print output
elif output == 'RSSI return value: -3\n':
        output=-3
        print output
elif output == 'RSSI return value: -4\n':
        output=-4
        print output
elif output == 'RSSI return value: -5\n':
        output=-5
        print output
elif output == 'RSSI return value: -6\n':
        output=-6
        print output
elif output == 'RSSI return value: -7\n':
        output=-7
        print output
elif output == 'RSSI return value: -8\n':
        output=-8
        print output
elif output == 'RSSI return value: -9\n':
        output=-9
        print output
elif output == 'RSSI return value: -10\n':
        output=-10
        print output
elif output == 'RSSI return value: -11\n':
        output=-11
        print output
elif output == 'RSSI return value: -12\n':
        output=-12
        print output
elif output == 'RSSI return value: -13\n':
        output=-13
        print output
elif output == 'RSSI return value: -14\n':
        output=-14
        print output
elif output == 'RSSI return value: -15\n':
        output=-15
        print output
elif output == 'RSSI return value: -16\n':
        output=-16
        print output
elif output == 'RSSI return value: -17\n':
        output=-17
        print output
elif output == 'RSSI return value: -18\n':
        output=-18
        print output
elif output == 'RSSI return value: -19\n':
        output=-19
        print output
elif output == 'RSSI return value: -20\n':
        output=-20
        print output
elif output == 'RSSI return value: -21\n':
        output=-21
        print output	
elif output == 'RSSI return value: -22\n':
        output=-22
        print output
elif output == 'RSSI return value: -23\n':
        output=-23
        print output
elif output == 'RSSI return value: -24\n':
        output=-24
        print output
elif output == 'RSSI return value: -25\n':
        output=-25
        print output
elif output == 'RSSI return value: -26\n':
        output=-26
        print output
elif output == 'RSSI return value: -27\n':
        output=-27
        print output
elif output == 'RSSI return value: -28\n':
        output=-28
        print output
elif output == 'RSSI return value: -29\n':
        output=-29
        print output
elif output == 'RSSI return value: -30\n':
        output=-30
        print output
elif output == 'RSSI return value: -31\n':
        output=-31
        print output
elif output == 'RSSI return value: -32\n':
        output=-32
        print output
elif output == 'RSSI return value: -33\n':
        output=-33
        print output
elif output == 'RSSI return value: -34\n':
        output=-34
        print output
elif output == 'RSSI return value: -35\n':
        output=-35
        print output
elif output == 'RSSI return value: -36\n':
        output=-36
        print output

5. Conclusion

Mon petit doigt me dit que la conclusion va être assez similaire chez chacun, je partirais sur un modèle 'Je suis content de ce que j'ai pû faire...blablabla....mais j'ai manqué de temps pour faire ce que je pensais au début .... blablabla... c'est pourquoi je vais apprendre de mes erreurs et ne les reproduira pas pour le projet p.'&&&

Je vais l'avouer c'est pareil pour moi, mais ce projet m'a vraiment fait plaisir, j'ai aimé me plonger à fond dans ce projet les weekends, j'ai appris pleins de trucs utiles et me réjouis de ce prochain projet.
DSC00995.JPG