Tixlegeek's DevBlog Code, Gringo, Silicium

qrcode

[publiphone] Partie III: Hacking

Salutations!

publiphone 1

Aujourd'hui, je vous parle de l'avancement de la transformation du PUBLIPHONE! C'est la partie 3, et, il y a des choses à dire.

Petit rappel

Ça fait tellement longtemps que cet article est en cour d'écriture, qu'un petit rafraichissement de la situation ne fera de mal à personne! (moi y compris)

Il y a quelques années, je vous présentais mon projet de transformation de publiphone. Des publiphones, ce sont les téléphones publics qui permettaient de passer des appels avant la démocratisation des téléphones-mobiles. Il y en a de plein de types, d'époques, et de marque différentes... le mien est un PL3GeM de 1998.

Le plan, c'est d'en faire un objet cyberpunk en hommage à la culture du hack, et d'y coller tous mes stickers de sécu 👨‍💻

Un cimetière de publiphones. Je les aurai bien tous adoptés. un PL3GeM (photo de https://publiphonie.monsite-orange.fr ) Mon publiphone, avant autopsie & modifications

En suite, je vous avait emmené avec moi dans l'aventure de l'autopsie, l'archivage, et le Reverse-engineering du publiphone.

Et maintenant, il est temps de vous montrer les modifications apportées, et ou j'en suis!

Guts&brain

Vous avez pu le voir dans le précédent article Réutiliser l'électronique interne s'est avéré plutot complexe. Le fait que le tout soit très spécifique, avec de l'électronique calibrée y est pour beaucoup. Je me suis pas mal creusé la tête, et j'ai du faire un paquet de concessions pour mettre en place ma vision.

Le cahier des charges est plutot simple:

  • Faire fonctionner l'écran
  • Faire fonctionner le clavier
  • Permettre l'utilisation du capteur qui permet de savoir quand le combiné est raccroché
  • Ajouter des Leds pour que ça soit joli \o/
Le tout, accessible via une interface controlable via une liaison série. Pourquoi série? Pourquoi pas.

Mon plan, c'est d'y fourrer un point d'accès WiFi sous OpenWRT et de coder un package OpenWRT qui pourra controler l'interface entant que service, mais, on verra ça dans l'article d'après.

publiphone 1

L'écran LCD

L'écran LCD a été plutot décevant. Sa référence exacte (DMC507093N) est introuvable sur les internets, et son layout (la façon dont les caractères sont arrangés sur la matrice) n'est pas courant.

publiphone 1

Les composants qui gèrent la matrice LCD sont sous forme de COBs non-marqués, mais le pinout à l'air de correspondre à n'importe quel hd44780. J'ai donc décidé de tester diverses méthodes (8bit, 4bit, alternatives...), et finalement, impossible à réutiliser en l'état; je n'ai rien réussi à en tirer. 😥

Du coup, j'ai décidé de changer l'écran. Pas facile non-plus: Ses dimensions ne sont pas vraiment courantes, et, la façon avec laquelle il est emboité dans le chassis ne laisse que peu d'options. J'ai fini par trouver un modèle de LCD aux dimensions proches de l'original, mais, uniquement en 2x16 caractères. Dommage!

Le LCD de remplacement sera donc un NHD-0216S3Z, LCD alphanumérique 2x16 à commande série. Il ne remplit pas tout à fait la zone visible, et j'ai du faire un peu de place dans le cache en plastique, mais, j'ai fini par obtenir un résultat satisfaisant:

publiphone 1 publiphone 1

Le controle série offre plusieurs avantages, le premier étant d'économiser les I/Os nécessaires à son controle.

Franchement, le résultat n'est pas dégueulasse!

publiphone 1

Le clavier

Le clavier, c'était ma grosse frustration. En effet, je pensait tomber sur un module indépendant; une matrice, que j'aurai pu controler de façon externe... Au lieu de ça, je suis tombé sur un système "Pouetpouet" directement collé au PCB principal. Du coup, j'ai re-gravé un PCB cousu-main pour pouvoir l'utiliser. Le processus est le suivant:

  • Déterminer la position de chaque pouet
  • Déterminer la taille minimale du PCB
  • Dessiner les différents points de contact sur de la bakélite des années 70 avec un marqueur indélébile
  • Graver le tout dans du perchlorure de fer

Bien entendu, chacun ses préférences sur la technique, les matériaux, ou la chimie. Pour ma part, c'est ma méthode rapide et pas cher pour faire des trucs rapidos quand je n'ai pas besoin d'une précision extrème.

publiphone clavier fabrication publiphone clavier fabrication publiphone clavier fabrication publiphone clavier fabrication

Le but ici, c'est juste de fournir des contacts conducteurs sur lesquels appuieront les petits pouets.

J'ai arrangé le tout de manière à pouvoir contrôler le clavier à la manière d'une matrice, sans diodes (une seule touche à la fois) et je pense qu'un jour de courage, je referai cette partie.

publiphone clavier intérieur publiphone clavier intérieur publiphone clavier intérieur

Comme ma bakélite des années 70 est plutot souple, je l'ai renforcée à l'aide d'un plateau en aluminium de 1mm d'épais. Le tout est monté à l'aide des visses originales, a l'arrière du plastique.

finalement, toutes les touches fonctionnent plus ou moins. Le 0 à tendance à être dur, mais, pour le moment ce n'est pas grave.

Les LEDs

Un publiphone cyberpunk ne serait pas complet sans quelque LEDs RGB. Pour remédier à ça, j'ai intégré quatre WS2812 en dessous du LCD. Les WS2812 seront controlée par l'interface.

Hack the planet!

Parler à l'interface

Pour controler l'interface, j'ai étendu le set de commande de l'afficheur LCD. En effet, l'afficheur dispose d'un jeu d'instruction permettant de le controler. Ces instructions sont au format suivant: 0xFE 0xYY [ 0xZZ ... ] Par exemple, si je branche l'afficheur LCD à un port série sur une machine linux, je pourrai faire ceci:

  echo -ne "\xFE\x41" > /dev/ttyUSB0 # Alume l'écran
  echo -ne "\xFE\x46" > /dev/ttyUSB0 # Met le curseur en position 0,0
  echo -ne "\xFE\x4B" > /dev/ttyUSB0 # Active le curseur clignottant
  echo -ne "\xFE\x51" > /dev/ttyUSB0 # Efface l'écran
  echo -ne "Hack the planet!" > /dev/ttyUSB0 # Affiche du texte sur l'écran

Basiquement, chaque commande commence par 0xFE, puis chaque commande est représentée par un octet envoyé à la suite (plus ses arguments s'il y en a).

Commandes LCD

Du coup j'ai décidé d'étendre ce système, et de faire en sorte que l'interface se comporte comme un proxy entre le controleur et l'écran, en ajoutant ses propres commandes, permettant de controler tous les autres périphériques. Par exemple, pour alumer la led n°1 en rouge, il faut utiliser le code B1, suivi de trois arguments (=trois octets) correspondant à la valeur RGB de la couleur.


    echo -ne "\xFE\xB1\xFF\x00\x00" > /dev/ttyUSB0 # Alume la première led en rouge
    echo -ne "\xFE\xB1\x00\xFF\x00" > /dev/ttyUSB0 # Alume la première led en vert
    echo -ne "\xFE\xB1\x00\x00\xFF" > /dev/ttyUSB0 # Alume la première led en bleu
  

L'interface retransmet également la valeur des boutons pressés sur le clavier, comme un périphérique normal. Ça permettra d'utiliser le clavier facilement dans une application.

L'interface

On a vu comment on allait parler à l'interface, mais pas à quoi elle ressemble!

J'ai porté mon choix sur une carte arduino nano pour laquelle j'ai écrit un programme en C (parce qu'arduino ça pue, ça ne me plaît pas, voilà vous savez tout). Ce programme fait exactement ce que j'ai décrit plus haut: Il prend les entrées sur le port série physique; si le premier caractère est une commande (0xFE), il regarde quelle partie elle concerne, et retransmet à l'écran si la commande est une commande du LCD, ou la traite si c'est une commande à lui.

Interface Serie

Le clavier est lu à chaque passage dans la boucle, et si une touche est pressée, son code est envoyé sur le port série principal.

Le cerveau

Bah, oui, le cerveau; c'est important. Comme le cerveau de base s'est avéré trop limité, j'ai décidé de le changer lui aussi.

Spoiler: maintenant le publiphone tourne sous GNU/Linux OpenWRT. Et oui! Maintenant, le publiphone diffuse le WiFi et tourne sous linux! Autant dire que j'en suis plutot fier.

Pour faire ça, j'ai utilisé un petit point d'accès très cool et pas cher, que j'utilise très souvent pour ce genre de choses: Le GL-inet AR300M. Ce sont de tout petits points d'accès WiFi très sympas dont les sources sont ouvertes, et dont l'OS est un OpenWRT un peu bricolé. Il n'est pas cher et dispose d'un rapport qualité/prix très intéressant.

Interface Serie

J'ai compilé une version d'OpenWRT Custom en me basant sur le repo mis à disposition par GL-Inet (GitHub). Ce repo OpenWrt intègre une target de compilation spécifique pour ce modèle de routeur, et ça me permet de générer la toolchain qui m'a été utile pour compiler mon gestionnaire d'interface par le suite.

La partie compilation est complètement triviale, et j'ai juste ajouté quelque drivers, en particulier le package kmod-usb-serial-ftdi qui permet de gérer la liaison série avec l'Arduino (💩) (chose qu'on peut faire depuis l'UI openWrt ou via Opkg)

Je vous donnerai tous les détails bientôt.

Et voilà pour aujourd'hui!

Je crois vous avoir tout dit concernant le remplacement des périphériques. Comme vous pouvez le voir, tout à été changé ou presque. Dans l'article suivant, je vous parlerai un peu plus en détails de la partie controle, et vous donnerai quelques schémas explicatifs. Pour le moment, je vous laisse avec quelque photos. J'ai encore des tas de choses à faire, desquelles je vais vous parler encore un peu plus tard.

L'intérieur du publiphone une fois modifié Le publiphone une fois modifié. Le publiphone une fois modifié.

Bon, j'arrète là. J'ai plein de plans, et il faudra que je vous en parle. En attendant...

hpphckng!