Suche Hilfe beim Can Bus

Hallo zusammen,

ich habe mehrere Arduinos an verschiendenen Positionen und möchte diese miteinander verbinden.

Da die Strecken nicht unbedingt so nah beieinander liegen und 20 USB Ports doch etwas viel sind, würde ich diese gerne per Can Bus verbinden.

Leider finde ich keine gute oder zumindest für mich verständliche Erklärung oder Leitfaden/Beispiele. Kennt sich jemand damit aus bzw kann mir das erklären, oder dabei helfen, das Problem zu lösen.

[u]Setup:[/u]

20x Arduino Micro sollen mit einem Due komunizieren.

[u]Beispiel:[/u]

6x Taster inkl je eine RGB LED für Rückmeldung, sowie 4 RGB LED für Dekobeleuchtung Taster 1 bis 6 geben die Buchstaben A,B,C,D,E und F aus. Je nachdem, wie der Zustand ist, wechselt die LED von rot auf grün oder umgekehrt.

Die erste Taste gibt somit zb nach Betätigung von Taster T1 ein (A) aus und die LED wechselt von Rot auf grün. Tastet man erneut, wird wieder ein (A) ausgegeben und die LED wechselt auf rot zurück. (Schaltung ist korrekt auf einem Board aufgebaut, entprellt und funktioniert)

[u]Die Signalkette bei einem Tastendruck wäre dann beispielsweise:[/u]

Taster T1 wird gedrückt vom Arduino Micro (AM1) wird ein Signal zur LED gesendet, dass diese von der aktuellen, zur wechselnden Farbe wechseln soll gleichzeitig vom Micro (AM1) soll ein Signal über Can Bus zum Due (AD1) gesendet werden vom Due (AD1) geht dann das Signal über das USB Kabel zum PC auf dem PC wird dann ein A (Keyboardsimulation) ausgegeben

[u]Die Signalkette bei einem Farbwechsel der Deko RGB LEDs wäre dann beispielsweise:[/u]

von einer Software wird ein Wert X ausgegeben dieser wird per USB zum Due (AD1) gesendet vom Due (AD1) soll ein Signal über Can Bus zu den Micro´s (AM1 bis AM20) gesendet werden die Micro´s (AM1 bis AM20) geben dann den Wert an die RGB LEDS aus, welche dann ihre Farbe ändern

[u]Ziel:[/u]

Das gesamte System soll, wie oben beschrieben, die Signale und Abfragen von (Micro und Due) über Can Bus ausgeben, beziehungsweise Senden und Empfangen.

Lg

Dee

PS: was an Informationen benötigt wird, werde ich dann nach liefern.

Informationen im Internet findet man nur durch wenn man konkrete Ideen sucht oder Probleme lösen muss. Die paar Tutorials mit zwei Shields und zwei Arduinos - die kannst mit den mitgelieferten Beispielen auch lösen.

Mein Weg war zunächst mal 4 Shields + 4 Arduinos auf ein Brett zu nageln und dann eine Kommunikation herzustellen. Ein Arduino mit Taster, einer mit einem LCD, einer mit einem RGB STreifen und einem als "Zentrale".

Meine Haupteinheit ist zwischenzeitlich ein ESP32, die Arduinos gibts weiterhin zum als Sensor- und Ausgabeeinheiten. Das Hin- und Herübertragen lernst am besten mit Learning by doing. Bei Detailfragen kann man dir hier sicher auch helfen.

Danke für die Antwort.

Leider ist mein erstes Problem schon, dass ich mich damit garnicht aus kenne und mir die Tuts bisher nicht weiter helfen konnten (ich verstehe es nicht). Was ein Bus ist, verstehe ich, aber bin es gewohnt in zB. KNX mit grafischen Oberflächen Sensoren und Aktoren usw zu vernetzen, aber im Arduino-Bereich ist es für mich ein buch mit 7 Siegeln.

Deswegen wende ich mich an dieser Stelle ja hier an euch.

mc-big-d: Danke für die Antwort.

Leider ist mein erstes Problem schon, dass ich mich damit garnicht aus kenne und mir die Tuts bisher nicht weiter helfen konnten (ich verstehe es nicht). Was ein Bus ist, verstehe ich, aber bin es gewohnt in zB. KNX mit grafischen Oberflächen Sensoren und Aktoren usw zu vernetzen, aber im Arduino-Bereich ist es für mich ein buch mit 7 Siegeln.

Deswegen wende ich mich an dieser Stelle ja hier an euch.

Dann frage ich dich, was erwartest du von uns ? Sollen wir dir das Programm schreiben ?

Wenn dir die Grundlagen noch fehlen, solltest du die erst mal lernen, bevor man an ein Projekt rangeht, welches man nicht übersehen kann.

HotSystems: Dann frage ich dich, was erwartest du von uns ? Sollen wir dir das Programm schreiben ?

Dann antworte ich dir, wenn möglich anhand von Beispielen erklären, sodass es dann auch ein Anfänger versteht.

Und das ihr mir das komplette Programm schreibt wäre natürlich mega cool, aber um es dann zu verstehen und darauf auf zu bauen, wäre mir wie gesagt schon erstmal geholfen, wenn ich es an einem Beispiel Schritt für Schritt für mich verständlich erklärt bekommen würde.

mc-big-d:
Leider finde ich keine gute oder zumindest für mich verständliche Erklärung oder Leitfaden/Beispiele. Kennt sich jemand damit aus bzw kann mir das erklären, oder dabei helfen, das Problem zu lösen.

Irgendwie kommt mir das Projekt (6 Taster sollen Buchstaben a bis f ausgeben und WS2812B 1 bis 6 den Status) bekannt vor. Du hast noch nicht aufgegeben, das ist gut.

Im Thema UNO - Mega - Teensy mittels CAN-Bus verbinden habe ich mich mit den Tücken beschäftigt und bin zu einem für mich zufriedenstellendem Ergebnis gelangt. Möglicherweise erhellt es Deinen Geist.

Leider habe ich weder einen Micro noch einen Due.

Das Stimmt wohl. Ich habe nicht aufgegeben und bin sehr weit gekommen. Leider musste ich das Projekt wegen eines Trauerfalls pausieren und kann erst jetzt weiter machen.

Ich schaue mir den Link mal an. Vielleicht leuchtet dann das Birnchen oder es kommt zum Kurzschluss XP

Das Leben ist bunt und hält viele Überraschungen bereit.

Bei Fragen fragen :)

… Kurzschluss incoming …

Also ich hab mir das mal durch gelesen, aber ich komme damit einfach nicht zu recht.

Kann mir jemand (anhand des nachfolgenden Beispiels) mal erklären, wo ich was wie machen muss.
Dieser Code soll als Standalone (wenn es anders besser wäre dann verändert ansonsten so), also per USB direkt am PC angeschlossen, verwendet werden.

Wie müsste der Code bei dem Due (Master) und dem Micro (Slave) dann aussehen.

Zum Verständnis:

6x Taster und 10x RGB LEDs

Taster 1 gibt nach dem Betätigung ein “A” aus und wechselt die Farbe von LED 1 von “ist” (bspw Grün) zu “zuwechselnde” (bspw Rot)
Taster 2 gibt nach dem Betätigung ein “B” aus und wechselt die Farbe von LED 2 von “ist” (bspw Grün) zu “zuwechselnde” (bspw Rot)
Taster 3 gibt nach dem Betätigung ein “C” aus und wechselt die Farbe von LED 3 von “ist” (bspw Grün) zu “zuwechselnde” (bspw Rot)
Taster 4 gibt nach dem Betätigung ein “D” aus und wechselt die Farbe von LED 4 von “ist” (bspw Grün) zu “zuwechselnde” (bspw Rot)
Taster 5 gibt nach dem Betätigung ein “E” aus und wechselt die Farbe von LED 5 von “ist” (bspw Grün) zu “zuwechselnde” (bspw Rot)
Taster 6 gibt nach dem Betätigung ein “F” aus und wechselt die Farbe von LED 6 von “ist” (bspw Grün) zu “zuwechselnde” (bspw Rot)

Nach nochmaligem betätigen wird der Buchstabe erneut ausgegeben und die Farbe der LED wechselt wieder von “ist” zu “zuwechselnde”

RGB LED 7 bis 10 bekommen von einer Software die Wert xyz und sollen erst bei Veränderung ein erneutes Signal bekommen.

Code

#include <Keyboard.h>
#include <FastLED.h>
#define LED_PIN     9
#define NUM_LEDS    10
#define BUTTON_KEY1 97
#define BUTTON_KEY2 98
#define BUTTON_KEY3 99
#define BUTTON_KEY4 100
#define BUTTON_KEY5 101
#define BUTTON_KEY6 102
CRGB leds[NUM_LEDS];

const int buttonPin1 = 2;
const int buttonPin2 = 4;
const int buttonPin3 = 5;
const int buttonPin4 = 6;
const int buttonPin5 = 7;
const int buttonPin6 = 8;

int merker1 = 0;
int merker2 = 0;
int merker3 = 0;
int merker4 = 0;
int merker5 = 0;
int merker6 = 0;

int buttonState1;
int buttonState2;
int buttonState3;
int buttonState4;
int buttonState5;
int buttonState6;

int lastButtonState1 = LOW;
int lastButtonState2 = LOW;
int lastButtonState3 = LOW;
int lastButtonState4 = LOW;
int lastButtonState5 = LOW;
int lastButtonState6 = LOW;

unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
unsigned long lastDebounceTime3 = 0;
unsigned long lastDebounceTime4 = 0;
unsigned long lastDebounceTime5 = 0;
unsigned long lastDebounceTime6 = 0;

unsigned long debounceDelay = 50;

void setup() {

  Serial.begin(9600);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin5, INPUT);
  pinMode(buttonPin6, INPUT);

  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
  Keyboard.begin();
}

void loop() {

  //*********************Taster 1******************************

  int reading1 = digitalRead(buttonPin1);
  if (reading1 != lastButtonState1) {
    lastDebounceTime1 = millis();
  }
  if ((millis() - lastDebounceTime1) > debounceDelay) {
    if (reading1 != buttonState1) {
      buttonState1 = reading1;
      int reading = digitalRead(buttonPin1);
      if ((buttonState1 == HIGH) && (merker1 == 2)) {
        lastDebounceTime1 = millis();
        leds[0] = 0x00FF00;
        FastLED.show();
        Keyboard.press(BUTTON_KEY1);
        Keyboard.releaseAll();
        merker1 = 1;
      }
      else if ((buttonState1 == HIGH) && (merker1 == 1))
      {
        leds[0] = 0xFF0000;
        FastLED.show();
        Keyboard.press(BUTTON_KEY1);
        Keyboard.releaseAll();
        merker1 = 0;
      }
    }
  }
  else if ((buttonState1 == LOW) && (merker1 == 0))
  {
    leds[0] = 0xFF0000;
    FastLED.show();
    merker1 = 2;
  }
  lastButtonState1 = reading1;

    //*********************Taster 2******************************

    int reading2 = digitalRead(buttonPin2);
    if (reading2 != lastButtonState2) {
      lastDebounceTime2 = millis();
    }
    if ((millis() - lastDebounceTime2) > debounceDelay) {
      if (reading2 != buttonState2) {
        buttonState2 = reading2;
        int reading2 = digitalRead(buttonPin2);
        if ((buttonState2 == HIGH) && (merker2 == 2)) {
          lastDebounceTime2 = millis();
          leds[1] = 0x00FF00;
          FastLED.show();
          Keyboard.press(BUTTON_KEY2);
          Keyboard.releaseAll();
          merker2 = 1;
        }
        else if ((buttonState2 == HIGH) && (merker2 == 1))
        {
          leds[1] = 0xFF0000;
          FastLED.show();
          Keyboard.press(BUTTON_KEY2);
          Keyboard.releaseAll();
          merker2 = 0;
        }
      }
    }
    else if ((buttonState2 == LOW) && (merker2 == 0))
    {
      leds[1] = 0xFF0000;
      FastLED.show();
      merker2 = 2;
    }
    lastButtonState2 = reading2;

    //*********************Taster 3******************************

    int reading3 = digitalRead(buttonPin3);
    if (reading3 != lastButtonState3) {
      lastDebounceTime3 = millis();
    }
    if ((millis() - lastDebounceTime3) > debounceDelay) {
      if (reading3 != buttonState3) {
        buttonState3 = reading3;
        int reading3 = digitalRead(buttonPin3);
        if ((buttonState3 == HIGH) && (merker3 == 2)) {
          lastDebounceTime3 = millis();
          leds[2] = 0x00FF00;
          FastLED.show();
          Keyboard.press(BUTTON_KEY3);
          Keyboard.releaseAll();
          merker3 = 1;
        }
        else if ((buttonState3 == HIGH) && (merker3 == 1))
        {
          leds[2] = 0xFF0000;
          FastLED.show();
          Keyboard.press(BUTTON_KEY3);
          Keyboard.releaseAll();
          merker3 = 0;
        }
      }
    }
    else if ((buttonState3 == LOW) && (merker3 == 0))
    {
      leds[2] = 0xFF0000;
      FastLED.show();
      merker3 = 2;
    }
    lastButtonState3 = reading3;

    //*********************Taster 4******************************

    int reading4 = digitalRead(buttonPin4);
    if (reading4 != lastButtonState4) {
      lastDebounceTime4 = millis();
    }
    if ((millis() - lastDebounceTime4) > debounceDelay) {
      if (reading4 != buttonState4) {
        buttonState4 = reading4;
        int reading4 = digitalRead(buttonPin4);
        if ((buttonState4 == HIGH) && (merker4 == 2)) {
          lastDebounceTime4 = millis();
          leds[3] = 0x00FF00;
          FastLED.show();
          Keyboard.press(BUTTON_KEY4);
          Keyboard.releaseAll();
          merker4 = 1;
        }
        else if ((buttonState4 == HIGH) && (merker4 == 1))
        {
          leds[3] = 0xFF0000;
          FastLED.show();
          Keyboard.press(BUTTON_KEY4);
          Keyboard.releaseAll();
          merker4 = 0;
        }
      }
    }
    else if ((buttonState4 == LOW) && (merker4 == 0))
    {
      leds[3] = 0xFF0000;
      FastLED.show();
      merker4 = 2;
    }
    lastButtonState4 = reading4;

    //*********************Taster 5******************************

    int reading5 = digitalRead(buttonPin5);
    if (reading5 != lastButtonState5) {
      lastDebounceTime5 = millis();
    }
    if ((millis() - lastDebounceTime5) > debounceDelay) {
      if (reading5 != buttonState5) {
        buttonState5 = reading5;
        int reading5 = digitalRead(buttonPin5);
        if ((buttonState5 == HIGH) && (merker5 == 2)) {
          lastDebounceTime5 = millis();
          leds[4] = 0x00FF00;
          FastLED.show();
          Keyboard.press(BUTTON_KEY5);
          Keyboard.releaseAll();
          merker5 = 1;
        }
        else if ((buttonState5 == HIGH) && (merker5 == 1))
        {
          leds[4] = 0xFF0000;
          FastLED.show();
          Keyboard.press(BUTTON_KEY5);
          Keyboard.releaseAll();
          merker5 = 0;
        }
      }
    }
    else if ((buttonState5 == LOW) && (merker5 == 0))
    {
      leds[4] = 0xFF0000;
      FastLED.show();
      merker5 = 2;
    }
    lastButtonState5 = reading5;

    //*********************Taster 6******************************

    int reading6 = digitalRead(buttonPin6);
    if (reading6 != lastButtonState6) {
      lastDebounceTime6 = millis();
    }
    if ((millis() - lastDebounceTime6) > debounceDelay) {
      if (reading6 != buttonState6) {
        buttonState6 = reading6;
        int reading6 = digitalRead(buttonPin6);
        if ((buttonState6 == HIGH) && (merker6 == 2)) {
          lastDebounceTime6 = millis();
          leds[5] = 0x00FF00;
          FastLED.show();
          Keyboard.press(BUTTON_KEY6);
          Keyboard.releaseAll();
          merker6 = 1;
        }
        else if ((buttonState6 == HIGH) && (merker6 == 1))
        {
          leds[5] = 0xFF0000;
          FastLED.show();
          Keyboard.press(BUTTON_KEY6);
          Keyboard.releaseAll();
          merker6 = 0;
        }
      }
    }
    else if ((buttonState6 == LOW) && (merker6 == 0))
    {
      leds[5] = 0xFF0000;
      FastLED.show();
      merker6 = 2;
    }
    lastButtonState6 = reading6;

  leds[6] = 0x0000FF;
  FastLED.show();
  leds[7] = 0x0000FF;
  FastLED.show();
  leds[8] = 0x0000FF;
  FastLED.show();
  leds[9] = 0x0000FF;
  FastLED.show();
}

ich habe dir im Post #54 ein Beispiel gemacht, wie man einen Tastendruck von einem Modul zum anderen Übertragen kann. https://forum.arduino.cc/index.php?topic=572590.54

Hast du das jemals ausprobiert? Funktioniert das bei dir? Hast du den Aufbau verstanden? Womit gibt es noch fragen?

Danke dir erstmal für die Mühe.

Ich hab das schon mehrfach gelesen und versucht zu verstehen bzw umzusetzen, aber komme da nicht wirklich mit zurecht.

Gebaut habe ich es, wegen der Pause, noch nicht. Da ich die Can Bus Module erst die Tage bestellt habe, werde ich sie auch erst in ein paar Tagen bekommen.

Aber dennoch bleibt mir nichts anderes übrig, als jemand zu finden, der mir (mit wohl ein wenig viel mehr Zeit) das Schritt für Schritt erklärt.

Aber, wie gesagt, auf jeden Fall nochmal vielen Dank für deine Muhe und Hilfe.

!!!auch in den anderen Threads!!!

Hi

Taster 1 gibt nach dem Betätigung ein "A" aus und wechselt die Farbe von LED 1 von "ist" (bspw Grün) zu "zuwechselnde" (bspw Rot)

Du redest wirr. Meine Taster geben Nichts aus, egal, wie oft oder fest ich drauf rum drücke. Auch wechseln meine LEDs nicht von ist nach zuwechseln, sondern von der bestehenden Farbe (Welche Das nun auch immer ist), zu Der, Die gerade jetzt übergeben wurde.

Wenn Du möchtest, daß ein Tastendruck eine Reaktion hervor ruft, gerne auch Verschiedene - je nach Status, dann suche nach State-Maschine oder Nachtwächter, Greggros (?? den Nick merke ich mir nie ...), Combie und bestimmt auch noch einige Weitere, haben dazu schon so Manches geschrieben.

MfG

mc-big-d: Da ich die Can Bus Module erst die Tage bestellt habe, werde ich sie auch erst in ein paar Tagen bekommen.

Welche?

Das sind die MCP2515 CAN-Bus-Modul, welche mir ja damals von noiasca empfohlen wurden.

Achso was ich noch vergessen hatte...

Ich möchte noch eine if/else Abfrage einbauen, wenn das Sinn macht, bzw funktioniert.

Beispiel:

Wenn das Modul über den Bus betrieben werden soll, wird der USB Port abgeschiebert und es öffnet sich der BUS Port. Dabei wird ein Schalter betätigt, der dann die if/else Abfrage steuern soll.

Sprich wenn beispielsweise Digital X high ist, wird der Skatch für den BUS-Betrieb genutzt. In allen anderen Fällen, wird der USB Betrieb genutzt.

Funktioniert das so, in verbingung mit dem USB Skatch und BUS Skatch, in einem Skatch zusammen gefasst, oder habe ich da einen denkfehler drinnen, bzw macht mir da der BUS oder die länge des Skatches einen Strich durch die Rechnung.

Oder gibt es da auch eine sinnvollere Lösung?

mc-big-d: ... Schritt für Schritt ...

mc-big-d: Das sind die MCP2515 CAN-Bus-Modul, welche mir ja damals von noiasca empfohlen wurden.

  1. Schritt: Suche Dir eine Bibliothek für MCP2515 CAN-Bus-Modul, die auf Deiner Hardware Due und Micro läuft.

Also, wenn ich das richtig verstanden habe, ist das die richtige Bibliothek, die für Due und Micro in Frage kommt:

https://github.com/autowp/arduino-mcp2515

---mcp2515.h---

Testen kann ich das aber erst final, wenn ich die Bauteile da habe.

Die richtige Bibliothek für Due: https://github.com/collin80/due_can

Verschiedene Möglichkeiten für Transceivers: https://copperhilltech.com/dual-can-bus-interface-for-arduino-due/ https://www.amazon.com/SN65HVD230-CAN-Board-Communication-Development/dp/B00KM6XMXO http://store.evtv.me/proddetail.php?prod=arduinoduecanbus

@ard_newbie Danke dir für die Info.

Habe das andere auch nur aus diversen Beiträge in Google erfahren und wusste nicht, ob diese auch richtig sind.

Kennst du dich gut mit Can Bus aus, oder kannst ein gutes TuT empfehlen, was es unmissverständlich nach einem guten Leidfaden erklärt?