question de tuyau nRF24L01


9

Je regarde l'exemple de code trouvé ici . Je sais qu'il y a 6 tuyaux que le module nRF24L01 peut utiliser mais j'ai cherché sur Internet les désignations d'adresse et je n'ai rien trouvé. Plus précisément, à la ligne 37, existe-t-il une référence indiquant où l'auteur obtient 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?

Merci.


1
Avez-vous consulté la fiche technique du CI radio? Cela contient certainement plus d'informations sur les adresses des canaux.

1
Consultez le document API RF24 openReadingPipe()ici: maniacbug.github.io/RF24/… il mentionne que vous pouvez utiliser n'importe quelle valeur pour le dernier octet d'adresse.
jfpoilpret

J'ai donc parcouru la documentation mais elle ne mentionne pas comment l'adresse du canal est choisie. Il dit simplement qu'ils devraient partager les 32 premiers bits. Par exemple 0xF0F0F0F0 (XX), 0x compte-t-il comme un octet? Ou F0F0F0F0 est-il les 32 bits qui comptent? En outre, est-ce important si ce n'est pas F0F0F0F0 tant que les tuyaux partagent ces 32 bits? Qu'en est-il des deux derniers octets significatifs (XX)? Est-ce aussi arbitraire?
Alex H

Le 0x...préfixe est juste pour indiquer que la valeur est en hexadécimal. En effet, 99 en décimal est différent de 99 en hexadécimal, même s'ils se ressemblent. Donc, à la place, nous utilisons 0x99.
Gerben

2
Le code que vous utilisez ne prend en charge qu'un seul canal. Le nRF24L01 possède 2 tuyaux uniques (0 et 1). Il dispose également de 4 canaux supplémentaires (2, 3, 4 et 5), où vous ne pouvez définir que l'octet le moins significatif. Les autres octets seront les mêmes que le deuxième canal (1).
Gerben

Réponses:


5

Comme la plupart des gens l'ont publié, les valeurs du canal sont arbitraires, mais doivent suivre les règles de l'API:

Les canaux 1 à 5 devraient partager les 32 premiers bits. Seul l'octet de poids faible doit être unique, par exemple

Avant de répondre à votre question, je pense qu'une explication sur les valeurs hexadécimales et décimales est nécessaire.

L'hexadécimal 40 bits est une représentation numérique de la base 16. Une décimale est de la base 10. Vous pouvez donc convertir une valeur hexadécimale en décimal. Comme cela est hors de portée pour la question, vous pouvez rechercher sur Google comment convertir de l'un à l'autre. Il existe des convertisseurs en ligne:

Convertisseur hexadécimal en décimal

Vous verrez lorsque vous convertissez la valeur hexadécimale en décimal, que ce n'est qu'une représentation numérique. Lorsque vous convertissez, vous supprimez le 0xet LL. Comme indiqué, le 0xindique que la valeur est une valeur hexadécimale et LLsignifie le type Long Long .

Donc, pour répondre à votre question, utilisez le convertisseur a pour trouver un nombre hexadécimal comme:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Modifiez simplement les 2 derniers chiffres (bit le moins significatif):

Pipes 1-5 should share the first 32 bits. Only the least significant byte should be unique, e.g.
   openReadingPipe(1,0xF0F0F0F0AA);
   openReadingPipe(2,0xF0F0F0F066);

Ajoutez le 0xetLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Tout devrait fonctionner.

Je ne suis pas un expert en hexagone, car j'apprends, donc si je me trompe, alors s'il vous plaît, corrigez-moi.

Enfin, la fiche technique nRF24L01 souligne que le choix de l'adresse n'est pas totalement arbitraire:

Remarque: Les adresses où le niveau ne change qu'une seule fois (c'est-à-dire 000FFFFFFF) peuvent souvent être détectées dans le bruit et peuvent donner une fausse détection, ce qui peut donner un taux d'erreur de paquet élevé. Les adresses dans le prolongement du préambule (basculement haut-bas) augmentent également le taux d'erreur sur les paquets.


pourriez-vous également mentionner que ces tuyaux se réfèrent uniquement à la fonction "multi-récepteur 6 données" (s. fiche technique nordique p39-40). par défaut, seuls les canaux de données 0 et 1 sont activés.

@bersch - Est-ce pertinent? L'OP demandait comment les valeurs des tuyaux sont choisies, par exemple where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?, pas comment les tuyaux sont utilisés.
PhillyNJ

Pour choisir les valeurs, vous devez savoir que par défaut il y a un tube d'écriture et un tube de lecture. En mode multi-récepteur, il y a une écriture et jusqu'à 5 canaux de lecture. Vous ne décrivez que les tuyaux de lecture. Jusqu'à présent, je n'ai pas vérifié cela, mais je crois que si l'on choisit le tuyau de lecture et d'écriture qui partage les 32 premiers bits, il échouera.

D'après mes tests, les valeurs sont arbitraires tant que votre pipe 0 et 1 sont les mêmes sur l'émetteur et le récepteur
PhillyNJ

Je vois. Pour ma part, je n'ai pas vérifié la fonction multi-récepteur. J'utilise chaque puce pour transmettre et recevoir.

2

Les valeurs 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLsont des valeurs arbitraires et définissent les adresses des expéditeurs et des récepteurs à qui parler.

Si vous utilisez la bibliothèque Mirf

Mirf.setRADDR((byte *)"serv1");

ils peuvent aussi être des cordes serv1.

RF24 les usages

write_register(RX_ADDR_P0, &value, 5);
write_register(TX_ADDR, &value, 5);

1

Il y a quelque chose que tout le monde oublie de vous dire:

Les tuyaux au niveau du récepteur doivent être raccourcis après le premier

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xA2LL;  
const uint64_t pipe03 = 0xA3LL;
const uint64_t pipe04 = 0xA4LL;
const uint64_t pipe05 = 0xA5LL;
const uint64_t pipe06 = 0xA6LL;

radio.openReadingPipe(1, pipe01);  
radio.openReadingPipe(2, pipe02);
radio.openReadingPipe(3, pipe03);
radio.openReadingPipe(4, pipe04);
radio.openReadingPipe(5, pipe05);

Les tuyaux au niveau de l' émetteur doivent être

const uint64_t pipe01 = 0xE8E8F0F0A1LL;
const uint64_t pipe02 = 0xE8E8F0F0A2LL;  
const uint64_t pipe03 = 0xE8E8F0F0A3LL;
const uint64_t pipe04 = 0xE8E8F0F0A4LL;
const uint64_t pipe05 = 0xE8E8F0F0A5LL;
const uint64_t pipe06 = 0xE8E8F0F0A6LL;

uint64_t setPipeToSend = pipe01; // or pipe02 or pipe03 or pipe04 or pipe05
radio.openWritingPipe(setPipeToSend );

Si vous voulez savoir quel message de pipe est venu, utilisez

  uint8_t someVariable;
    if (radio.available(&someVariable))
    {
       Serial.print("pipe number ");
       Serial.printLn(someVariable);
    }

Le tube numéro 6 est également utilisé pour recevoir des messages d' accusé de réception .

De plus, le code d'initialisation doit avoir radio.enableDynamicPayloads(); Celui-ci fonctionne bien pour moi:

    radio.begin();
    //radio.setChannel(0x57); //if set should be the same at the both sides
    radio.setPALevel(RF24_PA_LOW);  // "LOW" is more stable mode
    radio.enableAckPayload(); //for autoanswers
    radio.openWritingPipe(pipe01); //for sending
    //link pipe numbers to the pipe addresses
    //radio.openReadingPipe(1, pipe01); // I use pipe01 for sending
    radio.openReadingPipe(2, pipe02);
    radio.openReadingPipe(3, pipe03);
    radio.openReadingPipe(4, pipe04);
    radio.openReadingPipe(5, pipe05);
    radio.enableDynamicPayloads(); //must have for multi pipe receiving
    radio.startListening();  //start listening

Bonne chance...


ce qui est pipedéfini comme dans votre exemple?
x29a

1
J'ai édité le code. Vous pouvez utiliser n'importe lequel de ces «tuyaux» pour l'envoi, mais n'oubliez pas (comme moi) d'exclure ce tuyau de la lecture.
Faig
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.