2 Arduinos in Tinkercad verbinden ohne grossen Aufwand

Hallo zusammen,

Ich arbeite in Tinkercad an einem Schaltkreis, der zwei Arduinos benötigt, da ich mehrere Sachen gleichzeitig und vollständig unabhängig voneinander durchführe. Aus diesem Grund wollte ich mal fragen, wie man 2 Arduinos miteinander verbindet. Dabei soll die Menge an Code auf einem Minimum sein. Kann mir da jemand weiterhelfen?

Gruss aus der Schweiz,
SnowTrain712

... geht auch auf einem einzelnen Arduino.
Bei zweien hast du das Problem, dass beide neben der eigentlichen Aufgabe auch noch miteinander kommunizieren müssen.

Im übrigen gibt es u.A. Serial (zur Not SoftwareSerial) und I²C

Ohne genauere Informationen, was du machen willst, kann man (zumindest ich) dir aber nichts genaueres sagen.

Wenn du das nicht weißt, wird es wohl besser sein alles erstmal versuchen auf einem Arduino zum laufen zu bekommen. Und glaube mir wenn du delay in deinem code weglässt, reicht einer auch vollkommen aus um mehrere Sachen paralell abzuarbeiten.

Beschreibe mal mit einfachen Worten was durchgeführt werden soll/muss und das bitte ganz ganz einfach.

Ein Arduino ist eigentlich für allgemeine Steuer- und Regelungsaufgaben hurtig genug.

Der Arduino steuert einen Bahnübergang. Wenn die Schranke offen ist, blinkt eine weisse LED.

Sobald ich auf den unteren von 2 Drucktastern drücke, passiert folgendes:
Die weisse LED geht aus, es beginnt ein Wechselblinken von 2 roten LEDs.
Nach ca. 5 Sekunden wird die Schranke über einen Servomotor geschlossen.

Sobald ich dann auf den oberen Drucktaster drücke, wird die Schranke nach ca. 2 Sekunden hoch, das Wechselblinken geht aus und die weisse LED beginnt, wieder zu blinken.

Nun will ich aber den Öffnungsvorgang automatisieren. Dafür habe ich schon ein Programm geschrieben. Darin fungiert ein Ultraschall-Abstandssensor als Achszähler. Kommt nach 2 Sekunden keine Achse mehr, soll sich die Schranke automatisch öffnen.

Diese 2 Prozesse möchte ich miteinander verbinden.

Glaube mir dafür reicht ein Arduino aus. Schau dir mal in der Arduino IDE das " blink without delay" Beispiel an, denn nach dem Schema wird es funktionieren.

Da reicht ein Arduino gaaaanz locker.
Hört sich nach Modellbahn an.
Wenn du nicht-blockierendes Programmieren erst einmal verstanden hast dann kann der ein und derselbe Arduino parallel zur automtatiserten Schrankensteuerung auch noch

  • zur Viertelstunde die Kirchenglocken schlagen lassen
  • in der Schweisserwerkstatt mehrere blaue LED im Zufallsrythmus aufblitzen lassen
  • Am Kaufhaus die Leuchtreklame als Lauflicht ansteuern.
  • wenn es dunkel wird die Straßen- und Hausbeleuchtungen einschalten.

Du hast jetzt die Wahl zwischen bei zwei Arduinos Datenaustausch zu programmieren
was man letztendlich auch mit nicht-blockierendem Programmieren machen muss.

oder einen einzelnen Arduino nicht-blockierend zu programmieren.

Hier sind die passenden Tutorials dazu
Wenn du nicht so gut englisch kannst mit google-translate übersetzen lassen

vgs

Glaube mir dafür reicht ein viertel Arduino aus.
Oder anders gesagt mit einem Arduino kannst Du mehrere Bahnübergänge steuern.
Grüße Uwe

Und man spart sich die doppelte Programmierung sowie die Schnittstelle zwischen den Controllern. Beides bereitet immer wieder Probleme bei Einsteigern.

Hallo snowtrain712

Herzlichen Dank für deine umfangreiche Antwort.

Wie bereits hier mehrfach erwähnt langt ein Arduino, welcher auch immer, aus.

Zeige mal die Programme, damit wir sehen können wie wir dir helfen können. Der Arduino kann noch weitere Aufgaben 'quasi gleichzeitig' erledigen, wie z.B. Gleiswegsteuerung über ein Stellwerk, Beleuchtungseffekte.... usw.

Kannst du uns bitte etwas über deine Erfahrungen mit Elektronik, Programmierung, Arduino und Hardware erzählen?

Hast du bereits Erfahrungen bei der Programmierung in C++ gemacht?

Ich wünsche dir einen geschmeidigen Abend.

Guten Morgen,

Gleich mal vorneweg: Sorry, dass die Nachricht so unfassbar lang ist :sweat_smile:

Ich habe nicht gerade sehr viel Erfahrung, was Elektronik und Hardware angeht. Das ist auch mein erstes grösseres Projekt, das ich mit dem Arduino mache. Ich habe ca. 5 Jahre Erfahrung mit Lego Mindstorms (EV3, Home Edition) mit Codeblöcken, sowie etwas Erfahrung mit TigerJython und Grundkenntnisse in HTML. Die Programme habe ich in Tinkercad auch nur über Codeblöcke generiert.

Mir ist übrigens noch eingefallen, dass ich etwas nicht erwähnt habe:

Beim Bahnübergang gibt es noch zwei "Kontrollleuchten", eine rote sowie eine grüne LED. Diese Leuchten kennen jeweils 2 Zustände:

Grün leuchtend: Schranke offen
Rot blinkend: Schranke wird geschlossen
Rot leuchtend. Schranke geschlossen
Grün blinkend: Schranke wird geöffnet

Hier der Code zum Bahnübergang ohne Achszähler:


// C++ code
//
#include <Servo.h>

int Blinkzeit = 0;

int i = 0;

Servo servo_4;

int counter;

int counter2;

int counter3;

int counter4;

void setup()
{
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  servo_4.attach(4, 500, 2500);
  pinMode(2, INPUT);
  pinMode(3, INPUT);

  Blinkzeit = 500;
  digitalWrite(5, HIGH);
  digitalWrite(6, LOW);
  digitalWrite(11, LOW);
  digitalWrite(12, LOW);
  digitalWrite(13, LOW);
  servo_4.write(0);
  while (!(digitalRead(2) == HIGH)) {
    digitalWrite(13, HIGH);
    delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    digitalWrite(13, LOW);
    delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
  }
}

void loop()
{
  // Befehl: Schranke schliessen
  if (digitalRead(2) == HIGH) {
    // Blinken rot
    digitalWrite(5, LOW);
    digitalWrite(13, LOW);
    delay((Blinkzeit * 1.5)); // Wait for (Blinkzeit * 1.5) millisecond(s)
    for (counter = 0; counter < 5; ++counter) {
      digitalWrite(6, HIGH);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
      digitalWrite(6, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    }
    digitalWrite(6, HIGH);
    digitalWrite(11, HIGH);
    digitalWrite(12, LOW);
    // Schranke schliesst
    servo_4.write(90);
    digitalWrite(6, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, HIGH);
    for (counter2 = 0; counter2 < 3; ++counter2) {
      digitalWrite(6, HIGH);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
      digitalWrite(6, LOW);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    }
    digitalWrite(6, HIGH);
    digitalWrite(11, HIGH);
    digitalWrite(12, LOW);
    delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    digitalWrite(11, LOW);
    digitalWrite(12, HIGH);
    delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    while (!(digitalRead(3) == HIGH)) {
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    }
  }
  // Befehl: Schranke öffnen
  if (digitalRead(3) == HIGH) {
    digitalWrite(6, LOW);
    digitalWrite(11, HIGH);
    digitalWrite(12, LOW);
    delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    digitalWrite(5, HIGH);
    digitalWrite(11, LOW);
    digitalWrite(12, HIGH);
    delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    for (counter3 = 0; counter3 < 5; ++counter3) {
      digitalWrite(5, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
      digitalWrite(5, HIGH);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    }
    // Schranke schliesst
    digitalWrite(5, LOW);
    digitalWrite(11, HIGH);
    digitalWrite(12, LOW);
    delay((Blinkzeit / 2)); // Wait for (Blinkzeit / 2) millisecond(s)
    servo_4.write(0);
    delay((Blinkzeit / 2)); // Wait for (Blinkzeit / 2) millisecond(s)
    digitalWrite(5, HIGH);
    digitalWrite(11, LOW);
    digitalWrite(12, HIGH);
    delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    for (counter4 = 0; counter4 < 2; ++counter4) {
      digitalWrite(5, LOW);
      digitalWrite(11, HIGH);
      digitalWrite(12, LOW);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
      digitalWrite(5, HIGH);
      digitalWrite(11, LOW);
      digitalWrite(12, HIGH);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    }
    digitalWrite(5, LOW);
    digitalWrite(11, LOW);
    digitalWrite(12, LOW);
    delay((Blinkzeit * 1.5)); // Wait for (Blinkzeit * 1.5) millisecond(s)
    // Blinken weiss
    while (!(digitalRead(2) == HIGH)) {
      digitalWrite(5, HIGH);
      digitalWrite(13, HIGH);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
      digitalWrite(13, LOW);
      delay(Blinkzeit); // Wait for Blinkzeit millisecond(s)
    }
  }
}

Und hier der Code für den Achszähler:


```cpp
// C++ code
//
int zeit = 0;

int abstand = 0;

int autoopen = 0;

long readUltrasonicDistance(int triggerPin, int echoPin) {
  pinMode(triggerPin, OUTPUT);  // Clear the trigger
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  // Sets the trigger pin to HIGH state for 10 microseconds
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  // Reads the echo pin, and returns the sound wave travel time in microseconds
  return pulseIn(echoPin, HIGH);
}

void setup() {
  pinMode(6, OUTPUT);

  zeit = 0;
  abstand = 50;
  autoopen = 1500;
}

void loop() {
  while (!(0.01723 * readUltrasonicDistance(8, 8) < abstand)) {
  }
  digitalWrite(6, LOW);
  zeit = 0;
  while (!(0.01723 * readUltrasonicDistance(8, 8) > abstand)) {
  }
  while (!(0.01723 * readUltrasonicDistance(8, 8) < abstand || zeit >= autoopen)) {
    zeit += 50;
    delay(50);  // Wait for 50 millisecond(s)
  }
  if (zeit >= autoopen) {
    digitalWrite(6, HIGH);
    zeit = 0;
  }
}

Die Codes sollten so zusammengefügt werden, dass sich der Achszähler erst dann aktiviert, wenn die Schranke geschlossen ist. Der Befehl zum Öffnen der Schranke soll ausgeführt werden, wenn der dafür bestimmte Drucktaster betätigt wird oder wenn der Achszähler innerhalb von über 2 Sekunden nicht anschlägt.

Genau deshalb wurden Codetags erfunden:

Ich werde mich bemühen, mich daran zu halten...:sweat_smile:

Dann korrigiere bitte Dein Posting. Eine ordentliche Formatierung des Codes erhöht ebenfalls die Lesbarkeit. Strg+T in der IDE hilft Dir dabei.

Gruß Tommy

Dein Sketch enthällt massig delays und blockierende Schleifen.
Diese musst du zwingend entfernen, damit das überhaupt etwas wird.

Delay() solltest du durch Funktionen mit millis() (Beispiel BlinkWithoutDelay) ersetzen und auf while-Schleifen verzichten. Du hast duch eine Schleife, die loop() und das sollte reichen.

Wäre es auch okay, wenn ich einfach die Codes als .txt-Datei einfüge?

Warum das ?
So wie es im Link von Moko beschrieben ist, funktioniert es doch bestens und kann von allen prima gelesen werden.
Dafür ist die Funktion "Code-Tags" doch extra gemacht.

In der IDE ist die Möglichkeit unter Bearbeiten "Für Forum kopieren", anklicken und hier mit STRG + V (Gezeitigt drücken) einfügen, bei manchen Rechner CTRL + V

image

Habe jetzt den Text korrigiert, hoffe, das passt so...

Vielen Dank für die Tipps, die ihr mir alle gegeben habt! Ich werde mich erstmal mit dem nicht-blockierenden Programmieren auseinandersetzen.