Мучаю модуль NRF24 - очередной вопрос..

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Где ошибся не подскажете? Код в таком виде не хочет работать.. 

Передатчик:

#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
  
   RF24 radio(10, 9);
   const uint64_t pipe = 0xF0F0F0F0D2L;
   
   struct data {   
    uint8_t angle;
};
struct data packet;

void setup() {
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.setPayloadSize(32);
  radio.openWritingPipe(pipe);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);

  radio.powerUp(); 
  radio.stopListening();
}

void loop() {
 
int potValue = analogRead(A0);
packet.angle = map(potValue, 0, 1023, 1700, 350);

int potValue2 = analogRead(A1);
packet.angle = map(potValue2, 0, 1023, 1700, 350);

radio.write((uint8_t *)&packet, sizeof(struct data));

}

 

Приемник:

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

  BMC_SBUS mySBUS;
  
  RF24 radio(10, 9);
  const uint64_t pipe = 0xF0F0F0F0D2L;

  const int sbusWAIT        = 7;

  int PanChannel = 1;
  int TiltChannel = 2;
 
  struct data {    
    uint8_t angle;    
};
struct data packet;

void setup() {
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, pipe);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);

  radio.powerUp(); 
  radio.startListening();

   mySBUS.begin();
}

void loop() {
 
if (radio.available()) {
    radio.read((uint8_t *)&packet, sizeof(struct data));
    
    mySBUS.Servo(PanChannel, packet.angle);
    mySBUS.Servo(TiltChannel, packet.angle);

    mySBUS.Update();
    mySBUS.Send();
    delay(sbusWAIT);    
 }
}

 

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

Нам самим догадываться, что Вы имели в виду под

NVN Plus пишет:

Код в таком виде не хочет работать.. 

или Вы всё-таки объясните в чём проблема?

Потрудитесь пожалуйста по такой схеме

1. Что он должен делать?
2. Что реально делает?
3. Чем (1) отличается от (2)?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

NVN Plus пишет:

Где ошибся не подскажете? Код в таком виде не хочет работать.. 

Код работает в точности так, как написан.

Ошибок нет.

NVN Plus
Offline
Зарегистрирован: 04.12.2017

1. Джойстик должен управлять по двум осям (X,Y) удаленным устройством по протоколу SBUS.

2. В реале никаких команд от джойстика на устройство не поступает.

3. (1) - первый канал (X), (2) - второй канал (Y) внутри протокола SBUS. 

 Почему-то приходящие в пакете данные с джойстика не считываются (packet.angle). Вбиваю данные в ручную - команды выполняются. Пример: mySBUS.Servo(PanChannel, 1600); ускоренно вращает ось(Х) вправо и т.д. Не знаю как быть.

NVN Plus
Offline
Зарегистрирован: 04.12.2017

andriano пишет:

NVN Plus пишет:

Где ошибся не подскажете? Код в таком виде не хочет работать.. 

Код работает в точности так, как написан.

Ошибок нет.

Так я и сам не возьму в толк почему команды не выполняются.( Что делать ума не приложу..

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Параллельно воткнул серву - вращается. Может библиотека кривая, но тогда почему в проводном режиме все работает как надо?

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

NVN Plus пишет:

1. Джойстик должен управлять по двум осям (X,Y) удаленным устройством по протоколу SBUS.

Описывайте в терминах Вашей программы, а не общими словами.

NVN Plus пишет:

2. В реале никаких команд от джойстика на устройство не поступает.

Откуда это видно? Что не поступает? В коде нет никаких отладочных печатей, так откуда сделан такой вывод?

NVN Plus
Offline
Зарегистрирован: 04.12.2017

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

NVN Plus пишет:

 

2. В реале никаких команд от джойстика на устройство не поступает.

Откуда это видно? Что не поступает? В коде нет никаких отладочных печатей, так откуда сделан такой вывод?

Спасибо Евгений за наводящие вопросы. Подключил сериал порт и тут-же обозначилась проблема в приемнике. Сериал выводит крякозябры. У передатчика значения потенциометра отображаются правильно. Похоже что с приемником проблема. Вроде ошибок в коде приемника нет, но почему тогда данные не поступают?

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

NVN Plus пишет:

Подключил сериал порт и тут-же ....

Так всегда и поступайте - нельзя работать вслепую.

NVN Plus пишет:

почему тогда данные не поступают?

Показывайте код и то, что он печатает. Печатей побольше наставьте, чтобы всё отследить можно было.

NVN Plus
Offline
Зарегистрирован: 04.12.2017


 

 

Передатчик:

 

#include <SPI.h>
  #include <RF24.h>
  #include <nRF24L01.h>
RF24 radio(10, 9);
const uint64_t pipe = 0xF0F0F0F0D2L;
struct data {
    uint8_t leds;
    uint8_t angle;
};
 struct data packet;
void setup() {
   Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.setPayloadSize(32);
  radio.openWritingPipe(pipe);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);

  radio.powerUp(); 
  radio.stopListening();
}

void loop() {
 

int potValue = analogRead(A0);
packet.angle = map(potValue, 0, 1023, 0, 180);

Serial.print("Sent: "); Serial.println(packet.angle);
radio.write((uint8_t *)&packet, sizeof(struct data));

}

 

Приемник:

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

  BMC_SBUS mySBUS;
  
  RF24 radio(10, 9);
const uint64_t pipe = 0xF0F0F0F0D2L;

#include <Servo.h>
const int sbusWAIT        = 7;

  int PanChannel = 1;
  int TiltChannel = 2;
  int DutchChannel = 4;
  int RecChannel = 5;
  int MODEChannel = 6;
  int TRIGGERChannel = 7;

const int servo1 = 5;

Servo myservo1;
struct data {
    uint8_t leds;
    uint8_t angle;
};

struct data packet;

void setup() {
  
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, pipe);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);

  radio.powerUp(); 
  radio.startListening();
  
  mySBUS.begin();
}

void loop() {
 
if (radio.available()) {
    radio.read((uint8_t *)&packet, sizeof(struct data));
    Serial.print("Recieved: "); Serial.println(packet.angle);
    
    mySBUS.Servo(MODEChannel,1024);
    mySBUS.Servo(TRIGGERChannel,1024);
    mySBUS.Servo(PanChannel,packet.angle); 
    
    mySBUS.Update();
    mySBUS.Send();
    delay(sbusWAIT);
    
}}

 

ZXPirate
Offline
Зарегистрирован: 18.02.2020

   const uint64_t pipe = 0xF0F0F0F0D2L;

Наводящий вопрос: что за L на конце числа? и сколько их должно быть?

NVN Plus
Offline
Зарегистрирован: 04.12.2017

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

NVN Plus пишет:

Печатей побольше наставьте, чтобы всё отследить можно было.

Не знаю куда ещё вставить печати, чтобы понять, где проблема. Странно, я подключал в параллель серву (выше писал уже) та работала как ни в чем не бывало, по идее тоже ведь не должна..

NVN Plus
Offline
Зарегистрирован: 04.12.2017

ZXPirate пишет:

   const uint64_t pipe = 0xF0F0F0F0D2L;

Наводящий вопрос: что за L на конце числа? и сколько их должно быть?

Спасибо, исправил, но ничего не поменялось..(

ZXPirate
Offline
Зарегистрирован: 18.02.2020

А модули точно работают? У меня в одной посылке из 5 один только рабочий был.

ZXPirate
Offline
Зарегистрирован: 18.02.2020
23   radio.stopListening();
22

  radio.powerUp();

 

не уверен , что эти команды необходимы.

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Да, модули рабочие 100%. Я пробовал и без этих команд, оставлял только трубу и листинг - тоже самое.

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

NVN Plus пишет:

Спасибо, исправил, но ничего не поменялось..(

Выкладывайте свежий код (откуда нам знать, что и как Вы исправили) и содержимое вывода. Только не картинкой, а текстом - на картинке я лично НИХРЕНА не разглядел

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Евгений, вчера был измотан экспериментами и голова уже не соображала. Сейчас на свежую голову благодаря в том числе и вашим бесценным советам кое в чем разобрался, но проблема пока не решена. Надеюсь с вашей помощью мне удастся её победить - уверен.

Теперь на чем собственно остановился. После рядов экспериментов с кодом, выяснилось, что пакеты исправно передаются и принимаются (благодаря печатям, уверен), но как только я прописываю в сетапе  "mySBUS.begin();" все - появляются кракозябры. Вот с этим думаю и предстоит разобраться. Я выше несколько раз упоминал, что подключал сервопривод к каналу и он успешно реагировал на манипуляции потенциометра - это ещё одно свидетельство того, что прием/передача налажена верно и исправно работает. Я подозреваю, что передача по SBUS протоколу должна осуществляться по иному принципу, т.к. этот протокол содержит в себе 16 каналов "PWM" и является пакетом данных, а не конкретным каналом с одной единицей команд как в случае с сервоприводом. Думаю в этом и кроется корень "зла". Какие шаги предпринять дальше я не знаю, ибо для этого у меня знаний маловато. Мне думается, что надо как-то распаковывать SBUS на составляющие и потом поканально передавать эти данные по трубе, или что-то в этом роде. Что вы думаете по этому поводу?

NVN Plus
Offline
Зарегистрирован: 04.12.2017

Евгений, разобрался! Оказывается все дело в том, что SBUS работает на больших скоростях передачи, чем стояло в сериал мониторе (9600 против 1000000) по этой причине и кракозябры. Теперь сериал показывает вменяемые переменные. Там все ок! Прием/передача данных налажена о чем свидетельствуют цифры на приемопередающих устройствах.

 Sent: 89

Sent: 89
Sent: 89
Sent: 89
Sent: 89
Sent: 89
Sent: 89
Sent: 89
Sent: 89
Sent: 89
 
X         Recieved: 89 
X         Recieved: 89 
X         Recieved: 89 
X         Recieved: 89 
X         Recieved: 89 
X         Recieved: 89 
X         Recieved: 89 
X         Recieved: 89 
X         Recieved: 89 
 
Только на показаниях приемника почему-то добавилась в самом начале буква "Х". Она меняется на другую если цифровые показания меняются. Скажем числу "88" соответствует буква "Z", ну и т.д.
 
Но по прежнему код остается не рабочим при всем при этом.((
 
NVN Plus
Offline
Зарегистрирован: 04.12.2017

Спасибо всем за помощь - советы помогли.. отладочный монитор - сила!