Journal Projet embarqué: interface pour commande filaire Renault vers autoradio JVC

Posté par  . Licence CC By‑SA.
57
30
nov.
2017

Ce journal décrit succinctement la réalisation d'un projet embarqué, avec code et circuit à la fin.
(Quelques termes anglophones peuvent être rencontrés dans le reste de ce texte, ainsi que des conseils shopping)

Contexte / besoin
Quand je ne suis pas en vélo je roule avec cet excellent et adorable véhicule.

L'autoradio d'origine vient tout droit des années 90, je l'ai donc changé pour un JVC qui peut parler en bluetooth avec mon téléphone, et plus généralement me faire entendre ce que j'ai envie d'entendre.

Petit souci: la petite télécommande filaire installée derrière le volant devient inutile, c'est dommage.

Cheminement / mavie

Coté commande
Après avoir posté cette entrée de forum j'ai fini par démonter la télécommande, et découvrir qu'il s'agit simplement d'un ensemble de 6 interrupteurs montés "en parallèle" (2 interrupteurs partagent une broche commune au milieu), ainsi qu'une molette qui peut adopter 3 positions (minimum et suffisant pour détecter un sens de rotation).
Le tout était relié à l'ancien autoradio par un connecteur à 6 broches.

Ce tableau récapitule le rôle de chaque broche du connecteur:
brochage

Coté autoradio
Mon JVC neuf n'a pas de récepteur infrarouge mais est équipé d'un énigmatique fil bleu qui pend derrière, étiqueté "steering wheel remote".
Ce fil est relié à une entrée "pull-up", et est considéré actif lorsqu'il est relié à la masse.
Faute de documentation j'ai acheté une télécommande infrarouge compatible, un analyseur logique, que j'ai relié à un démodulateur infrarouge.
Appuyer sur les boutons en capturant les signaux permet d'obtenir ce genre de graphe:
capture IR

Toujours sans documentation, mon interprétation est qu'un signal valide est composé d'un long préambule, puis de signaux codés sur 2x8 bits (addresse puis commande), puis d'un signal d'arrêt. Ça ressemble à un codage IR standard.
Ici un 1 est 660uS actif, puis 1.474mS de pause, un 0 est 440uS actif, puis 400uS de pause.

Plus qu'a écrire les instructions pour: interroger la télécommande sur son état, et envoyer un signal adapté à l'autoradio.

Le projet
Le circuit et le code sont mon github(En anglais)

Il faut pour le réaliser:
- de quoi compiler (GCC-AVR, un éditeur de texte)
- fer à souder, pcb vierge standard, fils, étain, les fournitures de base
- un ATmega
- de quoi le programmer (j'utilise un usbasp de chez eBay, pas cher, compatible linux
- un optocoupleur (par exemple 4N25)
- de quoi alimenter le circuit en 3-5V (chargeur usb ou bloc de piles alcalines)
- un support pour circuit imprimé ou deux, suivant la disposition sur le circuit.

Voila ça fonctionne à merveille, de rien.

notes: je considère la partie code comme terminée bien qu'une partie ne soit pas satisfaisante à mon goût (poller activement le flag de l'interruption plutôt qu'affecter successivement les valeurs du timer dans l'interruption elle même, par exemple).
Il manque un fichier .stl pour imprimer un boitier en 3D, peut-être une fois que j'aurais réappris à utiliser blender.
Il faudrait aussi un Makefile.

  • # Questions

    Posté par  (site web personnel) . Évalué à 3.

    Salut !
    J'y connais rien électronique, du coup : à quoi servent le 4N25 et la résistance de 1k en entrée ?

    • [^] # Re: Questions

      Posté par  . Évalué à 3. Dernière modification le 01 décembre 2017 à 10:25.

      L'auteur me corrigera si je me trompe :
      en général une résistance sert à réduire le courant (le courant peut endommager le composant si il est trop important)

      Un optocoupleur permet de transmettre un signal en séparant galvaniquement la masse (pour séparer commande de la puissance)

      • [^] # Re: Questions

        Posté par  . Évalué à 7. Dernière modification le 01 décembre 2017 à 11:43.

        Mes connaissances en électronique sont au bas mot limitées donc à prendre avec un peu de recul mais oui c'est ça.

        Le 4N25 agit comme un transistor activé par une led IR intégrée, ça permet de séparer proprement la partie commande (coté microcontrôleur) de la partie "puissance" (coté autoradio/châssis)

        La résistance sert à limiter le courant passant par la led (à ma connaissance une diode s'autodétruit si elle est reliée directement à une alimentation sans résistance).

        En pratique le microcontrôleur ne peut pas émettre plus de quelques milli-ampères donc je suppose que cette résistance le protège aussi en lui évitant de s'épuiser inutilement à alimenter la led.

        Le circuit ressemble à ça:
        photo du circuit

        Le github contient une version minimaliste du circuit, avec un ATtiny à 8 pattes au lieu d'un gros ATmega, avec des commandes en moins.

        • [^] # Re: Questions

          Posté par  . Évalué à 5.

          En pratique le microcontrôleur ne peut pas émettre plus de quelques milli-ampères donc je suppose que cette résistance le protège aussi en lui évitant de s'épuiser inutilement à alimenter la led.

          D'ailleurs petit détail à propos de la led (je pinaille rien de grave), mais normalement il faut faire de la logique négative justement car ca évite au microcontrôleur de fournir le courant.

          Elle devrait être cablé comme cela :

          VCC ----|>|--[===]------- PB1 ta sortie de microcontrôleur
          (toi tu as fait :
          GND ----|<|--[===]------ PB1 ta sortie de microcontrôleur)

          Si ta sortie PB1 est à Vcc la led ne s'allume pas (pas de ddp), si ta sortie est à 0V ta led s'allume.

          Encore une fois c'est du détail, c'est surtout important quand tu as plusieurs led (une led par sortie de ton microcontroleur par ex).

          • [^] # Re: Questions

            Posté par  . Évalué à 2. Dernière modification le 01 décembre 2017 à 16:38.

            Si je ne dis pas de bêtise ton microcontrôleur supporte un courant maximum en sink(la limite est souvent plus haute) ou en source (souvent cette limite est par port), exemple.
            Donc ça change pas grand chose. Si tu veux commander plusieurs LEDs, il te faut des transistors.

          • [^] # Re: Questions

            Posté par  . Évalué à 2.

            D'ailleurs petit détail à propos de la led (je pinaille rien de grave), mais normalement il faut faire de la logique négative justement car ca évite au microcontrôleur de fournir le courant.

            C'est rarement le cas sur les microcontrôleurs (en fait je n'en ai jamais vu), par contre dans le cas où tu passe par un expander I²C (PCF8574), il y a plutôt intérêt.

            Ici ça aurait 2 intérêts:
            1. autoriser un changement de tension (microcontrôleur alimenté en 3.3V, leds en 5V), sous réserve que la patte du micro accepte (donc vrai collecteur ouvert ou tolérant au 5V ce qui n'est pas le cas de l'ATtiny12)
            2. comme le transistor de sortie de l'opto-coupleur va inverser le signal, ça fait double inversion et donc le code est plus facile à lire.

            Les vrais naviguent en -42

        • [^] # Re: Questions

          Posté par  . Évalué à 3. Dernière modification le 01 décembre 2017 à 19:41.

          Tant que j'y suis,

          La résistance sert à limiter le courant passant par la led (à ma connaissance une diode s'autodétruit si elle est reliée directement à une alimentation sans résistance).

          La led doit être pilotée en courant (max 60mA) car la relation courant(tension) est exponentielle.

          Pour calculer ça, la datasheet indique les performances pour 10mA, donc en général on se base sur cette valeur, on obtient une tension au borne de la led de 1.15V à température ambiante (cf graph).
          Après c'est assez facile, si ton microcontrôleur est alimenté en 3.3V, (3.3-1.15) / 0.01 = 215 ohms

          Avec 1 Kohm, les fronts en sortie risquent d'être moins raides. Si tu as des erreurs de transmissions, tu sauras ce qu'il te reste à faire.

          Les vrais naviguent en -42

          • [^] # Re: Questions

            Posté par  . Évalué à 2.

            Après c'est assez facile, si ton microcontrôleur est alimenté en 3.3V, (3.3-1.15) / 0.01 = 215 ohms
            Avec 1 Kohm, les fronts en sortie risquent d'être moins raides. Si tu as des erreurs de transmissions, tu sauras ce qu'il te reste à faire.

            Merci pour cette remarque, je vais corriger le schéma.

        • [^] # Re: Questions

          Posté par  . Évalué à 3.

          La résistance sert à limiter le courant passant par la led (à ma connaissance une diode s'autodétruit si elle est reliée directement à une alimentation sans résistance).

          C'est bien ça : une diode est ni plus ni moins qu'un "fil" fragile qui laisserait passer le courant dans un seul sens, et qui chauffe et fond si le courant qui le traverse est trop élevé.
          Une diode sans résistance équivaut donc à un court-circuit : tout le courant que peut fournir ton alim passe donc dans cette diode, ce qui la fait chauffer et fondre. Elle ne s'autodétruit pas, c'est le courant qui la détruit.

  • # Merci, merci, merci !!!

    Posté par  . Évalué à 9. Dernière modification le 01 décembre 2017 à 14:53.

    Enfin un truc intéressant sans la surcouche Arduino. Bravo !!! En plus, ça tient sur un atTiny à 8 broches. Félicitations, ça change du "tout arduino".

  • # Pas tout compris :(

    Posté par  . Évalué à 3.

    J'aime bien l'idée générale du projet mais il manque pas mal d'informations pour en saisir l'utilité et la réalisation:
    - Pourquoi la télécommande filaire devient inutile? En quoi la télécommande infrarouge est-elle plus utile?
    - Tu expliques comment tu as déchiffré les signaux infrarouges de la télécommande, mais pas comment tu as trouvé quels sont les signaux à envoyer sur "l'énigmatique" fil bleu de l'auto-radio. J'ai raté un truc ?

    • [^] # Re: Pas tout compris :(

      Posté par  . Évalué à 0.

      mmmh, tout est dans les sources :)

    • [^] # Re: Pas tout compris :(

      Posté par  . Évalué à 8.

      Je reconnais que ma rédaction a quelques lacunes.

      Pourquoi la télécommande filaire devient inutile? En quoi la télécommande infrarouge est-elle plus utile?

      La télécommande filaire devient inutile parce qu'elle est prévue pour l'autoradio d'origine de 1998, pas celui que j'ai acheté début 2017.

      La télécommande infrarouge ne peut pas agir sur le nouvel autoradio (vu qu'il n'est pas équipé de récepteur infrarouge).

      Je l'ai achetée car je fais le pari que JVC n'a pas dix protocoles différents pour une gamme semblable d'équipements, et qu'une télécommande prévue pour un modèle similaire utilisera un codage identique.

      Tu expliques comment tu as déchiffré les signaux infrarouges de la télécommande, mais pas comment tu as trouvé quels sont les signaux à envoyer sur "l'énigmatique" fil bleu de l'auto-radio. J'ai raté un truc ?

      Les signaux à envoyer sur le fil bleu sont ceux que j'ai relevé.
      J'appuie sur "volume +" sur la télécommande infrarouge, j'observe la forme du signal sur mon pc, et je me débrouille pour que mon circuit puisse le reproduire à l'identique.

      En pratique les signaux infrarouges sont modulés à 25 ou 30 ou quelques dizaines de kilohertz mais je n'ai pas à m'en occuper parce que:
      1. Le démodulateur placé avant l'analyseur logique élimine (pas sur du terme) la modulation
      2. Je n'ai pas non plus besoin de moduler le signal en sortie puisque je communique avec l'autoradio par un fil (et que le role de la modulation est de rendre le signal optique moins sensible aux perturbations de l'environnement)

  • # Suggestion

    Posté par  (site web personnel) . Évalué à 1.

    C'est sympa de partager ce projet.

    Je vois qu'il y a deux fichiers sources, chacun pour une cible différente, ce qui se conçoit car les deux circuits malgré qu'ils soient du même fabriquant et qu'ils partagent des contrôleurs de périphériques similaires mappent malheureusement leurs registres différemment en mémoire.

    Pour faciliter le portage entre différents circuits, j'ai développé (et je continue de temps en temps) une couche d'abstraction pour programmer du matériel avec des instructions génériques sans impacter les ressources : le code binaire obtenu est le même qu'avec un code source qui accède directement aux registres. Des exemples sont fournis () qui montrent que les mêmes fichiers sources peuvent se compiler pour différents circuits.

    Le projet est hébergé là : https://github.com/duparq/hwa

    « J'ai pas Word, j'ai pas Windows, et j'ai pas la télé ! »

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.