Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Benutzeravatar
Alphasucht
Schreibt viel
Schreibt viel
Beiträge: 111
Registriert: 21. Mär 2011 19:03
Wohnort: Berlin

Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon Alphasucht » 3. Jan 2017 22:05

Grüß Gott,

ich habe eine Frage zu dem Projekt: http://www.mindstormsforum.de/viewtopic.php?f=70&t=8388&hilit=respond+with+message von HaWe.
Ich habe versucht die ganze Sache nachzubauen. Leider bisher ohne Erfolg.
Den Code habe ich 1 zu 1 für NXT und Arduino kopiert. Die Verkabelung sollte soweit auch identisch sein, obwohl diese bei HaWe ja nicht 100%ig zu erkennen ist. Daher habe ich mich an diesem Beispiel orientiert: http://www.adamfourney.com/news/using-the-arduino-uno-as-a-lego-mindstorms-nxt-sensor-with-galvanic-isolation/

Ja, ich verwende auch einen I2C Isolator wie auf dieser Seite beschrieben wird. Allerdings überlege ich langsam, ob hier auch der Hase im Pfeffer liegt? Müsste HaWe's Code unverändert mit dem Isolator arbeiten?
Derzeit beept der NXT und zeigt "i2cresult=0, value=0".
Alle Kabel habe ich geprüft. Der Arduino-Code scheint auch zu laufen, zumindest reagiert die LED auf den Taster.
Oder handelt es sich eventuell um "alten" Code und es gibt mittlerweile eine andere Version, welche ich lieber verwenden sollte?

Vielleicht hat ja jemand eine Idee?

Ach so, noch der Grund weshalb ich das alles mache. Ich möchte ein paar zusätzlich Servos vom NXT über den Arduino ansprechen. Der Arduino soll wohl zeitgleich zwei voneinander getrennte i2c-Busse bedienen können. An den einen Bus soll der NXT, an den anderen ein i2c-fähiger Servo Controller und eventuell noch ein i2c-Display. Das vom NXT ist ja nicht so toll ablesbar. Ist ein solches Vorhaben überhaupt realistisch? Immerhin scheint der Bus zwischen NXT und Arduino ja ein wenig schmal zu sein.

Vielen Dank bis hierhin!
Gruß
Karl

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon HaWe » 3. Jan 2017 23:04

hallo,
ich habe das alte Projekt seit der Fertigstellung damals nicht mehr lange weiter verfolgt , aber ich habe auch nie einen "I2C Isolator" verwendet.
einfach SDA mit SDA, SCL mit SCL, GND mit GND verbinden und die 47k bis 83k pullups zu NXT-Vcc nicht vergessen.
Vcc NXT NICHT mit Vcc Arduino verbinden!


ps,
das hier ist der aktuellere Link:

viewtopic.php?f=70&t=8624#p67235


pps,
da der NXT immer Busmaster ist, wird es sicher möglich sein, mehrere Arduino Slaves mit verschiedenen i2c Device Adressen auf demselben Bus zu betreiben.
Sowohl Uno als auch Mega haben aber nur 1 I2C Bus. Nur der Due hat 2 (sehr wahrscheinlich, aber nicht 100% sicher, dass wirklich beide zusammen mit verschiedenen NXTs laufen, mit dem EV3 am Due gibt es aber mit Sicherheit eher noch weitaus größere Probleme als mit dem NXT).
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
Alphasucht
Schreibt viel
Schreibt viel
Beiträge: 111
Registriert: 21. Mär 2011 19:03
Wohnort: Berlin

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon Alphasucht » 28. Jan 2017 21:07

Vielen Dank für die Antwort HaWe!

Dennoch traue ich der direkten Verbindung nicht so wirklich. Überall wird davon abgeraten. Selbst wenn es vorerst funktionieren mag, soll es die Lebensdauer des überbeanspruchten Teilnehmers deutlich reduzieren. Ich möchte den NXT nicht unbedingt auf die Schlachtbank bringen.

Den Isolator habe ich noch mit einem Raspi, dem Arduino und verschiedenen i2C-Geräten getestet. Es wird bestenfalls Blödsinn übertragen.
Nun werde ich mal einen Level Shifter ausprobieren. Hier besteht zwar keine galvanische Trennung mehr, aber zumindest liegt jeweils die richtige Spannung an.

Mal sehen ob ich damit vorwärts komme.
Puh, wenn ich mir Deinen aktuellen Code so ansehe, dann stelle ich mir schon die Frage, ob ich diesen Pfad überhaupt weiter verfolgen soll? Wenn ich sehe wie viel Code notwendig ist damit, die beiden einfach "nur" mit einander reden, dann vergeht einem schon irgendwie die Lust. Na ja, die Lego FW ist offenbar nicht für die Kommunikation mit "fremden" i2c-Geräten gemacht worden.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon HaWe » 29. Jan 2017 09:24

Überall wird davon abgeraten

wo "überall"?
Im Gegenteil, sogar Dexter Industries und Mindsensors, die selber für Lego Mindstorms produzieren, empfehlen es so.
Auch die Enzwickler von 3rd Party Software haben es so empfohlen (Andy Shaw von leJOS, David Lechner von ev3dev).
Wichtig sind einzig und allein die korrekten SDA- und SCL Pullups, und zwar auf der Lego-Seite des Busses zu Lego-Vcc ( 4-5V bei NXT, 3,3V bei EV3 an pin 4 des Steckers). Für diese Zwecke hat Dexter selber einen RJ11-Breadboard-Adapter entwickelt, mit dem man per Dip-Switch die Pullups dazu schalten kann (für i2c) bzw. auch wieder abschalten kann für andere I/Os.
Durch die recht hohen Ohm-Werte (ca. 47k aufwärts) fließen auch nur sehr kleine Ströme ( 5V/50000 Ohm = 0,1 mA, üblich sind normalerweise I2C Pullups um 1-4k mit Strömen bis 1mA), die aber einzig für das Funktionieren Master-seitig bedeutend sind, und so werden sie ja auch für alle NXT- und EV3-Sensoren verwendet.
Ich sehe daher elektrisch keine "Gefahr" für die Lego-Bricks, und es funktionirt ja auch.
Wenn du allerdings Bedenken hast, respektiere ich das natrlich, aber dann kann ich dir mit "meinen" Schaltungen plus "deinen" Isolatoren natürlich nicht weiterhelfen, es klingt nach deinen Äußerungen aber ganz so, als ob die grundsätzlich große Probleme machen:
Den Isolator habe ich noch mit einem Raspi, dem Arduino und verschiedenen i2C-Geräten getestet. Es wird bestenfalls Blödsinn übertragen.


betr.:
Puh, wenn ich mir Deinen aktuellen Code so ansehe, dann stelle ich mir schon die Frage, ob ich diesen Pfad überhaupt weiter verfolgen soll? Wenn ich sehe wie viel Code notwendig ist damit, die beiden einfach "nur" mit einander reden, dann vergeht einem schon irgendwie die Lust. Na ja, die Lego FW ist offenbar nicht für die Kommunikation mit "fremden" i2c-Geräten gemacht worden.


Da kann ich nur John Hansen (dem Autor von NQC, NBC, NXC und BricxCC) zitieren, der mal in so einem Zusammenhang geschrieben hat:
welcome to the real world of electronics which is no longer "Not Quite" or "Not eXactly"
8-)
Was die i2c-Protokolle angeht, die sind einfach so, wie sie technisch per i2c eben definiert sind zum Lesen und Schreiben, das funktioniert grundsätzlich überall so, sowohl auf Arduinos und NXTs als auch auf Raspis und EV3s. Außerdem ist es natürlich viel einfacher, nur 1 Byte in 1 Richtung zu übertragen als einen ganzen Array von Daten halb-duplex in beide Richtungen, samt error-check (der extrem wichtig ist).
Die Probleme fangen erst da wirklich an, wo Lego aufhört, den internationalen Standards (z.B. für i2c) zu entsprechen und ihr eigenes Süppchen kochen (was beim EV3 noch weit gewaltiger ist beim NXT, bei dem ja "nur" ein AVR wie bei Arduinos den Dienst für die I/O-Kommunikation versieht). Abgesehen davon ist es für die Lego-seitigen Protokolle egal, ob ein Lego-i2c-Sensor, ein Mindsensors-i2c-Slave-Gerät, ein Standard-i2c-Slave-Gerät, oder ein Arduino als Slave dran hängt: der i2c-Master (also der Lego Brick) arbeitet immer nach identischen Mustern.

Aber wie auch immer: viel Glück mit deinen Experimenten!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
Alphasucht
Schreibt viel
Schreibt viel
Beiträge: 111
Registriert: 21. Mär 2011 19:03
Wohnort: Berlin

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon Alphasucht » 29. Jan 2017 10:39

Hier z.B.: http://www.mikrocontroller.net/articles/Pegelwandler
Aber auch sonst gibt es ja diverse Anleitungen um z.B. NXT und Arduino oder Arduino und Raspi per i2c miteinander zu verbinden. Nahezu jedes Tutorial schreibt sinngemäß folgendes: "Wir haben beide Geräte direkt miteinander und es hat funktioniert. Die Geräte können aber dabei beschädigt werden... wir übernehmen keine Haftung..." blablabla. Und es wird in diesem Zusammenhang oft von einer "quick and dirty"-Lösung gesprochen.

Na mal schauen.

Zu der Problematik mir dem i2c: vermutlich ist man von Ethernet & TCP verwöhnt. Da ist alles fertig und man setzt sich in ein gemachtes Nest. Somit hat man den Kopf frei, für die "wichtigen" Probleme.
Ich glaube Du baust doch einen autonomen Roboter mit dem NXT und dem Mega, oder? Da stelle ich mir gerade vor, wie Du das Teil jemandem vorführst, der sich ein wenig mit NXT und Arduinos beschäftigt hat. Du erzählst ihm von Wegfindung, Odometrie, Gyro, Kalman Filtern usw.
Er schüttelt nur ungläubig den Kopf und sagt: "Du hast das mit der i2c-Kommunikation hinbekommen!?" :lol:

In diesem Sinne, vielen Dank für Deine Hilfe! Ich berichte mal über meine Fortschritte.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon HaWe » 29. Jan 2017 11:54

hallo,
nein, ich habe einmal einen autonomen Roboter mit NXT/NXC und dem Mega (und testweise dann auch mit dem Due) gebaut, aber das ist schon ein paar Jahre her. Aber damals hat i2c einwandfrei funktioniert, und auch mit EV3/EV3Basic und Mega tat es das (nicht aber mit dem Due).

kA, wo die, die vor "Beschädigungen" gewarnt haben, das her nahmen - ich kann das nicht bestätigen und auch eine mögliche Ursache dafür nicht erkennen.

Im Moment baue ich an etwas ähnlichem, aber mit Raspi und Arduino, und hier klappt die Komunikation ebenfalls problemlos, sowohl i2c als auch per UART bzw. USB/UART: i2c bis 400kHz (aber nur max 32 Bytes i2c Puffer möglich) und UART bis 115200 baud (hier aber bis zu 64 Bytes Seriellen Puffer und optional full-duplex). Unterm Strich sind beide in etwa gleich schnell. Auch hier sind bei i2c keine Levelshifter nötig und wenn, dann funktonieren viele Shifter gar nicht und nur wenige Typen machen wirklich keine Probleme.

Original-Lego-i2c ist jedoch erheblich langsamer (9,6 kHz) , auch das war ein Grund für mich , die Lego-Plattform hintan zu stellen, auch wenn es grundsätzlich funktioniert hat.

Aber berichte mal, wie du voran kommst, mit welchen Bauteilen genau es dann ggf. funktioniert bei dir!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon HaWe » 29. Jan 2017 16:20

ps,
Arduino Uno und NXT haben aber doch sowieso beide 5V Signal-Level, da braucht man also doch eh keine Levelshifter!

Außerdem bezieht sich dein Artikel http://www.mikrocontroller.net/articles/Pegelwandler auch eher auf UART TTL (da würde ich ntl zustimmen, denn da gibt es auch keine Pullups), und er bezieht sich überhaupt nicht auf den Lego i2c-Bus zum Arduino (selbst WENN beide verschiedene Signal-Level HÄTTEN) und ist von daher ebenfalls irrelvant.
Selbst für "echte" i2c-ICs gibt es Einschränkungen (weder Arduino noch NXT sind aber "echte" 5V- oder 3,3V-ICs mit verschiedenen Leveln):

Zitat:
Bevor man ein Philips I2C Chip auswählt sollte man prüfen ob er verfügbar ist und auch das verfügbare Gehäuse wählen. Man sollte auch überlegen ob ein Puffer wirklich gebraucht wird. Wenn man echte I2C ICs mit 5V betreibt, dann sind die Eingänge vom Typ Schmitt Trigger CMOS (z. B. PCF8574). Dann müssen 3.3V Pegel auf 5V umgesetzt werden. Wenn man jedoch SMBUS Ics verwendet (z. B. ADT7461, Silabs 8051) dann sind die Schwellspannungen TTL kompatibel und es ist keine Anpassung notwendig. Für neue Pegelwandler sollte man hier nachschauen. http://www.bus-buffer.com


aber wie gesagt, sind ja eh beide 5V, also eh wurscht.
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
Alphasucht
Schreibt viel
Schreibt viel
Beiträge: 111
Registriert: 21. Mär 2011 19:03
Wohnort: Berlin

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon Alphasucht » 29. Jan 2017 18:00

Die Angaben schwanken dahingehend zwischen 4,3V und 4,7V.

https://www.dexterindustries.com/howto/connect-the-arduino-and-the-lego-mindstorms-together/
http://www.adamfourney.com/wp-content/uploads/2012/02/schematic.png

Aber sicherlich ist es von Arduino zum NXT nicht so "problematisch" wie zwischen Arduino und Raspi.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5257
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: Frage: NXT, NXC, Arduino Uno Kommunikation über i2c

Beitragvon HaWe » 29. Jan 2017 19:26

ich weiß, aber das ist doch völlig egal, und ich hatte es auch schon erklärt warum:

weil der Prozessor im NXT, der für i2c, ADC, RS485 und die Motor-H-Bridge-Steuerung zuständig ist, nämlich ein AVR ist, genau wie auch der Arduino, und diese AVRs sind intern alle Pegel- und Pin-Voltage-sicher bis mindestens 5V.

https://www.dexterindustries.com/howto/ ... -together/
Bild

Anders im EV3, da steckt direkt ein ARM mit 3,3V dahinter, und bei ARMs muss man mit 5V Spannungen wie bei UART extrem aufpassen,
Aber auch hier nicht bei i2c, weil es gebitbangt wie beim Raspi-ARM-SMBUS ist (nur langsamer) - und vorrausgesetzt ntl dass man auch die richtigen Pullups hat.

https://www.dexterindustries.com/howto/ ... 3-arduino/
Bild

Auch beim Raspi braucht man übrigens genau deswegen ebenfalls keine i2c-Levelshifter zu 5V Arduinos .

(Streng genommen aber beim EV3 auch noch nicht mal bei UART, da der EV3 Schutzwiderstände u.v.a.m. für UART eingebaut hat. Dadurch ist er gegen zu hohe Spannungen abgesichert, allerdings funktioniert jetzt dadurch UART auch nicht mehr nach Industrie-Standards) :twisted:
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E


Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: Peter28 und 10 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss