Arduino и nrf24l01

Kislotik
Offline
Зарегистрирован: 05.01.2018

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

Скетч приемника, может в нем много ошибок, не судите строго первый мой скетч. Спасибо

#include <SPI.h>
#include <nRF24L01.h> 
#include <RF24.h> //Скачиваем и устанавливаем библиотеку RF24 для радио модуля!!!!!!!!!
#include <Servo.h>
Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
#define CE_PIN   9
#define CSN_PIN 10
const uint64_t pipe = 0xB1E8F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN); 
int joystick[9];
unsigned long time;


void setup()   
{
  delay(50);
  radio.begin();
  radio.setChannel(9);
  radio.setDataRate(RF24_250KBPS);        // Установка минимальной скорости;
  radio.setPALevel(RF24_PA_HIGH);          // Установка максимальной мощности;
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  //myservo1.attach(A0); // Пин сервопривода мотор
  myservo2.attach(A0); // Пин сервопривода поворот
  myservo3.attach(A1); // Пин сервопривода сброс
  myservo4.attach(A2); // Пин сервопривода правый-левый
  
  pinMode(A3, OUTPUT); //Пин выхода на светодиод для подсветки от джойстика
  pinMode(A4, OUTPUT); //Пин выхода на светодиод для фонаря
  pinMode(A5, OUTPUT); //Пин выхода на светодиод от джойстика
  }


void loop()  
{
  if ( radio.available() )
  {
    time = millis();
    bool done = false;
    while (!done)
    {
      done = radio.read( joystick, sizeof(joystick) );
      if (millis() - time > 1000)
      {
      joystick[0]=0;
      joystick[1]=0;
      joystick[2]=0;
      joystick[3]=0;
      joystick[4]=0;
      joystick[5]=0;
      joystick[6]=0;
      joystick[7]=0;
      joystick[8]=0;
      }  
    else 
    bool done = true;
    while (done)
    {
      done = radio.read( joystick, sizeof(joystick) );
      if (millis() - time > 3000)
      digitalWrite(A5, LOW);
    
    }
      
   // myservo1.write(joystick[0]); // Сервопривод мотор
      myservo2.write(joystick[1]); // Сервопривод поворот
      digitalWrite(A3, !joystick[2]); //кнопка подсветка
      digitalWrite(A4, !joystick[4]); //кнопка фонарь
      digitalWrite(A5, !joystick[3]); //кнопка джойстика
           
           
if(!joystick[5]==HIGH)
  {
    myservo3.write(178); 
    }
      if(!joystick[6]==HIGH)
        {
          myservo3.write(2); 
            }
            
if(!joystick[7]==HIGH)
  {
    myservo4.write(110); 
      }
        if(!joystick[8]==HIGH)
          {
            myservo4.write(60); 
              }    
else 
  if(!joystick[7]==LOW)  
  if(!joystick[8]==LOW) 
  myservo4.write(85);
    }
  }
}
  
                     
  

 

Djn

 

 

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015
 if(radio.available())
    {
//если принимаем - делаем то-то или то-ту    
    }
else
{
//если ,например , в течение 1сек нет приема
 //тушим двигатель и включаем сирену
}

 

Kislotik
Offline
Зарегистрирован: 05.01.2018
1 if(radio.available())
2     {
3 //если принимаем - делаем то-то или то-ту   
4     }
5 else
6 {
7

//если ,например , в течение 1сек нет при

 

Не могли бы вы любой абразец написать? 

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

Kislotik, суть в том, что передатчик должен регулярно отсылать приемнику какой-то сигнал (например, раз в 10 секунд). Приемник же должен запоминать время прихода последнего стигнала и, если сигнала долго нет (например, 21 секунду), выключать мотор, etc.

Kislotik
Offline
Зарегистрирован: 05.01.2018

Пытаю этот код приспособить, но что то без результатно =((Может вы подскажите?

 

 

Простой принцип, делается метка времени (переменная типа unsigned long), в которую в момент приёма сигнала складывается время из millis(). Потом условие, если millis минус метка больше чем некий порог, то отключать.

01 byte rfdata; //payload=1
02 unsigned long lastcmd=millis();
03  
04 void loop(){
05   bool done=0;
06   if(radio.available()){
07     while(!done) done=radio.read(&rfdata,1);
08     lastcmd=millis();
09     // custom code here...
10     if(rfdata==7) PORTD&=B10011111; //stop
11   }
12   if(millis()-lastcmd>=3000) PORTD&=B10011111; //auto stop if no radio data
13 }

По такой схеме делают обнаружение отсутствия связи в DMX приёмниках.