После откл/вкл. питания отеря связи между nRF24l01

jonni.e
Offline
Зарегистрирован: 23.04.2017

Всем привет. Я не спец, только учусь. Делаю радиоуправление для самолета. Оборудование Arduino nano 2шт. и два модуля nRF24l01(один с усилком). Столкнулся с проблемой: загружаю скетч в приемник и передатчик- все работает без проблем. Снимаю питание и включаю опять (без разници приемник или передатчик), управление теряется, reset и повторная загрузка скэтча не помогает. Загружаю в ардуинки тестовый скэтч (GettingStarted_CallResponse) связь есть в двух направлениях, откл/вкл. связь в норме. Опять загружаю скэтч приемника и передатчика и все работает до снятия питания, и так по кругу. Если при наличии связи сделать reset то все работает нормально, затыкается если только питание снимаю. Ни кто не сталкивался с такой проблемой?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
jonni.e
Offline
Зарегистрирован: 23.04.2017

Спасибо, почитал. С установкой в нужные значения серво я разобрался, но не понял как сделать переинициализацию радиомодуля. Вставка "protocol.init(&wireless);" выдает ошибку "protokol was not declared in this scope", явно чего-то не хватает, ткните носом плиз что не так делаю. А как работает эта команда?

#include <SPI.h>        
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
const uint64_t pipe = 0xF0F1F2F3F4LL; 
RF24 radio(9, 10); 
byte msg[8];
Servo L1;
Servo L2;
Servo L3;
unsigned long time;
void setup(){
  L1.attach(5); 
  L2.attach(6); 
  L3.attach(7);
 delay(50);
 radio.begin();
 radio.setChannel(9); 
 radio.setPayloadSize(8);
 radio.setDataRate(RF24_250KBPS);  
 radio.setPALevel(RF24_PA_HIGH); 
 radio.openReadingPipe(1,pipe); 
 radio.startListening(); 
}
void loop() {   
 if (radio.available()){ 
  time = millis();
radio.read(&msg, sizeof(msg));} 
if (millis() - time > 1000){
msg[0]=90;
msg[1]=90;}
L1.write(msg[0]);
L2.write(msg[2]);
L3.write(msg[1]);
} 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ты вставил целый код, а не команду

библиотека нужна другая. я давал ссылку

jonni.e
Offline
Зарегистрирован: 23.04.2017

Я видать не правильно понял. Скачал твою библиатеку RF24 и копирую ее в папку libraries(rf24 свою удалил)  и дописываю protocol.init(&wireless); , выдает ошибку всеравно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

идэ перезапускал. когда меняешь или устанавливаешь лучше перезапускать

я у тебя не увидел кода передатчика. хз куда ты его вставляешь

jonni.e
Offline
Зарегистрирован: 23.04.2017

Я видать не правильно понял. Скачал твою библиатеку RF24 и копирую ее в папку libraries(rf24 свою удалил)  и дописываю protocol.init(&wireless); , выдает ошибку всеравно.

jonni.e
Offline
Зарегистрирован: 23.04.2017

Передатчик с таким кодом. 

#include <SPI.h>          
#include <nRF24L01.h>
#include <RF24.h>
byte msg[8];
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);

int Right_joy_vertical = 0;
int Right_joy_horizon = 1;
//int Left_joy_horizon = 2;
int Left_joy_vertical = 3;
int Right_trim = 6;
int Left_trim = 7;

byte Right_tumb_3pos_forward = 3;
byte Right_tumb_3pos_back = 4;
byte Right_tumb_2pos = 5;
byte Left_tumb_2pos = 6;
byte Left_tumb_3pos_back = 7;
byte Left_tumb_3pos_forward = 8;

byte R_joy_hor;

void setup() {
Serial.begin(9600);
pinMode(Right_tumb_3pos_back, INPUT);
pinMode(Right_tumb_3pos_forward, INPUT);
pinMode(Right_tumb_2pos, INPUT);
pinMode(Left_tumb_2pos, INPUT);
pinMode(Left_tumb_3pos_forward, INPUT);
pinMode(Left_tumb_3pos_back, INPUT);

radio.begin();
  delay(50);
  radio.setChannel(9);
  radio.setPayloadSize(8);
  radio.setRetries(1,1);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openWritingPipe(pipe);
}

void loop() {
int R_trim = map(analogRead(Right_trim), 0, 1023, 0, 180);
if(analogRead(Right_joy_horizon) < 512)
R_joy_hor = map(analogRead(Right_joy_horizon), 0, 511, 0, R_trim);
else
R_joy_hor = map(analogRead(Right_joy_horizon), 512, 1023, R_trim, 180);

if (digitalRead(Right_tumb_3pos_forward) == 1){
msg[0] = map(R_joy_hor, 0, 180, 45, 135);}
if (digitalRead(Right_tumb_3pos_back) == 0 && digitalRead(Right_tumb_3pos_forward)== 0){
msg[0] = map(R_joy_hor, 0, 180, 22, 158);}
if (digitalRead(Right_tumb_3pos_back) == 1){msg[0] = R_joy_hor;}

int L_trim = map(analogRead(Left_trim), 0, 1023, 0, 180);
if(analogRead(Right_joy_vertical) < 512)
msg[1] = map(analogRead(Right_joy_vertical), 0, 511, 0, L_trim);
else
msg[1] = map(analogRead(Right_joy_vertical), 512, 1023, L_trim, 180);

if (digitalRead(Left_tumb_3pos_forward) == 1){
msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 255, 10); //}
if (digitalRead(Left_tumb_3pos_back) == 0 && digitalRead(Left_tumb_3pos_forward)== 0){
msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2100);}
if (digitalRead(Left_tumb_3pos_back) == 1){
msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2000);}

msg[3] = digitalRead(Right_tumb_2pos);
msg[4] = digitalRead(Left_tumb_2pos);
radio.write(&msg, sizeof(msg));
Serial.println(analogRead(Left_joy_vertical));
}

 

jonni.e
Offline
Зарегистрирован: 23.04.2017

А вставляю в приемник так

#include <SPI.h>        
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
const uint64_t pipe = 0xF0F1F2F3F4LL; 
RF24 radio(9, 10); 
byte msg[4];
Servo L1;
Servo L2;
Servo L3;
unsigned long time;
void setup(){
  L1.attach(5); //правый дж.горизонт
  L2.attach(6); //левый скорость двигателя
  L3.attach(7); //правый дж.вертикаль
 delay(50);
 radio.begin();
 radio.setChannel(9); 
 radio.setPayloadSize(4);
 radio.setDataRate(RF24_250KBPS);  
 radio.setPALevel(RF24_PA_HIGH); 
 radio.openReadingPipe(1,pipe); 
 radio.startListening(); 
}
void loop() {   
 if (radio.available()){ 
  time = millis();
  
radio.read(&msg, sizeof(msg));} 
if (millis() - time > 1000){
protocol.init(&wireless);
msg[0]=90;
msg[1]=90;}
L1.write(msg[0]); //горизонт
L2.write(msg[2]); //двигатель
L3.write(msg[1]); //вертикаль
} 

 

jonni.e
Offline
Зарегистрирован: 23.04.2017

Ура!!!! Заработало, а дело было в библиотеке, видать не такая какая-то стояла. Спасибо огромное. Странно что отказывался работать после откл\вкл питания- суть проблемы не понятна была. 

jonni.e
Offline
Зарегистрирован: 23.04.2017

А подскажи такой вопрос если не трудно. При управлении БК двигателем с ардуино (не через радио) диапазон стоит такой  int val = map (analogRead(0), 0, 1023, 800, 2300); и обороты с потенциометра от минимума до максимума. Когда в передатчике ставлю так же (как  в скетче ниже msg[2]), то за полный ход потенциометра движок раз шесть ускоряется и останавливается и отсутствуют максимальные обороты, или поймать их не могу. Другой диапазон нужен? p.s. 2300

#include <SPI.h>          
#include <nRF24L01.h>
#include <RF24.h>
byte msg[8];
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);

int Right_joy_vertical = 0;
int Right_joy_horizon = 1;
//int Left_joy_horizon = 2;
int Left_joy_vertical = 3;
int Right_trim = 6;
int Left_trim = 7;

byte Right_tumb_3pos_forward = 3;
byte Right_tumb_3pos_back = 4;
byte Right_tumb_2pos = 5;
byte Left_tumb_2pos = 6;
byte Left_tumb_3pos_back = 7;
byte Left_tumb_3pos_forward = 8;

byte R_joy_hor;

void setup() {
Serial.begin(9600);
pinMode(Right_tumb_3pos_back, INPUT);
pinMode(Right_tumb_3pos_forward, INPUT);
pinMode(Right_tumb_2pos, INPUT);
pinMode(Left_tumb_2pos, INPUT);
pinMode(Left_tumb_3pos_forward, INPUT);
pinMode(Left_tumb_3pos_back, INPUT);

radio.begin();
  delay(50);
  radio.setChannel(9);
  radio.setPayloadSize(8);
  radio.setRetries(1,1);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openWritingPipe(pipe);
}

void loop() {
int R_trim = map(analogRead(Right_trim), 0, 1023, 0, 180);
if(analogRead(Right_joy_horizon) < 512)
R_joy_hor = map(analogRead(Right_joy_horizon), 0, 511, 0, R_trim);
else
R_joy_hor = map(analogRead(Right_joy_horizon), 512, 1023, R_trim, 180);

if (digitalRead(Right_tumb_3pos_forward) == 1){
msg[0] = map(R_joy_hor, 0, 180, 45, 135);}
if (digitalRead(Right_tumb_3pos_back) == 0 && digitalRead(Right_tumb_3pos_forward)== 0){
msg[0] = map(R_joy_hor, 0, 180, 22, 158);}
if (digitalRead(Right_tumb_3pos_back) == 1){msg[0] = R_joy_hor;}

int L_trim = map(analogRead(Left_trim), 0, 1023, 0, 180);
if(analogRead(Right_joy_vertical) < 512)
msg[1] = map(analogRead(Right_joy_vertical), 0, 511, 0, L_trim);
else
msg[1] = map(analogRead(Right_joy_vertical), 512, 1023, L_trim, 180);

//if (digitalRead(Left_tumb_3pos_forward) == 1){
msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 2300, 800); //}
//if (digitalRead(Left_tumb_3pos_back) == 0 && digitalRead(Left_tumb_3pos_forward)== 0){
//msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2100);}
//if (digitalRead(Left_tumb_3pos_back) == 1){
//msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2000);}

msg[3] = digitalRead(Right_tumb_2pos);
msg[4] = digitalRead(Left_tumb_2pos);
radio.write(&msg, sizeof(msg));
Serial.println(analogRead(Left_joy_vertical));

к несколько раз набирает и сбрасывает обороты

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

бросилось в глаза что ты используешь map не проверяя диапазон. а если число не в диапазоне будет?

я по правильному все значения что передаешь по радиоканалу отправь в терминал и там посмотри. искать ошибки нужно так))

jonni.e
Offline
Зарегистрирован: 23.04.2017

Что значит map не проверяя диапазон? Не, то что потенциометр выдает от 0 до 1023 это я проверил конечно. Вот для серво весь диапазон потениометра мы делим на градусы от 0 до 180 от этого и угол поворота зависит. А при управлении движком не через радиоканал я весь диапазон приравнивал а 800-2300 и все норм. А если через радио то не хочет почему-то, крайнее нулевое движок вообще ругается и шесть раз за диапазон обороты то ростут то сбрасывает. Не вьеду ни как.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

с мар еще раз посмотрю. а вот то что ты отправляешь значение в 63 строке от 800 до 2300, а массив у тебя 4 строка byte и значения не могут быть больше 255

а про терминал ты не заметил?

jonni.e
Offline
Зарегистрирован: 23.04.2017

А что про терминал, что не заметил? не понял вопрос просто, я просто только постигаю азы так сказать. Все методом проб и ошибок, плюс примеры других.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

отправляй в терминал что отправляешь через радиомодули. serial.print и т.д. и увидишь в чем проблема

jonni.e
Offline
Зарегистрирован: 23.04.2017

Выставил msg[2] = map(analogRead(Left_joy_vertical), 0, 1022, 0, 255); В терминале смотрю, от 0-90 - движок пищит ошибкой, 110-680 разгон, дальше остановка и пищит опять, не вьеду ни как :(

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

весь код выкладывай и передатчика и приемника

jonni.e
Offline
Зарегистрирован: 23.04.2017

Передатчик 

#include <SPI.h>          
#include <nRF24L01.h>
#include <RF24.h>
byte msg[8];
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);

int Right_joy_vertical = 0;
int Right_joy_horizon = 1;
//int Left_joy_horizon = 2;
int Left_joy_vertical = 3;
int Right_trim = 6;
int Left_trim = 7;

byte Right_tumb_3pos_forward = 3;
byte Right_tumb_3pos_back = 4;
byte Right_tumb_2pos = 5;
byte Left_tumb_2pos = 6;
byte Left_tumb_3pos_back = 7;
byte Left_tumb_3pos_forward = 8;

byte R_joy_hor;

void setup() {
Serial.begin(9600);
pinMode(Right_tumb_3pos_back, INPUT);
pinMode(Right_tumb_3pos_forward, INPUT);
pinMode(Right_tumb_2pos, INPUT);
pinMode(Left_tumb_2pos, INPUT);
pinMode(Left_tumb_3pos_forward, INPUT);
pinMode(Left_tumb_3pos_back, INPUT);

radio.begin();
  delay(50);
  radio.setChannel(9);
  radio.setPayloadSize(8);
  radio.setRetries(1,1);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openWritingPipe(pipe);
}

void loop() {
int R_trim = map(analogRead(Right_trim), 0, 1023, 0, 180);
if(analogRead(Right_joy_horizon) < 512)
R_joy_hor = map(analogRead(Right_joy_horizon), 0, 511, 0, R_trim);
else
R_joy_hor = map(analogRead(Right_joy_horizon), 512, 1023, R_trim, 180);

if (digitalRead(Right_tumb_3pos_forward) == 1){
msg[0] = map(R_joy_hor, 0, 180, 45, 135);}
if (digitalRead(Right_tumb_3pos_back) == 0 && digitalRead(Right_tumb_3pos_forward)== 0){
msg[0] = map(R_joy_hor, 0, 180, 22, 158);}
if (digitalRead(Right_tumb_3pos_back) == 1){msg[0] = R_joy_hor;}

int L_trim = map(analogRead(Left_trim), 0, 1023, 0, 180);
if(analogRead(Right_joy_vertical) < 512)
msg[1] = map(analogRead(Right_joy_vertical), 0, 511, 0, L_trim);
else
msg[1] = map(analogRead(Right_joy_vertical), 512, 1023, L_trim, 180);

//if (digitalRead(Left_tumb_3pos_forward) == 1){
msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 0, 255); //}
//if (digitalRead(Left_tumb_3pos_back) == 0 && digitalRead(Left_tumb_3pos_forward)== 0){
//msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2100);}
//if (digitalRead(Left_tumb_3pos_back) == 1){
//msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2000);}

msg[3] = digitalRead(Right_tumb_2pos);
msg[4] = digitalRead(Left_tumb_2pos);
radio.write(&msg, sizeof(msg));
Serial.println(analogRead(Left_joy_vertical));
}

Приемник

#include <SPI.h>        
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
const uint64_t pipe = 0xF0F1F2F3F4LL; 
RF24 radio(9, 10); 
byte msg[8];
Servo L1;
Servo L2;
Servo L3;
unsigned long time;
void setup(){
  L1.attach(5); 
  L2.attach(6); 
  L3.attach(7);
 delay(50);
 radio.begin();
 radio.setChannel(9); 
 radio.setPayloadSize(8);
 radio.setDataRate(RF24_250KBPS);  
 radio.setPALevel(RF24_PA_HIGH); 
 radio.openReadingPipe(1,pipe); 
 radio.startListening(); 
}
void loop() {   
 if (radio.available()){ 
  time = millis();
radio.read(&msg, sizeof(msg));} 
if (millis() - time > 1000){
msg[0]=90;
msg[1]=90;}
L1.write(msg[0]); // серва
L2.write(msg[2]); // двигатель
L3.write(msg[1]); // серва2
} 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну конечно. msg 2 смотри что придет на двигатель. ты перепутал что можно передавать через переменную byte и что нужно для управления двигателем. используй терминал!!! сам бы увидел ошибку по значениям

jonni.e
Offline
Зарегистрирован: 23.04.2017

Поправь если не так, а то не вьеду пока. byte - значение в диапазоне  0....255, для управления двигателем нужен диапазон  800...2200. Вереоятно нужно поменять byte на int и поменять значение msg[2] с (0, 255) на (800, 2200). 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

это если в миллисекундах нужно отдавать. а если в градусах там же диапазон от 0 до 180. нужно ли тебе более точное управление

jonni.e
Offline
Зарегистрирован: 23.04.2017

Тогда сдаюсь, пока не пойму.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

напиши в 63 строке передатчика 

msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 0, 180);

если не будет хватать точности управления тогда переделаешь на управление миллисекундами

jonni.e
Offline
Зарегистрирован: 23.04.2017

Спасибо попробую. Я правильно понял, что в случае работы с byte  мы должны использовать диапазон как для сервы так и двигателя (0,180)? Я думал что (0,180) это условная единица так же равная градусам, но как тогда градус приравнивается к вращению мотора (мин и макс обороты), ведь максимальное значение byte=255

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

byte  это как размер емкости, ты же не можешь в литровую банку налить 1.5литра воды? 

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

http://arduino.ru/Reference/Serial

это про терминал

по серве

http://arduino.ru/Reference/Library/Servo

в градусах

http://arduino.ru/Reference/Library/Servo/write

в мкс

http://arduino.ru/Reference/Library/Servo/writeMicroseconds

jonni.e
Offline
Зарегистрирован: 23.04.2017

Спасибо большое за помощь. Я только учусь пока. Я читал прежде чем пробовать, вероятно не все понял правильно. Вот например про Servo.write() написано что управление двигателем (0,180) это максимальные значения скорости в разных направлениях, а 90 - это стоп. Но БК двигатель мы не изменим вращение програмно же, только провода местами. И исходя из написанного мне вроде как в коде надо прописать msg[2] = map(analogRead(Left_joy_vertical), 0, 1022, 0, 90); - в чем подвох? что опять не понял? Я понял что есть команда Servo.write() и Servo.writeMicroseconds()  и пробовал их применять при управлении напрямую без радиоканала, а вот их применение к радиоканалу не понял. Библиотеку servo мы используем на приемнике и прописав например в своем коде строку 35 как L2.writeMicroseconds(msg[2]); он будет принимать в микросекундах? но тогда мы по идее должны и передавать в микросекундах? А какая команда определяет порядок передатчика в градусах или микросекундах тогда?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

серва 0-180 градусов, 90 - середина

мотор с реверсом. 0-90 вперед, 0 макс. вперед, 90-180 назад, 180 макс назад. 90 - стоп

бк мотор 0-180. 180 макс

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

jonni.e
Offline
Зарегистрирован: 23.04.2017

Спасибо, запомню как аксиому. Про "код выше" я понял. А что конкретно определяет отсылку в градусах или микросекудах, только byte и int?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

jonni.e
Offline
Зарегистрирован: 23.04.2017

 ну это от неправильного представления ключей и молотка ))). Приведи пример отсылки в микросекундах если не сложно, так сказать увидеть воочию ;)

 

jonni.e
Offline
Зарегистрирован: 23.04.2017

"Матрица" ко мне не совсем еще пришла )))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
R_joy_hor = map(analogRead(Right_joy_horizon), 0, 511, 1000, 2000); 
// 1000 и 2000 эти цифры у разных производителей разные. может быть 800 и 2200 например

myservo.writeMicroseconds(R_joy_hor);

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

jonni.e
Offline
Зарегистрирован: 23.04.2017

Еще раз спасибо, пойду дальше пробовать и учиться

jonni.e
Offline
Зарегистрирован: 23.04.2017

Добрался до дома и прописал как ниже. В результате в терминале что передача, что прием msg2 (0,180), а вот движок всеравно пищит и интервалах (0,22) и (174,180) и критить двигатель начинает где-то от 113. Не нравяться крайние положения почему-то :(

Передатчик

#include <SPI.h>          
#include <nRF24L01.h>
#include <RF24.h>
byte msg[8];
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);

int Right_joy_vertical = 0;
int Right_joy_horizon = 1;
//int Left_joy_horizon = 2;
int Left_joy_vertical = 3;
int Right_trim = 6;
int Left_trim = 7;

byte Right_tumb_3pos_forward = 3;
byte Right_tumb_3pos_back = 4;
byte Right_tumb_2pos = 5;
byte Left_tumb_2pos = 6;
byte Left_tumb_3pos_back = 7;
byte Left_tumb_3pos_forward = 8;

byte R_joy_hor;

void setup() {
Serial.begin(9600);
pinMode(Right_tumb_3pos_back, INPUT);
pinMode(Right_tumb_3pos_forward, INPUT);
pinMode(Right_tumb_2pos, INPUT);
pinMode(Left_tumb_2pos, INPUT);
pinMode(Left_tumb_3pos_forward, INPUT);
pinMode(Left_tumb_3pos_back, INPUT);

radio.begin();
  delay(50);
  radio.setChannel(9);
  radio.setPayloadSize(8);
  radio.setRetries(1,1);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openWritingPipe(pipe);
}

void loop() {
int R_trim = map(analogRead(Right_trim), 0, 1023, 45, 135);
if(analogRead(Right_joy_horizon) < 512)
R_joy_hor = map(analogRead(Right_joy_horizon), 0, 511, 0, R_trim);
else
R_joy_hor = map(analogRead(Right_joy_horizon), 512, 1023, R_trim, 180);

if (digitalRead(Right_tumb_3pos_forward) == 1){
msg[0] = map(R_joy_hor, 0, 180, 45, 135);}
if (digitalRead(Right_tumb_3pos_back) == 0 && digitalRead(Right_tumb_3pos_forward)== 0){
msg[0] = map(R_joy_hor, 0, 180, 22, 158);}
if (digitalRead(Right_tumb_3pos_back) == 1){msg[0] = R_joy_hor;}

int L_trim = map(analogRead(Left_trim), 0, 1023, 45, 135);
if(analogRead(Right_joy_vertical) < 512)
msg[1] = map(analogRead(Right_joy_vertical), 0, 511, 0, L_trim);
else
msg[1] = map(analogRead(Right_joy_vertical), 512, 1023, L_trim, 180);

//if (digitalRead(Left_tumb_3pos_forward) == 1){
msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 0, 180); //}
//if (digitalRead(Left_tumb_3pos_back) == 0 && digitalRead(Left_tumb_3pos_forward)== 0){
//msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2100);}
//if (digitalRead(Left_tumb_3pos_back) == 1){
//msg[2] = map(analogRead(Left_joy_vertical), 0, 1023, 800, 2000);}

msg[3] = digitalRead(Right_tumb_2pos);
msg[4] = digitalRead(Left_tumb_2pos);
radio.write(&msg, sizeof(msg));
Serial.println(msg[2]);
Serial.println(analogRead(Left_joy_vertical));
}

Приемник 

#include <SPI.h>        
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
const uint64_t pipe = 0xF0F1F2F3F4LL; 
RF24 radio(9, 10); 
byte msg[8];
Servo L1;
Servo L2;
Servo L3;
unsigned long time;
void setup(){
  Serial.begin(9600);
  L1.attach(5); //правый дж.горизонт
  L2.attach(6); //левый скорость двигателя
  L3.attach(7); //правый дж.вертикаль
 delay(50);
 radio.begin();
 radio.setChannel(9); 
 radio.setPayloadSize(8);
 radio.setDataRate(RF24_250KBPS);  
 radio.setPALevel(RF24_PA_HIGH); 
 radio.openReadingPipe(1,pipe); 
 radio.startListening(); 
}
void loop() {   
 if (radio.available()){ 
  time = millis();
  
radio.read(&msg, sizeof(msg));} 
if (millis() - time > 1000){
msg[0]=90;
msg[1]=90;}
L1.write(msg[0]); //горизонт
L2.write(msg[2]); //двигатель
L3.write(msg[1]); //вертикаль
Serial.println(msg[2]);
} 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

jonni.e
Offline
Зарегистрирован: 23.04.2017

Пока не получается в микросекундах, что-то не так прописываю. Монтаж вроде в норме +- на крайние а переменный вывод на А3 как в скетче прописано

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

напрямую попробуй без радиоканала

 

jonni.e
Offline
Зарегистрирован: 23.04.2017

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

jonni.e
Offline
Зарегистрирован: 23.04.2017

у меня получился (800, 2300)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну вот. просто другой диапазон нужен

jonni.e
Offline
Зарегистрирован: 23.04.2017

А есть формула перевода из микросекунд в градусы, или только методом научного тыка? )))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да что ты прицепился к еденицам, это как дюймы и метры. просто для градусов диапазон жесткий заданный в библиотеке 0-180 градусов/1000-2000мкс

jonni.e
Offline
Зарегистрирован: 23.04.2017

Ааааааа, Семен Семеныч, понял теперь ))) Вот оно ключевое слово 0-180=constanta=1000-2000

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну ты жираф)))

jonni.e
Offline
Зарегистрирован: 23.04.2017

Я просто совсем новичок в этом ремесле. Только неделю разбираюсь, уроки смотрю, пробую

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

привыкнешь