Arduino UNO + CanBUS Shield + VW Golf

Ciao a tutti, è da una settimana che sto sbattendo la testa con lo shield CanBUS della SeeedStudio per leggere i dati Can della mia Golf 6.

Ho già testato la lettura dei dati con un altro cavo (CanUSB) e con quello riesco a leggere i dati dal cavo che c’è dietro allo stereo. La velocità corretta è di 100k

Vorrei fare la stessa cosa con il CanBus shield ma questo non mi da nessun segno di vita!
Ho provato a collegarmi con la porta seriale anteriore e con la morsettiera laterale ma senza risultato. Lo shield ha dei led tra cui rx/tx che non si accendono MAI quindi penso che non c’è nessun tipo di messaggio che viene restituito

Vi allego il codice che sto usando

#include <SPI.h>
#include "mcp_can.h"

INT32U canId = 0x000;

unsigned char len = 0;
unsigned char buf[8];
char str[20];


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

START_INIT:

    if(CAN_OK == CAN.begin(CAN_100KBPS))
    {
        Serial.println("CAN BUS Shield init ok!");
    }
    else
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println("Init CAN BUS Shield again");
        delay(100);
        goto START_INIT;
    }
}


void loop()
{
    if(CAN_MSGAVAIL == CAN.checkReceive())  
    {
        CAN.readMsgBuf(&len, buf); 
        canId = CAN.getCanId();
        Serial.print("<");Serial.print(canId);Serial.print(",");
        for(int i = 0; i<len; i++)
        {
            Serial.print(buf[i]);Serial.print(",");
        }
        Serial.print(">");
        Serial.println();
    }
}

L’esempio che ho seguito è questo:

e la libreria usata è questa:

Sono sicurissimo di essermi collegato ai cavi corretti perchè con l’altro cavo funziona ma ho bisogno di arduino per fare alcune automazioni

Idee?

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Ciao, ho dato un occhiata ai link che mi hai proposto ma non ho trovato niente di utile. Quali elementi in più posso fornire per fare un analisi più accurata?

Ciao, purtroppo spesso si abusa della parola Can-BUS e spesso si indica tutt'altro. Potresti intanto postare qualche informazione sul cavo che utilizzi e che ti funziona?

Il cavo che utilizzo e che funziona è questo: http://www.can232.com/?page_id=16 abbinato ad un software che è questo: http://www.canviausb.com/CANviaUSB/index.php

Come ho spiegato sopra con questo cavo mi collego sul connettore dell'autoradio (di cui conosco esattamente la piedinatura) e riesco a leggere i vari dati CAN riuscendo ad indentificare le varie periferiche dell'auto.

Con lo shield invece sembra che da lì non arrivi proprio niente. Ho provato ad utilizzare a turno la morsettiera verde con CAN+ e CAN- e ad usare il connettore DB9 creando il cavo come da allegato che ho postato sopra:

  • cavo nero GROUND
  • cavo rosso +12V
  • cavo giallo CAN+
  • cavo verde CAN -

Per il cablaggio ho seguito quello che c'è scritto quì: http://www.seeedstudio.com/wiki/CAN-BUS_Shield

Sullo shield ci sono alcuni led che indicano: - pwr è l'alimentazione (che arriva non appena collego Arduino alla USB) - rx - tx - int (che non so cosa sia)

Rx e Tx non si sono MAI accese. Spero ci sia qualche tipo di errore nel codice oppure ci sta che abbia uno shield difettoso, ma siccome è da poco che sono nel mondo Arduino chiedo a voi che siete più esperti

Grazie per ora

Ciao “capu”.
Capisco che sei arrivato abbastanza lontano con il can bus … ad avere dei frame … spero.
Io ho trovato i due fili tra la porta e la macchina, nel tubo in gomma.
Non avendo Can-Bus Sniffer, la sera sto 2-3 ore in macchina a leggere e a inviare frame alla macchina uno alla volta :confused: :frowning: .
Ho trovato come bloccare l’auto e accendere le 4 frecce.
Il tuo problema è che non hai selezionato il SPI_CS_PIN che nel mio caso e 10, ma può essere anche 9
ecco il codice che da me funziona.

#include <SPI.h>
#include "mcp_can.h"


// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

const int LockDoors = A5;

void setup()
{
  Serial.begin(115200);
  pinMode(LockDoors, INPUT_PULLUP); // pin pullup

START_INIT:

  if (CAN_OK == CAN.begin(CAN_100KBPS))                  // init can bus : baudrate = 500k
  {
    Serial.println("CAN BUS Shield init ok!");
  }
  else
  {
    Serial.println("CAN BUS Shield init fail");
    Serial.println("Init CAN BUS Shield again");
    delay(100);
    goto START_INIT;
  }
}

unsigned char stmp[8] = {0, 2, 6, 20, 160, 4, 0, 0};
unsigned char stmp2[8] = {0, 0, 112, 112};

void loop()
{
  if (digitalRead(LockDoors) == LOW)
  {
    //Serial.println();
    //Serial.print("--------- A5: H"); Serial.println("  LOCK DOORS !");
    // send data:  id = 0x00, standrad frame, data len = 8, stmp: data buf
    CAN.sendMsgBuf(0x400, 0, 8, stmp);
    //CAN.sendMsgBuf(0x531, 0, 8, stmp);
    //delay(500);
    // MsgSended = 1;
  }

  unsigned char len = 0;
  unsigned char buf[8];

  if (CAN_MSGAVAIL == CAN.checkReceive())           // check if data coming
  {
    CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

    unsigned long canId = CAN.getCanId();

    Serial.print("ID: 0x");
    Serial.print(canId, HEX); // ID in HEX
    Serial.print(", d");
    Serial.print(canId);      // oppure in DEC
    //Serial.print(" l:");
    //Serial.print(len);    // data length in DEC
    Serial.print("\t  "); // buffer

    for (int i = 0; i < len; i++) // print the data
    {
      Serial.print(buf[i]);
      Serial.print(", ");
    }
    /*        Serial.print("\t\t HEX: ");
                for (int i = 0; i < len; i++) // print the data .. in DEC
                {
                  Serial.print(buf[i]);
                  Serial.print(" ");
                }
    */
    Serial.println();
  }
}

Ciao a tutti, mi sto cimentando anche io con il mondo della rete CAN… ho preso la scheda della Sparkfun, collegata ad arduino UNO cavi ecc ecc sembra che funzioni, nel senso che riesco a leggere i messaggi che viaggiano in rete (sul serial monitor). Ora però volevo filtrarli e cercare di capire quali cambiamo in base a cosa avviene nell’auto. In teoria il messaggio dovrebbe essere formato da 9 Byte, il primo è l’ID e gli altri 8 sono le informazioni del messaggio, io però vedo messaggi di lunghezze diverse, un po a caso, è normale? o sbaglio qualcosa io?
Vi posto il codice e una parte dei dati che ricevo.

Lo shield è quello della SParkFun, modello 13262
il protocollo della mia macchina è: ISO 15765-4 11Bit/500Kbaud
ho impostato la velocità della seriale a 38400KBaud
questo è il codice che ho usato:

#include <Canbus.h>
#include <defaults.h>
#include <global.h>
#include <mcp2515.h>
#include <mcp2515_defs.h>

void setup() {
  Serial.begin(38400); // For debug use
  Serial.println("CAN Read - Testing receival of CAN Bus message");  
  delay(1000);
  
  if(Canbus.init(CANSPEED_500))  //Initialise MCP2515 CAN controller at the specified speed
    Serial.println("CAN Init ok");
  else
    Serial.println("Can't init CAN");
    
  delay(1000);
}

void loop(){

  tCAN message;
if (mcp2515_check_message()) 
	{
    if (mcp2515_get_message(&message)) 
	{
        //if(message.id == 0x620 and message.data[2] == 0xFF)  //uncomment when you want to filter
             //{
               
               Serial.print("ID: ");
               Serial.print(message.id,HEX);
               Serial.print(", ");
               Serial.print("Data: ");
               Serial.print(message.header.length,DEC);
               for(int i=0;i<message.header.length;i++) 
                {	
                  Serial.print(message.data[i],HEX);
                  Serial.print(" ");
                }
               Serial.println("");
             //}
           }}

}

questo è il risultato che ottengo sul ser.monitor:
come si vede alcuni messaggi sono giusti 8+1 altri totalmente sballati :frowning:

CAN Read - Testing receival of CAN Bus message
CAN Init ok
ID: 12E, Data: 8C5 7F FE 7F E0 FF FF 0
ID: 12E, Data: 8C4 7F FE 7F E0 FF FF 0
ID: C6, Data: 872 B6 7F F6 7F F9 AC 3E
ID: 581, Data: 42 20 0 3
ID: 211, Data: 782 0 FF 0 8 0 0
ID: 4AC, Data: 180
ID: 211, Data: 782 0 FF 0 8 0 0
ID: 211, Data: 782 0 FF 0 8 0 0
ID: 657, Data: 20 0
ID: 581, Data: 42 20 0 3
ID: 350, Data: 8C3 A 7E CC 14 14 94 85
ID: 673, Data: 70 0 FF FF FF FF 0
ID: 12E, Data: 8C5 7F FE 7F D0 FF FF 0
ID: 3B7, Data: 62E FF 7F 8F 7F 40
ID: 4AC, Data: 180
ID: 12E, Data: 8C5 7F FE 7F D0 FF FF 0
ID: 3B7, Data: 62E FF 7F 8F 7F 40
ID: 12E, Data: 8C5 7F FE 7F F0 FF FF 0
ID: 12E, Data: 8C4 7F FE 7F F0 FF FF 0
ID: 211, Data: 782 0 FF 0 8 0 0
ID: 581, Data: 42 20 0 3
ID: 3B7, Data: 62E FF 7F 8F 7F 40
ID: 657, Data: 20 0
ID: 581, Data: 482 20 0 3
ID: 350, Data: 8C3 A 7E CC 14 14 94 85
ID: 673, Data: 70 0 FF FF FF FF 0
ID: 12E, Data: 8C5 7F FE 7F F0 FF FF 0
ID: 3B7, Data: 62E FF 7F 8F 7F 40
ID: 4AC, Data: 180
ID: 12E, Data: 8C5 7F FF 7F F0 FF FF 0
ID: 3B7, Data: 62E FF 7F 8F 7F 40
ID: 352, Data: 45C 0 0 0
ID: 12E, Data: 8C5 7F FE 7F F0 FF FF 0
ID: 5DE, Data: 80 0 0 0 0 0 0 42
ID: 12E, Data: 8C5 7F FE 7F F0 FF FF 0
ID: 350, Data: 8C3 A 7E CC 14 14 94 85
ID: 657, Data: 20 0