Le site dédié à l'Alfa Romeo 147
FAQFAQ RechercheRechercher MembresListe des Membres S'enregistrerS'enregistrer Mon ProfilProfil Messagerie privée (MP)Se connecter pour vérifier ses messages privés ConnexionConnexion


Exploitation réseau CAN et affichage
Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7  Suivante
 
Poster un nouveau sujet   Répondre au sujet    ALFA 147 France Index du Forum -> Divers
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Arthur_035



Inscrit le: 11 Nov 2007
Messages: 182
Localisation: 35

MessagePosté le: 25 Fév 2015 23:28    Sujet du message: Répondre en citant

Voilà une réalisation, côté VW : http://www.zzottel.de/index_en.html
le côté graphique en plus, ...
et probablement une plus grande connaissance du protocole !!!
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé




leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 26 Fév 2015 10:36    Sujet du message: Répondre en citant

C'est sympa comme réalisation. Il semble aussi que l'afficheur soit un peu plus modulable que celui de nos AR ....
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
CocoNat's



Inscrit le: 30 Mai 2014
Messages: 380
Localisation: Oise

MessagePosté le: 26 Fév 2015 11:56    Sujet du message: Répondre en citant

Très sympa...
Le graphic de soufflement du turbo (comme les Giu / MiTo) c'est plutôt cool !
Je suis impatient d'avoir un tuto pour l'installer.. :)
_________________

Alfa Romeo 147 (vendue)
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 26 Fév 2015 22:56    Sujet du message: Répondre en citant

Allez ! Pour les bases d'un tuto, voilà de quoi faire le montage de l'arduino et des 2 hc-05


Dernière édition par leo le 26 Mar 2015 00:21; édité 4 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Arthur_035



Inscrit le: 11 Nov 2007
Messages: 182
Localisation: 35

MessagePosté le: 27 Fév 2015 21:34    Sujet du message: Répondre en citant

Bonjour,

Concernant les messages qui transitent sur le bus CAN confort, voici les informations que j'ai pu décoder :
(certaines sont issues de sites web cités sur la 1ère page) :


Je suis intéressé par tout complément, ...
notamment les messages, en 7xx, sont encore obscurs, ...

A disposition pour toute explication !
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Arthur_035



Inscrit le: 11 Nov 2007
Messages: 182
Localisation: 35

MessagePosté le: 27 Fév 2015 21:52    Sujet du message: Répondre en citant

Voici des informations sur l'accès aux informations situées dans les modules, pilotables via le réseau CAN :


Les modules ont une adresse (04, 85, …).
Les réponses sont reçues sur une autre adresse spécifique (7C0, …)

Voici quelques modules accessibles :

BODY COMPUTER (NBC) :
04 parle sur 7C0
Dashboard (NQS) :
85 Parle sur 7C3
ClimateControl (NCL)
08 parle sur 7CA
Drivers'Door (NPG)
0E Parle sur 7C8
Boot (NVB)
8A parle sur 7C9



Pour parler sur le bus :
On se déclare :
ATSH 7B0 : SetHeader Module diagnostic
On dit de qui on veut recevoir :
ATCRA 7C0 : CAN Receive Adrress Filter (7C0 pour le body Computer)

Ensuite :
Pour établir la connexion avec un module :
8502 10 81 :
85 : Module Dashboard (ici le BodyComputer)
02 : lg données
10 : Start DiagSession
81 : defaultMode

Pour modifier une valeur :
8504 30 XX 07 YY
85 : Module Dashboard
04 : lg
30 : inputOutputControlByLocalIdentifier
XX : inputOutputControlParameter (le paramètre à modifier)
07 : ShortTermAdjustment
YY : valeur à positionner (00-FF)

Pour lire une valeur :
8502 21 32
85 : Module de destination
02 : lg
21 : readDataByLocalIdentifier
XX : inputOutputControlParameter (le paramètre à lire)

Pour fermer la connexion avec un module :
8501 20 :
85 : Module de destination
01 : lg
20 : StopDiagnosticSession


Exemples :
Le niveau d'huile ? C'est dans le tableau de bord.
ATSH 7B0
ATCRA 7C3
8502 10 81
8502 21 32
Réponse : F103 61 32 07 00 00 00
07 = 7 barres, c'est le max !
9502 20

Mettre l'aiguille moteur dans le rouge ? (aucun intérêt)
C'est encore dans le tableau de bord.
ATSH 7B0
ATCRA 7C3
8502 10 81
8504 30 73 07 FF
8502 20


PLus de détail sur le protocole dans les docs de référence (dispo sur le net) :
7274 : Fiat Standard Diagnostic on CAN


Dernière édition par Arthur_035 le 09 Avr 2015 23:00; édité 1 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Arthur_035



Inscrit le: 11 Nov 2007
Messages: 182
Localisation: 35

MessagePosté le: 27 Fév 2015 22:53    Sujet du message: Répondre en citant

Voici les codes (InputOutputParameter) des principaux éléments :

Pour le Body :
clignotant droit
0B
clignotant gauche
0A
Phares
06
Feu de freinage gauche
1B
Feu de freinage droit
1C
UnLock
0F
Lock
10
Lumières int. AV
16
Lumières Int. ARR
18


Pour le tableau de bord :
CruiseLight
07
Odomètre
20
Km Last service
22
Service reading
25
Oil level
32 (de 0 à 7)
RPM
35 (1Ah=26d -x32->832, 29h=41d…)
Vitesse
33
Fuel level
34 (5B=91%)
Coolant temp
36 (7B=123-40=83)
Ceinture sécurité
3D
Water temp
70
Fuel gauge
71
Speed
72
RPM
73
Illum
7C
Immobiliser
14
port ouverte
0F



Pour la porte conducteur (gère les vitres avant, et les rétroviseurs) :
Miroir droit
04



0802 : ClimateControl
Temp intérieure :
31 (45h=69-40=29°C)
Temp ext
32
Radiation G, D (w/m2)
37, 38
Tx recyclage
63
Niv. Ventilation
64

+ d'autres à découvrir !


Dernière édition par Arthur_035 le 02 Mar 2015 22:39; édité 1 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Arthur_035



Inscrit le: 11 Nov 2007
Messages: 182
Localisation: 35

MessagePosté le: 02 Mar 2015 00:07    Sujet du message: Répondre en citant

Voici le code permettant d'utiliser les fonctions décrites dans le POST, avec les éléments techniques ci-dessus.

- Vérifier la définition des broches de raccordement par rapport au raccordement physique (#define en début).
- Les tables et fonctions de rapport de boite de vitesse, de Puissance et de Couple sont pour une JTDm 126cv BVM6. A adapter le cas échéant.
- Une fonction de Setup a été ajoutée pour gérer : le sweep des aiguilles au démarrage, et/ou la fermeture automatique des portières.

Les fonctions mises en oeuvre se font sur le bus CAN de confort, intéragissent à l'arrêt, ou se limitent à de l'affichage d'info, ... mais prudence quand même, si vous voulez expérimenter.

Code:

/*
V07 : Rationalisation
passage vitesses affiné
Ajout setup
Taille code : 18172
*/


#define BTS1                // bluetooth CAN
#define BTS2                // bluetooth ISO9141
#define RLI                 // envoie et traite trames RLI
#define SP3          // envoie et traite ISO9141

/*
#define DEBUG              // Serial
#define DEBUG2
#define DEBUG_
#define EMUL              // pour test en local
//#define DEBUG_RECV       // affiche serial trames recues
*/

#include <EEPROM.h>
#include <SoftwareSerial.h>

// Connexions modules BT et boutons
#define BUT1_PIN  5
#define BUT2_PIN  6
#define RxD2_PIN 8
#define TxD2_PIN 9
#define RxD1_PIN 11
#define TxD1_PIN 12

// BTS1 : Module CAN
#if defined(BTS1)
SoftwareSerial Bts1Serial(RxD1_PIN,TxD1_PIN);  //Rx, Tx
String can_Resp1="";
String can_LastResp1="";
char can_Idle1=1;         // 0:pas idle
#endif

// BTS2 : Module KKL
#if defined(BTS2)
SoftwareSerial Bts2Serial(RxD2_PIN,TxD2_PIN);  //Rx, Tx
String can_Resp2="";
String can_LastResp2="";
char can_Idle2=1;         // 0:pas idle
byte bts2_init=0;

unsigned long tt_SP3_next;
#define tt_SP3_period 2000
#endif

char MFD_buf8[9];                      // variables de Multi-Function Display
char MFD_buf6[6];
char MFD_buftmp[9];

char can_ATMA_Status=LOW;              // variables de AT Monitor All
char can_ATMA_Fill=0;
char can_ATMA_Mask=0;
char can_ATMA_Nb=0;
unsigned long tt_can_ATMA_next;
#define tt_can_ATMA_period 2000


unsigned long tt_can_RLI_next;
#define tt_can_RLI_period 300

                                        // Table des rapports de vitesse BVM6 JTDM
//float gearTab[]={0, 8.8, 15, 24.6, 34.4, 43.8, 54.5};
float gearTab[]={0, 7.8, 13.8, 23.3, 32.9, 41.8, 52.4};


//triggers
char can_SpeedRegul_status=0;
char can_ReverseGearOn_status=0;
char can_ReverseGearOff_status=0;
char can_FAMOn_status=0;
char can_FAMOff_status=0;


byte button_Trigger;
unsigned long button_Duration;
byte button_Status;
unsigned long button_tt;

                                      // Variables lues
float            can_Vbat;
byte       can_FuelLevel;
byte       can_EngineTemp;
int       can_EngineRPM;
byte       can_EngineSpeed;
float      can_EngineConsH;
//char      can_EngineOilLevel;
float      can_EngineBoost;
byte            can_EngineLoad;
byte            can_EngineP;
int            can_EngineC;
float      can_ExtTemp;
byte       can_IntTemp;
char       can_ReverseGear;
char       can_FAM=1;      // FreinAMain mis par defaut
char      can_SpeedRegul;
char      can_Belt;
byte           can_EGR;
byte            can_Gear;
byte            can_GearShift;
byte            can_Light;

float cons100;
float can_GearR;
int  pmax2,cmax2, rpm2, load2;


// valeurs de boutons virtuels
#define btnUP     1
#define btnDOWN   2
#define btnNONE   5
#define btnUNDEF  6

byte lcd_key_action=btnNONE;
byte lcd_last_key=btnNONE;

// ATMA : Broadcast sur le bus
// 180 : Etat feux
// 281 : RPM, Temp, Consh, regul
// 286 : Speed
// 380 : FreinAMain, Reverse, Vbat, Fuel
// 388 : Ext Temp
#define ATMA_281_MASK   0x01
#define ATMA_286_MASK   0x02
#define ATMA_380_MASK   0x04
#define ATMA_388_MASK   0x08
#define ATMA_180_MASK   0x10




#define TRIGGER_ARMED            3
#define TRIGGER_DETECTED    2
#define TRIGGER_PROCESSED    1
#define TRIGGER_OFF      0



byte          dlg_status;

String MFD_strg;
String cmde;
byte i;

                                // Etats du dialogue
#define status_VBAT       0
#define status_GEAR         1
#define status_LOAD         2
#define status_CONSH        3
#define status_BOOST        4
#define status_POWER        5
#define status_EGR          6
#define status_FUEL         7
#define status_TEMP         8
#define status_RPM          9 
#define status_TEMPI        10
#define status_SPEED        11
#define status_SETUP        12
#define DLG_NB               13

byte b;

// ----------- eeprom config -------------
byte config_status;         // config courante
byte config_id;            // defilement menus

#define eeprom_config_addr  1

#define config_sweep    B00000001
#define config_autolock B00000010



// ---------------------- SETUP ----------------
void setup()

#if defined(DEBUG)
Serial.begin(57600);
#endif

#if defined(DEBUG2)
Serial.begin(57600);
#endif

dlg_status=status_VBAT;
 
pinMode(RxD1_PIN, INPUT);
pinMode(TxD1_PIN, OUTPUT);
Bts1Serial.begin(38400);

#if defined(BTS2)
pinMode(RxD2_PIN, INPUT);
pinMode(TxD2_PIN, OUTPUT);
Bts2Serial.begin(38400);
#endif

pinMode(BUT1_PIN,OUTPUT);
digitalWrite(BUT1_PIN, LOW);
pinMode(BUT2_PIN,INPUT_PULLUP);


#if defined(DEBUG)
Serial.println(F("InitOk"));
#endif

can_SPC_init();        // Initialisation bus CAN
button_Init();   

config_read();          // lecture dans EEPROM
can_Sweep();
can_ATMA_Start(1,ATMA_380_MASK);
}



// ---------------------------------- UTIL ---------------------

void(* resetFunc) (void) = 0;//declare reset function at address 0


unsigned char hex2dec(char c)
{
if ((c>='0')&&(c<='9'))
  return(c-'0');
if ((c>='A')&&(c<='F'))
  return(c-'A'+10);
return(0);
}



// ------------------------eeprom ----------------------------
void config_read()
{
config_status=EEPROM.read(eeprom_config_addr);
#if defined(DEBUG)
Serial.print("CFG :");
Serial.println(config_status);
#endif
}


// ----------------------------------BTS ------------------------
void bts1_Idle_Wait()
{
unsigned long ttn;

Bts1Serial.listen();
ttn=millis()+500;

#if defined (EMUL)
ttn=millis(); // pas de tempo en émulation
#endif

while((can_Idle1==0)&&(millis()<ttn)) 
   {
   bts1_ReceivedPrint();
//        delay(5);
   }

}


void bts1_Send(String commande)
{

Bts1Serial.listen();

bts1_Idle_Wait();


#if defined(DEBUG__)
Serial.print(F("Envoi1:"));
Serial.println(commande);
#endif


#if defined (BTS1)
Bts1Serial.print(commande);
Bts1Serial.print("\r");
Bts1Serial.flush();
#endif
can_Idle1=0;

bts1_Idle_Wait();


}



void bts1_ReceivedPrint()
{
char recvChar;


#if defined(BTS1)
Bts1Serial.listen();

while(Bts1Serial.available())
  {
   recvChar = Bts1Serial.read();
    if((recvChar=='\n')||(recvChar=='\r'))
     {
     if (can_LastResp1.length()>1)
       {
#if defined(DEBUG_RECV)
     Serial.print(F("BTS1_RP:"));Serial.println(can_LastResp1);
#endif
     
   can_ATMA_decode();
#if defined(RLI)
     can_RLI_decode();
#endif
     
       } // end len >1
      if (can_LastResp1.length()>1)
      can_Resp1=can_LastResp1;
   can_LastResp1="";     
     } // fin CR-LF
     else
     if (recvChar=='>')
       can_Idle1=1;
   else
    can_LastResp1+=recvChar;    
  }
 #endif // BTS

#if defined(DEBUG)            
while(Serial.available())
  {   
     recvChar = Serial.read();
     Bts1Serial.print(recvChar);
  }
#endif

button_Test();
}



void bts2_Idle_Wait()
{
#if defined(BTS2)
unsigned long ttn;

Bts2Serial.listen();
ttn=millis()+1000;

#if defined (EMUL)
ttn=millis();
#endif

while((can_Idle2==0)&&(millis()<ttn)) 
   {
   bts2_ReceivedPrint();
        delay(5);
   }

#endif
}


void bts2_Send(String commande)
{
#if defined (BTS2)

Bts2Serial.listen();

bts2_Idle_Wait();

#if defined(DEBUG2)
Serial.print(F("Envoi2:"));
Serial.println(commande);
#endif

Bts2Serial.print(commande);
Bts2Serial.print("\r");
Bts2Serial.flush();
can_Idle2=0;

bts2_Idle_Wait();

#endif

}



void bts2_ReceivedPrint()
{
#if defined(BTS2)

char recvChar;
Bts2Serial.listen();
while(Bts2Serial.available())
  {
   recvChar = Bts2Serial.read();
    if((recvChar=='\n')||(recvChar=='\r'))
     {
     if (can_LastResp2.length()>1)
       {
#if defined(DEBUG2)
     Serial.print(F("BTS_RP2:"));Serial.println(can_LastResp2);
#endif
     
#if defined(SP3)
     can_SP3_decode();
#endif
     
       } // end len >1
      if (can_LastResp2.length()>1)
      can_Resp2=can_LastResp2;
   can_LastResp2="";     
     } // fin CR-LF
     else
     if (recvChar=='>')
       can_Idle2=1;
   else
    can_LastResp2+=recvChar;    
  }


button_Test();
#endif
}




// ------------------------- MFD Display  ---------------------
// Afficheur du Tableau de bord

void MFD_Init()
{
bts1_Send(F("ATSH525"));
bts1_Send(F("002B03"));

bts1_Send(F("ATSH540"));
bts1_Send(F("00A7B2"));

bts1_Send(F("ATSH545"));
bts1_Send(F("4703F40002"));

}



void MFD_buftmp_Init2(String str)
{

for(i=0;i<=8;i++)
  MFD_buftmp[i]=0;
str.toCharArray(MFD_buftmp,8);
}



void MFD_buf8_6_convert()
{

for (i=0;i<8;i++)
{
  if ((MFD_buf8[i]>='0')&&(MFD_buf8[i]<='9'))
    MFD_buf8[i]-=47;
  else if ((MFD_buf8[i]>='A')&&(MFD_buf8[i]<='Z'))
    MFD_buf8[i]-=53;
  else if (MFD_buf8[i]==' ')
    MFD_buf8[i]=40;
  else if (MFD_buf8[i]=='.')
    MFD_buf8[i]=11;
  else if (MFD_buf8[i]==':')
    MFD_buf8[i]=58;
  else if (MFD_buf8[i]=='-')
    MFD_buf8[i]=57;
  else if (MFD_buf8[i]=='*')
    MFD_buf8[i]=61;
  else if (MFD_buf8[i]=='/')
    MFD_buf8[i]=59;
  else if (MFD_buf8[i]=='#')
    MFD_buf8[i]=60;
  else                // valeur par défaut
    MFD_buf8[i]=60; 
}

MFD_buf6[0]=(MFD_buf8[0]<<2)+((MFD_buf8[1]&0xF0)>>4);
MFD_buf6[1]=((MFD_buf8[1]&0x0F)<<4)+((MFD_buf8[2]&0xFC)>>2);
MFD_buf6[2]=((MFD_buf8[2]&0x03)<<6)+MFD_buf8[3];

MFD_buf6[3]=(MFD_buf8[4]<<2)+((MFD_buf8[5]&0xF0)>>4);
MFD_buf6[4]=((MFD_buf8[5]&0x0F)<<4)+((MFD_buf8[6]&0xFC)>>2);
MFD_buf6[5]=((MFD_buf8[6]&0x03)<<6)+MFD_buf8[7];
 
}



void MFD_Display(String str)
{
int i;

#if defined(EMUL)
Serial.print("MFD_Display:");
Serial.println(str);
#endif

MFD_strg=str;
for(i=str.length();i<8;i++)
  MFD_strg+=' ';

MFD_strg.toCharArray(MFD_buf8,MFD_strg.length()+1);
MFD_buf8_6_convert();


bts1_Send(F("ATSH565"));
for(i=0;i<6;i++)
     {
#if defined(DEBUG_)
   if ((byte)MFD_buf6[i]<16)
        Serial.print('0');
   Serial.print((unsigned char) MFD_buf6[i],HEX);
   Serial.print(' ');
#endif
   if ((byte)MFD_buf6[i]<16)
      Bts1Serial.print('0');
   Bts1Serial.print((unsigned char) MFD_buf6[i],HEX);
   Bts1Serial.print(' ');
   }

#if defined(DEBUG_)
  Serial.println(' ');
#endif
Bts1Serial.print('\r');
Bts1Serial.flush();
can_Idle1=0;
bts1_Idle_Wait();

}




// ------------------ CAN MFD ---------------------
// Affiche sur le MFD selon l'état de l'automate

void can_MFD_Affiche(byte MFD_Affiche_status)
{
if (MFD_Affiche_status ==status_VBAT)
  {
  MFD_buftmp_Init2("BAT:");
  dtostrf(can_Vbat,4,1,&MFD_buftmp[4]);   
  }
else
if (MFD_Affiche_status ==status_TEMP)
  {
  MFD_buftmp_Init2("T:");
  dtostrf(can_EngineTemp,2,0,&MFD_buftmp[2]);
  }
else
if (MFD_Affiche_status ==status_SPEED)
  {
  MFD_buftmp_Init2("KMH:");
  dtostrf(can_EngineSpeed,3,0,&MFD_buftmp[4]);      
  }
else
if (MFD_Affiche_status ==status_RPM)
 {
  MFD_buftmp_Init2("RPM:");
  dtostrf(can_EngineRPM,4,0,&MFD_buftmp[4]);   
 }
else
if (MFD_Affiche_status ==status_FUEL)
 {
  MFD_buftmp_Init2("FUEL:");
  dtostrf(can_FuelLevel,2,0,&MFD_buftmp[5]);
 }
else
if (MFD_Affiche_status ==status_TEMPI)
 {
  MFD_buftmp_Init2("TI:");
  dtostrf(can_IntTemp,2,0,&MFD_buftmp[3]);   
  }
 else
if (MFD_Affiche_status ==status_CONSH)
 {     
  MFD_buftmp_Init2("L/X:");

   if (can_EngineSpeed ==0)
   {
     MFD_buftmp[2]='H';  // Affiche conso horaire sur la vitesse est nulle
    dtostrf(can_EngineConsH,4,1,&MFD_buftmp[4]);
   }
   else                // Affiche consommation aux 100km si vitesse non nulle.
   {
   cons100=100*can_EngineConsH/can_EngineSpeed;
     MFD_buftmp[2]='C';
     dtostrf(cons100,4,1,&MFD_buftmp[4]);
   }
  }
 else
if (MFD_Affiche_status ==status_BOOST)
 {
  MFD_buftmp_Init2("TRB:");
  dtostrf(can_EngineBoost,4,1,&MFD_buftmp[4]);
  }
else
if (MFD_Affiche_status ==status_EGR)
 {
  MFD_buftmp_Init2("EGR:");
  dtostrf(can_EGR,3,0,&MFD_buftmp[4]);   
  }
else
if (MFD_Affiche_status ==status_LOAD)
 {
  MFD_buftmp_Init2("L");
  dtostrf(can_EngineLoad,3,0,&MFD_buftmp[1]);   
  if ((can_Gear >0)&&(can_Gear<6))
    { 
    MFD_buftmp[4]=' ';
    dtostrf(load2,3,0,&MFD_buftmp[5]);
    }
  }
else
if (MFD_Affiche_status ==status_GEAR)
 {
  MFD_buftmp_Init2("VT:");        // Affiche la vitesse courante
  if (can_Gear !=99)
    dtostrf(can_Gear,1,0,&MFD_buftmp[3]);   
  if (can_GearShift==3)      //Couple et puissance sont ok
  {
    MFD_buftmp[4]=' ';
    MFD_buftmp[5]='-';
    MFD_buftmp[6]=' ';
    dtostrf(can_Gear+1,1,0,&MFD_buftmp[7]);   // Affiche vitesse N+1 si pertinente (%couple et %puissance)
  }
}
else
if (MFD_Affiche_status ==status_POWER)
 {
  MFD_buftmp_Init2("P CH:");              // Puissance en CH
  dtostrf(can_EngineP*1.36,3,0,&MFD_buftmp[5]);
  }
else
if (MFD_Affiche_status ==status_SETUP)
 {
  config_id++;
  if (config_id==3)
    config_id=0;

  if (config_id==0)
    MFD_buftmp_Init2("EXIT");
  else
  if (config_id==1)
    {
    MFD_buftmp_Init2("ALOCK:");
    dtostrf(((config_status & config_autolock)==config_autolock),1,0,&MFD_buftmp[6]);   
    }
  else
  if (config_id==2)
    {
    MFD_buftmp_Init2("SWEEP:");
    dtostrf(((config_status & config_sweep)==config_sweep),1,0,&MFD_buftmp[6]);
    }
  }
 
MFD_Display(MFD_buftmp);
}



//  ------------------------ CAN Cmdes ---------------------


void can_SPC_init()    // Init bus can
{
bts1_Send("ATZ");
if (can_Idle1!=1)
   bts1_Idle_Wait();
if (can_Resp1.substring(0,3)!="ELM")
  {  // init KO
#if not defined(EMUL)
  resetFunc();
#endif
  }

bts1_Send("ATE0");
bts1_Send("ATSPC");
bts1_Send("ATS1");    //new
bts1_Send("ATH1");
bts1_Send("ATL1");
bts1_Send("ATCAF0");    // CAN auto_formatting off
bts1_Send("ATCFC1");    //CAN Flow control
bts1_Send("ATAT1");     // Set Adaptative timing Option
bts1_Send("ATST25");    // Set timeout 25 (x4=100 ms)

               // init ecran
MFD_Init();
}


void can_Sweep()      // sweep aiguilles
{
if ((config_status & config_sweep) !=config_sweep)
return;

bts1_Send(F("ATCRA7C3"));
bts1_Send(F("ATSH7B0"));
bts1_Send(F("85021081"));      // Start DiagSessio(10), defaultMode(81)
//bts1_Send(F("8504307C077F"));   // eclairage
for(i=72;i<=73;i++)
  {
    cmde=F("850430");
    cmde+=i;
    cmde+="07FF";
    bts1_Send(cmde);
}
delay(1000);
for(i=72;i<=73;i++)
  {
    cmde=F("850430");
    cmde+=i;
    cmde+="0700";
    bts1_Send(cmde);
  }
for(i=72;i<=73;i++)
  {
    cmde="850430";
    cmde+=i;
    cmde+="00";
    bts1_Send(cmde);
  }
bts1_Send(F("850220"));   // stop communication

}


void can_Lock(byte b)    // Fermeture/ouverture portières
{
byte lock_nbTent=3;
// 7C3 F1 03 61 36 5A 00 00 00
if ((config_status & config_autolock) !=config_autolock)
  return;


while (lock_nbTent>0)
{
bts1_Send(F("ATSH7B0"));
bts1_Send(F("ATCRA7C0"));  // set CAN Rx Address
bts1_Send(F("04021081"));

if(b==1)  //lock
  {
  bts1_Send(F("0404301007FF"));
  bts1_Send(F("040430100700"));
  }
else      // Unlock
  {
  bts1_Send(F("0404300F07FF"));
  bts1_Send(F("0404300F0700"));
  }
if (can_Resp1.substring(10,2)==F("70"))    // reponse OK
   lock_nbTent=0;
else
   lock_nbTent--;

bts1_Send(F("040220"));
}
}





// ------------------------ ISO 9141 ------------------------

void can_SP3_init()    // Init KKL
{
#if defined(BTS2)

bts2_Send("ATZ");
if (can_Idle2!=1)
   bts2_Idle_Wait();
if (can_Resp2.substring(0,3)=="ELM")
  {  // Init OK
#if defined(DEBUG2)
  Serial.println("SP3 : Init : OK");
#endif
  bts2_init=1;
  }

bts2_Send("ATSP3");

#endif
}


void can_SP3_decode()    // decode réponses KKL
{
#if defined(BTS2)
byte B67;
String SP3_code;

SP3_code=can_LastResp2.substring(0,5);

if (can_LastResp2.length()>7)
  B67=hex2dec(can_LastResp2[6])*16+hex2dec(can_LastResp2[7]);


// 7C3 F1 03 61 36 5A 00 00 00

if (SP3_code==F("41 0B"))    // MAP
{
  can_EngineBoost=(B67-100.0)/100.0;
#if defined (DEBUG2)
Serial.print("BOOST:");
Serial.println(can_EngineBoost,2);
#endif
}
else
if (SP3_code==F("41 2C"))    // EGR
  {
  can_EGR=B67*100/255;
#if defined(DEBUG2)
Serial.print("EGR:");
Serial.println(can_EGR,DEC);
#endif
  }
else
if (SP3_code==F("41 04"))    // LOAD
  {
  can_EngineLoad=B67*100/255;
  can_SP3_gear();
#if defined(DEBUG2)
Serial.print("LOAD:");
Serial.println(can_EngineLoad,DEC);
#endif
  }
#endif // bts2
}


// ----------------------------- Getsion Rapports vitesses ------------------
byte enginePMax( int rpm)    // Puissance Max selon RPM. Valable pour JTDM 126cv
{
if (rpm<832)
  return (0);
else
if (rpm<3000)
  return((byte) (8+85.0*(rpm-832.0)/2168.0) );    // 3000-832
else
  return(93);
}

int engineCMax( int rpm)    // Couple max selon RPM. Valable pour JTDM 126cv
{
if (rpm<832)
  return (0);
else
if (rpm<2000)
  return((int) (100+205.0*(rpm-832.0)/1168.0) );    // 2000-832
else
if (rpm<2500)
  return(305);
else
  return((int) (305-65.0*(rpm-2500.0)/1500.0) );    // 4000-2500
 
}



void can_SP3_gear()    // calcul de la pertinence du rapport supérieur
{
if (can_EngineRPM !=0)
   can_GearR=can_EngineSpeed*1000.0/can_EngineRPM;
else
   can_GearR=0;

i=0;
while(i<=7)    // Recherche de la vitesse courante
  {
    if ((can_GearR >=gearTab[i]*0.8) &&(can_GearR<=(gearTab[i]*1.2)))
      break;
    i++;
  }
if (i<7)
  can_Gear=i;
else
  can_Gear=99;
 
// Calcul des puissances et couple courants
can_EngineP=enginePMax(can_EngineRPM)*can_EngineLoad/100;
can_EngineC=engineCMax(can_EngineRPM)*can_EngineLoad/100;

can_GearShift=0;
if ((can_Gear>0)&&(can_Gear<6))
  {
  rpm2=can_EngineRPM*gearTab[can_Gear]/gearTab[can_Gear+1]; 
  pmax2=enginePMax(rpm2);
  cmax2=engineCMax(rpm2);

  if (pmax2!=0)
    {
    load2=can_EngineC*100/cmax2;
    if ( (load2>40) // inf : eviter sous regime
       &&(load2<100)) // sup : avance le passage de vitesse
      can_GearShift=can_GearShift+1;
    load2=can_EngineP*100/pmax2;
    if ( (load2>30) // inf : eviter sous regime
       &&(load2<100)) // sup : avance le passage de vitesse
      can_GearShift=can_GearShift+2;
    } 
  }
   
#if defined(DEBUG2)
Serial.print("can Gear Ratio:");
Serial.println(can_GearR,2);
Serial.print("can Gear:");
Serial.println(can_Gear,DEC);
Serial.print("can Puissance:");
Serial.println(can_EngineP,DEC);
Serial.print("can pmax2:");
Serial.println(pmax2,DEC);
Serial.print("can Couple:");
Serial.println(can_EngineC,DEC);
Serial.print("can Cmax2:");
Serial.println(cmax2,DEC);
Serial.print("can load2:");
Serial.println(load2,DEC);
Serial.print("can rpm2:");
Serial.println(rpm2,DEC);
Serial.print("gear Shift:");
Serial.println(can_GearShift,DEC);
#endif

}



// ------------------------ CAN RLI -------------------------
#if defined(RLI)

/*
void can_RLI_ECU_DASHBOARD(String code)
{
String cmde;

bts1_Send(F("ATSH7B0"));
bts1_Send(F("ATCRA7C3"));
bts1_Send(F("85021081"));
cmde="850221";
cmde+=code;
bts1_Send(cmde);
bts1_Send(F("85021082"));
}


void can_RLI_ECU_BODY(String code)
{
String cmde;

bts1_Send(F("ATSH7B0"));
bts1_Send(F("ATCRA7C0"));
bts1_Send(F("04021081"));
cmde="040221";
cmde+=code;
bts1_Send(cmde);
bts1_Send(F("04021082"));
}
*/

void can_RLI_ECU_CC(String code)      // Climate Control
{
bts1_Send("ATSH7B0");
bts1_Send(F("ATCRA7CA"));
bts1_Send(F("08021081"));
cmde="080221";
cmde+=code;
bts1_Send(cmde);
bts1_Send(F("08021082"));

}

// décodage des trames CAN reçues, des différents modules
void can_RLI_decode()
{
byte B1617;

if (can_LastResp1.length()>17)
  B1617=LastResp1Byte(16);

// 7C3 F1 03 61 36 5A 00 00 00
/*
if (can_LastResp1.substring(0,3)==F("7C3"))    // dashboard
   {
   if (can_LastResp1.substring(13,15)==F("07"))   // RegulSpeed
      {
        if ((can_SpeedRegul!=B1617)&&(B1617==0xFF))
                      {
                        can_SpeedRegul_status=TRIGGER_DETECTED;
                        can_SpeedRegul=0xFF;
                      }
#if defined(DEBUG)
Serial.print(F("Regul:"));Serial.println(can_SpeedRegul);
#endif
      } // end 07
   else
   if (can_LastResp1.substring(13,15)==F("32"))   // OilLevel
      {
        can_EngineOilLevel=B1617;
        // can_EngineOilLevel_status=1;
#if defined(DEBUG)
Serial.print(F("OilLevel:"));Serial.println(can_EngineOilLevel);
#endif
      } // end 32
   else
   if (can_LastResp1.substring(13,15)==F("33"))   // Speed
      {
        can_EngineSpeed=(hex2dec(can_LastResp1[17])*256+hex2dec(can_LastResp1[19])*16+hex2dec(can_LastResp1[20]))*0.1;
         can_EngineSpeed_status=1;
#if defined(DEBUG)
Serial.print(F("EngSpeed:"));Serial.println(can_EngineSpeed);
#endif
      } // end 33
   else
   if (can_LastResp1.substring(13,15)==F("34"))   // Fuel
      {
          can_FuelLevel=B1617;
                can_FuelLevel_status=1;
#if defined(DEBUG)
Serial.print("Fuel:");Serial.println(can_FuelLevel);
#endif
       } // end 34
   else
   if (can_LastResp1.substring(13,15)==F("35"))   // RPM
      {
        can_EngineRPM=32*B1617;
         can_EngineRPM_status=1;
#if defined(DEBUG)    
Serial.print(F("EngRPM:"));Serial.println(can_EngineRPM);
#endif      
                } // end 35
   else
   if (can_LastResp1.substring(13,15)==F("36"))   // Engine Temp
      {
      can_EngineTemp=B1617-40;
            can_EngineTemp_status=1;
#if defined(DEBUG)
Serial.print(F("EngTemp:"));Serial.println(can_EngineTemp);
#endif
      } // end 36
   else
   if (can_LastResp1.substring(13,15)==F("3D"))   // Belt
      {
        if ((can_Belt==0xFF) && (B1617==0x00))
                    can_BeltOff_status=TRIGGER_DETECTED;
             can_Belt=B1617;
#if defined(DEBUG)    
Serial.print(F("Belt:"));Serial.println(can_Belt);
#endif      
                } // end 3D

   } //7C3
else
*/
if (can_LastResp1.substring(0,3)==F("7CA"))      // Climate Control
   {
   if (can_LastResp1.substring(13,15)==F("31"))   // Int Temp
      {
                can_IntTemp=LastResp1Byte(19)-40;
        //can_IntTemp_status=1;
#if defined(DEBUG)
Serial.print(F("IntTemp:"));Serial.println(can_IntTemp);
#endif

      } // end 31
        } // end 7CA

}

#endif // RLI


// -------------------------------- ATMA --------------------

// démarrage du mode de lecture des informations CAN
void can_ATMA_Start(char nb, char mask)
{
bts1_Send("ATD");
bts1_Send("ATE0");
bts1_Send("ATAL");
bts1_Send("ATH1");
bts1_Send("ATMA");

can_ATMA_Status=HIGH;
can_ATMA_Fill=0;
can_ATMA_Nb=nb;
can_ATMA_Mask=mask;
tt_can_ATMA_next=millis()+tt_can_ATMA_period;

}



void can_ATMA_Stop_Test()
{
if (can_ATMA_Status == LOW)
   return;
if (can_ATMA_Fill == can_ATMA_Mask)
   {
   if (can_ATMA_Nb!=0)
      can_ATMA_Nb--;
   can_ATMA_Fill=0;
   }

if ((millis()>tt_can_ATMA_next)||(can_ATMA_Nb==0))
   can_ATMA_Stop();

}


void can_ATMA_Stop()
{

if (can_ATMA_Status == LOW)
   return;

can_ATMA_Status=LOW;
Bts1Serial.print(F("A\r\n\r\n"));
Bts1Serial.flush();
can_Idle1=0;
bts1_Idle_Wait();

}

byte LastResp1Byte( byte idx)
{
return (hex2dec(can_LastResp1[idx])*16+hex2dec(can_LastResp1[idx+1]));
}


void can_ATMA_decode()   
{
byte b_tmp;
byte can_len;
String can_code;

can_code=can_LastResp1.substring(0,3);
can_len=can_LastResp1.length();

if ((can_len==22) && (can_code==F("180")))
   {
   can_ATMA_Fill = can_ATMA_Fill | ATMA_180_MASK;
        can_Light=LastResp1Byte(7);
        }
else
if ((can_len==28) && (can_code==F("380")))
   {
   can_ATMA_Fill = can_ATMA_Fill | ATMA_380_MASK;
        //Serial.print("380 : ");Serial.println(can_LastResp1);
   //"380 20 00 48 4C 00 24 0D 00";
        b_tmp=LastResp1Byte(4);
     if ((b_tmp&0x20)==0x20)   // FreinAMain mis
            {
              if (can_FAM==0)
         can_FAMOn_status=TRIGGER_DETECTED;
         can_FAM=1;
            }
   else
           {
              if (can_FAM==1)
         can_FAMOff_status=TRIGGER_DETECTED;
              can_FAM=0;
           }
       
        b_tmp=LastResp1Byte(10);
     if ((b_tmp&0x04)==0x04)
            {
              if (can_ReverseGear==0)
         can_ReverseGearOn_status=TRIGGER_DETECTED;
          can_ReverseGear=1;
            }
   else
           {
              if (can_ReverseGear==1)
         can_ReverseGearOff_status=TRIGGER_DETECTED;
              can_ReverseGear=0;
           }
     
     
      can_Vbat=LastResp1Byte(13)*0.16;
      can_FuelLevel=LastResp1Byte(19);

#if defined(DEBUG)
//   Serial.print(F("vbat:"));Serial.println((float)can_Vbat);
//   Serial.print(F("fuel:"));Serial.println(can_FuelLevel);
#endif
   }
else
if ((can_len==28) && (can_code==F("281")))
   {
   can_ATMA_Fill = can_ATMA_Fill | ATMA_281_MASK;

   //"281 00 80 C0 72 02 0F 19 00";
   // Regul : B2 ; RPM : B7 ; Temp : B4 ; FuelConsH:B5-B6 
     if (can_LastResp1.substring(8,9)=="2")
      {
        if (can_SpeedRegul==0)
                      {
                        can_SpeedRegul_status=TRIGGER_DETECTED;
                        tt_can_ATMA_next=0;
                      }
                   can_SpeedRegul=0xFF;
                }
   else
      can_SpeedRegul=0;

  can_EngineRPM=32*LastResp1Byte(22);
  can_EngineTemp=LastResp1Byte(13)-40;
  can_EngineConsH=0.0022*(LastResp1Byte(16)*256+LastResp1Byte(19));
#if defined(DEBUG)   
//Serial.print(F("RPM:"));Serial.println(can_EngineRPM);
//Serial.print(F("EngineTemp:"));Serial.println(can_EngineTemp);
//Serial.print(F("EngineConsH:"));Serial.println(can_EngineConsH);
#endif
   }
else
if ((can_len==28) && (can_code==F("286")))
   {
   can_ATMA_Fill = can_ATMA_Fill | ATMA_286_MASK;

   //"286 00 00 C0 72 02 0F 19 00";
   // Speed : B3-B4 
     can_EngineSpeed=(hex2dec(can_LastResp1[11])*256+LastResp1Byte(13))*0.0625;
#if defined(DEBUG)   
//   Serial.print(F("Speed:"));Serial.println(can_EngineSpeed);
#endif
   }
else
if ((can_len==13) && (can_code==F("388")))
   {
   can_ATMA_Fill = can_ATMA_Fill | ATMA_388_MASK;

   //"388 6C 00 80";
   // Tempext : B1 
     can_ExtTemp=(LastResp1Byte(4))/2-40;
#if defined(DEBUG)
//   Serial.print(F("TempExt:"));Serial.println(can_ExtTemp);
#endif
   }

}





// ---------------------BUTTONS ----------------

void button_Init()
{
button_Trigger= TRIGGER_ARMED;
button_Status=0;
}


void button_Test()
{
char bs;  //button_state

if (button_Trigger==TRIGGER_DETECTED) // d�j� d�tect�
   return;

bs=digitalRead(BUT2_PIN);

  //button:pressed
if ((button_Status==0) && (bs==LOW))
   {
   button_Status=1;
   button_tt=millis();
   }
else
//button:released
if ((button_Status==1) &&
     (bs==HIGH)
//&&((millis()-button_tt)>10)
)
   {
   button_Status=0;
   button_Trigger=TRIGGER_DETECTED;
   button_Duration=millis()-button_tt;
#if defined(DEBUG)
  Serial.print("BUT2_released:");
  Serial.println(button_Duration);
#endif
   }
}



// --------------------------------ACTIONS ----------------

void dlg_Action_Key()
{
byte action=255;

if (lcd_key_action == btnDOWN)
  {
     dlg_status++;
     if (dlg_status==DLG_NB)
       dlg_status=0;
  }
else
if (lcd_key_action == btnUP)
  {
   if (dlg_status==0)
     dlg_status=DLG_NB-1;
   else
     dlg_status--;
  }
else
  return;

#if defined(DEBUG)
  Serial.print("DAK dlg_status:");
  Serial.println(dlg_status);
#endif       
}
   


void dlg_Action_Status()
{
byte atma_req_nb=0;

if (can_ATMA_Status==LOW)
  {
  if ((dlg_status==status_VBAT)||
      (dlg_status==status_SETUP))
    atma_req_nb=5;
  else 
  if ((dlg_status==status_TEMP)||
      (dlg_status==status_FUEL))
    atma_req_nb=10;
  else
  if ((dlg_status==status_CONSH)||
      (dlg_status==status_RPM)||
      (dlg_status==status_SPEED))
      atma_req_nb=3;
   
   if (atma_req_nb !=0)   
    {
    can_MFD_Affiche(dlg_status);
    can_ATMA_Start(atma_req_nb,ATMA_380_MASK & ATMA_281_MASK);
    return;
    }
  }

if (millis()<tt_can_RLI_next)
   return;
tt_can_RLI_next=millis()+tt_can_RLI_period;
#if defined (SP3)
if (dlg_status==status_BOOST)
   bts2_Send("01 0B");
else
if (dlg_status==status_EGR)
   bts2_Send("01 2C");
else
if ((dlg_status==status_LOAD) ||
     (dlg_status==status_GEAR) ||
     (dlg_status==status_POWER))
     
   bts2_Send("01 04");
#endif
#if defined(RLI)
if ((dlg_status==status_TEMPI))
{
   //can_RLI_ECU_DASHBOARD("32");       // OIL
   can_RLI_ECU_CC("31");               // int Temp
     
}
#endif

if (can_ATMA_Status==LOW)
  {
  if (dlg_status==status_TEMPI)
    atma_req_nb=10;
  else
  if ((dlg_status==status_BOOST)||
      (dlg_status==status_EGR) ||
      (dlg_status==status_LOAD)||
      (dlg_status==status_POWER))
    atma_req_nb=1;
  else
  if (dlg_status==status_GEAR)
    atma_req_nb=1;
   
   if (atma_req_nb !=0)
     {
        can_MFD_Affiche(dlg_status);
         can_ATMA_Start(atma_req_nb,ATMA_380_MASK & ATMA_281_MASK);
   return;
   }
  } //end atma_status_low
}






void dlg_Action_Post()
{

#if defined(BTS2)
if (bts2_init==0)   // bts non initialise
{             // on n'initialise que lorsque démarré, pour laisser priorité au bus CAN
  if ((can_EngineSpeed>10)||
   (dlg_status==status_LOAD)||
   (dlg_status==status_BOOST)||
   (dlg_status== status_EGR)||
   (dlg_status==status_GEAR)||
   (dlg_status==status_POWER))
      {
       if (tt_SP3_next>millis())
         return;
       tt_SP3_next=millis()+tt_SP3_period;
         can_SP3_init();
      }
}
#endif


if (button_Trigger==TRIGGER_DETECTED)
  {
    if (button_Duration>3000)          // Appui long : Reset
      resetFunc();
    else
    if (button_Duration>500)                  // Appuis mi-long : Menu-1
      {
      button_Trigger=TRIGGER_PROCESSED;
      lcd_key_action=btnUP;
      lcd_last_key=btnUP;
      }
    else
      {                                                  // Appui rapide : Menu+1
      if ((dlg_status==status_SETUP)&&(config_id!=0))
        {
        if (config_id==1)
          config_status=config_status ^config_autolock; 
        else if (config_id==2)
          config_status=config_status ^config_sweep; 
#if defined(DEBUG)
Serial.print("CFG :");
Serial.println(config_status);
#endif
       EEPROM.write(eeprom_config_addr,config_status);
       button_Trigger=TRIGGER_PROCESSED;
       return;
        } 
      config_id=0;
      lcd_key_action=btnDOWN;
      lcd_last_key=btnDOWN;
      button_Trigger=TRIGGER_PROCESSED;
      }
  }
 
if (can_SpeedRegul_status ==TRIGGER_DETECTED)
      {
      lcd_key_action=btnDOWN;
      lcd_last_key=btnDOWN;
      can_SpeedRegul_status=TRIGGER_PROCESSED;
      }

if (can_FAMOff_status == TRIGGER_DETECTED)
{
  can_ATMA_Stop();
  can_Lock(1);
  can_FAMOff_status = TRIGGER_PROCESSED;
}

if (can_FAMOn_status == TRIGGER_DETECTED)
{
  can_ATMA_Stop();
  can_Lock(0);  // Unlock
  can_FAMOn_status = TRIGGER_PROCESSED;
}

}



// ---------------------------------Serial -----------
void serial_Test()    // fonction de test
{
#if defined(DEBUG)
char c;

while (Serial.available())
{
  c=Serial.read();
   if (c=='+')
     {
       button_Trigger=TRIGGER_DETECTED;
       button_Duration=100;
     }
   else 
   if (c=='-')
     {
       button_Trigger=TRIGGER_DETECTED;
       button_Duration=700;
     }
   else 
   if (c=='G')
     {
       can_EngineRPM=2000;
       can_EngineSpeed=45;
       can_EngineLoad=50;
       can_SP3_gear();
        }
}     
#endif
}


// ------------------------------------ LOOP -----------------


void loop()
{
#if defined(EMUL)
  delay(500);
#endif
button_Test();
serial_Test();
bts1_ReceivedPrint();
#if defined(BTS2)
bts2_ReceivedPrint();
#endif

dlg_Action_Post();

if (lcd_key_action != btnUNDEF)
  {
#if defined(DEBUG)
  Serial.print("Action:");
  Serial.println(lcd_key_action);
#endif
  can_ATMA_Stop();
  dlg_Action_Key();   
  lcd_key_action=btnUNDEF;
  }

dlg_Action_Status();            // lance action RLI si RLI actif
can_ATMA_Stop_Test();      // teste ATMA
} // end loop
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 02 Mar 2015 10:56    Sujet du message: Répondre en citant

cool
Me manque juste une bête prise ODB pour tester correctement !
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
bips



Inscrit le: 15 Sep 2013
Messages: 2366
Localisation: Anjou

MessagePosté le: 02 Mar 2015 15:10    Sujet du message: Répondre en citant

Il doit y avoir d'autres commandes, les indications du gps s'affichent aussi.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 02 Mar 2015 15:30    Sujet du message: Répondre en citant

bips a écrit:
Il doit y avoir d'autres commandes, les indications du gps s'affichent aussi.

C'est bien le GROS travail restant du projet !
Même si ces commandes existent et comme il n'y a pas de document qui les référence, alors le seul moyen pour les découvrir et de lire tout ce qui circule sur le canbus.

Ensuite, il faut à la main se farcir l'analyse des trames, faire le tris et retrouver les cas correspondants (genre les coordonnées sont affichées, avec quelle valeur)....

C'est loin d'être facile et si en plus par exemple on ne dispose pas du GPS .... C'est impossible.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 02 Mar 2015 21:36    Sujet du message: Répondre en citant

Petite mise à jour du shéma
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Arthur_035



Inscrit le: 11 Nov 2007
Messages: 182
Localisation: 35

MessagePosté le: 02 Mar 2015 22:37    Sujet du message: Répondre en citant

Il y a en effet quelques autres commandes, que je n'ai pu décoder...
Notamment, celles liées au GPS, ... que je n'ai pu visualiser, sans ConnectNav, ...
Une BONNE partie du travail a néanmoins été faite, en analysant les trames, et leurs variations lorsqu'on effectue différentes actions.
Les fichiers Excel d'analyse sont à disposition, ....

Je me rends compte que j'ai oublié des codes notamment ceux en lecture, relatifs à la clim et au tableau de bord, ... je complète dans le post précédent.
On y verra notamment l'indicateur de luminosité (droite et gauche) du bloc de clim...

Merci à Léo pour la mise à jour du schéma, fidèle au code. Mais supprimer la liaison rouge PIN34 !
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
grise147



Inscrit le: 14 Oct 2007
Messages: 8762
Localisation: TOULOUSE !

MessagePosté le: 09 Mar 2015 22:41    Sujet du message: Répondre en citant

merci a leo et a arthur !!!

bravo pour le tuto au_revoir cool cool cool cool

je vais m y mettre aussi, car je vais acheter une voiture pour pourvoir faire ce ardunino !! content

a suivre razz au_revoir au_revoir
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
grise147



Inscrit le: 14 Oct 2007
Messages: 8762
Localisation: TOULOUSE !

MessagePosté le: 11 Mar 2015 23:52    Sujet du message: Répondre en citant

le truc que j ai du mal a comprendre est la liste de code

c est quoi comme code ? du BASIC ? oh oh au_revoir au_revoir
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Arthur_035



Inscrit le: 11 Nov 2007
Messages: 182
Localisation: 35

MessagePosté le: 12 Mar 2015 10:56    Sujet du message: Répondre en citant

Une lettre plus loin ! C'est du C
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 12 Mar 2015 22:58    Sujet du message: Répondre en citant

Après moult tâtonnements, ça fonctionne ...



Par contre, j'ai pas toutes les explications ... En théorie, il n'y a rien de spécial...

Prochaine étape : faire le circuit électrique définitif
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 14 Mar 2015 18:53    Sujet du message: Répondre en citant

Quelques progrès de mon coté !

Voici le code de la séquence initiale complète, qui permet d'apprendre aux modules à se connecter aux adaptateurs ELM327

A adapter selon les consignes (broches et adresse MAC) et à faire pour les 2 modules bluetooth

Code:
#include <SoftwareSerial.h>

#define rxPin 9 //9 ou 12
#define txPin 8 //8 ou 11
SoftwareSerial mySerial(rxPin, txPin); // RX, TX

//A ADAPTER !!!!! FORMAT IMPORTANT, séparation par des virgules (4 caractères, 2 caractères, 6 caractères)
String btAddr = "000D,18,000001";
//String btAddr = "0019,5D,E8E478";

//#define RESET

String runSync(String  cmd) {
  String cmdResp = "";
  Serial.println("Sending : " + cmd);
  mySerial.print(cmd + "\r\n");
  delay(500);
  while (mySerial.available()) {
    cmdResp = mySerial.readStringUntil('\n');
  }
  Serial.println("Reponse : " + cmdResp+".");
  return cmdResp;
}

void runASync(String  cmd) {
  Serial.println("Sending : " + cmd);
  mySerial.print(cmd + "\r\n");
  Serial.print("Reponse : ");
  delay(500);
  while (mySerial.available()) {
    Serial.print(mySerial.readStringUntil('\n'));
  }
  Serial.println(".");
}


void setup() {
  Serial.begin(57600);
  mySerial.begin(38400);

  //AU CAS OU RIEN NE FONCTIONNE, LES 3 COMMANDES SUIVANTES REINITIALISENT TOUT
  #if defined(RESET)
    runSync("AT+RMAAD");
    runSync("AT+RESET");
    runSync("AT+ORGL");
  #else
    runSync("AT+UART=38400,0,0");
    runSync("AT+PSWD=1234");
    runSync("AT+BIND=" + btAddr);
    runSync("AT+CMODE=0");
   
    runASync("AT+INIT");
    runASync("AT+PAIR=" + btAddr + ",10");
    delay(10500);
    runASync("AT+LINK=" + btAddr);
    runASync("ATZ");
  #endif
}

void loop() {
  while (Serial.available()) {
    mySerial.print(Serial.read());
  }
}




A la fin si tout marche on voit les mots "ELM327 v1.x"



Pour rappel , les commandes AT http://eskimon.fr/wp-content/uploads/2014/...des_AT_HC05.pdf




Dernière édition par leo le 26 Mar 2015 00:36; édité 1 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 18 Mar 2015 21:50    Sujet du message: Répondre en citant

Bon en attendant d'améliorer un peu le code de "l'initialisation" des modules HC-05, et prendre en compte les remarques justifiées d'Arthur_35, j'ai bricolé en 20 minutes mon ELM327.

Le principe est simple, mettre une paire de prise jack 3.5 mm (récup chez moi) entre la broche 16 du connecteur ODB et la plaquette électrique. En prenant soit d'utiliser la partie femelle pour tout ce qui vient de la broche 16, j'ai ainsi un ELM double fonction.

- Alimenté par une cordon jack branché sur le 12V APC, il fonctionnera uniquement si le contact est mis.
- Par contre, si je branche les prises de l'adaptateur ensemble, il récupére le 12V permanent de l'ODB. Utile quand il faut aller faire un coup de diag chez les copains !



Une fois en place dans le boitier d'origine, avec quelques trous et un peu de "matière" (merci pattex) pour caller les éléments...



Et une fois fermé...

Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
leo



Inscrit le: 13 Nov 2008
Messages: 18

MessagePosté le: 20 Mar 2015 23:27    Sujet du message: Répondre en citant

ça avance ! Montage sur le faisceau de l'autoradio :





Pour info, le CAN-B = basse vitesse, 50Kb/s, c'est celui qui nous intéresse ...


Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    ALFA 147 France Index du Forum -> Divers Toutes les heures sont au format GMT + 2 Heures
Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7  Suivante
Page 4 sur 7



 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum





ok