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

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

  1. Oleg_7

    Oleg_7 Гик

  2. Lictor

    Lictor Нуб

    Суть такая же, но насколько поможет именно это - не знаю, я написал что помогло именно в моем случае. Ну и если уж заказывать и все равно ждать, то мне кажется можно найти варианты получше: например, специализированные микросхемы.
     
  3. sv18sv

    sv18sv Нерд

    Перепробовав все способы "победы" этих модулей (кстати спасибо за тестовую програмку-реально помогает проверить "жизнеспособность "модулей) наткнулся на интересную особенность имеющихся у меня "черных" модулей.
    А именно; на прием они работают от 3.3 вольта, а вот на передачу только при напряжении МЕНЬШЕ чем 3.1 вольта (вплоть до 1.7) правда при напряжении меньше 2.5 после сброса питания могут не запускаться.
     
    Arduiner001 и ИгорьК нравится это.
  4. Lictor

    Lictor Нуб

    Может глупость, но твой блок питания может просто не выдает необходимую мощность при передаче на напряжении 3.3В, а если его снизить, то тока хватает?
     
  5. AVL

    AVL Нуб

    Всем привет!
    Скажите, пожалуйста, мой модуль живой? Спасибо!

    Код (C++):
    STATUS         = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1     = 0xe7e7e7e7e7 0xc2c2c2c2c2
    RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0x58
    TX_ADDR         = 0xe7e7e7e7e7
    RX_PW_P0-6     = 0x00 0x00 0x00 0x00 0x00 0x00
    EN_AA         = 0x00
    EN_RXADDR     = 0x00
    RF_CH         = 0x4c
    RF_SETUP     = 0x07
    CONFIG         = 0x0f
    DYNPD/FEATURE     = 0x00 0x00
    Data Rate     = 1MBPS
    Model         = nRF24L01+
    CRC Length     = 16 bits
    PA Power     = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

    00000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000200000000000100002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000100000000000000000000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000010000001000000000000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000001000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000100000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000006070000000000000000000001001100000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000002000001000000001000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    0000000000000000a0b1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000002000000000000000010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    0000000000000000a070000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000010010000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    0000000000000000b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000010000000000000010000010000000000000000000000000000001110000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000010010011110000000000000000100100000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000011001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000101000000000000000001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000002010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000010000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000013050001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000000000001001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    00000000000111004000000000000000000001000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000
     
  6. sv18sv

    sv18sv Нерд

    Нет, блок питания отличный.
    Я б не стал из-за пустяка регистрироваться на форуме и писать .
     
  7. woow

    woow Гик

    Я когда то тоже так думал, пока не дал нагрузку 300мА, напруга упало до 1,7в.
     
  8. sv18sv

    sv18sv Нерд

    Я надеюсь участники форума хотябы немного разбираются в электронике, наверняка присутствуют и профессионалы.
    Ток потребления этих модулей 20-30мА.
    У меня имеются маленькие модули и те,что с большой антенной.Свойство проявилось и у тех и у других, при питании хоть от блока питания, хоть от Li-io аккумулятора(хоть с стабилизатором, хоть step-down преобразователем.)
    У меня все заработало, кому-то тоже поможет.
    Блоки питания обсуждать не интересно.
     
  9. ИгорьК

    ИгорьК Гуру

    Добавлю в заголовок темы.
     
  10. Папа

    Папа Нерд

    Автору темы респект и уважуха :))) хватило первых 2-х страниц для победы над модулем.
    Никогда бы не допер до подачи питания на CE . Такое только случайно могло получиться лет через пять. Сэкономил кучу времени. Пиво конечно автору нальем за труды.
     
  11. Папа

    Папа Нерд

     
  12. ЮрийЯ

    ЮрийЯ Нерд

    У меня была подобная проблема.
    Передатчик передает но подтверждение не получает.
    Возможно у Ваших модулей не совпадают частоты каналов. Китайцы они такие китайцы уж не знаю то ли кварц у них бракованный то ли емкости.
    Я решил проблему простым сканированием каналов +-5 от заданного в приемнике.
    То есть если в приемнике установлен канал 100, то я передатчиком перебираю каналы от 95 до 105, кидаю туда пакет в течении 200 миллисекунд и считаю количество удачно прошедших. Там где больше всего прошло тем и пользуюсь.
    У меня расхождение на разных каналах было от -3 до -1 от заданного в приемнике.
    Код (C++):
    void SearchChanel(void)
    {
    long  TmpTime;
    int8_t i;
    Serial.print("Search chanel...\r\n");
    for(i=0; i<10; i++)
       {
       TmpTime=micros();
       massChan[i]=0;
       radio.stopListening ();
       CurrentChanel=WorkChanel-5+i;
       radio.setChannel(CurrentChanel);
       while((micros()-TmpTime)<200000)
         {
          if(radio.write(&rcData, sizeof(rcData)))
            massChan[i]++;
         }
       }
    tmpValue=0;
    CurrentChanel=0;
    for(i=0; i<10; i++)
       {
       Serial.print(WorkChanel-5+i);Serial.print(" "); Serial.print(massChan[i]); Serial.print("\r\n");
       if(tmpValue<massChan[i])
         {
         tmpValue=massChan[i];
         CurrentChanel=WorkChanel-5+i;
         }
       }
    if(CurrentChanel==0) CurrentChanel=WorkChanel;
    Serial.print("Now find ");Serial.print(CurrentChanel);Serial.print(" chanel\r\n");      
    }
     
    WorkChanel это канал выставленный на приемнике.
    CurrentChanel это канал для передатчика.

    Функцию можно просто в Setup() запускать.
     
    Последнее редактирование: 1 дек 2016
    MickNich, Vladimir Smirnov и sv18sv нравится это.
  13. forfrends

    forfrends Нерд

    Всем добрый день! Поделюсь своим опытом. Купил как-то несколько модулей:
    2 обычных модуля http://ali.pub/d812f и
    10 шт. смд с "кляксой" вместо микросхемы: http://ali.pub/jtd6b[​IMG] [​IMG] [/URL]
    распиновка:
    [​IMG]
    Все это дело отложил в сторону. Через месяц дошли и до них руки. В результате 2 обычных модуля заработали без проблем, очень помог этот форум. Другие 10 - не заработали совсем. Я потратил около недели что бы понять почему они не работают. Прочитав массу форумов, оказалось что модули - подделка. Причем не просто китайская копия, а совершенно иное устройство с иной микросхемой! Они НЕ nrf24l01 в них используется микросхема se8r01 или SI8R01! хотя называются nrf24l01... Где-то прочитал что китайцы, делая копию, допустили ошибку, в результате получившийся чип не работает с библиотеками от nrf.
    После долгих и усердных поисков нашел примеры работы с данными чипами! Пример заработал и модули стали принимать-передавать!!! Важное замечание: должны быть подключены все 8 контактов!
    Прикрепляю Архив. Нужно убрать расширение .txt что бы сделать его нормальным архивом. Внутри две папки:
    - se8r01_rx_tx_2Mps - скетч пример работы (с библиотекой для запуска модулей). В скетче se8r01_rx_tx_2Mps.ino нужно выбрать режим работы: byte mode ='r'; //r=rx, t=tx В файле se8r01.h нужно указать пины подключения (модуль работает через софтварный SPI !! ). Проверял - РАБОТАЕТ!
    - SE8R01-master - это вроде как библиотека, но я ее не проверял. Пробовал подключить в IDE как библиотеку - подключается, но в Файл - Примеры ее нет (хотя в ней есть примеры). Если у кого-то есть время и возможность - разберитесь что к чему. Так как я в этом деле новичек.
    Что-то много написал, надеюсь кому-то поможет.
    Даташит на микросхему: http://www.avrfreaks.net/sites/default/files/forum_attachments/SE8R01_DataSheet_v1 - 副本.pdf
     

    Вложения:

    • Desktop.rar.txt
      Размер файла:
      14,3 КБ
      Просмотров:
      634
    Последнее редактирование: 1 дек 2016
    ИгорьК нравится это.
  14. difficult

    difficult Нуб

    друзья помогите!
    Сорри за оффтоп !
    Модуль si4432 под HR RF22
    Работало все как часы но в один прекрасный момент скрипт стал зависать на команде "waitPacketSent"
    библиотеки менял, емкости добавлял, питание менял, распайку проверял, провода прозвонил.
    Собрано на макетке, пайка в норме, длина провода примерно см 15, работало 3 недели без нареканий!
    Если работать без этой команды то скрипт не зависает но и отправка не идет, модуль инсталируется нормально!
    рассмотрю любые варианты ремонта !
     
  15. za9c

    za9c Нуб

    Прошу прощения! Не могу въехать в настройки каналов! Принцип построения сети - звезда. Стоит одна NRF в качестве "сервера" и 30 в качестве удалённых девайсов! у каждой удалённой NRF адрес RX_ADDR_P0 и TX_ADDR одинаков! допустим 0xC2_0xC2_0xC2_0xC2_ADDR_DEV1...0xC2_0xC2_0xC2_0xC2_ADDR_DEV30!
    Серверная NRF по очереди обращается к каждому устройству(контроллер адреса меняет по SPI) и ждёт подтверждения что оно на линии! так вот вопрос! Мне достаточно настроить у всех приборов только канал PIPE0 для прослушки эфира, передачи в эфир и приёма подтверждения. или PIPE0 должно использоваться только для получения подтверждения?
     
  16. Alex1983

    Alex1983 Нуб

    Добрый день,
    Первый раз использую модуль и не могу разобраться почему нет связи. Из того что сделал, напаял конденсатор, сделал нормальное питание 3,3В, сделал проверку модулей как указано на первой странице, установил библиотеку из поста 86.
    #include <SPI.h> // Подключаем библиотеку для работы с шиной SPI
    #include <nRF24L01.h>
    #include <printf.h>
    #include <RF24.h>
    #include <RF24_config.h> // Подключаем библиотеку для работы с nRF24L01+
    RF24 radio(9, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    int data[3]; // Создаём массив для приёма данных
    const int axisX=A0; // ось Х подключена к A0
    const int axisY=A1; // ось Y подключена к A1
    const int kuzov=A2; //потенциометр для поднятия кузова
    //const uint64_t readingPipe = 0xE8E8F0F0AALL;
    const uint64_t writingPipe = 0xE8E8F0F0ABLL;
    void setup() {
    /************************* Модуль NRF24 **********************/
    //delay(2000); // Пусть зарядится конденсатор
    radio.begin(); // Включение модуля;
    radio.setChannel(0); // Установка канала вещания;
    radio.setRetries(15,15); // Установка интервала и количества попыток "дозвона" до приемника;
    radio.setDataRate(RF24_250KBPS); // Установка минимальной скорости;
    radio.setPALevel(RF24_PA_MAX); // Установка максимальной мощности;
    radio.setAutoAck(1); // Установка режима подтверждения приема;
    radio.openWritingPipe(writingPipe); // Активация данных для отправки
    //radio.openReadingPipe(1,readingPipe); // Активация данных для чтения
    radio.startListening(); // Слушаем эфир. // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)

    }

    void loop() {
    data[0] = analogRead(axisX); // считываем показания с вывода A0 и записываем их в 0 элемент массива data
    data[1] = analogRead(axisY); // считываем показания с вывода A1 и записываем их в 1 элемент массива data
    data[2] = analogRead(kuzov);// считываем показанияс вывода A2 и записываем их в 2 элемент массива data
    radio.write(&data, sizeof(data)); // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
    }

    #include <Servo.h> // подключение библиотеки Servo
    #include <SPI.h> // Подключаем библиотеку для работы с шиной SPI
    #include <nRF24L01.h>
    #include <printf.h>
    #include <RF24.h>
    #include <RF24_config.h> // Подключаем библиотеку для работы с nRF24L01+
    RF24 radio(9, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    int data[3]; // Создаём массив для приёма данных
    const uint64_t readingPipe = 0xE8E8F0F0ABLL;
    //const uint64_t writingPipe = 0xE8E8F0F0A0LL;
    Servo servo1, servo2;
    const int pinServo1=8; // Пин для подключения 1 сервопривода колеса
    const int pinServo2=7; // Пин для подключения 2 сервопривода кузов
    // переменные для хранения углов поворота сервоприводов
    int angleServo1,angleServo2 = 0;
    int val_kuzov=0; // переменная для хранения подъема кузова
    int valX, valY = 0; // переменные для хранения значений осей
    //для драйвера L298N
    int IN1 = 5; // Input3 подключен к выводу 5
    int IN2 = 4;
    int ENA = 3;
    int ENX=0;
    void setup() {
    delay(1000);
    // подключить переменную servo1 к выводу pinServo1
    servo1.attach(pinServo1);
    // подключить переменную servo2 к выводу pinServo2
    servo2.attach(pinServo2);
    pinMode (ENA, OUTPUT);
    pinMode (IN1, OUTPUT);
    pinMode (IN2, OUTPUT);
    /************************* Модуль NRF24 **********************/
    //delay(2000); // Пусть зарядится конденсатор
    radio.begin(); // Включение модуля;
    radio.setChannel(0); // Установка канала вещания;
    //radio.setRetries(15,15); // Установка интервала и количества попыток "дозвона" до приемника;
    radio.setDataRate(RF24_250KBPS); // Установка минимальной скорости;
    radio.setPALevel(RF24_PA_MAX); // Установка максимальной мощности;
    radio.setAutoAck(1); // Установка режима подтверждения приема;
    // radio.openWritingPipe(writingPipe); // Активация данных для отправки
    radio.openReadingPipe(1,readingPipe); // Активация данных для чтения
    radio.startListening(); // Слушаем эфир. // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)

    }

    void loop() {
    if(radio.available()){ // Если в буфере имеются принятые данные
    radio.read(&data, sizeof(data)); // Читаем данные в массив data и указываем сколько байт читать
    valX = analogRead(data[0]); // значение оси Х
    valY = analogRead(data[1]); // значение оси Y
    val_kuzov = analogRead(data[2]); //значение аналогового значения потенциометра для поднятия кузова
    Serial.println(valY);
    if (valY>= 485)
    {
    digitalWrite (IN1, LOW);
    digitalWrite (IN2, HIGH);
    ENX=map(valY,485,1023,50,255);
    analogWrite(ENA,ENX);
    }
    else if (valY <= 475)
    {
    digitalWrite (IN1, HIGH);
    digitalWrite (IN2,LOW );
    ENX=map(valY,475,0,50,255);
    analogWrite(ENA,ENX);
    }
    else
    {
    analogWrite(ENA,0);
    }

    // масштабируем значение к интервалу 0-180
    angleServo1=map(valX,100,950,50,130);
    angleServo2=map(val_kuzov,20,1023,0,70);
    // поворот сервоприводов на полученный угол
    servo1.write(angleServo1);
    servo2.write(angleServo2);
    delay(15); // пауза для ожидания поворота сервоприводов
    }
    }

    Если честно, то уже весь мозг сломал. Ошибка может быть и какая-то простая. Дочитал примерно до 10 странице дальше не осилил.
    За ранее спасибо за помощь
     
  17. za9c

    za9c Нуб

    const uint64_t readingPipe = 0xE8E8F0F0ABLL;
    //const uint64_t writingPipe = 0xE8E8F0F0A0LL;
    Я нихера не понимаю в вашем коде - я pic в асме делаю - попробуйте адрес изменить = они одинаковые должны быть что у приёмника что у передатчики а почитайте это!
    http://aterlux.ru/index.php?page=article&art=nrf24l01p
     
  18. Alex1983

    Alex1983 Нуб

    Перезалил код
    Передатчик:

    Код (C++):
    [code]
    #include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
    #include <nRF24L01.h>
    #include <printf.h>
    #include <RF24.h>
    #include <RF24_config.h>                                        // Подключаем библиотеку для работы с nRF24L01+
    RF24           radio(9, 10);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    int            data[3];                                   // Создаём массив для приёма данных
    const int axisX=A0; // ось Х подключена к A0
    const int axisY=A1; // ось Y подключена к A1
    const int kuzov=A2; //потенциометр для поднятия кузова
    const uint64_t writingPipe = 0xE8E8F0F0ABLL;
    void setup() {
    /*************************                Модуль NRF24                **********************/
        //delay(2000);                          // Пусть зарядится конденсатор
        radio.begin();                          // Включение модуля;
        radio.setChannel(0);                    // Установка канала вещания;
        radio.setRetries(15,15);                // Установка интервала и количества попыток "дозвона" до приемника;
        radio.setDataRate(RF24_250KBPS);        // Установка минимальной скорости;
        radio.setPALevel(RF24_PA_MAX);          // Установка максимальной мощности;
        radio.setAutoAck(1);                    // Установка режима подтверждения приема;
        radio.openWritingPipe(writingPipe);     // Активация данных для отправки
        //radio.openReadingPipe(1,readingPipe);   // Активация данных для чтения
        radio.startListening();                 // Слушаем эфир.             // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)

    }

    void loop() {
    data[0] = analogRead(axisX);                             // считываем показания с вывода A0 и записываем их в 0 элемент массива data
    data[1] = analogRead(axisY); // считываем показания с вывода A1 и записываем их в 1 элемент массива data                          
    data[2] = analogRead(kuzov);// считываем показанияс вывода A2 и записываем их в 2 элемент массива data
    radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить
    }

     
    [/code]

    Приемник
    Код (Text):

    #include <Servo.h> // подключение библиотеки Servo
    #include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
    #include <nRF24L01.h>
    #include <printf.h>
    #include <RF24.h>
    #include <RF24_config.h>                                        // Подключаем библиотеку  для работы с nRF24L01+
    RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    int            data[3];                                   // Создаём массив для приёма данных
    const uint64_t readingPipe = 0xE8E8F0F0ABLL;

    Servo servo1, servo2;
    const int pinServo1=8; // Пин для подключения 1 сервопривода колеса
    const int pinServo2=7; // Пин для подключения 2 сервопривода кузов
    // переменные для хранения углов поворота сервоприводов
    int angleServo1,angleServo2 = 0;
    int val_kuzov=0; // переменная для хранения подъема кузова
    int valX, valY = 0; // переменные для хранения значений осей
    //для драйвера L298N
    int IN1 = 5; // Input3 подключен к выводу 5
    int IN2 = 4;
    int ENA = 3;
    int ENX=0;
    void setup() {
      delay(1000);
     // подключить переменную servo1 к выводу pinServo1
    servo1.attach(pinServo1);
    // подключить переменную servo2 к выводу pinServo2
    servo2.attach(pinServo2);
     pinMode (ENA, OUTPUT);
     pinMode (IN1, OUTPUT);
     pinMode (IN2, OUTPUT);
      /*************************                Модуль NRF24                **********************/
        //delay(2000);                          // Пусть зарядится конденсатор
        radio.begin();                          // Включение модуля;
        radio.setChannel(0);                    // Установка канала вещания;

        radio.setDataRate(RF24_250KBPS);        // Установка минимальной скорости;
        radio.setPALevel(RF24_PA_MAX);          // Установка максимальной мощности;
        radio.setAutoAck(1);                    // Установка режима подтверждения приема;

        radio.openReadingPipe(1,readingPipe);   // Активация данных для чтения
        radio.startListening();                 // Слушаем эфир.             // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)

    }

    void loop() {
     if(radio.available()){                                // Если в буфере имеются принятые данные
            radio.read(&data, sizeof(data));                  // Читаем данные в массив data и указываем сколько байт читать
        valX = analogRead(data[0]); // значение оси Х
    valY = analogRead(data[1]); // значение оси Y
    val_kuzov = analogRead(data[2]); //значение аналогового значения потенциометра для поднятия кузова
    Serial.println(valY);
    if (valY>= 485)
    {
      digitalWrite (IN1, LOW);
      digitalWrite (IN2, HIGH);
     ENX=map(valY,485,1023,50,255);
     analogWrite(ENA,ENX);
    }
    else if (valY <= 475)
    {
      digitalWrite (IN1, HIGH);
      digitalWrite (IN2,LOW );
     ENX=map(valY,475,0,50,255);
     analogWrite(ENA,ENX);
    }
    else
    {
      analogWrite(ENA,0);
    }

    // масштабируем значение к интервалу 0-180
    angleServo1=map(valX,100,950,50,130);
    angleServo2=map(val_kuzov,20,1023,0,70);
    // поворот сервоприводов на полученный угол
    servo1.write(angleServo1);
    servo2.write(angleServo2);
    delay(15); // пауза для ожидания поворота сервоприводов
        }
    }
     
     
  19. sslobodyan

    sslobodyan Гик

    Куча ненужного текста, в которой теряется ошибка. Уберите полностью весь код, не относящийся к радио. Подключите сигнальный светодиод (или используйте распаянный на ардуине) чисто для диагностики состояния. И я бы не советовал работать с автоматическим подтверждением на машинке. Многие китайские модули в этом режиме глючат. А модули с усилителем не успевают переключаться и тоже глючат. И падает дальность. Да и есть ли смысл в автоподтверждении для машинки? Лучше сделайте ей файлсейв что бы она останавливалась в случае потери связи.
    Пока посмотрите на пример радиоуправления http://usamodelkina.ru/5239-delaem-mashinku-na-radioupravlenii-na-arduino-uno.html# От него можно оттолкнуться, потом менять скорость обмена, автоподтверждение и т.д.
     
  20. NikZ

    NikZ Нерд

    Приветствую! Не могу понять, где я косячу, помогите разобраться. Есть два модуля, зацеплены на разные Nano.
    Пример pingpair из библиотеки отрабатывает, как положено, хоть и с потерями пакетов иногда.
    Мой пример - нет, radio.write возвращает 0, то бишь отсылка не идет.

    Передатчик:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include "stdint.h"

    const uint64_t outPipe = 0xF0F0F0F0E1LL;
    int out = 5566;
    int i = 1;

    RF24 radio(7, 8);

    void setup() {
        //delay(500);                      
        Serial.begin(57600);
        Serial.println("Transmitter ready");
        radio.begin();                      
        radio.setChannel(80);                
        radio.setRetries(15, 15);
        radio.setPayloadSize(8);
        //radio.setDataRate(RF24_250KBPS);
        //radio.setPALevel(RF24_PA_LOW);
        radio.setAutoAck(1);
        radio.openWritingPipe(outPipe);
    }

    void loop(){
        bool ok = radio.write(&out, sizeof(int));
        if(ok){
          Serial.println("Packet " + String(out, DEC) + " sent, iteration " + String(i, DEC));
        } else {
          Serial.println("Error sending packet, iteration " + String(i, DEC));
        }
        i++;
        delay(1000);
    }
    Приемник:
    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include "stdint.h"

    const uint64_t inPipe = 0xF0F0F0F0E1LL;
    int in;

    RF24 radio(7, 8);

    void setup() {
        //delay(500);
        Serial.begin(57600);
        Serial.println("Receiver ready");
        radio.begin();
        radio.setChannel(80);
        radio.setRetries(15,15);
        radio.setPayloadSize(8);
        //radio.setDataRate(RF24_250KBPS);
        //radio.setPALevel(RF24_PA_MAX);
        radio.setAutoAck(1);
        radio.openReadingPipe(1, inPipe);
        radio.startListening();
    }

    void loop(){
        if(radio.available()){
          bool done = false;
          while(!done){    
            done = radio.read(&in, sizeof(int));
            Serial.println(in);
          }  
        } else {
          Serial.println("Data not available!");
        }
        delay(1000);
    }
    В примере pingpair инициализация модуля краткая, задается только setRetries и setPayloadSize. Пробовал у себя только это оставлять - без эффекта. Самое интересное, что этот код работал 2 дня назад. Решил поменять роли (одну плату зашил как приемник, другую как передатчик, до этого были наоборот) - перестал в любой конфигурации. А pingpair работает без проблем:( Тоже в любой конфигурации.