Go Down

Topic: I2C - Arduino als Slave (Read 3850 times) previous topic - next topic

postmaster-ino

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

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



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.

sarah_gru

#18
Aug 07, 2018, 07:15 am Last Edit: Aug 07, 2018, 07:18 am by sarah_gru
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.

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)



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 :)



 
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 :)
Mein Stellantrieb soll entweder ein Bit gesetzt (1) oder ein Bit nicht gesetzt (0) oder einen Zahlenwert übergeben bekommen.

uwefed

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

DrDiettrich

Nach dem Datenblatt erhält der Master jeweils 2 Bytes pro Register vom Slave übergeben.

agmue

#21
Aug 07, 2018, 10:58 am Last Edit: Aug 07, 2018, 11:14 am by agmue
Das Gefasel mit den 4 Bytes verwirrt nur.
Das war als Beispiel gedacht, können auch zwei oder 25 sein. Würde man das ganze Datenblatt bereitgestellt bekommen, könnte man neben der Anzahl der Register auch sehen, ob es einen inkremetellen Modus gibt.

Zu meinen Programmen wurde noch nichts geschrieben ...
In diesem Forum wird üblicherweise mittels C++ (siehe I2C Slave Schnittstelle) programmiert. Die Grafiken sagen mir leider nichts.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sarah_gru

Ich habe das jetzt mal auch mit dem Oszilloskop gemessen um zu sehen ob die Hardware an sich tut. Ich bekomme definierte Zustände - nur wird nach der Übergabe von der Slave-Adresse (8) meine Übertragung abgebrochen.
Das Bild scope_Sensor_0 und scope_Sensor_1 zeigt die Messung von SCL und SDA Leitung wenn ich den Stellantrieb an meinen Sensor anschließe.
Das Bild scope_Simulation_1  und scope_Simulation_2 zeigt die Messung von SCL und SDA wenn ich meinen Arduino anschließe. Ich habe jedoch auch noch keine Software und nichts gestartet.
Es gibt also keine Bestätigung vom Arduino, also vom Slave.
Allgemein ist doch trotzdem eine Kommunikation zwischen Master und Slave möglich, da ja schon mal die Anfrage des Masters (also die Slave-Adresse übermittelt wird) oder nicht? :)
Danke!

DrDiettrich

So wie ich das sehe wird die Übertragung abgebrochen, weil der Slave nicht reagiert. Das kann er ja auch garnicht, wenn er keine Daten zu senden hat.

sarah_gru

So wie ich das sehe wird die Übertragung abgebrochen, weil der Slave nicht reagiert. Das kann er ja auch gar nicht, wenn er keine Daten zu senden hat.
So habe ich mir das auch überlegt, da ich ja noch keine Daten an den Arduino gegeben habe.
Ich probiere jetzt mittels der Oszilloskop Bilder zu ermitteln, was für Daten übertragen werden.
Ich muss jedoch zum Initialisierten bei dem Arduino auch die Baudrate einstellen - in meinem Datenblatt steht dazu:
Transmission Parameter I²C: Standard Mode 100 kHz - ich denke, dass das in Verbindung mit der Baudrate steht. Es gibt sonst kein Vermerk auf eine Baudrate vom Sensor. Weil die Baudrate ist ja abhängig davon, welche Baudrate mein Stellantrieb bei der I2C Verbindung hat oder nicht? Sonst würden die Bauteile ja in verschiedenen Geschwindigkeiten die Daten senden / empfangen.
Wie übersetzte ich jetzt nur die 100kHz in eine Baudrate?

DrDiettrich

Bei I2C gibt es keine Baudrate, der Takt wird vom Master geliefert.

uwefed

Meines Erachtens brauchst Du auf dem Arduino einen Sketch der einerseits die Parameter vom PC/labview entgegennimmt und andererseits auf Anfragen vom I2C Master antwortet.

Das bekommst Du mit einem Standart Arduino LabView-Firmware nicht zusammen.

Grüße Uwe

sarah_gru

quote author=DrDiettrich link=msg=3833101 date=1533641378]
Bei I2C gibt es keine Baudrate, der Takt wird vom Master geliefert.
[/quote]
Muss ich diese Frequenz dann auch bei dem Arduino einstellen?

Meines Erachtens brauchst Du auf dem Arduino einen Sketch der einerseits die Parameter vom PC/labview entgegennimmt und andererseits auf Anfragen vom I2C Master antwortet.

Das bekommst Du mit einem Standart Arduino LabView-Firmware nicht zusammen.

Grüße Uwe
Also ich hab mir dass jetzt auch nochmal genauer überlegt mit den Werten an den Arduino und diese dann über I2C an den Stellantrieb.
Ich würde das so realisieren, dass ich die Werte aus dem Register über USB an den Arduino gebe.
Dann hat der Arduino eben diese Werte in seinem Speicher und kann sie jeder Zeit über den I2C Bus an den Stellantrieb weitergeben.
Weil dann könnte ich mir den Sketch ja sparen oder nicht? Oder geht es nicht den Arduino gleichzeitig über USB und I2C zu nutzen?

agmue

#28
Aug 07, 2018, 01:52 pm Last Edit: Aug 07, 2018, 01:59 pm by agmue
Ich habe einen Mega2560 (egal, ein Arduino eben) als Master an einen Uhrenbaustein DS3231 als Slave angeschlossen und lese die Uhrzeit und Datum als sieben Bytes. Sieht dann so aus:



Die 100kHz ist der Takt bei SCL, den der Master generiert. Das muß bei Dir der Stellantrieb liefern.

Weil dann könnte ich mir den Sketch ja sparen oder nicht? Oder geht es nicht den Arduino gleichzeitig über USB und I2C zu nutzen?
USB und I2C geht gleichzeitig (die Uhrzeit zeige ich mit dem seriellen Monitor über USB an), aber irgendein Programm muß auf dem Arduino schon laufen. Wüßte nicht, wie es sonst funktionieren sollte.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

DrDiettrich

Es wird langsam Zeit, daß Du Links auf die benötigte(n) LabView-für-Arduino Bibliothek(en) lieferst. Die müssen dann mit der I2C Bibliothek in einen Sketch gepackt werden, damit LabView über USB und der Stellantrieb über I2C mit dem Arduino kommunizieren können.

Go Up