CAN- BUS Intallation und einfache Tests

Auf dieser Seite wirde erklärt welche Libraries nötig sind, um ein paar Tests mit zwei CAN-Interfaces durchzuführen, wie diese installiert werden, und wie die Tests aufgebaut sind und funktionieren.


Zuerst lädst du das Datenpacket aus dem Anhang herunter welches ich zusammengestellt habe:

  1. CAN-Arduino.zip(Im Anhang)
  2. EinfacherTest_zweier_Interfaces.ino.(Im Anhang)


Füge die 'Ino'-Datei in deinen Sketchbookordner ein
und die Libraries in den Ordner mit den anderen Libraries deines Arduinos.
Oder wenn du keine Adminrechte hast kannst du auch im Sketchbook eine library hinzufügen:

Open the sketchbook location in your file browser, such as Windows Explorer or MacOS Finder. Inside that location you'll see one directory for each of the sketches you've saved.

Look for a directory called "libraries" in there with all your sketches, and if it doesn't exist yet, create it. The folder must have that exact name so that the Arduino IDE can find it.

Now open the "libraries" directory, and copy the library you want to install into it.

Finally, quit and re-launch the Arduino IDE if you already had it open, so that it will recognise that the new library has been installed.

Der Befehl #include "lib_name.h" bindet dann die library mit ein.

 


Nun ist ein größteil der Arbeit erledigt.
Im nächsten Teil wird erkärt, wie das Programm funktioniert und welche Befehle am wichtigsten sind.


Im nächsten sehen wir erst den ganzen Code und analysieren ihn dann im einzelnen:

#include <CAnduino.h>

#include <SPI.h>

#define BUS_SPEED 1000
#define RX 1
#define TX 0

//Globale Variable sollen den Zustand festelegen->
//TX(transceiver) oder Rx(receiver)- Zustand
int state;
//global variable used to toggle pin
int pin;


void setup() {                
 
  Serial.begin(9600);
 
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
 
  // Initialisiere CAN bus class
  // Diese"Klasse" initialisiert die SPI Kommunikation mit dem MCP2515
  CAN.begin();
  CAN.baudConfig(BUS_SPEED);
  CAN.setMode(NORMAL);  
 
  //Warte 5 Sekunden damit auch hochgeladen werden kann,
 // wenn die vorherige Iteration den Serial Port zuspammt

  delay(5000);
 
  //Festlegen damit feststeht, ob der Transceiver Code oder Receiver code
  state = RX; //Rx = 1, Tx = 0
  

  pin = LOW;  
}

void loop() {
 
  byte length,rx_status,i;
  unsigned short frame_id;
  byte frame_data[8];
 
  //signal iterations on pin 8
  digitalWrite(8,pin);  
 
  switch(state) {
    case TX: //Tx
   
      //signal state on pin 7;
      digitalWrite(7,LOW);
     
      frame_data[0] = 'H';
      frame_data[1] = 'i';
      frame_data[2] = 'M';
      frame_data[3] = 'a';
      frame_data[4] = 'r';
      frame_data[5] = 'k';
      frame_data[6] = 'u';
      frame_data[7] = 's';

      frame_id = 0x05A5;
 
      length = 8;
 
      CAN.load_ff_0(length,frame_id,frame_data);
      CAN.send_0();
         
     // Serial.println("Tx ");
      delay(5);
      break;
    case RX: //Rx
   
      //signal state on pin 7
      digitalWrite(7,HIGH);    
      //Receive Puffer leeren, nur im Fall der Fälle
      frame_data[0] = 0x00;
      frame_data[1] = 0x00;
      frame_data[2] = 0x00;
      frame_data[3] = 0x00;
      frame_data[4] = 0x00;
      frame_data[5] = 0x00;
      frame_data[6] = 0x00;
      frame_data[7] = 0x00;
 
      frame_id = 0x0000;
 
      length = 0;
     
      rx_status = CAN.readStatus();
     
      if ((rx_status & 0x01) == 0x01) {
       
       CAN.readDATA_ff_0(&length,frame_data,&frame_id);
       
      } else if ((rx_status & 0x02) == 0x02) {
       
       CAN.readDATA_ff_1(&length,frame_data,&frame_id);
       
      }
     
      if (((rx_status & 0x01) == 0x01) ||
          ((rx_status & 0x02) == 0x02)) {
     
      Serial.print("Rx: ");
      Serial.print(rx_status,HEX);
      Serial.print(" / ");
      Serial.print(length,HEX);
     
      Serial.print(" / ");
      Serial.print(frame_id,HEX);
   
      for (i=0;i<8;i++) {
        Serial.print(" / ");
        Serial.print(frame_data[i],HEX);
      }

      Serial.println();
     }
    // delay(1);
     break;
  }
 
  if (pin == LOW) {
    pin = HIGH;
  } else {
    pin = LOW;
  }  

 

}
#include <CAnduino.h>
#include <SPI.h>

Dieser Teil ist dringend notwendig, da die Libraries Funktionen definieren,
und die Programme ohne diese nicht funktionieren.

#define BUS_SPEED 1000
#define RX 1
#define TX 0

int state;
//global variable used to toggle pin
int pin;

Dieser Teil des Codes definiert weitere Variablen, die wichtig sind um später eine Kommunikation zu gewährleisten. RX ist der Zustand des Empfängers und TX der Zustand des Senders.

"int state" ermöglicht es erst in der Funktion die zwei Zustände zu verwenden.

void setup() {                
 
  Serial.begin(9600);
 
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
 
  CAN.begin();
  CAN.baudConfig(BUS_SPEED);
  CAN.setMode(NORMAL);  
 

  delay(5000);
 
 
  state = RX; //Rx = 1, Tx = 0
  

  pin = LOW;  
}

Die Initialisierung der 'Klasse' lässt den MCP2515 Controller mit dem SPI kommunizieren.
Mit "state=..." gibt man an, ob sich das CAN-Interface im Empfänger Zustand(Rx) befinden soll, oder im Sender Zustand(Tx)

void loop() {
 
  byte length,rx_status,i;
  unsigned short frame_id;
  byte frame_data[8];

Diese hier sind weitere Variablen, die den Inhalt der Nachricht festlegen.

Mit dem Teil des Codes von Zeile 47 bis Zeile 74 verschicken wir eine bestimmte Nachricht an eine bestimmte Adresse. Als Beispiel verwende ich den Satz "Hi Markus",der die Länge 8(Buchstaben) hat und an die Adresse 0x05A5 geschickt wird.
Der Befehl zum senden der Daten ist :
CAN.load_ff_0(length,frame_id,frame_data);
CAN.send_0();.
Der Inhalt von 'CAN.load_ff_0' sind die Daten und die Adresse.
Das ganze passiert im Falle, dass das CAN Interface im TX Zustand sein soll.

Der Teil des Codes von Zeile 75 bis Zeile 134 gilt, falls das CAN-Interface im RX-Zustand ist.
Um sicher zu sein, dass keine andere Daten auf dem Interface sind, löschen wir erstmal alles, was im Puffer gespeichert ist.

Mit " rx_status = CAN.readStatus();" wird geprüft ob etwas gesendet wurde. Falls dies der Fall ist , wird er ausgegeben, so wie es am Ende des Codes beschrieben ist.

 

 

Anhänge:
Diese Datei herunterladen (CAN-Arduino.zip)CAN-Arduino.zip[ ]%2012-%10-%10 %1:%Okt%+02:00
Diese Datei herunterladen (EinfacherTest_zweier_Interfaces.ino)EinfacherTest_zweier_Interfaces.ino[ ]%2012-%10-%10 %1:%Okt%+02:00