pergunta sobre o tubo nRF24L01


9

Eu estou olhando através do código de exemplo encontrado aqui . Eu sei que existem 6 canais que o módulo nRF24L01 pode usar, mas eu tenho pesquisado na Internet as designações de endereço e não consegui encontrar nada. Mais especificamente na linha 37, existe uma referência para onde o autor está recebendo 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?

Obrigado.


11
Você já olhou a folha de dados para o rádio IC? Isso certamente tem mais informações sobre endereços de canal.

11
Verifique o documento da API da RF24 para openReadingPipe()aqui: maniacbug.github.io/RF24/…. Ele menciona que você pode usar qualquer valor para o último byte do endereço.
jfpoilpret

Por isso, examinei a documentação, mas ela não menciona como o endereço do canal é escolhido. Apenas diz que eles devem compartilhar os primeiros 32 bits. Por exemplo 0xF0F0F0F0 (XX), 0x conta como um byte? Ou é F0F0F0F0 os 32 bits que importam? Além disso, importa se não for F0F0F0F0 desde que os pipes compartilhem esses 32 bits? E os dois últimos bytes significativos (XX)? São arbitrários também?
Alex H

O 0x...prefixo é apenas para dizer que o valor está em hexadecimal. Isso ocorre porque 99 em decimal é diferente de 99 em hexadecimal, mesmo que pareçam iguais. Então, em vez disso, usamos 0x99.
Gerben

2
O código que você usa apenas suporta 1 canal. O nRF24L01 possui 2 tubos exclusivos (0 e 1). Ele também possui 4 canais adicionais (2, 3, 4 e 5), onde você pode definir apenas o byte menos significativo. Os outros bytes serão iguais ao segundo canal (1).
Gerben

Respostas:


5

Como a maioria das pessoas postou, os valores para o canal são arbitrários, mas devem seguir as regras da API:

Os tubos 1-5 devem compartilhar os primeiros 32 bits. Somente o byte menos significativo deve ser único, por exemplo

Antes de responder sua pergunta, acho que é necessária uma explicação sobre os valores Hex e Decimal.

O hexadecimal de 40 bits é uma representação numérica da base 16. Um decimal é da base 10. Portanto, você pode converter um valor hexadecimal em decimal. Como isso está fora do escopo da pergunta, você pode pesquisar no Google sobre como converter de um para outro. Existem alguns conversores online:

Conversor Hex para Decimal

Você verá quando converter o valor hexadecimal em decimal, que é apenas uma representação numérica. Quando você converte, você solta o 0xe LL. Conforme indicado, 0xindica que o valor é um valor hexadecimal e LLsignifica o tipo Long Long .

Então, para responder sua pergunta, use o conversor a para encontrar um número hexadecimal como:

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

Basta alterar os dois últimos dígitos (bit menos significativo):

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);

Adicione o 0xeLL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

Tudo deve funcionar.

Não sou especialista em hexadecimal, como estou aprendendo; portanto, se estiver incorreto, alguém me corrija.

Finalmente, a folha de dados nRF24L01 destaca o seguinte ponto em que a escolha do endereço não é completamente arbitrária:

Nota: Endereços nos quais o nível muda apenas uma vez (ou seja, 000FFFFFFF) geralmente podem ser detectados em ruídos e podem fornecer uma detecção falsa, o que pode aumentar a taxa de erros de pacotes. Endereços como uma continuação do preâmbulo (alternância oi-baixa) também aumentam a taxa de erro de pacote.


você também pode mencionar que esses tubos referem-se apenas ao recurso "6 receptores múltiplos de dados" (s. Folha de dados nórdica p39-40). Por padrão, apenas o canal de dados 0 e 1 está ativado.

@bersch - Isso é relevante? O OP estava perguntando como os valores dos tubos são escolhidos where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?, por exemplo , não como os tubos são usados.
PhillyNJ

Para escolher os valores, você precisa saber que, por padrão, há um canal de escrita e um canal de leitura. No modo multi-receptor, há uma escrita e até 5 canais de leitura. Você descreve apenas os tubos de leitura. Até agora, não verifiquei isso, mas acredito que, se alguém escolher o canal de leitura e gravação que compartilha os primeiros 32 bits, ele falhará.

Do meu testes, os valores são arbitrários, desde que seu tubo 0 e 1 são os mesmos do transmissor e do receptor
PhillyNJ

Eu vejo. Por mim mesmo, não verifiquei o recurso de multi-receptor. Eu uso cada chip para transmitir e receber.

2

Os valores 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LLsão arbitrários e definem os endereços dos remetentes e destinatários com quem conversar.

Se você usa a biblioteca Mirf

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

Eles também podem ser seqüências de caracteres serv1.

RF24 usa

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

1

Há algo que todos esquecem de lhe dizer:

Os tubos no receptor devem ser encurtados após o primeiro

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);

Tubos no transmissor devem ser

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 );

Se você quiser saber qual mensagem do canal chegou, use

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

Também o tubo número 6 é usado para receber mensagens de confirmação .

Além disso, o código de inicialização deve ter radio.enableDynamicPayloads(); Este funciona bem para mim:

    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

Boa sorte...


o que é pipedefinido como no seu exemplo?
X29a

11
Eu editei o código. Você pode usar qualquer um desses 'pipes' para enviar, mas não se esqueça (como eu) de excluir esse pipe da leitura.
Faig 15/09/18
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.