18.12.2013 yahe arduino hardware legacy
Derzeit arbeite ich mal wieder ein wenig an calc.pw, da der vorhandene Code für ein Arduino allein inzwischen zu umfangreich wird. Deshalb 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, das ist jedoch mit höheren Aufwänden verbunden. Zudem verwendet selbst der 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:
Anschließend kann man unter Verwendung der Serial-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 Arduino A die Führung, während Arduino B die Befehle von Arduino A ausführt. Hier muss jedoch dafür gesorgt werden, dass beide Arduinos wissen, dass der jeweils 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.
Die Lösung, die mir hierfür in den Sinn kam, ist, dass Arduino A, das die Führung übernimmt, einfach selbst bestimmt, wann Arduino B mit der Setup-Routine beginnen darf. Hierfür lasse ich Arduino A einfach den RESET-Pin von Arduino B steuern. Das sieht nun insgesamt wie folgt aus:
Arduino A weiß, dass Arduino B bereit ist, indem es eine entsprechende Fertig-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, um Überspannungen zu verhindern. In ersten, einfachen Tests hat es jedoch auch komplett ohne funktioniert.