logo

 

Ce hack concerne la réécriture du firmware des émetteurs FM basés sur les microcontrolleurs AVR (Atmel). Ils sont facilement trouvables chez des vendeurs Chinois sur eBay pour des prix allant de 30 a 40 Euros, prix dépendant en majeure partie de la puissance d'émission et des fonctionnalités.

Si vous ne savez pas si tel émetteur est basé ou non sur un AVR, n'hésitez pas a demander une (bonne) photo du circuit imprimé au vendeur. Ils accepteront sûrement puisqu'il n'y a rien de secret dans de tels appareils.

La plupart des émetteurs que j'ai rencontrés dans cette gamme de prix étaient basés sur des AVR. Ceux qui sont capable de lire des MP3 depuis des cartes SD ou des clés USB utilisent probablement des microcontrolleurs obscures capables de s'occuper du décodage de tels fichiers (j'en parlerais pas ici).

Video de présentation (en Anglais seulement, désolé):

 

L'émetteur que j'ai utilisé pour tester ce hack est donc basé sur un ATMega48 et un circuit intégré dédié a l'émission FM stéréo Rohm BH1415 (datasheet complète).

L'interface utilisateur est composée d'un afficheur 7-segments a 3 chiffres et demi (199.9), et de deux boutons (qui comme vous l'avez deviné, servent a augmenter ou diminuer la fréquence).

Une liaison a 3 lignes relie l'AVR au BH1415,pour lui transmettre les données numériques correspondant a la fréquence désirée.

J'ai relié mon programmateur Atmel AVRISP a l'empreinte 6 broches qui ressemblait fortement a un connecteur ISP, j'ai mis sous tension l'émetteur via son alimentation principale 12V et j'ai essayé de lire la signature de l'AVR.
A ma surprise, même avec la vitesse de lecture la plus basse, les 3 octets composant cette signature changeaient a chaque lecture. Ceci voulait dire que soit l'alimentation n'était pas assez stable et empêchait l'AVR de répondre correctement, soit la sortie RF de l'émetteur parasitait les (grands) fils que j'avais soudés.
J'ai donc retiré l'alimentation 12V et apporté du 5V depuis un transfo externe. La signature s'est enfin affichée correctement.

L'étape suivante était de voir si je pouvais lire le firmware original (le contenu de la mémoire flash de l'AVR). Malheureusement, le fabricant a pensé a bloquer le code via les lock bits donc je n'avais comme seule possibilité d'effacer le microcontroleur et de réécrire complètement le firmware.

Premièrement, il fallait que je sache comment l'AVR était connecté au reste du circuit.

Rien de compliqué, il a juste fallu suivre les pistes et biper au multimètre certaines qui étaient cachées. Les connections a l'afficheur 7-segments (port B et D) ont certainement dues être pensées pour simplifier le routage. Les connections pour le BH1415 et les boutons sont sur le port C.

On ne peut pas vraiment se planter si notre code est buggy car les LEDs de l'afficheur sont toutes protégées par des résistances de 1kohms (deux en fait), et le BH1415 ne tuera pas l'étage de puissance si il reçoit les mauvaises données.

Pour la fonction scan que je voulais ajouter, je voulais qu'une tonalité intermittente soit transmise par le microcontroleur pour que je puisse l'entendre sur la radio et donc savoir quand arrêter le scan, sans avoir a brancher une source audio externe. Le condensateur C1 de 100nF sur PC0 est la pour ca. Il est relié juste avant le filtre RC sur l'entrée L (ou R) du BH1415. De cette façon, un signal carre sortant de l'AVR pourra être "mixé" a l'éventuel signal audio externe sans rien endommager.

A ce propos, communiquer avec le BH1415 est aussi très simple: il suffit juste d'envoyer un mot de 16 bits via les 3 connections. Tout ce qu'il faut savoir est dans les dernières pages de son datasheet: mettre CE a l'état haut, sortir le bit 0, front d'horloge, sortir le bit 1, front d'horloge... mettre CE bas, et c'est fini.

Il y a 11 bits pour la fréquence (par pas de 100kHz), un bit pour choisir entre l'émission mono ou stéréo, deux bits pour configurer le comparateur de phase (j'ai du deviner, c'était 00), et deux bits fixes non utilisés.

La fonction "sendBH1415" dans le code s'occupe de transmettre ces données.

L'afficheur a 3 chiffres et demi n'avait pas de référence imprimée et se trouve assez difficilement. J'ai eu la flemme de chercher le datasheet d'un afficheur similaire alors j'ai simplement utilisé mon multimètre encore en mode diode pour deviner le brochage.

Rien d'extraordinaire ici non plus: des anodes communes pour chaque chiffre et des cathodes uniques pour chaque segment.

Les segments B et C sont inverses pour le "1", mais on s'en fout puisque ces deux segments sont éteints et allumes par paire.

J'ai utilisé l'interruption overflow du Timer0 de l'ATMega48 pour faire défiler les chiffres un par un assez rapidement pour que l'oeil humain ne remarque pas qu'un seul chiffre est allume a la fois (c'est une technique de multiplexage utilisée avec pratiquement tous les afficheurs a plus d'un chiffre).
Cette interruption est aussi utilisée pour temporiser tout le reste: la fréquence de la tonalité de scan, son intervalle, la durée de l'affichage du message customisé...

Enfin, j'ai ajoute la mémorisation de la dernière fréquence utilisée en EEPROM, pour qu'elle soit restaurée lorsqu'on rallume l'émetteur. Faites attention de bien vérifier que la valeur lue dans l'EEPROM est dans la gamme prévue, il se peut toujours qu'elle soit corrompue et cause des problèmes avec la suite du programme.

Telechargez le code source en C, le binaire et le fichier projet pour AVR Studio.

Avant de flasher le binaire, regardez bien si votre émetteur est le même, ou qu'au moins le routage soit identique.

Le code source est largement commente (en Anglais) et il est relativement facile de changer les #define pour rendre le code compatible avec d'autres émetteurs.

footer
symbol symbol symbol symbol symbol