So testen Sie ein Atmega (Arduino) i2c-Netzwerk

Zunächst einmal Entschuldigung für mein schlechtes Englisch und für diese "theoretische" Frage, wie man die Dinge am besten macht. Ich komme gerade von der Uni und mir hat noch nie jemand gesagt, wie man Probleme praktisch lösen kann.

Ich versuche, ein Netzwerk von 4 Atmega (ich verwende die Arduino-Plattform), 1 Master und 3 Slaves zu entwickeln. sie kommunizieren über i2c.

Ich suche nach einer intelligenten Möglichkeit, es zu testen. Im Moment passiert mein Debugging über das serielle Protokoll: Ich habe einige

Serial.println(...);

und ich lese sie, indem ich die Arduinos über USB anschließe und serielle eingehende Nachrichten mit dem seriellen Monitor in Arduino IDE lese.

Was ich jetzt mache ist:

  1. Codieren von Slaves mit einem Testprogramm (eines für jeden Slave) im Master (mit einer normalen Stromversorgung versorgt).
  2. Wenn ich "sicher" bin, dass der Slave in Ordnung ist, den USB des Slaves abziehen, den Master einstecken, den Master codieren.
  3. Tun Sie dies für jeden Sklaven.
  4. Beten.

Dieser Arbeitsablauf hat viele Probleme; es ist eine blinde Kommunikation. Wenn ich am Master arbeite, weiß ich nicht wirklich, was auf den Slaves passiert und umgekehrt. Wenn dann ein Arduino-Absturz den Master zum Absturz bringt (weil das I2C-Protokoll nicht vorsieht, dass ein Slave nicht antwortet oder abgeschaltet wird) und ich alle Slaves zurücksetzen muss (das mache ich durch Abschalten die Stromversorgung aller Slaves).

Ein weiteres Problem: Einige Slaves benötigen Echtzeitbetrieb mit Schrittmotoren, und wenn ein Motor läuft und einige Interrupts der I2C-Protokollbibliothek Wire.hauftreten (und dies passiert jedes Mal, wenn der Master eine Nachricht vom Slave benötigt, denke ich), es kann bei laufendem Motor eventuell passieren und dazu führen, dass die Bewegung der Motoren (die möglichst linear sein muss) "trabt". Um dies zu vermeiden, habe ich nur eine Einwegkommunikation: Die Slaves erhalten nur Befehle. Ich weiß nicht, ob das die beste Lösung ist, aber scheint zu funktionieren.

Die blinde Einwegkommunikation, das wiederholte Ein- und Ausstecken von USB, das Ein- und Ausstecken des Netzteils und das Drücken der Reset-Tasten machen mich dumm. Bisher habe ich Softwareentwicklung mit IDE (Eclipse) durchgeführt, die Debugging bereitstellt. Wenn ich einige Threads zu synchronisieren habe, kann ich Ausdrucke oder was auch immer haben, die das Leben einfacher machen, und mit Software führe ich Komponententests durch, die mir ein gutes Werkzeug zum Isolieren des Fehlers geben. Wenn jetzt mit dem Arduinos-Netz etwas schief geht, habe ich keine Ahnung, wie ich das Problem finden soll. Dies ist mein erstes Hardware-Netzwerk und es ist frustrierend.

Ich brauche einen Rat, um einen intelligenten Workflow zu finden, eine gute Möglichkeit zu haben, mein System zu testen und mich als Programmierer zu fühlen.

Warum ausstecken und neu einstecken? Warum nicht einfach alle angeschlossen lassen und Debug-Daten von allen vier Geräten lesen?
Haben Sie dieses Netzwerk erstellt oder testen Sie es nur? Der einzige Grund, warum ich frage, ist, dass Atmega-Geräte mit der Konfiguration, von der Sie sprechen, über SPI verbunden werden können. Sie müssen einen Pin verwenden, um jeden Slave zu aktivieren / Slave auszuwählen, wenn Sie mit ihm sprechen möchten. Die Slaves können über MISO zurücksprechen.

Antworten (2)

Sie können den Bus mit BusPirate sondieren und überwachen . Auf diese Weise können Sie sehen, was im Bus passiert, und Ihnen helfen, die Probleme zu beheben.

Hier ist ein Video , das den i2c-Bus-Scan demonstriert.
Es kann auch als I2C-Analysator verwendet werden, wie in diesem Video gezeigt wird .

Stecken Sie alle Arduino-Boards in einen USB-Hub?

Es ist in Ordnung, wenn die Slaves nur empfangen, aber dann haben Sie keine Garantie, dass Befehle erfolgreich empfangen wurden. Eine Art ACK ist wahrscheinlich besser.

Wenn er I2C verwendet, stellt das Protokoll selbst sicher, dass die Nachricht empfangen wurde.