Adaptateur commandes au volant Renault


Suite a un changement d’un autoradio pour une laguna 2 pour un autoradio pioneer DEH-S41BT, la partie commande au volant n’est évidemment non compatible avec l’autoradio.

Mon but créer un adaptateur pour transformer la commande au volant d’origine en commande Pioneer

Pour ca, on va étudier le fonctionnement de la commande Renault et la commande Pioneer. 

Puis créer un système permettant de faire communiquer les 2.

La comande au volant de Laguna 2

On va commencer par trouver comment celle-ci est reliée avec un multimètre,
Soit une matrice soit un protocole bizarre .

Bon c’est une matrice mais avec la molette qui est un sélecteur de position tout le temps activé ce qui complique la lecture de la matrice.

L’autoradio

Pour l’autoradio, un DEH-S41BT, il possède un port W/R qui après quelques recherches sur internet j’ai trouvé que se port est simplement passif il ne fait que mesurer la resistance entre les pins du port.

J’ai relié un potentiomètre avec un switch entre le bout du jack et la masse.
et je suis passé de 500ohm a 500ohm pour trouver les fonctions sur l’autoradio.
et j’ai trouvé ceci:


Valeur en kOhm

TIP 

Source 
1—2 

Mute 
2,5—4,5 

Disp
5—6,5

Suivant 
7—9  

Precedent 
9,5—13,5 

Vol+
14—18 

Vol-
19—29.  

Band
36—82

RING 

Raccroche
1.5—2.5

Répondre
3—7.

Le materiel

J’ai décidé d’utiliser un Atmega328p la matrice est reliée sur les bornes A0 jusque A5. Pour pouvoir utiliser un port de la puce pour l’optimisation.

Dans le cas de la partie de l’autoradio, j’ai relié les résistances et une diode sur les bornes de D0 a D7. pour pouvoir utiliser un port complet.

Le tout monté sur une perfboard et le tout le plus compact pour pouvoir tout rentrer dans un boîtier imprimé en 3D

Pour le matériel il m’a fallu:
– un atmega328p
– un quartz de 16MHz
– 2 condensatuer de 20pf
– 7 resistances de 10kohm
– 1 resistance de 2,2k ohm
– 1 resistance de 6,8k ohm
– 1 resistance de 3,9k ohm
– 1 resistance de 8,2k ohm
– 1 resistance de 15k ohm
– 1 resistance de 22k ohm
– 1 diode.
– 1 régulateur 5v
– 1 cable jack.
– 1 cable pour se relier sur la commande au volant (j’ai le moyen d’en avoir mais coupez celui existant si vous voulez pas vous embêter )

J’ai j’ajouté un régulateur 5v et ensuite coupé la carte au plus prêt de la puce et des composant. Le tout pour avoir un cylindre de 18mm par 60mm

Le code

e vais deja commencer par expliquer un peu les port et pourquoi je les utilise.

il faut savoir que lorsque vous écrivez du code dans l’IDE Arduino il est convertit en code AVR qui ensuite est compilé pour la puce.

Dans le cas des écritures des états des pin ou de leur fonction le code est très peu optimisé

par exemple si vous voulez définir toutes les broches analogiques en entrée vous faites comme ceci:

pinMode(0,INPUT);
pinMode(1,OUTPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);

Ce qui met toutes les broches les une après les autres en entrée sauf D1 en sortie.
mais il y a plus optimisé, ceci:

DDRC = B00000010;

Tout ce fait EN MEME TEMPS

Idem pour l’écriture des états des pin haut ou bas au lieu que celles ci s’actives les unes après les autre elle le font toutes en meme temps

Faire comme ceci m’a permis de rendre le programme 5x plus rapide et d’économiser 30% de place(bien que pas nécessaire).

Donc voici le code complet:

//Commande au volant
// AVR ATMEGA328p
//Diolum 04/19


 int Molette = 0; //position de base de la molette a 0
 int DejMol1=1; //variables de position molette pour connaitre le sens
 int DejMol2=1;
 int DejMol3=1;
 
 
void setup() {
  Molette_pos(); //lecture de la position initiale de la molette
    DDRD = B00000000; //reset des pins de la matrice 
}


void loop() {
int BTPRE[5]={1,1,1,1,1}; //variable des bouton pressés 


res(); //reset des pins de la matrice 
//lecture des boutons G et D
DDRC = B00000010;
PORTC = B00000010;
if(digitalRead(A0)==1){BTPRE[0]=0;}//G
if(digitalRead(A3)==1){BTPRE[1]=0;}//D


res(); //reset des pins de la matrice 
DDRC = B00000100;
PORTC = B00000100;
//lecture des boutons zarb vol+ et -
if(digitalRead(A3)==1){BTPRE[2]=0;}//Zarb
if(digitalRead(A0)==1){BTPRE[3]=0;}//VOL-
if(digitalRead(A5)==1){BTPRE[4]=0;}//VOL+


res();//reset des pins de la matrice 

Molette_pos(); //lecture de la position de la molette

  //execution des états de la molette 
if (Molette == 1){
 if(DejMol1==1){
  if(DejMol2==0){PRE();}//haut
  if(DejMol3==0){SUI();}//bas
  DejMol1=0;DejMol2=1;DejMol3=1;} 
}  
  
if (Molette == 2){
  if(DejMol2==1){
    if(DejMol3==0){PRE();}//haut
    if(DejMol1==0){SUI();}//bas
    DejMol2=0;DejMol1=1;DejMol3=1;}
}

if (Molette == 3){
 if(DejMol3==1){
    if(DejMol1==0){PRE();}//haut
    if(DejMol2==0){SUI();}//bas
    DejMol3=0;DejMol1=1;DejMol2=1;}
} 

//execution des états des boutons
if(BTPRE[2]==0){     //ZARB = SOURCE = D0
  DDRD = B00000001;
PORTD &= B11111110;
delay(300);
}
if(BTPRE[0]==0){     //G = REP = D0 + D7
  DDRD = B01000001;
PORTD &= B10111110;
delay(300);
}
if(BTPRE[4]==0 && BTPRE[3]==1){     //VOL+ = D3
  DDRD = B00001000;
PORTD &= B11110111;
delay(300);
}
if(BTPRE[3]==0 && BTPRE[4]==1){     //VOL- = D4
  DDRD = B00010000;
PORTD &= B11101111;
delay(300);
}
if(BTPRE[3]==0 && BTPRE[4]==0){     //VOL-+VOL+=Mute = D6
  DDRD = B00100000;
PORTD &= B11011111;
delay(300);
DDRD = B00000000;
}
if(BTPRE[1]==0){     //D = RAC = D6 + D7
  DDRD = B01100000;
PORTD &= B10011111;
delay(300);
}
 DDRD = B00000000;
}


//fonction molette vers le haut
void PRE(){
  DDRD = B00000010;
PORTD &= B11111101;
 delay(300);
  DDRD = B00000000;
}
//fonction molette vers le bas
void SUI(){
  DDRD = B00000100;
PORTD &= B11111011;
delay(300);
  DDRD = B00000000;
}



//fonction lecture pos. molettes
void Molette_pos() {
res();
DDRC = B00000001;
PORTC =B00000001;
if(digitalRead(A4)==1){
  res();
DDRC = B00000100;
PORTC = B00000100;
if(digitalRead(A5)==1){}
else{Molette=1;} 
  }
res();
DDRC = B00010000;
PORTC =B00010000;
if(digitalRead(A3)==1){
if(digitalRead(A0)==1){}
else{Molette=2;} 
}
res();
DDRC = B00010000;
PORTC =B00010000;
if(digitalRead(A5)==1){
if((PINC & B00100001)==(B100001) == 1){}
else{Molette=3;}
}
}

void res(){PORTC = B00000000;}//fonction reset

Le Boitier

Il est a imprimer 2x puis a serrer avec des vis de 3mm

Le Montage

L’adaptateur avant montage des mousses et des rubans protecteurs: 

L’adaptateur apres montage des mousses et des rubans protecteurs on peu y voir le port de programmation que j’ai laissé au cas ou: 

Donc pour ca j’ai retiré le faisceau entre la voiture et l’autoradio et j’ai soudé la masse sur la masse et le 12v sur le +APC.

Et ensuite j’ai tout monté dans la voiture.