- Pour réduire l’habitude de faire défiler sans fin les actualités sur téléphone et les réseaux sociaux chaque matin, une imprimante matricielle imprime chaque jour une première page papier personnalisée
- La configuration reste simple : Star NP-10, Raspberry Pi Zero W, adaptateur port parallèle-USB et alimentation ; sur le Pi, l’imprimante est traitée comme le périphérique
/dev/usb/lp0
- Les anciennes imprimantes n’acceptent pas l’Unicode standard, mais un jeu de caractères limité proche de Code Page 437 ; en PHP, des valeurs hexadécimales sont envoyées directement pour imprimer lignes, cadres et symbole de température
- Les données proviennent de Open-Meteo, twelvedata, NYTimes et Reddit JSON, puis la météo, les actions, les titres d’actualité et les publications Reddit sont formatés pour tenir dans la largeur du papier
- Une tâche cron l’exécute automatiquement chaque jour vers 8 h ; une seule feuille d’actualité finie remplace le défilement infini des sites web et des apps
Créer une première page papier plutôt qu’un écran
- L’objectif était de réduire l’habitude d’ouvrir son téléphone le matin et de faire défiler plusieurs sites d’actualité et réseaux sociaux, tout en restant informé
- La solution consiste à utiliser une imprimante matricielle achetée sur eBay pour imprimer chaque jour une première page personnalisée
- Le code source complet est publié dans le repo GitHub
Choix du matériel et connexion
- Les composants nécessaires sont relativement simples
- L’imprimante utilisée est une Star NP-10, qui semble dater du milieu des années 1980
- Toute imprimante matricielle dotée d’un port parallèle a des chances de fonctionner
- Les prix habituels se situaient autour de 80 à 120 dollars, mais la mention « fonctionnement incertain » a permis de l’acheter environ moitié moins cher
- Après un peu de nettoyage et un réglage de la cartouche de ruban encreur, l’impression d’une page de test a réussi
- Le Raspberry Pi est connecté au WiFi, et relié au port parallèle de l’imprimante via l’adaptateur USB
- Après connexion au Pi via
ssh, l’imprimante a été détectée sur /dev/usb/lp0
Envoyer directement des données à l’imprimante
- Au départ, l’impression a été vérifiée en envoyant du texte brut directement depuis le shell
echo "Hello, world!" > /dev/usb/lp0
- Une erreur d’accès au fichier est apparue, contournée avec
chmod pour résoudre le problème de permissions
sudo chmod 666 /dev/usb/lp0
- Ensuite, le texte envoyé vers
/dev/usb/lp0 s’est imprimé sur l’imprimante
- En PHP, l’approche a été étendue en ouvrant le fichier de l’imprimante avec
fopen() puis en y écrivant du texte
- En essayant des phrases simples, des espaces et de l’art Unicode, il est apparu que la prise en charge des caractères de l’imprimante était limitée
Jeu de caractères de la Star NP-10
- Un manuel utilisateur scanné de la Star NP-10 a permis de comprendre le fonctionnement de l’imprimante
- Cette imprimante n’accepte qu’un jeu de caractères très précis
- Il est vaguement basé sur le Code Page 437 de l’IBM PC
- Il comprend les caractères alphanumériques standard ainsi que certains symboles spéciaux, lignes et caractères de cadre
- En PHP, on peut construire une chaîne à partir de valeurs hexadécimales et l’envoyer directement à l’imprimante
$horizontalDouble = "\xCD";
$deg = "\xF8";
echo str_repeat($horizontalDouble, 24);
echo '78' . $deg . 'F' . PHP_EOL;
- Cette méthode permet d’imprimer non seulement du texte ordinaire, mais aussi des caractères décoratifs comme des lignes, des cadres et le symbole de température
Données récupérées et API
- La première page personnelle contient quatre sections
- Météo
- Actions
- Principaux titres d’actualité
- Publications Reddit populaires
- Comme il s’agissait d’un projet expérimental, l’objectif était de limiter les coûts des données et d’utiliser si possible des API gratuites ; les API nécessaires ont été trouvées dans le dépôt public-apis, qui rassemble des API publiques gratuites
- Les sources de données utilisées sont les suivantes
- Open-Meteo : données météo, sans clé API
- twelvedata : données boursières, avec un niveau gratuit généreux
- NYTimes : titres d’actualité, avec un niveau gratuit suffisant pour le projet
- Reddit JSON : publications Reddit, gratuit mais nécessitant d’usurper le User-Agent
- Le script PHP récupère les payloads auprès de chaque endpoint d’API et fusionne uniquement les données nécessaires dans un grand tableau
- Seules certaines actions, certains types d’actualités et certaines publications de subreddit sont utilisés
- Si l’une des sections ne contient aucune donnée à afficher, le script s’arrête tôt et se relance plus tard
Méthode de filtrage des données d’actualité
- Les données NYTimes sont considérées comme un échec si la réponse de l’API ne contient pas
results
- Parmi les articles, seuls ceux qui remplissent les conditions suivantes sont retenus pour l’impression
type vaut Article
section est l’une de U.S., World, Weather, Arts
- L’article n’est ajouté que si le nombre maximal
MAXNEWS n’est pas encore atteint
NEWS, NEWSKEY et MAXNEWS sont définis comme constantes en haut du script afin de pouvoir être modifiés facilement
Format de sortie adapté au papier
- Plutôt que de simplement imprimer les titres de sections, une boîte encadrée est créée en haut avec la date du jour, le jour de la semaine et le nom de la première page
- La mise en page est calculée en partant du principe que la largeur de page de l’imprimante est de 80 caractères
- Caractères hexadécimaux
str_repeat
- Valeur fixe de largeur de page
- Les titres de section sont imprimés en combinant des caractères de ligne et du texte
str_repeat($horizontalSingle, 3) . " WEATHER " . str_repeat($horizontalSingle, (PAGEWIDTH - 9)) . "\n";
- La météo et les actions sont assez courtes pour être imprimées sur une seule ligne sans toucher les bords du papier
- Les titres d’actualité et les publications Reddit contiennent souvent de longs textes et nécessitent donc un traitement de retour à la ligne séparé
Gestion des retours à la ligne pour les textes longs
- L’imprimante peut automatiquement poursuivre les longues lignes sur la ligne suivante
- Toutefois, pour éviter qu’un mot soit coupé au milieu en passant à la ligne suivante, une fonction a été implémentée afin de découper les chaînes selon une longueur de ligne maximale
- La fonction
splitString() découpe les mots sur les espaces et renvoie un tableau dont chaque ligne ne dépasse pas PAGEWIDTH
- Si un mot isolé dépasse la longueur maximale, il est coupé
- Les publications Reddit sont écrites sur l’imprimante en parcourant le tableau de lignes renvoyé
foreach (splitString($redditPost) as $line) {
fwrite($printer, $line) . "\n";
}
Exécution automatique et expérience d’usage
- L’exécution manuelle est possible avec
php print.php
- En usage réel, l’automatisation passe par une tâche cron
- Chaque jour vers 8 h, la première page personnalisée est imprimée
- Il suffit ensuite de détacher la feuille imprimée et de la lire en buvant son café
- Les actualités finies, contenues sur une seule feuille de papier, paraissent préférables au défilement sans fin des sites web et des apps sociales
- Le processus consistant à relier un vieux matériel physique à des technologies récentes fait aussi partie du plaisir central du projet
1 commentaires
Commentaires sur Hacker News
J’ai essayé quelque chose de similaire avec une imprimante à reçus : une imprimante thermique USB pour reçus coûte environ 75 dollars et se pilote facilement en Python.
L’impression d’images et de QR codes est simple, et la découpe automatique permet de bien séparer les messages.
On peut aussi faire sonner la cloche interne pour s’en servir comme notification supplémentaire, et comme il y a une sortie pour piloter un tiroir-caisse, je pense essayer de la relier à quelque chose comme un éclairage.
Je l’ai configurée pour les e-mails et pour imprimer mon agenda chaque matin.
Avec des commandes physiques comme des boutons ou un lecteur NFC, l’interface fonctionne plutôt bien. Par exemple, on peut avoir une carte NFC pour imprimer l’agenda, une autre pour imprimer les e-mails non lus : on envoie une « commande » et on récupère une sortie imprimée.
C’est une façon amusante de réduire le temps passé devant un écran, même si, ironiquement, j’ai probablement passé plus de temps à coder et configurer tout ça que le temps d’écran économisé.
https://www.consumerreports.org/cro/news/2014/03/the-health-...
Je me suis posé la question aujourd’hui.
L’une des choses que fait cette personne consiste simplement à faire un echo vers
/dev/lp0, et autrefois c’est exactement comme ça qu’on procédait. On envoyait du texte dans l’interface et l’imprimante l’imprimait.Les imprimantes actuelles sont bien plus sophistiquées, mais elles restent des appareils avec un long héritage. Les premières imprimantes laser HP, elles aussi, imprimaient en Courier 10, 66 lignes par page, si on leur envoyait des données sur le câble. L’Apple LaserWriter, elle, était une imprimante PostScript dédiée, donc je ne pense pas que ça fonctionnait ainsi ; à la place, on lui envoyait du PostScript.
À mesure que les imprimantes ont évolué, le langage qu’on leur envoyait est devenu plus complexe, mais elles ont tout de même conservé une longue compatibilité ascendante.
Donc, si on branche aujourd’hui une imprimante USB à un ordinateur et qu’on fait
ls > /dev/usbXXX, est-ce que ça imprime encore ? Est-ce que ça marche toujours aussi simplement ?Si on envoie à une EPSON des codes d’échappement EPSON MX-80, est-ce que ça fonctionne encore ? Aucune des deux réponses ne me surprendrait, mais les imprimantes modernes sont pour moi de vraies boîtes noires, donc je me demande si quelqu’un sait.
Certains se souviennent peut-être aussi du plaisir de se battre pour que des rapports tombent correctement sur des formulaires NCR multiparties préimprimés.
/dev/de la manière décrite. En revanche, OS X dispose aussi delp, qu’on peut utiliser commeecho "Hello printer" | lp -d, et on peut trouver le nom aveclpstat -p.Testé sur une imprimante récente, et ça fonctionne effectivement.
printf 'hello\f' > /dev/usb/lp0printf 'hello\f' | nc -N $printer_ip 9100C’est avec une imprimante laser Brother, et un guide de programmation est lié à côté du manuel en ligne. Le langage est PCL, mais il n’est pas nécessaire d’en savoir beaucoup pour une sortie simple.
Les deux commandes ci-dessus n’utilisent pas CUPS. Comme indiqué dans d’autres commentaires, si l’on veut utiliser les exécutables
lp/lpr, il faut d’abord que l’imprimante soit enregistrée dans CUPS.Dans le cas de
ls >, l’imprimante attend des fins de ligne DOS.\nne fait que passer à la ligne suivante sans faire de « retour chariot », donc il faut passer parsed 's/$/\r/'ou utilisernc -C.En USB, on peut lancer plusieurs impressions pour constituer une page, et le papier ne sort pas tant qu’on n’a pas envoyé de saut de page. En TCP, la page est imprimée lorsque la connexion se ferme.
/dev/usblp0, et un simple envoi aveccatfonctionnait.Les clients qui achètent ce type de produit neuf veulent sans doute qu’il reste compatible avec les processus qu’ils utilisent depuis 30 à 50 ans ; comme on pouvait s’y attendre, elle prend donc en charge ESC/P 2, ainsi que les codes d’échappement IBM. C’était surprenant, car les anciennes imprimantes matricielles que j’utilisais dans les années 90 ne semblaient pas prendre en charge les codes IBM.
Plus étonnant encore : mon MacBook avait un pilote intégré pour les imprimantes Epson génériques, et il fonctionnait. La qualité n’était pas terrible et l’impression se faisait en mode graphique, mais il était bien là.
Je ne sais pas trop pour les imprimantes jet d’encre et laser récentes. Une imprimante jet d’encre Epson que j’utilisais il y a une vingtaine d’années prenait en charge les codes ESC/P bruts.
https://retrohacker.substack.com/p/bye-cups-printing-with-ne...
L’une des erreurs utilisateur fréquentes était que, quand quelqu’un essayait d’imprimer un document Word, du PostScript était envoyé à l’imprimante matricielle, qui l’imprimait fidèlement tel quel, sous forme de source PostScript, gaspillant papier et ruban jusqu’à ce que quelqu’un l’arrête.
Les imprimantes matricielles peuvent faire pas mal de choses selon les modèles : changement de police, gras, souligné, parfois italique, caractères en double largeur/hauteur, et même des graphismes. Cela dit, les graphismes sont généralement à une résolution assez faible, du genre 90 ou 180 DPI.
Il y a longtemps, pour quelque chose qui ressemblait à un jeu d’escape room, j’avais fabriqué une boîte équipée uniquement d’un connecteur d’imprimante parallèle. Une fois branchée à l’imprimante, elle récupérait une alimentation parasite sur l’une des lignes de contrôle du port parallèle, et un minuscule microcontrôleur PIC n’utilisait que quelques centaines de µA pour envoyer des indices à l’imprimante.
Au départ, il exploitait le mode graphique haute résolution des imprimantes matricielles Epson. Ces imprimantes permettaient un micro-ajustement du rouleau d’entraînement aussi fin qu’un tiers de l’écartement entre les aiguilles de la tête d’impression, ce qui donnait une résolution verticale trois fois supérieure à ce que la tête seule permettait.
Fancy Font rendait le texte sur l’ordinateur puis l’envoyait sous forme de graphismes dans ce mode haute résolution spécial, produisant avec du matériel domestique du début des années 1980 un résultat aussi proche que possible de la composition typographique.
Les versions ultérieures avaient aussi des pilotes pour les premières imprimantes laser comme la HP LaserJet d’origine, mais avec l’arrivée du Mac, l’avenir de ce genre de système était tout tracé.
En revanche, le papier ressortait fortement gondolé. J’ai encore l’imprimante, mais je ne sais pas où trouver un ruban 4 couleurs.
figletdans un terminal : de l’art ASCII. Peut-être qu’elles prennent encore en charge l’impression.Peut-être que j’essaierai dans une version 2.0.
J’ai laissé cette machine connectée à un flux d’actualité pendant plusieurs années.[1] C’est le mécanisme d’une imprimante à bande Teletype Model 14 ; elle est toujours dans mon salon, et la bande se déverse dans un panier en fil métallique.
Elle est pilotée par un programme Python sur un vieux subnotebook EeePC.
[1] https://aetherltd.com/refurbishing14.html
Entendre à nouveau le nom EeePC m’a aussi rendu très nostalgique.
Ça ressemble à une vraie excellente idée de produit. Recevoir chaque matin un flux d’actualité personnalisé, et pas un truc à la MSN mais un vrai flux d’infos hors écran choisi par moi, c’est une idée très séduisante.
Et si, en plus, le réveil pouvait être remplacé par une imprimante matricielle, ce serait encore mieux.
Modifier le PHP pour l’adapter à mes sources d’actualité serait facile, mais je ne saurais pas par où commencer seul côté matériel. J’imagine que beaucoup de gens sont dans ce cas.
Si ça arrivait sur le marché, je pense que je l’achèterais même à un prix largement supérieur à celui d’une vieille imprimante.
La partie la plus difficile est la connexion de l’imprimante, car il peut falloir un câble adaptateur.
Sympa. Ça me rappelle l’époque où j’ai brièvement travaillé dans une station de radio. J’ai presque tout oublié des détails, mais je crois qu’un système appelait automatiquement un certain numéro Associated Press pour récupérer les derniers titres, puis les envoyait vers une imprimante matricielle.
C’était à la fin des années 90 et ça tournait sous MS-DOS.
À l’époque, la plupart des imprimantes permettaient de définir la police avec des codes de contrôle, et beaucoup avaient aussi des polices à chasse variable.
J’aime bien. Ces temps-ci, je songe à m’abonner à un journal papier du week-end comme le FT Weekend, parce que je lis trop souvent l’actualité sur mon téléphone.
Les infos ne sont souvent pas très utiles et ne font que générer des émotions négatives. Les lire sur papier, et seulement une fois par semaine, me semblerait plus apaisant.
Cette approche consistant à imprimer les nouvelles chaque jour sur papier paraît bien combler l’écart entre les deux.
Au passage, j’adore vraiment l’imprimante matricielle. Existe-t-il une imprimante open source facile à hacker de cette façon ?
J’ai essayé de recevoir le journal papier, mais je ne l’ai jamais reçu ; ce n’est qu’après trois appels et une dizaine d’e-mails, quand j’ai demandé l’annulation et le remboursement, qu’ils ont dit qu’ils allaient escalader le ticket. À ce moment-là, trois semaines s’étaient déjà écoulées et j’avais perdu beaucoup de temps.
Du coup, je suis moi aussi très intéressé par l’idée d’imprimer moi-même les actualités en ligne pour éviter de rester collé à un écran.
Depuis quelque temps, j’imprime des « cartes à trois faces ». Sur une face, il y a une image ; sur l’autre, un QR code menant vers un document.
https://mastodon.social/@UP8/111013706271196029
La « troisième » face est le site web vers lequel pointe le QR code.
Comme je me lassais de la photo, je me suis inventé un personnage qui se promène avec un objectif bon marché, ferme toujours le diaphragme à f/18 ou plus, applique un post-traitement et une correction colorimétrique marqués, et photographie dans un ratio d’image standard mais qui donne une impression de non-standard. L’idée est de faire croire qu’il utilise une étrange caméra venue d’une ligne temporelle alternative.
En commençant à imprimer cette série, j’en suis arrivé à la conclusion qu’on pouvait facilement obtenir du 4x5 en découpant du 4x6, mais qu’au lieu de couper, on pouvait garder un espace d’un pouce pour placer un QR code et un document au recto. De même, en découpant du 5x7 en carré 5x5, on obtient de la place pour le document.
J’ai quelques boîtes de papier glacé sur lequel on ne peut pas imprimer au dos, donc je compte les utiliser comme ça. Plus tard, j’ai aussi découvert qu’Instagram avait un standard 4x5, et que les photos de sport prises avec de bons objectifs rendent vraiment bien dans ce format.
Mais je me demande encore à quoi devrait ressembler le document : modifier au minimum la mise en page actuelle, ajouter un faux effet matriciel comme une vieille imprimante qui aurait pu être intégrée à cette caméra imaginaire, ou exploiter au maximum les avantages de l’imprimante jet d’encre.
Si « comme c’est un projet expérimental, on voulait garder le coût de ces données très bas, voire gratuit si possible », il y a aussi NewsCatcher. C’est gratuit pour les side projects open source
https://docs.google.com/forms/d/e/1FAIpQLSejrsj4a1ZQkIasiKCt...
Dans un registre un peu lié, j’utilise chaque matin un petit script qui ouvre la une du NYTimes sur mon MacBook
d=$(date +%d)m=$(date +%m)y=$(date +%Y)wget -q [https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.p...](<https://static01.nyt.com/images/$y/$m/$d/nytfrontpage/scan.pdf>) && open ./scan.pdfhttps://nytonline.net/rss
rm todays_nyt.pdf; wget -q "[https://static01.nyt.com/images/$(date](<https://static01.nyt.com/images/$(date>) +%Y/%m/%d)/nytfrontpage/scan.pdf" -O todays_nyt.pdf && open todays_nyt.pdfdmy=$(date +%d/%m/%Y)