Kommunikation zwischen zwei Arduinos
Ziel: LEDs auszulösen, indem von dem Arduino Mega Signale in Bytes gesendet werden.
Material:
- Arduino Mega2560
- Arduino Uno
- 2 LEDs
- mehrere Steckverbinder
Aufbau:
Code (mit Erläuterungen):
Arduino Mega2560 (welcher der Master ist, sprich der die Signale weitergibt und auch an dem PC angeschlossen ist)
int ledPin = 13;
int board; // 1 = Uno. 2 = Mega.
int on_off; // 1 = An. 0 = Aus.
int rec;
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.flush();
Serial1.flush();
}
void loop() {
//Benutzereingabe
Serial.println("Uno = 1 / Mega = 0: "); //Das Board auswählen
while(Serial.available() == 0)
{
}
board = Serial.parseInt(); //Liest Benutzereingabe
Serial.println("LED An = 1 / Aus = 0: ");
while(Serial.available() == 0)
{
}
on_off = Serial.parseInt();
switch(board)
{
//Wenn Mega Board ...
case 0:
if(on_off == 1) digitalWrite(ledPin, HIGH); //Uno LED An
else digitalWrite(ledPin, LOW); //Uno LED Aus
break; //Case beenden
//Wenn Uno Board ...
case 1:
Serial1.write(on_off/256); //Sende den Quotient oder "Wie oft" Wert.
Serial1.write(on_off%256); //Sende den Modulo oder Rest.
delay(50); //Warte auf Seriellen Port
while(Serial1.available()<2) //Warte auf 2 bytes
{
//Mach nichts
}
byte b1 = Serial1.read();
byte b2 = Serial1.read();
rec = (b1*256)+b2; //Byte Rechnung
if (rec == 2)
{
Serial.println("Vorgang abgeschlossen -> LED leuchtet!");
}
break; //Case beenden
}
}
Für den Arduino Uno (welcher der Client ist, sprich die Befehle vom Mega ausführt oder Bytes and diesen gibt)
int ledPin = 13;
int rec;
int Ack_tx = 2; //Bytes
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
while(Serial.available()<2) //Warte auf 2 Bytes
{
//Mach nichts
}
byte b1 = Serial.read(); //Lies oberen Byte
byte b2 = Serial.read(); //Lies unteren Byte
rec = (b1*256)+b2; //Kombiniere beide Bytes
if(rec == 1) digitalWrite(ledPin, HIGH); //Uno LED An
else digitalWrite(ledPin, LOW); //Uno LED Aus
Serial.write(Ack_tx/256); //Sende den Quotient oder "Wie oft" Wert.
Serial.write(Ack_tx%256); //Sende den Modulo oder Rest.
delay(50); //Warte auf Seriellen Port
}
Erstellt: Onur Iren (08.11.2016)
Letzte Änderung: Jacob Busshart (28.06.2017)