Дублирование пинов при помощи nRF24l01.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Всем привет. Скажите можно ли сделать дублирование пинов на одной ардуине через радио модуль к другой ардуине. Тоесть например, появилась лог 1 на 3 пине одной ардуины, эта 1 появляется сразу и на 3 пине второй ардуины.

Вот скетч, который работает в одном направлении. А как сделать что-бы без разницы где преемник, а где передатчик:

ПРИЕМНИК:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"
const uint64_t pipe2 = 0xF0F1F2F3F3LL;
RF24 radio(9, 53); // CE, CSN
int pin2 = 3;//Выход
int val;
void setup(){
//  Serial.begin(9600);
pinMode(pin2, OUTPUT);
  radio.begin();
  delay(2);
  radio.setChannel(45); // канал (0-127)
   
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);
  
    // мощьность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);  
 
  radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу

//  radio.openWritingPipe(pipe); // открываем трубу на передачу.

}

////// для UNO
void loop()  
{
    if (radio.available()){ // проверяем не пришло ли чего в буфер.
    int val;
    radio.read(&val, sizeof(val)); // читаем данные и указываем сколько байт читать
   
    if (val == 1){ // если пришло 1,
digitalWrite(pin2, HIGH);
    }
        if (val == 0){ // если пришло 0,
digitalWrite(pin2, LOW);
    }
    }
  } 

ПЕРЕДАТЧИК:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"
const uint64_t pipe2 = 0xF0F1F2F3F3LL;
RF24 radio(9, 53); // CE, CSN
int pin = 3;
int val;
void setup(){
  Serial.begin(9600);
  radio.begin(); 
  delay(2);
  radio.setChannel(45); // канал (0-127)
 
    // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
    // RF24_250KBPS на nRF24L01 (без +) неработает.
    // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);    
 
    // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);  
   
  radio.openReadingPipe(1,pipe2); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу
}

void loop()  
{
  digitalWrite(pin, HIGH);
    if (digitalRead(pin) == HIGH){ // если это 1
      val = 1;
      radio.stopListening(); // останавливает приём (нужно перед началом передачи)
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
      radio.write(&val, sizeof(val)); // отправляем val и указываем сколько байт пакет
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }
    Serial.flush(); // очищаем буфер 
         if (digitalRead(pin) == LOW){ // если это 1
      val = 0;
      radio.stopListening(); // останавливает приём (нужно перед началом передачи)
      radio.openWritingPipe(pipe); // открываем трубу на передачу.
      radio.write(&val, sizeof(val)); // отправляем val и указываем сколько байт пакет
      radio.startListening(); // включаем приемник, начинаем слушать трубу
      Serial.flush(); // очищаем буфер 
    }
  }

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Читать состояние портов (регистры)

Отправить по радио

Принять по радио

Записать состояние портов

 

Не забудь проверить пины, на которых SPI висит, чтобы случайно не вырубить радио.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Можете помочь програмно? Просто фишка в том, что когда на пине 0, то nrf постоянно отправляет это!!! И эфир забивается и он не реагирует на то что появилвсь 1 лог.

Radjah
Offline
Зарегистрирован: 06.08.2014

Ну дык сделай флаг и дергай его только при смене состояния пина.

Типа, если old_state <> current_state, то пихнуть в радио, что пин дернули, и сделать old_state = current_state, чтобы среагировать на новое изменение. Если ничего не изменилось, то гуляем дальше.

Mestniy96
Offline
Зарегистрирован: 31.08.2015

спасибо

Mestniy96
Offline
Зарегистрирован: 31.08.2015

только дело в том что один и тот-же пин не может быть и OUTPUT и INPUT. Поэтому возникла сложность обратном зеркаленьи!!!

Radjah
Offline
Зарегистрирован: 06.08.2014

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

Mestniy96
Offline
Зарегистрирован: 31.08.2015

Подскажите програмный способ заресетить плату!!!