Point ./ Limite

Wiki du blog Point ./ Limite

Outils pour utilisateurs

Outils du site


public:polaroheat

PolaroHeat : un Polaroid à impression thermique

Page du projet sur le blog

Toutes les commandes doivent être exécutées en tant que superutilisateur. Le code indiqué entre chevrons < > est à remplacer par la valeur correspondante. Le code suivant un double slash / / est un commentaire.

N.B.: la majeure partie de la marche à suivre est tirée de ce tutoriel provenant d'Adafruit.

Matériel

  • RasPi (Zero) (W)
  • PiCam 5Mpx avec nappe pour RasPi (Zero)
  • Carte µSD 8Go
  • Imprimante thermique JP-QR701 TTL
  • Polaroid HS
  • 2 boutons (déclencheur + bouton d'extinction)
  • 1 interrupteur on/off (alimentation)
  • 1 bouton + une LED (alimentation papier + activité de l'imprimante, inclus avec l'imprimante)
  • LED + résistance (état déclencheur + bouton d'extinction)
  • Alimentation 5V/2A (9V max)
  • Adaptateurs µHDMI/HDMI, µUSB/USB, USB/RJ45 (optionnels, selon version du RasPi)
  • Carte de circuit imprimé pour prototypage
  • Fil de câblage
  • Matériel à souder

Principe de fonctionnement

Le script camera.sh, lancé au démarrage du système, gère l'écoute des ports GPIO (état du déclencheur et du bouton d'extinction du système) et la capture d'une image par la caméra au déclenchement (commande raspistill). La capture est envoyée au serveur d'impression CUPS (commande lp). Le principe de fonctionnement de CUPS est décrit sur la page Wikipédia dédiée :

  1. les applications envoient les documents à imprimer à un gestionnaire de tâche sur le serveur CUPS ;
  2. ce gestionnaire passe le document à travers un filtre pour le convertir dans un langage que l'imprimante peut comprendre ;
  3. le document ainsi transformé est livré à un module de transport qui se charge de transmettre les données d'impression à un périphérique local ou une connexion réseau.

Le fichier raster capturé par la caméra est ensuite transformé en matrice d'octets interprétable par l'imprimante grâce au filtre (driver) rastertozj.c qui a été compilé et installé (commandes make et ./install). Le fichier est enfin livré à l'imprimante thermique qui a été configurée (commande lpadmin) et définie par défaut (commande lpotions).

Préparation logicielle

raspi-config
  • “Expand filesystem”, “enable camera”, “serial console disable”, “serial port harware : yes”, “change hostname” (optionnel).
  • Connecter l'imprimante (RX/TX croisés + GND commun entre Pi, imprimante et alimentation)
  • Test de l'imprimante :
stty -F /dev/serial0 9600 // Régler la vitesse de communication avec l'imprimante montée sur /dev/serial0 à 9600 bauds
echo -e "Ceci est un test.\\n\\n\\n" > /dev/serial0 // Envoyer la phrase de test à l'imprimante
  • Mettre à jour le système et et installer CUPS :
apt-get update
apt-get install git cups wiringpi build-essential libcups2-dev libcupsimage2-dev python3-serial python-pil python-unidecode
  • Télécharger le pilote de l'imprimante :
git clone https://github.com/adafruit/zj-58

Paramétrage de l'impression

N.B.: un contributeur a proposé une autre solution sur le dépôt GitHub du pilote de l'imprimante, mais elle n'a pas encore été intégrée à la branche principale.

  • Modifier le fichier rastertozj.c :
cd zj-58
nano rastertozj.c

Les lignes suivantes sont ajoutées (ligne 44 du fichier rastertozj.c original) :

// define control parameter command
static const struct command controlParameterCommand =
{5,(char[5]){0x1b,0x37,0x4,0x78,0x2}};

// define sleep parameter command
static const struct command sleepParameterCommand =
{3,(char[3]){0x1b,0x38,0x14}};

// define wake up command
static const struct command wakeUpCommand =
{1,(char[1]){0xff}};

Trois commandes sont initialisées (contrôle des paramètres de chauffe, mise en veille de l'imprimante et réveil de l'imprimante). Chaque commande est constituée d'un ou plusieurs octets écrits sous forme brute (voir https://lwp.interglacial.com/appf_01.htm pour la conversion décimal/hexadécimal/ascii/encodage brut). La valeur de certains octets est définie, d'autres correspondent à des paramètres modifiables d'après la documentation (voir pages 22/23 : https://cdn-shop.adafruit.com/datasheets/A2-user+manual.pdf).

 Détail des commandes

Commande controlParameterCommand

Syntaxe : 0x1b,0x37,n1,n2,n3

  • n1 peut prendre une valeur entre 0 et 255 (à convertir sous forme brute). En ajoutant 1 à cette valeur et en multipliant le résultat par 8 (=n1+1*8), on obtient le nombre de points d'impression. Valeur par défaut : 7 (64 points). Valeur élevée = vitesse d'impression élevée = consommation électrique élevée.
  • n2 peut prendre une valeur entre 3 et 255 (à convertir sous forme brute). En multipliant cette valeur par 10, on obtient la durée du temps de chauffe en microsecondes. Valeur par défaut : 80 (800 µs). Valeur élevée = densité de noir plus élevée = vitesse d'impression plus faible. Un temps de chauffe trop faible peut provoquer la sortie d'une page blanche.
  • n3 peut prendre une valeur entre 0 et 255 (à convertir sous forme brute). En multipliant cette valeur par 10, on obtient l'intervalle de chauffe en microsecondes. Valeur par défaut : 2 (20µs). Valeur élevée = plus de détail = vitesse d'impression plus faible.

Ici, n1 a été fixée à 4 (4+1*8 = 40 points), ce qui diminue la consommation électrique de l'imprimante et lui permet de fonctionner correctement sous 5V. n2 a été fixée à 120 (120*10 = 1200µs ou 1,2ms) pour obtenir une image suffisamment contrastée. La valeur par défaut de n3 (2, c'est-à-dire 2*10 = 20µs) a été conservée (pas de gain de détail observé).

Commandes sleepParameterCommand et wakeUpCommand

Syntaxe : 0x1b,0x38,n1

n1 peut prendre une valeur entre 0 et 255 (à convertir sous forme brute). Cette valeur correspond au temps d'attente en secondes entre la fin de la dernière impression et la mise en veille. Valeur par défaut : 0 (pas de mise en veille). Cette commande permet de diminuer la consommation électrique de l'imprimante.

Ici, n1 a été fixée arbitrairement à 20.

Lorsque l'imprimante est en veille, l'envoi d'un octet (0xff) permet de la réveiller. C'est le rôle de la commande wakeUpCommand.

Les commandes wakeUpCommand et controlParameterCommand sont intégrées à la déclaration de fonction jobSetup() (ligne 148 du fichier rastertozj.c original). Cette fonction est appelée avant chaque impression.

// sent on the beginning of print job
void jobSetup()
{
        outputCommand(wakeUpCommand);
        sleep(0.05);
        if ( settings.cashDrawer1==1 )
                outputCommand(cashDrawerEject[0]);
        if ( settings.cashDrawer2==1 )
                outputCommand(cashDrawerEject[1]);
        outputCommand(printerInitializeCommand);
        outputCommand(controlParameterCommand);
}

La commande sleepParameterCommand est intégrée à la déclaration de fonction ShutDown() (ligne 158 du fichier rastertozj.c original). Cette fonction est appelée à la fin de chaque impression.

// sent at the very end of print job
void ShutDown()
{
        if ( settings.cashDrawer1==2 )
                outputCommand(cashDrawerEject[0]);
        if ( settings.cashDrawer2==2 )
                outputCommand(cashDrawerEject[1]);
        outputCommand(printerInitializeCommand);
        outputCommand(sleepParameterCommand);
}

Installation du pilote et finalisation

  • Une fois le fichier modifié et enregistré, quitter nano et compiler le programme :
make
./install

N.B.: le programme doit être recompilé à chaque nouvelle modification du fichier rastertozj.c.

  • Configurer l'imprimante par défaut :
lpadmin -p ZJ-58 -E -v serial:/dev/serial0?baud=9600 -m zjiang/ZJ-58.ppd
lpoptions -d ZJ-58
  • Redémarrer le système :
reboot
  • Si nécessaire, des paramètres optionnels (ici, le contraste) peuvent être ajoutés à la commande raspistill du script camera.sh :
raspistill -n -t 200 -w 512 -h 384 --contrast 15 -o - | lp

Les paramètres et les options sont détaillés ici : https://www.raspberrypi.org/documentation/raspbian/applications/camera.md

  • Lancer le programme au démarrage du système :
nano /etc/rc.local
  • Ajouter la ligne suivante avant le “exit 0” final :
sh /home/pi/zj-58/extras/camera.sh

Boîtier

Plusieurs stratégies ont été nécessaires pour réussir l'intégration :

  • Des entretoises en nylon ont été collées à l'intérieur du boîtier pour servir de points de fixation aux différents modules (Raspberry Pi, circuit imprimé de l'imprimante, tête d'impression…);
  • Deux vis ont été insérées de chaque côté du boîtier pour servir d'axe au rouleau de papier thermique. Attention, il doit y avoir le moins de friction possible lorsque le moteur alimente la tête d'impression en papier. De même, le rouleau de papier ne doit pas être trop lourd, sous peine d'obtenir des erreurs d'impression. Enfin, la tête d'impression doit être fixée solidement et bien en face de la fente de sortie. Le moteur a tendance à la faire bouger, ce qui peut provoquer des bourrages papier et
  • Un morceau de lame de scie à main a été collé avant la fente de sortie du papier thermique pour permettre de déchirer facilement et proprement les photos imprimées.
  • Le capot amovible (qui servait auparavant à changer de cartouche de papier) a été simplement relié au corps du boîtier proprement dit par deux élastiques, tendus entre des entretoises (une de chaque côté du boîtier et du capot). Il reste ainsi mobile, ce qui permet de remettre en place le papier dans le cas où il serait mal engagé dans la tête d'impression.
  • Par manque de place, une pochette a été collée sous le boîtier pour accueillir l'accumulateur, relié en USB par l'intermédiaire d'un câble passant par un trou à l’arrière du boîtier.

Optimisation de la consommation électrique

public/polaroheat.txt · Dernière modification : 2022/10/23 16:01 de roi_matou