Forum: Mikrocontroller und Digitale Elektronik Wireless CAN mit Arduino Nano und HC-05


von Julian H. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen!
Zunächst mal hoffe ich, das richtige Forum für meine Frage erwischt zu 
haben.

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:
https://github.com/coryjfowler/MCP_CAN_lib

Auf beiden Arduinos läuft folgender Code:
1
#include <SoftwareSerial.h>
2
#include <mcp_can.h>
3
#include <SPI.h>
4
5
SoftwareSerial BTSerial(4,5);
6
7
long unsigned int rxIdCAN;
8
long unsigned int rxIdBT;
9
unsigned char lenCAN = 0;
10
unsigned char lenBT = 0;
11
unsigned char rxBuf[8];
12
char msgString[128];                        // Array to store serial string
13
byte data[8];
14
int counter;
15
16
#define CAN0_INT 2                              // Set INT to pin 2
17
MCP_CAN CAN0(10);                               // Set CS to pin 10
18
19
20
void setup()
21
{
22
  Serial.begin(9600);
23
  BTSerial.begin(38400);
24
  
25
  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
26
  CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK;
27
  
28
  CAN0.setMode(MCP_NORMAL);                     // Set operation mode to normal so the MCP2515 sends acks to received data.
29
  pinMode(CAN0_INT, INPUT);                     // Configuring pin for /INT input
30
  counter = 0;
31
 }
32
33
void loop()
34
{
35
  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer, and send via BT
36
  {
37
    CAN0.readMsgBuf(&rxIdCAN, &lenCAN, rxBuf);      // Read data: len = data length, buf = data byte(s)
38
  
39
     BTSerial.write(lenCAN);
40
     BTSerial.write(rxIdCAN);
41
     for(byte i = 0; i<lenCAN; i++){
42
       BTSerial.write(rxBuf[i]);
43
     }
44
45
  }
46
47
  else if(BTSerial.available()) {               // Receive BT Signal and send to MCP2515
48
    if(counter == 0) {
49
      lenBT = BTSerial.read();
50
      counter++;
51
    }
52
53
    else if(counter == 1) {
54
      rxIdBT = BTSerial.read();
55
      counter++;
56
    }
57
58
    else if(counter > 1 && counter < 9) {
59
      data[counter-2] = BTSerial.read();
60
      counter++;
61
    }
62
63
    else if(counter == 9) {
64
      data[7] = BTSerial.read();
65
      byte sndStat = CAN0.sendMsgBuf(rxIdBT, lenBT, data);
66
      counter = 0;
67
    }
68
69
    else {
70
      counter = 0;
71
    }
72
  }
73
}

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

von Stefan F. (Gast)


Lesenswert?

Klingt für mich nach Pufferüberlauf, aufgrund zu geringer 
Übertragungsrate auf der Bluetooth Strecke (bzw. zu hoher Latenzen).

Bedenke auch, dass die SoftwareSerial viel CPU Zeit in Anspruch nimmt 
und nicht gerne unterbrochen werden möchte. 38400 Baud ist damit nur 
sehr bedingt machbar.

von Rudolph R. (rudolph)


Lesenswert?

Also bei dem Stichworten Wireless und CAN wäre ich eher auf einen ESP32 
gekommen, der kann vorgeblich beides, wenn auch CAN nicht so richtig 
offiziell.

von Julian H. (Gast)


Lesenswert?

Hallo Rudolph,
Der ESP32 war auch meine erste Idee, jedoch hat ein anders Team selbiges 
Projekt und verwenden bereits den ESP32 weshalb wir uns etwas anderes 
überlegen mussten. Sollten wir die Baudrate der Softwareserial besser 
auf 9600 setzen?

von Stefan F. (Gast)


Lesenswert?

Ja mach das

von Bülent C. (mirki)


Lesenswert?

Julian H. schrieb:
> Sollten wir die Baudrate der Softwareserial besser
> auf 9600 setzen?

Stefanus F. schrieb:
> Ja mach das

Das ist doch murks für die angepeilte Lösung.. Da muss ein ganz anderer 
Ansatz her.

Julian H. schrieb:
> 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.

Gerade in den Schwerpunkt Semestern solltest Du Dich erstmal mit der 
Aufgabe befassen und diese in einzelne Teile aufteilen. Es fängt 
schonmal damit an, was CAN Wireless bedeutet, sollen da alle Aspekte 
einer CAN Kommunikation implementiert werden, oder einfach nur die CAN 
Messages hin und her gefunkt werden? Wie hoch soll die min. und die max. 
CAn baudrate sein? Welche CAN Spezifikation, wie soll die 
Fehlerbehandlung sein etc...
Was sind die max versträglichen Latenzzeiten der Funkübertragunen??
Das ist nur ein Bruchteil der Fragen die Du Dir selbst stellen solltest 
bevor Du an irgendwelche Auswahl an Hardware machst.

Wenn Du jetzt hier auf vorgekaute Sachen ala Arduino etc zurückgreifst 
wirst Du auch nie den Anspruch haben, tief in die Materia zu gehen. Das 
ist aber etwas was man m.E. in einem Elektrotechnik Studium unbedingt 
machen sollte.

Was die hardware angeht...denk da mal auch über einen STM32F04 und einem 
NRF24 nach. Die Latzenzeiten beim NRF24 sind wirklich sehr sehr kurz und 
optimaler als Bluetooth.

von Julian H. (Gast)


Lesenswert?

Hallo Bülent,

zunächst einmal Danke für deine Antwort.

Zum Thema Funktionalität:
Uns wurde von unserem Betreuer nichts weiter gesagt, als das CAN 
Messages übertragen werden sollen. Während des Projektes, dann nur die 
Erweiterung, dass es möglich sein muss in beide Richtungen fehlerfrei 
alle 10ms eine Nachricht zu übertragen. Weitere Infos haben wir leider 
rein garnicht bekommen.

Dein Rat, dass man in den Schwerpunktsemestern tiefer in die Materie 
einsteigen sollte ist natürlich absolut korrekt. Man sollte jedoch den 
zeitlichen Aspekt nicht vergessen. Sich so tief in all das einzuarbeiten 
benötigt den Zeitanspruch eines ganzes Semesters für sich. Wir haben 
allerdings noch weitere Praktika allein im selben Schwerpunkt, sowie 
einen weiteren Schwerpunkt mit Vorlesungen und Praktika. Gerne würden 
wir noch viel mehr Zeit in unser Digitaltechnik Projekt investieren, da 
wir dieses mit Abstand am interessantesten finden. Doch dann bräuchte 
unser Tag wohl eher 48 Stunden statt 24.

Hinzu kommt, dass für dieses Projekt nur wenige Wochen zur Verfügung 
stehen und jetzt nochmal auf eine andere Hardware umzuschwenken wäre 
schlicht nicht möglich.

Danke trotzdem für deine Antwort.

von Stefan F. (Gast)


Lesenswert?

Dann plane schonmal Zeit ein, zu erklären, warum das Ziel nur 
eingeschränkt erreicht wurde und was du   zur Verbesserung anders machen 
würdest. Ich vermute, dass solche Analysen auch zur Aufgabe gehören.

von Julian H. (Gast)


Lesenswert?

Es ist immer wieder schön zu sehen, wie einem in Foren weitergeholfen 
wird. Auch die Tatsache, dass niemand Moralapostel spielen will finde 
ich immer wieder befriedigend...

Mensch, man traut sich ja kaum noch etwas zu fragen.

von Stefan F. (Gast)


Lesenswert?

Überlege mal, wie du (in der Rolle des Helfers) so eine Antwort 
aufnehmen würdest. Wie würdest du das finden? Würdest du ihm 
bereitwillig nochmal helfen?

Mein Hinweis war durchaus ernst gemeint. Du hast nicht mehr genug Zeit, 
dein Problem vollständig zu beheben. Das ist meine Einschätzung, daher 
der obige Ratschlag.

Alternativ kannst du gerne deine Zeit bis zur letzten Minute damit 
vergeuden, das Unmögliche möglich zu machen. Dann läufst du allerdings 
Gefahr, weder ein funktionierendes Gerät noch eine ordentliche Doku 
abzugeben.

Nutze die Zeit lieber, wenigstens die Doku abzurunden.

von Bernd K. (prof7bit)


Lesenswert?

Wie kann ein Teilnehmer im entfernten Bussegment einen Error-Frame 
erzeugen der im lokalen Bussegment ebenfalls gesehen wird?

von Bülent C. (mirki)


Lesenswert?

Echt traurig was so in den Unis rumläuft und sich später Ingenieur 
schimpft.

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.