Текущее время: 24 янв 2020, 11:28

Город ХОББИ

Занятие любимым хобби - это путь к счастливой жизни!

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

Тут собраны схемы различных устройств сделанных на контроллерах Ардуино, Лазерный гравер на Ардуино, Металлоискатель на Ардуино, Метеостанция, Кодовый замок, и множество других устройств и изобретений
Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 08:45

По многочисленным просьбам делюсь опытом в подключении самого популярного и распространенного трансивера RF24L01 на 2,4 ГГц к Ардуино.

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

Купить Ардуину, модуль RF24L01 и другие радиодетали можно в Калининграде http://newmar.ru/index.php?id_product=2 ... er=product


Вложения
rf2.4_1.jpg
Подключение трансивера на 2,4 ГГц к Ардуино

Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 08:55

Для качественной работы данного трансивера RF24L01 требуется сборка отдельного стабилизатора напряжения на 3,3 В.
Подключается он в непосредственной близости к модулю трансивера RF24L01, что бы исключить падение напряжения на монтажных проводах.
В качестве стабилизатора я использовал микросхему LM117, но можно так же сделать и на обычном стабилитроне с транзистором.

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


Вложения
5.jpg
Схема стабилизатора для трансивера на 2,4 ГГц
4.jpg
Схема стабилизатора для трансивера на 2,4 ГГц
lm117.jpg
Схема стабилизатора для трансивера на 2,4 ГГц

Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 08:58

Распиновка модуля трансивера RF24L01 на 2,4 ГГц

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

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


Вложения
2.jpg
модуля трансивера RF24L01
RF2.4GHZ.jpg
Распиновка модуля трансивера на 2,4 ГГц
RF2.4GHZ.jpg (74.98 KiB) Просмотров: 5696

Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 09:07

Подключение модуля трансивера 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 во вложении

Макетные платы можно купить в Калининграде тут http://newmar.ru/index.php?id_product=1 ... er=product


Вложения
1.jpg
Подключение RF24L01
3.jpg
Подключение RF24L01
RF24.rar
Библиотека RF24
(164.77 KiB) Скачиваний: 276

Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 09:20

После подключения модуля трансивера 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

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

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


Вложения
3.JPG
Подключение радиомодуля трансивера на 2,4 ГГц к Ардуино

Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 11:55

Если в мониторе СОМ порта вы увидели эти строки, значит все сделано правильно и связь между радиомодулями 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)



Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 11:58

Если вы не добились работы тестового скетча, улучшаем схему питания, 90% проблем при работе данных модулей приемопередатчиков связаны именно с некачественным питанием 3,3 В
Ставим конденсаторы большой емкости прям на плату модуля, используем толстые провода питания, размещаем плату модуля подальше от источников ВЧ помех, WiFi точек и т.д.



Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 фев 2016, 16:08

Есть еще другой вариант радио-модулей RF24L01+ с дальностью связи 1 КМ при прямой видимости :shock:


Вложения
RF24L01.jpg
RF24L01+ с дальностью связи 1 КМ
RF24L01.jpg (23.73 KiB) Просмотров: 5681

Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 28 фев 2016, 11:42

Выкладываю скетч для управления 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]);
          }
        }
      }
    }
  }
}




 
Сообщений: 1
Зарегистрирован: 26 дек 2019, 19:06

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

Сообщение Толик » 26 дек 2019, 19:17

здесь связь получается односторонняя, как раз что и мне нужно и ещё непонятно для приёма-передачи надо сделать перемычку между А4 и 5в на каждом контроллере. Призагрузке скетча - пишет * отказано в доступе *



Аватар пользователя
 
Сообщений: 739
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 30 дек 2019, 10:23

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


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




Вернуться в Устройства на Ардуино

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3