EV3-Basic: Kommunikation mit Arduino über UART

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

Moderator: Moderatoren

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon c0pperdragon » 26. Sep 2015 15:22

Hi!

Leider ist die Möglichkeit, mit externen eigenen Geräten über einen schnellen UART zu kommunizieren, mit der Standardfirmware nur extrem schwierig zu benutzen. Letztlich muss sich das Gerät sozusagen als Sensor ausgeben und alle Kommunikation muss im starren Rahmen der Sensorkommunikation stattfinden. Möglicherweise wäre das aber trotzdem für verschiedene Anwendungen nützlich.

Wenn man nur einen selbstgebauten Sensor mit einem Arduino bauen will, dann gibt es da schon eine recht gute Library von Dexter Industries (https://github.com/lawrie/EV3_Dexter_In ... V3_arduino).
Allerdings beschränkt sich das auf Sensoren, die eben nur Daten zum EV3 schicken.

Etwas Nachforschung ergibt, dass es aber auch in den Tiefen des EV3 ein Möglichkeit gibt, Daten zu einem Sensor rauszuschicken. Mit so einer Lösung könnte man dann leicht einen Sensor/Aktuator bauen oder überhaupt alles, was irgendwie Datenkommunikation braucht und schneller laufen soll, als die 10KBit/s vom I2C-Port.

Wenn Interesse besteht, dann könnte ich versuchen, die Library von Dexter Industries in diese Richtung zu erweitern.

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

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon HaWe » 26. Sep 2015 16:02

Natürlich wäre das ein Riesen-Ding!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

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

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon HaWe » 1. Okt 2015 18:55

hi,
tatsächlich hat i2c keine große Zukunft für einen EV3-Arduino-Kontakt, denn
1.) ist es mit einem Daten-Turnaround pro Richtung von je 30 bytes/70ms ~ 450 bytes/sec ziemlich langsam
2.) wie ich jetzt feststellen musste, läuft I2C wegen interner fester Pullups nicht mit dem Arduino Due, sondern nur mit Uno+Mega
3.) haben Uno + Mega jew. nur 1 einzigen i2c Port (dann als slave), können also keine eigenen i2c Geräte mehr auslesen (PCF's, RTC, GPS), und außerdem sind als eigene Roboterplattform zu leistungsschwach (nur der Due wäre mit NXT und EV3 halbwegs vergleichbar).

eine vergleichsweise etwa 10x so schnelle UART-Verbindung ist aber auf allen Arduino-Plattformen gleich mehrfach vorhanden (Hardware- und Software-Serial), daher werden keine Ports komplett blockiert, und würde daher deutlich mehr Sinn machen!
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon c0pperdragon » 1. Okt 2015 21:20

Ich bin mit dem I2C vom EV3 auch nicht so zufrieden, hauptsächlich wegen der Geschindigkeit. Bei 10kBaud und halbduplex kommen da eben nicht mehr als 450 bytes/sec raus (für jede Richtung halt).

Bei dem Problem, dass es mit dem Arduino Due nicht geht, könntest du allerdings mal versuchen Wire1 (für die Pins SDA1 und SCL1). zu verwenden. Die haben anscheinend keinen internen Pullup eingebaut (der 1K5-Widerstand von SDA0 und SLC0 ist wahrscheinlich zu stark als dass der EV3 dagegen ankommt).

Wie praktisch jetzt UART oder I2C tatsächlich bei den verschiedenen Arduino-Varianten wäre, hängt wohl vom Anwendungsfall ab.
Wenn du I2C noch für andere Sachen brauchst, wäre es unpraktisch, den möglicherweise einzigen Port für die Kommunikation mit dem EV3 zu blockieren. Andererseits habe ich einen Fall, wo ein Arduino Uno eine 4-Stellige 7-Segment-Anzeige treibt und da war es optimal, über I2C mit dem EV3 zu sprechen - vor allem, weil ich die serielle Leitung am Uno über USB am PC hängen habe (zum Programm aufspielen und Debuggen).

Und bis ich da was entsprechendes entwickelt habe, dürfte I2C noch der einzige Kommunikationskanal von EV3Basic zum Arduino bleiben.

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon c0pperdragon » 1. Okt 2015 21:54

Ich habe jetzt nochmal in der Beschreibung des UART-Protokolls nachgeschaut. Das ist halt schon stark auf die Benutzung für Sensoren zugeschnitten. Der Sensor soll in regelmäßigen Abständen (bzw. immer wenn sich was ändert) die aktuellen Sensorwerte zum EV3 schicken. So ein Paket Sensorwerte darf maximal 32 Bytes groß sein. In der Gegenrichtung kann der EV3 bei Bedarf ein kleines sensorspezifisches Kommando mit bis zu 8 (nur 8, leider!) Bytes zum Sensor schicken. Wie genau das geht, und ob man ganz schnell viele Komandos hintereinander schicken kann, muss ich noch ausprobieren.

Erschwerend kommt hinzu, dass die Sensorwerte im EV3 nicht sofort nach Erhalt vom EV3Basic (oder anderen Programmen) ausgelesen werden können, sondern die werden anscheinend nur in regelmäßigen Abständen (so 2-3 millisekunden) in den Bereich kopiert, von dem sie dann ausgelesen werden können. Ich habe den Verdacht, dass der EV3 den Eingangsbuffer seines UARTs eben so alle 2-3 ms pollt und die Daten auswertet.
Für normale Anwendungszwecke ist das natürlich schnell genug - für meinen CubeTwister damals leider nicht - deswegen musste ich einen Teil der Arbeit in den Sensor auslagern und dann über I2C die Ergebnisse abholen.

Wenn du dir vorstellen kannst, dass du damit was anfangen könntest, dann werde ich das weiter erforschen.

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon c0pperdragon » 1. Okt 2015 22:59

Korrektur!
Ich habe das vorhin falsch gelesen. Es geht doch, dass man bis zu 32 Byte zum Sensor schickt. Interessanterweise ist das Protokoll so definiert, dass man nur 1,2,4,8,16 oder 32 Bytes schicken kann. Wenn man eine Zwischengröße schicken will, dann wird das einfach mit 0en aufgefüllt (ohne am Arduino rausfinden zu können, wie viel eigentlich gemeint waren - aber das kann man schon mit eigenen Mitteln lösen).

Also scheint deine Anwendung 32 hin und 32 zurück durchaus machbar...

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

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon HaWe » 1. Okt 2015 23:20

32 jeweils in beide Richtungen - das klingt ja wirklich vielversprechend, und 2ms Wartezeit ist doch auch viel besser als die i2c-Umschaltzeit 8-)
Danke auch ganz besonders für deinen Tipp mit TWI-1 ! dass dort keine pullups verbaut sind, könnte die Lösung sein - ich probiere es gleich morgen aus! Dann kann TWI-0 für Standard-Senoren bleiben wie es ist, und in Spezialfällen, wo UART schlecht funktioniert, wäre es eine absolut sinnvolle Alternative :)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon c0pperdragon » 2. Okt 2015 15:24

Oje, die EV3-Firmware ist in dieser Stelle echt arg vermurkst.
Ich habe es heute nach viel Mühen geschafft, vom Arduino Daten zum EV3 als Sensorwerte zu schicken. Allerdings hält sich der Firmware-Code anscheinend nicht so ganz an die Spezifikationen - und anstatt 32 Byte zu erlauben, kann man nur die erten 8 Werte ansprechen. Interessanterweise kann man statt dessen auch 8 Werte anderer Datentype (16bit,32bit,float) übertragen, die man auch alle ansprechen kann. Klingt ja fast schon gut: 8 x 32 bit = 32 byte, oder? Leider nicht ganz. Auf dem Weg durch die Tiefen der VM werden die Zahlen nämlich vorübergehend (und echt total nutzlos) in eine float-Zahl umgewandelt bevor der Bytecode sie bekommt. Durch die Wandlung int - float -int verliert man aber durch Rundungsfehler eine ganze Menge Information. Könnte mir vorstellen, dass man zumindest 3 Byte in so einem int transportieren kann und dass das am Ende auch wieder vollständig herauskommt.
Zusammengerechnet wären das also 24 Byte anstatt der erhofften 32. Ist blöd, aber mehr geht echt nicht.
Wenigstens kannst du dir aber Prüfsumme, Slave-Erkennung und Sync-Byte sparen, weil das durch das UART-Protokoll vom EV3 schon erledigt wird.
Die Richtung vom EV3 zum Arduino geht mit 32 Bytes wie gedacht.

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

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon HaWe » 2. Okt 2015 20:49

aber immerhin 10x so schnell wie I2C ! 8-)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon c0pperdragon » 4. Okt 2015 13:19

Die ganze Sache mit dem UART wird zunehmend hoffnungsloser.
Einerseits ist die Übertragung vom Arduino zum EV3 auf 8 Sensorwerte eingeschränkt (da kriegt man dann etwas 24 Byte rein) und es dauert immer ein paar Millisekunden extra bis man am EV3 diese Werte auch sieht.
Andererseits ist die Übertragung vom EV3 zum Arduino (da gehen 32 Byte) sehr unzuverlässig. Aus unerfindlichen Gründen sendet der EV3 sporadisch nicht das Datenpaket, das man eigentlich senden will, sondern nochmal das vorige. Sogar beim mehrmaligen Senden ist das manchmal noch das ganz alte. Um also sicher zu sein, dass auch wirklich die Daten angekommen sind, die man senden wollte, müsste man noch irgendwie ein Handshake in die Sensordaten reincodieren. Das geht wohl auch alles irgendwie, aber von der schnellen Übertragung ist dann nicht mehr viel übrig....

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

Re: EV3-Basic: Kommunikation mit Arduino über UART

Beitragvon HaWe » 4. Okt 2015 14:49

tja, da kann man sich nur herzlich bedanken beim tollen Lego Programmier-Entwickler-Team.
(sind die dumm oder sowas ?) :-/
Klickibunti aber nicht viel substantiell sinnvolles dahinter, weder hard- noch softwaremäßig.
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: Bing [Bot], Google Adsense [Bot] und 9 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss