Visualizzazione post con etichetta OBD. Mostra tutti i post
Visualizzazione post con etichetta OBD. Mostra tutti i post

giovedì 29 giugno 2017

OBD e MKR1000

Un breve esempio su come interfacciare una Arduino MKR1000 con un trasmettitore ODB Wifi



l'ELM327 OBD con trasmissione WiFi si comporta come un hotspot WiFi senza nessuna autenticazione. Se ci si collega all'indirizzo 192.168.0.10 con telnet sulla porta 35000 si puo' interagire con il sistema diagnostico dell'auto.
In questo esempio si interroga il numero di giri motore: per prima cosa si inviano i codici ATZ e AT SP 0 per resettare ELM327 e per definire il protocollo di comunicazione, in seguito si invia la richiesta 010C per ottenere il numero di giri motore (vedi qui)

----------------------------------------------------------
#include <SPI.h>
#include <WiFi101.h>

char ssid[] = "WiFi_OBDII"; //  your network SSID (name)
char pass[] = "";    // your network password (use for WPA, or use as key for WEP)

int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

IPAddress server(192,168,0,10);
WiFiClient client;



void setup() {
  // attempt to connect to WiFi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid);

    // wait 10 seconds for connection:
    delay(10000);
  }

WiFi.maxLowPowerMode()

  // you're connected now, so print out the status:
  printWiFiStatus();

 if (client.connect(server, 35000)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
  }
  client.println("ATZ");
  delay(2000);
  client.println("AT SP 0");
  delay(2000);

}


void loop() {
  client.println("010C");

  while (client.available())
    {
      char c = client.read();
      Serial.print(c);
    }
  Serial.println();
  delay(1000);
}


void printWiFiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

------------------------------------------

Questo e' il log di una sessione. L'Elm327 puo' rispondere con

Searching....
No data
Engine Off

nel caso in cui il sistema non riesca ad interrogare il numero di giri motore. Altrimenti si ha un codice di 4 gruppi del tipo 41 0C a conferma della richiesta e poi due byte (byte alto e byte basso) che indicano il numero di giri motore moltiplicato per 4
------------------------------------------
SSID: WiFi_OBDII
IP Address: 192.168.0.13
signal strength (RSSI):-37 dBm
connected
ATZ



ELM327 v1.5

>
AT SP 0
OK

>
010C
SEARCHING...

41 0C 0C 84


>010C
41 0C 0C 8C


>
010C
41 0C 0C 90

>
010C
41 0C 0C 70

>
010C
41 0C 0C 8C

>
010C
41 0C 0C 78


>
010C
41 0C 0C 84


>010C
41 0C 0C 88


>
010C
41 0C 0C 80


>
010C
41 0C 0C 88

martedì 20 giugno 2017

OBDSIM in Java




Per prima cosa si scarica IntelliJ Idea Commumity Edition e si importa i progetto File/New/Project from existing sources/Maven e si clicca sulla radice del progetto





poi da File/Project Structure si clicca su Libraries e si aggiunge la libreria jar bluecove che fornisce le librerie non presenti nel progetto preso da GitHub



Una volta cliccato Run si deve cliccare Edit Configuration, si preme + e si crea una Application.
Si imposta la classe Main e siamo quindi pronti a lanciare il progetto. Per creare il file .jar (in modo da non avere bisogno dell'IDE) si va in File/Project Structure/Artifacts si clicca + si aggiunge come JAR

java -cp obdsim.jar so.mwil.obdsim.Main

Si telnetta su

telnet 127.0.0.1 35000

e si richiedono i dati dei giri motore con

010C

il sistema risponde sempre al solito modo (non e' random) ovvero ripetendo il comando inviato con poi il codice 41 0C (codice di risposta) e 4b0 (il numero di giri in esadecimale ovvero 1200 che va diviso per 4 per ottenere gli RPM link)

010C
41 0C 4b0

Se Centos e' obbligatorio sbloccare la porta 35000, che e' filtrata dal firewall, con i comandi

firewall-cmd --zone=public --add-port=2888/tcp


martedì 23 agosto 2016

OBDSim

Per sviluppare una applicazione che si interfacci con il sistema OBD (On Board Diagnostic) non e' comodissimo lavorare per strada con il portatile ed a motore acceso. La soluzione piu' semplice e' usare il simulatore gratuito OBDSim



Ho provato a compilarlo ed eseguirlo su Linux...la compilazione e' terminata correttamente ma non sono riuscito a creare la seriale virtuale Bluetooth per collegare i dati con Torque (una applicazione Androird per visualizzare i dati provenienti da ODB) forse a causa di SELINUX (ero su Centos e devo ammettere che litigo ancora abbastanza con  SELINUX)

Su Windows 10 e Surface le cose sono andate decisamente meglio.
Per prima cosa si deve effettuare l'accoppiamento tra il telefono ed il computer e si crea una seriale virtuale (Impostazioni/Dispositivi/Bluetooth/Altre Opzioni Bluetooth/Porte COM/Aggiungi)

Si scarica il pacchetto gia' compilato e si lancia il comando

obdsim.exe -w COM4 -g gui_fltk

a questo punto spostando le lancette sull'interfaccia del computer si vede che anche Torque esegue la medesima modifica




Debugger integrato ESP32S3

Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede  nell'ID USB della porta Jtag. Nel modulo...