Zwei Arduinos miteinander verbinden

Derzeit arbeite ich mal wieder ein wenig an calc.pw, da der vorhandene Code für ein Arduino allein inzwischen zu umfangreich wird. Daher sehe ich mir derzeit an, wie ich den Programmcode auf zwei Arduinos verteilen kann. Es bestünde natürlich die Möglichkeit, auf ein anderes Mikrocontroller-Board zu wechseln (ich sehe mir derzeit von Texas Instruments den MSP430 Mikrocontroller an), das ist jedoch mit höheren Aufwänden verbunden. Zudem verwendet selbst der/die/das Arduino Uno R3 mehrere Mikrocontroller (einen ATmega 328 für die Sketchausführung und einen ATmega 16u2 für die USB-Kommunikation).

Das erste Problem, das einem begegnet, ist das richtige Anschließen des zweiten Arduinos und die Kommunikation zwischen den beiden Arduinos. Beides lässt sich mit vier Verbindungen lösen:

  • der +5V-Pin von Arduino A wird mit dem +5V-Pin von Arduino B verbunden
  • ein GND-Pin von Arduino A wird mit einem GND-Pin von Arduino B verbunden
  • der RX-Pin (Pin 0) von Arduino A wird mit dem TX-Pin (Pin 1) von Arduino B verbunden
  • der TX-Pin (Pin 1) von Arduino A wird mit dem RX-Pin (Pin 0) von Arduino B verbunden

Anschließend kann man unter Verwendung der Serial-Schnittstelle (beim Arduino ist es die Serial1-Schnittstelle) Daten zwischen den beiden Arduinos hin und herschicken. Das funktioniert soweit auch ganz gut, hat aber ein kleines Problem: Es mangelt an einer ordentlichen Synchronisation zwischen den beiden Arduinos.

Normalerweise übernimmt das erste Arduino die Führung, während das zweite Arduino die Befehle des ersten Arduinos ausführt. Hier muss jedoch dafür gesorgt werden, dass beide Arduinos wissen, dass der andere für die Kommunikation bereit ist. Erhalten jedoch beide gleichzeitig Strom, beginnt bei ihnen die Ausführung der Setup-Routine. Je nach Umfang kann sie jedoch bei dem einen früher fertig werden als bei der anderen. Vielleicht benötigt die eine auch Nutzereingaben, sodass nicht einfach nach einer kurzen Verzögerung die Arbeitsbereitschaft vorausgesetzt werden kann.

Zwei Arduinos miteinander verbinden

Zwei Arduinos miteinander verbinden

Die Lösung, die mir hierfür in den Sinn kam, ist, dass das erste Arduino, das die Führung übernimmt, einfach selbst bestimmt, wann das zweite mit der Setup-Routine beginnen darf. Man könnte hier zum einen einen Transistor verwenden, der zwischen den +5V-Anschlüssen oder den GND-Anschlüssen der Arduinos geschaltet wird. Dieser könnte dann mit einem Datenpin des ersten, führenden Arduinos geschaltet werden.

Hierfür würde man jedoch einen Transistor verbrauchen. Meine genutzte Alternative ist es, einfach den RESET-Anschluss des zweiten Arduinos durch das erste, führende Arduino zu bedienen. Das sieht nun insgesamt wie folgt aus:

  • Arduino A setzt den Pin, der mit dem RESET-PIn von Arduino B verbunden ist, auf LOW
  • Arduino A führt sein Setup durch und startet dabei auch die serielle Kommunikation
  • Arduino A setzt den Pin, der mit dem RESET-Pin von Arduino B verbunden ist, auf HIGH
  • Arduino A wartet auf die Fertig-Meldung von Arduino B
  • Arduino B führt sein Setup durch und startet dabei auch die serielle Kommunikation
  • Arduino B sendet die Fertig-Meldung an Arduino A
  • Arduino A kann Befehle an Arduino B senden

Arduino A weiß, dass Arduino B bereit ist, indem es eine entsprechende Meldung zugesandt bekommt. Arduino B wiederum weiß indirekt, dass Arduino A bereit ist, da es nur dann läuft, wenn Arduino A das möchte.

Man sollte übrigens die Verbindungen zwischen den Datenpins (RX, TX) und RESET am besten mit einem Widerstand (1kΩ bis 10kΩ sollten problemlos funktionieren) absichern. In ersten, einfachen Tests hat es jedoch auch komplett ohne funktioniert.

Doppelte Grüße, Kenny

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.