Faire tourner une machine POS EPSON IM-310 sous Linux

Date de publication : — dernière modification :

Les POS (Point of sale) sont des terminaux informatiques utilisés pour réaliser une transaction dans un magasin. Il s'agit des ordinateurs qu'on trouve en caisse, dans un nombre important de magasins.

J'ai eu récemment l'occasion de me faire prêter une machine POS, la EPSON IM-310. Cette machine, vieille d'environ 15 ans, possède les périphériques suivants :

  • Un écran tactile
  • Une imprimante de tickets
  • Un afficheur VFD
  • Un tiroir-caisse contrôlé électriquement

À l'intérieur de la machine, on retrouve les composants suivants :

  • Un processeur Intel Celeron cadencé à 700 mhz
  • Deux disques durs IDE 2,5 pouces, de 6 Go chacuns
  • Carte Ethernet (basée sur la puce RTL8139)

Il y a aussi un lecteur de Compact Flash à l'intérieur de la machine. Pour y accéder, il faut ouvrir la machine :

Le slot CompactFlash

À l'origine, cette machine était livrée sous Windows NT 4.0. Aujourd'hui, Windows NT 4.0 est abandonné, et je doute qu'il soit très facile de nos jours de développer des logiciels dessus. Dans cet article, je vais expliquer comment installer Linux sur cette machine et avoir une prise en charge complète de son hardware.

Installer Linux

La machine qu'on m'a prêtée ne possédait pas de lecteur optique.

J'ai alors tenté de booter sur une Compact Flash sur laquelle j'avais copié un ISO du CD d'installation de Debian. Pour pouvoir booter dessus, j'ai dû désactiver le contrôleur IDE primaire (le lecteur CF est situé sur le contrôleur IDE secondaire), ce qui ne m'a pas grandement aidé (les deux disques durs internes sont sur le contrôleurs IDE primaire).

J'ai alors tenté de démarrer la machine via le réseau, en ajoutant un carte Ethernet 3COM qui supporte le démarrage par PXE. J'ai aussi dû monter un serveur PXE, à l'aide de ce guide.

J'ai alors pu démarrer l'installation de Debian :

Un ticket de caisse

La machine étant très capricieuse, nous ne pouvons utiliser GRUB comme bootloader. Il faut spécifier à l'installation de Debian l'installation de LILO à la place, ce qui est possible via le "Mode expert" de l'installateur de Debian.

Après avoir fini l'installation, installez un environnement graphique très très léger, par exemple LXDE.

Utiliser l'imprimante de tickets de caisse

L'imprimante de tickets de caisse est connectée à la carte mère de la machine directement par une liaison série. Le port sur lequel est branchée l'imprimante apparait comme /dev/ttyS2 sous Linux.

Un ticket de caisse

Pour exploiter l'imprimante, j'ai trouvé une librairie très simple à utiliser sous Linux : python-escpos, son installation est décrite sur cette page.

On peut alors tester python-escpos avec ce petit script :

from escpos import *

pos_printer = printer.Serial("/dev/ttyS2")
pos_printer.text("Hello world.\n")
pos_printer.text("I'm a POS printer.")
pos_printer.cut()

Utiliser l'écran tactile sous Linux

L'écran tactile fonctionne aussi par une liaison série. L'écran est accessible via /dev/ttyS3. Vous pouvez lire les paquets envoyés en tapant ceci dans le terminal :

screen /dev/ttyS3 9600

Vous pourrez alors observer des paquets ressemblant à ceci :

T0984,0132

ou encore :

R0845,0542

Le premier caractère correspond à l'activité sur l'écran : T indique une pression (touch), R indique qu'on a enlevé son doigt de l'écran (release). Les deux blocs de 4 chiffres correspondent respectivement aux positions X et Y du doigt sur l'écran.

Pour exploiter la dalle tactile sous Linux, j'ai décidé d'écrire mon propre driver qui est disponible ici. Je n'ai pas encore réalisé de paquet Debian, alors il faut compiler le driver soi-même :

cd /tmp
sudo apt-get install git build-essential linux-headers-$(uname -r)
git clone https://github.com/tibounise/im310-touchscreen
cd im310-touchscreen
make

et le lancer de cette manière :

sudo insmod im310_touchscreen.ko
./inputattach -im310 /dev/ttyS3

Une fois le driver lancé, vous constaterez que le pointeur va dans la mauvaise direction sur l'axe Y. Pour remédier à ce problème, il faut calibrer l'écran à l'aide de xinput_calibrator.