I2C - Arduino als Slave

Hallo,

ich versuche gerade ein Programm zu schreiben, indem der Arduino Uno die Aufgabe des Slaves annimmt.
Normalerweise ist es so, dass ein Sensor meinem Stellantrieb (Master) Daten sendet.
Jetzt habe ich jedoch die Aufgabe diesen Sensor zu simulieren. Ich habe jetzt in LabVIEW ein SubVI erstellt, dass mittels Cases verschiedene Aktionen ausführt. Ich habe die Cases in Abhängigkeit von selbst erstellten Adressen aufgebaut. Folglich wird wenn Adresse eins angegeben wird eben die Aktion vom 1 “Casefall” ausgeführt und wenn Adresse 2 dann die Aktion vom 2 “Casefall” usw.
Ích habe einmal ein Programm mit den einfachen I2C Bausteinen von Arduino (sh. Anhang) und einmal ein Programm mit Bausteinen von Arduino Compatible Compiner for Labview Home / Student geschrieben.
Wie realisiere ich jedoch jetzt, dass mein Arduino ein Slave sein soll? Mein Stellantrieb zeigt die ganze Zeit die Fehlermeldung an, dass ein Kommunikationsfehler zwischen Slave und Master existiert. Ich denk das liegt daran, dass eben noch nicht festgelegt ist, dass der Arduino ein Slave ist - ist das möglich?

Vielen Dank im Voraus!

Das ist das zweite Programm :slight_smile:

Und warum machst du jetzt einen neuen Thread auf ?

Das hattest du doch im ersten Thread schon alles beschrieben.

HotSystems:
Und warum machst du jetzt einen neuen Thread auf ?

Das hattest du doch im ersten Thread schon alles beschrieben.

Habs im alten Thread vermerkt. Hoffe dass durch die neue Themenangabe mehr Leute die eben auf das Thema Arduino als Slave Antworten wissen aufmerksam werden :slight_smile:

Noch mehr Aufmerksamkeit? Es wäre hilfreicher, wenn Du etwas aufmerksamer und lernwilliger mit den bisherigen Antworten umgehen würdest :-]

DrDiettrich: Noch mehr Aufmerksamkeit? Es wäre hilfreicher, wenn Du etwas aufmerksamer und lernwilliger mit den bisherigen Antworten umgehen würdest :-]

Zu meinen Programmen wurde noch nichts geschrieben - zu den Antworten bezüglich der Hardware habe ich ja alles verstanden und selbst probiert - jetzt geht es ja um die Software selbst und die Möglichkeit meinen Arduino als Slave zu verwenden und auf die Frage kam noch keine Antwort, weshalb ich mir gedacht habe, dass ein neues Topic mit einer besseren Themabeschreibung hilfreich wäre. Sobald ich eine Hilfestellung habe werde ich das im jeweils anderen Post natürlich posten um eben nicht einfach so einen Crosspost zu machen :)

Erkläre bitte, wie LabView mit dem Arduino zusammenarbeitet. Läuft auf dem Arduino eine LabView Bibliothek, oder wie kommen die Daten zum Arduino?

Die Register müssem übrigens auf dem Arduino realisiert werden, damit ihre Werte jederzeit sofort an den Master übertragen werden können,

DrDiettrich: Erkläre bitte, wie LabView mit dem Arduino zusammenarbeitet. Läuft auf dem Arduino eine LabView Bibliothek, oder wie kommen die Daten zum Arduino?

Also in LabView gibt es Zusatzpakete die man kostenlos downloaden kann. Es sind spezielle SubVIs für Arduino. Die, die ich verwendet habe sind zusätzlich noch speziell für die I2C Verbindung von einem Arduino.

Bevor man LabView mit dem Arduino in Betrieb nimmt, muss dass Arduino Interface installiert werden. Danach verbindet man den Arduino wie gewohnt mit dem Computer und öffnet die Arduino Programmierumgebung (IDE). Dann erstellt man zuerst mittels Arduino Sketch LIFA_Base ein ganz normales Arduinoprogramm. Danach wird das Interface hochgeladen und die IDE geschlossen. Dann kann man den Arduino mittels Labview verwenden. Mit dem Baustein Init werden dann die wichtigen Parameter für die Kommunikation (USB-SChnittstelle, Arduinotyp, Baudrate...) eingestellt. Dann kann mit den Bausteinen eine Software geschrieben werden.

DrDiettrich: Die Register müssem übrigens auf dem Arduino realisiert werden, damit ihre Werte jederzeit sofort an den Master übertragen werden können,

Okey das ist schonmal gut zu wissen - also ist es möglich Register auf dem Arduino konstant zu speichern oder müssen diese Register immer bei Start des Programmes neu auf den Arduino geschrieben werden?

sarah_gru: Okey das ist schonmal gut zu wissen - also ist es möglich Register auf dem Arduino konstant zu speichern oder müssen diese Register immer bei Start des Programmes neu auf den Arduino geschrieben werden?

Werte, die ein Reset überdauern sollen, kannst Du unter Beachtung der maximal möglichen Schreibzyklen im EEPROM des UNO gespeichert werden. Sonst bietet sich auch FRAM an.

agmue: Werte, die ein Reset überdauern sollen, kannst Du unter Beachtung der maximal möglichen Schreibzyklen im EEPROM des UNO gespeichert werden. Sonst bietet sich auch FRAM an.

Kann das definitiv nur im Programm von Arduino selbst realisiert werden? Also werde ich praktisch mein Programm ausschließlich so gestalten, dass ich mit I2C Daten schreibe? Mit der Funktion schreiben sendet mein Arduino dann doch per I2C dem Master (also dem Stellantrieb) meine Werte oder ist das immer vom Master auszusehen? Also das mein Programm mit der Lesefunktion die Werte von meinem Arduino liest?

Vorbemerkung: Ich kenne weder LabView, noch verstehe ich, was Du damit machst.

sarah_gru: Kann das definitiv nur im Programm von Arduino selbst realisiert werden?

Verstehe ich nicht.

sarah_gru: Also werde ich praktisch mein Programm ausschließlich so gestalten, dass ich mit I2C Daten schreibe? Mit der Funktion schreiben sendet mein Arduino dann doch per I2C dem Master (also dem Stellantrieb) meine Werte oder ist das immer vom Master auszusehen? Also das mein Programm mit der Lesefunktion die Werte von meinem Arduino liest?

Verkürzt auf dieses Projekt: Bei I2C gibt es einen Master und einen Slave, einen Sender und einen Empfänger. Der Master ist der aktive Teil, der Slave wird nur nach Aufforderung aktiv.

Der Master sendet eine Datenanforderung über vier Bytes, der adressierte Slave empfängt diese Anforderung. Der Slave sendet vier Bytes, der Master empfängt diese.

Manche Slaves nehmen auch Daten entgegen, dann sendet der Master ein Byte für den Index (fünftes Register) und anschließend den Wert. Dies kann beispielsweise einen Meßprozeß "messe Temperatur" anstoßen.

Welche Register des Slaves gelesen oder beschrieben werden können, muß man dem Datenblatt entnehmen.

Soweit klar?

agmue: Verkürzt auf dieses Projekt: Bei I2C gibt es einen Master und einen Slave, einen Sender und einen Empfänger. Der Master ist der aktive Teil, der Slave wird nur nach Aufforderung aktiv.

Der Master sendet eine Datenanforderung über vier Bytes, der adressierte Slave empfängt diese Anforderung. Der Slave sendet vier Bytes, der Master empfängt diese.

Manche Slaves nehmen auch Daten entgegen, dann sendet der Master ein Byte für den Index (fünftes Register) und anschließend den Wert. Dies kann beispielsweise einen Meßprozeß "messe Temperatur" anstoßen.

Welche Register des Slaves gelesen oder beschrieben werden können, muß man dem Datenblatt entnehmen.

Soweit klar?

Ja das ist klar - ich habe ja keinen Sensor, also keinen Slave somit werden die Register, die vom Master gelesen werden sollen eben durch ein SubVI einfach gestellt - also da sind einfach verschiedene Aktionen vorhanden, denen jeweils eine Adresse zugeteilt ist und diese Adressen sollen dann vom Master gelesen werden.

Allgemein habe ich immer noch das Problem, dass mein Stellantrieb die Fehlermeldung: Kommunikationsfehler zwischen Master und Slave bringt. Ich habe jetzt den Arduino mit dem Stellantrieb über die SCL, SDA, Ground und 5V-Kabel miteinander verbunden. Laut Schaltplan des Arduinos wird bei einer Versorgung durch den Stellantrieb (also dem Anschluss des 5 V Kabels) die Versorgung durch den USB geblockt. Folglich ist der zeitgleiche Anschluss des USB und der 5V am Arduino kein Problem. Zudem habe ich jetzt zur Vervollständigung des Aufbaues die Pull-Ups von jeweils einen 4,7kOhm zwischen SCL und 5V und der SDA und 5V angeschlossen. Trotzdem kommt eben die Fehlermeldung, sobald ich den Arduino mit dem Stellantrieb verbinde - muss ich erst mal Softwaretechnisch irgendwas initialisieren damit die Kommunikation möglich ist?

sarah_gru: ... SubVI ...

Was soll das sein?

agmue: Was soll das sein?

Oh sry - das ist einfach ein Unterprogramm - also einfach ein Softwarecode den man dann in anderen Programmen eben einbinden kann :)

Ich habe gerade festgestellt, dass ich zwischen meinem 5V Anschluss vom Stellantrieb zum Arduino und dem Ground einen Widerstand von ca 290Ohm habe - das Kabel ist jedoch einwandfrei -.-

Ich habe jetzt den Arduino mit dem Stellantrieb über die SCL, SDA, Ground und 5V-Kabel miteinander verbunden. Laut Schaltplan des Arduinos wird bei einer Versorgung durch den Stellantrieb (also dem Anschluss des 5 V Kabels) die Versorgung durch den USB geblockt. Folglich ist der zeitgleiche Anschluss des USB und der 5V am Arduino kein Problem.

Wer sagt Dir das? Ich gehe genau vom Gegenteil aus.

Folglich wird wenn Adresse eins angegeben wird eben die Aktion vom 1 "Casefall" ausgeführt und wenn Adresse 2 dann die Aktion vom 2 "Casefall" usw.

Was meinst Du mit Adressen? Ein I2C Slave hat EINE, nur EINE eindeutige Adresse und basta.

Je mehr Du schreibst desto mehr verschidene Versionen presentiert Du und desto verworrener wird das alles.

Grüße Uwe

Hi

In welchem Thread wollen wir denn jetzt weiter machen? Ich hatte ja 'drüben' bereits geschrieben, daß mir ABSOLUT NICHT KLAR IST, was Du hier treibst/treiben willst. Wir fangen Mal gaaanz unten an ...

Der Arduino hat die LabView-Firmware drauf und kann nun (irgendwie) von/mit/zu LabView schwätzen/angeschwätzt werden. Durch diese Firmware kann der Arduino auch Antworten geben - z.B., wenn Er '1' gesagt bekomme, kann er 'CASE 1' antworten.

Ich gehe weiter davon aus, daß LabView der Master hier ist.

Wie soll der ganze Quatsch ablaufen? LabView sendet 'will Sensordaten auslesen' Arduino antwortet 'Sensor 1 so und so' LabViel sendet 'Will Stellantrieb auf zwölf' Arduino hält den Rand, ein ACK für das Verstehen des Befehl reicht, außerdem ist jetzt ein Motor zu verfahren

Wenn der Ablauf irgendwie anders ist - schreibe - BITTE - wie! Dann können wir vll. auch auf die Punkte eingehen, wo Deine Cases nicht 1 sind und was Du sonst noch feines gesagt hast. Vll. sogar dieses Mal auf den Arduino bezogen - denn hier ist kein LabView-Forum, wo man mit lustigen Bildchen Bits hin und her schiebt, sondern ein Arduino-Forum - und hier geht's eigentlich um Arduinos. Daß diese Dinger auch mit LabView schwätzen können, ist wohl ein nettes AddOn, Welches uns diesen Thread beschert hat.

MfG

Ich glaube das ist eine 3-er-Beziehung:

LabView mit seinem Skript/Programm auf dem PC sendet Befehle an den Arduino. Arduino emuliert einen Sensor für den Stellantieb. Der Stellantrieb fragt über I2C den Arduino-Sensor ab und je anch Befehl des LabView soll er andere Werte an den Stellbetrieb senden. Praktisch einen über LabView ferngesteuerten Sensor für den Stellbetrieb.

Grüße Uwe

Die "Befehle" kommen vom Stellantrieb (master), als Registernummern. Der Arduino (slave) muß zu jedem Register einen passenden Wert bereithalten, der auf Anfrage zu übertragen ist.

Das Gefasel mit den 4 Bytes verwirrt nur. Der Master sendet (vermutlich) 1 Byte Registernummer, und möchte dann so viele Bytes lesen, wie dieses Register per Definition enthält. Und da scheint es schon bei der Slave-Adresse zu klemmen, die nicht oder nicht richtig gesetzt ist. Dazu ist bislang noch völlig unbekannt, welche Register der Stellantrieb anfordert, und was jeweils als Inhalt des Registers zurückgeschickt werden soll.

Zum Testen der Verbindung würde ich den slave_sender Sketch an den Stellantrieb anpassen, bis die richtige Adresse ermittelt ist. Die steht vermutlich im Datenblatt des Sensors, zusammen mit den Definitionen der Register.

uwefed:
Wer sagt Dir das? Ich gehe genau vom Gegenteil aus.

Mein Vorgesetzter hat gemeint, dass dies durch den Transistor zwischen der USB Buchse und dem 5V Anschluss möglich ist.

uwefed:
Was meinst Du mit Adressen? Ein I2C Slave hat EINE, nur EINE eindeutige Adresse und basta.

Mit der Adresse sind eben die Verschiedenen Registeradressen die der simulierte Sensor, also das was LabVIEW enthält - die verschiedenen Aktionen die der “Stellantrieb” ausführen könnte (also welche Werte er sendet)

uwefed:
Ich glaube das ist eine 3-er-Beziehung:

LabView mit seinem Skript/Programm auf dem PC sendet Befehle an den Arduino. Arduino emuliert einen Sensor für den Stellantieb. Der Stellantrieb fragt über I2C den Arduino-Sensor ab und je anch Befehl des LabView soll er andere Werte an den Stellbetrieb senden. Praktisch einen über LabView ferngesteuerten Sensor für den Stellbetrieb.

Grüße Uwe

So wie DrDiettrich das im nachfolgenden Post erklärt soll es realisiert werden :slight_smile:

DrDiettrich:
Die “Befehle” kommen vom Stellantrieb (master), als Registernummern. Der Arduino (slave) muß zu jedem Register einen passenden Wert bereithalten, der auf Anfrage zu übertragen ist.

Das Gefasel mit den 4 Bytes verwirrt nur. Der Master sendet (vermutlich) 1 Byte Registernummer, und möchte dann so viele Bytes lesen, wie dieses Register per Definition enthält. Und da scheint es schon bei der Slave-Adresse zu klemmen, die nicht oder nicht richtig gesetzt ist. Dazu ist bislang noch völlig unbekannt, welche Register der Stellantrieb anfordert, und was jeweils als Inhalt des Registers zurückgeschickt werden soll.

Zum Testen der Verbindung würde ich den slave_sender Sketch an den Stellantrieb anpassen, bis die richtige Adresse ermittelt ist. Die steht vermutlich im Datenblatt des Sensors, zusammen mit den Definitionen der Register.

Die Datenübertragung ist im Datenblatt beschrieben - ich habe den Auszug mal an den Post drangehängt :slight_smile:
Mein Stellantrieb soll entweder ein Bit gesetzt (1) oder ein Bit nicht gesetzt (0) oder einen Zahlenwert übergeben bekommen.

Datenblatt.pdf (25.9 KB)

sarah_gru: Mein Vorgesetzter hat gemeint, dass dies durch den Transistor zwischen der USB Buchse und dem 5V Anschluss möglich ist.

Da sollte Dein Vorgesetzter und Du mal den Schaltplan genau anschauen um zu verstehen wann der Mosfet schaltet. Grüße Uwe