Moin Leute,
Ich will mir momentan eine Fernbedienung (Sender) mit einem Arduino Nano, und einen Empfänger mit einem Arduino Uno oder Mega oder was auch immer Bauen.
Eine One-way-Verbindung ist ja absolut kein Problem.
Allerdings will ich jetzt Daten vom Sender (Poti 0-1023) an den Empfänger übermitteln, der setzt das dann in Bewegung (Servos, DC-Motoren) um, und dann soll er noch Daten (irgendwann mal Drehzahl, und Servowinkel) zurück Senden, dass ich genau weiss, dass die Verbindung auch funktioniert.
Ich habe mir letztens ein "Pingpong" Sketch geschrieben, der auch funktioniert.
Ping
#include <SPI.h>
#include <RF24.h>
#include <LiquidCrystal_I2C.h>
RF24 radio(8, 7);
static const uint64_t pipes[6] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL};
//byte ClientNummer = 1; // Mögliche Werte: 1-6
int poti1Val = 1;
int poti2Val;
int beep = 3;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
lcd.begin();
pinMode(beep, OUTPUT);
Serial.begin(9600);
radio.begin();
delay(20);
radio.setChannel(110); // Funkkanal - Mögliche Werte: 0 - 127
radio.setAutoAck(0);
radio.setRetries(15, 0);
radio.setPALevel(RF24_PA_LOW); // Sendestärke darf die gesetzlichen Vorgaben des jeweiligen Landes nicht überschreiten!
// RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1, pipes[1]);
radio.startListening();
lcd.backlight();
delay(20);
}
void loop()
{
transmit();
recieve();
}
void transmit()
{
long message[8] = {int(poti1Val)};
radio.stopListening();
radio.write(&message, sizeof(message));
Serial.print("Sent: ");
Serial.println(poti1Val);
radio.startListening();
delay(50);
}
void recieve()
{
if (radio.available()) {
long got_message[8] = {0, 0, 0, 0, 0, 0, 0, 0};
bool done = false;
while (!done) {
done = radio.read(&got_message, sizeof(got_message));
}
poti2Val = got_message[0];
if (poti2Val == 1)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connection ok");
delay(100);
digitalWrite(beep, HIGH);
delay(100);
digitalWrite(beep, LOW);
delay(100);
Serial.print("Recieved: ");
Serial.println(poti2Val);
poti2Val = 0;
}
}
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No connection");
digitalWrite(beep, HIGH);
delay(1000);
digitalWrite(beep, LOW);
}
}
Pong
#include <SPI.h>
#include <RF24.h>
RF24 radio(8, 7);
static const uint64_t pipes[6] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL};
int poti1Val;
int poti2Val = 1;
void setup() {
radio.begin();
delay(20);
radio.setChannel(110); // Funkkanal - Mögliche Werte: 0 - 127
radio.setAutoAck(0);
radio.setPALevel(RF24_PA_LOW); // Sendestärke darf die gesetzlichen Vorgaben des jeweiligen Landes nicht überschreiten!
// RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1, pipes[0]);
radio.startListening();
delay(20);
Serial.begin(9600);
}
void loop()
{
recieve();
}
void recieve()
{
if (radio.available()) {
long got_message[8] = {0, 0, 0, 0, 0, 0, 0, 0};
bool done = false;
while (!done) {
done = radio.read(&got_message, sizeof(got_message));
}
poti1Val = got_message[0];
Serial.print("Recieved: ");
Serial.println(poti1Val);
if (poti1Val == 1)
{
transmit();
}
}
}
void transmit()
{
long message[8] = {int(poti2Val)};
radio.stopListening();
radio.write(&message, sizeof(message));
Serial.print("Sent beep: ");
Serial.println(poti2Val);
radio.startListening();
}
Allerdings wenn ich das jetzt auf die Fernbedienung übertragen will, funktioniert es garnicht mehr.
Ich glaube, und denke, es liegt natürlich am "radio.stop/startListening" und die Zeiten dazwischen.
Also wenn ich jetzt was hin sende, fängt er sofort an zu hören, aber da kommt noch nichts, weil der Empfänger evtl mit 1ms verzögerung zurück sendet, und der Sender dann wieder bei "stopListening" ist.
Ich habe keine ahnung, wie ich die 2 Arduinos abstimmen kann, dass der Sender auf die Antwort vom Empfänger wartet, aber die Steuerung dennoch reibungslos funktionieren soll.
Ich glaube bei meinem Pingpong ist das eher zufall, dass es funktioniert.
Ich habe im Netz schon diverse sachen gelesen, hab auch bezüglich writeAckPayload() sachen gelesen.
Allerdings verstehe ich es nicht.
Ich hoffe mir kann hier jemand helfen.