Lectura desde el bus CAN de un Chevrolet Cruze usando un Arduino Uno

1

Estoy utilizando el Arduino Uno , CAN bus shield y OBDII to DB9 Cable utilizando sus bibliotecas proporcionadas . Solo pude inicializarlo.

Lecturas :

Mientras está conectado al automóvil:

  • CAN-High: 2.7 V - 3.0 V
  • CAN-bajo: 2.4 V - 2.7 V

Mientras no esté conectado al automóvil:

  • CAN-High: ~ 2.4 V
  • CAN-bajo: ~ 2.5 V

Nota: en ambos casos, el Arduino está conectado a mi PC a través de USB (para la depuración).

Código de muestra:

#include <SoftwareSerial.h>   //Software serial port
#include <Canbus.h>

#define CBRxD 5  // CAN BUS RX
#define CBTxD 4  // TX

#define DEBUG_ENABLED  1

char buffer[512];  //Data will be temporarily stored to this buffer before being written to the file
char tempbuf[15];
char lat_str[14];
char lon_str[14];

int LED2 = 7;
int LED3 = 8;

boolean scan = true;

SoftwareSerial canbusSerial(CBRxD, CBTxD);

void setup() {
    Serial.begin(9600);
    canbusSerial.begin(4800);
    pinMode(0, INPUT);
    pinMode(BTTxD, OUTPUT);
    pinMode(LED2, OUTPUT);

    pinMode(LED3, OUTPUT);

    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);

    setupCanbus();
}

void loop() {
    char recvChar;
    if (canbusSerial.available()) {  // Check if there's any data sent from the remote CAN bus shield
        recvChar = canbusSerial.read();
        Serial.print("CAN: "+recvChar);
    }

    if (scan) {
        digitalWrite(LED3, HIGH);

        if(Canbus.ecu_req(ENGINE_RPM,buffer) == 1) {       /* Request for engine RPM */
            Serial.println(buffer);                        /* Display data on Serial Monitor */
        }
        Serial.println(buffer);

        if(Canbus.ecu_req(VEHICLE_SPEED,buffer) == 1) {
            Serial.println(buffer);
        }Serial.println(buffer);

        if(Canbus.ecu_req(ENGINE_COOLANT_TEMP,buffer) == 1) {
            Serial.print(buffer);
        }Serial.println(buffer);

        if(Canbus.ecu_req(THROTTLE,buffer) == 1) {
            Serial.println(buffer);
        }
        Serial.println(buffer);
        //  Canbus.ecu_req(O2_VOLTAGE,buffer);

        digitalWrite(LED3, LOW);
        delay(100);
    }
}

void setupCanbus() {
    while (!Canbus.init(CANSPEED_250)) {
        Serial.println("CAN Init");
    }
    Serial.println("CAN Init OK");
    delay(1000);
}
    
pregunta mabdrabo

2 respuestas

2

Creo que tu coche es similar a Opel Astra J . Utiliza GMLAN que es un bus CAN de baja velocidad (33 kbit / s).

He podido leer y enviar datos CAN con el mismo hardware.

Tuve que conectar CAN-H y CAN-L respectivamente al pin SW-LS-CAN y a tierra, de acuerdo con la segunda tabla de la página Pinout de la interfaz de diagnóstico OBD II de General Motors (GM) .

Utilicé el código en enlace .

Dime si esto funciona.

    
respondido por el acca
0

Su código de ejemplo tiene

SoftwareSerial mySerial = SoftwareSerial(4, 5);

Tienes

SoftwareSerial canbusSerial(CBRxD, CBTxD);

Lo que se traduce en el orden de pin opuesto

SoftwareSerial canbusSerial(5, 4);

Quizás el cambio de CBRxD y CBTxD funcionaría.

    
respondido por el geometrikal

Lea otras preguntas en las etiquetas