Go Down

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

postmaster-ino

Hi

Große Worte - besser wäre, gleich damit  rauszurücken, was Dich stört - nur so als dezenter Hinweis - nicht Jeder hier kann in Dein Hirn rein schauen.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

DrDiettrich

Code: [Select]
 Wire.requestFrom(SLAVE_ADR, sizeof(RegisterData));
 while (Wire.available())
 {
   for (byte i = 0; i < sizeof(RegisterData); i++)
     reg[index].b[i] = Wire.read();
 }

Was soll hier die while Schleife?

Serenifly

#47
Aug 08, 2018, 07:23 pm Last Edit: Aug 08, 2018, 07:24 pm by Serenifly
Das war von mir. Richtig durchdacht ist das in der Tat nicht :) Sie verhindert vielleicht dass man was einliest wenn requestFrom() fehlschlägt. Und dafür sollte man eher ein if verwenden. Aber ansonsten macht sie nichts. Schadet aber auch nichts. Nach dem ersten Durchlauf ist available() 0 und sie bricht ab

DrDiettrich

Wenn mehr oder weniger Bytes ankommen, als in der for Schleife erwartet, dann gibt das furchtbaren Murks :-(

Serenifly

#49
Aug 08, 2018, 07:50 pm Last Edit: Aug 08, 2018, 07:55 pm by Serenifly
Dass sollte aber eigentlich durch das requestFrom() nicht vorkommen. Jedenfalls wenn der Slave richtig programmiert ist. I2C ist da anders als Serial

Aber wie gesagt, kann man durch ein if ersetzen, dann ist etwas besser


Ich glaube ich war da mit dem while der for-Schleife durcheinander gekommen und habe beides gemacht, obwohl man nur eine der beiden Varianten verwenden sollte. Das war nur auf die Schnelle getippt

sarah_gru

Hallo, also ich muss mein Projekt jetzt doch nochmal ein bisschen umschmeißen.
Ich werden die Daten, wie schon besprochen per (virtuellem) COM-Port zum Arduino schicken. Dort dann per I2C zum Stellantrieb.
Jedoch werde ich das mit der Arduino-IDE programmieren.
Ich habe jedoch noch nie mit der Arduino IDE gearbeitet.
Könnt ihr mir daher vorprogrammierte Beispiele von Arduino selbst nennen, die es eben ermöglichen die Daten an den Arduino zu schicken?

Danke!

Serenifly

#51
Aug 09, 2018, 12:55 pm Last Edit: Aug 09, 2018, 01:00 pm by Serenifly
Nein. Das ist viel zu speziell als dass es da was fertiges gibt. Außerdem ist gerade bei der seriellen Schnittstelle der meiste Code den man auf die Schnelle im Internet findet nicht brauchbar wenn man etwas anderes als einen Anfänger-Test braucht

Mit der IDE an sich hat das auch nichts zu tun. Das ist ganz normales C++ mit der Arduino API darüber. Beispiele für die Bibliotheken gibt es. An denen kann man dann verstehen man eine Klasse verwenden muss und passt das an seine eigenen Bedürfnisse an

DrDiettrich

Daten können binär oder als Text geschickt werden. Binär werden einfach die gespeicherten Bytes gesendet, empfangen und abgespeichert. Kritisch wird es, wenn die Übertragung aus dem Takt kommt, so daß die Zahlen verwürfelt werden.

Als Text werden die Werte zuerst codiert (printf...), dann übertragen, vom Arduino wieder decodiert und abgespeichert, z.B. mit Serial.parseInt().

agmue

Möglicherweise hilfreicher Lesestoff: How to process incoming serial data without blocking und RS485 communications bezogen auf die Art der Kommunikation.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

sarah_gru

#54
Aug 09, 2018, 02:31 pm Last Edit: Aug 09, 2018, 02:41 pm by sarah_gru
Möglicherweise hilfreicher Lesestoff: How to process incoming serial data without blocking und RS485 communications bezogen auf die Art der Kommunikation.

Ich habe mir die Links mal angeschaut und auch hier im Forum und allgemein im Internet gesucht, aber ich finde nirgends einen Code, der per USB Daten auf den Arduino schickt. Immer nur lesen oder per RS232 Verbindung  :smiley-confuse:

Irgendwo muss es doch aber ein Beispiel dafür geben, weil das doch nicht so selten sein kann, dass man Daten über USB senden will :smiley-eek:

Es ist sinnvoll wenn ich die Daten binäre sende, weil ich ja Messwerte senden will und keinen Text aber ich weiß eben nicht wie ich das realisieren soll :(
Ich würde das jetzt so realisieren, dass ich die Daten über USB in den EEPROM schreibe und diese dann eben bei Anforderung vom Stellantrieb (Master) gelesen werden, weil ich eben nichts finde, dass ich die Daten in den RAM schreiben kann und mein Kollege mir das so empfohlen hat.

DrDiettrich

Du suchst falsch :-(

Die USB Übertragung erfolgt über einen virtuellen COM Port, der beim Arduino an Serial hängt (UART). Für USB, RS-232, RS-485 etc. kann also der gleiche Code verwendet werden.

Serenifly

weil ich ja Messwerte senden will und keinen Text
Auch hier besteht ein Verständnis-Problem. Binär wird hier einfacher sein, aber Text schließt es nicht aus beliebige Daten zu senden

postmaster-ino

Hi

Daten vom PC->Arduino, seriell, trotzdem über das USB-Kabel (wobei das S in USB auch in die Richtung geht).
Eingabe via Terminal-Programm oder Terminal aus der IDE heraus.
Im Arduino wartest Du auf I²C-Ereignisse oder eben Daten auf der Seriellen.
Wenn Daten von der seriellen Schnittstelle eintrudeln, liest Du Diese und speicherst Diese - irgendwo - ab.
Wenn Du schon weißt, daß Du zwei 16bit Zahlen an Werte senden und weitersenden willst, wäre hier eine gute Idee, ein Datenfeld in dieser Größe vorzuhalten.
Wenn jetzt die Anfrage via I²C kommt, werden genau diese Daten aus diesem Datenfeld raus gegeben.

Wenn Du mehrere Datenfelder dieser Größe hast, diesen Speicherplatz öfter einrichten.
Hier muß dann natürlich sowohl Terminal->Arduino wie auch Master->Arduino diese 'Nummer' mit übermitteln.

Bis jetzt Alles kein Hexenwerk.

Was Du aber mit dem EEprom willst, wo eh alle Daten, mit Denen aktuell 'gespielt' wird im RAM vorhanden sind, ist mir nicht klar.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

sarah_gru

Eingabe via Terminal-Programm oder Terminal aus der IDE heraus.
Im Arduino wartest Du auf I²C-Ereignisse oder eben Daten auf der Seriellen.
Wenn Daten von der seriellen Schnittstelle eintrudeln, liest Du Diese und speicherst Diese - irgendwo - ab.
heißt das, dass ich eigentlich nur den Programmcode von Serial Read brauche oder wie? Also z.B. einfach nur das Programmbeispiel von: https://www.arduino.cc/en/Serial/Read

Wenn Du schon weißt, daß Du zwei 16bit Zahlen an Werte senden und weitersenden willst, wäre hier eine gute Idee, ein Datenfeld in dieser Größe vorzuhalten.
Wie kann ich Datenfelder vorhalten? Ich habe noch nie mit Arduino gearbeitet, deswegen versteh ich da leider definitiv noch viel zu wenig :(

Dankeschön!

agmue

#59
Aug 10, 2018, 10:51 am Last Edit: Aug 10, 2018, 10:52 am by agmue
heißt das, dass ich eigentlich nur den Programmcode von Serial Read brauche oder wie? Also z.B. einfach nur das Programmbeispiel von: https://www.arduino.cc/en/Serial/Read
Im Prinzip ja. Allerdings willst Du nicht nur ein Byte lesen, sondern mehrere, weil beispielsweise ein Wort ja aus zwei Bytes besteht.

Wie kann ich Datenfelder vorhalten? Ich habe noch nie mit Arduino gearbeitet, deswegen versteh ich da leider definitiv noch viel zu wenig :(
Darum habe ich in #41 ein Beispiel gemacht. Im Slave-Programm ist das Datenfeld reg[16]. In reg[4].r ist die Temperatur von 20°C enthalten.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up