Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

nRF24L01 — как это работает, интерфейс Arduino, схемы, коды

<основной класс="главный сайт" id="главный">

В этом уроке мы узнаем, как настроить беспроводную связь. между двумя платами Arduino с помощью nRF24L01 приемопередающие модули. Модуль nRF24L01 очень популярен для беспроводной связи при использовании Arduino.

Я уже использовал этот модуль для множества проектов Arduino, и вы можете ознакомиться с некоторыми из них здесь:

Вы можете посмотреть следующее видео или прочитать письменный учебник ниже. Он включает в себя все, что нам нужно знать о модуле приемопередатчика nRF24L01, например, схему контактов модуля, принцип работы, подключение и несколько примеров кода.

Обзор

Для объяснения беспроводной связи мы сделаем два примера, первый из которых будет отправлять простое сообщение «Hello World» с одной Arduino на другую, а во втором примере у нас будет двунаправленная связь между платами Arduino, где используется Джойстиком на первой Ардуино мы будем управлять серводвигателем на второй Ардуино, и наоборот, с помощью кнопки на второй Ардуино будем управлять светодиодом на первой Ардуино.

Модуль приемопередатчика nRF24L01

Давайте подробнее рассмотрим модуль приемопередатчика NRF24L01. Он использует диапазон 2,4 ГГц и может работать со скоростью передачи данных от 250 кбит/с до 2 Мбит/с. При использовании на открытом пространстве и с более низкой скоростью передачи данных его радиус действия может достигать 100 метров.

Вот полные спецификации:

Диапазон частот Диапазон ISM 2,4–2,5 ГГц
Скорость передачи данных 250 Кбит/с / 1 Мбит/с / 2 Мбит/с
Макс. выходная мощность 0dBm
Рабочее напряжение 1,9–3,6 В
Макс. рабочий ток 12,3 мА
Резервный текущий 22 мкА
Логические входы Допускает 5 В
Дальность связи 100 м (открытое пространство)

Как это работает

Модуль может использовать 125 различных каналов, что дает возможность иметь сеть из 125 независимо работающих модемов в одном месте. Каждый канал может иметь до 6 адресов, или каждое устройство может обмениваться данными с 6 другими устройствами одновременно.

Потребляемая мощность этого модуля составляет всего около 12 мА во время передачи, что даже ниже, чем у одного светодиода. Рабочее напряжение модуля составляет от 1,9 до 3,6 В, но хорошо то, что остальные выводы допускают логику 5 В, поэтому мы можем легко подключить его к Arduino без использования каких-либо преобразователей логических уровней.

Три из этих контактов предназначены для связи SPI, и их необходимо подключить к контактам SPI Arduino, но обратите внимание, что каждая плата Arduino имеет разные контакты SPI. Выводы CSN и CE могут быть подключены к любому цифровому выводу платы Arduino и используются для установки модуля в ждущий или активный режим, а также для переключения между режимом передачи или режимом управления. Последний контакт — это контакт прерывания, который не нужно использовать.

Варианты модуля

Существует несколько вариантов модулей NRF24L01. Самый популярный — с бортовой антенной. Это делает модуль более компактным, но с другой стороны снижает дальность передачи до расстояния около 100 метров.

Второй вариант, вместо бортовой антенны, он имеет разъем SMA, к которому мы можем подключить утиную антенну для лучшей дальности передачи.

Третий вариант, показанный здесь, помимо утиной антенны, имеет микросхему RFX2401C, которая включает в себя PA. (усилитель мощности) и МШУ (Малошумящий усилитель). Это усиливает сигнал NRF24L01 и обеспечивает еще большую дальность передачи до 1000 метров на открытом пространстве.

Распиновка модуля nRF24L01

Вот подробный обзор распиновки NRF24L01, а также модуля NRF24L01+ PA/LNA.

Оба модуля, NRF24L01 и NRF24L01+ PA/LNA, имеют одинаковую распиновку, поэтому мы можем подключить их к нашей схеме одинаковым образом.

Как подключить nRF24L01 к Arduino

Вот как нам нужно подключить модули NRF24L01 к платам Arduino.

Как я уже упоминал, каждая плата Arduino имеет разные контакты SPI, поэтому имейте это в виду при подключении модулей к плате Arduino.

Arduino SCK MISO MOSI SS
Нет 13 12 11 10
Нано 13 12 11 10
Мега 52 50 51 53

Компоненты, необходимые для этого руководства по Arduino, можно получить по ссылкам ниже:

  • Модуль приемопередатчика NRF24L01………
  • Плата Arduino …………………………………
  • Макет и соединительные провода………… 

Код Arduino и nRF24L01

Как только мы подключим модули NRF24L01 к платам Arduino, мы готовы создать коды как для передатчика, так и для приемника.

Сначала нам нужно загрузить и установить библиотеку RF24, которая упрощает программирование. Мы также можем установить эту библиотеку непосредственно из диспетчера библиотек Arduino IDE. Просто выполните поиск «rf24», найдите и установите «TMRh20, Avamander».

Вот два кода для беспроводной связи, а ниже их описание.

Код передатчика

/*
* Arduino Wireless Communication Tutorial
*     Example 1 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  delay(1000);
}Code language: Arduino (arduino)

Код получателя

/*
* Arduino Wireless Communication Tutorial
*       Example 1 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}Code language: Arduino (arduino)

Описание кода

Поэтому нам нужно включить базовый SPI и недавно установленные библиотеки RF24 и создать объект RF24. Здесь два аргумента — контакты CSN и CE.

RF24 radio(7, 8); // CE, CSNCode language: Arduino (arduino)

Далее нам нужно создать массив байтов, который будет представлять адрес, или так называемый канал, через который будут взаимодействовать два модуля.

const byte address[6] = "00001";Code language: Arduino (arduino)

Мы можем изменить значение этого адреса на любую строку из 5 букв, и это позволит выбрать, с каким приемником мы будем разговаривать, поэтому в нашем случае у нас будет один и тот же адрес как у приемника, так и у передатчика.

В разделе настройки нам нужно инициализировать объект радио и с помощью функции radio.openWritingPipe() мы устанавливаем адрес получателя, на который мы будем отправлять данные, строку из 5 букв, которую мы ранее установили.

radio.openWritingPipe(address);Code language: Arduino (arduino)

С другой стороны, на приемнике с помощью функции radio.setReadingPipe() мы устанавливаем тот же адрес и тем самым обеспечиваем связь между двумя модулями.

radio.openReadingPipe(0, address);Code language: Arduino (arduino)

Затем с помощью функции radio.setPALevel() мы устанавливаем уровень усилителя мощности, в нашем случае я установлю его на минимум, так как мои модули расположены очень близко друг к другу.

radio.setPALevel(RF24_PA_MIN);Code language: Arduino (arduino)

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

Затем у нас есть функция radio.stopListening(), которая устанавливает модуль в качестве передатчика, а с другой стороны у нас есть функция radio.startListening(), которая устанавливает модуль в качестве приемника.

// at the Transmitter
radio.stopListening();Code language: Arduino (arduino)
// at the Receiver
radio.startListening();Code language: Arduino (arduino)

В секции цикла на передатчике мы создаем массив символов, которым мы присваиваем сообщение «Hello World». Используя функцию radio.write(), мы отправим это сообщение получателю. Первый аргумент здесь — это переменная, которую мы хотим отправить.

void loop() {
 const char text[] = "Hello World";
 radio.write(&text, sizeof(text));
 delay(1000);
}Code language: Arduino (arduino)

Используя «&» перед именем переменной, мы фактически устанавливаем указание переменной, в которой хранятся данные, которые мы хотим отправить, и используя второй аргумент, мы устанавливаем количество байтов, которые мы хотим взять из этой переменной. В этом случае функция sizeof() получает все байты строки text. В конце программы мы добавим задержку в 1 секунду.

Используя функцию radio.write(), мы можем отправить максимум 32 байта за раз.

С другой стороны, на приемнике, в секции loop с помощью функции radio.available() проверяем, есть ли данные для приема. Если это так, то сначала мы создаем массив из 32 элементов, называемый «текст», в котором мы будем сохранять поступающие данные.

void loop() {
  if (radio.available()) {
    char text[32] = "";
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}Code language: Arduino (arduino)

Используя функцию radion.read(), мы читаем и сохраняем данные в переменной text. В конце мы просто печатаем текст на последовательном мониторе. Итак, как только мы загрузим обе программы, мы сможем запустить последовательный монитор на приемнике, и мы заметим, что сообщение «Hello World» печатается каждую секунду.

Устранение неполадок

Стоит отметить, что шум источника питания является одной из наиболее распространенных проблем, с которыми сталкиваются люди при попытке установить успешную связь с модулями NRF24L01. Как правило, радиочастотные цепи или радиочастотные сигналы чувствительны к шуму источника питания. Поэтому всегда рекомендуется включать развязывающий конденсатор в линию питания. Конденсатор может быть любым от 10 мкФ до 100 мкФ.

Другая распространенная проблема заключается в том, что контакт 3,3 В плат Arduino не всегда может обеспечить достаточную мощность для модуля NRF24L01. Таким образом, питание модуля от внешнего источника также является хорошей идеей.

Двунаправленная беспроводная связь с двумя NRF24L01 и Arduino

Давайте посмотрим на второй пример, двунаправленную беспроводную связь между двумя платами Arduino. Вот принципиальная схема:

Компоненты, необходимые для этого примера, можно получить по ссылкам ниже:

  • Модуль приемопередатчика NRF24L01…………
  • Плата Arduino…………………………………….
  • Модуль джойстика ……………………………….
  • Серводвигатель ……………………………………….
  • Кнопка ………………………………………..
  • Светодиод …………………………………………………

Исходный код nRF24L01

Вот два кода и их описание ниже.

Код передатчика

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define led 12

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;

void setup() {
  pinMode(12, OUTPUT);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // 00002
  radio.openReadingPipe(1, addresses[0]); // 00001
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);

  radio.stopListening();
  int potValue = analogRead(A0);
  int angleValue = map(potValue, 0, 1023, 0, 180);
  radio.write(&angleValue, sizeof(angleValue));

  delay(5);
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  if (buttonState == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}Code language: Arduino (arduino)

Код получателя

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

#define button 4

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;

void setup() {
  pinMode(button, INPUT);
  myServo.attach(5);
  radio.begin();
  radio.openWritingPipe(addresses[0]); // 00001
  radio.openReadingPipe(1, addresses[1]); // 00002
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);
  radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }
    delay(5);
    radio.stopListening();
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
  }
}Code language: Arduino (arduino)

Что здесь отличается от предыдущего примера, так это то, что нам нужно создать два канала или адреса для двунаправленной связи.

const byte addresses[][6] = {"00001", "00002"};Code language: Arduino (arduino)

В разделе настройки нам нужно определить оба канала, и обратите внимание, что адрес записи на первом Arduino должен быть адресом чтения на втором Arduino, и наоборот, адрес чтения на первом Arduino должен быть адресом записи на второй Ардуино.

// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002Code language: Arduino (arduino)
// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001Code language: Arduino (arduino)

В секции цикла с помощью функции radio.stopListening() мы устанавливаем первый Arduino в качестве передатчика, считываем и отображаем значение джойстика от 0 до 180 и с помощью функции radio.write() отправляем данные на приемник.

radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));Code language: Arduino (arduino)

С другой стороны, используя функцию radio.startListening(), мы устанавливаем второй Arduino в качестве приемника и проверяем, есть ли доступные данные. Пока есть доступные данные, мы их считываем, сохраняем в переменной «angleV», а затем используем это значение для вращения серводвигателя.

radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }Code language: Arduino (arduino)

Затем в передатчике мы устанавливаем первый Arduino в качестве приемника и с помощью пустого цикла «пока» ждем, пока второй Arduino отправит данные, а это данные о состоянии кнопки, независимо от того, нажата она или нет. Если кнопка нажата, загорается светодиод. Таким образом, этот процесс постоянно повторяется, и обе платы Arduino постоянно отправляют и получают данные.

Пример 3. Отправка нескольких переменных в одном пакете

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

Код передатчика

/*
  Arduino Wireless Communication Tutorial
      Example 1 - Transmitter Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // Create a variable with the above structure

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  // Send the whole data from the structure to the receiver
  radio.write(&data, sizeof(Data_Package));
  delay(500);
}Code language: Arduino (arduino)

Итак, мы можем создать структуру, которая на самом деле представляет собой набор различных типов переменных.

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // Create a variable with the above structureCode language: Arduino (arduino)

Мы должны иметь в виду, что максимальный размер данных этой структуры может составлять 32 байта. Здесь мы видим, что я включил три переменных типа byte, одну целочисленную переменную (4 байта), одну переменную с плавающей запятой (4 байта) и одну строку, содержащую четыре символа (4 байта). Всего 15 байт.

Код получателя

/*
  Arduino Wireless Communication Tutorial
        Example 1 - Receiver Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN

const byte address[6] = "00001";

// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; //Create a variable with the above structure

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
  }
  Serial.print("a: ");
  Serial.print(data.a);
  Serial.print(" b: ");
  Serial.print(data.b);
  Serial.print(" c: ");
  Serial.print(data.c);
  Serial.print(" d: ");
  Serial.print(data.d);
  Serial.print(" e: ");
  Serial.print(data.e);
  Serial.print(" f: ");
  Serial.println(data.f);
}Code language: Arduino (arduino)

На стороне получателя мы должны определить те же данные структуры, чтобы иметь возможность получать входящие данные. Чтобы проверить, правильно ли работает беспроводная связь, я распечатал каждую переменную на последовательном мониторе.

Заключение

Модуль NRF24L01 — отличный вариант, когда вам нужна беспроводная связь для вашего проекта Arduino. Я уже использовал этот модуль во многих своих проектах Arduino.

Здесь я перечислю все свои проекты, в которых я использовал эти модули.

  • Беспроводное управление роботом-автомобилем Arduino с использованием Bluetooth HC-05, модулей приемопередатчика NRF24L01 и HC-12
  • Проект беспроводной метеостанции Arduino
  • Радиоуправляемый передатчик Arduino своими руками
  • Робот Arduino Ant Hexapod
  • Радиоуправляемый корабль на воздушной подушке на базе Arduino своими руками
  • Робот на колесах Arduino Mecanum
  • Сделай сам радиоуправляемый приемник Arduino для радиоуправляемых моделей и проектов Arduino
  • Самолет на радиоуправлении Arduino | 100 % сделай сам.

В каждом из этих проектов/учебников есть подробное объяснение того, как использовать модуль NRF24L01, включая принципиальные схемы, улучшенную реализацию кода для улучшения связи и т. д.

Мой любимый проект — это специально разработанный радиоуправляемый передатчик Arduino. На самом деле это 14-канальный RC-контроллер, который можно использовать для управления практически любым проектом Arduino.

Это все для этого урока, я надеюсь, вам понравилось и вы узнали что-то новое. Как всегда, не стесняйтесь задавать любые вопросы в разделе комментариев ниже.


Производственный процесс

  1. Как измерить качество воздуха на OpenSensors
  2. Как взломать ИК-пульты
  3. Какой ты рост?
  4. Генератор волн JX
  5. Скейтборд виртуальной реальности «Сделай сам»
  6. Как связать Arduino Mega с GPS-модулем NEO-6M
  7. Насколько легко использовать термистор ?!
  8. Как создавать музыку с помощью Arduino
  9. Как использовать Modbus с Arduino
  10. Вот идея:как работает интерфейс мозг-компьютер