Hallo Leute,
ich stecke bei meinem aktuellen Projekt fest. Ich habe schon einiges ausprobiert komme aber nicht weiter. Die Kommunikation einzeln ist nicht das Problem Master (Teensy3.2) / Slave (Arduino Micro) habe ich alles schon am laufen. Nur hängt es jetzt an entscheidender Stelle.
Der Master und Slave sind exakt den Beispielen MasterWriter und MasterReader nachempfunden.
Ich baue einen 2 Achsen Kamera Slider. Dazu gibt es einen Arduino "Master" welcher Befehle ab den Arduino "Slave" schickt. Am Slave ist der Treiber für einen Stepper angeschlossen. Nun möchte ich das der Master per Befehlt an den Slave dessen Stepper auf Home Position fährt. Das funktioniert.
Aufruf am Master:
void SendCommandSlave2(char Command){
Wire.beginTransmission(I2C_Slave2Address); // transmit to device #9
Wire.write(Command); // sends one byte
Wire.endTransmission(); // stop transmitting
}
Code im Slave:
void ReceiveCommandEvent(int howMany) {
while (Wire.available()){ // Enter this loop only when Data are available
char Command = Wire.read(); // receive byte as a character
if(Command == 'Z'){HomeStepperPAN();}
}
Ist der Slave nun in der Funktion HomeStepperPAN() ist dieser komplett damit beschäftigt diese Aufgabe zu erfüllen ()er rattert die Schritte an den Stepper Driver durch.
Nachdem der Master den Befehl an den Slave geschickt hat das dieser den Stepper in Home Position bringen soll, will ich natürlich wissen wann das der Fall ist.
So pollt der Master den Slave mit:
char GetHomeStatusPANStepper(){
Wire.requestFrom(I2C_Slave2Address, 1); // request 1 bytes from slave device #9
char c = 'X';
while (Wire.available()) { // slave may send less than requested
c = Wire.read(); // receive a byte as character
if(c == 'X'){Serial.println("Homing in progress...");}
else if (c == 'Z'){Serial.println("Homing finished!");}
}
return c;
}
Der Slave Antwortet mit dieser Funktion:
void requestEvent() {
Wire.write(PANHomingStatus); // respond with message of 1 bytes as expected by master 'X' = Homing in progress... / 'Z' = Homing done
}
Der Code funktioniert solange der Slave nicht in der while Schleife für das Homing vom Stepper ist. Also wenn der Master erst nachfragt wenn der Slave soweit ist. Das ist aber nicht sinn der Sache da der Master ja so eine fixe Zeit warten muss. Frägt der Master aber den Request beim Slave an wenn dieser noch in der while Schleife für das Homing ist, erhält er vom Slave keine Daten (Wire.available).
Ich denke das Problem ist das der Master beim Slave per Request Daten anfordert wenn dieser auf den Request nicht reagieren kann. Kann er dann reagieren sendet er aber nichts mehr zurück. Warum genau weiß ich noch nicht. Da hoffe ich auf eure Hilfe. Ich kann euch leider nicht den ganzen Code schicken da das Projekt sehr sehr groß ist.
Danke und Grüsse
Chris