Сейчас попробуюСкорость обязательно, мощность пофиг на самом деле.
На 1-ый взгляд затыков быть не должно..
Вот что попробуй, у тебя 100мс задержки идет. Поставь пол секунды, посмотри что будет. Кажется что то в этом у меня было.
Не помогло ((Сейчас попробую
Хмм... подумаю, как это реализовать, попробуюЯ когда тестировал пульт проверял ответы, т.е. есть минимальное время, когда оно успевает отправить. но 50 раз в секунду точно работает. Так что не во времени дело. НО есть одно но. Есть тайм-аут отправки. Там время может быть больше чем задержка и тогда коллизия случается.
Функция write возвращает значение ИСТИНА если отправка удачна и ЛОЖЬ если нет. Надо проанализировать значение и скажем если фигня вывести в порт что нибудь. Или если нет порта, то зажечь светодиод. Так же на приемнике можно в случае если нет данных выводить что нибудь, только без задержек по времени. Можно будет понять что косячит.
Статья очень классная и подробная, спасибоЯ тут сверился с описанием и вроде как write будет работать корректно если стоит подтверждение приема.. но я что то сейчас засомневался. Но в любом случае лучше проверить результат - ЛОЖЬ может быть и когда буфер забит или еще какая ошибка передачи.
Вот неплохое руководство с описанием по NRF https://wiki.iarduino.ru/page/NRF24L01-trema/
Вот тут в 1-ом сообщении я писал про выбор канала. Тестирует весь диапазон, можно проверить текущий эфир и выбрать канал
Еще одна простая машинка на NRF
Часть первая, теоретическая. Для теории нам нужно: 2 ардуины нано,уно и вообще любых с подключенными к ним модулями NRF, сделано все точно так как у Гайвера в примерах. Если вы внимательно смотрели его видео, то знаете, что связь на разных каналах осуществляться с разным качеством, поэтому...community.alexgyver.ru
#include "Adafruit_NeoPixel.h"
#define LED_COUNT 128
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
//RF24 radio(9,53);
byte recieved_data[3];
byte LED_PIN = 6;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
radio.begin();
radio.setAutoAck(1);
radio.setRetries(0, 15);
radio.enableAckPayload();
radio.setPayloadSize(32);
radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0
radio.setChannel(0x65); //выбираем канал (в котором нет шумов!)
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(); //начинаем слушать эфир, мы приёмный модуль
strip.begin();
}
void loop() {
byte pipeNo;
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read( &recieved_data, sizeof(recieved_data) ); // чиатем входящий сигнал
digitalWrite(LED_PIN, recieved_data[0]);
//то бишь 0 или 1
for (int i = 0; i < LED_COUNT; i++)
{
strip.setPixelColor(i, strip.Color(255, 0, 0)); // Красный цвет.
}
// Передаем цвета ленте.
strip.show();
// Ждем 500 мс.
delay(500);
}
}
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte button = 3; // кнопка на 3 цифровом
byte transmit_data[3]; // массив, хранящий передаваемые данные
byte latest_data[3]; // массив, хранящий последние переданные данные
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(0x65); //выбираем канал (в котором нет шумов!)
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); // инвертированный (!) сигнал с кнопки
for (int i = 0; i < 3; 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(); // выключить передатчик
}
}
ага, заодно избавит вас от некоторых иллюзий, типа "вот сейчас быстренько сварганю антенну на коленке - и будет лучше штатной" ))гуглите книгу "Карл Ротхаммель. Антенны".
Даже если и сжечь - потеря будет небольшая. Вообще для таких экспериментов нужен бы характериограф, чтобы не тыкаться вслепую. Однако на такую частоту это недешёвое удовольствие.Ничего не сжег