Hallo,
kann mir jemand sagen, wie ich vier identische GY-521 Module (MPU6050 Sensor) mit einen ESP32 ansteuern kann?
Auf der folgenden Webseite ist beschrieben, wie mehrere Module über eine I2C Verbindung angesteuert werden können.
Meine Idee wäre:
Zwei GY-521 Module an die I2C-Pins 22/21 mit verschiedenen Registeradressen (0x68 u. 0x69) und zwei GY-521 Module an die I2C-Pins 16/17 mit verschiedenen Registeradressen (0x68 u. 0x69) an den ESP32 anzuschließen.
Leider weiß ich nicht wie ich das ein einem Sketch realisieren soll...
Das mindeste was du tun kannst ist hier im Forum einen Sketch für einen oder zwei GY-521 module posten
und eine Vermutung dazuschreiben wie es gehen könnte.
Vielen Danke für eure Hilfen!
Ich habe jetzt einen Sketch geschrieben der zwei Sensoren auslesen soll.
Beide sind über Pin 21/22 angeschlossen.
Der erste Sensor hat die Ardesse 0x68 und der zweite 0x69 (hier VCC an AD0).
#include <Wire.h>
#define SDA1 21
#define SCL1 22
#define SDA2 17
#define SCL2 16
TwoWire I2COne = TwoWire(0);
TwoWire I2CTwo = TwoWire(1);
int16_t accXOne, accYOne, accZOne;
int16_t tempOne;
int16_t gyrXOne, gyrYOne, gyrZOne;
int16_t accXTwo, accYTwo, accZTwo;
int16_t tempTwo;
int16_t gyrXTwo, gyrYTwo, gyrZTwo;
unsigned long setMillis1;
int timeDelayPrint = 100;
void read11() {
I2COne.beginTransmission(0x68);
I2COne.write(0x3B); // ACCEL_XOUT_H
I2COne.endTransmission(false);
I2COne.requestFrom(0x68, 7*2, true);
accXOne = Wire.read()<<8 | Wire.read(); //0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
accYOne = Wire.read()<<8 | Wire.read(); //0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
accZOne = Wire.read()<<8 | Wire.read(); //0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)
tempOne = Wire.read()<<8 | Wire.read(); // 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)
gyrXOne = Wire.read()<<8 | Wire.read(); // 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)
gyrYOne = Wire.read()<<8 | Wire.read(); // 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)
gyrZOne = Wire.read()<<8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)
}
void read12() {
I2COne.beginTransmission(0x69);
I2COne.write(0x3B); // ACCEL_XOUT_H
I2COne.endTransmission(false);
I2COne.requestFrom(0x68, 7*2, true);
accXTwo = Wire.read()<<8 | Wire.read(); //0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
accYTwo = Wire.read()<<8 | Wire.read(); //0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
accZTwo = Wire.read()<<8 | Wire.read(); //0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)
tempTwo = Wire.read()<<8 | Wire.read(); // 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)
gyrXTwo = Wire.read()<<8 | Wire.read(); // 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)
gyrYTwo = Wire.read()<<8 | Wire.read(); // 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)
gyrZTwo = Wire.read()<<8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)
}
void setup() {
Serial.begin(115200);
I2COne.begin(SDA1,SCL1,400000);
//I2CTwo.begin(SDA2,SCL2,400000);
}
void loop() {
read11();
read12();
if ((millis() - setMillis1) >= timeDelayPrint) {
Serial.print("accXOne: "); Serial.print(accXOne); Serial.print("\t");
Serial.print("accYOne: "); Serial.print(accYOne); Serial.print("\t");
Serial.print("accZOne: "); Serial.print(accZOne); Serial.print("\t");
Serial.print("temperatureOne: "); Serial.print(tempOne); Serial.print("\t");
Serial.print("gyrXOne: "); Serial.print(gyrXOne); Serial.print("\t");
Serial.print("gyrYOne: "); Serial.print(gyrYOne); Serial.print("\t");
Serial.print("gyrZOne: "); Serial.print(gyrZOne); Serial.print("\t");
Serial.print("\r\n");
Serial.print("accXTwo: "); Serial.print(accXTwo); Serial.print("\t");
Serial.print("accYTwo: "); Serial.print(accYTwo); Serial.print("\t");
Serial.print("accZTwo: "); Serial.print(accZTwo); Serial.print("\t");
Serial.print("temperatureTwo: "); Serial.print(tempTwo); Serial.print("\t");
Serial.print("gyrXTwo: "); Serial.print(gyrXTwo); Serial.print("\t");
Serial.print("gyrYTwo: "); Serial.print(gyrYTwo); Serial.print("\t");
Serial.print("gyrZTwo: "); Serial.print(gyrZTwo); Serial.print("\t");
Serial.print("\r\n");
setMillis1 = millis();
}
}
Irgendwas scheint hier aber nicht zu stimmen, da immer "-1" ausgegeben wird.
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
accXOne: -1 accYOne: -1 accZOne: -1 temperatureOne: -1 gyrXOne: -1 gyrYOne: -1 gyrZOne: -1
accXTwo: -1 accYTwo: -1 accZTwo: -1 temperatureTwo: -1 gyrXTwo: -1 gyrYTwo: -1 gyrZTwo: -1
Habt ihr eine Idee was ich falsch mache und wie ich es richtig machen kann?
Ergebnis des I2C Scanners:
Scanning I2C Addresses Channel 1
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. 68 69 .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Scan Completed, 2 I2C Devices found.
Scanning I2C Addresses Channel 2
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
.. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
Scan Completed, 0 I2C Devices found.
Folgernder Sketch gibt die Werte des ersten Sensors aus:
#include "Wire.h"
int16_t accXOne, accYOne, accZOne;
int16_t tempOne;
int16_t gyrXOne, gyrYOne, gyrZOne;
unsigned long setMillis1;
int timeDelayPrint = 100;
void setup() {
Serial.begin(115200);
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
}
void loop() {
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 7*2, true);
accXOne = Wire.read()<<8 | Wire.read(); //0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
accYOne = Wire.read()<<8 | Wire.read(); //0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
accZOne = Wire.read()<<8 | Wire.read(); //0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)
tempOne = Wire.read()<<8 | Wire.read(); // 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)
gyrXOne = Wire.read()<<8 | Wire.read(); // 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)
gyrYOne = Wire.read()<<8 | Wire.read(); // 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)
gyrZOne = Wire.read()<<8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)
if ((millis() - setMillis1) >= timeDelayPrint) {
Serial.print("accXOne: "); Serial.print(accXOne); Serial.print("\t");
Serial.print("accYOne: "); Serial.print(accYOne); Serial.print("\t");
Serial.print("accZOne: "); Serial.print(accZOne); Serial.print("\t");
Serial.print("temperatureOne: "); Serial.print(tempOne); Serial.print("\t");
Serial.print("gyrXOne: "); Serial.print(gyrXOne); Serial.print("\t");
Serial.print("gyrYOne: "); Serial.print(gyrYOne); Serial.print("\t");
Serial.print("gyrZOne: "); Serial.print(gyrZOne); Serial.print("\t");
Serial.print("\r\n");
setMillis1 = millis();
}
}
Serial Monitor:
accXOne: -776 accYOne: -136 accZOne: 17052 temperatureOne: -2768 gyrXOne: -354 gyrYOne: 164 gyrZOne: -100
accXOne: -688 accYOne: -156 accZOne: 17032 temperatureOne: -2736 gyrXOne: -338 gyrYOne: 118 gyrZOne: -127
accXOne: -736 accYOne: -88 accZOne: 16968 temperatureOne: -2800 gyrXOne: -336 gyrYOne: 147 gyrZOne: -141
accXOne: -772 accYOne: -124 accZOne: 16968 temperatureOne: -2800 gyrXOne: -334 gyrYOne: 150 gyrZOne: -124
accXOne: -780 accYOne: -116 accZOne: 17044 temperatureOne: -2800 gyrXOne: -343 gyrYOne: 141 gyrZOne: -149
accXOne: -780 accYOne: -132 accZOne: 16928 temperatureOne: -2784 gyrXOne: -354 gyrYOne: 127 gyrZOne: -154
accXOne: -668 accYOne: -116 accZOne: 17004 temperatureOne: -2752 gyrXOne: -327 gyrYOne: 143 gyrZOne: -139
accXOne: -796 accYOne: -32 accZOne: 17036 temperatureOne: -2784 gyrXOne: -350 gyrYOne: 156 gyrZOne: -149
accXOne: -664 accYOne: -160 accZOne: 17064 temperatureOne: -2752 gyrXOne: -353 gyrYOne: 172 gyrZOne: -123
accXOne: -648 accYOne: -184 accZOne: 16860 temperatureOne: -2768 gyrXOne: -353 gyrYOne: 156 gyrZOne: -149
accXOne: -748 accYOne: -196 accZOne: 16932 temperatureOne: -2800 gyrXOne: -343 gyrYOne: 172 gyrZOne: -145
accXOne: -664 accYOne: -68 accZOne: 16972 temperatureOne: -2768 gyrXOne: -354 gyrYOne: 156 gyrZOne: -119
accXOne: -680 accYOne: -128 accZOne: 17124 temperatureOne: -2768 gyrXOne: -364 gyrYOne: 156 gyrZOne: -133
accXOne: -704 accYOne: -168 accZOne: 17140 temperatureOne: -2784 gyrXOne: -352 gyrYOne: 136 gyrZOne: -132
accXOne: -684 accYOne: -88 accZOne: 16904 temperatureOne: -2752 gyrXOne: -342 gyrYOne: 139 gyrZOne: -130
accXOne: -804 accYOne: -220 accZOne: 17184 temperatureOne: -2752 gyrXOne: -342 gyrYOne: 152 gyrZOne: -126
accXOne: -700 accYOne: -100 accZOne: 16928 temperatureOne: -2752 gyrXOne: -330 gyrYOne: 141 gyrZOne: -116
accXOne: -784 accYOne: -144 accZOne: 17036 temperatureOne: -2752 gyrXOne: -344 gyrYOne: 131 gyrZOne: -149
accXOne: -612 accYOne: -192 accZOne: 16980 temperatureOne: -2752 gyrXOne: -340 gyrYOne: 140 gyrZOne: -155
accXOne: -684 accYOne: -204 accZOne: 16940 temperatureOne: -2752 gyrXOne: -341 gyrYOne: 126 gyrZOne: -131
accXOne: -692 accYOne: -168 accZOne: 16856 temperatureOne: -2784 gyrXOne: -363 gyrYOne: 146 gyrZOne: -151
accXOne: -752 accYOne: -172 accZOne: 17092 temperatureOne: -2784 gyrXOne: -341 gyrYOne: 132 gyrZOne: -125
accXOne: -728 accYOne: -236 accZOne: 16968 temperatureOne: -2784 gyrXOne: -355 gyrYOne: 123 gyrZOne: -145
accXOne: -764 accYOne: -156 accZOne: 17024 temperatureOne: -2784 gyrXOne: -339 gyrYOne: 167 gyrZOne: -137
accXOne: -656 accYOne: -108 accZOne: 17044 temperatureOne: -2752 gyrXOne: -343 gyrYOne: 169 gyrZOne: -111
accXOne: -752 accYOne: -156 accZOne: 17048 temperatureOne: -2752 gyrXOne: -348 gyrYOne: 141 gyrZOne: -122
Step1: I2C Scanner laden und schauen, ob die Geräte Adressen ansprechbar sind.
Step2: Einen Sensor auslesen
Step3: Zwei Sensoren auslesen
Step4: Vier Sensor auslesen
Step 3:
#include "Wire.h"
int16_t accXOne, accYOne, accZOne;
int16_t tempOne;
int16_t gyrXOne, gyrYOne, gyrZOne;
int16_t accXTwo, accYTwo, accZTwo;
int16_t tempTwo;
int16_t gyrXTwo, gyrYTwo, gyrZTwo;
unsigned long setMillis1;
int timeDelayPrint = 100;
void setup() {
Serial.begin(115200);
}
void loop() {
Wire.begin();
Wire.beginTransmission(0x68);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Wire.beginTransmission(0x68);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(0x68, 7*2, true);
accXOne = Wire.read()<<8 | Wire.read(); //0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
accYOne = Wire.read()<<8 | Wire.read(); //0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
accZOne = Wire.read()<<8 | Wire.read(); //0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)
tempOne = Wire.read()<<8 | Wire.read(); // 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)
gyrXOne = Wire.read()<<8 | Wire.read(); // 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)
gyrYOne = Wire.read()<<8 | Wire.read(); // 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)
gyrZOne = Wire.read()<<8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)
Wire.begin();
Wire.beginTransmission(0x69);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Wire.beginTransmission(0x69);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(0x69, 7*2, true);
accXTwo = Wire.read()<<8 | Wire.read(); //0x3B (ACCEL_XOUT_H) and 0x3C (ACCEL_XOUT_L)
accYTwo = Wire.read()<<8 | Wire.read(); //0x3D (ACCEL_YOUT_H) and 0x3E (ACCEL_YOUT_L)
accZTwo = Wire.read()<<8 | Wire.read(); //0x3F (ACCEL_ZOUT_H) and 0x40 (ACCEL_ZOUT_L)
tempTwo = Wire.read()<<8 | Wire.read(); // 0x41 (TEMP_OUT_H) and 0x42 (TEMP_OUT_L)
gyrXTwo = Wire.read()<<8 | Wire.read(); // 0x43 (GYRO_XOUT_H) and 0x44 (GYRO_XOUT_L)
gyrYTwo = Wire.read()<<8 | Wire.read(); // 0x45 (GYRO_YOUT_H) and 0x46 (GYRO_YOUT_L)
gyrZTwo = Wire.read()<<8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) and 0x48 (GYRO_ZOUT_L)
if ((millis() - setMillis1) >= timeDelayPrint) {
Serial.print("accXOne: "); Serial.print(accXOne); Serial.print("\t");
Serial.print("accYOne: "); Serial.print(accYOne); Serial.print("\t");
Serial.print("accZOne: "); Serial.print(accZOne); Serial.print("\t");
Serial.print("temperatureOne: "); Serial.print(tempOne); Serial.print("\t");
Serial.print("gyrXOne: "); Serial.print(gyrXOne); Serial.print("\t");
Serial.print("gyrYOne: "); Serial.print(gyrYOne); Serial.print("\t");
Serial.print("gyrZOne: "); Serial.print(gyrZOne); Serial.print("\t");
Serial.print("\r\n");
Serial.print("accXTwo: "); Serial.print(accXTwo); Serial.print("\t");
Serial.print("accYTwo: "); Serial.print(accYTwo); Serial.print("\t");
Serial.print("accZTwo: "); Serial.print(accZTwo); Serial.print("\t");
Serial.print("temperatureTwo: "); Serial.print(tempTwo); Serial.print("\t");
Serial.print("gyrXTwo: "); Serial.print(gyrXTwo); Serial.print("\t");
Serial.print("gyrYTwo: "); Serial.print(gyrYTwo); Serial.print("\t");
Serial.print("gyrZTwo: "); Serial.print(gyrZOne); Serial.print("\t");
Serial.print("\r\n");
setMillis1 = millis();
}
}
Serial Monitor:
accXOne: -728 accYOne: -180 accZOne: 17140 temperatureOne: -2656 gyrXOne: -349 gyrYOne: 133 gyrZOne: -114
accXTwo: 392 accYTwo: -56 accZTwo: 16160 temperatureTwo: -976 gyrXTwo: -31 gyrYTwo: -217 gyrZTwo: -114
accXOne: -664 accYOne: -156 accZOne: 16876 temperatureOne: -2672 gyrXOne: -327 gyrYOne: 170 gyrZOne: -125
accXTwo: 384 accYTwo: -48 accZTwo: 16360 temperatureTwo: -976 gyrXTwo: -32 gyrYTwo: -205 gyrZTwo: -125
accXOne: -736 accYOne: -60 accZOne: 17028 temperatureOne: -2656 gyrXOne: -335 gyrYOne: 158 gyrZOne: -141
accXTwo: 308 accYTwo: -76 accZTwo: 16196 temperatureTwo: -992 gyrXTwo: -51 gyrYTwo: -185 gyrZTwo: -141
accXOne: -600 accYOne: -120 accZOne: 17024 temperatureOne: -2656 gyrXOne: -334 gyrYOne: 149 gyrZOne: -130
accXTwo: 352 accYTwo: 60 accZTwo: 16312 temperatureTwo: -976 gyrXTwo: -40 gyrYTwo: -197 gyrZTwo: -130
accXOne: -640 accYOne: -140 accZOne: 17108 temperatureOne: -2688 gyrXOne: -337 gyrYOne: 159 gyrZOne: -153
accXTwo: 276 accYTwo: 80 accZTwo: 16340 temperatureTwo: -960 gyrXTwo: -21 gyrYTwo: -196 gyrZTwo: -153
accXOne: -692 accYOne: -212 accZOne: 16988 temperatureOne: -2688 gyrXOne: -357 gyrYOne: 134 gyrZOne: -120
accXTwo: 280 accYTwo: -96 accZTwo: 16188 temperatureTwo: -912 gyrXTwo: -29 gyrYTwo: -205 gyrZTwo: -120
accXOne: -632 accYOne: -88 accZOne: 17012 temperatureOne: -2672 gyrXOne: -353 gyrYOne: 153 gyrZOne: -115
accXTwo: 244 accYTwo: -76 accZTwo: 16208 temperatureTwo: -944 gyrXTwo: -45 gyrYTwo: -205 gyrZTwo: -115
Habe es jetzt hinbekommen!
Vielen Dank für die Hilfe!
Und danach wäre es schön, wenn Du den funktionierenden Sketch hier vorstellst.
Gruß Tommy