Инициализиране на Xbee S1 от Arduino mini pro

Опитвам се да конфигурирам моя модул XBee от Arduino pro mini, който е свързан към моя компютър чрез de FTDI basic от sparkfun. Вече мога да пиша и изпращам данни от Xbee към друг Xbee модул от Arduino. Проблемът ми е, че искам да конфигурирам Xbee от arduino. Изпращам „+++“ с arduino на моя Xbee и искам да получа „OK“ от Xbee със серийния монитор от редактора на arduino. Проблемът е, че мога да го изпратя, но никога не получавам и „ОК“, а когато се опитвам да конфигурирам Xbee, конфигурацията никога не се случва. Така че не мога да стигна до командния ред на Xbee.

    uint8_t pinRx = 0, pinTx = 1; //Initialise pins on the Arduino
    char GotChar;
    long BaudRate = 4800;
    int incomingByte=0;
    SoftwareSerial mySerial( pinRx , pinTx );  //Initialise SoftwareSerial
    
    void init_USB()
    {
      Serial.begin(BaudRate);    
      Serial.println("Start");   
      mySerial.begin(BaudRate);  
    }
    
    void init_XBee()
    {
      Serial.begin(9600);
      int check = 0;
      while(T_XBEE_CONTROLLER_CheckOK() == 0)
      {
        Serial.println("CheckOK");
        Serial.write("+++");
        delay(2000);
      }
      Serial.println("ATCH 8\r");
      delay(2000);
      Serial.write("ATID 1234\r");
      delay(2000);
      Serial.write("+++");
      delay(2000);
      Serial.write("ATPL 0\r");
      delay(2000);
      
      Serial.write("+++");
      delay(2000);
      Serial.write("ATAP 2\r");
      delay(2000);
    }

    int T_XBEE_CONTROLLER_CheckOK()
    {
            char ch[2];
            ch[0] = 0x00;
        while(! ((ch[0] == 'O' ) && (ch[1] == 'K')  ))
        {
                ch[0] = mySerial.read();
                ch[1] = mySerial.read();
                if((ch[0] != 'O') && (ch[1] != 'K') && (ch[2] != '\r'))
                {
                  Serial.println("FAILED");
                        return 0;
                }
                Serial.println("SUCCES");
                return 1;
        }
        return 0;
}

person user2894047    schedule 18.10.2013    source източник


Отговори (3)


това е глупав отговор, но преди всичко трябва да проверите дали вашият Xbee е конфигуриран като AT устройство вместо API устройство. Ако е API режим, модулът няма да разбере съобщенията.

За да направите това, просто трябва да използвате приложението X-CTU и да прочетете конфигурацията на модула и да го промените на AT устройство.

Надявам се това да помогне.

person cjbs    schedule 10.12.2013

Благодаря за отговора и помощта и съжалявам за късния отговор.

Вече реших проблема. Проблемът беше функцията write(). Ако искате да достигнете командния режим от XBee, трябва да изпратите само "+++". Ако зад "+++" има някакъв знак, не можете да достигнете до командния ред. Функцията write постави (за мен) непознат знак зад "+++". Така че това е проблемът за недостигането на командния ред.

За да разрешите този проблем, просто използвайте функцията print("+++"). След използване на тази функция е възможно да достигнете до командния ред.

person user2894047    schedule 13.01.2014

Трябва да прочетете от серийния номер веднага след като изпратите командата +++, защото това е мястото, където xbee пише 'OK'. Също така по-добър начин да спазвате времето за охрана е да изчакате отговор и да тествате дали е „ОК“.

Ето моя код, не помня дали работеше последния път, когато проверих, но просто ще го поставя тук и вие можете да го промените както искате. Всичко, което прави, е излъчване на A1, B2, C3 и т.н.

Има много коментари там, където експериментирах, но редовните коментари са информативни. Уверете се, че преминавате през него стъпка по стъпка, това е доста просто, когато разберете какво мислите. Не забравяйте да промените адреса на дестинация low на 0xFFFF, ако искате да излъчвате.

В крайна сметка ще стигнете до същото разбиране, което направих аз, че AT режимът не е подходящ за конфигуриране на xbee чрез писане на програми.

Например имах едно xbee, което постоянно предаваше числото „2“, и когато друго xbee влизаше в команден режим, използвайки този код, то получаваше числото 2 от отдалеченото xbee, когато трябваше да получи съобщението „OK“ от локалното xbee , поради което програмата не призна, че е в команден режим и се счупи. Когато влизате в команден режим, бихте си помислили, че xbee ще изключи своя приемник, но това не е така, така че лесно можете да си навлечете проблеми.

Ако искате да го направите по правилния начин, погледнете API режима. Имам серия 1 xbee, така че внедрявам протокола Digimesh, който досега не съм виждал някой онлайн да прави, но е почти идентичен с Zigbee, така че е лесно. Ако искате, мога да ви дам моя код за това, който може да служи като прост пример.

    /*
      unicast_configure
     Configure an XBee for unicast transmission and transmit
     some characters to test
     */
    
    #include <SoftwareSerial.h>
    
    // Pins on Bees Shield:
    SoftwareSerial xbee(2, 3);  // TX, RX
     
    boolean configured;
    char c = 'A';
    
    boolean configureRadio() {
      
       // Set the data rate for the SoftwareSerial port:
       xbee.begin(9600);
       
      // Put the radio in command mode:
      Serial.write("Entering command mode\r");
      delay(1000);
      while(xbee.available()>0) {xbee.read();}
      xbee.write("+++");
      while(xbee.available()>0) {xbee.read();}
      //delay(1000);
      //while(xbee.available() > 0) {Serial.write(xbee.read());}
      
      String ok_response = "OK\r"; // The response we expect
      
      // Read the text of the response into the response variable
      // This satisfies the guard time by waiting for the OK message
      String response = String("");
      while (response.length() < ok_response.length()) {
        if (xbee.available() > 0) {
          response += (char) xbee.read();
        }
      }
      Serial.println("response1: " + response);
      
      // If we got received OK, configure the XBee and return true:
      if (response.equals(ok_response)) {
        Serial.println("Enter command mode successful");
        
        // Restore to default values:
        Serial.println("Restoring default values before making changes");
        xbee.write("ATRE\r");
        Serial.println("Setting addr high");
        xbee.write("ATDH0\r");  // Destination high
        //while(xbee.available() > 0) {Serial.write(xbee.read());}
        Serial.println("Setting addr low");
        xbee.write("ATDL1\r");  // Destination low-REPLACE THIS
        //while(xbee.available() > 0) {Serial.write(xbee.read());}
        Serial.println("Setting MY address");
        xbee.write("ATMYFFFF\r");
        
        // Apply changes:
        Serial.println("Applying changes");
        xbee.write("ATAC\r");
    /*    
        ///////////////////////////////////////////////
        // Write to non-volatile memory:
        // Use similar technique as above to satisfy guard time
        Serial.write("Saving\r");
        xbee.write("ATWR\r");
        String response2 = String("");
        //while (xbee.available() > 0) {Serial.write(xbee.read());}
        while (response2.length() < ok_response.length()) {
          if (xbee.available() > 0) {
            response2 += (char) xbee.read();
          }
        }
        Serial.println("response2: " + response2);
        
        if (response2.equals(ok_response)) {
          Serial.println("Save successful");
        }
        else { Serial.println("Save not successful");
               return false;
        }
        
        // And reset module:
        Serial.println("Resetting");
        xbee.write("ATFR\r");
        ///////////////////////////////////////////////
        
    */
        Serial.write("Exit command mode\r");
        xbee.write("ATCN\r");  // Exit command mode
        //while(xbee.available() > 0) {Serial.write(xbee.read());}
        Serial.write("Finished\r");
        return true;
      } else {
        return false; // This indicates the response was incorrect
      }
    }
        
    void setup() {
      Serial.begin(9600);  // Begin serial
      configured = configureRadio();
    }
    
    void loop() {
      // Test transmission:
      if (configured) {
        xbee.print(c);
        Serial.print(c);
        c = c + 1;
        if (c > 'Z') { c = 'A'; }
      }
      else {
        Serial.println("Not configured (in loop)");
        delay(5000);
        Serial.println("Retrying configuration");
        configured = configureRadio();
      }
      
      delay(1500);
    }
person jigglypuff    schedule 12.12.2013