EV3 mit Arduino Nano verbinden

Modelle zum Nachbauen oder wo gibt es etwas interessantes oder Projekte?

Moderator: Moderatoren

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

EV3 mit Arduino Nano verbinden

Beitragvon Hobbes » 10. Dez 2015 18:15

Hallo,

da ich noch einen Arduino Nano und einen 6DOF Sensor (Gyro, Accel) habe, wüdre ich gerne den Sensor für den EV3 nutzen.
siehe http://www.dexterindustries.com/howto/connecting-ev3-arduino/
Bevor ich aber aber ein Kabel durchschneide und die drei Sachen verbinde, möchte ich doch lieber mal die Experten hier fragen, ob das denn überhaupt geht, ob ich mir was kaputt machen kann und ob das Sinn macht.
Also ich habe an Hardware:
- Ev3
- Arduino Nano
- 6DOF Sensor
Software:
- EV3-G Home Editon
- den Dexter Block für I2C
- Arduino sketch

Den Sensor habe ich an den Arduino angeschlossen und ein kleines Programm geschrieben (naja..zusammengesetzt bzw. geklaut :wink: ).

Code: Alles auswählen

#include <Wire.h>

#include "i2c.h"
#include "adxl345.h"
#include "itg3200.h"
#include "imufilter.h"

#define GYRO 0x68
#define ACCEL 0x53
#define FILTER_RATE 0.01

ADXL adxl(ACCEL);
ITG itg(GYRO);
IMUfilter imuFilter(FILTER_RATE, 0.6);
int count=0;
long lastmillis=0;

float ax=0,ay=0,az=0,gx=0,gy=0,gz=0;
int axi=0,ayi=0,azi=0,gxi=0,gyi=0,gzi=0;
float loops=0;
float sumx,sumy,sumz=0;
char str[512];
unsigned long time;


void setup() {
  pinMode(13, OUTPUT);
  delay(500);
  i2c.begin();
  Serial.begin(115200);
 // Serial.begin(57600);
 // Serial.println("I2C initialised.");
  adxl.init();
  itg.init();
  itg.wake();
 
  while (!itg.dataReady()) {
  }
 
  unsigned char whoami=i2c.readRegister(ACCEL,ADXL_WHO_AM_I);
  whoami=i2c.readRegister(GYRO,ITG_WHO_AM_I);

}

void loop() {

    while (!adxl.dataReady()) {
   }
   
   
      time = micros();
      ax=adxl.getX();
      ay=adxl.getY();
      az=adxl.getZ();
      axi=(int)ax;
      ayi=(int)ay;
      azi=(int)az;
     
    while (!itg.dataReady()) {
    }
   
    gx=(float)itg.getX();
    gy=(float)itg.getY();
    gz=(float)itg.getZ();
     gxi=(int)gx;
      gyi=(int)gy;
      gzi=(int)gz;
   
   sprintf(str, "a%lu;%d;%d;%d;%d;%d;%de",time, axi, ayi, azi,gxi,gyi,gzi);
    Serial.print(str);
 
   if (axi>5){
    digitalWrite(13, HIGH);
   }
   else
   {
    digitalWrite(13, LOW);
   }
   
    loops++;
    //}

Es funktioniet zu mindestens. :D

Der nächste Schritt wäre jetzt ein Lego-Kabel zerschneiden und die Anschlüsse wie auf der Dexter Seite beschrieben mit dem Nano verbinden. Jetzt sind aber die Pins ja schon durch den Sensor belegt. Kann ich da einfach mehrere Kabel anschließen? Also an den SDA Pin kommt sowohl der Sensor wie auch das Kabel zum EV3? Sorry, aber hab echt keine Ahnung davon.
Sind die Pins vom Nano die gleichen wie beim Uno?


Dann müsste ich noch den folgenden Code einbauen, der für die Kommunikation zwischen EV3 und Arduino ist.

Code: Alles auswählen

/*
 *
 * #include <Wire.h>
#define SLAVE_ADDRESS 0x04
void setup()
{
    Serial.begin(9600); // start serial for output
    Wire.begin(SLAVE_ADDRESS);
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);
    Serial.println("Ready!");
}
int val,flag=0;
void loop()
{
  if(flag==1)
   {
     Serial.print(val);
     flag=0;
   }
}
void receiveData(int byteCount)
{
    while(Wire.available()>0)
    {
      val=Wire.read();
      flag=1;
    }
}
// callback for sending data
void sendData()
{
  Wire.write(0x45);
}
 *
 *


Kann das alles funktionieren? Was kann ich zerstören? Worauf soll ich achten?
Kann ich später noch mehr Sensoren an den Arduino anschließen?

Für jede Antwort oder Hinweis dankbar :wink:
Gruß Hobbes

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3 mit Adruino Nano verbinden

Beitragvon HaWe » 10. Dez 2015 19:23

ich persönlich könnte mir vorstellen, dass es theoretisch per I2C gehen könnte, aber beim EV3 würde ich nicht darauf wetten.
Du wirst schon einiges an Erfahrung brauchen, um den EV3 per Standard-Software mit dem Arduino zu verbinden.

Mit dem NXT hingegen ist es einfach und auch schon von mir erfolgreich praktiziert.
http://www.mindstormsforum.de/viewtopic.php?f=70&t=8624&p=67243#p67243

auch mit EV3/EV3Basic und Arduino habe ich ja hier schon mal was veröffentlicht:
http://www.mindstormsforum.de/viewtopic.php?f=25&t=8673#p67557

Vlt kannst du dir da ja was abgucken...
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

Re: EV3 mit Adruino Nano verbinden

Beitragvon Hobbes » 11. Dez 2015 11:15

Du wirst schon einiges an Erfahrung brauchen...


:shock: damit kann ich aber leider nicht dienen.


ich hatte gehofft, da ich ja auf der EV3 Seite nichts programmieren muss, könnte es relativ einfach sein.

Aber aufgeben will ich noch nicht. :wink:
In dem ersten Programm oben, ist ja mein Nano der Master und die beiden Sensoren die Slaves.
In dem zweiten Programm (von der Dexter Seite) ist der Arduino der Slave und der EV3 der Master.
Ob das Programm auf meinem Nano funktioniert weiß ich nicht, aber gehen wir mal davon aus.
Wenn ich jetzt beide Programme kombiniere, ist der Nano aber sowohl Master als auch Slave.
Kann das überhaupt funktionieren?

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3 mit Arduino Nano verbinden

Beitragvon HaWe » 11. Dez 2015 11:37

nein,
der EV3 muss immer Master sein,
es darf keinen anderen Master neben ihm geben,
der Rest muss also im slave-Modus laufen.

Gerade die EV3-Seite ist allerdings extrem schwierig zu programmieren, finde ich.
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

Re: EV3 mit Arduino Nano verbinden

Beitragvon Hobbes » 11. Dez 2015 13:43

OK, das bedeutet mit dem ersten Programm (incl. den eingebundenen Dateien) kann ich nichts anfangen. Die Sensorwerte kann ich so nicht auslesen, weil sie den Arduino zum Master machen. Hab ich das richtig verstanden?

Ich müsste das alles neu schreiben. Im Netz wird man wahrscheinlich nichts finden für meinen Sensor, weil immer der Arduino Master ist oder?

Schade, aber wäre auch zu schön gewesen, wenn es so einfach gewesen wäre. :(

Gruß Hobbes

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3 mit Adruino Nano verbinden

Beitragvon HaWe » 11. Dez 2015 16:03

hast du dir das nicht durchgelesen?
hier ist immer der Lego brick Master und der Arduino Slave.

Allerdings reagiert der Slave immer auf eine "OnRequest" Anfrage des Masters, und so kann er seine Sensorwerte dem Master zur Verfügung stellen.
Aber umprogrammieren musst du dein Programm, das stimmt.


HaWe hat geschrieben:ich persönlich könnte mir vorstellen, dass es theoretisch per I2C gehen könnte, aber beim EV3 würde ich nicht darauf wetten.
Du wirst schon einiges an Erfahrung brauchen, um den EV3 per Standard-Software mit dem Arduino zu verbinden.

Mit dem NXT hingegen ist es einfach und auch schon von mir erfolgreich praktiziert.
http://www.mindstormsforum.de/viewtopic.php?f=70&t=8624&p=67243#p67243

auch mit EV3/EV3Basic und Arduino habe ich ja hier schon mal was veröffentlicht:
http://www.mindstormsforum.de/viewtopic.php?f=25&t=8673#p67557

Vlt kannst du dir da ja was abgucken...
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

Re: EV3 mit Arduino Nano verbinden

Beitragvon Hobbes » 11. Dez 2015 19:27

gelesen schon..... aber wohl nicht verstanden. :roll:

Klar, ich bin absoluter Anfänger auf dem Gebiet.
Ich dachte, es wäre eine Standardaufgabe, das ein kleiner Arduino einen Sensor per I2C ausliest, ein paar Berechnungen macht und die Daten dann einem anderen, in meinem Fall dem EV3, zur Verfügung stellt. War wohl sehr naiv gedacht.

Weiß nicht ob es Sinn macht weiterzumachen. Hab ein paar Stunden im Internet gesucht, aber nix gefunden. Ich weiß ja eigentlich auch nicht, nach was ich eigentlich Suche. :-pc:
Sensordaten nicht über l2C auslesen, Arduino als Master und Slave laufen zu lassen, irgendwie die Anfragen vom EV3 direkt auf den Sensor zu bekommen. Ach... keine Ahnung! :(

Gruß und Danke
Hobbes

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3 mit Arduino Nano verbinden

Beitragvon HaWe » 11. Dez 2015 19:43

du solltest das erstmal nur mit 2 Arduinos probieren, um Erfahrung zu sammeln.
Der Master übernimmt dann die Aufgabe, die später der EV3 übernehmen soll.
Das Problem: kleine Arduinos haben nur 1x i2c, und die wird für die Verbindung untereinander gebraucht. Nur der DUE hat 2x i2c.
Aber für's Üben mit i2c wird es reichen - Arduino ist halt schon etwas komplizierter als einfach nur Lego-Sensoren anstecken, es ist eben "richtige" Mikroelektronik.
https://www.arduino.cc/en/Reference/Wire

Hier sind Beispiele über Arduino zu Arduino per i2c:

https://www.arduino.cc/en/Tutorial/MasterReader

https://www.arduino.cc/en/Tutorial/MasterWriter
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

Re: EV3 mit Arduino Nano verbinden

Beitragvon Hobbes » 13. Dez 2015 13:34

Hallo HaWe,

was hältst du davon, totaler Unfug oder könnte es in dieser Richtung funktionieren?


Code: Alles auswählen

#include <Wire.h>
#define SLAVE_ADDRESS 0x04
#define ACCEL 0x53
#define ADXL_INT_SOURCE 0x30
void setup()
{
    Wire.begin(SLAVE_ADDRESS);
    Wire.onRequest(sendData);
}
byte winkel=0;
void loop()
{
  Wire.begin();  // braucht man vielleicht nicht!!
  Wire.beginTransmission(ACCEL);
  Wire.write(ADXL_INT_SOURCE);
  Wire.endTransmission();
  Wire.requestFrom(ACCEL,1);
  winkel= Wire.read();
  Wire.begin(SLAVE_ADDRESS);//wenn es geht, muss der auch weg
  Wire.onRequest(sendData); // vielleicht auch unnötig
}

// callback for sending data
void sendData()
{
  Wire.write(winkel);
}
Zuletzt geändert von Hobbes am 13. Dez 2015 15:44, insgesamt 1-mal geändert.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3 mit Arduino Nano verbinden

Beitragvon HaWe » 13. Dez 2015 14:19

du kannst doch auf 1einzigen i2c Leitung nicht sowohl als Master die Sensoren abfragen und dann als Slave zum EV3 übertragen!
Dazu brauchst du 2 getrennte i2c Ports, das hatte ich doch geschrieben - und nur der DUE hat 2.

Das große Problem aber wird dann der EV3 selber werden - kriegst du die Programmierung mit EV3-G hin?
Ich nicht - ich habe daher EV3Basic verwendet (auch bereits verlinkt!)
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

Re: EV3 mit Arduino Nano verbinden

Beitragvon Hobbes » 13. Dez 2015 15:12

Hallo HaWe,

Man liest ja unterschiedliche Aussagen über die Möglichkeit einen Arduino im Multimasterbetrieb (Master und Slave gleichzeitig) zu betreiben. Einige sagen es ist kein Problem, selbst die Standardbibliotheken geben das her, andere sagen es ist eigentlich nur Zufall das es funktioniert, da jede Seite eigentlich macht was sie will.
Wie gesagt, ich stehe ja noch ganz am Anfang und verstehe noch nicht viel davon.
Man kann ja viele i2c über ihre Adresse gleichzeitig auslesen. Ich habe ja auch zwei Sensoren die ich auslesen. Klar, mein Arduino ist in dem Fall der Master, aber ist das wirklich wichtig?
Mit Wire.begin() arbeite ich als Master mit Wire.begin(Adresse) als Slave.
Aber beide rufen twi_init auf. Dort wird die Verbindung (i2c) initialisiert bzw. aufgebaut.
Dieser Aufbau wird aber nur einmal aufgerufen, auch wenn man viele Sensoren angeschlossen hat. Für mich sieht das so aus, dass wenn ich Wire.begin(Adresse) aufrufe, um in meinem Fall eine Verbindung mit dem EV3 aufzubauen, gleichzeitig auch die i2c Verbindung zu meinen Sensoren aufgebaut wird.
Jetzt muss ich halt irgendwie an die Daten der Sensoren kommen. Dies geht aber doch vielleicht über die Adressen. Die Verbindung ist ja da. Muss natürlich nicht funktionieren, wahrscheinlich stelle ich mir das alles wieder zu einfach vor. :roll:

Auf der EV3 Seite muss ich doch nichts machen, ich hab doch den Dexter-Block oder?
Mit EV3-G will ich natürlich später Programme schreiben, aber dann wäre der Dexter-Block ja wie jeder andere Sensor zu behandeln. Klar man müsste noch einen eigenen Block schreiben der den Dexter-Block Wert noch in einfache Variablen schreibt.

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3 mit Arduino Nano verbinden

Beitragvon HaWe » 13. Dez 2015 15:43

Multimasterbetrieb geht aber nicht mit dem EV3, das sagte ich doch auch schon:

Der EV3 hat kein Standard-I2c,
es ist gebit-bangtes Software- I2c mit nur 9,6 kbit/s im alleinigen Master-Modus (normal sind 100k-400kbit/s, master/slave umschaltbar)
er benötigt absolut ungewöhnliche Pullup-Widerstände (33k - 81k, normal sind 1,5k - 4,7k)
zusätzlich hat er (wenn ich mich recht erinnere) noch einen Widerstand in Serie auf seiner Data-Line
und nur er allein darf Master auf seinem Bus sein -
den Rest an Möglichkeiten macht dann zu guter Letzt auch noch seine Autodect-Funktion zunichte!

Da wäre es schon leichter, zu versuchen, die Sensoren direkt vom EV3 auslesen zu lassen...
(mit dem NXT und NXC würde ich mir das zutrauen, aber nicht mit diesem zu allem inkompatiblen EV3!)


Tipp:
du kannst einen anderen IMU sensor verwenden im UART-Modus, nämlich den 9DOF CMPS11 mit Kalmanfilter. (Link berichtigt)
viewtopic.php?f=78&t=8491&start=15#p67401

Dann kannst du per UART zum Arduino übertragen und per i2c (wenn du's mit EV3-G hinkriegst) weiter zum EV3.

Letzteres habe ich ja bereits (für einen anderen UART-Sensor am Arduino) mit EV3Basic gemacht (oben bereits verlinkt:
viewtopic.php?f=25&t=8673#p67709 )

Ob das mit EV3-G geht... drauf wetten würde ich nicht. :-/
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

Re: EV3 mit Arduino Nano verbinden

Beitragvon Hobbes » 13. Dez 2015 16:58

:oops: Ich habe natürlich nichts verstanden von deiner Antwort.

Ich verstehe nicht, ab wann es nicht mehr funktioniert.

Wenn ich ein Lego-Kabel durschneide, die Kabel wie auf der Dexter-Seite beschrieben mit dem Arduino verbinde und das Programm ( ohne etwas in der Loop-funktion ) starte, sollte es doch funktionieren. Auf der Ev3-G Seite nehme ich den Block und bekomme einen Wert von dem Arduino. Natürlich nicht meinen Sensor Wert. In dem Programm steht erstaunlich wenig drin. Nichts über Übertragungraten, Konstanten, Adressen oder sonst etwas. Macht das alles die EV3 Seite?

Wenn ich jetzt meinen Sensor an den Arduino zusätzlich anschließe, aber nichts am Code verändere, läuft es dann immer noch? Oder bringt der Sensor schon alles durcheinander, nur weil er angeschlossen ist?

Wenn immer noch alles läuft, welcher Aufruf in der Loop-Funktion zerstört alles.
Wire.begin() ist nicht gut, würde hier der EV3 schon meckern? Wenn ja, würde ich ja verstehen, aber vielleicht geht es ja auch ohne.
Wire.beginTransmission(Adresse) hmmm...hier schon Ende, bekommt der EV3 das mit?
Usw. usw.

Wenn du keine Lust mehr hast zu antworten, verstehe ich das. Aber vielleicht hilft es ja auch dem ein oder anderen, diese komplexe Materie besser zu verstehen.

Gruß

Benutzeravatar
HaWe
Administrator
Administrator
Beiträge: 5402
Registriert: 11. Jan 2006 21:01
Wohnort: ein kleiner Planet in der Nähe von Beteigeuze

Re: EV3 mit Arduino Nano verbinden

Beitragvon HaWe » 13. Dez 2015 17:36

Der EV3 muss Master sein, um den Arduino als Slave auszulesen, und der Arduino muss Master sein, um den Sensor auszulesen,

aber du kannst nicht gleichzeitig den EV3 als Master :-)+ am Bus betreiben und auch den Arduino als 2. Master :-)+ .

Und der Arduino kann nicht sowohl Master :-)+ sein (gegenüber dem Sensor)
als auch noch gleichzeitig Slave
:meister: gegenüber dem EV3 (der ja IMMER Master ist) .

Was ist daran so schwer zu verstehen? :roll:

Wenn du das nicht verstehst, dann musst du wohl noch ein wenig Arduino-Tutorials über I2C machen. ;)
(Gehen wird es aber danach trotzdem nicht am selben Bus. 8-) )

(so - jetzt ist es richtig schön bunt hier... :D )


edit:
wie ich gerade gelesen habe, soll für die neue Arduino-Version 1.6.6 oder Milestone 1.6.7 auch ein neuer Befehl
Wire.end()
eingeführt werden, den es bisher nicht gab.
Damit könnte es möglich werden, zwischen den Betriebsarten Master uns Slave auf dem Arduino hin- und her zu schalten (wie das dann praktisch mit den Request- und Receive-Events funktioniert, ist mir aber dann selber noch unklar).
Trotzdem wird es nach wie vor nicht funktionieren, da der Arduino niemals Master sein darf, wenn der EV3 am Bus angeschlossen ist, denn der EV3 gestattet niemals einen Multimaster-Betrieb, auch nicht kurzzeitig.
Gruß,
HaWe
±·≠≈²³αβγδε∂ζλμνπξφωΔΦ≡ΠΣΨΩ∫√∀∃∈∉∧∨¬⊂⊄∩∪∅∞®
NXT NXC SCHACHROBOTER: https://www.youtube.com/watch?v=Cv-yzuebC7E

Hobbes
Schreibt viel
Schreibt viel
Beiträge: 76
Registriert: 31. Jan 2014 11:21

Re: EV3 mit Arduino Nano verbinden

Beitragvon Hobbes » 14. Dez 2015 12:49

OK, Multimaster funktioniert dann wohl nicht. Ich brauche also einen zweiten I2c Bus.
Kann man den aber vielleicht per Software erzeugen?

Also, was hältst du davon?
http://playground.arduino.cc/Main/SoftwareI2CLibrary

Oder wieder Unfug? :lol:


Zurück zu „Projekte, Showcase, Bauanleitungen“

Wer ist online?

Mitglieder in diesem Forum: Exabot [Bot] und 8 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss