nrf24l01+/ Помогите в коде прописать защиту от пропадания связи.

VOS
Offline
Зарегистрирован: 07.08.2015
Народ, всем привет.
Благодоря интернетам и чужим скетчам смог за 2 месяца собрать радиоуправление на свой карповый кораблик. Все работает как мне того хотелось, но нет гарантии, что мой кораблик не уйдет за горизонт, при пропадании связи. Мотор управляется простым замыканием реле. (Не хочу ШИМ - хочу реле!)
Если возможно подскажите, как можно сделать, чтоб при пропадании (сбое) связи в моем скетче пины 6,7,8 принимали значение HIGH
Естесно я новичок. Уже перепробовал все, что мне могло в голову прийти, а результата 0.
 
Код приемника:
/*
4 серво + 3 реле
Реле срабатывают в зависимости от положения джостика 1 по оси У на передатчике
*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>


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

byte recieved_data[6]; // массив принятых данных
byte servo_ruly = 2; // сервопривод на 2 цифровом (право/лево руля)
byte kt803 = 3; // сервопривод на 3 цифровом (регулятор мощности)
byte servo_left = 4; // сервопривод на 4 цифровом (выгруз левый)
byte servo_right = 5; // сервопривод на 5 цифровом (выгруз правый)

byte rele1 = 6; // реле на 6 цифровом (полный вперед катера)
byte rele2 = 7; // реле на 7 цифровом (малый вперед катера)
byte rele3 = 8; // реле на 8 цифровом (малый назад катера)
//byte relay = ?; // реле на ? цифровом (запасной на фару, если возьму мегу)

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;

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

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

  //pinMode(relay, OUTPUT); // настроить пин реле как выход
  pinMode(rele1, OUTPUT); // настроить пин реле как выход
  pinMode(rele2, OUTPUT); // настроить пин реле как выход
  pinMode(rele3, OUTPUT); // настроить пин реле как выход
  pinMode(servo_ruly, OUTPUT); // настроить пин сервопривода как выход
  pinMode(kt803, OUTPUT); // настроить пин сервопривода как выход
  pinMode(servo_left, OUTPUT); // настроить пин сервопривода как выход
  pinMode(servo_right, OUTPUT); // настроить пин сервопривода как выход

   digitalWrite(rele1, HIGH);
   digitalWrite(rele2, HIGH);
   digitalWrite(rele3, HIGH);

  myservo1.attach(servo_ruly);
  myservo2.attach(kt803);
  myservo3.attach(servo_left);
  myservo4.attach(servo_right);

      myservo1.write(90);
      myservo3.write(10);
      myservo4.write(10);
          
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 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_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(relay, recieved_data[0]); // подать на реле сигнал с 0 места массива то бишь 0 или 1
    myservo1.write(recieved_data[1]); // повернуть серво на угол с 1 элемента массива
    myservo2.write(recieved_data[2]); // повернуть серво на угол с 2 элемента массива
    myservo3.write(map((recieved_data[3]), 0, 115, 10, 160)); // повернуть серво на угол с 3 элемента массива
    myservo4.write(map((recieved_data[3]), 140, 255, 10, 160));// повернуть серво на угол с 3 элемента массива

    if ((recieved_data[4])>=134 && (recieved_data[4])<254) // (полный вперед катера)
    {
    digitalWrite(rele1, HIGH);
    digitalWrite(rele2, LOW);
    } 
        else if ((recieved_data[4])>=254) // (малый вперед катера)
    {
    digitalWrite(rele2, HIGH);
    digitalWrite(rele1, LOW);
    } 
            else if ((recieved_data[4])<=75) // (малый назад катера)
    {
    digitalWrite(rele3, LOW);
    } 
                else if ((recieved_data[4])>75 && (recieved_data[4])<134) // стоп мотор
    {    
    digitalWrite(rele1, HIGH);
    digitalWrite(rele2, HIGH);
    digitalWrite(rele3, HIGH);
    }
  }
}

на "всякий" код передатчика:


/*   
4 серво + 3 реле
Реле срабатывают в зависимости от положения джостика 1 по оси У
*/

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

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

#define JOYSTICK_1_X A0
#define JOYSTICK_1_Y A1
#define JOYSTICK_2_X A2
#define JOYSTICK_2_Y A3
#define POTENT_KT803 A4

byte button = 3;  // кнопка на 3 цифровом (фара)

byte transmit_data[6]; // массив, хранящий передаваемые данные
byte latest_data[6]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных

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(0x60);  //выбираем канал (в котором нет шумов!)

  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() {

  transmit_data[0] = !digitalRead(button); // инвертированный (!) сигнал с кнопки
  transmit_data[1] = map(analogRead(JOYSTICK_1_X), 0, 1023, 60, 120); // значение право/лево руля
  transmit_data[2] = map(analogRead(POTENT_KT803), 0, 1023, 10, 160); // регулятор мощности малого хода KT803
  transmit_data[3] = map(analogRead(JOYSTICK_2_X), 0, 1023, 0, 255); // выгруз левый/правый
  transmit_data[4] = map(analogRead(JOYSTICK_1_Y), 0, 1023, 0, 255); // полный/малый вперед + малый назад катера
  transmit_data[5] = map(analogRead(JOYSTICK_2_Y), 0, 1023, 0, 255); // запасной
  
  for (int i = 0; i < 6; i++) { // в цикле от 0 до числа каналов
    if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
      flag = 1; // поднять флаг отправки по радио
      latest_data[i] = transmit_data[i]; // запомнить последнее изменение
    }
  }

  if (flag == 1) {
    radio.powerUp(); // включить передатчик
    radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
    flag = 0; //опустить флаг
    radio.powerDown(); // выключить передатчик
  }

}

 

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

VOS пишет:

 Уже перепробовал все, что мне могло в голову прийти, а результата 0.

А можно посмотреть на то, что Вам "могло в голову прийти"?

VOS пишет:

Естесно я новичок. 

Чиво????

VOS пишет:

Зарегистрирован: 07.08.2015

"Типичный случай так-называемого вранья"? :))))

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

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

VOS
Offline
Зарегистрирован: 07.08.2015

Какого такого вранья?
Могу конечно десятко, другой своих бредово новаторских идей указать.
Но вы то и первый начнете тролить новичка.
Давайте я вам свои потуги публикую, а вы мне помагаете. Лады?

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

давай

VOS
Offline
Зарегистрирован: 07.08.2015

jeka_tm пишет:

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

Та с чего вдруг? В чем вранье? Вы чего?

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

jeka_tm пишет:

давай

1. Пытался ввести в передатчике контрольное значение массива 

типа [7] = 5

А в приемнике проверять если  [7] != 5, то все реле ХАЙ

VOS
Offline
Зарегистрирован: 07.08.2015

jeka_tm пишет:

а с того

А вот мое

http://samodelkifish.ru/samodelki_letniy_bbyt/samodelki_letniy_bbyt_na_b...

сделал на дтмф, теперь передалываю на радио

В чем ложь?

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

прочел с 18 по 21 страницу. Не понял посыла :)))

 
VOS
Offline
Зарегистрирован: 07.08.2015

2. пробовал перед while прописать        

          digitalWrite(rele1, HIGH);
          digitalWrite(rele2, HIGH);
          digitalWrite(rele3, HIGH);
 
VOS
Offline
Зарегистрирован: 07.08.2015

3 пробовал 

sizeof(recieved_data)!= 6

VOS
Offline
Зарегистрирован: 07.08.2015

4, пробовал while заменить на if, а  потом в else вписать реле ХАЙ

VOS
Offline
Зарегистрирован: 07.08.2015

Остальные глупости, так не вспомню, но по необходимости могу вспомнить.

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

http://arduino.ru/forum/proekty/radioupravlyaemyi-kater-iz-potolochki?page=18#comment-275624

каждый раз когда принимаются данные запоминается текущее время 63 строка. далее проверяется если время с последнего приема превысило 1 секунду выставляются нужные значения и переинициализируется радиомодуль. это с 76 по 79 строку

VOS
Offline
Зарегистрирован: 07.08.2015

jeka_tm пишет:

http://arduino.ru/forum/proekty/radioupravlyaemyi-kater-iz-potolochki?page=18#comment-275624

каждый раз когда принимаются данные запоминается текущее время 63 строка. далее проверяется если время с последнего приема превысило 1 секунду выставляются нужные значения и переинициализируется радиомодуль. это с 76 по 79 строку

Спасибо. Пойду тестить.

И я тебе за это помогу: твой кот Сизиф обречен, т.к. злые люди намотали ему ленту Мебиуса на рулон :)

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

не обречен. это круговорот бумаги. а кот его движитель

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

VOS пишет:
Какого такого вранья?
Самого обынковенного - "Естесно я новичок" с датой регистрации полуторалетней давности. Вы уже ветеран, бли, а всё в новичках ходите :)))

 

VOS
Offline
Зарегистрирован: 07.08.2015

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

VOS пишет:
Какого такого вранья?
Самого обынковенного - "Естесно я новичок" с датой регистрации полуторалетней давности. Вы уже ветеран, бли, а всё в новичках ходите :)))

Так это хобби, а не мой основной профиль ). А захожу, когда сам уже никак не могу разобраться.

VOS
Offline
Зарегистрирован: 07.08.2015

Еще раз спасибо. С пятой попытки, все работает, как надо. ) Удачи.

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

ну вот. плохо искал просто

VOS
Offline
Зарегистрирован: 07.08.2015

Видел эту ветку год назад, но понял, что не мой уровень еще.

Да я бы и сейчас не понял, если бы ты не разжевал по строкам. Говорят вам - новичок, а вы - брехло, брехло )))

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

срок регисторации. в нем все дело