Table des matières:

Clés du volant vers adaptateur stéréo de voiture (bus CAN -> Key1) : 6 étapes
Clés du volant vers adaptateur stéréo de voiture (bus CAN -> Key1) : 6 étapes

Vidéo: Clés du volant vers adaptateur stéréo de voiture (bus CAN -> Key1) : 6 étapes

Vidéo: Clés du volant vers adaptateur stéréo de voiture (bus CAN -> Key1) : 6 étapes
Vidéo: branchement d'un poste double din avec faisceaux canebus recuperation commende au volant 2024, Juillet
Anonim
CAN Bus reniflant
CAN Bus reniflant
Envoi de commandes à la stéréo
Envoi de commandes à la stéréo

Quelques jours après l'achat d'une voiture d'occasion, j'ai découvert que je ne pouvais pas écouter la musique de mon téléphone via l'autoradio. Encore plus frustrant, la voiture était équipée du Bluetooth, mais n'autorisait que les appels vocaux, pas la musique. Il avait également un port USB Windows Phone, mais il ne fonctionnerait pas avec un iPhone sans un dongle à 60$.

Ayant remplacé les stéréos sur mes voitures précédentes, sans trop de réflexion ni de recherche, j'ai commandé une stéréo de remplacement à 40 $ sur un site Web "pas cher" bien connu. La chaîne stéréo était livrée avec une caméra de recul, Car Play et un tas de fonctionnalités supplémentaires, ce qui semblait un bien meilleur rapport qualité-prix que le dongle plus cher qui ne fait qu'une chose.

Après avoir acheté et peint une nouvelle façade, imprimé en 3D un support et beaucoup de travail supplémentaire (qui pourrait être instructable en soi), je suis arrivé à une découverte désagréable. Les commandes au volant étaient envoyées via le bus CAN, mais la chaîne stéréo n'avait qu'une entrée Key1. N'étant pas du genre à abandonner à mi-chemin, j'ai commandé un adaptateur à 60 £, qui s'est avéré ne pas fonctionner. À ce stade, j'ai décidé de faire un adaptateur moi-même.

Je ne suis pas ingénieur électricien, je n'ai que des connaissances rudimentaires en électronique et c'était un projet d'apprentissage et d'exploration pour moi. Mon conseil serait de vérifier d'abord les spécifications de votre véhicule et de commander une radio compatible, mais si vous êtes déjà bloqué (comme je l'étais), suivez les instructions à vos risques et périls.

Fournitures

L'adaptateur (environ 15$)

  • Arduino Pro Mini 5V (ou une carte compatible)
  • Module bus CAN MCP2515
  • panneau perforé 60x80mm
  • Potentiomètre numérique X9C104 100K Ohm (dépend de votre chaîne stéréo)
  • Régulateur abaisseur DC-DC LM2596S 3-40V 3A
  • Câble porte-fusible + fusible (100-200 Ohm)
  • Boite à projet ou imprimante 3D pour l'imprimer
  • Prises stéréo de voiture (mâle + femelle)
  • Fournitures de soudure, fils, etc.

Aides aux tests (pas strictement nécessaires mais rendront les tests beaucoup plus faciles)

  • Arduino (n'importe quelle carte 5V fera l'affaire)
  • Module bus CAN MCP2515
  • Planche à pain + pulls

Étape 1: reniflage du bus CAN

Au lieu d'avoir un tas de fils à l'intérieur de votre voiture interconnectant un tas de systèmes, certains véhicules modernes ont des paires de fils qui relient chaque composant. Les informations sont envoyées sous forme de paquets de données numériques via ces fils, et tous les systèmes peuvent lire tous les messages. Il s'agit du réseau de bus CAN (il peut y avoir plusieurs réseaux dans votre voiture, donc toutes les informations peuvent ne pas être visibles).

Ce que nous voulons faire, c'est nous connecter au réseau de bus CAN et "renifler" le trafic de données. De cette façon, nous pouvons "voir" quand une touche au volant est enfoncée. Chaque paquet a un ID, qui représente le sous-système du véhicule qui a envoyé le paquet, et les données qui représentent l'état du système. Dans ce cas, nous essayons de trouver l'ID du sous-système qui envoie les messages de clé au volant et la représentation des données de chaque clé.

Si vous avez de la chance, vous pouvez trouver les valeurs de votre voiture quelque part en ligne et ignorer cette étape.

Ce processus est un peu compliqué et a déjà été expliqué dans d'autres endroits, donc je vais juste le résumer:

  • Trouvez les valeurs correctes pour la communication du bus CAN sur votre véhicule. Pour ma voiture (une Fiat Idea 2009), il s'agissait d'un débit en bauds de 50 Kbps et d'une vitesse d'horloge de 8 MHz.
  • Connectez-vous au réseau de bus CAN à l'aide du module de bus CAN et d'un Arduino dans une configuration "renifleur".
  • Lisez les valeurs du bus CAN sur votre ordinateur portable à l'aide d'un outil tel que https://github.com/alexandreblin/python-can-monito…. Il sera très difficile de le faire sans elle, car de nombreux messages sont envoyés même lorsque la voiture ne fait rien.
  • Appuyez sur le bouton du volant et notez les changements de valeur. Cela peut être un peu délicat car de nombreux messages sont envoyés et il peut être difficile de savoir lequel est lequel.

Voici deux excellents articles expliquant le processus en profondeur:

  • https://medium.com/@alexandreblin/can-bus-reverse-…
  • https://www.instructables.com/id/CAN-Bus-Sniffing-…

En fin de compte, vous devriez avoir l'ID du sous-système que nous utiliserons pour écouter uniquement les messages du bus CAN au volant et une liste de valeurs hexadécimales pour les commandes de touches. Dans mon cas, les données ressemblaient à ceci:

ID | ID Hex | Octet 0 | Octet 1 | Bouton

--------------------------------------------- 964 | 3C4 | 00 | 00 | Pas de boutons 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Téléphone 964 | 3C4 | 00 | 08 | ESC 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Gagnez 964 | 3C4 | 00 | 02 | Jusqu'à 964 | 3C4 | 00 | 01 | Vers le bas 964 | 3C4 | 00 | 04 | d'accord

L'ID du sous-système est 3C4 (dans ce cas), qui est un nombre hexadécimal, nous devrions donc l'écrire comme 0x3C4 dans les croquis Arduino. Nous nous intéressons également aux octets 0 et 1 (dans votre cas, il pourrait y avoir plus d'octets). Ce sont également des valeurs hexadécimales, elles doivent donc également être écrites avec un 0x de début.

Si vous convertissez les valeurs en binaire, vous remarquerez que les bits ne se chevauchent pas (par exemple + 0b10000000 et - 0b01000000) c'est ainsi que plusieurs touches peuvent être enfoncées en même temps.

Je suggère de construire le renifleur avec les matériaux répertoriés dans la section « assistant de test », afin que vous puissiez le réutiliser plus tard pour simuler votre voiture. Cela vous éviterait de rester assis dans votre voiture pendant que vous construisez et testez l'adaptateur. Vous pouvez utiliser le croquis fourni pour agir en tant que simulateur. Modifiez "subsystemId", "data0" et "data1" avec les valeurs que vous avez reniflées.

Étape 2: Envoi de commandes à la stéréo

Envoi de commandes à la stéréo
Envoi de commandes à la stéréo

Avant de commencer à construire l'adaptateur, il est préférable de tester d'abord si la chaîne stéréo peut recevoir des commandes.

J'avais une batterie de voiture de rechange, alors j'y ai connecté la chaîne stéréo directement. Si vous avez une source d'alimentation de table 12V, c'est encore mieux. Malheureusement, je n'ai pas pu trouver beaucoup d'informations en ligne sur l'entrée Key1 de mon appareil, j'ai donc eu recours à l'expérimentation. Je n'étais pas trop inquiet de brûler la chaîne stéréo à ce stade, car elle est relativement bon marché, et c'était ma dernière tentative pour la faire fonctionner avec ma voiture.

La chaîne stéréo dispose d'un écran d'apprentissage des commandes, où il est possible de sélectionner l'une des deux valeurs de résistance (1K et 3,3K) et de voir la valeur de "tension" (0-255). "Tension" est cité parce qu'il est trompeur. J'ai passé beaucoup de temps à appliquer différentes tensions à Key1 sans succès. J'ai également essayé d'utiliser différentes résistances pour appliquer la tension sans succès.

La percée s'est produite lorsque j'ai essayé de toucher le fil Key1 à la masse de la batterie, ce qui a entraîné une chute de la "tension" à 0. Ceci, combiné à différentes résistances, produirait des valeurs de "tension" cohérentes sur l'écran d'apprentissage.

Maintenant que je savais comment envoyer des entrées à la stéréo, j'avais besoin d'un moyen de les envoyer depuis un Arduino. À ce stade, je n'ai pas entendu parler de multiplexeurs, qui, avec certaines résistances, auraient pu être une solution plus rapide et plus fiable (je ne sais toujours pas si cela est faisable), j'ai donc utilisé un potentiomètre numérique. Au début, j'ai eu des problèmes pour faire fonctionner le pot numérique, jusqu'à ce que je comprenne que je devais le câbler comme un rhéostat pour agir comme une résistance variable au lieu d'un diviseur de tension. Fondamentalement, je devais connecter les bornes RH et RW.

Outre la résistance, le timing était crucial. Si la chute de résistance est trop courte, la commande ne sera pas enregistrée. S'il est trop long, il peut être enregistré plusieurs fois. Une chute de 240 ms, suivie d'un délai de 240 ms jusqu'à ce que la prochaine commande fonctionne de manière assez fiable pour ma chaîne stéréo. Bien que cela semble être très peu de temps, cela signifie que nous pouvons envoyer un maximum de 2 commandes par seconde, ce qui est perceptible si vous essayez d'augmenter ou de baisser rapidement le volume. J'ai essayé de jouer avec différents timings et modèles, ce qui a augmenté la vitesse mais n'était pas très fiable. Si vous avez des idées sur la façon d'améliorer cela, veuillez les laisser dans les commentaires.

Avant d'aller plus loin, je suggère de construire un prototype pour vérifier si votre chaîne stéréo accepte le même type d'entrée. Même s'il accepte des tensions différentes, l'adaptateur doit fonctionner avec de légères modifications du câblage et du croquis Arduino.

Étape 3: Création de l'adaptateur

Construire l'adaptateur
Construire l'adaptateur
Construire l'adaptateur
Construire l'adaptateur
Construire l'adaptateur
Construire l'adaptateur

Après avoir testé tous les composants séparément et les avoir essayés ensemble sur une maquette, il était temps de leur donner un foyer plus permanent. Cela a pris quelques heures de disposition des composants et de soudure.

En haut à gauche se trouve le régulateur abaisseur, qui transforme le 12V de la batterie de la voiture en 5V qui peut être utilisé par les autres composants.

En bas à gauche se trouve le module de bus CAN, qui lit les valeurs du réseau de bus CAN de la voiture et les transmet à l'Arduino.

En haut à droite se trouve le potentiomètre numérique (câblé comme un rhéostat) qui agit comme une résistance variable entre la terre et l'entrée Key1 de la chaîne stéréo.

En bas à droite se trouve l'Arduino, qui agit comme le cerveau de l'adaptateur, transformant les messages du bus CAN en résistances qui sont lues par la stéréo.

Sur l'entrée 12V se trouve un fusible de 150mA, qui ne protégera probablement pas le circuit, mais est là pour empêcher un incendie en cas de court-circuit.

Étape 4: Le logiciel

Les logiciels
Les logiciels

Après le téléchargement, placez les trois fichiers.ino dans un seul dossier. De cette façon, tous feront partie du même croquis et seront déployés ensemble sur l'Arudino.

Vous devez également ajouter les bibliothèques requises à l'IDE Arduino. Pour cela, téléchargez les fichiers suivants:

github.com/autowp/arduino-mcp2515/archive/…

github.com/philbowles/Arduino-X9C/archive/…

puis ajoutez les deux en allant dans Sketch > Inclure la bibliothèque > Ajouter la bibliothèque. Zip…

CanBusStereoAdapter.ino

La configuration de base est effectuée dans ce fichier.

Les valeurs du bus CAN de la commande clé sont définies en haut. À moins que vous n'ayez la même voiture que moi, vous devrez probablement mettre vos propres valeurs. Vous pouvez utiliser les valeurs hexadécimales du renifleur, j'ai utilisé du binaire pour qu'il soit plus facile de voir qu'il n'y a pas de chevauchements accidentels dans les bits.

Toutes les voitures n'ont pas les mêmes commandes au volant, alors n'hésitez pas à supprimer, ajouter ou modifier les valeurs définies.

N'oubliez pas de remplacer votre identifiant de sous-système par "STEERING_ID".

CanBus.ino

Ce fichier configure l'écouteur du bus CAN, interprète les paquets et place les valeurs de résistance dans un tampon circulaire.

Ajustez la configuration du bus CAN dans la fonction "setupCanBus" en fonction de votre voiture.

Nous utilisons un tampon circulaire car, comme mentionné précédemment, l'entrée de commande au volant est beaucoup plus rapide que l'entrée stéréo. De cette façon, nous ne manquons aucune commande pendant que le potentiomètre numérique fait son travail. Si nous saisissons trop de commandes, les plus anciennes seront supprimées en premier, car elles sont les moins importantes. Cela nous permet également de gérer le cas où plusieurs boutons sont enfoncés, puisque l'entrée stéréo n'accepte qu'une seule valeur à la fois.

Si vous avez modifié l'une des définitions de commande dans "CanBusStereoAdapter.ino", vous devrez également les mettre à jour dans la fonction "handleMessageData". "handleMessageData" vérifie si les trames de données de bus CAN fournies contiennent l'une des commandes connues en utilisant une opération AND au niveau du bit.

Par exemple, si j'ai appuyé sur >> et + en même temps, cela nous donnera une trame de données avec une valeur de 0b10010000. >> (pour ma voiture) est 0b00010000 en binaire, et + est 0b10000000.

--------------- >> -------------- + ------------- << --- -- données0 | 0b10010000 | 0b10010000 | 0b10010000 commande | ET 0b00010000 | ET 0b10000000 | ET 0b00001000 résultat | = 0b00010000 | = 0b10000000 | = 0b00000000

Ici, nous pouvons voir que le résultat de l'opération AND sera supérieur à 0 si la commande est présente dans la trame de données. Donc, tout ce que nous avons à faire est de vérifier {data frame} & {command value} > 0, pour chaque commande que nous avons définie.

Gardez à l'esprit que chaque trame de données contient des commandes différentes, donc ce n'est pas grave si les valeurs de commande sont les mêmes, car nous les vérifions par rapport à leurs propres trames. Dans mon exemple, << et ESC ont tous deux la même valeur 0b00001000 (0x08), mais << est dans data0 et ESC dans data1.

Après avoir déterminé qu'une commande est présente dans une trame, nous ajoutons une valeur de pot numérique au tampon circulaire. Les valeurs vont de 0 à 99, mais j'ai remarqué que la "tension" lue par la stéréo n'est pas linéaire, alors testez les valeurs par vous-même.

DigitalPot.ino

Ce fichier extrait les valeurs du tampon circulaire et les envoie au pot numérique pour exécution. Dans mon cas "pot.setPotMin(false);" augmentera la résistance au maximum, que la stéréo lira comme "tension" maximale. Votre chaîne stéréo peut vous obliger à régler le potentiomètre numérique au minimum, alors testez-le.

Étape 5: La clôture du projet

La clôture du projet
La clôture du projet

J'ai une imprimante 3D, j'ai donc décidé d'imprimer un boîtier en deux parties pour mon adaptateur. J'ai inclus un fichier Fusion 360 que vous pouvez éditer, et des fichiers gcode qui s'adapteront à un perfboard de 60x80mm.

Si vous n'avez pas accès à une imprimante 3D, vous pouvez utiliser un boîtier de projet prêt à l'emploi ou un conteneur robuste.

Étape 6: Réflexions finales

J'avais initialement prévu que l'adaptateur soit connecté à une alimentation constante et se réveille sur certains messages du bus CAN, car ma voiture n'a pas de fil d'allumage dans le compartiment stéréo. J'ai ensuite décidé de ne pas le faire car je ne voulais pas risquer de vider la batterie et de m'inquiéter de l'adaptateur lorsque je suis loin de la voiture. J'ai utilisé un répartiteur de boîte à fusibles de voiture pour faire passer un fil d'allumage et ne pas avoir à compliquer davantage l'adaptateur.

D'après mes tests, la consommation électrique est de 20-30 mA. Je l'ai ramené à 10 mA en mode veille, et je pourrais aller encore plus bas en supprimant les LED des composants, mais j'ai décidé de ne pas m'en soucier car il ne fonctionnera que pendant que la voiture est en marche.

Je suis assez content du résultat final. Le temps de réponse est raisonnable et il manque rarement des commandes.

Même si mon investissement en temps était bien supérieur au coût de l'adaptateur disponible dans le commerce (qui ne fonctionnait pas), les connaissances que j'ai acquises sont inestimables.

Conseillé: