Радиоуправление машинкой на NRF24L01+ (Arduino Nano)

MrLuckas
Offline
Зарегистрирован: 15.12.2019

Всем привет! Обычно на форумах никогда не писал, но обратился из-за отчаяния и поэтому прошу о помощи. Имеется база машинки, но нет управления (совсем). И решил собрать сам на модулях NRF24L01 и на Arduino Nano. Управлять буду двумя джойстиками: одной сервой и одним коллекторным мотором (при помощи драйвера L298N). Я в этом деле новичок и не до конца понимаю почему не работает. Скечти компилируются, заливаются, но модуль не принимает отправленные данные (попросту - не общаются). Вот скетчи:

ТХ: (передатчик)

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

RF24 radio(7,8);

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

const int potpin_1 = 5; // вперёд, назад

const int potpin_2 = 4; // право, лево

byte button = 2;

byte transmit_data[3]; // массив, хранящий передаваемые данные

boolean butt_flag = 0;
boolean butt;
boolean led_flag = 0;
unsigned long last_press;

void setup()
 {

Serial.begin(9600);
  pinMode(button, INPUT_PULLUP); 

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

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

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

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}
void loop()
 {
butt = !digitalRead(button);
  
 if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) {
    butt_flag = 1;
    led_flag = !led_flag;
    digitalWrite(transmit_data[0], led_flag);
    last_press = millis();
  }
  if (butt == 0 && butt_flag == 1) {
    butt_flag = 0;
  }

 transmit_data[1] = analogRead(potpin_1);
 transmit_data[2] = map(analogRead(potpin_2), 0, 1023, 0, 180);
Serial.println(transmit_data[2]);
delay(30);

}

RX: (приемник)

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

RF24 radio(7, 8);

byte recieved_data[3]; // массив принятых данных

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

const int in1 = 3;    // управление двигателем 1
const int in2 = 4;    // управление двигателем 1
const int ena = 5;    // ШИМ для пропорциональной скорости машинки


byte mosfet = 13;

byte servo = 6;

Servo myservo;

void setup() 
{
Serial.begin(9600);
  
  pinMode(mosfet, OUTPUT); 
  
  pinMode(in1, OUTPUT);      // подключаем к L298n
  pinMode(in2, OUTPUT);      // подключаем к L298n
  pinMode(ena, OUTPUT);      // подключаем к L298n
  
  myservo.attach(servo);

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

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

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор 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(mosfet, recieved_data[0]);
    
 
  if (recieved_data[1] >=1 && recieved_data[1] <=480)
  {
     data =recieved_data[1]; 
     bspeed = map(data, 480, 1, 0, 255); 
     backward(bspeed);
  }
 
  
  if (recieved_data[1] >=495 && recieved_data[1] <=1022)
  {
    data = recieved_data[1]; 
    fspeed = map(data, 495, 1022, 0, 255); 
    forward(fspeed);
  }

  if (recieved_data[1] >481 &&  recieved_data[1] <500)
{
  data =  recieved_data[1]; 
  stop();
}

   myservo.write(recieved_data[2]);
Serial.println(recieved_data[2]);
delay(20);
  }
}
    
void stop()
{
  
  analogWrite(ena, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void forward(int fspeed)
{
  
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(ena, fspeed);
}

void backward(int bspeed)
{
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(ena, bspeed);
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Выкиньте джойстики и моторы из кода. Передатчик передает цифру "8", приемник её ловит и печатает. Справитесь?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

А зачем две темы? У Вас две машинки?

MrLuckas
Offline
Зарегистрирован: 15.12.2019

ЕвгенийП пишет:

А зачем две темы? У Вас две машинки?


Та то первая тема неудачная, неправильная.

MrLuckas
Offline
Зарегистрирован: 15.12.2019

sadman41 пишет:
Выкиньте джойстики и моторы из кода. Передатчик передает цифру "8", приемник её ловит и печатает. Справитесь?

В каком смысле выкинуть и откуда?

MrLuckas
Offline
Зарегистрирован: 15.12.2019

Короче, выяснил проблему... Один из модулей оказался нерабочим (не определяется и не видит каналы вокруг)

А так всё хорошо начиналось...

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Все рекомендации применили?

http://arduino.ru/forum/programmirovanie/nrf24l01?page=2#comment-31054