Как читать XBee RSSI в режиме API? - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь проверить XBee RSSI в режиме API на принимающей стороне, как я могу получить значение RSSI принимающего радио в arduino.
Я настроил оба XBee в режиме API-2 и подключился к arduino с помощью контакт 4-5 (rxtx и txrx) для Xbee rad ios.

Отправка кода кадра аналогична приведенной ниже, и при передаче на обоих концах проблем нет,

  uint8_t data[] = {'H','i'};
  XBeeAddress64 addr64 = XBeeAddress64();
  addr64.setMsb(0x00000000); // Msb address of receiver
  addr64.setLsb(0x00000000); // Lsb address of receiver
  ZBTxRequest zbTx = ZBTxRequest(addr64, data, sizeof(data));
  xbee.send(zbTx); 
  delay(1000);

На получая конец, я попробовал pulseIn arduino и .getRssi() of, первая функция выдает «0» в результате, в то время как последняя выдает «102», но остается такой же, как я перемещаю Xbee rad ios друг от друга. Что мне нужно сделать, чтобы получить правильный RSSI на принимающей стороне?

1 Ответ

0 голосов
/ 11 марта 2020

Надеюсь, этот ответ поможет вам и другим.
Если вы используете следующую библиотеку lib: https://github.com/andrewrapp/xbee-arduino
и у вас есть модуль серии 1, вы можете использовать следующий тестовый код для быстрого диагностика. закомментированные части, конечно, также могут быть использованы при необходимости

#include <XBee.h>
#include <SoftwareSerial.h>

// XBee's DOUT (TX) is connected to pin 8 (Arduino's Software RX)
// XBee's DIN (RX) is connected to pin 9 (Arduino's Software TX)
SoftwareSerial serial1(8, 9); // RX, TX

XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
Rx16Response rx16 = Rx16Response();
Rx64Response rx64 = Rx64Response();

// uint8_t xbeeOption = 0;
// uint8_t xbeeData = 0;
uint8_t xbeeRssi = 0;

void setup() {
  Serial.begin(9600);
  serial1.begin(9600);
  xbee.setSerial(serial1);
}

void loop() {
  xbee.readPacket(100);
  if (xbee.getResponse().isAvailable())  {
    Serial.println("Xbee available");
    if (xbee.getResponse().getApiId() == RX_64_RESPONSE || xbee.getResponse().getApiId() == RX_16_RESPONSE)  {
      Serial.println("64 or 16");
      if (xbee.getResponse().getApiId() == RX_16_RESPONSE)  {
        Serial.println("16");
        xbee.getResponse().getRx16Response(rx16);
        // xbeeOption = rx16.getOption();
        //Serial.print("xbeeOption: "); Serial.println(xbeeOption);
        //xbeeData = rx16.getData(0);
        //Serial.print("xbeeData: "); Serial.println(xbeeData);
        xbeeRssi = rx16.getRssi();
        Serial.print("xbeeRssi: "); Serial.println(xbeeRssi);
      }
      else  {
        Serial.println("64");
        xbee.getResponse().getRx64Response(rx64);
        //xbeeOption = rx64.getOption();
        //Serial.print("xbeeOption: "); Serial.println(xbeeOption);
        //xbeeData = rx64.getData(0);
        //Serial.print("xbeeData: "); Serial.println(xbeeData);
        xbeeRssi = rx64.getRssi();
        Serial.print("xbeeRssi: "); Serial.println(xbeeRssi);
      }
    }
  }

Если вы используете модуль series2, есть только способ, использующий аппаратный сигнал ШИМ: для обновления сигнала ШИМ RSSI необходимо: получил пакет API. Кроме того, для серии 2 Xbee это относится только к последнему прыжку пакета, то есть от последнего маршрутизатора к месту назначения. Вам необходимо использовать вывод XBee rssi и некоторую кодировку в зависимости от вашего устройства.
Значение rssi для расстояния не очень надежно, и вы будете видеть изменения, возможно, каждые 10-15 метров при отправке пакетов. Так что простое перемещение Xbee на вашем рабочем месте не изменит значения.
EDIT: При использовании модуля серии 2 есть следующая возможность: подключите вывод rssi xbee (6) к выводу Arduino PWM (например, 10 ) и измерьте входящий сигнал, который затем может быть сопоставлен с диапазоном качества и / или расстояния. Так что пишите свою собственную функцию rssi. Обычные библиотеки xbee поддерживают только модули series1.

...