Пример RC управления с помощью радио модулей NRF24L01 2.4GHz.

Данный пример позволяет с помощью недорогих радио модулей NRF24L01 2.4GHz управлять двумя сервоприводами (4 и 8 pin для подключения серв на приёмнике), двумя pwm выходами (pin 3 и 5) от одного потенциометра , а так же одним цифровым выходом (pin3 на приёмнике)по нажатию кнопки (pin3 на передатчике). Входы для подключения потенциометров — A0, A1, A2 .

Настоятельно не рекомендую питать сервы от Arduino !

Передатчик:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN   9
#define CSN_PIN 10
#define JOYSTICK_X A0
#define JOYSTICK_Y A1
#define JOYSTICK_Z A2
const uint64_t pipe = 0xE8E8F0F0E1LL; 
RF24 radio(CE_PIN, CSN_PIN); 
int joystick[4];
void setup()

{
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(pipe);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
 }


void loop()   
{
  joystick[0] = analogRead(JOYSTICK_X);
  joystick[0] = map(joystick[0],0,1023,1,180);
  joystick[1] = analogRead(JOYSTICK_Y);
  joystick[2] = analogRead(JOYSTICK_Z);
  joystick[2] = map(joystick[2],0,1023,1,180);
  joystick[3] = digitalRead(2);
  
  radio.write( joystick, sizeof(joystick) );
}

 

Приёмник:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
Servo myservo;
Servo myservo2;
#define CE_PIN   9
#define CSN_PIN 10
int pwm = 0;
const uint64_t pipe = 0xE8E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN); 
int joystick[4];
void setup()   
{
  
  delay(1000);
  
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();;
  myservo.attach(4);
  myservo2.attach(8); 
  pinMode(2, OUTPUT);
}


void loop()  
{
  if ( radio.available() )
  {
    
    bool done = false;
    while (!done)
    {
      done = radio.read( joystick, sizeof(joystick) );
      
      myservo.write(joystick[0]);
      myservo2.write(joystick[2]);
      digitalWrite(2, !joystick[3]); 
      
      
     if(joystick[1]==512)
{    analogWrite(3,0);
     analogWrite(5,0);
}

 if(joystick[1]>524)
 {   pwm = map(joystick[1], 524,1024,10,255);
     analogWrite(5,0);
     analogWrite(3,pwm);
 }
 
 if(joystick[1]<500)
 {   pwm = map(joystick[1],500,0,10,255);
     analogWrite(3,0);
     analogWrite(5,pwm);
 } 
      
      
  }
  }
  else
  {    
     
  }

  }

Подключение nRF24L01:

postimage
1 — GND
2 — VCC 3.3V !!! NOT 5V
3 — CE to Arduino pin 9
4 — CSN to Arduino pin 10
5 — SCK to Arduino pin 13
6 — MOSI to Arduino pin 11
7 — MISO to Arduino pin 12
8 — Не используется.

скачать скетчи и библиотеки

Пример RC управления с помощью радио модулей NRF24L01 2.4GHz.: Один комментарий

  1. pit

    Здоров ребята!
    Я уже несколько месяцем ломаю голову по трансиверу nrf24l01 все как то не получается , кто может сказать в чем я ошибаюсь . СПОСИБО за помощь! вот код.
    #include «stm32f4xx.h»
    #include «stm32f4xx_gpio.h»
    #include «stm32f4xx_rcc.h»
    #include «stm32f4xx_spi.h»
    #define ce_on GPIO_SetBits(GPIOA, GPIO_Pin_2);
    #define ce_off GPIO_ResetBits(GPIOA, GPIO_Pin_2);
    #define cs_on GPIO_ResetBits(GPIOA, GPIO_Pin_4);
    #define cs_off GPIO_SetBits(GPIOA, GPIO_Pin_4);
    #define cs_onB GPIO_ResetBits(GPIOB, GPIO_Pin_12);
    #define cs_offB GPIO_SetBits(GPIOB, GPIO_Pin_12);
    #define ce_offB GPIO_ResetBits(GPIOB, GPIO_Pin_11);
    #define ce_onB GPIO_SetBits(GPIOB, GPIO_Pin_11);
    #define irqB GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10);
    #define led1_on GPIO_SetBits(GPIOD, GPIO_Pin_12);
    #define led1_off GPIO_ResetBits(GPIOD, GPIO_Pin_12);
    #define led2_on GPIO_SetBits(GPIOD, GPIO_Pin_13);
    #define led2_off GPIO_ResetBits(GPIOD, GPIO_Pin_13);
    #define led3_on GPIO_SetBits(GPIOD, GPIO_Pin_14);
    #define led3_off GPIO_ResetBits(GPIOD, GPIO_Pin_14);
    #define led4_on GPIO_SetBits(GPIOD, GPIO_Pin_15);
    #define led4_off GPIO_ResetBits(GPIOD, GPIO_Pin_15);

    int main(void)
    {

    nrf24l01_init();
    ms_100();
    write(0x20, 0x0A); // включаем модуль А
    writeB(0x20, 0x0A); // включаем модуль B
    ms_1_5_();
    int t;

    uint8_t dec = 0;

    // channel

    write(0x25, 100);
    writeB(0x25, 100);
    //

    led1_on;
    uint8_t d = 0;
    uint8_t def = 0;

    while(1)
    {

    // На одном контроллере подключены два трансивера , цель заключается в том,
    // чтоб убедиться что все работает ( передать данные через один трансивере а принять на ругом)
    // замете что функции с большой быквы B например writeB() это обраение передающему модулю а если без B ,
    // то обращение принимающему модулю.
    write(0x20, 0x0b); // трансивер А устанавливается на приемник с помощью регистра конфигурации
    ce_on; // поднимаем ногу CE принимающего модуля
    mcs_130(); // ждем 130 микросекунд
    writeB(0xa0, d); // передаем данные в payload
    writeB(0x20, 0x0a); // Устанавливаем трансивер Б на выход
    ce_onB; // поднимаем ногу CE передающего модуля
    mcs_130(); // для уверенности ждем 130 микросекунд
    ce_offB; // опускаем ногу CE передающего модуля
    dec = readB(0x07); // читаем регистр статуса
    write(0x27, dec); // сбрасываем флажки
    dec = 0;
    dec = read(0x07);
    write(0x27, dec);
    def = read(0x61); // читаем из регистра payload принимающего модуля
    dec = read(0x07);
    write(0x27, dec);

    d ++;

    if(def == 0xaa){
    led1_on
    }else{
    led1_off;
    }

    if(def == 0xa0){
    led2_on
    }else{
    led2_off;
    }

    if(def == 0xff){
    led3_on
    }else{
    led3_off;
    }

    if(def == 0x0f){
    led4_on
    }else{
    led4_off;
    }

    ms_100();

    }
    }

Добавить комментарий для pit Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>