Forum: Mikrocontroller und Digitale Elektronik NAZA CAN BUS mit Arduino und MCP2515 auslesen


von Sukramian (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine DJI NAZA-M V2 Flugsteuerung die über einen CAN-BUS 
verfügt. Hier möchte ich mithilfe eines Arduino Micro (zum testen 
erstmal mit einem Arduino Uno, zur not käme auch ein Teensy 3.2 in 
Frage) die aktuellen GPS-Koordinaten auslesen. Dafür habe ich mir 
folgendes MCP2515 Board gekauft:
http://r.ebay.com/Mp69Rg
Die Verdrahtung sieht folgendermaßen aus:

MCP2515                 Arduino Uno
INT          ->         2
SCK          ->         13
SI           ->         11
SO           ->         12
CS           ->         10
GND          ->         GND
VCC          ->         5V

Mit der MCP_CAN Library und dem folgendem Sketch müsste ich doch 
eigentlich die Daten von der NAZA auslesen können oder?
1
// Henry's Bench
2
// 1st CAN Network - CAN RECEIVE
3
4
#include <SPI.h>
5
#include "mcp_can.h"
6
7
8
long unsigned int rxId;
9
10
unsigned long rcvTime;
11
12
unsigned char len = 0;
13
unsigned char buf[8];
14
15
16
const int SPI_CS_PIN = 10;
17
18
19
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
20
21
void setup()
22
{
23
    Serial.begin(115200);
24
    
25
26
    while (CAN_OK != CAN.begin(CAN_1000KBPS))              // init can bus : baudrate = 1000k
27
    {
28
        Serial.println("CAN BUS Module Failed to Initialized");
29
        Serial.println("Retrying....");
30
        delay(200);
31
    }    
32
    Serial.println("CAN BUS Module Initialized!");
33
    Serial.println("Time\t\tPGN\t\tByte0\tByte1\tByte2\tByte3\tByte4\tByte5\tByte6\tByte7");    
34
}
35
36
37
void loop()
38
{
39
    
40
    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
41
    {
42
        rcvTime = millis();
43
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf
44
45
        rxId= CAN.getCanId();
46
47
        Serial.print(rcvTime);
48
        Serial.print("\t\t");
49
        Serial.print("0x");
50
        Serial.print(rxId, HEX);
51
        Serial.print("\t");
52
53
        for(int i = 0; i<len; i++)    // print the data
54
        {
55
            if(buf[i] > 15){
56
              Serial.print("0x");
57
              Serial.print(buf[i], HEX);    
58
            }
59
          else{
60
              Serial.print("0x0");
61
              Serial.print(buf[i], HEX);
62
          }  
63
            
64
            //Serial.print("0x");
65
            //Serial.print(buf[i], HEX);
66
            
67
            Serial.print("\t");            
68
        }
69
        Serial.println();
70
    }
71
}

Im Seriellen Monitor sehe ich dann nur das:
1
CAN BUS Module Initialized!
2
Time    PGN    Byte0  Byte1  Byte2  Byte3  Byte4  Byte5  Byte6  Byte7



Das Problem ist, dass die Verbindung zum MCP2515 zwar immer einwandfrei 
klappt, jedoch werden mir nie Daten von der NAZA ausgelesen und 
angezeigt. Die NAZA habe ich über
CAN_H -> CAN_H
CAN_L -> CAN_L
GND -> GND
mit dem MCP2515 verbunden.

Ich habe auch schon viele andere Sketche und CAN-Librarys probiert, aber 
es funktionierte immer nur die Kommunikation zum MCP2515.

Was meint ihr, was könnte das Problem sein? Muss ich vielleicht doch 
besser den MCP2551 nehmen und diesen dann Seriell ansteuern?
Ich wäre über Tipps und Ratschläge sehr dankbar.

von Sebastian E. (sbe_15)


Lesenswert?

Ein paar Ideen:
- Findet überhaupt Kommunikation statt? => Oszilloskop
- Stimmen Bitrate und Bit-Timings?
- Ist der CAN korrekt angeschlossen (=terminiert)?
- Was sagen die Fehler-Register des CAN-Controllers?

von Sukramian (Gast)


Lesenswert?

Danke für deine schnelle Antwort,
zu 1. eine Kommunikation findet statt, verbindet man mit und CAN_L mit 
einem Oszilloskop, so sieht man das typische CAN-Muster, also bei beiden 
2,5V Grundspannungen und dann immer gleichzeitig Ausschläge nach oben 
und unten.

Vielleicht sollte ich noch dazu sagen, dass der CAN-BUS für mich noch 
komplett neu ist.

Zu 2., die Bitrate sollte korrekt sein, laut Internetquellen liegt die 
beim NAZA CAN BUS bei 1MBps bzw. 1000KBps. Was genau sind die 
Bit-Timings bzw. wo müsste ich diese im obigen Sketch anpassen?

Zu 3. mit terminiert meinst du den Abschlusswiderstand von 120 Ohm am 
Ende der leitung oder? Diesen habe ich am CAN-Modul durch den Jumper J1 
aktiviert.

Zu 4., die Fehlerspeicher wollte ich auch mal auslesen, aber wie genau 
mache ich das mit dem Arduino?

von Sukramian (Gast)


Lesenswert?

Meine Beobachtung ist, dass die IF-Bedingung in der loop
1
if(CAN_MSGAVAIL == CAN.checkReceive())
 nie erfüllt und deshalb auch nichts weiter passiert

von Thomas (kosmos)


Lesenswert?

Der MCP2551 ist nur ein Tranceiver. Er setzt die differentiellen 
Spannungspegel nur um. Der MCP2515 ist der CAN-Controller der sich um 
die Kommunikation (Abitrierung, Fehlererkennung usw.) kümmert.

von Blubber (Gast)


Lesenswert?

Sukramian schrieb:
> afür habe ich mir
> folgendes MCP2515 Board gekauft:
> http://r.ebay.com/Mp69Rg

Die Platine hat laut Bild einen 8MHz Quarz.
Was für einen Quarz wird von deiner CAN-Lib erwartet?
( Gerne wird 16MHz genommen )
Damit wäre dein CAN-Speed Faktor 2 zu klein.

von Sukramian (Gast)


Lesenswert?

Blubber schrieb:
> Die Platine hat laut Bild einen 8MHz Quarz.
> Was für einen Quarz wird von deiner CAN-Lib erwartet?
> ( Gerne wird 16MHz genommen )
> Damit wäre dein CAN-Speed Faktor 2 zu klein.

Danke, genau das war das Problem! Habe jetzt einen anderen 
Beispielsketch genommen, bei dem man die Frequenz einstellen kann und 
plötzlich hat es auf anhieb funktioniert!

Das Programm ist nun so:
1
// CAN Receive Example
2
//
3
4
#include <mcp_can.h>
5
#include <SPI.h>
6
7
long unsigned int rxId;
8
unsigned char len = 0;
9
unsigned char rxBuf[8];
10
char msgString[128];                        // Array to store serial string
11
12
#define CAN0_INT 2                              // Set INT to pin 2
13
MCP_CAN CAN0(10);                               // Set CS to pin 10
14
15
16
void setup()
17
{
18
  Serial.begin(115200);
19
  
20
  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
21
  if(CAN0.begin(MCP_ANY, CAN_1000KBPS, MCP_8MHZ) == CAN_OK)
22
    Serial.println("MCP2515 Initialized Successfully!");
23
  else
24
    Serial.println("Error Initializing MCP2515...");
25
  
26
  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
27
28
  pinMode(CAN0_INT, INPUT);                            // Configuring pin for /INT input
29
  
30
  Serial.println("MCP2515 Library Receive Example...");
31
}
32
33
void loop()
34
{
35
  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer
36
  {
37
    CAN0.readMsgBuf(&rxId, &len, rxBuf);      // Read data: len = data length, buf = data byte(s)
38
    
39
    if((rxId & 0x80000000) == 0x80000000)     // Determine if ID is standard (11 bits) or extended (29 bits)
40
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data:", (rxId & 0x1FFFFFFF), len);
41
    else
42
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
43
  
44
    Serial.print(msgString);
45
  
46
    if((rxId & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
47
      sprintf(msgString, " REMOTE REQUEST FRAME");
48
      Serial.print(msgString);
49
    } else {
50
      for(byte i = 0; i<len; i++){
51
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
52
        Serial.print(msgString);
53
      }
54
    }
55
        
56
    Serial.println();
57
  }
58
}

So sehen die Daten jetzt aus:
1
Setting Baudrate Successful!
2
MCP2515 Initialized Successfully!
3
MCP2515 Library Receive Example...
4
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
5
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
6
Standard ID: 0x118       DLC: 8  Data: 0xB8 0x01 0x50 0xFF 0x8E 0xFF 0x66 0xCC
7
Standard ID: 0x7F8       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x03 0x10 0x3A 0x00
8
Standard ID: 0x7F8       DLC: 6  Data: 0x45 0x06 0x66 0xCC 0x66 0xCC
9
Standard ID: 0x7F8       DLC: 8  Data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
10
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
11
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
12
Standard ID: 0x118       DLC: 8  Data: 0xB9 0x01 0x51 0xFF 0x8F 0xFF 0x66 0xCC
13
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
14
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
15
Standard ID: 0x118       DLC: 8  Data: 0xB4 0x01 0x54 0xFF 0x90 0xFF 0x66 0xCC
16
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
17
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
18
Standard ID: 0x118       DLC: 8  Data: 0xB7 0x01 0x52 0xFF 0x90 0xFF 0x66 0xCC
19
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
20
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
21
Standard ID: 0x118       DLC: 8  Data: 0xB9 0x01 0x51 0xFF 0x8F 0xFF 0x66 0xCC
22
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
23
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
24
Standard ID: 0x118       DLC: 8  Data: 0xB8 0x01 0x56 0xFF 0x8F 0xFF 0x66 0xCC
25
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
26
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
27
Standard ID: 0x118       DLC: 8  Data: 0xB5 0x01 0x51 0xFF 0x8F 0xFF 0x66 0xCC
28
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
29
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
30
Standard ID: 0x118       DLC: 8  Data: 0xB7 0x01 0x54 0xFF 0x8F 0xFF 0x66 0xCC
31
Standard ID: 0x7F8       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x03 0x10 0x3A 0x00
32
Standard ID: 0x7F8       DLC: 8  Data: 0x00 0x00 0x00 0x00 0x98 0xBD 0xFF 0xFF
33
Standard ID: 0x7F8       DLC: 6  Data: 0x46 0x06 0x66 0xCC 0x66 0xCC
34
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
35
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
36
Standard ID: 0x7F8       DLC: 8  Data: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
37
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
38
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
39
Standard ID: 0x118       DLC: 8  Data: 0xB9 0x01 0x50 0xFF 0x90 0xFF 0x66 0xCC
40
Standard ID: 0x7F8       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x22 0x09 0x00 0x00
41
Standard ID: 0x7F8       DLC: 4  Data: 0x66 0xCC 0x66 0xCC
42
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
43
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
44
Standard ID: 0x7F8       DLC: 8  Data: 0x01 0x01 0x01 0x06 0x66 0xCC 0x66 0xCC
45
Standard ID: 0x118       DLC: 8  Data: 0xB8 0x01 0x52 0xFF 0x90 0xFF 0x66 0xCC
46
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
47
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
48
Standard ID: 0x118       DLC: 8  Data: 0xB6 0x01 0x54 0xFF 0x90 0xFF 0x66 0xCC
49
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
50
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC
51
Standard ID: 0x118       DLC: 8  Data: 0xB8 0x01 0x50 0xFF 0x8F 0xFF 0x66 0xCC
52
Standard ID: 0x118       DLC: 8  Data: 0x55 0xAA 0x55 0xAA 0x04 0x10 0x06 0x00
53
Standard ID: 0x118       DLC: 2  Data: 0x66 0xCC

laut diesem link soll aber zum Beispiel die GPS DATA mit CAN-ID 0x7F8 
deutlich länger sein:
https://www.rcgroups.com/forums/showpost.php?p=26210591&postcount=15

Wie genau komm ich da jetzt auf die GPS-Koordinaten, welche ich dann in 
eine floatvariable schreiben möchte?

Sorry, aber mit diesen Rohdaten im Hexadezimalformat komm ich jetzt auf 
Anhieb noch nicht ganz klar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.