logo

 

Tout d'abord, je remercie grandement virtualabs.fr (lien vers l'article en question), qui m'a lancé sur le sujet et avait déjà fait la majorité du travail, ainsi que le sympathique technicien de la RATP qui a bien voulu répondre à mes questions.

Bien qu'on puisse faire des trucs juste marrants avec les tourniquets, on peut aussi s'amuser avec quelque chose de moins visible: la piste magnétique des tickets.

Quelques infos de base, et une en particulier qui risque de décourager ceux qui lisent cet article juste pour frauder:

Si vous avez lu jusqu'ici, j'estime que vous avez fait assez d'efforts pour être informés de quelque chose: Ce n'est pas la peine de m'écrire pour que je recharge vos tickets, que je vous donne plus de schémas ou que je vous construise un rechargeur. Cherchez plutôt des faux pass Navigo, c'est plus rentable !

Les pistes LoCo sont plus sujettes a la démagnétisation, et bien que ce soit probablement la cause de nombreux passagers mécontents se retrouvant avec des tickets neufs non valides, c'est plutôt arrangeant pour les expérimentations. En effet, écrire une piste LoCo demande moins d'énergie. Il est possible de la réécrire avec une simple tête magnétique de magnétophone cassette sous 9V seulement.

 

Les portiques

Un grand nombre de portiques (pas les nouveaux ACS/Xerox) sont encore équipés d'électronique datant visiblement des années 70 (pas de vernis, pistes tracées a la main, composants en boîtiers métal, condensateurs papier...). Ils sont tous câblés à un central permettant de les synchroniser à la même heure et date, de remonter des alertes en cas de panne, et (?) l'horodatage des tickets pour recevoir une réponse determinant si le tourniquet doit etre débloqué ou non.

Le convoyage du ticket se fait par une courroie et un moteur digne d'un kart électrique. Vu sa puissance et donc sa relative stabilité en vitesse, il n'y a pas vraiment besoin d'asservissement entre la vitesse du ticket et l'écriture des données.

Le long du cheminement du ticket, il y a 3 paires de têtes magnétiques et au minimum 3 fourches optiques. Les têtes vont par paires dessus/dessous pour permettre aux voyageurs d'insérer leurs tickets dans n'importe quel sens.

Il serait possible que le moteur puisse faire marche-arrière pour réinscrire le ticket en cas d'erreur, et que le portique entier se mette en défaut après un certain nombre d'erreurs par ticket inséré.

Les têtes de lecture sont de marque EUROFARAD (distributeur Brush Inc. pour la France), et sont plus étroites que les têtes de lecture par souci de fiabilité. Il vaut mieux écrire beaucoup et lire peu, que l'inverse !

 

Les données

Comme indiqué précédemment, les données de la piste magnétique sont codées en modulation de fréquence, plus précisément en F2F. Toute la largeur de la piste est utilisée, résultant en "stries" de polarités différentes. Une strie de la largeur d'un bit correspond à un 0 (F), deux stries d'un demi bit correspondent à un 1 (2F). Chaque changement de polarité provoque une impulsion à la lecture, permettant par amplification et écrètage une lecture de la durée de chaque strie, et ainsi de la restitution du code binaire.

Inutile de préciser que même avec un écart du simple au double entre un 0 et un 1, les variations brutales de vitesse de lecture ou d'écriture peuvent être problematiques.

 

Il semblerait y avoir un minimum de 4 bits à 1 en début et fin de piste, probablement afin de mesurer la valeur pivot pour différencier un 1 d'un 0.

Pour savoir dans quel sens les données doivent être lues (sens d'insertion du ticket), elles sont encadrées par des sentinelles. Celle de l'avant est 001, et celle de l'arrière 01.
Il semblerait que les portiques inscrivent les donnees selon le sens d'insertion: le debut du côté gauche quand on lit la face avant du ticket.

Il m'est arrive de ne plus pouvoir utiliser mon ticket après un voyage, alors que j'étais toujours dans la plage d'1 heure 30. En relisant le ticket en question, la cause était évidente: il manquait 4 bits à la fin. Il peut donc y avoir des portiques temporairement défaillants qui peuvent "tuer" vos tickets.

Voici l'organisation (incomplète) des données d'un ticket validé dans le métro (recherches perso):

Le timestamp correspond à la date et l'heure de la validation, pas de l'expiration.
La première partie correspondrait a la date et la première tranche horaire, la seconde l'heure plus précise.
Plus de recherches sont nécessaires pour trouver le format...

Type: 0011 = Metro/RER, 1010 = Bus, ...

 

Exemple de décodage de la station a laquelle le ticket a été dernièrement valide:

011111001011:
Code zone: 0111110, code station: 01011.

Vérification de la parité pour la zone: 011111 0. 5 bits a 1 donc parité a 0.
Vérification de la parité pour la station: 0101 1. 2 bits a 2 donc parité a 1.

Code de Gray pour la zone: 011111. Binaire: 010101 = 21.
Code de Gray pour la station: 0101. Binaire: 0110 = 6. 6 XOR 15 = 9.

Le ticket a donc été valide a la station 2109: soit a la Gare de l'Est (en se référant a cette liste).

 

Ce qui suit fait partie de l'ancien article... (En cours de mise a jour)

Matériel nécessaire:

  • Magnétophone microcassette (tête universelle), ou walkman cassette (tête à 3 broches)
  • Breadboard
  • Carton ondulé
  • Pistolet à colle
  • Microswitch à levier
  • Une poignée de composants et les outils que vous avez tous sous la main.

Pour expérimenter, quelques tickets usagés et neufs également.

Il est possible de trouver des lots de tickets sur eBay ou Leboncoin, certains se disent que ça peut encore servir (et c'est tant mieux pour nous !).

Si vous êtes sur place, pas la peine de vous dire qu'il y en a par dizaines sur le sol des grosses sorties.


Disséquez votre magnéto cassette et trouvez la tête magnétique. Sortez-la avec son socle, ça sera plus facile pour la fixer sur le passe-ticket.

Pensez aussi à garder le fil blindé (si il l'est), avec un signal si faible, le bruit devient vite gênant.


Lecteur:

Construisez un simple ampli à transistor pour aider votre carte son à "entendre" vos tickets.

Le découplage de la tête magnétique se fait via un chimique 47µf (la tête fait 420 ohms). Le bias se fait avec une résistance de 10k et de 47k, la résistance de collecteur est de 15k. Alimenter le tout en 9~12V.

Copieur:

Schéma à venir...


...


Le passe-ticket bricolé en carton, faute de mieux. Le microswitch n'est pas sur la photo. Il a été ajouté plus tard, à gauche de la tête de lecture (il se ferme quand le ticket passe devant).

Ca fait l'affaire si on est dans la tranquillité de chez soi, mais sur le terrain il vaut mieux un bon boîtier plastique ou un bricolage similaire avec des feuilles rigides et de la bonne colle chimique.

 

Le réinitialisateur portatif à base de NE555 (élévateur de tension pour la tête d'écriture) et d'un ATTiny2313.

Le 555 charge les deux gros condos (136µF) à environ 40V via une petite self, la charge se coupe automatiquement et est indiquée par une LED. Les 3 autres LEDs servent à afficher le mode (ticket t+, ticket mobilis, effacement).

 

 

Voici le code pour ATTiny25 (à compiler avec AVR-GCC).

// RATP ticket resurector (proto)
// CC 2012 furrtek - furrtek.org
// ATTiny25 8MHz AVRStudio 4
// PB0:LED, PB3:Head, PB4:Switch
    
#include <avr/io.h>
#include <util/delay.h>
// F2F bit write
void writebit(uint8_t bit) {
    if (bit) {
    	PORTB ^= _BV(PB3);
    	_delay_us(800);
    	PORTB ^= _BV(PB3);
    	_delay_us(800);
    } else {
    	PORTB ^= _BV(PB3);
    	_delay_us(1600);
    }
}
    
int main(void) {
	const uint8_t databits[69] = {};	// Only you know the magic code ;)
	uint8_t bits;
    
	WDTCR = (1<<WDCE) | (1<<WDE);
	WDTCR = 0x00;
    
	PORTB = _BV(PB4);;
	DDRB = 0b11101111;	// PB4 as an input
    
	for (;;) {
    	// Wait for ticket
    	while(bit_is_set(PINB,PB4)) {};
    	_delay_ms(20);	// time between microswitch close and write start
    	PORTB = _BV(PB0) | _BV(PB4);;
    	// Prelude
    	for (bits=0;bits<10;bits++) {
    		writebit(1);
    	}
    	// Data
    	for (bits=0;bits<69;bits++) {
    		writebit(databits[bits]);
    	}
    	// Prelude
    	for (bits=0;bits<10;bits++) {
    		writebit(1);
    	}
    	PORTB = _BV(PB4);
    }
}

1 (neuf): 1111111111 00100 11111111 11111110 01111111 11111111 11110011 11111100 11110011 11111010 1111111111
3 (neuf): 1111111111 00100 11111111 11111110 01111111 11111111 11110011 11111100 11110011 11111010 1111111111 
4 (neuf): 1111111111 00100 11111111 11111110 01111111 11111111 11110011 11111100 11110011 11111010 1111111111
12(neuf): 1111111111 00100 11111111 11111110 01111111 11111111 11110011 11111100 11110011 11111010 1111111111

3w(2109): 1111111111 00100 11111111 11111110 01111111 11111111 11110011 11111100 01111011 11111010 1111111111
1w(2109): 1111111111 00100 11111111 11111110 01111111 11111111 11110011 11111100 11110011 11111001 1111111111

j (1403): 1111111111 00111 00110011 11000100 01111111 11111111 01100111 01111100 11110011 01010110 1111111111
10(vieu): 1111111111 00100 11111111 11111110 01111111 11111111 00101101 11111100 11110011 11111010 1111111111

2 (1215): 1111111111 00100 11111100 00011001 01111111 11111111 01010111 10111100 11110011 00110110 1111111111
15(1215): 1111111111 00100 11110000 01001010 01111111 11111111 01001111 10111100 11110011 01010110 1111111111

5 (???5): 1111111111 00100 11110010 00001001 01111111 111100?? ???01111 10111100 11110011 00000110 1111111111
6 (15??): 1111111111 00100 11000011 01100111 01111111 11111111 01010100 01111100 11110011 10010110 1111111111
7 (1808): 1111111111 00100 11111100 00011001 01111111 11110010 01000101 11111100 11110011 11110110 1111111111
8 (????): 1111111111 00100 11111100 00010110 01111111 11111110 00001101 00111100 11110000 11000110 1111111111

9 (RER):  1111111111 00111 00001101 00111011 11111111 11100110 00111011 01111111 11110011 00010010 1111111111

13(mobi): 1111111111 00001 01111111 11111111 11111111 11111111 11111111 11001010 11001111 11110101 1111111111
14(mobc): 1111111111 00000 10111111 11111111 11111111 11111111 11111111 11100101 01100111 11111010 1111111111
    
footer
symbol symbol symbol symbol symbol