Logiciel Embarque — BMW M57

Firmware

Logiciel embarque LilyGO T-A7670G : gestion BLE double (OBD + SUNKENET), PIDs BMW M57 standard et UDS proprietaires, communication 4G, deep sleep.

01 Mapping PIDs BMW M57

PIDs standard OBD-II et PIDs proprietaires BMW via protocole UDS.

PIDs Standard OBD-II (Mode 01)

PIDDonneeFormuleUniteFrequence
010CRegime moteur (RPM)(A*256 + B) / 4tr/min2 Hz
010DVitesse vehiculeAkm/h2 Hz
0104Charge moteurA * 100 / 255%2 Hz
0105Temperature liquide refroidissementA - 40C0.1 Hz
015CTemperature huile moteurA - 40C0.1 Hz
010BPression collecteur admissionAkPa0.5 Hz
012FNiveau de carburantA * 100 / 255%0.1 Hz
0142Tension module controle(A*256 + B) / 1000V0.1 Hz

PIDs Proprietaires BMW M57 (Protocole UDS)

Les PIDs proprietaires BMW necessitent des requetes UDS (Unified Diagnostic Services) avec des headers CAN specifiques. L'OBDLink CX supporte ces requetes via des commandes AT configurees pour le mode etendu.

Requete UDSDonneeDescriptionUniteFrequence
22 1233Pression common railPression dans la rampe d'injection diesel M57. Valeur nominale : 250-1600 bar.bar0.5 Hz
22 1237Pression turbo (boost)Pression de suralimentation du turbocompresseur. Le M57 utilise un turbo a geometrie variable.bar0.5 Hz
22 123BCharge de suie DPFNiveau de charge en suie du filtre a particules diesel. Declenchement regeneration a ~45g.g0.05 Hz
22 1241Temperature DPFTemperature du filtre a particules. En regeneration : 500-600C. Normal : 200-300C.C0.1 Hz
22 124BDebit d'air massique (MAF)Debit massique d'air admis. Indicateur de performance moteur et calibration turbo.kg/h0.5 Hz
22 1250Position vanne EGRPosition de la vanne de recirculation des gaz d'echappement. 0% ferme, 100% ouvert.%0.1 Hz
22 1255Pression differentielle DPFDifference de pression avant/apres DPF. Indique le niveau de colmatage.mbar0.1 Hz

Initialisation UDS : Avant d'envoyer des requetes proprietaires BMW, il faut ouvrir une session de diagnostic etendue via la commande UDS 10 03 (Extended Diagnostic Session). Sans cela, l'ECU rejettera les requetes avec un code NRC 0x7F.

02 Boucle Principale

Architecture non-bloquante basee sur millis().

Le firmware fonctionne sur une boucle non-bloquante avec trois niveaux de frequence d'acquisition :

NiveauFrequenceDonnees captureesAction locale
Haute frequence2 Hz (500ms)RPM, vitesse, charge moteurMise a jour couleur SUNKENET (bleu < 2500 RPM, orange 2500-4000, rouge > 4000) + envoi vers ecran local
Frequence moyenne0.5 Hz (2s)Pression common rail, pression turbo, debit air (MAF)PIDs BMW UDS proprietaires
Basse frequence0.1 Hz (10s)Temperature huile, carburant, tension batterie, suie DPF, temperature DPF, position EGRMonitoring et diagnostics

En parallele, un upload cloud s'effectue toutes les 5 secondes, compilant les dernieres valeurs capteurs avec la position GPS en un payload JSON envoye via HTTPS POST a l'API Symfony.

Priorite batterie : La surveillance de la tension batterie est prioritaire sur toute autre operation. Si Vbatt < 11.8V, le firmware envoie un SMS d'alerte, coupe le modem et entre en deep sleep permanent.

03 Configuration et Seuils

Constantes et seuils du systeme — adaptes au BMW M57.

CategorieParametreValeurDescription
AlimentationVbatt critique11.8VDeclenchement deep sleep permanent
AlimentationVbatt warning12.2VAlerte SMS preventive
Moteur M57RPM seuil haut4000 tr/minFibre SUNKENET rouge (redline M57 ~5000)
Moteur M57RPM seuil moyen2500 tr/minFibre SUNKENET orange
Moteur M57Temperature huile warning120CTemperature huile M57 elevated
Moteur M57Temperature huile critique130CTemperature huile M57 dangereuse
Moteur M57Suie DPF warning40gRegeneration bientot necessaire
Moteur M57Pression common rail min200 barPression minimum acceptable
Fibre SUNKENETCouleursBleu, orange, rouge, vert, blanc, violetCodes couleur RGBW predefinis
TimingsUpload cloud5000msFrequence d'envoi vers l'API Symfony

04 Protocole BLE SUNKENET

Controle du kit fibre optique SUNKENET 20W RGBW Meteor via BLE.

Le controleur BLE du SUNKENET utilise un service BLE generique (FFE0) avec une characteristique de controle (FFE1). La LilyGO se connecte au controleur en tant que second peripherique BLE (en parallele de l'OBDLink CX).

FonctionDescription
Changement couleurEnvoi des valeurs RGBW (rouge, vert, bleu, blanc) au controleur. Permet toute couleur du spectre visible.
Mode d'animationStatique, pulsation, ou meteor. Vitesse d'animation configurable.
LuminositeReglage de 0 a 255 de l'intensite lumineuse globale.

UUIDs BLE : Les UUIDs du service et de la characteristique du controleur SUNKENET (FFE0/FFE1) sont des valeurs typiques pour les controleurs LED BLE generiques. A confirmer par un scan BLE du controleur reel installe dans la BMW E90.

05 Connexion OBDLink CX (BLE)

Connexion BLE a l'OBDLink CX et lecture des PIDs standard + BMW UDS.

Sequence de connexion

1

Scan BLE

Recherche d'un peripherique advertisant le service FFF0 (OBDLink CX).

2

Connexion & Decouverte

Connexion BLE, decouverte du service FFF0, recuperation des characteristiques TX (FFF1) et RX (FFF2).

3

Initialisation ELM327

Envoi des commandes AT d'initialisation : ATZ (reset), ATE0 (echo off), ATSP6 (protocole CAN 500kbps).

4

Configuration BMW UDS

Configuration du header CAN BMW (AT SH 7E0) et ouverture de la session diagnostic etendue (10 03).

5

Lecture PIDs

Envoi des commandes PID standard (ex: "010C\r" pour RPM) et UDS BMW (ex: "22 12 33\r" pour la pression common rail).

06 Gestion de l'Alimentation

Surveillance de la tension batterie BMW E90 et logique de survie.

Le module lit en permanence la tension de la batterie BMW via un pont diviseur resistif sur le GPIO 34. Un ADC 12 bits convertit la tension reduite (max 3.3V) puis la formule de calibration reconstitue la tension reelle (ratio 4.03).

SeuilTensionAction
Normal> 12.2VFonctionnement normal
Warning< 12.2VEnvoi SMS d'alerte preventive
Critique< 11.8VSMS d'alerte, coupure modem, deep sleep permanent
ReveilUniquement par GPIO 33 (SMS entrant) ou reset physique (demarrage vehicule)

07 Modem 4G + GPS + SMS

Communication avec le modem SIMCom A7670 via commandes AT. SIM FREE 100GB/mois.

Commandes AT cles

CommandeActionReponse attendue
ATTest de presenceOK
AT+CPIN?Etat carte SIM FREE+CPIN: READY
AT+CSQQualite signal+CSQ: 15,0 (0-31)
AT+CGPS=1Activer GPSOK
AT+CGPSINFOPosition GPS+CGPSINFO: lat,N,lon,E...
AT+CMGS="num"Envoyer SMS+CMGS: id
AT+HTTPINITInit HTTPOK
AT+HTTPPARA="URL","..."Set URLOK
AT+HTTPACTION=1POST HTTP+HTTPACTION: 1,200,...

08 Communication ESP-NOW

Liaison ultra-rapide vers l'ecran Sunton (optionnel, nice-to-have).

Le protocole ESP-NOW d'Espressif permet une communication directe entre la LilyGO et l'ecran Sunton ESP32-S3 sans routeur WiFi. Le module envoie un paquet de telemetrie contenant les valeurs essentielles : RPM, vitesse, charge moteur, temperature huile, pression turbo, pression common rail, suie DPF, tension batterie et couleur fibre actuelle.

Performance : ESP-NOW fonctionne sans routeur WiFi, avec une latence typique de < 5ms. Ideal pour l'affichage temps reel embarque des donnees M57.

09 Mise a Jour OTA

Update du firmware a distance via le modem 4G.

Precaution : Toujours verifier Vbatt > 12.5V avant de lancer un OTA. Utiliser une partition OTA double (app0/app1) pour pouvoir rollback en cas d'echec.

1

Check version

Le module interroge GET /api/firmware/latest a chaque boot. Compare avec la version locale.

2

Download

Telechargement du binaire par chunks via HTTPS (SIM FREE). Ecriture progressive sur la partition OTA inactive.

3

Verification

Verification du hash SHA256 du binaire. Si OK, bascule sur la nouvelle partition et reboot.

4

Rollback

Si le nouveau firmware ne repond pas dans les 30s apres reboot, rollback automatique vers l'ancienne version.

10 Securite Firmware

Protection des secrets et des communications.

NVS Chiffre

Le X-Device-Token et les credentials sont stockes dans la partition NVS chiffree de l'ESP32. Jamais en clair dans le code. Hash bcrypt valide cote Symfony.

Secrets

TLS Fingerprint

Le certificat SSL du serveur CarTrack est verifie par empreinte SHA256. Protection contre les attaques MITM meme sans CA chain complete.

HTTPS

Watchdog

Timer watchdog hardware a 30s. Si le firmware freeze (crash BLE, modem bloque), reboot automatique propre. Les donnees non envoyees sont bufferisees en NVS.

Fiabilite

Structure du Projet PlatformIO

Arborescence du projet firmware avec descriptions des fichiers.

firmware/
├── platformio.ini               # Configuration PlatformIO (board, libs, flags)
├── src/
│   ├── main.cpp                 # Point d'entree — setup() + loop()
│   ├── config.h                 # Constantes, seuils, pins, URLs
│   ├── obd_manager.h/.cpp       # Connexion BLE OBDLink CX + lecture PIDs
│   ├── fiber_manager.h/.cpp     # Connexion BLE SUNKENET + controle couleur
│   ├── modem_manager.h/.cpp     # Modem A7670 — AT commands, HTTP, SMS, GPS
│   ├── power_manager.h/.cpp     # Surveillance Vbatt, deep sleep, survie
│   ├── telemetry.h/.cpp         # Compilation payload JSON + upload cloud
│   ├── ota_manager.h/.cpp       # Mise a jour OTA via 4G
│   └── espnow_sender.h/.cpp     # Envoi telemetrie vers ecran Sunton (optionnel)
├── data/
│   ├── ca_cert.pem              # Certificat CA du serveur CarTrack
│   └── nvs_keys.csv             # Template cles NVS (token, wifi, etc.)
├── test/
│   ├── test_pid_parser.cpp      # Tests unitaires parsing PIDs OBD
│   ├── test_power_logic.cpp     # Tests logique de survie batterie
│   └── test_telemetry_json.cpp  # Tests compilation payload JSON
├── lib/
│   └── README                   # Librairies locales (si necessaire)
└── include/
    └── README                   # Headers partages

Build & Flash

Commandes PlatformIO pour compiler et flasher le firmware sur la LilyGO T-A7670G.

CommandeDescription
pio runCompile le firmware (verifie la syntaxe, les dependances et genere le binaire)
pio run -t uploadCompile et flash le firmware sur la carte connectee via USB
pio device monitor -b 115200Ouvre le moniteur serie a 115200 baud (debug output)
pio run -t uploadfsUpload le contenu du dossier data/ vers la partition SPIFFS (certificats, config)
pio testLance les tests unitaires (natifs sur la machine de dev, pas sur la carte)
pio run -t cleanNettoie les fichiers de build
pio lib listListe les librairies installees et leurs versions
pio lib install "NimBLE-Arduino"Installe une librairie (ex: NimBLE pour le BLE)

platformio.ini : La configuration cible la carte lilygo-t-a7670g avec le framework Arduino. Les flags de compilation incluent -DBOARD_HAS_PSRAM pour activer la PSRAM et -DCONFIG_BT_NIMBLE_MAX_CONNECTIONS=2 pour deux connexions BLE simultanees.

Implementation PIDs BMW M57

Details d'implementation des requetes OBD standard et UDS proprietaires BMW.

Sequence d'initialisation UDS

Avant de pouvoir lire les PIDs BMW proprietaires, le firmware doit executer la sequence suivante sur l'OBDLink CX :

// 1. Reset ELM327
sendATCommand("ATZ\r");                  // Reset complet
waitForResponse("ELM327", 3000);

// 2. Configuration de base
sendATCommand("ATE0\r");                 // Echo OFF
sendATCommand("ATL0\r");                 // Linefeeds OFF
sendATCommand("ATS0\r");                 // Spaces OFF (reponses compactes)
sendATCommand("ATH1\r");                 // Headers ON (pour voir les CAN IDs)
sendATCommand("ATSP6\r");               // Protocole ISO 15765-4 CAN 500kbps

// 3. Configuration header CAN BMW
sendATCommand("AT SH 7E0\r");           // Header CAN ECU BMW (requete)
// Reponses viendront avec header 7E8 (ECU response)

// 4. Ouverture session diagnostic etendue
sendATCommand("10 03\r");               // UDS: Extended Diagnostic Session
// Reponse attendue: 50 03 (positive response)
// Si 7F 10 12: session non supportee — verifier le header CAN

// 5. Maintien session (toutes les 2s)
// La session UDS expire apres 5s sans activite
// Envoyer periodiquement: "3E 00\r" (TesterPresent)

Parsing des reponses UDS BMW

Les reponses UDS BMW suivent le format 62 XX XX DD DD ou 62 est le positive response code de ReadDataByIdentifier, XX XX est le DID demande, et DD DD sont les octets de donnees.

// Exemple: Pression common rail (DID 1233)
// Requete: "22 1233\r"
// Reponse: "62 1233 05 DC"
// Parsing: pressure = (0x05 * 256 + 0xDC) = 1500 bar
//
// Exemple: Charge suie DPF (DID 123B)
// Requete: "22 123B\r"
// Reponse: "62 123B 00 1E"
// Parsing: soot = (0x00 * 256 + 0x1E) / 10 = 3.0 g
//
// Chaque DID a sa propre formule de conversion.
// Les formules sont definies dans config.h sous forme de macros.

TesterPresent : La session UDS etendue expire apres 5 secondes d'inactivite. Le firmware doit envoyer 3E 00 (TesterPresent) au moins toutes les 2 secondes pour maintenir la session ouverte. Si la session expire, les requetes 22 XX XX retourneront un NRC 7F 22 31 (requestOutOfRange).

Protocole BLE SUNKENET — Detail

Format des commandes BLE envoyees au controleur fibre optique SUNKENET.

Format des commandes

Les commandes sont envoyees via write without response sur la characteristique FFE1 du service FFE0. Le format est un tableau d'octets :

CommandeFormat (hex)Description
Couleur statique7E 07 05 03 RR GG BB WW EFRR=rouge, GG=vert, BB=bleu, WW=blanc (0x00-0xFF chacun)
Luminosite7E 04 01 LL EFLL = luminosite (0x00 = eteint, 0xFF = maximum)
Mode statique7E 04 03 01 EFCouleur fixe (pas d'animation)
Mode pulsation7E 04 03 02 EFPulsation lente (fade in/out)
Mode meteor7E 04 03 03 EFEffet meteor (fibres qui s'allument en sequence)
Power OFF7E 04 04 00 EFEteindre la source lumineuse
Power ON7E 04 04 01 EFAllumer la source lumineuse

Couleurs predefinies CarTrack

EtatCouleurRGBWCondition
ReposBleu00 00 FF 00RPM < 2500
MediumOrangeFF 80 00 00RPM 2500-4000
HighRougeFF 00 00 00RPM > 4000
Jarvis actionViolet80 00 FF 00Jarvis execute une action
Alerte batterieBlanc clignotant00 00 00 FFVbatt < 12.2V (mode pulsation)
DPF regenVert00 FF 00 00Regeneration DPF en cours

A confirmer : Le format des commandes ci-dessus est base sur le reverse-engineering de controleurs LED BLE generiques similaires. Les octets de header (7E) et de footer (EF) ainsi que les opcodes peuvent varier. Un sniffing BLE avec nRF Connect sera necessaire pour confirmer le protocole exact du controleur SUNKENET installe.

Processus OTA — Detail Technique

Implementation detaillee de la mise a jour Over-The-Air via le modem 4G.

Schema de partitions

# Partition Table (partitions.csv)
# Name,    Type, SubType, Offset,  Size
nvs,       data, nvs,     0x9000,  0x5000    # NVS chiffre (token, config)
otadata,   data, ota,     0xe000,  0x2000    # Metadata OTA (partition active)
app0,      app,  ota_0,   0x10000, 0x1E0000  # Firmware slot A
app1,      app,  ota_1,   0x1F0000,0x1E0000  # Firmware slot B
spiffs,    data, spiffs,  0x3D0000,0x30000   # Certificats, fichiers config

Flux OTA detaille

1

Version check

GET /api/firmware/latest retourne {"version": "1.2.0", "url": "https://..../firmware-1.2.0.bin", "sha256": "abc123...", "size": 1245184}. Le firmware compare avec FIRMWARE_VERSION dans config.h.

2

Pre-check batterie

Verification Vbatt > 12.5V. Si insuffisant, l'OTA est reportee au prochain boot. Un OTA interrompu par coupure de courant peut bricker le module (meme avec dual partition, le flash partiel est corrompu).

3

Telechargement par chunks

Le modem A7670 telecharge le binaire par morceaux de 4096 octets via HTTPS. Chaque chunk est ecrit sur la partition OTA inactive via esp_ota_write(). Progression loguee en serie.

4

Verification SHA256

Apres ecriture complete, calcul du hash SHA256 de la partition ecrite et comparaison avec le hash retourne par l'API. Si mismatch : abort, la partition active reste inchangee.

5

Switch & Reboot

esp_ota_set_boot_partition() bascule la partition active. esp_restart() redemarrage. Le bootloader charge la nouvelle partition.

6

Validation & Rollback

Le nouveau firmware doit appeler esp_ota_mark_app_valid() dans les 30 premieres secondes. Si le watchdog expire avant (crash, freeze), le bootloader rollback automatiquement vers l'ancienne partition.

Debugging

Outils et techniques pour diagnostiquer les problemes firmware.

Serial Monitor

Le firmware emet des logs structures sur le port serie a 115200 baud. Format : [timestamp_ms] [MODULE] message.

[1234] [BOOT] CarTrack Firmware v1.0.0 — LilyGO T-A7670G
[1240] [POWER] Vbatt = 12.65V (OK)
[1890] [MODEM] AT OK — SIM READY — Signal: 18/31
[2100] [GPS] Fix acquired: 48.8566, 2.3522
[3200] [BLE] OBDLink CX connected (FFF0)
[3400] [OBD] ATZ OK — ELM327 v2.3
[3500] [OBD] UDS session opened (10 03 -> 50 03)
[4000] [BLE] SUNKENET connected (FFE0)
[4500] [LOOP] RPM=2800 Speed=95 OilTemp=98 Boost=1.2
[4500] [FIBER] Color -> ORANGE (RPM 2500-4000)
[5000] [UPLOAD] POST /api/telemetry -> 200 OK (312ms)

Applications BLE Scanner

ApplicationPlateformeUsage
nRF ConnectAndroid / iOSScanner BLE, decouverte services, ecriture characteristiques. Outil de reference.
LightBlueiOS / MacScanner BLE simplifie. Bon pour les tests rapides de connexion.
Wireshark + nRF SnifferDesktopCapture des paquets BLE bruts. Necessaire pour reverse-engineer le protocole SUNKENET.

Problemes Courants

SymptomeCause probableSolution
BLE OBDLink deconnecte apres 30sTimeout BLE — pas d'activiteS'assurer que le firmware envoie des requetes PID regulierement (au moins toutes les 2s)
UDS repond 7F 22 31Session diagnostic expireeVerifier que 3E 00 (TesterPresent) est envoye toutes les 2s
Modem ne repond pas aux ATPower Key non pulsePulse GPIO 4 pendant 1.5s pour allumer le modem A7670
GPS pas de fixAntenne obstruee (coffre metallique)Placer l'antenne GPS pres de la lunette arriere ou utiliser une antenne externe
Reboots aleatoiresParasites alimentationVerifier les condensateurs de filtrage. Ajouter un condensateur 470uF supplementaire si necessaire.
SUNKENET ne change pas de couleurMauvais UUIDs BLEScanner le controleur avec nRF Connect pour verifier les UUIDs reels