nRF24L01 파이프 질문


9

여기에 있는 예제 코드를 살펴보고 있습니다 . nRF24L01 모듈이 사용할 수있는 6 개의 파이프가 있다는 것을 알고 있지만 주소 지정을 위해 인터넷을 검색했지만 아무것도 찾을 수 없었습니다. 더 구체적으로 37 행에 저자가 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL을 얻는 위치에 대한 참조가 있습니까?

감사.


1
라디오 IC에 대한 데이터 시트를 보셨습니까? 파이프 주소에 대한 자세한 정보가 있습니다.

1
RF24 API 문서를 확인 openReadingPipe()하십시오 : maniacbug.github.io/RF24/… 마지막 주소 바이트에 어떤 값을 사용할 수 있다고 언급되어 있습니다.
jfpoilpret

그래서 나는 문서를 살펴 보았지만 파이프 주소가 어떻게 선택되는지 언급하지 않았습니다. 단지 첫 32 비트를 공유해야한다고 말합니다. 예를 들어 0xF0F0F0F0 (XX), 0x는 바이트로 계산됩니까? 아니면 F0F0F0F0은 중요한 32 비트입니까? 또한 파이프가 32 비트를 공유하는 한 F0F0F0F0이 아닌 경우 중요합니까? 마지막 2 바이트는 어떻습니까? 그것들도 임의적입니까?
Alex H

0x...접두사는 값을 16 진수에 알려주는 것이다. 10 진수 99는 16 진수 99와 다르기 때문에 동일하게 보이기 때문입니다. 대신 우리는 0x99를 사용합니다.
Gerben

2
사용하는 코드는 1 개의 파이프 만 지원합니다. nRF24L01에는 2 개의 고유 한 파이프 (0 및 1)가 있습니다. 또한 4 개의 추가 파이프 (2, 3, 4 및 5)가 있으며 가장 작은 바이트 만 설정할 수 있습니다. 다른 바이트는 두 번째 파이프 (1)와 동일합니다.
Gerben

답변:


5

대부분의 사람들이 게시했듯이 파이프의 값은 임의적이지만 API 별 규칙을 따라야합니다.

파이프 1-5는 처음 32 비트를 공유해야합니다. 최하위 바이트 만 고유해야합니다. 예 :

귀하의 질문에 대답하기 전에 16 진수 및 10 진수 값에 대한 설명이 필요하다고 생각합니다.

40 비트 16 진수는 16 진수의 숫자 표현입니다. 10 진수는 10 진수입니다. 따라서 16 진수 값을 10 진수로 변환 할 수 있습니다. 이것은 질문의 범위를 벗어나기 때문에 Google에서 서로 변환하는 방법에 대해 Google에서 알 수 있습니다. 온라인 변환기가 있습니다 :

16 진수를 10 진수로 변환하는 변환기

16 진수 값을 10 진수로 변환하면 숫자로만 표시됩니다. 변환 할 때 0x및 을 삭제합니다 LL. 언급 한 바와 같이 0x값은 16 진수 값이며 LLLong Long 유형을 의미합니다 .

따라서 귀하의 질문에 대답하려면 변환기를 사용하여 다음과 같은 16 진수를 찾으십시오.

F0F0F0F0A1
F0F0F0F0A2
F0F0F0F0B4
F0F0F0F0E9

마지막 2 자리 만 변경하십시오 (최하위 비트).

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

를 추가 0x하고LL

0xF0F0F0F0A1LL
0xF0F0F0F0A2LL
0xF0F0F0F0B4LL
0xF0F0F0F0E9LL

모두 작동해야합니다.

나는 배우면서 16 진수에 대한 전문가가 아니므로 내가 틀렸다면 누군가 나를 수정하십시오.

마지막으로, nRF24L01 데이터 시트는 다음과 같이 주소 선택이 완전히 임의적이지 않다는 점을 지적합니다.

참고 : 레벨이 한 번만 이동하는 주소 (즉, 000FFFFFFF)는 노이즈에서 감지 될 수 있으며 잘못된 감지를 제공하여 패킷 오류율이 높아질 수 있습니다. 프리앰블이 지속되는 주소 (하이 토글 링)도 패킷 오류율을 높입니다.


이 파이프는 "6 data multi-receiver"기능 (북유럽 데이터 시트 p39-40)만을 참조한다는 것도 언급 할 수 있습니다. 기본적으로 데이터 파이프 0과 1 만 사용됩니다.

@bersch-관련이 있습니까? OP는 파이프 사용 방법이 아니라 파이프 값 선택 방법을 묻고있었습니다 where the author is getting 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL?.
PhillyNJ

값을 선택하려면 기본적으로 쓰기 파이프와 읽기 파이프가 있음을 알아야합니다. 다중 수신기 모드에는 쓰기 및 최대 5 개의 읽기 파이프가 있습니다. 판독 파이프 만 설명합니다. 지금까지 나는 그것을 확인하지 않았지만 처음 32 비트를 공유하는 읽기 및 쓰기 파이프를 선택하면 실패 할 것이라고 믿습니다.

필자의 테스트에서 파이프 0과 1이 트랜스미터와 리시버에서 동일하다면 값은 임의적입니다.
PhillyNJ

내가 참조. 나는 멀티 리시버 기능을 확인하지 않았다. 각 칩을 사용하여 송수신합니다.

2

0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL은 임의의 값이며 대화 할 발신자와 수신자의 주소를 정의합니다.

Mirf 라이브러리를 사용하는 경우

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

또한 같은 문자열 일 수 있습니다 serv1.

RF24 사용

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

1

모두가 당신에게 말하는 것을 잊어 버렸습니다.

리시버의 파이프 는 첫 번째 파이프 이후에 짧아 져야합니다

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

에서 파이프 송신기는 해야한다

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

어떤 파이프의 메시지가 왔는지 알고 싶다면

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

또한 파이프 번호 6확인 메시지 수신에 사용됩니다 .

또한 초기화 코드에는 radio.enableDynamicPayloads(); 다음이 있어야합니다 .

    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

행운을 빕니다...


무슨 pipe당신의 예에서와 같이 정의?
x29a

1
코드를 편집했습니다. 이 '파이프'중 하나를 전송에 사용할 수 있지만 해당 파이프를 읽기에서 제외하는 것을 잊지 마십시오.
Faig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.