de base, notre Corsa n'a pas de commande aux volants, et rien ne nous obligeait a les integrer sur un modele qui n'en a pas. mais c'est beaucoup trop marrant interessant de rendre ces commandes-la :

utilisable avec une radio 2DIN, surtout quand celle-ci n'a pas de boutons physiques (comme beaucoup de radio 2DIN haut de gamme... yay?)
en theorie, c'est simple : c'est une resistance ladder qui a besoin d'un ground et en echange donne un signal, entre 0 et 5V (je crois en tout cas, car vu que je pullup ce machin avec une Arduino qui ne peut pousser que jusqu'a 5V, j'imagine qu'en mettant du 12V en logique, on aurait du 5V en max) qui donne une tension differente en fonction de quel bouton est presse, ou quand aucun bouton n'est presse. en pratique, il faut un poil de precautions pour creer un circuit portable.
car si, a tout hasard, vous voulez utiliser une Arduino pour interpreter les signaux des commandes au volant pour diverses raisons, et que vous souhaitez alimenter cette fameuse Arduino avec le courant de la voiture, vous allez vous heurter a un petit hic
pour reprendre un schema du circuit original, en simplifie :

le vrai piege de ce circuit, c'est le "shared ground", l'anode commune entre le klaxon et les differentes resistances qui composent ces fameuses commandes au volant.
sauf que, si l'on branche notre convertisseur DC-DC (d'une qualite doutable, tres important) pour alimenter notre Arduino, a l'arrivee 12V du contact ainsi qu'au chassis :

surprise, les boutons font desormais eux aussi office de klaxon. c'est bete mais logique : si le convertisseur DC-DC n'isole pas les deux circuits entre eux, le courant va vite trouver ce raccourci magique et... dooooong
solution : prendre un convertisseur DC - DC qui isole bien
bon, l'arduino c'est fait, elle peut lire les signaux (a suivre, j'indiquerai la marche a suivre plus bas, d'abord les soucis en prems) maintenant, il faut accomplir ce pourquoi on a commence ce projet : diriger la radio. dans mon cas, il s'agit d'un Pioneer SPH DA250DAB.
si je n'avais pas besoin d'interpreter les signaux des boutons pour d'autres usages, il aurait ete beaucoup plus simple (je crois) de simplement brancher la radio directement au fil SWC. en theorie en tout cas, en pratique, de ce que j'ai compris, les radios peuvent se montrer plutot capricieuse, meme si a la fin, on passe par de la calibration de toute facon... mais bref, ce n'est pas mon cas, je peux controler le signal que donne l'Arduino.
au fait, juste pour l'indiquer, j'ai decider de prendre une Arduino Nano pour ce projet. pourquoi une Arduino Nano? c'est un peu au hasard, j'ai griller ma micro:bit fetiche a cause de soucis de signal 5V dans du 3.3V (encore), donc je me suis dis tant pis, au moins l'ATmega supporte tranquillement le 5V.
bref, il me faut donc un potentiometre numerique ! car juste du PWM pourrait s'averer difficile a configurer (en vrai, j'ai meme pas tester, j'ai un peu peur de ce que je peux faire a cette radio qui coute un poil cher...)
mais aussi une prise jack, car malheureusement, c'est comme ca que communique la radio. si vous voyez un fil bleu qui dit "remote control", ce n'est pas pour les commandes au volant... si j'ai bien compris, il s'agit de l'alimentation de caisson de basse...
ca donnerait grosso modo ca :

bon, ce schema est pas super beau... je mettrai ca au propre dans un vrai logiciel d'EDA. mais l'idee est la : a coup de potentiometre numerique connecte en SPI, j'enverrai a la radio un signal X ou Y. peu importe le signal envoye, tant qu'il rentre dans les limites de votre radio, le plus important c'est qu'ils soient tous different puis ensuite c'est calibration
a savoir que j'utilise PlatformIO et que je publierai le code sur GitHub en temps et en heure, je mettrai un lien en bas. en tout cas, je suis partie sur des structs pour representer les differents boutons :
#pragma once
enum class ButtonValue { Left, Right, Up, Plus, Minus, O };
struct VoltageRange {
float min;
float max;
};
struct Button {
VoltageRange range;
ButtonValue value;
char label;
};
// Returns a pointer to the matched Button, or nullptr if no button matches.
const Button* button_decode(float voltage);
et dans mon cas, les boutons ressemblent a peu pres a ca (2 boutons sont H.S. mais je les reparerai des que je peux) :
static const Button BUTTONS[] = {
{{1.718f, 1.728f}, ButtonValue::Minus, '-'},
{{1.728f, 1.738f}, ButtonValue::Plus, '+'},
{{1.738f, 1.748f}, ButtonValue::O, 'O'},
{{1.775f, 1.793f}, ButtonValue::Left, '<'},
{{1.808f, 1.878f}, ButtonValue::Up, '^'}
};
Ce qui est a lire c'est les differentes tensions a gauche, dans l'ordre : le minimum, et le maximum. le caractere tout a droite, c'est pour du debuggage. je conseille d'ailleurs fortement de tester avant les differentes resistances au multimetre, ou bien de brancher directement l'Arduino et de verifier la valeur retournee pour chaque bouton appuye. faites attention si vous avez des cables qui ne sont pas branches comme dans mon cas: si vous avez un signal flottant, c'est probablement a cause de ca.
enfin, le coeur du systeme :
const Button* button_decode(float voltage) {
for (int i = 0; i < BUTTON_COUNT; ++i) {
if (voltage >= BUTTONS[i].range.min && voltage <= BUTTONS[i].range.max) {
return &BUTTONS[i];
}
}
return nullptr;
}
c'est avec ca, tournant toutes les 100ms, que je deduis quel bouton est appuye. tout ca est bien sur faisable a l'aide de code Arduino classique, je trouve juste plus de confort a... ne pas utiliser l'IDE Arduino
pourquoi je m'embete pour tout ca ? eh bien, je vois le TID, le Triple Information Display de ma voiture qui ne sert pas a grand chose. je pourrais deconnecter l'AA (Antennae Amplifier, le signal pour indiquer que l'antenne est activee) et avoir la date en permanence... ou alors, je peux connecter mon Arduino en I2C avec ce TID et montrer des informations indicatives ! voir meme plus, car je souhaitais modder aussi la durete de la direction assistee, j'ai deja trouve un module qui pourrait faire l'affaire mais je pensais sauvegarder les reglages sur l'Arduino. enfin, et ca c'est vraiment un gros gros projet, j'ai l'intention de faire un piggyback special qui ne s'occupe que de l'injection (j'attrape le signal de l'injection et je le retravaille) pour pouvoir passer la voiture en flexfuel, et je souligne le flexfuel : si je n'ai pas d'ethanol sous la main, je souhaiterai utiliser du sans plomb. donc, il me faudra brancher un capteur de concentration d'alcool...
c'est beaucoup pour de si petites machines et oui, ca va rabaisser la robustesse de ma Corsa... sauf si je prevois des fallbacks, et encore... mais le jeu en vaut vraiment la chandelle, enfin, en tout cas, c'est passionnant.