saleae-lego-mindstorms-i2c

Analyse des I2C Buses mit einem Logikanalysator mit Lego Mindstorms

Dieser Beitrag wurde unter Tutorials abgelegt am von .

Verwendung des 100 MHz, 16-Kanal, USB Logik Analysators zur Überwachung des I2C Buses des Lego NXT Bausteins

Dieses Tutorial zeigt wie Sie den 100 MHz, 16-Kanal, USB Logik Analysator verwenden. Wir werden als nächstes die Verbindung zwischen dem Lego Mindstorms NXT Baustein und einem NXT Ultraschallsensor abhören. Der Ultraschallsensor wird ist standardmäßg im Lego Mindstorms NXT Robotikset geliefert.
Bezugnehmend auf die technischen Hintergründe, ist dieses Tutorial für jene mit Gedacht, welche ein wenig Erfahrung in Elektronik mit sich bringen.

Lassen Sie uns nun in die wunderbare Welt der elektronischen Kommunikation unter Verwendung von I2C eintauchen!

Was ist I2C?

Für all jene, die es nicht wissen sollte, kann etwas geschichtlicher Hintergrund nicht schaden. I2C ist ein Kommunikationsbus und wurde bereits im Jahr 1982 von Phillips entwickelt. Trotz seines Alters wird, wurde der I2C Kommunikationsstandard in letzter Zeit immer beliebter bei Programmierern für Mikrokontroller. Daher ist es nicht verwunderlich, dass der Lego NXT Baustein I2C verwendet. Jedewede Kommunikation zwischen dem intelligenten Lego Mindstorms NXT Baustein und Sensoren wird über das I2C Protokoll übertragen. Die Kommunikation mit Motoren basiert auf PWM und nicht I2C. Ein gutes Verständnis über I2C ist daher essential für Robotikingenieure, welche Ihre eigenen Sensoren oder eigene Schaltungen mit dem Lego Mindstorm NXT Roboter verbinden wollen.

I2C ist ein halb-duplex, bi-direktionales, synchroner, serieller Datenbus. Es ermöglicht einfache und effiziente Kommunikation zwischen einem Mikrokontroller und Aktuatoren und Sensoren. Ohne zusehr ins Detail zu gehen, aber um sicherzustellen, dass Sie in der Lage sind Ihre eigenen Sensoren zu bauen, werden wir uns nun die Grundzüge der I2C Kommunikation, des NXT Bausteins und desssen Aktuatoren, ansehen.

Wie funktioniert das I2C Protokoll im Master-Slave Modus?

Eine I2C Kommunikation funktioniert nach dem Master-Slave Prinzip. In einer Übertragung zwischen dem NXT Baustein und dessen Sensoren, ist natürlich der NXT Baustein der Master und alle Sensoren sind Slaves (Auch wenn diese technisch in der Lage sind Master zu sein). Daher muss der Aufbau jeder Kommunikation immer über eine Anfrage (Request) über den NXT Baustein erfolgen.

Das unten gezeigte Diagramm zeigt das Master-Slave Verhalten des Bausteins und dessen Sensor.

I2C Kommunication I2C zwischen dem Lego Mindstorms NXT Baustein und dem Lego Mindstorms Ultraschallsensor=

Wie oben angeführte Diagramm zeigt sind vier Verbindugen für die Kommunikation zwischen sensor und NXT Baustein notwendig (das von Ihnen verwendete NXT Kabel hat genau 4 Litzen):

  • GND (Masse) ist das Referenzpotential
  • VCC ist die Versorgungsspannung des Sensors
  • SCL ist die Ader für die Uhrzeit, um die Transaktion zwischen beiden Einheiten zu Synchronisieren.
  • SDA ist die Ader, welche für die Datenübertragung zwischen zwei Einheiten genutzt wird.

Die beiden Letzgennanten Adern sind die einzig interessante für uns, daher werden wir diese nun abhören.

Wie funktioniert das I2C Protokoll? Das Grundelement wird Übertragung genannt. Diese beginnt mit einem START bit und endet mit einem STOP bit. Zwischen diesen beiden Bits findet die eigentlich Übertragung statt. Im Master-Slave Modus startet immer der Master die Übetragung. Die erste Aktion des Master ist es, die I2C Adresse des Sensors den Bus zu schreiben. Stecken Sie nun den NXT Ultraschallsensor direkt am Port 1 an (zum Beispiel), dann gibt es nur einen Sensor und Sie riskieren keinen Konflikt. Sollten Sie allerdings einen Sensor Multiplexer verwenden, können Sie bereits mehr als einen Sensor am gleichen Port verwenden. Daher wird die I2C Adresse benötigt.

Das unten gezeigte Bild zeigt nur den Aufbau einer Verbindung. Dafür wurde die Software Verwendet welche mit dem 100 MHz, 16-channel, USB Logikanalysator von Saleae mitgeliefert wird. Die obere Kanal zeigt das SCL (clock) Signal, während der untere Kanal die Spannung des SDA (Daten) Signals anzeigt.

visualiesierung einer I2C kommunikations mit dem logikanalysator von salao

Wie das obige Bild zeigt, beginnt eine Übertragung mit dem START bit, ausgedrückt durch eine fallende Flank im Datensignal, während das SCL auf “high” steht. Danach folgen 8 Datenbits.Die ersten 6 Bits des SDA Signals sind 0 (low). Das 7. Bit steht auf 1 und das 8. auf 0. Dies alles bedeutet, dass 0x02 geschrieben wurde, in diesem Fall die I2C Adresse des NXT Ultraschallsensors. Wie zuvor erwähnt, ist die erste Aktion des Master die I2C Adresse den Sensor zu schreiben, welcher mit diesem Kommunizieren will. Das 8. Bit steht auf 0 und kennzeichnet, dass es sich um eine schreibende Nachricht gehandelt hat.

Das 9. Bit dient zur Bestätigung (ACK – acknowledgement) und ist 0. Dies dient auch als Bestätigung des Sensors mit der Adresse 0x02 und besagt “Sensor vorhanden und bereit für weitere Anfragen”.

Das Bild zeigt auch eines der vorteile von Saleae’s Logikanalysator, welches auch die volle Interpretation der Daten ausschreibt, so wie wir das gerade getan haben, indem wir die Potentialdifferenz als Signal interpretiert haben. Wir erhalten die Nachricht “Setup Write to [‘2’] + ACK”, was exakt der Übertragung entspricht, welche wir gerade beschrieben haben.

Nun das wir mehr über I2C wissen und auch schon einen Blick auf den Logikanalysator von Saleae geworfen haben, schauen wir uns doch mal an was wir wirklich brauchen, um eine echte Schaltung zu bauen, die dieses Signal erzeugt.

Verwendung des Logikanalysators von Saleae zur Überwachung der I2C Kommunikation

Das folgende Diagramm zeigt den Aufbau, wie mit dem Saleae Logikanalysator eine I2C Kommunikation zwischen dem Lego Mindstorms NXT Baustein und einem Lego NXT Ultraschallsensor abgehört werden kann.

Verbindung des Logikanalyser mit Lego NXT

Ist die Schaltung aufgebaut, wird noch die Software für den Logikanalysator benötigt, welche heruntergeladen und installiert werden muss. Die Software können Sie hier herunterladen http://www.saleae.com/downloads

Nach der Installation der Software, stecken Sie den Saleae Logikanalysator mit dem USB Kabel an Ihren PC an und starten die Software. Das LED des Logikanalysators sollte nun zu blinken beginnen. Die Benutzeroberfläche sollte nurn folgendermaßen aussehen:

Softwareinterface von saleae

Nun müssen wir den Logikanalysator konfigurieren, um eine I2C Verbindung richtig abzuhören.

Zuerst, sehen wir uns den analysierten Spannungsbereich an. Dazu gehen Sie in “Options/Logic16 input voltages” und wählen “3.6V bis 5V”.

Zur Verbesserung der Lesbarkeit gehen in “Options/Display” und wählen “Ascii”.

Ist das auch erledigt, müssen Sie der Software nur noch mitteilen, dass das zu überwachende Signal I2C verwendet. Für diese Einstellung klicken Sie neben Analyzers auf das “+” und wählen I2C.

i2c protokoll und logicanalyser von saleae

Daraufhin öffnet sich ein neues Fenster:

umgebennung der kanäle in der software

Achten Sie darauf SDA und SCL den korrekten Kanälen zuzuordnen. Dies hängt nun davon ab wo Sie diese beiden Leitungen am Logikanalysator angeschlossen haben. Mit einem Klick auf “Ok” können Sie nun noch personalisierte Namen für beide Kanäle vergeben.

Nun muss die Abtastrate gewählt werden. Wie das Bild schon zeigt wählen wir 100M Samples bei 16 MHz, was einer Analysezeit von 6.25 Sekunden entspricht. Für I2C Kommunikation sind mindestens 2 MHz empfohlen, jedoch nicht unbedingt notwendig. Allerdings muss man bedenken, dass wir mit einer schnelleren Abtastrate ein geringeres Risiko haben irgendwelche Daten zu verpassen.

wahl der abstastfrequenz

Nun ist alles bereit, um unseren Analysator zu testen. Nun sind wir bereit Daten zu erfassen, aber was wollen wir genau lernen? Wie bringen wir den Sensor dazu uns seine Versionsnummer zu schicken? Der folgende NXC Code führt genau diese Aufgabe aus. Zur Erinnerung, NXC ist eine auf C basierende Sprache für Lego Mindstorms NXT. Die verwendete Sprache ist hier allerdings recht ungebedeutend, da der Analysator keinen Analyse des Programmes macht, welches die Kommunikation aufbaut. Der Analysator hört Nachrichten am I2C Bus ab und analysiert diese. Daher können Programme an diesem Punkt in jeder Programmiersprache geschrieben werden. In folgender Abbildung finden Sie einen Beispielcode. Ich denke der Code sollte trotz französischer Kommentare klar und verständlich sein.

NXC code, uim die version des ultraschallsensors anzuzeigen

Nun klicken Sie auf “Start” in der Saleae Software und starten das Programm auf Ihrem NXT Baustein. Ein neues Fenster erscheint in der Mitte Ihrer Software, welche besagt, dass die I2C Übertragung gerade analysiert wird.

Ist die Analyse abgeschlossen, scrollen Sie mit Ihrer Maus ganz raus. Dadurch sollten Sie einen unterschiedlichen Bereich auf Ihrem Bildschirm sehen.

herausgezoomtes bild des software des logianalyzers

Positionieren Sie nun Ihren Mauszeiger auf dem sichtbaren Ausschlag (siehe rot markierte Fläche im vorherigen Bild) und zoomen hinein. Daraufhin sollten Sie eine Ansicht ähnlich dem folgenden Bild erhalten:

analysierter I2C frame

Was Sie hier sehen ist die I2C Kommunikation zwischen dem NXT Baustein und dem Ultraschallsensor. Hier können wir überprüfen, welche Daten tatsächlich gesendet wurden. Tatsächlich sehen wir, dass inBuff[0]=0x02 ist, welcher die Schreibeadresse des Ultraschallsensors ist. Als nächstes wird inBuff[1] übertragen, um zum Register 0 überzugehen, welcher die Sensorversion beinhaltet. Dieser Frame ist das Ergebnis der Funktion “I2CBytes”. Diese sendet eine START Signal (grüner Kreis), gefolgt von “inBuff” und einem STOP Signal (roter Kreis).

Sobald die erste Übetragung abgeschlossen ist, beginnt die nächste Übertragung, welche über ein “Neustart” Signal gekennzeichnet wird (zweiter grüner Kreis), gefolgt von der Leseadresse (0x03) des Ultraschallsensors. Daraufhin wartet der Sensor im Gegenzug auf eine bestimmte Anzahl von Daten, welche der Größe der Variable entspricht (4 in diesem Fall). Klar zu sehen ist, dass sobald die letzten Daten empfangen wurden der NXT Baustein keine ACK sendet, sondern ein NAK. Dies bedeutet, dass der Baustein nicht länger irgendetwas vom Slave erwartet. Die Übertragung wird über ein STOP Signal beendet (eine steigende Kante, während der Taktgeber (SCL) auf 1 ist.

Zusammenfassung

Mit diesem relativ deutlichen Beispiel können wir klar den Nutzen dieses Logikanalysators erkennen. Auch wenn manche sich noch nicht ganz über diese wundervolle Technologie im klaren sind, wird dieses Gerät helfen, sehr viele Programme zu Debuggen, da schnell und einfach Übertragungen zwischen einen oder mehreren Kontrollern und Sensoren oder Motoren analysiert werden können. Solch ein Gerät ist heutzutage unerlässlich, um die Grundzüge von elekronischer Kommunikation zu lernen. Weitere Pluspunkte erhält dieses Gerät durch seine einfache Bedienung und die vielen Zusatzleistungen. Durch die Kenntnis der meisten elektronischen Standards wie I2C, SPI, 1-Wire und vielen anderen, erhalten Sie eine klare, lesbare, speicherbare und einfach interpretation der gemessenen Zeitlinie.