Страница 1 из 1

Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 27 фев 2016, 08:45
-=dp=-
По многочисленным просьбам делюсь опытом в подключении самого популярного и распространенного трансивера RF24L01 на 2,4 ГГц к Ардуино.

Комплектующие:
Ардуино УНО - 2шт
трансивер RF24L01 на 2,4 ГГц , RF2.4 - 2шт
Стабилизатор LM 117 - 2шт
Конденсаторы 10-470 МкФ - 2 шт
Керамические конденсаторы 2200 - 470000 пкФ - 2шт.

Купить Ардуину, модуль RF24L01 и другие радиодетали можно на Aлиэкспреcc.

Re: Подключение трансивера 2.4 ГГц к Ардуино

СообщениеДобавлено: 27 фев 2016, 08:55
-=dp=-
Для качественной работы данного трансивера RF24L01 требуется сборка отдельного стабилизатора напряжения на 3,3 В.
Подключается он в непосредственной близости к модулю трансивера RF24L01, что бы исключить падение напряжения на монтажных проводах.
В качестве стабилизатора я использовал микросхему LM117, но можно так же сделать и на обычном стабилитроне с транзистором.

Выкладываю схему стабилизатора для трансивера RF24L01 на 2,4 ГГЦ .
На верхних фото фильтры по питанию из двух конденсаторов, электролит большой емкости и керамический для сглаживания высокочастотных помех по питанию.

Re: Подключение трансивера 2.4 ГГц к Ардуино

СообщениеДобавлено: 27 фев 2016, 08:58
-=dp=-
Распиновка модуля трансивера RF24L01 на 2,4 ГГц

1 - Общий
2 - Питание + 3,3 В
3 - CE
4 - CSN
5 - SCK
6 - MOSI
7 - MISO

8 - IRQ (не используется в библиотеке)

Re: Подключение трансивера 2.4 ГГц к Ардуино

СообщениеДобавлено: 27 фев 2016, 09:07
-=dp=-
Подключение модуля трансивера RF24L01 к Ардуино УНО

Контакт RF24L01 --------------- Контакт Адуино УНО
1 - GND --------------- Общий вывод GND
2 - VCC --------------- + 3,3 В
3 - CE --------------- Цифровой вход 7
4 - CSN --------------- Цифровой вход 8
5 - SCK --------------- Цифровой вход 13
6 - MOSI --------------- Цифровой вход 11
7 - MISO --------------- Цифровой вход 12

Библиотека RF24 во вложении

Re: Подключение трансивера RF24L01 к Ардуино

СообщениеДобавлено: 27 фев 2016, 09:20
-=dp=-
После подключения модуля трансивера RF24L01 и установки библиотеки RF24 заходим в папку библиотеки, открываем папку examples\GettingStarted и запускаем тестовый скетч GettingStarted.ino

Пример тестового скетча:

Код: выделить все
#include <SPI.h>
#include "RF24.h"

/****************** User Config ***************************/
/***      Set this radio as radio number 0 or 1         ***/
bool radioNumber = 1;

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);
/**********************************************************/

byte addresses[][6] = {"1Node","2Node"};

// Used to control whether this node is sending or receiving
bool role = 0;

void setup() {
  Serial.begin(115200);
  Serial.println(F("RF24/examples/GettingStarted"));
  Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
 
  radio.begin();

  // Set the PA Level low to prevent power supply related issues since this is a
 // getting_started sketch, and the likelihood of close proximity of the devices. RF24_PA_MAX is default.
  radio.setDataRate (RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel (108);
  // Open a writing and reading pipe on each radio, with opposite addresses
  if(radioNumber){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
  }else{
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
  }
 
  // Start the radio listening for data
  radio.startListening();
}

void loop() {
 
 
/****************** Ping Out Role ***************************/ 
if (role == 1)  {
   
    radio.stopListening();                                    // First, stop listening so we can talk.
   
   
    Serial.println(F("Now sending"));

    unsigned long start_time = micros();                             // Take the time, and send it.  This will block until complete
     if (!radio.write( &start_time, sizeof(unsigned long) )){
       Serial.println(F("failed"));
     }
       
    radio.startListening();                                    // Now, continue listening
   
    unsigned long started_waiting_at = micros();               // Set up a timeout period, get the current microseconds
    boolean timeout = false;                                   // Set up a variable to indicate if a response was received or not
   
    while ( ! radio.available() ){                             // While nothing is received
      if (micros() - started_waiting_at > 200000 ){            // If waited longer than 200ms, indicate timeout and exit while loop
          timeout = true;
          break;
      }     
    }
       
    if ( timeout ){                                             // Describe the results
        Serial.println(F("Failed, response timed out."));
    }else{
        unsigned long got_time;                                 // Grab the response, compare, and send to debugging spew
        radio.read( &got_time, sizeof(unsigned long) );
        unsigned long end_time = micros();
       
        // Spew it
        Serial.print(F("Sent "));
        Serial.print(start_time);
        Serial.print(F(", Got response "));
        Serial.print(got_time);
        Serial.print(F(", Round-trip delay "));
        Serial.print(end_time-start_time);
        Serial.println(F(" microseconds"));
    }

    // Try again 1s later
    delay(1000);
  }



/****************** Pong Back Role ***************************/

  if ( role == 0 )
  {
    unsigned long got_time;
   
    if( radio.available()){
                                                                    // Variable for the received timestamp
      while (radio.available()) {                                   // While there is data ready
        radio.read( &got_time, sizeof(unsigned long) );             // Get the payload
      }
     
      radio.stopListening();                                        // First, stop listening so we can talk   
      radio.write( &got_time, sizeof(unsigned long) );              // Send the final one back.     
      radio.startListening();                                       // Now, resume listening so we catch the next packets.     
      Serial.print(F("Sent response "));
      Serial.println(got_time); 
   }
 }




/****************** Change Roles via Serial Commands ***************************/

  if ( Serial.available() )
  {
    char c = toupper(Serial.read());
    if ( c == 'T' && role == 0 ){     
      Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
      role = 1;                  // Become the primary transmitter (ping out)
   
   }else
    if ( c == 'R' && role == 1 ){
      Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));     
       role = 0;                // Become the primary receiver (pong back)
       radio.startListening();
       
    }
  }


} // Loop




Компилируем его и если нет ошибок компиляции программируем Ардуину.

Производим настройку скетча,

Устанавливаем режим работы трансивера RF24L01
первую Ардуину ставим bool radioNumber = 0;
вторую Ардуину прошиваем со значением bool radioNumber = 1;

Устанавливаем максимальную мощность
radio.setPALevel(RF24_PA_MAX);

Устанавливаем менее загруженный канал
radio.setChannel (108);

Устанавливаем скорость передачи
radio.setDataRate (RF24_250KBPS);

Затем открываем монитор СОМ порта, выбираем скорость 115200, закрываем его и открываем снова.
В окне монитора СОМ порта должен появится текст : *** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK

После этого вводим в мониторе СОМ порта команду Т

и видим обмен данными между Ардуинами, в терминале должны появляться строки с цифрами как на скриншоте ниже

Re: Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 27 фев 2016, 11:55
-=dp=-
Если в мониторе СОМ порта вы увидели эти строки, значит все сделано правильно и связь между радиомодулями RF24L01 есть.

Далее прописываем в скетче команды для приема и передачи, отлавливаем их события и выполняем требуемый код (включаем светодиод, щелкаем релюшкой, управляем двигателями и т.д.)

Список команд трансивера RF24L01

Primary public interface
These are the main methods you need to operate the chip

RF24 (uint8_t _cepin, uint8_t _cspin)

RF24 (uint8_t _cepin, uint8_t _cspin, uint32_t spispeed)

[list=]bool begin (void)

void startListening (void)

void stopListening (void)

bool available (void)

void read (void *buf, uint8_t len)

bool write (const void *buf, uint8_t len)

void openWritingPipe (const uint8_t *address)

void openReadingPipe (uint8_t number, const uint8_t *address)[/list]

Optional Configurators
Methods you can use to get or set the configuration of the chip. None are required. Calling begin() sets up a reasonable set of defaults.

    void setAddressWidth (uint8_t a_width)

    void setRetries (uint8_t delay, uint8_t count)

    void setChannel (uint8_t channel)

    uint8_t getChannel (void)

    void setPayloadSize (uint8_t size)

    uint8_t getPayloadSize (void)

    uint8_t getDynamicPayloadSize (void)

    void enableAckPayload (void)

    void enableDynamicPayloads (void)

    void enableDynamicAck ()

    bool isPVariant (void)

    void setAutoAck (bool enable)

    void setAutoAck (uint8_t pipe, bool enable)

    void setPALevel (uint8_t level)

    uint8_t getPALevel (void)

    bool setDataRate (rf24_datarate_e speed)

    rf24_datarate_e getDataRate (void)

    void setCRCLength (rf24_crclength_e length)

    rf24_crclength_e getCRCLength (void)

    void disableCRC (void)

    void maskIRQ (bool tx_ok, bool tx_fail, bool rx_ready)

Re: Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 27 фев 2016, 11:58
-=dp=-
Если вы не добились работы тестового скетча, улучшаем схему питания, 90% проблем при работе данных модулей приемопередатчиков связаны именно с некачественным питанием 3,3 В
Ставим конденсаторы большой емкости прям на плату модуля, используем толстые провода питания, размещаем плату модуля подальше от источников ВЧ помех, WiFi точек и т.д.

Re: Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 27 фев 2016, 16:08
-=dp=-
Есть еще другой вариант радио-модулей RF24L01+ с дальностью связи 1 КМ при прямой видимости :shock:

Re: Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 28 фев 2016, 11:42
-=dp=-
Выкладываю скетч для управления 5 светодиодами.

В первому контроллеру подключаем 5 кнопок , к выводам 2,3,4,5,6
Ко второму контроллеру подключаем 5 светодиодов, к выводам 2,3,4,5,6

Скетчи для приемника и передатчика одинаковые, режимы прием/передача выбираются путем подачи на аналоговый вход А4 напряжения 5В.

Пример скетча

Код: выделить все
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
RF24 radio(7,8);
const int role_pin = A4;
const uint8_t button_pins[] = { 2,3,4,5,6 };
const uint8_t num_button_pins = sizeof(button_pins);
const uint8_t led_pins[] = { 2,3,4,5,6 };
const uint8_t num_led_pins = sizeof(led_pins);
const uint64_t pipe = 0xE8E8F0F0E1LL;
typedef enum { role_remote = 1, role_led } role_e;
const char* role_friendly_name[] = { "invalid", "Remote", "LED Board"};
role_e role;

uint8_t button_states[num_button_pins];
uint8_t led_states[num_led_pins];

void setup(void)
{
  pinMode(role_pin, INPUT);
  digitalWrite(role_pin,HIGH);
  delay(20);
  if ( digitalRead(role_pin) )
    role = role_remote;
  else
    role = role_led;
  Serial.begin(115200);
  printf_begin();
  printf("\n\rRF24/examples/led_remote/\n\r");
  printf("ROLE: %s\n\r",role_friendly_name[role]);
  radio.begin();
  if ( role == role_remote )
  {
    radio.openWritingPipe(pipe);
  }
  else
  {
    radio.openReadingPipe(1,pipe);
  }
  if ( role == role_led )
    radio.startListening();
  radio.printDetails();
  if ( role == role_remote )
  {
    int i = num_button_pins;
    while(i--)
    {
      pinMode(button_pins[i],INPUT);
      digitalWrite(button_pins[i],HIGH);
    }
  }
  if ( role == role_led )
  {
    int i = num_led_pins;
    while(i--)
    {
      pinMode(led_pins[i],OUTPUT);
      led_states[i] = HIGH;
      digitalWrite(led_pins[i],led_states[i]);
    }
  }

}


void loop(void)
{

  if ( role == role_remote )
  {
    int i = num_button_pins;
    bool different = false;
    while(i--)
    {
      uint8_t state = ! digitalRead(button_pins[i]);
      if ( state != button_states[i] )
      {
        different = true;
        button_states[i] = state;
      }
    }
    if ( different )
    {
      printf("Now sending...");
      bool ok = radio.write( button_states, num_button_pins );
      if (ok)
        printf("ok\n\r");
      else
        printf("failed\n\r");
    }
    delay(20);
  }

  if ( role == role_led )
  {
    if ( radio.available() )
    {
      while (radio.available())
      {
        radio.read( button_states, num_button_pins );
        printf("Got buttons\n\r");
        int i = num_led_pins;
        while(i--)
        {
          if ( button_states[i] )
          {
            led_states[i] ^= HIGH;
            digitalWrite(led_pins[i],led_states[i]);
          }
        }
      }
    }
  }
}


Re: Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 26 дек 2019, 19:17
Толик
здесь связь получается односторонняя, как раз что и мне нужно и ещё непонятно для приёма-передачи надо сделать перемычку между А4 и 5в на каждом контроллере. Призагрузке скетча - пишет * отказано в доступе *

Re: Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 30 дек 2019, 10:23
-=dp=-
Толик писал(а):здесь связь получается односторонняя, как раз что и мне нужно и ещё непонятно для приёма-передачи надо сделать перемычку между А4 и 5в на каждом контроллере. Призагрузке скетча - пишет * отказано в доступе *


Проверьте права доступа к файлам библиотек и скетча, надо убрать флаг ТОЛЬКО ДЛЯ ЧТЕНИЯ.
Установите последнюю версию Arduino IDE

Re: Подключение трансивера RF24L01 на 2.4 ГГц к Ардуино

СообщениеДобавлено: 31 мар 2020, 21:18
-=dp=-