Дублирование пинов при помощи nRF24l01.
- Войдите на сайт для отправки комментариев
Пт, 18/03/2016 - 06:37
Всем привет. Скажите можно ли сделать дублирование пинов на одной ардуине через радио модуль к другой ардуине. Тоесть например, появилась лог 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(); // очищаем буфер } }
Читать состояние портов (регистры)
Отправить по радио
Принять по радио
Записать состояние портов
Не забудь проверить пины, на которых SPI висит, чтобы случайно не вырубить радио.
Можете помочь програмно? Просто фишка в том, что когда на пине 0, то nrf постоянно отправляет это!!! И эфир забивается и он не реагирует на то что появилвсь 1 лог.
Ну дык сделай флаг и дергай его только при смене состояния пина.
Типа, если old_state <> current_state, то пихнуть в радио, что пин дернули, и сделать old_state = current_state, чтобы среагировать на новое изменение. Если ничего не изменилось, то гуляем дальше.
спасибо
только дело в том что один и тот-же пин не может быть и OUTPUT и INPUT. Поэтому возникла сложность обратном зеркаленьи!!!
По уму надо прочитать регистры настройки портов и их состояний, собрать всё это в пакет и запулить по радио. На принимающей стороне уже произвести разбор и запись.
Подскажите програмный способ заресетить плату!!!