Вопросы по NRF24L01

poty

★★★★★★✩
19 Фев 2020
3,154
926
@Bogdan.L, а что Вы меняете в скетче в плане управления выходами при переходе от "мигалки" на Ваш скетч? То же управление цифровыми выходами. Надо убедиться, что на плате между входом SIG и оптроном стоит сопротивление (т.е., что входной светодиод оптрона не гасит напряжение питания Ардуино).
 

Bogdan.L

✩✩✩✩✩✩✩
20 Июн 2023
6
1
@poty, я получается отправляю по радио массив, в котором находятся состояния кнопок( нажата или отпущена) и на приемнике в зависимости от состояния 0 или 4.7 Вольт. Сопротивления стоят на плате.
 

poty

★★★★★★✩
19 Фев 2020
3,154
926
@Bogdan.L, если электрически ничего не изменяется, то источник сигнала о переключении цифрового порта не имеет никакого значения. То есть, blink и Ваш скетч должны давать один и тот же результат, подключение светодиода и платы MOSFET (на входе стоят оптроны - это те же светодиоды, просто их Вы не видите) должно давать один и тот же результат. Значит дело в чём-то другом. Но схемы так и нет, а гадать на кофейной гуще я не умею.
 

Bogdan.L

✩✩✩✩✩✩✩
20 Июн 2023
6
1
Все оказалось как обычно в элементарном, я назначил пины не pinModом а digitalWritом. и поэтому на выходе было очень низкое напряжение
 
  • Лойс +1
Реакции: te238s

ESKILS

✩✩✩✩✩✩✩
23 Июн 2023
3
0
Появился такой вопрос как с помощью nRF24 передовать и принимать данные.
Тесть есть пульт он передаёт данные роботу а у робота есть например термометр и робот должен данные с термометра передовать в пульт. Я просто не понимаю как сделать так чтобы пульт мог передовать данные роботу, а потом принимать данные от него и при этом чтобы у пульта и у робота было по одному радиомодулю.
Если кому не сложно можете написать скетч который делает следующие действия: пульт с кнопкой и лампочкой и приёмник с кнопкой и лампочкой.
Если кнопка на пульте нажата то горит лампа на приёмние а также если кнопка на приёмнике нажата то горит лампочка на пульте. Тоесть пульт работает как передатчик и приёмник поочерёдно и приёмная часть работает как приёмник а потом передатчик.
Заранее спасибо.
 

ale-Mantaj

✩✩✩✩✩✩✩
13 Авг 2023
2
0
Добрый день. Есть такая проблема! Не могу передать и принять информацию с помощью радио модулей nrf24l01+. Если в качестве передающей ардуины подключаю uno то приемная плата также uno принимает все корректно. А вот если подключаю в качестве передатчика ардуино мега2560 то на приемной плате uno ничего нет. Тесты приёма работают на обоих платах. Подскажите в чем может быть проблема. Использую библиотеку Алексея Гай вера
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,707
474
@ale-Mantaj, ну вот например у меня работает на меге. И как приёмник, и как передатчик. Хрен же его знает, чего вы там наподключали. Просмотрите эту тему с самого начала. Может, тока питания не хватает, раз только на приём работает. Ясновидящих тут нет. Читайте тему, все косяки уже были разобраны.
 
Изменено:

ale-Mantaj

✩✩✩✩✩✩✩
13 Авг 2023
2
0
Питание отдельное от лабораторного БП. Подключаю к spi аппаратному остальные два Пина как в программе рекомендовано к 9 и 53. Дело в том что подключаю две унки и связь есть как только подключаю мегу то связь с ункой на приемной части прекращается. Выше обсуждения читал конечно. Кстати пробовал менять мегу на другую на всякий случай. А заливаю код из стандартного примера простой приём передача от Алексея Гайдара
 

LenyGj

✩✩✩✩✩✩✩
14 Авг 2019
8
0
Помогите пожалуйста. Как не стараюсь написать код, не получается. Урок 6 шестой на зуб выучил, где лампока загоралась нажал-отпустил кнопку и гасла нажал-отпустил. Без связи на одном ардуино код работает, но через NRF связь не получатся лампочку зафиксировать, т.е. нажимаю горит, отпускаю гаснет. Весь форум, интернет перерыл, нету образца рабочего. Всё работает, двигателя, сервопривода, а вот лампочка не хочет фиксировано работать от нажатия кнопок. Кнопки обработки делаю, без толку
Передатчик
Код:
  butt = !digitalRead(button);
  if (butt == 1 && butt_flag == 0) {  // обработчик нажатия
    butt_flag = 1;
    Serial.println("Button pressed");
   
  }
  if (butt == 0 && butt_flag == 1) {   // обработчик отпускания
    butt_flag = 0;
    Serial.println("Button released");
  }
  transmit_data[2] = butt_flag;
 
Изменено:

PiratFox

★★★★★✩✩
13 Фев 2020
1,707
474
@LenyGj, не нужно плодить лишние сущности, всё проще. Если не обращать внимания на дребезг, то код сведётся к:
if(!digitalRead(button)) transmit_data[2] = !transmit_data[2];
А вообще, нужно избавиться от влияния дребезга, иначе он может изрядно попортить кровь. Например ввести повторный опрос кнопки через короткое время, 50-80ms. Как-то так:
C++:
if(!digitalRead(button)){
    delay(70);
    if(!digitalRead(button)) transmit_data[2] = !transmit_data[2];}
Или же заюзать библиотеку, скажем, GyverButton.
 
Изменено:

LenyGj

✩✩✩✩✩✩✩
14 Авг 2019
8
0
Как сделать так, что бы сигнал поступал на приемник на включение света и так же отключал свет через определенное время.
Кнопка работает т.е, нажал, отпустил+горит, нажал-отпустил не светит. Хочу отвязать ручное управление. Через милес лучше как по мне, delay грузит мою систему сильно.

C++:
butt = !digitalRead(button);

  if (butt == 1 && butt_flag == 0) {  //кнопка вкл
    butt_flag = 1;
    Rsvet=!Rsvet;
  }

  if (butt == 0 && butt_flag == 1) {   // кнопка выкл
    butt_flag = 0;
  }
  transmit_data[2] = !Rsvet;
 

Наиль94_94

✩✩✩✩✩✩✩
19 Окт 2023
8
0
30
Тюмень
Приветствую всех. Добрые люди, помогите. Для своей работы делаю примочку суть в следующем, есть газовый хроматограф который стоит в лаборатории. Я сделал примочку на ардуино, прибор вышел на готовность - загорелась зеленая лента, прибор делает анализ - ни чего не горит. Теперь хочу что бы эта информация по модулю nrf24l01 передавалась туда, где мы сидим (расстояние примерно 30 М ).Я что-то написал и даже часть функций работает. Прибор вышел на готовность>кнопка замкнулась>ардуино 1 передала сигнал на модуль мосфет 1 и по радиоканалу передала на ардуино 2 что бы она включила мосфет 2>лента загорелась в 2х лабах. ( Это работает). При размыкании кнопки мосфет 1 отключается НО мосфет 2 не отключается. Помощь заключается в том, что бы вы мне помогли разобраться почему не отключается мосфет 2. Заранее спасибо вам за помощь.
Передатчик:
#include <SPI.h>                                               
#include <nRF24L01.h>                                          /
#include <RF24.h>                                              
RF24           radio(9, 10);  
#define button_pin 3 // пин кнопки
#define mosf_pin 2 // пин мосфета / реле
byte button = 1;
byte transmit_data [1];
void setup() {
pinMode(3, INPUT_PULLUP);
pinMode (mosf_pin, OUTPUT);
    delay(1000);
    radio.begin();                                            
    radio.setChannel(60);                                     
    radio.setDataRate     (RF24_250KBPS);                      
    radio.setPALevel      (RF24_PA_HIGH);                     
    radio.openWritingPipe (0xAABBCCDD11LL);
    //radio.startListening  ();
    radio.stopListening   ();
}
bool flag = false;
void loop() {
bool btnState = !digitalRead(3);   
if (btnState && !flag) { 
flag = true;
digitalWrite(mosf_pin, HIGH);
transmit_data [1] = !digitalRead(3);
radio.write(&transmit_data, sizeof(transmit_data));
}
if (!btnState && flag) { 
flag = false;
digitalWrite(mosf_pin, LOW);
}
}
Приёмник:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24           radio(9, 10);
byte pipe;
byte recived_data [1];
//byte gc5 = 3; //мосфет от гх 5
//byte gc6 = 4; //мосфет от гх 6
//byte gc3 = 5; //мосфет от гх 3
byte gc1 = 3; //мосфет от гх 1
//byte gc = 7; //мосфет от гх который ещё не пришел
void setup() {
  pinMode(3, OUTPUT);
  //pinMode(3, OUTPUT);
  delay(1000);
  radio.begin();
  radio.setChannel(60);
  radio.setDataRate     (RF24_250KBPS);
  radio.setPALevel      (RF24_PA_HIGH);
  radio.openReadingPipe (1, 0xAABBCCDD11LL);
  //radio.openReadingPipe (2, 0xAABBCCDD22LL);
  //radio.openReadingPipe (3, 0xAABBCCDD33LL);
  //radio.openReadingPipe (4, 0xAABBCCDD44LL);
  //radio.openReadingPipe (5, 0xAABBCCDD55LL);
  radio.startListening  ();
  //radio.stopListening   ();
}
void loop() {
  if (radio.available(&pipe)) {
    radio.read(&recived_data, sizeof(recived_data));
    if (pipe == 1)digitalWrite(gc1, recived_data[1]);
    //if (pipe == 2)digitalWrite(gc3, recived_data[1]);
    //if (pipe == 3)digitalWrite(gc5, recived_data[1]);
    //if (pipe == 4)digitalWrite(gc6, recived_data[1]);
    //if (pipe == 5)digitalWrite(gc, recived_data[1]);
  }
}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Подскажу как проверить.

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

2) Проверяем код.
2а) проверяем передатчик. Ардуину подключаем к ПК, в код открываем Serial. Перед передачей данных по NRF выводим в монитор порта то. что передаем. Проверяем как это соотносится с работой прибора. Если тут все верно перехеодим к проверке приемника.
2б) Проверяем приемник. Тоже самое, подключаем к пк, выводим в монитор порта принимаемые данные. Сопоставляем с данными передатчика.

Если везде все верно - ищем в приемнике синтаксические ошибки.

Если ошибок нет, то это просто чудо какое то....
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Наверное потому что данные по НРФ отправляются только при нажатии, а при отжатии только выключается лампочка. (строки передатчика 27 -28 и 32)
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Скорее всего нет, т.к. на пине устанавливается состояние согласно полученным данным без анализа самого содержимого
 

Наиль94_94

✩✩✩✩✩✩✩
19 Окт 2023
8
0
30
Тюмень
Опять возникли вопросы. После последних сообщений чутка изменил оба кода.
Передатчик:
#include <SPI.h>                                               // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                          // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                              // Подключаем библиотеку для работы с nRF24L01+
RF24  radio(9, 10);   
#define button_pin 3 // пин кнопки
#define mosf_pin 2 // пин мосфета / реле
byte button = 1;
byte transmit_data [2];
void setup() {
pinMode(3, INPUT_PULLUP);
pinMode (mosf_pin, OUTPUT);
Serial.begin(9600);
    radio.begin();                                             
    radio.setChannel(60);                                      // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_250KBPS);                      // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_HIGH);                      // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0xAABBCCDD22LL); 
    radio.powerUp();        //начать работу
    //radio.startListening  ();
    radio.stopListening   ();
}
void loop() {
  if (millis() / 50 % 5){
  if(!digitalRead(3)==HIGH)
{
digitalWrite(mosf_pin, HIGH);
transmit_data [1] = !digitalRead(3);
radio.write(&transmit_data, sizeof(transmit_data[1]));
Serial.println(" gc  ready");
}
else
{digitalWrite(mosf_pin, LOW);}
}
}
Приёмник:
// Receiver nRF24L01 multi
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24           radio(9, 10);
byte pipe;
byte recived_data [2];
//byte gc5 = N; //мосфет от гх 5
//byte gc6 = N; //мосфет от гх 6
byte gc3 = 5; //мосфет от гх 3
byte gc1 = 4; //мосфет от гх 1
//byte gc = N; //мосфет от гх который ещё не пришел
void setup() {
  Serial.begin(9600);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  delay(1000);
  radio.begin();                             // запуск нрф
  radio.setChannel(60);                      // канал передачи данных   
  radio.setDataRate     (RF24_250KBPS);      // скорость передачи
  radio.setPALevel      (RF24_PA_HIGH);      // мощнлсть
  radio.openReadingPipe (1, 0xAABBCCDD11LL);
  radio.openReadingPipe (2, 0xAABBCCDD22LL);
  //radio.openReadingPipe (3, 0xAABBCCDD33LL);
  //radio.openReadingPipe (4, 0xAABBCCDD44LL);
  //radio.openReadingPipe (5, 0xAABBCCDD55LL);
  radio.powerUp();
  radio.startListening  ();
}
void loop() {
  byte pipe;
  if (radio.available(&pipe)) {
     radio.read(&recived_data, sizeof(recived_data));
     if (pipe == 1){digitalWrite(gc1, HIGH);                  //первая лампа (гх)
     Serial.println(" gc1 ready");
     delay(500);
     digitalWrite(gc1, LOW);
     Serial.println("gc1 not ready");}
    if (pipe == 2){digitalWrite(gc3, HIGH);
     Serial.println(" gc3 ready");
     delay(500);
     digitalWrite(gc3, LOW);
     Serial.println("gc3 not ready");}
    //if (pipe == 3)digitalWrite(gc5, recived_data[1]);
    //if (pipe == 4)digitalWrite(gc6, recived_data[1]);
    //if (pipe == 5)digitalWrite(gc, recived_data[1]);
  }
}
Теперь у меня такая проблема, если сигнал приходит с обоих передатчиков, то включается только первая лампа, то есть реагирует на первый передатчик, а второй почему-то игнорирует. Как мне заставить "реагировать" одинаково на каждый передатчик. Заранее благодарен
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
А если поочередно , то работает ?
Если да, то проблема вот в этом:
delay(500);
При асинхронной работе такое недопустимо, задержки можно ставить только при линейном выполнении алгоритма. При включении надо запоминать текущее время для нужного мосфета и спустя нужное время гасить его.
 

Наиль94_94

✩✩✩✩✩✩✩
19 Окт 2023
8
0
30
Тюмень
@Старик Похабыч, если поочередно то работают. Эта задержка мой костыль что бы мосфет отключался. Я передатчик сделал таким образом, что он у меня «кнопка» работает без флажка соответсвенно постоянно сигнал отправляет о своём состоянии. Как я уже выше писал у меня была проблема что при отжатии кнопки сигнал не шел на отключение мосфета. По поводу того что через время гасить мосфет, такое у меня не прокатит, приборы либо делают анализ, либо стоят и ждут когда оператор запустит анализ.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,222
1,291
Москва
Т.е. Вы не исправив код для работы с 1 передатчиком подключили 2-ой ? Так можно внести больше ошибок и наделать костылей, от которых потом не избавится. Оно надо ?
Если уж надо отключать светодиод, то все равно по таймеру, в том случае если сигнал не пришел пару раз.
И еще , спасить постоянно состояние кнопки можно, но нужно ограничить частоту, сделайте задержу, отталкиваясь от разумного. Я когда то делал пульт РУ , в нем я настраивал эту самую задержку, причем я ловил еще и обратный отзыв от приемника, собирая статистику успешно переданных пакетов. Минимально допустимая задержка у меня была что то около 15 мс, т.е. 66 пакетов в сек, обычно ставил 20-25, что бы был хороший отклик.
И так же поставьте подтверждение получения пакетов и выведите эту инфу в монитор порта передатчика, может у вас 80% пакетов не доходит с такой частотой ?