Go Down

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

sarah_gru

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!

sarah_gru

Das ist das zweite Programm :)

HotSystems

Und warum machst du jetzt einen neuen Thread auf ?

Das hattest du doch im ersten Thread schon alles beschrieben.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

sarah_gru

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

DrDiettrich

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

sarah_gru

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

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?

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

sarah_gru

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.

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?

agmue

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.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sarah_gru

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?

agmue

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

Kann das definitiv nur im Programm von Arduino selbst realisiert werden?
Verstehe ich nicht.

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?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sarah_gru

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?

agmue

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sarah_gru

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 -.-

uwefed

Quote
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.

Quote
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

Go Up