Guten Tag zusammen,
ich will mit zwei Arduinos und zwei NRF24L01+ eine bidirektionale
Funkübertragung realisieren. Für den Arduino und das Funkmodul gibt es
schon folgende Funktionen:
http://tmrh20.github.io/RF24/classRF24.html
Die einseitige Übertragung funktioniert auch bereits. Allerdings schaffe
ich es nicht, dass ein Modul "gleichzeitig" senden UND empfangen soll.
Kann mir bitte jemand weiterhelfen?
Ist es vielleicht möglich, dass mit verschiedenen Kanälen zu machen?
Habe noch nicht ganz verstande, was es damit auf sich hat.
Das funktioniert nicht. Der Chip kann zur gleichen Zeit entweder senden
oder empfangen. Du könntest dir ein zweites Funkmodul hernehmen um auf
zwei Frequenzen zu funken. Aber brauchst du wirklich Full-Duplex?
Ich brauche nicht unbedingt full-duplex, also das gleichzeitige Senden
und Empfangen von Daten. Aber ich würde gerne umschalten können,
zwischen senden und empfangen.
Die Funkmodule sind in einer Fernsteuerung und in einem Fahrzeug. Ich
möchte die meiste Zeit mit der Fernsteuerung die Befehle versenden. Aber
wenn ich eine bestimmte Taste drücke, dann soll die Akkuspannung vom
Fahrzeug an die Fernsteuerung gesendet werden.
Nobody schrieb:> Das geht doch alles....> Die haben doch extra 6 Rohre, um miteinander quatschen zu können.
Aber wie lege ich fest, über welche pipe die miteinander kommunzieren
sollen? Bei den Befehlen radio.write und radio.read kann ich leider
nicht die pipe auswählen.
So ist es für das Breadboard:
---------------------------------------
role_e role = role_ping_out; // Breadboard
//role_e role = role_pong_back; // Roboter
---------------------------------------
Und so für den Roboter:
---------------------------------------
//role_e role = role_ping_out; // Breadboard
role_e role = role_pong_back; // Roboter
---------------------------------------
Für beide das selbe Programm.
Gruss
Ich werde es mal ausprobieren.
Aber mit meinem Code funktioniert es auch, wenn ich den Modus in dem
Code festlege.
Aber wenn ich den Modus per Tastenabfrage festlage, dann gibt es ja eine
kleine Zeitspanne, in welcher beide senden/ empfangen. Das ist glaub das
Problem, denn das hängt er sich meistens auf.
Hallo allerseits,
ich würde da eine völlig anderen Ansatz verfolgen. Wenn Du auf dem
Rückkanal keine Echtzeit brauchst, kannst Du Dir die ganze Umschalterei
sparen. Schau Dir mal die Funktionen EnableAutoAcknowledge in Verbindung
mit EnableAcknowledgePayload an. Du hast die Möglichkeit, bei jedem
Datentransfer vom Sender zum Empfänger mit dem AutoAcknowledge, das im
Hintergrund automatisch geschieht, 32 Byte zurückzusenden, ohne dabei
selbst aktiv die Sende-Empfangsrichtung umzuschalten.
Damit kannst Du sogar weit mehr als nur die Akkuspannung messen, das ist
die leichteste Übung. Du brauchst nur im Empfänger im entsprechenden
Register die Akkuspannung regelmäßig zu aktualisieren, bei jedem
Steuerbefehl den du sendest kommt der dann automatisch zurück, den mußt
Du im Sender dann nur noch auslesen und auswerten.
Gruß wv
wv schrieb:> Schau Dir mal die Funktionen EnableAutoAcknowledge in Verbindung> mit EnableAcknowledgePayload an. Du hast die Möglichkeit, bei jedem> Datentransfer vom Sender zum Empfänger mit dem AutoAcknowledge, das im> Hintergrund automatisch geschieht, 32 Byte zurückzusenden, ohne dabei> selbst aktiv die Sende-Empfangsrichtung umzuschalten.
Hallo,
meinst du die Funktionen enableAckPayload und setAutoAck ?
Ich verstehe noch nicht ganz wie das funktionieren soll. Zunächst muss
ich diese Funktion aktivieren und dann sendet es immer automatisch die
32 Byte zurück? Kann ich aber auch bestimmen, was mir zurückgeschickt
wird? Und wie kann ich diese 32 Byte auslesen?
mompf schrieb:> Zunächst muss> ich diese Funktion aktivieren
Ja
> und dann sendet es immer automatisch die> 32 Byte zurück?
So ist es. Und das Hin und Her wird so oft ausgeführt, bis beide Seiten
zufrieden sind oder max Versuche vergangen sind.
> Kann ich aber auch bestimmen, was mir zurückgeschickt> wird?
Anders würde es keinen Sinn machen.
> Und wie kann ich diese 32 Byte auslesen?
In der RxPipe0
Da Datenblatt sagt dir alles. Fang mal mit der Register Beschreibung an
(Stichwort AutoAck) und sieh dir die Befehlsliste an. Ich kenne die
Arduino Lib nicht, fürchte aber, dass diese Funktionalität nicht drin
ist. Da wirst du wohl selbst Hand anlegen müssen.