Hallo Zusammen!
Ich bin zur Zeit noch Student der Elektrotechnik und befinde mich mittlerweile in den Schwerpunkt-Semestern. Für ein Projekt im Modul “Digitaltechnik Praktikum” wurde uns die Aufgabe übertragen eine Möglichkeit zu entwickeln ein CAN-Bus Signal kabellos zu übertragen. Wie wir dieses Projekt umsetzen wurde allein uns überlassen.
Nach einigen Recherchen und aufgrund bisheriger gesammelter Erfahrung im Bereich Arduino und Bluetooth, haben wir uns entschlossen die Umsetzung des Projektes mittels folgender Bauteile zu versuchen:
2x Arduino Nano 328P, 2x HC-05, 2x MCP2515_CAN Board
Bilder der verwendeten HC-05 Module und der MCP2515_CAN Boards findet ihr im Anhang.
Außerdem habe ich einen Prinzipschaltplan für das MCP2515 Board angehängt.
Rx und Tx des HC-05 Moduls wurden über SoftwareSerial auf die Pins 4+5 gelegt.
Um das CAN Board anzusprechen und auszulesen haben wir folgende Git Bibliothek verwendet:
Auf beiden Arduinos läuft folgender Code:
#include <SoftwareSerial.h>
#include <mcp_can.h>
#include <SPI.h>
SoftwareSerial BTSerial(4,5);
long unsigned int rxIdCAN;
long unsigned int rxIdBT;
unsigned char lenCAN = 0;
unsigned char lenBT = 0;
unsigned char rxBuf[8];
char msgString[128]; // Array to store serial string
byte data[8];
int counter;
#define CAN0_INT 2 // Set INT to pin 2
MCP_CAN CAN0(10); // Set CS to pin 10
void setup()
{
Serial.begin(9600);
BTSerial.begin(38400);
// Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK;
CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.
pinMode(CAN0_INT, INPUT); // Configuring pin for /INT input
counter = 0;
}
void loop()
{
if(!digitalRead(CAN0_INT)) // If CAN0_INT pin is low, read receive buffer, and send via BT
{
CAN0.readMsgBuf(&rxIdCAN, &lenCAN, rxBuf); // Read data: len = data length, buf = data byte(s)
BTSerial.write(lenCAN);
BTSerial.write(rxIdCAN);
for(byte i = 0; i<lenCAN; i++){
BTSerial.write(rxBuf[i]);
}
}
else if(BTSerial.available()) { // Receive BT Signal and send to MCP2515
if(counter == 0) {
lenBT = BTSerial.read();
counter++;
}
else if(counter == 1) {
rxIdBT = BTSerial.read();
counter++;
}
else if(counter > 1 && counter < 9) {
data[counter-2] = BTSerial.read();
counter++;
}
else if(counter == 9) {
data[7] = BTSerial.read();
byte sndStat = CAN0.sendMsgBuf(rxIdBT, lenBT, data);
counter = 0;
}
else {
counter = 0;
}
}
}
Wir haben nun von unserem Betreuer 2 Geräte Namens TinyCAN bekommen, die wir über USB an 2 PC´s anschließen und mittels der mitgelieferten Software ein CAN Signal ausgeben und empfangen können.
CAN High+Low werden jeweils mit dem MCP2515 verbunden.
Die beiden HC-05 sind bereits miteinander verbunden.
Senden wir nun von der einen Seite eine Nachricht, wird sie auf der anderen Seite von der Software empfangen, alles scheint zu funktionieren. Im nächsten Schritt wollte unser Betreuer, dass wir im 10ms Intervall Nachrichten übertragen. Auch dies funktioniert. Wenn wir aber beginnen von beiden Seiten aus im 10ms Intervall Nachrichten zu verschicken, entstehen irgendwann Fehler. Außerdem melden die TinyCAN-Geräte eine Störung.
Mir ist bewusst, dass der Code für das empfangen der Nachricht via BT nicht besonders schlau gelöst ist und die gesamte Nachricht als ein Paket übertragen werden sollte, jedoch hatten wir hierzu bisher keine Idee. Weder wie die Nachricht auf der Sender-Seite verschickt werden sollte, noch wie wir sie auf der Empfängerseite wieder auseinander nehmen können.
Wir sind mit der gesamten Thematik zur Zeit etwas überfragt. Hilfestellung von unserem Betreuer bekommen wir wenig bis gar nicht. Wir sind also über alle Ideen und Anregungen dankbar.
Viele Grüße
Julian