Go Down

Topic: Serielle Kommunikation zwischen Arduino mini und ESP(NodeMCU) (Read 599 times) previous topic - next topic

BJDK

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.


combie

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.
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

BJDK

I2C war auch meine Überlegung als erstes aber das Funktioniert bis jetzt nicht.
Hier mal der Code
Master: (ESP)
Quote
#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:
Quote
//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));
}

postmaster-ino

Hi
Code: [Select]
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

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

combie

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.
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.


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.


Thorsten4171

Kann es sein das du denn code aus diesem Thread http://forum.arduino.cc/index.php?topic=466483.0 ü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

BJDK

Kann es sein das du denn code aus diesem Thread http://forum.arduino.cc/index.php?topic=466483.0 ü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

Thorsten4171

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.

BJDK

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!

BJDK

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);
}

postmaster-ino

Hi

Definitiv ...

In Code-Tags sähe Das ungefähe so aus:
Code: [Select]
#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)

combie

hat er aber ja leider :smiley-lol:
Hat er nicht!

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

Quote
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:
Quote
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.
Ein Frosch, der im Brunnen lebt, beurteilt das Ausmaß des Himmels nach dem Brunnenrand.

Go Up