J'ai toujours voulu afficher n'importe quoi sur l'afficheur au centre du tableau de bord, qui affiche normalement la station de radio et l'heure, et il se trouve que c'est tout à fait possible.
Hardware
Ici, on a un autoradio Renault/VDO Tuner List (modèle 22DC259/62T, 77 00 434 422) et un afficheur Renault (82 00 028 364), avec un connecteur gris connecté au tableau de bord et à la radio, et un connecteur rouge connecté aux commandes situées sous le volant.
Je n'ai pas eu confiance dans les documentations que j'ai pu trouver, avec des couleurs de fils incorrectes, des brochages de connecteurs parfois à l'envers, différentes version de l'afficheur ou de l'autoradio.
Mais ce n'est pas un problème, il suffit de démonter pour vérifier qu'on ne va rien faire de dangereux. On peut rapidement identifier les pins à la masse, ceux des alimentations, et certains signaux de puissance.
Connecteur Gris :
NTC
GND
NC
NC
GND
Éclairage feux? (in)
Éclairage backlight? (in)
+12V (contact?, in)
+12V (permanent?, in)
NC
GND
LCD_ENABLE (12V, in)
SDA (TTL, io)
SCL (TTL, io)
!MRQ (TTL, io, active-low)
Connecteur Rouge (TTL) :
NC
NC
NC
NC
NC
NC
NC
NC
Commun 1
Retour A
Commun 2
Retour B
Commun 3
Retour C
NC
Ça permet de comprendre la majorité du câblage :
Et on peut aussi reverse-engineerer la matrice des boutons utilisés pour les commandes au volant:
Fonction
Pin commun
Pin retour
OK
A
1
VOL-
A
2
VOL+
A
3
Source L
B
1
Source R
B
2
Pause
B
3
Molette 1
C
1
Molette 2
C
2
Molette 3
C
3
Curieusement, la molette n'est qu'un interrupteur rotatif à 3 positions, ça suffit à détecter le sens de rotation ça donne l'impression de bien plus de positions (6 par tour).
Câble
Dans ce cas, la solution la plus pratique est de prendre une rallonge avec des câbles mini-ISO branchés sur l'autoradio, de couper chaque fils et de les brancher sur un connecteur à 0.1", pour y mettre des cavaliers pour une connection directe, des fils en Y pour espionner le bus ou bien des fils vers un MCU ou un analyseur logique.
Connecteur jaune C1 :
SDA (TTL 5V)
SCL (TTL 5V)
!MRQ (TTL 5V)
LCD_ENABLE (+12V)
GND
On peut se contenter de n'utiliser que ce connecteur pour afficher ce que l'on veut, et reverse-engineerer une partie du protocole.
Comme je ne voulais pas décharger la batterie ni passer plusieurs heures dans le froid, j'ai préféré démonter l'afficheur et l'autoradio pour les utiliser à l'intérieur.
Protocole
Ça nous avance bien de connaître le matériel, mais il faut encore comprendre comment l'autoradio communique avec l'écran LCD.
Pour ça, on va utiliser un analyseur logique (Cypress FX2 et sigrok/pulseview) et regarder tout ce qui passe sur le bus i2c.
On peut voir que le bus i2c fonctionne à 7.14kHz et que le signal !MRQ est constamment tiré à 0 avant que quelque chose ne soit transféré sur le bus.
En débranchant le signal MRQ de chaque côté, on peut voir que l'afficheur le force à 0 en attendant une trame de l'autoradio, mais que l'autoradio le force aussi à 0 avant d'envoyer une tram à l'autoradio. On peut aussi voir que l'autoradio est maître sur le bus i2c, et identifier l'adresse de l'écran LCD (0x23).
On peut voir plusieurs messages de 2 octets de long [0x01, 0x10] ou [0x01, 0x11], demandés au moins toutes les 500ms par l'autoradio (initié par l'afficheur qui tire le signal MRQ à 0, puis répond lorsque l'autoradio envoie une requête).
Commandes au volant
Il y a aussi une trame répondue par l'afficheur lorsqu'on appuie sur un bouton des commandes au volant, et qui permet de déduire le code de chacune des commandes au volant. L'afficheur tire le signal MRQ à 0, l'autoradio envoie une requête, puis l'afficheur envoie la trame correspondant aux boutons pressés.
Bouton
octet 0
octet 1
octet 2
octet 3
octet 4
action
OK
0x04
0x82
0x91
0x00
0x00
press
OK
0x04
0x82
0x91
0x00
0x40
hold
Source R
0x04
0x82
0x91
0x00
0x01
press
Source R
0x04
0x82
0x91
0x00
0x81
hold
Source L
0x04
0x82
0x91
0x00
0x02
press
Source L
0x04
0x82
0x91
0x00
0x82
hold
Volume +
0x04
0x82
0x91
0x00
0x03
press
Volume +
0x04
0x82
0x91
0x00
0x43
hold
Volume -
0x04
0x82
0x91
0x00
0x04
press
Volume -
0x04
0x82
0x91
0x00
0x44
hold
Pause
0x04
0x82
0x91
0x00
0x05
press
Wheel up
0x04
0x82
0x91
0x01
0x41
Wheel down
0x04
0x82
0x91
0x01
0x01
Les valeurs 0x41 et 0x42 pour le dernier octet sont aussi interprétées par l'autoradio comme les boutons Source R et Source L maintenus appuyés, et il n'y a pas de code lorsqu'on maintient appuyé le bouton Pause ou pour la molette.
Affichage
L'afficheur est rafraichi uniquement en cas de besoin, on peut l'observer en appuyant sur un bouton de l'autoradio, qui va forcer le signal MRQ à 0, puis va envoyer une trame entre 13 et 16 octets avec les caractères à afficher.
Affichage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
98.5
0x0f
0x90
0x7f
0x29
0xff
0x3f
0x35
0x81
0x20
0x20
0x20
0x20
0x39
0x38
0x35
0x20
CASS [=]
0x0f
0x90
0x7f
0x55
0xff
0xff
0x60
0x01
0x43
0x41
0x53
0x53
0x20
0x04
0x05
0x06
BAYERN 3
0x0f
0x90
0x7f
0x55
0xff
0x3f
0x75
0x01
0x42
0x41
0x59
0x45
0x52
0x4E
0x20
0x33
Bingo ! Les trames à partir de l'octet 9 ressemblent à de l'ASCII (les caractères clignotent si le MSB est à 1), l'octet 7 permet d'afficher le point décimal et le digit de mémoire/piste, et l'octet 6 permet d'afficher les pictogrammes Tuner Preset, Tuner Manu, Dolby et MSS.
Programme
On va remplacer l'autoradio par un Arduino Mega (n'importe quel micro-contrôleur avec un périphérique i2c et des IO TTL suffit), pour pouvoir écrire sur l'afficheur et lire l'état des boutons.
Avec un Atmel AVR, il faut forcer le bitrate/prescaler à environ 7kHz avec les lignes suivantes: void conf() {
TWBR = 0xff;
TWSR = 0x01;
}
Comme c'est un programme de test qui n'a qu'une seule fonction et un MCU surpuissant pour son utilisation, il est possible d'écrire un code peu optimisé (polling au lieu d'interruptions, copy/paste).
On va initialiser l'écran en envoyant quelques trames [0x01, 0x10] et [0x01, 0x11], puis on peut écrire un peu ce qu'on veut : void writerandom(byte *data, int len) {
while(digitalRead(2)); // polling the MRQ line
Wire.beginTransmission(0x23);
conf(); // overwrites the bitrate/prescaler after the Wire lib configures the i2c
Wire.write(data, len);
Wire.endTransmission();
}
Dans ce cas, on peut commencer par copier/coller des trames récupérées en sniffant celles envoyées par l'autoradio, puis on va reverse-engineerer le protocole complet en bouclant sur tous les caractères entre 0x00 et 0xFF, et en testant les pictogrammes.
On va aussi pouvoir lire l'état des boutons, qui sont des trames de 5 octets : void read01() {
while(digitalRead(2)); // polling the MRQ line, pulling the MRQ line low and waiting 500us also works
conf(); // overwrites the bitrate/prescaler after the Wire lib configures the i2c
Wire.requestFrom(0x23, 5);
TWBR = 0xff;
TWSR = 0x01; // 0x00 appears to work as well
for(i = 0; i < 5; i++) {
READDATA[i] = Wire.read();
}
}
Références
RTA 120.1 Renault Mégane/Scénic 1 1999-2003 (page 177, section essence)
Manuel de Réparation Renault MR312-8 (pages 165-166)
Manuel Renault/Philips MR-Radiosat-6000-10 (pages 34-36)
Le chargeur de téléphone est placé juste devant le levier de vitesse, et le câble peut s'enrouler autour, ce qui peut devenir gênant en roulant.
Pour éviter tout ça, il doit être possible d'intégrer le chargeur de téléphone dans l'autoradio (dans lequel il reste la place du lecteur de cassettes).
Câblage
L'autoradio est alimenté par le +12V_Permanent (pin A4), et le +12V_Contact (pin A7) ne sert qu'à l'activer à la mise du contact.
Il y a deux gros pads à proximité d'une capa de découplage sur le PCB, l'empreinte ressemble à celle d'une capa chimique SMD, sauf qu'ils sont reliés au +12V_Permanent, et qu'on ne veut pas que notre chargeur vide la batterie.
En jouant un peu à l'Ohm-mètre (les pistes sont dures à suivre avec un PCB multi-couches), on arriver à trouver un pin relié au +12V_Contact. Les pistes sont fines, mais semblent correctes pour 500mA (<500mΩ, mon Ohm-mètre n'est pas plus précis).
Une fois les pads repérés, on peut souder sur la carte à LM2596 du chargeur de téléphone, sans oublier de mettre un fusible de 1A.
On peut aussi profiter que l'autoradio soit ouvert pour mettre les selfs différentielles à l'intérieur. En pratique, avec des selfs toriques, les fuites sont tellement faibles qu'on peut se permettre de les placer n'importe comment sans qu'il n'y ait de couplage avec d'autres selfs ou les circuits voisins.
Mécanique
On peut utiliser des vis/entretoises M3 pour fixer l'alimentation. Il faut faire attention à ce que les vis ne touchent rien d'autre que la masse, j'ai dû ajouter une rondelle isolante pour une vis proche du rail d'entrée.
Comme c'est installé dans une voiture, il ne faut pas oublier qu'il y a beaucoup de vibrations et des cycles thermiques assez larges, du coup ce n'est pas une mauvaise idée d'ajouter des contre-écrous en plus du taraudage des trous.
Pour les vibrations, il faut aussi sceller tout ce qui peut bouger : fils, fusible, nappes, selfs. Les zip-ties sont moches, mais bien adaptés à ce genre de choses.
Une fois que tout est fait, on n'oublie pas de vérifier à l'Ohm-mètre qu'il n'y a rien de mal câblé, et que rien ne bouge en secouant le bloc. Avec un fusible de 15A dans la voiture, il y a de quoi faire des dégats sans même que ça ne coupe.
Une fois testé, on peut vérifier que le chargeur ne fonctionne que lorsque la clé est insérée.
En ayant pu (enfin) utiliser la voiture, j'ai remarqué qu'on entendait un bruit dépendant du régime moteur dans l'autoradio (probablement l'allumage).
En investiguant un peu, j'ai remarqué qu'en utilisant le chargeur de téléphone avec le moteur allumé, le téléphone avait aussi un bruit audible.
Identification et réparation
Ça suppose soit un PSRR immonde pour le chargeur du téléphone, soit du bruit de mode commun (rayonné ou bien conduit).
Du coup la solution miracle est arrivée après quelques secondes de réflexion : des selfs différentielles.
Avec quelques tours de câble enroulé autour d'un tore de ferrite sur les câbles d'entrée analogique et d'alimentation ont complètement réglé le problème.
Principe
Le but est de filtrer un courant parasite qui circule dans une boucle. Un simple filtre LC sur chaque fil de signal filtrerait le signal utile, sans beaucoup atténuer le signal parasite.
Avec une self sur chaque signal, y compris la masse, c'est le même problème, on filtre le signal utile.
En couplant ces selfs entre elles, le signal de mode différentiel n'est pas perturbé. Le sens du bobinage fait que l'inductance est faible (le champ est nul) tant que le courant qui rentre par les fils de signaux est égal au courant qui retourne par la masse. Par contre en cas de perturbation de mode commun, le courant entrant et le courant sortant tendent à ne pas être égaux (soit par une boucle de masse, soit par des capacités parasites), du coup il commence à y avoir un champ magnétique dans la self, qui présente une inductance (et atténue ces courants).
J'ai un autoradio Tuner List (Renault/VDO, modèle 22DC259/62T), avec un lecteur cassettes qui m'est inutile, mais je voulais ajouter une entrée analogique pour y brancher un smartphone ou un lecteur audio.
/!\ Danger La tension maximale n'est que de <15V, mais tout est sous tension, même lorsque le contact n'est pas mis, ou que l'autoradio est éteint. Le fusible permet de sortir 15A, largement de quoi tout casser et se blesser avant qu'il ne fonde. /!\ Warning The maximum voltage is only <15V, however, the radio is always powered, even when switched off or when the engine is turned off. The fuse is rated for 15A, more than enough to blow the radio and hurt yourself before it melts.
Démontage
Sur les Renault Mégane, la face avant de l'autoradio est plus large que celle des autres voitures, mais les fixations sont à peu près au même standard.
Il suffit d'insérer deux clous de 4mm dans les deux trous en bas sur les côtés, pousser les clous vers l'extérieur, et de faire bouger l'autoradio sur les côtés en le tirant. Deux mains sont nécessaires, mais c'est faisable sans outils spéciaux.
Une fois l'autoradio tiré, il y a un connecteur DIN/ISO (parfois séparé en deux parties) à gauche, puis un connecteur (jaune dans ce cas), pour relier les commandes au volant et l'afficheur (I²C). Il y a aussi parfois aussi un connecteur (bleu) dans le cas où un chargeur de CD serait présent. Le câble d'antenne (Coax à droite) est aussi à débrancher. Il est souvent clipsé à l'arrière de l'autoradio.
Code
Quand l'alimentation de l'autoradio a été débranchée, il est nécessaire d'entrer un code (normalement fourni, sinon trouvable à partir du numéro de série).
Quand l'autoradio affiche "0000", avec le premier '0' clignotant et qu'il faut entrer le code "1234", il faudra taper une fois sur la touche "1", une fois sur la touche "2" pour choisir le 2nd caractère (qui doit clignoter), puis deux fois sur cette touche (l'écran doit afficher "1200"), idem avec les touches 3 et 4 pour les derniers digits.
Une fois le code complet, il faut maintenir la touche 6 appuyée jusqu'à ce que l'autoradio fonctionne normalement.
Teardown
Le haut de l'autoradio se démonte simplement en déclipsant 4 clips avec un tournevis plat.
Il faut retirer deux connecteurs Würth WR-MM et dévisser 4 vis Torx T8 pour démonter le lecteur de cassettes en le tirant vers l'arrière (il faut retirer la cassette présente avant de retirer le lecteur).
La carte n'a de composants que sur la face, le PCB vertical à l'arrière contient uniquement le tuner FM/AM, et le PCB vertical à l'avant supporte des boutons poussoirs et des LEDs.
Il y a 3 composants qui nous intéressent :
TEA0676T : Préampli de cassette, à proximité du connecteur WR-MM à 4 pins des têtes du lecteur de cassette
93CW44DF : Microcontrôleur OTP ou ASIC custom, sans documentation, semble tout contrôler
TAA276H (TDA7385H) : Ampli de puissance 4*20W (bridge)
Les autres gros circuits intégrés concernent le tuner, l'ampli de puissance ou de la glue logique.
Sur cet autoradio, il est possible d'utiliser l'entrée SPDIF (disponible sur le connecteur du chargeur de CD), mais le périphérique doit communiquer avec l'autoradio (RS232 0-12V, 9600, 8N1).
Entrée
Le circuit SAA7708H supporte 3 entrées analogiques (phone, tape, CD), mais elles sont contrôlées par le chip 93CW44DF (contrôle par un bus I²C).
Comme le lecteur de cassettes ne me sert pas, je vais câbler l'entrée à la place de celui-ci.
Au niveau des têtes de lecture, le niveau est très faible (~1mV), et surtout le signal est remis en forme (filtres, égaliseur). Il est nettement plus simple de récupérer le signal en sortie du préampli (signal déjà égalisé, filtré et amplifié), à environ 1V (compatible avec une sortie casque/ligne au volume maximal).
En regardant entre la sortie du TEA0676T l'entrée du SAA7708H, on voit des capacités pour bloquer une composante DC, et un filtre passe-haut (entrée d'ADC). On va donc câbler l'entrée juste à la sortie du TEA0676T.
Les pins 1 et 16 sont dessoudés et isolés de leurs pastilles, et le câble d'entrée est soudé sur des points de test et la masse sur un plan.
Après un test, l'entrée fonctionne uniquement si le lecteur de cassettes (connecteur à 10 pins) est branché et si une cassette est présente (il n'y a pas besoin de brancher le câble à 4 pins).
Lecteur de cassettes
Par un peu de rétro-ingéniérie, il est possible d'identifier chaque signal du connecteur WR-MM à 10 pins :
Pin
Fonction
1
Auto-reverse switch
2
GND
3
Presence switch (C)
4
Presence switch (T)
5
Motor (+)
6
Mute switch
7
Solenoid
8
Solenoid
9
NC
10
CrO2 switch
Avec quelques tests, seulement les fils en gras sont utiles pour activer le lecteur de cassette.
Le pin 6 (Mute switch) est à relier au pin 2 (GND). Les pins 2 et 3 (presence switch) sont à relier entre eux.
Remarques
Attention, il y a très peu de place entre le volant et le levier de vitesse, un faux mouvement fait vite des dégâts. En pratique, il faut isoler le mécanisme de cassette et le PCB de contrôle avec des sachets antistatiques, et aussi débrancher le connecteur WR-MM à 10 pins avant chaque modification.
À la moindre erreur, il peut y avoir de gros dégâts :
L'autoradio est soumis à de larges cycles de température et doit supporter des vibrations. Pour cela, tous les câbles ont été isolés avec de la gaine thermo-rétractable ou plusieurs couches de ruban de kapton ou de vinyl.
Il faut aussi prendre en compte le fait que le jack peut être tiré depuis l'extérieur. Un simple noeud permet d'éviter de casser les soudures.
Les boutons eject et avance/retour rapide ont été fixés par des morceaux de PVC pris en sandwich entre la face avant et le haut du boitier. Il a été nécessaire de percer les boutons pour laisser passer le câble.
.
Avec mon lecteur audio Sandisk Sansa et mon smartphone HTC Desire X, le volume doit être au maximum pour avoir le même volume que le tuner FM, mais le son est bien en stéréo et de bonne qualité.