Jump to content

Kommunikation zwischen TF und Arduino


baboboy

Recommended Posts

Hallo liebe TinkerUnity,

 

Ich habe ein kleine Herausforderung (Probleme gibt es ja bekanntlich nicht  :P), bei der ihr mir vielleich behilflich sein könnt.

Ich möchte, dass mein Arduinoboard mit TF kommunizieren kann. Konkret geht es darum, einfache Befehle von TF an den Arduino zu schicken.

Ich habe gesehen, dass bald ein RS232 Bricklet rauskommt. Das wäre natürlich optimal, aber so lange kann ich leider nicht warten (das Projekt muss bald fertig werden :-[).

Also ist die Frage, ob es noch eine andere Möglichkeit gibt. Am Arduino befinden sich noch maximal vier frei Pins. Ich habe mir überlegt ein IO Bricklet zu verwenden und damit softwareseitig selbst eine serielle Schnittstelle für TF zu implementieren. Ich denke zwar, dass das grundsätzlich möglich ist, aber sehr viel Aufwand bedeutet. Hat vielleicht schon mal jemand etwas Ähnliches gemacht? Eine etwas pfuschigere Idee wäre ein 16 IO Bricklet als parallele Schnittstelle zu missbrauchen. An den Arduino dann über den I2C einen simplen Portexpander dranklatschen...

 

Bisher bin ich aber von keiner meiner Lösungen überzeugt. Ich werde das Gefühl nicht los, dass es da eine einfachere/schönere Möglichkeit gibt  :-\

Wenn also irgendjemand noch frische Ideen oder Anregung hat, freue ich mich sehr  :)

Link zu diesem Kommentar
Share on other sites

Hmh, interessant beide "Welten" könnte man so zusammenbringen, indem der Arduino an die USB-Host-Buchse des RED angeschlossen wird. Dann müsste sogar das uploaden und deployen von Sketches auf den Arduino klappen wofür ja eig. nur ein serielle Schn. verwendet wird.

 

Die USB-Buchse eines Bricks arbeitet quasi nur als Client und ist kein USB-Host.

Link zu diesem Kommentar
Share on other sites

Blöde Frage, hat das Borad keinen USB Anschluss. Die Teile von Arduino die ich kenne haben alle USB.

Ich denke so blöd ist die Frage nicht ;)

Die USB-Schnittstelle ist zwar hardwareseitig bei TF und Arduino vorhanden, aber das bedeutet noch lange nicht, dass das auch von der Software her klappt (ohne dafür unverhältnismäßig viel Aufwand zu betreiben).

Auf dem Arduinoboard ist der USB-Anschluss lediglich mit einem USB/Seriell-Wandler verbunden, der wiederum an den µC angeschlossen ist. Es muss also möglich sein, auf dem Redbrick eine virtuelle serielle Schnittstelle einzurichten und über diese in einem selbstgeschriebenen Programm Nachrichten zu verschicken.

Hat vielleicht schon mal jemand das Breakout-Bricklet verwendet? Ist es damit möglich beliebige I2C Nachrichten zu verschicken?

Link zu diesem Kommentar
Share on other sites

Die USB-Schnittstelle ist zwar hardwareseitig bei TF und Arduino vorhanden, aber das bedeutet noch lange nicht, dass das auch von der Software her klappt (ohne dafür unverhältnismäßig viel Aufwand zu betreiben).

Das klingt ob du mit der Materie dich schon lange beschäftigst, bist aber neu hier, oder ? Warum soll das aufwändig sein ?

Hat vielleicht schon mal jemand das Breakout-Bricklet verwendet? Ist es damit möglich beliebige I2C Nachrichten zu verschicken?
Wieso ich dachte du wolltest das über RS232 Protokoll machen, also doch nicht ?! Wenn ich den Breakout richtig verstanden habe, ist dieser nur zum Abgreifen der Datenleitungen gedacht aber nicht um Kommandos an die Brick CPU zu senden. Oder mag mich jemand korrigieren ?

 

BTW Die neuen Bricklets dürften in den nächsten 1-3 Wo u.U. rauswachsen, dann hast du ein ganz "frisches" Teil als Lösung  ;)

Link zu diesem Kommentar
Share on other sites

Das klingt ob du mit der Materie dich schon lange beschäftigst, bist aber neu hier, oder ? Warum soll das aufwändig sein ?

Ich habe mich schon recht viel mit µC beschäftigt, habe allerdings nicht viel Erfahrung, wenn es um TF oder Linux geht. Keine Ahnung, ob das aufwändig ist, aber für mich klingt das erstmal nicht ganz trivial.

Wieso ich dachte du wolltest das über RS232 Protokoll machen, also doch nicht ?!

Das Ziel ist es einfache Daten von TF an Arduino zu senden. Der Weg auf dem das geschieht ist mir dabei egal, solange der Weg kurz ist und wenig Stolpersteine hat. D.h. es sollte etwas sein was möglichst wenig Arbeitsaufwand erfordert und möglichst wenige Dinge enthält, die noch niemand ausprobiert hat.

Wenn ich den Breakout richtig verstanden habe, ist dieser nur zum Abgreifen der Datenleitungen gedacht aber nicht um Kommandos an die Brick CPU zu senden. Oder mag mich jemand korrigieren ?

Ich denke ich habe den Sinn des Breakout-Bricklets zuerst falsch verstanden. Es ist eigentlich dazu gedacht, dass man es an ein anderes Bricklet anschließt und dann direkt auf die Signale des Bricklets zugreifen kann. Ich dachte zuerst es wird an einen Brick angeschlossen (wegen der Bezeichnung "Bricklet"), um eigene Bricklets zu realisieren.

Die Frage ist, kann man es auch an einen Brick anschließen und dann auf Signale des Bricks zugreifen? Kann man z.B. ein selbst definiertes Adressbyte+Datenbyte auf dem I2C eines Bricks legen und diese Daten am Breakout-Bricklet abgreifen?

Ich befürchte mal das geht nicht. Wenn ich mir hier im Forum andere Threads durchlese, dann widerspricht so etwas der Philosophie von TF  :-\

Link zu diesem Kommentar
Share on other sites

Jetzt mal ganz zurück. Wie kompliziert sind den deine Befehle?

 

Hier ein ganz einfacher Ansatz:

 

Du könntest ein IO-4 Bricklet an deine 4 übrigen Pins anschließen. Jeder Pin stellt dabei einen Befehl da. Ein Wechsel von Low auf High an einem Pin bedeutet dann, dass der Befehl für diesen Pin ausgeführt werden soll. Der Wechsel zurück von High auf Low hat keine Bedeutung.

Link zu diesem Kommentar
Share on other sites

Ich muss die Geschwindigkeiten für vier Motoren übertragen.

4 Motoren -> 2 Bit

Richtung -> 1 Bit

Für die Geschwindigkeit wäre dann noch 1 Bit übrig, was zu wenig ist. Ich bräuchte mindestens 5 Bit Auflösung für die Geschwindigkeit.

Vielleicht ist die Idee mit dem Portexpander am Arduino doch nicht so schlecht. Oder ich schiebe 2x hintereinander 4 Bit rüber.

Link zu diesem Kommentar
Share on other sites

Ich mache es jetzt folgendermaßen:

An TF kommt ein IO-Bricklet, an den Arduino ein Portexpander. Portexpander und IO-Bricklet werden mit der benötigten Anzahl an Datenleitungen verbunden. Zusätzlich wird ein Ausgang des IO-Bricklet direkt mit dem Arduino verbunden.

Wenn TF eine Motorgeschwindigkeit ändern will, werden die Daten als einzelne Bit an den Portexpander angelegt. Anschließend löst TF am Pin des Arduino einen Interrupt aus. In der Interruptfunktion des Arduino werden die Daten des Portexpanders ausgelesen.

Vielleicht etwas umständlich, aber ich bin mir zumindest sicher, dass ich das ohne Probleme hinbekomme.

Link zu diesem Kommentar
Share on other sites

Hmmh, hört sich erstmal easy an. Ich glaube ich habs noch nicht komplett verstanden, da wir uns hier auf sehr low level befinden !? 1 bit Information ist mir klar, aber bei höherer Bitaufl. wie weißt du wann das Datenpaket beginnt, fehlt da nicht der Takt, der festlegt, wann die Datenleitungen interpretiert werden sollen ?

Link zu diesem Kommentar
Share on other sites

Hmmh, hört sich erstmal easy an. Ich glaube ich habs noch nicht komplett verstanden, da wir uns hier auf sehr low level befinden !? 1 bit Information ist mir klar, aber bei höherer Bitaufl. wie weißt du wann das Datenpaket beginnt, fehlt da nicht der Takt, der festlegt, wann die Datenleitungen interpretiert werden sollen ?

Um die Schwierigkeiten mit Timing, Taktleitung etc. zu umgehen, verwende ich keine serielle, sondern eine parallele Schnittstelle. D.h. die Bits werden nicht nacheinander über eine Leitung, sondern gleichzeitig über mehrere Leitungen gesendet. Pro Bit verwende ich 1 Leitung.

Wie ich bereits geschrieben habe möchte ich mindestens 8 Bit senden. Ich benötige also mindestens 8 Leitungen von TF zum Arduino Board. Bei TF kann ich das IO Bricklet verwenden, das hat genug Ausgänge. Beim Arduino Board habe ich allerdings nur noch 4 Pins frei. Deshalb benötige ich einen sog. "Portexpander", z.B. diesen hier:

https://www.adafruit.com/products/732

Das ist ein integrierter Baustein, der über den I2C-Bus an den Arduino angeschlossen werden kann. Für den I2C-Bus werden lediglich zwei Pins benötigt (SCL für den Takt und SDA für die Daten). Ich erweitere also mein Arduino Board um 16 weitere IOs.

Leider kann ich die IOs nicht ganz so verwenden, wie die normalen IOs des Boards. Wenn ich abfragen möchte, was an den Eingängen anliegt, muss ich einen entsprechenden Befehl über den I2C-Bus senden. Der Portexpander antwortet dann darauf, indem er den Status der Eingänge zurücksendet. Je nach Geschwindigkeit des Buses, kann dieser Vorgang bis zu einigen hundert µs dauern. Das klingt erstmal nicht viel. Allerdings weiß ich nicht, wann TF Daten an meinen Arduino schicken wird. Ich muss also permanent die Eingänge des Portexpanders abfragen, was viel Rechenzeit benötigt.

Also verbinde ich noch zusätzlich einen Ausgang von TF direkt mit dem µC des Arduinos und konfiguriere diesen Pin so, dass z.B. bei steigender Flanke ein Interrupt ausgelöst wird.

Ich kann dann mit TF die Daten an den Portexpander anlegen und anschließend einen Interrupt auslösen um dem Arduino Board zu signalisieren, dass es sich jetzt die Daten vom Portexpander abholen kann. Es werden also nur Daten über den (vergleichsweise langsamen) I2C-Bus übertragen, wenn es auch wirklich neue Daten gibt.

Ich habe noch ein Bild mit dem Konzept angehängt, dann sollte es klarer werden.

TF-Arduino.PNG.64466a9408de413cd194b803b8bb8dc4.PNG

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...