2017-02-19 5 views
1

3 개의 지그비, 2 개의 라우터 (지그비 S2C) 및 1 개의 코디네이터 (지그비 S2)로 구성된 설정을 만들었습니다. 라우터는 각각 2 개의 FSR 및 IMU (프레임 유형 : 지그비 전송 요청 및 패킷 크기 46 바이트)에서 데이터를 수집하는 arduino nano에 연결되어 arduino UNO에 연결된 코디네이터에게 보냅니다. 모든 Xbees는 API 모드 2이고 보드 속도는 115200입니다. "Simple Zigbee Library"라는 라이브러리를 사용하여 수집 된 모든 데이터를 코디네이터에게 보냅니다. 데이터 수집 및 전송은 패킷 손실이 발생한다는 것을 제외하고는 정상적으로 작동합니다. 나노의 샘플 데이터는 약 25Hz의 주파수에서 독립적으로 나타납니다. 코디네이터는 모든 루프에서 지그비에서 보낸 데이터를 읽으려고하지만 (물론 라이브러리를 사용하여), 불행하게도 약 40-45 개의 샘플 만받는 것으로 보입니다. (2 * xbees). 아무도 이것이 왜 일어나고 있는지 제안 할 수 있습니까? 가능한 한 데이터 손실이 적어서 동기를 달성 할 필요가 있습니다. 모든 종류의 도움을 주시면 감사하겠습니다.지그비 arduino 설정에서 데이터 패킷이 누락되는 이유는 무엇입니까?

P.S : 코디네이터가 각 루프의 한 xbee에서만 데이터를 읽는 것이 중요 할 수 있습니다.

As can be seen under the "Source" heading of this image of data received by the coordinator, "19" and "106" are the addresses of the routers and there are data packets dropped intermittently

감사합니다.

void setup() 
{ 
    // Start the serial ports ... 
    Serial.begin(115200); 
    while(!Serial){;} // Wait for serial port (for Leonardo only). 
    xbeeSerial.begin(115200); 
    // ... and set the serial port for the XBee radio. 
    xbee.setSerial(xbeeSerial); 
    // Set a non-zero frame id to receive Status packets. 
    xbee.setAcknowledgement(true); 
} 
void loop() 
{ 
    // While data is waiting in the XBee serial port ... 
    while(xbee.available()) 
    { 
     // ... read the data. 
     xbee.read(); 
     // If a complete message is available, display the contents 
     if(xbee.isComplete()){ 
      Serial.print("\nIncoming Message: "); 
      printPacket(xbee.getIncomingPacketObject()); 
     } 
    } 
    delay(10); // Small delay for stability 
    // That's it! The coordinator is ready to go. 
} 
// Function for printing the complete contents of a packet // 
void printPacket(SimpleZigBeePacket & p) 
{ 
    //Serial.print(START, HEX); 
    //Serial.print(' '); 
    //Serial.print(p.getLengthMSB(), HEX); 
    //Serial.print(' '); 
    //Serial.print(p.getLengthLSB(), HEX); 
    //Serial.print(' '); 
    // Frame Type and Frame ID are stored in Frame Data 
    uint8_t checksum = 0; 
    for(int i=10; i<p.getFrameLength(); i++){ 
     Serial.print(p.getFrameData(i), HEX); 
     Serial.print(' '); 
     checksum += p.getFrameData(i); 
    } 
    // Calculate checksum based on summation of frame bytes 
    checksum = 0xff - checksum; 
    Serial.print(checksum, HEX); 
    Serial.println(); 
} 
+0

* 패킷 충돌 * 및 * 데이터 손상 *을 고려하셨습니까? 통신 프로토콜이 이러한 상황을 처리 할만큼 충분히 발전 했습니까? –

+0

이 링크의 의미는 다음과 같습니다. 이러한 모듈 (MAC 및 PHY 계층)에서 사용되는 무선 장치는 충돌 회피 또는 CSMA/CA로 축약 된 반송파 감지 다중 액세스 사용을 지정하는 IEEE 802.15.4 표준에 의해 정의됩니다. /electronics.stackexchange.com/questions/36932/xbee-how-does-it-deal-with-collisions – Aniket

+0

위대한,하지만 나는 그보다 더 높은 수준의 것을 염두에 두었습니다.* CSMA/CA *는 올바른 상황에서 충돌을 막을 수는 없지만 절대적으로 예방할 수 있습니다. * 더 높은 수준의 프로토콜 *은 각 패킷이 확인 응답을 받아야하며 * ACK *가 주어진 * timeout * 내에 수신되지 않으면 패킷이 다시 전송되도록합니다. 마지막으로 * ZigBee *와 함께 작업했지만 * Arduino *를 사용하지 않는다고 인정하지만 직접 구현해야했습니다. –

답변

0

는 115,200 bps, 메모리를 사용하는 항 있지만은, 코드가 충분히 빠르지 제 2,500 바이트/(50 개 패킷/초 * 45 바이트/패킷 * 110 % 확실히 9600에 시리얼 포트를 열어 도시 등록한 오버 헤드에 대해) XBee로부터 수신되어 printPacket()에 의해 덤프 됨). 802.15.4는 항상 공중에서 250kbps이며, XBee 모듈의 직렬 포트 구성은 호스트와의 로컬 통신을위한 것입니다.

라우터가 무선 트래픽을 차단하기 위해 유니 캐스트 (브로드 캐스트가 아닌) 패킷을 보내고 있는지 확인하십시오.

코디네이터의 코드 문제를 해결하기 전에 전송이 작동하는지 확인해야합니다. 라우터의 코드를 업데이트하여 전송 된 모든 패킷에 대해 성공적인 전송 상태 패킷이 있는지 확인하십시오. 50Hz를 목표로하는 것은 조금은 많은 것처럼 보입니다. 즉, 20ms마다 45 바이트 (API 프레임의 전체 크기입니까?)를 보내려고합니다.

Arduino의 하드웨어 직렬 포트를 XBee 모듈과 Serial.print()에 사용하고 있습니까? printPacket()로 전화하는 데 걸리는 시간은 얼마나됩니까? printPacket()의 코드를 최소 (송신자 주소의 마지막 바이트와 1 바이트 프레임 ID)로 줄이면 모든 패킷이 통과했음을 알 수 있습니까? (패킷을 버리는 데 너무 많은 시간을 소비하고 있다는 표시)

+0

답장을 보내 주셔서 감사합니다 @ tomlogic 나는 모든 arduino에 115200의 보오율을 사용하고 있습니다. 예제 코드의 실수가 수정되었습니다. 두 라우터 모두에 대해 확인 메시지가 표시되면 전송이 작동합니다. 그러나 일부 패킷은 확인되지 않습니다. 패킷의 약 2/2에서 발생합니다 (두 xbe 모두에서). 50 Hz는 강제적 인 것은 아니지만, 높을수록 나에게 더 좋습니다. 나는 모든 3 xbees에 소프트웨어 시리얼을 사용하고있다. printPacket의 코드를 최소한으로 줄여도 모든 패킷이 전달되지 않습니다. – Aniket

+0

수신 된 모든 패킷 (100 자 * 50 메시지 = 최대 115.2kbps의 50kbps)에 대해 많은 정보를 인쇄하고 있습니다. 테스트를 위해 단지 몇 바이트로 줄이십시오. 당신은 뒤늦게 쓰이는 패킷을 인쇄하는 데 많은 시간을 소비하고있을 것입니다. Arduino의 시리얼 버퍼는 얼마나 큽니까? 버퍼 오버 플로우를 방지하기 위해 하드웨어 핸드 쉐이킹 (CTS/RTS)을 사용할 수 있습니까? – tomlogic

+0

필자는 필요한 최소한의 데이터 (8 바이트)로 코드를 조정했다. arduino의 직렬 버퍼 크기는 64bytes입니다. 나는 http://www.hobbytronics.co.uk/arduino-serial-buffer-size에 나와있는 방법을 사용하여 UNO의 버퍼 크기를 늘리려고했지만 데이터 바이트는 여전히 손실됩니다. 그 밖의 무엇을 시도 할 수있는 아이디어가 있습니까? – Aniket

0

나는 루프에서 사용하는 코드에 관심이 있습니다. 나는 Arduino가 어떻게 작동하는지에 대한 깊은 내부 구조를 모른다. 그러나 10ms 지연은 다른 코드가 데이터를 처리하는 것을 차단한다? 당신은 무엇을 단순화 경우 :

void loop() 
{ 
    xbee.read(); 
    // Process any complete frames. 
    while (xbee.isComplete()){ 
     Serial.print("\nIncoming Message: "); 
     printPacket(xbee.getIncomingPacketObject()); 
    } 
} 

그러나 너무 멀리 가기 전에, 당신은 PC에 터미널 에뮬레이터에 코디네이터를 연결하여 프레임 속도를 모니터링하는 것이 문제를 분리해야합니다. 모든 프레임이 도착하면 코디네이터에 문제가 있습니다. 그렇지 않은 경우 먼저 라우터 코드에서 작업하십시오.

+0

코디네이터 코드의 지연을 제거하고 패킷 크기를 8 바이트의 페이로드 (이전에는 45 였고 총 패킷 크기는 약 15 바이트)로 줄였습니다. 그럼에도 데이터 포인트가 완고하게 떨어지는 것 같습니다. 원래 게시물의 링크에 표시된 출력은 Xbee 방패가있는 Uno에 연결된 PC의 터미널 에뮬레이터를 사용하여 가져 왔습니다. Xbee Explorer를 사용하여 코디네이터를 PC에 직접 연결할 때, 나는 횡설수설 해 보인다. API 모드에 있기 때문일 수 있습니다. 그러나 나는 그것이 작동하지 않는 이유를 파악할 수 없다. 나는 이것을 내 논문으로 필요로한다. 어떤 도움을 주셔서 감사합니다. – Aniket

+0

데이터를 이해하려면 16 진수로 데이터를 확인해야합니다. '0x7E'을 프레임 문자의 시작으로보고, 2 바이트 길이와 프레임 유형을 봅니다. 앞서 말한 것처럼 코디네이터 문제를 해결하는 데 더 많은 시간을 할애하기 전에 실제로 라우터에서 데이터를 전송하고 있음을 먼저 확인해야합니다. 가장 쉬운 해결책은 신뢰할 수있는 통신을 얻을 때까지 재생 빈도를 낮추는 것입니다. – tomlogic

+0

내가 작업 한 모니터링 프로젝트에서 최종 장치는 5 분 동안 데이터를 캡처 한 다음 5 분 동안 최소, 최대 및 평균 판독 값으로 단일 패킷을 보냈습니다. 아마 당신의 프로젝트에서 비슷한 것이있을 것입니다. – tomlogic

관련 문제