1. Introduction

Les téléphones portables d’aujourd’hui se chargent à une vitesse incroyable. C’est d’ailleurs un des arguments majeurs de vente pour les entreprises comme Google qui ont sur le marché un Smartphone qui se charge en 15 minutes. En théorie, une fois chargé, nous devrions débrancher le chargeur afin que celui-ci ne se surcharge. Le problème est que lorsque que nous le mettons à chargé avant de se coucher, il se charge rapidement et ensuite il est alimenté inutilement durant une bonne partie de notre sommeil. L’idée m’est venue de créer un chargeur qui serait capable de savoir lorsque que le téléphone est entièrement alimenté et que celui-ci cesse l’alimentation au téléphone. Ce projet consistera à contrôlé un relais à l’aide d’un raspberry pi qui décidera de la variation d’alimentation au téléphone.

2. Matériel et méthodes

2.1 Matériel

- un raspberry pi 3 - un breadboard - cable élécrtique - un relais (10A 250V) - un chargeur de téléphone (câble et adaptateur) - une pince - une pince a dénudé - un câble d’alimentation - un téléphone

2.2 Méthode

Plusieurs étapes ont été nécessaires à la réalisation de ce projet.

2.2.1

La première étape, consiste à allumer le raspberry pi (rp) et savoir comment l’utiliser. Pour se faire, j’ai commencé par brancher une souris, un clavier, et un écran au rp et ensuite je l’ai alimenté. Je l’ai connecté au Wi-Fi et je lui ai rajouté le breadboard. Après quelques recherches j’ai trouvé plusieurs programmes écrits en python qui proposait des circuits électriques basiques permettant de se familiariser avec toute l’électronique du rp. J’ai simplement copié les codes et reproduit le circuit. Cela m’a beaucoup aidé afin de comprendre les concepts majeurs de python comme les modules et les commandes utilisées. Voici le programme dont je me suis inspiré.

Ce programme permet de faire clignoter une lampe a intervalle régulier à choix. Dans ce programme, il suffit de savoir gérer uniquement une seule pin GPIO (general purpose input output) et en l’occurrence dans cet exemple c’est la pin 23 dont je prends contrôle. La pin 23 est réglée en sortie et c’est par cette sortie que le courant va être envoyé ou non. Ici ils ont fait une boucle infinie grâce au while et il décide d’attribuer la tension HIGH pendant une seconde et ensuite LOW à nouveau pendant une seconde et ceci à l’infini. Un programme relativement simple mais qui permet de bien illustrer et de comprendre les concepts utilisés qui seront nécessaire par la suite.

2.2.2

La deuxième étape s’agit de faire de même mais à l’aide d’un relais. Pour se faire, il suffit de faire passer l’alimentation de la led par le relais car c’est lui qui va décider de donner ou non du courant. Le relais est sous no ‘normally open’ c’est-à-dire que le courant ne passe pas lorsque le relais n’est pas alimenté. Dans le code suivant, j’ai décidé de faire une sorte de timer qui allume la led pendant 10 secondes et ensuite qui l’éteint grâce au relais. Par la suite, je remplacerais le timer par un programme qui détectera lorsque la batterie du téléphone sera chargée.

2.2.3

Pour cette troisième étape, il m’a fallu lire la batterie du téléphone depuis le téléphone grâce a un programme. Pour se faire, j’ai d’abord eu l’idée de télécharger une application qui m’envoie une notification lorsque la batterie est chargée et j’aurais plus qu’à lire la notification afin de connaître le niveau de la batterie. Mais ce n’est pas le but de mon projet. J’ai ensuite vu qu’il était possible de se balader dans le terminal du téléphone. L’applicatoin ‘Terminus’ permet de se mettre sur le terminal local du téléphone. J’ai ensuite trouvé la commande acpi –b qui permet de lire la valeur de la batterie depuis le terminal. Il faut pouvoir lire et récupérer cette valeur en continu. Je suis obligé de passer par un programme ou une application qui tourne sur mon téléphone et qui serait capable de récupérer la valeur de la batterie. Il existe une version de python pour android. Cette application ‘QPython’ permet de rédiger un code en python exactement comme sur un ordinateur mais qui agit sur le téléphone. Etant donné que l’application est relativement récente, j’ai pu trouver très peu d’information concernant l’écriture d’un code sur celle-ci. Je n’ai pas trouvé tout de suite les fonctions qui m’intéressaient. C’est seulement après avoir analyser et essayer de comprendre les quelques codes qui se trouvait sur l’application par défaut que j’ai repéré un module qui était présent dans chaque code. Le module sl4a (scritping layer for andoird) est en effet la clé pour pouvoir appeler quasiment n’importe quel paramètre du téléphone.

L’API (application processing interface) batteryGetLevel permet de voir le niveau de la batterie le plus récent. Lorsque j’ai demandé a mon programme de me printer la valeur de la batterie l’API me répondait à chaque fois ‘None’. C’est uniquement après une vingtaine d’essai qu’une valeur est apparue. On m’a alors conseiller de faire une boucle qui imprime le niveau de la batterie que lorsque batterieGetLevel trouvait une valeur. J’ai ensuite décidé de recevoir une valeur toutes les 5 min et d’arrêter le programme lorsque le niveau de la batterie était égale à 100%.

2.2.4

La quatrième étape est de trouver un moyen de connecter les deux appareils. J'ai télécharger l'application 'Moblie SSH' pour me connecter à mon rp depuis on téléphone. J'étais capable de lancer des programmes python sur mon rp depuis le téléphone mais j'ai rapidement compris que cela me servait a rien. Il a fallu connecté le téléphone avec le rp grâce au bluetooth et toujours dans le programme python se trouvant sur le téléphone. Après plusieurs recherches sur quel API utilisé afin de se connecter à un autre appareil, je suis tombé sur ce tableau :

Le problème suivant est de savoir comment utilisé correctement ces API. Pour pouvoir connecté un appareil à un autre, il faut utilisé l’API bluetoothConnect . J’ai essayé ensuite de mettre la MAC (media Access Control) address du raspberry mais je n’ai toujours pas réussi à me connecter. Je me suis aperçu qu’il faut aussi rajouter le Universally Unique Identifier (UUID). Cette suite de chiffre '00001101-0000-1000-8000-00805F9B34FB' va dire qu’il faut qu’il s’adresse à une adresse Bluetooth. Jusque là, j’ai réussi à établir une connexion entre les deux appareils. Sauf que, la connexion durait seulement quelques secondes. Je me suis alors dit qu’il fallait donner un ordre à exécuter dans ce lapse de temps comme un print(), mais je n’ai trouvé aucune solution afin de faire durer cette connexion plus longtemps. Il me semble que la connexion bluetooth à ces propres caractéristiques et je n’ai pas réussi à trouver l’astuce qui me permettrais de garder cette connexion.

2.2.5

L’étape suivante aurait été de faire passer un message via cette connexion bluetooth et de dire au rp quand la batterie serait pleine. Lorsque je me connecte au rp depuis le programme sur mon téléphone ceci s’affiche dans le terminal du rp en mode bluetooth :

le rp accepte la connexion avec le téléphone mais ensuite après environ 5 secondes il rejette le téléphone. Lorsque j’ai vu que j’arrivais à obtenir une information (ici la connexion avec le téléphone) sur le terminal je me suis dis que si j’arrivais à lire cette information grâce au programme qui tournerait sur mon rp le programme pourra alors décidé l’alimentation du relais. J’ai ensuite cherché comment prendre contrôle du terminal avec un programme python et le module os accompagné de sa fonction ‘os.system’ permet d’écrire des commandes dans le terminal grâce à un programme python.

Cette commande me permet de me mettre dans le mode bluetooth et de lire la connexion avec le téléphone.

2.2.6

Finalement, la dernière étape consisterais à mettre en lien le programme python du téléphone et celui du rp. L’élément manquant à mon projet est de savoir comment lire une information sur le terminal grâce à python. Si j’avais cette information en poche, voilà comment j’aurais procédé :

Tout d'abord il faut lancer le programme sur le rp et cela pourquoi pas grâce a une connexion SSH. Ensuite lorsque je connecte mon téléphone avec mon rp, le rp reçoit ‘yes’ ensuite ‘no’ j’utiliserais la dernière information c’est-à-dire ‘no’ pour dire au rp de commencer l’alimentation du relais. Ensuite le programme python du téléphone récolterais le niveaux de la batterie du téléphone et une fois que le téléphone est a 100% il renvoi une demande de connexion exactement comme la première et le rp va recevoir un ‘yes’ suivit d’un ‘no’ et j’utiliserais le ‘yes’ pour dire de couper l’alimentation du relais car il apparaît en premier.

((https://oci.gyre.ch/blog/public/1718/.c91ee80b-43e4-4927-8867-b32ee767a481_m.jpg| |C)) Voilà le système final, je l'ai essayer avec un timer de 10 secondes et mon circuit est opérationnel.

3. Résultats

Il me reste plus que le programme que je dois encore résoudre mais le circuit physique qui alimente le téléphone est fonctionnel.

4. Discussion

Ce projet m'a prit énormément de temps car la recherche d'information et toute la documentation à lire n'en finit pas. Je suis parti de zéro, que ce soit en programmation avec python ou en manipulation avec le raspberry pi, mais je suis très content du résultat obtenu avec les connaissances que j'ai acquise durant ce projet. Je ne vais pas le caché, c'était une constante galère de trouver des informations concernant le scripting layer for android (sl4a) et je pense que c'est ce qui m'a pris le plus de temps. La nature du code qui tourne sur le téléphone n'est pas très complexe en soit. Par contre le plus compliqué est de savoir quel API utilisé au bon moment et pour cela j'ai passer des heures à tester des codes qui ne fonctionnaient pas et ensuite trouver la solution pour après devoir refaire le même processus pour chaque nouveau API. J'avançais à pas de fourmis et c'était très décourageant. Mais grâce à ce processus j'ai appris beaucoup plus de choses que je n'aurais imaginé au début. Je pense que si j'avais trouvé un moyen de lire une valeur dans le terminal j'aurais pu réaliser mon projet. Pour me débarrasser de ma frustration personnelle je vais continuer à chercher une solution pour ce projet. De plus, j'estime avoir bien séparer les différentes étapes qui ont servis à la réalisation partielle de mon projet. Les points sur lesquels j'aurais pu m'améliorer sont surtout situé par rapport à la rédaction du rapport et à une prise de note plus fréquente.

5. Conclusion

Le but n'a peut être pas été atteint mais je suis très content d'être arrivé au résultat que j'ai obtenu. Je me suis rapidement rendu compte que la recherche prenait beaucoup plus de temps que prévu et il est important de bien cibler ce qu'il faut rechercher. J'ai aussi acquis beaucoup de connaissance qui me seront très utiles pour mes futurs projets. J'ai appris a trouver des alternatives aux problèmes que j'ai du faire face et continuer a chercher malgré beaucoup d'échec. Un autre point important est de bien segmenter son projet afin d'avoir plusieurs petit projet qui sont plus facilement réalisable. Pour manger un éléphant il est préférable de le couper en petit morceau.

Références

http://www.framboise314.fr/la-saga-blink-un-raspberry-pour-faire-clignoter-une-led/#Programme https://stackoverflow.com/questions/11770594/using-sl4a-python-and-bluetooth