Autor |
Nachricht |
lengi
CAN Hacker seit: 15.04.2018 Beiträge: 7 Karma: +0 / -0
Kostenloser Account, kein CAN Entwicklungs-Support
|
15-04-2018, 12:24 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Guten Tag zusammen,
ich bin derzeit dabei mich etwas in das Thema CAN Bus einzuarbeiten. Eher aus Zufall, da die Komponenten, die ich Untersuche eben genau mit CAN BUS arbeiten.
Ich komme eigentlich aus dem Modellbaubereich und möchte dort ein System aus zwei Komponenten "manipulieren" (eigentlich ein hässliches Wort, trifft es aber ziemlich gut). Ich hoffe, dass mir hier dennoch jemand helfen kann, da es eher ein generelles CAN Bus "Problem" ist.
Mein Aufbau besteht derzeit aus einem Arduino Nano und einem MCP2515. Da es sich nicht um ein KFZ handelt, ist die Menge an IDs und Daten doch eher begrenzt und noch einigermaßen übersichtlich im Serial Monitor der Arduino IDE (max. 15 IDs).
Die zwei Komponenten, die ich mir ansehe, haben sowohl Sensoren, Aktoren und Bedienelemente (Knöpfe)
Ich möchte in dieses System eine Sicherheitsfunktion einbauen, dass wenn ich einen Eingang am Arduino auf HIGH setze, die vorhandenen Tasten keine Funktion mehr haben.
Die dazugehörige ID für die Taster konnte ich bereits identifizieren und es ist ebenfalls erkennbar, wie sich die Daten beim Drücken der Tasten verändern.
Im Ruhezustand haben Byte 0 und 1 dieser ID den Wert 0. Wird eine entsprechende TAste gedrückt, so ändern sich die Werte dieser ID bei Taster 1 bspw. folgendermaßen:
Taster 1:
Byte 0 = 1
Byte 1 = 1
Taster 2
Byte 0 = 4
Byte 1 = 1
Taster 3
Byte 0 = 16
Byte 1 = 1
usw.
Lassen sich die Signale irgendwie "blockieren"?
Was ich bereits versucht habe:
1. Daten im Arduino einlesen, ID auswerten, wenn ID erkannt -> Werte 0 setzen (Ruhezustand)
Ergebnis: System reagiert immer noch, allerdings etwas anders.
2. Arduino in Dauerschleife beide Bytes auf 0 setzen. Mit Delay in der Loop reagiert das System wie bei 1., nehme ich den Delay raus, stürzt das System ab und Startet neu (dauerhaft)
Die Leiter einfach zu unterbrechen ist leider auch keine Möglichkeit, da ich andere Daten dieser Komponente weiterhin benötige, wenn die Taster deaktiviert sein sollen.
Hat hier jemand eine Idee, wie man dies lösen kann?
Gruß
Jan |
|
Nach oben |
|
|
postmann CAN-Profi
CAN Hacker seit: 23.05.2013 Beiträge: 137 Karma: +58 / -0
CAN Support
|
15-04-2018, 15:40 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Du benötigst ein Gateway. Das Signal zu ändern und wieder auf dem Bus zu senden wir zu Fehlern beim Sender führen. Du musst den CAN auftrennen und deine Gateway dazwischen setzen . Dadurch wird das Signal vom Gateway auf der einen Seite eingelesen und auf der anderen Seite kannst du dann das manipulierte Signal weitersenden. |
|
Nach oben |
|
|
lengi
CAN Hacker seit: 15.04.2018 Beiträge: 7 Karma: +0 / -0
Kostenloser Account, kein CAN Entwicklungs-Support
|
15-04-2018, 20:24 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Die Idee hatte ich auch schon die Adern aufzutrennen und das ganze entsprechend zu "tunneln" und ggf. zu blockieren, nur fehlte mir das Stichwort dazu.
Wie sich sowas umsetzen lässt, weißt du nicht zufällig oder?
Mir schwebt da gerade ein zweiter MCP2515, so dass ich quasi zwei mal CANL und CANH anschließen kann, aber dazu stecke ich noch zu wenig in der Materie.
Dann heißt es jetzt erstmal wieder weiter lesen, aber danke für das Stichwort!
Gruß |
|
Nach oben |
|
|
Zampan0 CAN-Profi
CAN Hacker seit: 28.06.2016 Beiträge: 30 Karma: +20 / -0
CAN Support
lengi gefällt das. |
16-04-2018, 11:35 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
du musst auf jedem Fall ein Gateway aufbauen
Ein Beispiel mit 2 x MCP2515 findest du hier
https://github.com/coryjfowler/MCP_CAN_lib/blob/master/examples/Dual_CAN/Dual_CAN.ino
da du relativ wenig Daten hast, wird das auch ohne Probleme funktionieren.
Du filterst einfach die entsprechende ID bei gedrückter Taste heraus und modifizierst die Daten und schickst diese weiter
Alle anderen Daten werden 1:1 weitergeleitet |
|
Nach oben |
|
|
lengi
CAN Hacker seit: 15.04.2018 Beiträge: 7 Karma: +0 / -0
Kostenloser Account, kein CAN Entwicklungs-Support
|
16-04-2018, 12:21 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Ich Google gerade seit gestern schon wie ein wilder, habe auch viel dazu gefunden, dass zwei MCP2515 an einem Mikrocontroller eingesetzt wurden.
Hier im Forum wurde ich dazu auch noch fündig (für die Interessierten hier: https://www.canhack.de/viewtopic.php?t=2295)
Ich will das ganze heute Abend mal software-seitig testen, eine zweiten MCP habe ich zufälligerweise noch liegen, da muss ich nur den Schwingquarz anpassen.
Hoffentlich ist die Geschwindigkeit hoch genug, aber ich denke das sollte kein Problem sein, weil die Datenmenge, wie du schon sagst, sehr überschaubar ist. Ich meine der Atmega326p läuft bei 20Mhz, wenn ich das richtig im Kopf habe. Ansonsten steige ich auf etwas schnelleres um, wäre auch kein Drama.
Gehe ich richtig in der Annahme, dass ich dann bei beiden MCP den Abschlusswiderstand aktivieren muss? Scheint mir hier zumindest logisch, weil ich die Leitungen ja auftrenne. |
|
Nach oben |
|
|
Zampan0 CAN-Profi
CAN Hacker seit: 28.06.2016 Beiträge: 30 Karma: +20 / -0
CAN Support
|
16-04-2018, 12:33 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Ich verwende für meine Sensorik auch den 328p und den MCP2515, beide mit 16MHz getaktet.
Jedes CAN Segment benötigt jeweils zwei Abschlusswiderstände |
|
Nach oben |
|
|
lengi
CAN Hacker seit: 15.04.2018 Beiträge: 7 Karma: +0 / -0
Kostenloser Account, kein CAN Entwicklungs-Support
|
17-04-2018, 13:26 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Okay, meine MCPs haben zwar einen 8Mhz Quarz, aber ich probiere das trotzdem mal. 16Mhz Quarze habe ich schon bestellt, falls ein Wechsel notwendig wird.
Ich habe leider schon beim Kompilieren des Dual-Can Sketches Probleme, weswegen ich meinen Code einfach umschreibe. Da weiß ich, dass das funktioniert. Ist ja prinzipiell kein Hexenwerk.
Danke dir! |
|
Nach oben |
|
|
Zampan0 CAN-Profi
CAN Hacker seit: 28.06.2016 Beiträge: 30 Karma: +20 / -0
CAN Support
|
17-04-2018, 13:37 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
du musst das Beispiel erst Richtigstellen (Fehler Deklaration)
byte tx0Buf[] = {0xAA,55,0xAA,55,0xAA,55,0xAA,55};
byte tx1Buf[] = {55,0xAA,55,0xAA,55,0xAA,55,0xAA};
und hier kannst du deine 8MHz einstellen
if(CAN0.begin(MCP_EXT, CAN_250KBPS, MCP_16MHZ) == CAN_OK) |
|
Nach oben |
|
|
lengi
CAN Hacker seit: 15.04.2018 Beiträge: 7 Karma: +0 / -0
Kostenloser Account, kein CAN Entwicklungs-Support
|
17-04-2018, 14:06 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Ich habe mir auch schon gedacht, dass ich das 0x hinzufügen muss, weil es ja in HEX ist. Muss das dann nicht auch vor die 55? Sind in DEC dann ja 85. Sehe hier jetzt keinen Grund, warum das gemischt sein sollte.
Ich konnte allerdings nicht rausfinden, was diese Daten für einen Zweck haben. Muss man das zwingend drin haben, damit das funktioniert? Ich hätte das jetzt einfach auskommentiert, genau wie den Sendebefehl weiter unten. |
|
Nach oben |
|
|
CAN-Diagnose Administrator
CAN Hacker seit: 07.06.2011 Beiträge: 550 Karma: +27 / -0 Wohnort: Ländle
lengi gefällt das. |
17-04-2018, 14:57 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Zitat: |
Ich konnte allerdings nicht rausfinden, was diese Daten für einen Zweck haben. Muss man das zwingend drin haben, damit das funktioniert? Ich hätte das jetzt einfach auskommentiert, genau wie den Sendebefehl weiter unten. |
Die Sendepuffer werden mit den Werten initialisiert, d.h. vorbelegt.
Sofern die Sendepuffer vor dem Senden richtig befüllt werden, sind die Werte für die Initialisierung unwichtig.
Du könntest auch schreiben: byte tx1Buf[] = {0};
Der Sendepuffer würde dann mit Nullen initialisiert. Weglassen würde ich die Initialisierung aber nicht, denn erstens ist dies schlechter Programmierstil, zweitens wird im Fehlerfall das Verhalten Deines Programmes undefiniert und drittens erleichtert eine sinnvolle Vorbelegung die Fehlersuche.
Viele Grüsse, Rainer |
|
Nach oben |
|
|
lengi
CAN Hacker seit: 15.04.2018 Beiträge: 7 Karma: +0 / -0
Kostenloser Account, kein CAN Entwicklungs-Support
|
18-04-2018, 10:57 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Super, danke. Initialisieren macht auf jeden Fall Sinn, um undefinierte Zustände zu vermeiden. So etwas in der Art habe ich mir auch schon gedacht.
Meine Boards kommen mit dieser Library irgendwie nicht klar. Selbst, wenn ich auf 8MHZ ändern und die ganzen Fehler in dem Sketch anpasse, funktioniert nicht mal die Initialisierung der Shields, obowohl ich an der Verdrahtung des ersten Shields nichts geändert habe (bis auf den Abschlusswiderstand).
Funktioniert das Initialisieren erst, wenn das Ganze an das Bussystem der Komponenten gekoppelt ist oder muss das auch unabhängig davon funktionieren?
Das Problem hatte ich mit anderen Libraries auch schon, bis ich eine gefunden habe, mit der dies lief. Ich vermute mal das liegt an 8MHZ/16Mhz Geschichte.
Ich habe bereits versucht meine Version, mit der ich lesen und senden konnte, anzupassen. Aber so richtig wollte das auch nicht.
Ich ändere die Boards jetzt mal auf 16Mhz und probiere das ganze nochmal. Wenn es läuft, mache ich mir sowieso eine eigene Platine, wo alles zusammen drauf sitzt. Das mit diesen zugekauften, fertigen Shields ist auf Dauer Mist.
Gruß
Jan |
|
Nach oben |
|
|
Zampan0 CAN-Profi
CAN Hacker seit: 28.06.2016 Beiträge: 30 Karma: +20 / -0
CAN Support
|
18-04-2018, 11:26 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Mit Shilds habe ich keine Erfahrung, mache immer eigene Platinen.
Grundsätzlich sollte es so ohne Probleme funktionieren.
Wichtig ist, alle SPI Leitungen parallel und je einen CS (Chipselect) auf die entsprechenden Pins.
Hab so seit vielen Jahren ein CAN Interface mit SPI Display laufen.
Die Initialisierung ist nur für den MCP2515, dem ist egal ob am Tranceiver was dranhängt oder nicht.
Ich würde mal nur einen MCP dranhängen mit CS auf 10 dann sollte dieser den ersten Bus initialisieren und bei zweiten einen Fehler bringen, dann CS auf 9 genau umgekehrt.
Soweit ich verglichen habe, ist die Lib schon ganz ok
ww1.microchip.com/downloads/en/DeviceDoc/21801d.pdf |
|
Nach oben |
|
|
lengi
CAN Hacker seit: 15.04.2018 Beiträge: 7 Karma: +0 / -0
Kostenloser Account, kein CAN Entwicklungs-Support
|
18-04-2018, 20:24 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Die Shields habe ich genommen, damit ich das ohne viel Arbeit alles schön schnell aufs Steckbrett setzen kann, aber in letzter Zeit habe ich doch immer mal mit einem Wackelkontakt zu kämpfen...
Ich habe den Sketch jetzt gerade nochmal draufgeladen. 500KBPS, 8MHZ. Nur ein MCP angeschlossen und folgendes gibt er über den Serial monitor aus:
Code: |
Entering Configuration Mode Successful!
Setting Baudrate Successful!
`Setting ID Mode Failure...
CAN0: Init Fail!!!
Entering Configuration Mode Failure...
CAN1: Init Fail!!!
|
Finden tut er das ja anscheinend, bei dem zweiten Modul, was ich abgesteckt habe, wirft er ja direkt einen Fehler aus. |
|
Nach oben |
|
|
Zampan0 CAN-Profi
CAN Hacker seit: 28.06.2016 Beiträge: 30 Karma: +20 / -0
CAN Support
CAN-Diagnose gefällt das. |
19-04-2018, 20:20 Titel: Arduino + MCP2515 --> Signale "blockieren"? |
|
|
Habe das Beispiel gerade bei mir ausprobiert und noch einen Fehler gefunden
es muss die Zeile
if(CAN0.begin(MCP_EXT, CAN_250KBPS, MCP_16MHZ) == CAN_OK)
auf
if(CAN0.begin( MCP_STDEXT, CAN_250KBPS, MCP_16MHZ) == CAN_OK)
geändert werden, da ist noch ein Bug drin
danach funktioniert alles wie du es brauchst |
|
Nach oben |
|
|
|