Serielle Kommunikation zwischen Arduino mini und ESP(NodeMCU)

Hey,
ich versuche seit längerem raus zu finden wie ich eine Serielle Kommunikation zwischen Arduino mini und ESP hinbekomme..
Also mein Projekt mal kurz beschrieben:
Ich baue eine Roboterhand und einen Sensorik-Handschuh. An dem Sensorik-Handschuh sind für jeden Finger Dehnungssensoren befestigt um die Bewegung zu messen (das läuft). Jetzt möchte ich, da der ESP nur einen Analogen Eingang hat, meine Messwerte (int-Werte) mit einem Arduino mini erfassen und und dann Seriell an den ESP weiterschicken. Der ESP soll die Werte dann an einen weiteren ESP(in der Roboterhand) senden. Der ESP in der Roboterhand soll dann die Werte nehmen und damit Servomotoren ansteuern um die bewegung nach zu armen.

Vielleicht weiß ja einer von euch wie die Serielle Kommunikation aussehen muss (ich hab noch kein Programm). Ich habe mich schon an I2C versucht allerdings bekomme ich dann, egal wie die Finger stehen, fünfmal -1 raus und deswegen wollte ich es jetzt Seriell versuchen.

Für solcherart Kommunikation, wenn es denn UNBEDINGT seriell sein muss, verwende ich gerne den CmdMessenger.

Aber:
Mache es dir doch mit I2C.

Das tuts perfekt!
Man muss es nur richtig machen.
Und die Kabel dürfen nicht zu lang sein.

I2C war auch meine Überlegung als erstes aber das Funktioniert bis jetzt nicht.
Hier mal der Code
Master: (ESP)

#include <Wire.h>

const int SLAVE_ADR = 2;

union data_u
{
struct
{
uint16_t Dwert;
uint16_t Zwert;
uint16_t Mwert;
uint16_t Rwert;
uint16_t Kwert;
};
byte bytes[10];
};

data_u data;

void setup()
{
Serial.begin(9600);
Serial.println("Master");
Wire.begin(D1,D2);
}

void loop()
{
getData();
delay(1000);
}

Slave:

//Bibliotheken
#include <Wire.h>// Einbindung der Bibliothek für das I2C Bus verfahren
//Pin und Variablen Deklarierung
#define Daumen A0
#define Zeigefinger A1
#define Mittelfinger A2
#define Ringfinger A3
#define Kleinerfinger A6
const int SLAVE_ADR = 2;
//Funktion um die Kommunikation zu starten
union data_u
{
struct
{
int Dwert;
int Zwert;
int Mwert;
int Rwert;
int Kwert;
};
byte bytes[10];
};

data_u data;
void setup(){
}
//
void loop()
{
data.Dwert = analogRead(Daumen);
data.Zwert = analogRead(Zeigefinger);
data.Mwert = analogRead(Mittelfinger);
data.Rwert = analogRead(Ringfinger);
data.Kwert = analogRead(Kleinerfinger);
Wire.begin(SLAVE_ADR);
Wire.onRequest(requestEvent);
}

void requestEvent()
{
Wire.write(data.bytes, sizeof(data));
}

Hi

Wire.begin(D1,D2);

Das funktioniert?
Weiter ist der Master-Code definitiv nicht vollständig.
Auch bekomme ich den ESP nicht in meiner IDE eingestellt, aber weder D1 und D2 wie die Funktion getData() sind bekannt

Der Slave kompiliert zumindest (als Nano)

Als Übung für's nächste Mal: Code-Tags.

MfG

Jein also bei mir hat er "Funktioniert" also ich konnte ihn kompelieren und er hat mir auch auf dem Seriellen Monitor werte angezeigt nur leider haben sich diese Werte nicht geendert. Und was wohl das größte Problem war das ich einfachnur folgendes Angezeigt bekommen habe:
-1
-1
-1
-1
-1

D1 ist SLC und D2 ist SDL beim NodeMCU Board

BJDK:
Jein also bei mir hat er "Funktioniert" also ich konnte ihn kompelieren und er hat mir auch auf dem Seriellen Monitor werte angezeigt nur leider haben sich diese Werte nicht geendert. Und was wohl das größte Problem war das ich einfachnur folgendes Angezeigt bekommen habe:
-1
-1
-1
-1
-1

D1 ist SLC und D2 ist SDL beim NodeMCU Board

Nicht nur, dass die Abkürzungen lustig sind...
Sondern, dein gezeigter Code kann nie und nimmer das beschrieben Verhalten zeigen.

hat er aber ja leider :grinning:

Hi

seriell ist ja eigendlich als point to point gedachst, soll heissen wenn Du drei Teilnehmer hast benötigt einer zwei Schnittstellen, damit wirds dann schwierig.

Bei jeder Verbindung must Du dir letztlich Gedanken machen wie Du den Datenfluss synchronisiers, Startkennung Endkennung. Ansonsten ist seriell ja eigendlich einfach, mit dem Monitor machst Du ja nichts anderes. Einer muss halt senden und der andere muss stänig auf der Lauer liegen und lauschen, wenn er die Startkennung erkennt kann er die Daten einlesen und zuordnen, in Deinem Beispiel also 5 int Werte. Ab der Endkennung wartete er dann wieder auf die Startkennung.

Ich kenne mich mit Ic2 nicht aus, aber das ist ein Bussystem. da gibts einen Master der fragt beim Slave an und dann sendet der los. Meist verwendet der Master dazu eine Umlaufliste.

Kann es sein das du denn code aus diesem Thread Mehrere Int-Werte über I2C übermitteln - Deutsch - Arduino Forum übernommen hast?
Hier beschreibt Serenifly sehr schön wie man mehrere int überträgt. Hier ist dann auch die fehlende Funktion getData().Habe ich auch benutzt und funktioniert sehr gut. Danke auch noch einmal an Serenifly
dafür.

mfG Thorsten

Thorsten4171:
Kann es sein das du denn code aus diesem Thread Mehrere Int-Werte über I2C übermitteln - Deutsch - Arduino Forum übernommen hast?
Hier beschreibt Serenifly sehr schön wie man mehrere int überträgt. Hier ist dann auch die fehlende Funktion getData().Habe ich auch benutzt und funktioniert sehr gut. Danke auch noch einmal an Serenifly
dafür.

mfG Thorsten

Ja genau das hat bei zwei Uno's auch super geklappt nur leider Arduino und ESP nicht mehr

Also ist die Funktion getData() in deinem code vorhanden und du hast sie nur nicht gepostet?
So wie jezt darsteht ist es nur der Aufruf der Funktion.

Rentner:
Hi

seriell ist ja eigendlich als point to point gedachst, soll heissen wenn Du drei Teilnehmer hast benötigt einer zwei Schnittstellen, damit wirds dann schwierig.

Bei jeder Verbindung must Du dir letztlich Gedanken machen wie Du den Datenfluss synchronisiers, Startkennung Endkennung. Ansonsten ist seriell ja eigendlich einfach, mit dem Monitor machst Du ja nichts anderes. Einer muss halt senden und der andere muss stänig auf der Lauer liegen und lauschen, wenn er die Startkennung erkennt kann er die Daten einlesen und zuordnen, in Deinem Beispiel also 5 int Werte. Ab der Endkennung wartete er dann wieder auf die Startkennung.

Ich kenne mich mit Ic2 nicht aus, aber das ist ein Bussystem. da gibts einen Master der fragt beim Slave an und dann sendet der los. Meist verwendet der Master dazu eine Umlaufliste.

Vielen Dank für die Erklärung!

Das ist jetzt sehr peinlich ... Entschuldigung
#include <Wire.h>

const int SLAVE_ADR = 2;

union data_u
{
struct
{
uint16_t Dwert;
uint16_t Zwert;
uint16_t Mwert;
uint16_t Rwert;
uint16_t Kwert;
};
byte bytes[10];
};

data_u data;

void setup()
{
Serial.begin(9600);
Serial.println("Master");
Wire.begin(D1,D2);
}

void loop()
{
getData();
delay(1000);
}

void getData()
{
Wire.requestFrom(SLAVE_ADR, sizeof(data));
for (unsigned int i = 0; i < sizeof(data); i++)
data.bytes = Wire.read();

  • Serial.println(data.Dwert);*
  • Serial.println(data.Zwert);*
  • Serial.println(data.Mwert);*
  • Serial.println(data.Rwert);*
  • Serial.println(data.Kwert);*
    }

Hi

Definitiv ...

In Code-Tags sähe Das ungefähe so aus:

#include <Wire.h>

const int SLAVE_ADR = 2;

union data_u
{
  struct
  {
  uint16_t Dwert;
  uint16_t Zwert;
  uint16_t Mwert;
  uint16_t Rwert;
  uint16_t Kwert;
  };
  byte bytes[10];
};

data_u data;

void setup()
{
 Serial.begin(9600);
  Serial.println("Master");
  Wire.begin(D1,D2);
}

void loop()
{
  getData();
  delay(1000);
}

void getData()
{
  Wire.requestFrom(SLAVE_ADR, sizeof(data));
  for (unsigned int i = 0; i < sizeof(data); i++)
  data.bytes = Wire.read();

  Serial.println(data.Dwert);
  Serial.println(data.Zwert);
  Serial.println(data.Mwert);
  Serial.println(data.Rwert);
  Serial.println(data.Kwert);
}

Vll. ab und zu lesen, was Da geschrieben wurde?
Kurz danach versuchen, das Gelesene zu verstehen - vll. hat's ja doch einen Sinn.

In diesem Sinn(e)

BJDK:
hat er aber ja leider :grinning:

Hat er nicht!

Der Code wirft eine Fehlermeldung!
(aber das wurde dir ja schon gesagt)

exit status 1
'getData' was not declared in this scope

Bitte sorgfältiger arbeiten.
Denn so kann man dir nicht helfen.
Und du lernst so nie was richtig und falsch ist.

Auch hier wäre mehr Sorgfalt angesagt:

D1 ist SLC und D2 ist SDL

Da kann man nur raten, was gemeint ist.

Und dann hätte ich auch gerne noch eine Zeichnung von dir gesehen, wie die beiden verbunden sind. Mit allen Bezeichnern Pinnummern und Widerständen, Spannungsangaben.

Das setup im Slave ist leer. Da muss doch auch wire.begin()rein um die Kommunikation zu starten.

wire.begin() steht tiefer hab ich erst jezt gesehen. #15 aus Gedächtniss streichen. :slight_smile:

Also D1 ist SCL und D2 ist SDA heißt sie sind für die I2C-Bus Verbindung zuständig, so habe ich es in anderen Projekten gesehen.
Hier :

Wie füge ich den Bilder hier ein? ( ich kenne mich kein bisschen mit html aus)

Also ich habe D1(ESP) mit A4(Arduino) und D2(ESP) mit A5(Arduino) verbunden
als Analoge eingänge habe ich am Arduino A0-A3 belegt und dann noch A6 damit alle Werte aufgenommen werden. und dann natürlich Masse an Masse

BJDK:
Also D1 ist SCL und D2 ist SDA heißt sie sind für die I2C-Bus Verbindung zuständig, so habe ich es in anderen Projekten gesehen.
Hier :
NodeMCU I2C with Arduino IDE | NodeMCU

Wie füge ich den Bilder hier ein? ( ich kenne mich kein bisschen mit html aus)

Also ich habe D1(ESP) mit A4(Arduino) und D2(ESP) mit A5(Arduino) verbunden
als Analoge eingänge habe ich am Arduino A0-A3 belegt und dann noch A6 damit alle Werte aufgenommen werden. und dann natürlich Masse an Masse

Bild ist doch mit Hochgeladen :slight_smile:

  • Sensorik-Handschuh.jpg

Der Arduino, ist das ein 5V Modell?
Dann darf die 5V nicht an Raw, sondern muss an 5V.

Auch sehe ich keine I2C Pullup!
Das könnte das Versagen erklären.

Die sollten so ca. 1,8K haben und jeweils von SDA und SCL zu 3,3V gehen.