Forum: Mikrocontroller und Digitale Elektronik Arduino: NRF24L01 2.4Ghz maniacbug Library


von Christian J. (Gast)


Lesenswert?

Hallo,

ich frage erstmal, ob sich jemand mit dieser Library und den Nordic 
RF24L01 Modulen gut auskennt, also wirklich selbst damit etwas gemacht 
hat und auch die Auto ACK Funktion dabei benutzt?

Falls ja, formuliere ich mein Problem dann hier ausführlich.

Gruss,
Christian

von Ulrich F. (Gast)


Lesenswert?

Super !
--------

Bitte bitte nenne uns dein Problem.
Lass uns, willige Helfer, nicht verhungern...


----------
Übrigens, warum ließt du nicht das Datenblatt?
Da steht drin, dass die default Timeouts für den 256kBit Betrieb nicht 
reichen. Da kanns also mit deinen ACK Paketen nix werden.
Also hoch mit den Timeout/Retry


---------
Mindestens 10µF ELko ans Modul löten. Ein kleiner Kerko ist schon drauf.

von Christian J. (Gast)


Lesenswert?

Ulrich F. schrieb:
> Bitte bitte nenne uns dein Problem.
> Lass uns, willige Helfer, nicht verhungern...

>>Übrigens, warum ließt du nicht das Datenblatt?

Weil mir selbst dann manches noch nicht klar ist, was aber auch an 
meinem 80% Englisch liegen kann. Wenn alle Datenblätter verstehen würden 
wäre dieses Forum leer, steht ja alles da drin....

Prima :-)

Ich habe eine Funkstrecke derzeit zwischen einem STM32F4 System und 
einem Arduino aufgebaut. Funzt soweit, hängt aber manchmal.

Es geht mir um diese Library von "maniacbug"

Was ich will:

1. Arduino sendet Datenpaket Richtung STM32
2. STM32 bestätigt mit Auto-ACK
3. Arduino sendet maximal 10 Mal, 1000uS Delay

Wie kriege ich mit der maniacbug Lib raus, ob das Paket wirklich 
empfangen wurde, also ein ACK kam? Da steht nur was von write, 
writeStart, WriteBlocking usw.

also

radio.write(&data, sizeof(data),0);

Und nun? Warten? Was abfragen?



Hat da mal jemand Code?

PS: Ab und zu hängt sich der Empfänger auf, behauptet dass Datenpakete 
da wären, obwohl keine mehr kommen. Seltsam, da scheint sich ein Flag 
nicht zurück zu setzen.

von Ulrich F. (Gast)


Lesenswert?


von Christian J. (Gast)


Lesenswert?

Ulrich F. schrieb:
> Dieses Beispiel kennst du schon:
> 
https://github.com/maniacbug/RF24/blob/master/examples/pingpair_pl/pingpair_pl.pde
> ?

Here, a payload is set to the transmitter within  * the Ack packet of 
each transmission.

Nee, aber ich suche ein Beispiel, wo ein "Auto ACK" gesendet wird.m Das 
hier ist ja eines, wo eine vordefinierte Paypload als ACK gesendet wird, 
quasi so wie eine SPI über die Luft.

Es gibt doch sicher ein ACK, was der Chip allein erzeugt.

Oder sehe ich das was falsch?

von Dieter F. (Gast)


Lesenswert?

Kennst Du diesen Text?

The next register is EN_AA, or the enable auto-ack register. This 
register allows you to enable or disable auto-acknowledgements on a 
per-pipe basis.  If you are at all familiar with TCP, you know what 
acknowledgements are.  Essentially, the transmitting 24L01 will send a 
packet and then switch momentarily for a receiver.  If the receiving
24L01 gets the packet, it will send back an acknowledgement. If the 
transmitting 24L01 gets the acknowledgement, it changes back to a 
transmitter and all is happy. If the transmitting 24L01 doesn’t get the 
acknowledgement back in the specified window, it sends the packet again 
and waits for an ack. It will do this the number of times all owed
in the SETUP_RETR register for the pipe being used, and then if no 
acknowledgement is received it will assert the MAX_RT interrupt. This is 
an extremely useful feature and I would recommend using it if possible. 
One caveat is that you must have the receive address of pipe 0 be the 
same as the transmit address if you have auto-ack enabled on the pipe 
you’re sending data to/from (see p.14 of the datasheet).

Ich habe das noch nicht ausprobiert, aber da ich aktuell auch mit diesen 
Modulen beschäftigt bin werde ich am Wochenende mal rumspielen :-)

von Christian J. (Gast)


Lesenswert?

Dieter F. schrieb:
> One caveat is that you must have the receive address of pipe 0 be the
> same as the transmit address if you have auto-ack enabled on the pipe
> you’re sending data to/from (see p.14 of the datasheet).

Hmmmm... bisher habe ich

MYADRESS = 0x0707070707LL
TXADRESS = 0xe7e7e7e7e7LL

da ich nicht genau weiss, wie die Ablage eines 64Bit uint_64 im Speicher 
ist, Big Endian, Little Endian etc.

Heisst das, dass diese beiden Adressen gleich sein müssen? Das düngt 
mich seltsam, denn bisher waren die bei Sender und Empfänger einfach nur 
verdreht.

> Ich habe das noch nicht ausprobiert, aber da ich aktuell auch mit diesen
> Modulen beschäftigt bin werde ich am Wochenende mal rumspielen :-)

Dann guck mal, ob bei Dir auch das FIFO Full Bit kleben bleibt. Bei mir 
ab und zu :-(

von Ulrich F. (Gast)


Lesenswert?

Christian J. schrieb:
> Nee, aber ich suche ein Beispiel, wo ein "Auto ACK" gesendet wird.m Das
> hier ist ja eines, wo eine vordefinierte Paypload als ACK gesendet wird,
> quasi so wie eine SPI über die Luft.

Ach so, du willst kein ACK Payload, sondern überhaupt ein AutoACK.
Da kannst du beruhigt sein, das bekommst du nie zu sehen, das handelt 
der Baustein intern ab.

von Dieter F. (Gast)


Lesenswert?

Christian J. schrieb:
> Heisst das, dass diese beiden Adressen gleich sein müssen?

Ja, aber

If the PTX device shall receive acknowledge, data pipe 0 has to be
configured to receive the ACK packet. The RX address for data pipe 0 
(RX_ADDR_P0) has to be equal to the TX address (TX_ADDR) in the PTX 
device. For the example in Figure 12. on page 37 the following address 
settings have to be performed for the TX5 device and the RX device:
TX5 device: TX_ADDR = 0xB3B4B5B605
TX5 device: RX_ADDR_P0 = 0xB3B4B5B605
RX device: RX_ADDR_P5 = 0xB3B4B5B605

Von hier:
https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwikmvvlranKAhVDig8KHYOvCs0QFgggMAA&url=https%3A%2F%2Fwww.nordicsemi.com%2Fchi%2Fcontent%2Fdownload%2F2730%2F34105%2Ffile%2FnRF24L01_Product_Specification_v2_0.pdf&usg=AFQjCNEnhSNEGSvHG7ZhmZvotFBGsm4Wcg&sig2=AoSfd3MsER5NhB5Y25H8Hg&cad=rja

Das muss ich aber auch erstmal drüber schlafen :-)

von Christian J. (Gast)


Lesenswert?

Ulrich F. schrieb:
> Ach so, du willst kein ACK Payload, sondern überhaupt ein AutoACK.
> Da kannst du beruhigt sein, das bekommst du nie zu sehen, das handelt
> der Baustein intern ab.

Und mit welchem Befehlt dieser Library kannst du das abfragen, ob die 
Übertragung erfolgreich war?

radio.write(.....), wartet bis fertig

Abfrage, ob Angekommen?

von Christian J. (Gast)


Lesenswert?

PS:

Für Arduino gibts ja tonnenweise libs aber für den STM32 habe ich bisher 
nur eine sehr spartanische Lib gefunden. Oder welche, die nicht mehr 
bereitstellen als die Register zu beschreiben, also sehr low level. 
Kennt da vielleicht einer so eine Komfort Lib mit einem ähnlichen API 
wie für die Arduinos? Umschreiben auf stm32 geht ja nicht so einfach, da 
das eine C++ ist und das andere C. Ansonsten aber setzen sie nur auf die 
SPI auf.

von Ulrich F. (Gast)


Lesenswert?

Christian J. schrieb:
> Ulrich F. schrieb:
>> Ach so, du willst kein ACK Payload, sondern überhaupt ein AutoACK.
>> Da kannst du beruhigt sein, das bekommst du nie zu sehen, das handelt
>> der Baustein intern ab.
>
> Und mit welchem Befehlt dieser Library kannst du das abfragen, ob die
> Übertragung erfolgreich war?
>
> radio.write(.....), wartet bis fertig
>
> Abfrage, ob Angekommen?

write() hat einen Rückgabewert. ;-)
false = Übertragung fehlerhaft
true = Übertragung ok, ACK empfangen(wenn aktiviert).

von Christian J. (Gast)


Lesenswert?

Ulrich F. schrieb:
> write() hat einen Rückgabewert. ;-)
> false = Übertragung fehlerhaft
> true = Übertragung ok, ACK empfangen(wenn aktiviert)

Geil! Klappt!  Schalte ich Empfänger aus rote Led, wieder ein, grüne 
LED.
Das war ja einfach :-)

von Ulrich F. (Gast)


Lesenswert?

Da freut sich aber einer!
Glueckwunsch

von Dieter F. (Gast)


Lesenswert?

Christian J. schrieb:
> Das war ja einfach :-)

Hast Du Radio.setAutoAck(...) explizit aufgerufen?

Ich schaue mir gerade die Lib ein wenig an - und ohne das kann es 
eigentlich nicht funktionieren - es sei denn, das ist per default 
eingestellt. Muss nochmal in Datenblatt schauen ...

von Christian J. (Gast)


Lesenswert?

Dieter F. schrieb:
> Christian J. schrieb:
>> Das war ja einfach :-)
>
> Hast Du Radio.setAutoAck(...) explizit aufgerufen?
>
> Ich schaue mir gerade die Lib ein wenig an - und ohne das kann es
> eigentlich nicht funktionieren - es sei denn, das ist per default
> eingestellt. Muss nochmal in Datenblatt schauen ...
1
SPI.begin();
2
  radio.begin();
3
  
4
  /* Chip Version prüfen */
5
  if (!radio.isPVariant()) {
6
    digitalWrite(LED_GLB,1);  
7
    digitalWrite(LED_ROT,1);  
8
    while(1) wdt_reset();
9
  }  
10
  
11
  radio.setAutoAck(1);
12
  radio.setDataRate(RF24_1MBPS);
13
  radio.setPALevel(RF24_PA_MAX);
14
  radio.setChannel(15);
15
  radio.setPayloadSize(PAYLOAD_SIZE); 
16
  radio.setRetries(4,10);
17
  radio.setCRCLength(RF24_CRC_8);
18
  radio.openWritingPipe(TXADDRESS);
19
20
  radio.powerUp();
21
  if (radio.write(&data,sizeof(data))) {
22
    digitalWrite(LED_GLB,1);
23
    data.nr++;
24
  } else {
25
    digitalWrite(LED_ROT,1);
26
    data.errors++;
27
  }
28
  radio.powerDown();

von maxH (Gast)


Lesenswert?

"Mindestens 10µF ELko ans Modul löten"

Hast du da genaue Informationen dazu. Was heißt denn mindestens?
Die kleinen Module laufen bei mir ganz gut, aber die mit den externen 
Antennen machen desöfteren Probleme

von Ulrich F. (Gast)


Lesenswert?

Naja....
Erfahrungssache....

Ohne Elko habe ich mit meinen Dingern ernste Probleme. Wenig Reichweite, 
viele Abbrüche.

Und mindestens 10µF, weil es dann (bei mir, und meinen Lochrastern) 
erheblich stabiler läuft. Mehr scheint nix zu bringen.

von Dieter F. (Gast)


Lesenswert?

Christian J. schrieb:
> radio.setAutoAck(1);

Ah, danke, dann brauche ich nicht mehr nachschauen :-)

Ulrich F. schrieb:
> Und mindestens 10µF, weil es dann (bei mir, und meinen Lochrastern)
> erheblich stabiler läuft. Mehr scheint nix zu bringen.

Ich habe noch einen 100nF parallel, der schadet auch nicht.

von Christian J. (Gast)


Lesenswert?

Dieter F. schrieb:
> Ich habe noch einen 100nF parallel, der schadet auch nicht.

Habe neulich die 500mW Typen bekommen im Metallgehäuse mit externer 
Antenne. Die ziehen sich aber gut was weg.  Im Auto mal losgefahren, bei 
500m war Schluss. Für mehr braucht es dann wohl Cloverleaf Antennen.

von Christian J. (Gast)


Lesenswert?

maxH schrieb:
> Die kleinen Module laufen bei mir ganz gut, aber die mit den externen
> Antennen machen desöfteren Probleme

Zufällig dann, wenn die Antennen draufgeschraubt werden? Aber nicht wenn 
sie ab sind?

Grrr....

von T.M .. (max)


Lesenswert?

Ja genau, mit Antenne gehts nicht, ohne schon

von Christian J. (Gast)


Lesenswert?

Max .. schrieb:

> Ja genau, mit Antenne gehts nicht, ohne schon

Wieso kommt mir das nur so bekannt vor.... auch wenn man sie abwinkelt 
geht es aber nicht wenn sie gestreckt sind.

Mist China Clone! Echte Nordic gibt es ja gar nicht mehr.

von T.M .. (max)


Lesenswert?

Ja, bei einem war es so, wenn man hinten bei dem Gelenk seinen Finger 
aufgelegt hatte, dann gings auch. Da kann man wahrscheinlich auch nix 
reparieren, oder?
Die kleinen Module funktionieren ja prima, nur die mit Verstärker...

von Christian J. (Gast)


Lesenswert?

Ich vermute mal dass die Antenne eine zu grossse Last ist und die Clon 
Chips damit überfordert sind. Nee, nur Antenne und smb Buchse abmachen.

von T.M .. (max)


Lesenswert?

Das hatte ich mir auch gedacht, oder vielleicht eine Fehlanpassung. Aber 
damit kenne ich mich nicht aus, ob das so sein könnte. Meine erste 
Vermutung war ja, dass die Spannungsversorgung nicht gut genug ist. 
Hatte das Modul direkt von den 3,3 aus dem Nano versorgt. Mit einem 
zusätzlichen Spannungsregler für 3,3V gings dann. Aber eben nicht bei 
allen Modulen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.