nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. Snoop1991

    Snoop1991 Нерд

    NRF24L01P греется нереально, палец после 3 секунд на нем держать невозможно. это нормально?
     
  2. Coolblaster

    Coolblaster Нерд

    У меня все холодные, а что за код вы загрузили в мк ?
    Если модули работают, то дело может в коде.
     
  3. Snoop1991

    Snoop1991 Нерд

    такое бывает от кода?
    #include <SPI.h>
    #include <Mirf.h>
    #include <nRF24L01.h>
    #include <MirfHardwareSpiDriver.h>
    #define MAX_BUFF 1 //Размер Буфера приёма-передачи
    #define intervalLED 600 //Частота моргания
    #define limitSolar 600 //Граница дня и ночи
    #define delayLast 12000 //Граница дня и ночи

    int fotoPin = A0; // устанавливаем входную ногу для АЦП (Фоторезистор)
    int movePin = 2; // Пин на котором завязан датчик движения
    int projectorPin = 4; // Пин на котором завязан Прожектор (реле)
    int alarmPin = 5; // Пин на котором завязан сигнальные фонари (реле)

    unsigned int fotoSensorValue = 0; // цифровое значение фоторезистора локальная
    byte movingSensorValue; // 1 - есть 0 - нет движение локальная
    int ledStateLED = LOW; // этой переменной устанавливаем состояние светодиода
    int relayOn = HIGH;
    byte enableAlarm = 0;
    unsigned long previousMillisLED = 0; // храним время последнего переключения светодиода
    int countloop = 0;
    byte sending = 0;
    byte ok = 100; // Данные для подтверждения отпарвки
    byte bufIn = 2; // Буфер принятых данных
    byte bufOut = 0; // Буфер отправленных данных
    byte bufOutPr = 0; // Буфер отправленных данных
    byte solar = 1; // 1 - день 0 - ночь
    byte sleep = 0; // 1 - день 0 - ночь
    byte moving = 0; // 1 - есть 0 - нет движение
    byte solartx = 1; // 1 - день 0 - ночь
    byte movingtx = 0; // 1 - есть 0 - нет движение
    unsigned long previousMillis = 0; // храним время последнего переключения светодиода
    unsigned long lastSvet = 0; // храним время последнего переключения светодиода

    void setup() {
    pinMode(projectorPin, OUTPUT);
    pinMode(alarmPin, OUTPUT);
    pinMode(movePin, INPUT);
    Serial.begin(9600);
    Mirf.spi = & MirfHardwareSpi;
    Mirf.init();
    Mirf.setRADDR((byte * )
    "app2");
    Mirf.setTADDR((byte * )
    "app1");
    Mirf.payload = MAX_BUFF; //Здесь задаём буфер
    Mirf.channel = 10;
    //Это канал приёма-передачи - должен
    //быть одинаковым у устройств.
    Mirf.config();
    }

    void loop() {
    bufIn = 0;
    fotoSensorValue = analogRead(fotoPin); // считываем значение с фоторезистора
    if (fotoSensorValue < limitSolar-50) fotoSensorValue = 0;
    else if (fotoSensorValue > limitSolar+50) fotoSensorValue = 1;
    else fotoSensorValue = 0;
    movingSensorValue = digitalRead(movePin); // считываем значение с датчика движения
    if (Mirf.dataReady()) {
    previousMillis = millis();
    Mirf.getData( & bufIn);
    if (bufIn != 100) {
    Mirf.send( & ok);
    while (Mirf.isSending());
    }
    delay(10);
    switch (bufIn) {
    case 1: //Нет движения, Нет света
    solartx = 0;
    movingtx = 0;
    break;
    case 2: //Нет движения, Есть свет
    solartx = 1;
    movingtx = 0;
    break;
    case 3: //Есть движения, Нет света
    solartx = 0;
    movingtx = 1;
    break;
    case 4: //Есть движения, Есть свет
    solartx = 1;
    movingtx = 1;
    break;
    case 100:
    sending = 0;
    break;
    default:
    break;
    }
    }
    if (solartx == 1 && fotoSensorValue == 1) solar = 1;
    else solar = 0;
    if (movingtx == 0 && movingSensorValue == 0) moving = 0;
    else moving = 1;
    if (movingSensorValue == 0 && fotoSensorValue == 0) bufOut = 1;
    else if (movingSensorValue == 0 && fotoSensorValue == 1) bufOut = 2;
    else if (movingSensorValue == 1 && fotoSensorValue == 0) bufOut = 3;
    else if (movingSensorValue == 1 && fotoSensorValue == 1) bufOut = 4;
    countloop++;
    if (countloop > 5) {
    if ((bufOut != bufOutPr) || (sending == 1)) {
    Mirf.send( & bufOut);
    while (Mirf.isSending());
    sending = 1;
    bufOutPr = bufOut;
    }
    countloop = 0;
    }
    if (enableAlarm == 0) {
    previousMillisLED = 0;
    }

    if (moving==1)
    {
    sleep = 0;
    }

    if ((millis()-lastSvet<delayLast) && (moving==0))
    {
    moving = 1;
    sleep = 1;
    }


    if (solar == 1 && moving == 1) {
    enableAlarm = 1;
    digitalWrite(projectorPin, relayOn);
    } else if (moving == 1) {
    digitalWrite(projectorPin, !relayOn);
    enableAlarm = 1;

    } else {
    digitalWrite(projectorPin, relayOn);
    digitalWrite(alarmPin, relayOn);
    enableAlarm = 0;
    ledStateLED = relayOn;
    }
    if (enableAlarm == 1) {
    if (sleep==0){
    lastSvet = millis();
    }
    // здесь будет код, который будет работать постоянно
    // и который не должен останавливаться на время между переключениями свето
    unsigned long currentMillisLED = millis();

    //проверяем не прошел ли нужный интервал, если прошел то
    if (currentMillisLED - previousMillisLED > intervalLED) {
    // сохраняем время последнего переключения
    previousMillisLED = currentMillisLED;
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledStateLED == relayOn)
    ledStateLED = !relayOn;
    else
    ledStateLED = relayOn;

    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(alarmPin, ledStateLED);
    }
    }
    delay(10);
    }
     
  4. AlexVS

    AlexVS Гик

    1. Оформите код
    2. Смотрите питание, потребляемый модулем ток.
     
  5. Snoop1991

    Snoop1991 Нерд

    простите в коде вообще не разбираюсь, мне его написали. как его оформить незнаю. Касательно питания - питание от ардуинки было. как то раз модули работали целые сутки прием передача четко. затем один из них всегда зависает. Пробовал вывести отдельное питание (правда от того же самого АКБ от которого у меня все питается, просто напрямую через понижающий 3.3 дал. (когда включаешь питание напрямую вообще не работает, как тока скидываешь минус с преобразователя работать начинают. вообще без связи. ))
    Это не железо 100%.
    на расстоянии 1 метра все работает четко
    Без связи работает четко. Как тока появляется связь или какието на нее намеки, модули зависают
    что происходит понятия не имею
     
  6. Cerner

    Cerner Нуб

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

    Решение нашёл случайно - воткнул модуль к которому ещё не припаивал конденсатор. Все проблемы с нагревом сразу закончились. Осталось только понять какого чёрта электролитический конденсатор на 1 мФ так влияет (или не в нём проблема). Полярность проверил : )
     
  7. Coolblaster

    Coolblaster Нерд

    Может дело и правда в конденсаторах было. Я свои модули брал на али у A+A+A+ партиями, не паял кондеры все работает на ура, тестировал на Uno Mega Nano Micro. Нагрева не было.
     
  8. smileexx

    smileexx Нуб

    В первую очередь, ОГРОМНОЕ СПАСИБО за топик!
    Я, как и многие здесь, несколько дней бился над тем чтобы данные начали приходить. Конденсатор напаял только на передатчик, так как он на китайской Ардуино Нано. Но то что реально помогло подружить передатчики, это код
     
  9. sashabukashka

    sashabukashka Нуб

    имеется данный модуль с антенай - 2 шт и уны 2 шт, пытаюсь разбираться, при попытке залить скетч из начала топика
    кампилятор ругался, помогла замена заглавных "I" на "i" в некоторых строках кода, но в ком порте показывает белибербу вроде "жpF8sЖ…XKbBCBC%Њ@BcА Bb2Ё Ў@`к“ђ©�ВA°2 Db``д40ЖX)d* ~ўаCBcBcBcBзЖfBҐМнМе…епrеВМ‹WьЗ©RЕШМ‹BьЗ©БbCbCBCBCBcBcBbBbBbBbCтBCBCBcBbBbBbBbCBCBCBCтbCBCBCBCBcBbBbBbBbCBCтBbCBCBCBCBcBbBbBbBbCBчCBCBcBbBbBbBbCBCBCBCBуCBCBCBcBbBbBbBbCBCBCBчBCBcBbBb" и так далее в одну строчку ((( Кто подскажет что не так? 2 уны и 2 модуля одно и тоже! Подключаю все как по описанию в топике, питание от уны, может быть изза него? сам чайник но думаю вряд ли от питания
     
    Последнее редактирование: 29 сен 2015
  10. megamaster

    megamaster Нуб

    [/QUOTE]
    В мониторе последовательного порта в правом нижнем углу попробуй поменяй частоту на 9600бод
     
  11. megamaster

    megamaster Нуб

    Что-то не допру как посчитали на каком канале зашумленность ?
     
  12. ИгорьК

    ИгорьК Гуру

    Две верхние строки в таблице - две цифры номера канала. Смотреть по вертикали.
     
  13. sashabukashka

    sashabukashka Нуб

    Всё заработала хреновина, надо было не 9600 а 57600 поставить как в коде, барашка сразу не увидел))))
    теперь осталось понять как расшифровать полученное, не врубаюсь, что где там вторая строчка куда смотреть(
    попробовал на второй ардуине со вторым модулем выдает по всем параметрам нули, что может быть не так? подключено также модули и дуины одинаковые, пишет
    CRC Length = Disabled
    я так понял не фурычит модуль?!
     
    Последнее редактирование: 1 окт 2015
  14. IN2theVOID

    IN2theVOID Нуб

    Так, неделю назад пришли модули, всю неделю ковырялся с ними, в итоге всё заработало)
    Хочу поделиться своим опытом на эту тему, может кому будет полезно:
    1)Обязательно припаять конденсатор на 1-2 мкФ, без него будет глючить(теряться пакеты будут, я проверял=)
    2)Питание я беру от ардуино 3.3 В(пробовал на нано и уно, работает)
    3)Обязательно инклудить все необходимые библиотеки, делать 2-хсекундную задержку перед инициализацией модуля и в ручную выставлять канал

    Код (C++):
    #include <SPI.h>
    #include "RF24.h"
    #include "nRF24L01.h"

    RF24 radio(9,10);
    const uint64_t pipe = 0xF1F2F3F4LL;

    void setup(void){
    delay(2000);
    radio.begin();
    radio.setChannel(90);
    radio.openWritingPipe(pipe);

    Serial.begin(115200);
    }
    4)Также мой случай очень похож на вышеописанный случай, когда передача шла только при нажатии кнопки ресет и только одного пакета, проблема решилась также: перед каждой отправкой делать

    Код (C++):
     radio.startListening();
    radio.stopListening();
    также пробовал делать flush перед каждой отправкой, не помогает, помогает только

    Код (C++):
     radio.startListening();
    radio.stopListening();
    но с ними флуш уже не нужен, так как он есть в стоп функции

    конечно, код получается менее красивым и большим по объему, в результате чего было принято решение
    radio.startListening();
    radio.stopListening();
    внести прямо в фунцию write прямо в библиотеке, что и было сделано(прикладываю модифицированную библиотеку в архиве).

    5)Между делом функция write возвращает bool значение по результату отправки.
    Если у вас всё время возвращается false, значит приемник не принимает ваши посылки!

    На примере: есть передатчик, отправляющий пакеты на приемник. Если всё доходит, функция write будет возвращать true, но стоит нам выключить приемник и она сразу начнет возвращать false, тк больше никто нам не сообщает об успешном приеме.

    Вот такие дела, надеюсь информация будет кому-нибудь полезна, спасибо!)

    https://yadi.sk/d/79GAxpotjWeSi - модифицированная библиотека
     
    ИгорьК нравится это.
  15. zaynus

    zaynus Нерд

    всем привет!
    собираю неоновый костюм на про мини с nrf24 c управлением по миди
    фрутилуп передает данные в сериал через софт мост, дальше по радиоканалу.
    проблемы возникли с подключением дополнительных костюмов, если читать вторым с той же трубы, то начинаются затыки, как говорится кто успел тот и съел
    не хотелось бы использовать встроенный мультикаст на 6 труб, т.к. мало
    задача чтоб баба яга со смешариками сегодня работала на 1 точке, а франкенштейн с железным человеком на второй
    а после они объединились в общий хоровод на другой площадке
    на каждой площадке-точке взаимозаменяемый вещатель миди в эфир, приемники перемещаются
    между ними.
    Или все раздельно у каждого своя точка с передатчиком
    Все разделение персонажей происходит на уровне миди во фрутилуп
    библиотека от maniacbug, что можно придумать, чтоб не переезжать на др. библиотеку?
     
    Последнее редактирование: 5 окт 2015
  16. IN2theVOID

    IN2theVOID Нуб

    Можно теоретически с каждым приемником на разных каналах общаться.
    Приемники, например, настроены на 90, 91, 92 и 93, а передатчик по очереди переключается с канала на канал и каждый получает только адресованные ему пакеты.
    Вопрос лишь время задержки на переключение между каналами, хотя, мне кажется, всё должно быть хорошо.
     
    Последнее редактирование: 5 окт 2015
  17. megamaster

    megamaster Нуб

    Большое спасибо за подсказку, а то я пытался подсчитать нули до шума )))
     
  18. megamaster

    megamaster Нуб

     
  19. zaynus

    zaynus Нерд

    сделал radio.setAutoAck(false); на приемниках
    завтра будем испытывать в условиях приближенных к рабочим
    теоретически клубок который показывал дорогу тоже участвует в приключении
    и персов нужно масштабировать с одной трубы
    если сработает с radio.setAutoAck(false);(передатчик не получив ответа будет долбить повторами)
    то большего и не надо
    каждая линия перса включается\выключается при нажатии ноты в эфире, эти ноты получают все персы,
    потом каждый выбирает свое
     

    Вложения:

  20. eth

    eth Нуб

    Здравствуйте. Кто то уже реализовал автоматическое деление данных на пакеты?