Reappropriation of a rotary phone with the help of an Arduino through a workshop at Gobelin, l'école de l'image.
By Mathis Biabiany and Jérémie Boulay.
Nous souhaitons redonner vie à un téléphone à cadran en détournant ses anciennes fonctionnalités pour leur en donner de nouvelles plus dans l'air du temps.
Notre but est de pouvoir connecter notre téléphone à une application logiciel afin d'associer un chiffre du téléphone à l'un des services proposés par l'application.
- Traduire une phrase dans plusieurs langues
- Afficher la météo
- Mettre en veille l'ordinateur
- Ajouter une tache à une toDoList
- Ouvrir une application (commande vocale)
- Faire une recherche (commande vocale)
- Envoyé un tweet (commande volace)
- Activer/Désactiver la Wifi
- Allumer/Eteindre un object connecté (lampe)
- Faire une capture d'écran
- Prendre une photo avec sa webcam
- ...
Fiche produit & Mode d'emploi.
Le cadran est composé de deux interrupteurs qui ouvrent et ferment la ligne afin de donner différentes informations :
-
L'interrupteur lié au circuit bleu se ferme lorsque l'on commence à composer un numéro et que l'on quitte la position initiale.
-
L'interrupteur lié au circuit rouge fournit des impulsions lorsque le cadran est relaché en s'ouvrant et se refermant n fois en fonction du chiffre composé.
Il est donc possible à l'aide de ces deux signaux de récuperer via l'Arduino le numéro composé.
Mais le signal permettant de définir le numéro composé n'est pas net et donne un signal légèrement différent à chaque fois. Par exemple pour le "4", nous pouvions avoir :
010101011
0110100011
Nous avons donc récupéré le signal analogique pour l'analyser et compter uniquement ses changements d'état grâce à un attachInterrupt
. Ce qui nous a permis d'ommettre les aléas du signal capté et de pouvoir compter le nombre de césures dans le signal.
Au final, nous avons utilisé la librairie RotoPhone écrite par Arthur Rob afin d'avoir un projet bien segmenté.
En regardant le schéma de cablage du téléphone et grâce à un script arduino & cablage simple, nous avons pu détecter deux points sur lesquels il était possible de se brancher pour utiliser le mécanisme du combiné comme un simple interrupteur.
Malheureusement, le changement d'état n'était pas net et produisait un signal avec des interférences telles que :
0000000000001100101011100111111111111111111
Ce qui rend impossible l'utilisation de la fonction attachInterrupt
. Il a donc fallu utiliser la méthode debounce afin d'être sûr qu'un changement d'état s'oppère réellement avant de le valider.
...
pinState = digitalRead(3);
if( lastPinState != pinState ) {
lastPinState = pinState;
_startTimePinChange = millis();
_pickChanged = true;
}
if(_pickChanged){
if(millis() - _startTimePinChange > 100){
isPick = lastPinState;
_pickChanged = false;
}
}
return isPick;
...
Nous avons ensuite ajouté cette fonctionnalité à la librairie RotoPhone afin de la rendre compatible avec la capture du signal.
Afin de tester le haut parleur du téléphone, nous avons dans un premier temps juste fait passer un courant alternatif dans celui-ci.
Le signal étant satisfaisant (bip continu suffisament audible), à l'aide du shield audio d'arduino, nous avons essayé de jouer une piste audio via le haut parleur. Et une fois les deux cables du combiné lié à une prise jack, nous avons pu tester le haut parleur directement lié à l'arduino.
Et le résultat était très satisfaisant ! Grâce à la prise jack, le combiné peut être branché à n'importe quel appareil produisant du son.
De ce fait, nous avons décidé de garder le haut parleur de base du combiné pour notre projet.
Après avoir branché le microphone en série à une pin analogique de l'arduino (voir code ici), nous avons pu visualiser le signal envoyé. Nous pouvons en conclure que le micro peut être utilisé même si un amplificateur doit sûrement être ajouté au montage.
L'application Desktop à été faite avec Electron afin d'avoir une application Mac OSX et React pour les views.
Celle-ci se connecte en web socket au serveur node.js intégré à notre Raspberry afin d'écouter les actions réalisées sur le téléphone. (voir le montage avec la raspberry).
Pour ce qui est de la gestion du son du téléphone, la capture du son se fait via le module node.js say.Js qui est donc intégré à la rapsberry et qui convertit en texte ce que l'on dit et inversement.
Il a donc été possible de jouer du texte écrit en son via l'enceinte du combiné.
Malheureusement, pour ce qui est de microphone, nous n'avons pas eu le temps de le faire reconnaitre par la raspberry. Nous l'avons donc remplacé temporairement par le micro de l'ordinateur qui s'occupe de la capture avec le module google SpeatchRecognition.
La fonctionnalité de traduction utilise l'API de MyMemory pour traduire ce que l'on dit via le combiné dans la langue voulue avant de retourner le résultat au combiné après quelques secondes.
TODO - mettre photo de la fonction
A l'aide de http://forecast.io/ nous avons pu ajouté la météo dans nos fonctionnalités
TODO - mettre photo de la fonction
Mise en veille, activation/désactivation de la wifi... Ces fonctionnalités sont des commandes exécutées par Electron.
Lors du cablage, il nous a fallu assembler le cablage du rotor ainsi que celui du combiné. Ceci a posé des problèmes d'interférences lors de l'utilisation du rotor. Lors de la composition d'un numéro, le signal du combiné était perturbé et indiquait donc que le combiné était raccroché/décroché plusieurs fois.
Il a donc fallu mettre le cablage du combiné en INPUT_PULLUP afin d'avoir deux cablages séparés.
Voici le code téléversé dans l'arduino. Celui-ci utilise la méthode Serial.println()
afin d'envoyer des données au serveur. Voici les données envoyées au serveur :
- 0 à 9 (Numérotation)
- 10 (Pick UP / Décroché)
- 20 (Hang UP / Raccroché)
La carte Arduino est lié au Raspberry via USB qui elle-même est alimentée via un cable microUSB.
Grâce au serveur Node.js
intégré et à la librairie SerialPort
il est possible d'écouté l'Arduino comme dit précedemment.
C'est grâce à ce serveur que l'application Descktop peut communiquer avec les fonctionnalités du téléphone via internet (cable ethernet OU clé wifi). Il a fallut faire un script de lancement pour que la raspberry puisse lancer automatiquement le serveur node.js.
Enfin, la raspberry contrôle aussi le combiné. Elle émet via la prise jack le son et capture le signal du microphone via les pins de la carte (l'Arduino n'étant pas assez puissante pour gèrer ces données).
Quelques problèmes rencontrés :
SerialPort
ne fonctionne pas avecNode.js 4.0.0
. Il a fallu rétrograder à la version0.12.6
.- La carte SD de la raspberry n'ayant pas beaucoup de stockage, il a fallu supprimer la version graphique de rasbian et optimiser notre projet.
Afin de faire tenir l'arduino et la Raspberry dans la coque du téléphone, il a fallut déssouder les composants du téléphone inutile.
Nous avons aussi enlevé le cablage inutile afin de faire sortir uniquement du téléphone le cable USB et (potentiellement) le cable Ethernet de la Raspberry.
L'application Desktop à été faite avec Electron afin d'avoir une application native IOS et React pour les view.
Celle-ci se connecte en web socket au serveur node.js intégré à notre Raspberry afin d'écouter les actions réalisées sur le téléphone. (voir le montage avec la raspberry).
La capture du son se fait via le module node.js say.Js qui est donc intégré à la rapsberry et qui convertit en texte ce que l'on dit et inversement.
Il a donc été possible de jouer du texte écrit en son via l'enceinte du combiné.
Malheureusement, pour ce qui est de microphone, nous n'avons pas eu le temps de le faire reconnaitre par la raspberry. Nous l'avons donc remplacé temporairement par le micro de l'ordinateur qui s'occupe de la capture avec le module google SpeatchRecognition.
La fonctionnalitée de traduction utilise l'API de MyMemory pour traduire ce que l'on dit via le combiné dans la langue voulue avant de retourner le résultat au combiné après quelques secondes.
A l'aide de http://forecast.io/ nous avons pu ajouté la météo dans nos fonctionnalités
Mise en veille, activation/desactivation de la wifi, ouverture des applications de l'ordinateur, capture d'écran...
Ces fonctionnalités sont des commandes shells
exécutées grâce à un serveur node.js en localhost lancée par l'application. L'application peut donc interragir avec l'ordinateur de cette façon.
Il suffit de brancher le cable USB et Ethernet du téléphone à l'ordinateur et de lancer l'application Desktop.
Ensuite, composer un numéro pour lancer une action de l'application et suivre les instructions.
Après quelques tests utilisateurs, il apparait que le concept est très bien accueilli. Ludique, pratique, chacun aurait aimé pouvoir s'approprier les fonctionnalitées et les personnalisers. Par exemple on nous a proposer d'ajouter des raccourcis pour les sites tel que facebook, tweeter... ou même de sortir du cadre de l'ordinateur et d'étendre les fonctionnalitées aux objects connectés.
Il manque cependant d'autres fonctionnalités utilisant le son ainsi que des fonction activables/désactivables avec le même bouton (par exemple la mise en veille de l'ordi qui ce rallume avec le même bouton).
Il manque aussi une interface claire et précise proposant de manipuler les fonctionnalitées et d'afficher les actions à réaliser plus clairement afin d'améliorer l'expérence utilisateur.