Радио модуль NRF24L01: описание, подключение, схема, характеристики | ВИКИ

Радио модуль NRF24L01: описание, подключение, схема, характеристики | ВИКИ Мультикоптеры

Arduino – машинка на nrf24l01

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

Два джойстика управляют игрой с консоли. У него есть два колеса и одна шариковая опора.

Она была сделана из того, что было, то есть из рассеивающего свет плексигласа, консоли от монтажной коробки. Корпус состоит из двух листов светорассеивающего плексигласа, соединенных между собой шестью распорками длиной 2 см. Размеры: прямоугольник 10×15 см с двумя вырезанными спереди треугольниками 2,5×5 см и высотой 2 см. Размер сустава: высота 4 см, диаметр 10 см.

фото
P_20220731_172610[1].jpgP_20220731_172521[1].jpgP_20220731_172558[1].jpg

Перейдём к внутренностям:

КОМПОНЕНТЫ ПУЛЬТА

  • Arduino nano
  • Nrf24l01 без антенны и адаптера
  • Аккумулятор 610mAh 7.4A (две банки)
  • Джойстики X2
  • Переключатель

Фото интерьеров

P_20220731_181023[1].jpg
КОМПОНЕНТЫ МАШИНКИ

  • Arduino nano
  • Nrf24l01 с антенной и адаптером
  • Аккумулятор 610mAh 7.4V (две банки)
  • Двухканальный контроллер двигателя Pololu на TB6612FNG v2 <1A
  • Турборедуктор Gekko MR12-050 X2
  • Колеса Pololu 32×7 X2
  • Выключатель

Фото кишок

P_20220731_181942[1].jpg
СХЕМА МАШИНКИ
машинка схема.PNG

СХЕМА ПУЛЬТА
Схема пульт_xx.png

Принцип работы кода. Скорости вычисляются так: у нас есть 4 значения от 0 до 1023, измеряющихся в реальном времени (я решил использовать только два и разбил их на две части каждую, в итоге получили 4). Теперь преобразовываем их так, чтобы при сгибании 1-го джойстика из центра до максимума вперёд получали значения от 0 да 255, и при сгибании из центра назад было бы тоже самое. Со 2-м джойстиком, тоже из центра влево от 0 до 255 и в право от 0 да 255. В первой версии кода мы просто складывали эти скорости, то есть третье с четвёртым прибавляем к первым двум, и скорость движения вперёд просто пишем через if, чтобы можно было стоять . Это лишало нас способности поворачивать при движении вперёд на максимальной скорости. В version 2 (отдельное спасибо Nashatirkoза помощь в написании кода) c джойстика, отвечающего за поворот ось Y, мы снимаем коэффициент скорости колеса от 0 да 100, что более разумно. И вот так высчитываем скорость одного колеса: spr = x1p * y2r / 100. Скачать скетчи можно по ссылке.
КОД ПУЛЬТА

/*   Данный скетч модернизация скетча AlexGyver

*    исходник тут https://github.com/AlexGyver/nRF24L01

*/



#include <SPI.h>          // библиотека для работы с шиной SPI

#include "nRF24L01.h"     // библиотека радиомодуля

#include "RF24.h"         // ещё библиотека радиомодуля



RF24 radio(9, 10);





byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

byte transmit_data[4];





void setup() {

  Serial.begin(9600); //открываем порт для связи с ПК



  radio.begin(); //активировать модуль

  radio.setAutoAck(0);         //режим подтверждения приёма, 1 вкл 0 выкл

  radio.setRetries(0, 0);    //время между попыткой достучаться, число попыток

  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал

  radio.setPayloadSize(32);     //размер пакета, в байтах



  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных

  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)



  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX

  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS

  //должна быть одинакова на приёмнике и передатчике!

  //при самой низкой скорости имеем самую высокую чувствительность и дальность!



  radio.powerUp(); //начать работу

  radio.stopListening();  //не слушаем радиоэфир, мы передатчик

}
void loop() {

  transmit_data[0] = map(analogRead(A0), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси X

  transmit_data[1] = map(analogRead(A1), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 1 оси Y

  transmit_data[2] = map(analogRead(A2), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси X

  transmit_data[3] = map(analogRead(A3), 0, 1023, 0, 255); //считываем и обрезаем показания с джостика 2 оси Y

  radio.write(&transmit_data, sizeof(transmit_data)); //отправляем получившийся массив
}

Для машин OD версии 2.

/*   Данный скетч модернизация скетча AlexGyver
*    исходник тут https://github.com/AlexGyver/nRF24L01
*/

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

RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб
byte recieved_data[4];
void setup(){
  Serial.begin(9600); //открываем порт для связи с ПК

  pinMode(4, OUTPUT);

  pinMode(A0, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(5, OUTPUT);

  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(6, OUTPUT);


  radio.begin(); //активировать модуль
  radio.setAutoAck(0);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1,address[0]);      //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_1MBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
    byte pipeNo;               
    while( radio.available(&pipeNo)){    // слушаем эфир со всех труб
      radio.read( &recieved_data, sizeof(recieved_data) ); //читаем присланный массив
      digitalWrite(4, HIGH);

      int x1p = constrain(map(recieved_data[1], 128, 255, 0, 255), 0, 255); //обрезаем и переворачиваем значения
      int x1b = constrain(map(recieved_data[1], 128, 0, 0, 255), 0, 255); //обрезаем и переворачиваем значения
      int y2r = constrain(map(recieved_data[2], 122, 255, 100, 1), 0, 100); //обрезаем и переворачиваем значения
      int y2l = constrain(map(recieved_data[2], 122, 0, 100, 1), 0, 100); //обрезаем и переворачиваем значения

      int stl = constrain(map(recieved_data[2], 123, 255, 0, 255), 0, 255); //обрезаем и переворачиваем значения
      int str = constrain(map(recieved_data[2], 122, 0, 0, 255), 0, 255); //обрезаем и переворачиваем значения

      //Serial.print(x1p); Serial.print(" | "); Serial.print(x1b); Serial.print(" | "); Serial.print(y2r); Serial.print(" | "); Serial.print(y2l); Serial.println();
      int spr = constrain(x1p * y2r / 100, 0, 255); //скорость правого колеса
      int spl = constrain(x1p * y2l / 100, 0, 255); //скорость левого колеса
      int bspr = constrain(x1b * y2r / 100, 0, 255); //скорость правого колеса назад
      int bspl = constrain(x1b * y2l / 100, 0, 255); //скорость левого колеса назад
      Serial.print(stl); Serial.print(" | "); Serial.print(str); Serial.println();
      //Serial.print(recieved_data[2]); Serial.println();
      if (recieved_data[1]>138)
    { digitalWrite(A1, LOW);
      digitalWrite(A0, HIGH);
      analogWrite(5, spr);

      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
      analogWrite(6, spl);
    } else if (recieved_data[1]<118)
    { digitalWrite(A1, !LOW);
      digitalWrite(A0, !HIGH);
      analogWrite(5, bspr);

      digitalWrite(7, !LOW);
      digitalWrite(8, !HIGH);
      analogWrite(6, bspl);
    }else if (118<recieved_data[1]<138)
    { digitalWrite(A1, LOW);
      digitalWrite(A0, HIGH);
      analogWrite(5, str);

      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
      analogWrite(6, stl);
      }
  }
}

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

Смотрите про коптеры:  Как выбрать квадрокоптер | Квадрокоптеры и гексакоптеры | Блог | Клуб DNS

Также скоро появится версия камеры Алекса.

Спасибо за внимание.

Обзор модули nrf24l01

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

Решение этих проблем – сложная задача, но для этого существует множество способов. Когда проводная связь невозможна, можно использовать радиомодули NFR24L01, работающие в диапазоне 2,45-2,5 ГГц. Конструкторов радиостанций Ham привлекли эти модули благодаря их простоте и надежности. Среди устройств, использующих NFR24L01, можно назвать следующие:

Рисунок №1 – внешний вид NRF24L01

Как показано на рисунке выше, комплект платы является базовым и включает в себя саму ИС, контактную колодку и антенну с витой дорожкой. Комплект обеспечивает дальность связи до 100 м при прямой видимости или до 30 м в помещении. Если этого недостаточно, можно приобрести те же модули, только с дополнительным усилителем и внешней антенной (рис. 2). Дальность действия может быть увеличена до 1000 м.

Рисунок 2 – NRF24L01 с усилителем и внешней антенной

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

Как следствие, нарушается радиосвязь. Использование электролитического конденсатора емкостью около 100 ф позволяет избежать этой неприятной ситуации. Подключите его параллельно к выводам GROUND и VCC модуля. Дополнительная емкость поможет сгладить пульсации при запуске и обеспечит достаточный запас мощности.

Для решения проблемы запуска можно использовать дополнительный адаптер со встроенным стабилизатором напряжения. Максимальный выходной ток составит 800 мА, и NRF24L01 можно будет питать от внешнего источника питания от 4,8 В до 12 В. На рисунке 3 показан пример такого адаптера.

Смотрите про коптеры:  Квадрокоптер: что это такое и как работает?

Дополнительный адаптер NRF24L01 показан на Рисунке 3

Схема подключения радиомодуля NRF24L01 также показана на рисунке 4 для тех, кто заинтересован в более глубоком изучении его структуры.


Рисунок №4 – электрическая схема NRF24L01

Пример использования №2

Перед вами проект, который будет передавать данные с одной платы Arduino на другую с помощью модулей nRF24L01.

На рисунке 1 показана схема соединений для нашего проекта. 10.

Рисунок 10.

Утверждение 3.

#include <SPI.h>                                     
#include <nRF24L01.h>                                         
#include <RF24.h>
// Создаём объект 
RF24  m24l01(7, 8);                  
// Массив для отправки данных  
byte  arr1[4];                                   
// идентификатор канала
#define ID 0xF0F0F0F0E2LL
// стартовый байт отправки
#define SEND_START 55       
// стоповый байт отправки
#define SEND_STOP 56         

#include "DHT.h"                                          
// создание DHT
DHT snr(6, DHT11);                              
int t;
int h;
unsigned long millissenddata=0;

void setup(){
    Serial.begin(9600); 

    m24l01.begin();
    m24l01.setPALevel(RF24_PA_HIGH);
    m24l01.setDataRate(RF24_250KBPS);
    m24l01.setChannel(0x55);
    m24l01.openWritingPipe(ID);

    snr.begin();      
}

void loop() {
   // отправка данных
   if(millis()-millissenddata>10000) {
      // получение данных с датчика
      h = snr.readHumidity();
      t = snr.readTemperature();
      arr1[0] = SEND_START;   
      arr1[1] = h;                             
      arr1[2] = t;                             
      arr1[3] = SEND_STOP;   
      Serial.println("send");
      // отправляем данные 
      m24l01.write(&arr1, sizeof(arr1));   
      delay(100);
      millissenddata=millis();
   }
}

Список № 4.

#include <SPI.h>                                     
#include <nRF24L01.h>                                         
#include <RF24.h>
// Создаём объект 
RF24 m24l01(7, 8);                  
// для получения  данных  
int  arr1[4]; 
// идентификатор канала
#define ID 0xF0F0F0F0E2LL

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C dislpl(0x27,16,2);

void setup() {
    Serial.begin(9600);                                       
    m24l01.begin();                                          
    m24l01.setChannel(0x55);                            
    m24l01.setDataRate(RF24_250KBPS);                   
    m24l01.setPALevel(RF24_PA_HIGH);                 
    m24l01.openReadingPipe(1, ID);  
    // режим приема 
    m24l01.startListening  ();                             
    dislpl.init();
    // заголовки на дисплей
    dislpl.backlight();
    dislpl.setCursor(0,0);
    dislpl.print("H=");
    dislpl.setCursor(0,1);
    dislpl.print("T=");

}       
void loop() {
      if(m24l01.available()) { 
        m24l01.read(&arr1, sizeof(arr1));                  
        // Показания на дисплей
        dislpl.setCursor(2,0);
        dislpl.print(arr1[1]);
        dislpl.setCursor(2,1);
        dislpl.print(arr1[2]);
      }   
 }

Результат работы (рисунок 11)

Диаграмма 11.

Пример
использования №1

Так как основной областью применения
радиомодулей NRF24L01 являются
различные системы удалённого мониторинга, создадим небольшой проект, суть
которого передавать по радиоканалу температуру и влажность с датчика DHT11.

Рисунок №8 – проект удалённого контроля температуры и
влажности

Смотрите про коптеры:  Инструкция по управлению квадрокоптером SYMA X5SC с камерой

Arduino1 будет один раз в 2 секунды считывать показания датчика DHT11 и отправлять
данные по радиоканалу на Arduino2,
которая выведет их на дисплей. В данном проекте использован символьный
ЖКИ-дисплей с конвертером I2C,
что позволяет использовать всего 2
провода для его подключения.

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector