Arduino Pro Micro + nrf24l01 (не удается подключить)

Тема в разделе "Arduino & Shields", создана пользователем eviltwin, 30 ноя 2013.

  1. eviltwin

    eviltwin Нуб

    Привет, Форумчане!
    Не так давно прикупил себе пару плат Arduino (Uno и Pro Micro) ну и датчиков разных в придачу.
    Сам я с программированием знаком больше 7-ми лет, и вот решил (пока в качестве хобби) поработать с Arduino и вообще с радиоэлектроникой, мечтал об этом с детства, но не было такой возможности раньше.
    Собственно по теме.
    С подключением Arduino Uno + nrf24l01+ проблем не было, все завелось сразу.
    А вот с Pro Micro все никак.
    Информация о Pro Micro (у меня 5V версия): https://www.sparkfun.com/products/11098
    Здесь вот Pinout: https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro
    Ну и Pinout подключаемой nrf24l01+: http://files.storeland.ru/web/upload/sitefiles/4/371/370162/RF24013.jpg

    Подключаю пины таким образом:
    Код (Text):

    NRF24L01 -> Pro Micro
    PIN 15 -> PIN 15
    PIN 7 -> PIN 14
    PIN 6 -> PIN 16
    PIN 4 -> PIN 6
    PIN 3 -> PIN 9
    PIN 1 -> GND
    PIN 2 -> R1 (330 кОм) -> R2 (51 кОм) -> VCC
     
    Поскольку для NRF24L01 надо 3.3V, а из VCC в Pro Micro идёт 5V, то я добавил сопротивлений.
    Честно скажу, подбирал экспериментально, т.к. при вычислении получалась ерунда. В общем замерял мультиметром, пока не получил ~3.3V
    Для проверки использовал пример из библиотеки RF24 (GettingStarted) только изменил строку:
    Код (Text):
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    RF24 radio(9,10);
    на такую:
    Код (Text):
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    RF24 radio(6,9);
    Когда понял, что не получилось, пробовал менять местами пины: RF24 radio(9,6);
    Результат был тем же, ничего не происходило.
    Думаю допустил где-то глупую ошибку и чего-то недопонимаю, прошу людей по-опытнее подсказать. Можно и просто ссылками на информацию, правда по Datasheet я пока плохо ориентируюсь.
     
  2. fiberline

    fiberline Нуб

    NRF24L01 вроде как по SPI работает, видимо 6,7 должны идти на 11,12 ProMini
     
  3. eviltwin

    eviltwin Нуб

    Нет здесь 11 и 12 пинов.
    Разобрался я с вопросом. Подключать надо так:
    Код (Text):
    NRF24L01 -> Pro Micro
    PIN 15 -> PIN 15
    PIN 7 -> PIN 14
    PIN 6 -> PIN 16
    PIN 4 -> PIN 2
    PIN 3 -> PIN 3
    PIN 1 -> GND
    PIN 2 -> R1 (330 кОм) -> R2 (51 кОм) -> VCC
    А в коде написал вот так:
    Код (Text):
    // Set up nRF24L01 radio on SPI bus plus pins 9 & 10
    RF24 radio(3,2);
    Надеюсь кому-нибудь будет полезно.
     
  4. Adeni

    Adeni Нуб

    Тоже пытаюсь скрестить Pro Micro и NRF24L01, но что-то никак не выходит. Уже какие только варианты не перепробовал, никак не пойму в чем дело. В Вашем варианте подключения при запуске примера GettingStarted, в начальном списке информации вроде что-то отображается, но клиент и сервер в упор не видят друг друга:
    [​IMG]
     
  5. Adeni

    Adeni Нуб

    Что-то я чем дольше пытаюсь разобраться, тем меньше понимаю, что происходит. В тексте программы оставил один единственный вывод информации о статусе передатчика. В настройках указал 99 порт, а в таблице выводимой в сериал, абсолютно другая информация. У меня в наличии 5 штук NRF24L01, и со всеми такая фигня. Грешил на проблемы с питанием, но перепробовав разные источники пришел к выводу, что дело не в нем. Может кто подсказать в какую сторону копать? А то я уже неделю бьюсь и все безрезультатно.
     
  6. Adeni

    Adeni Нуб

    Эту тему я уже тоже изучил. Добился таки того, чтобы в radio.Printdetails() выводились осмысленные данные. Оба приемника даже сели на указанную мной частоту, проверенную скетчем из того топика на зашумленность, но они все равно не видят друг друга.
     
  7. Adeni

    Adeni Нуб

    Кто может подсказать, что я делаю не так?
    Вот что у меня на передатчиках:
    [​IMG]

    Вот код приемника:
    Код (Text):

    #include <SPI.h>
    #include "RF24.h"
    int msg[1];
    RF24 radio(3,2);

    //светодиоды подключены к этим пинам
    int LEDpin1 = 4;

    // адреса каналов приема и передачи
    const uint64_t pipes[2] = {
      0xF0F0F0F000LL, 0xF0F0F0F0FFLL};

    void setup(void){
      Serial.begin(57600);
      printf_begin();
      radio.begin();
      radio.setDataRate(RF24_250KBPS); // Скорость передачи
      radio.setChannel(100); // Номер канала от 0 до 127
      radio.setRetries(15,15); // Кол-во попыток и время между попытками
      radio.openWritingPipe(pipes[0]); // Открываем канал передачи
      radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема
      radio.startListening(); // Начинаем слушать эфир
      pinMode(LEDpin1, OUTPUT);
      delay(5000);
      radio.printDetails();
    }

    void loop(void){
      if (radio.available()){
        bool done = false;
        while (!done){
          done = radio.read(msg, 1);
          Serial.println(msg[0]);
          //если пришел пакет от Arduino №1 (111) вКлючается светодиод (горит)LEDpin1, HIGH
          if (msg[0] == 111){
            delay(10);
            digitalWrite(LEDpin1, HIGH);
          }
          else {
            digitalWrite(LEDpin1, LOW);
          }
          delay(10);
        }
      }
    }
    int serial_putc( char c, FILE *){
      Serial.write (c);
      return c;
    }

    void printf_begin(void){
      fdevopen(&serial_putc,0)
        ;
    }
    Код передатчика:
    Код (Text):
    #include <SPI.h>
    #include "RF24.h"
    int msg[1];

    RF24 radio(3,2);

    // адреса каналов приема и передачи
    const uint64_t pipes[2] = {
      0xF0F0F0F000LL, 0xF0F0F0F0FFLL};

    //кнопки подключены к этим пинам
    int buttonPin1 =4;

    void setup(void){
      Serial.begin(57600);
      printf_begin();
      radio.begin();
      radio.setDataRate(RF24_250KBPS); // Скорость передачи
      radio.setChannel(100); // Номер канала от 0 до 127
      radio.setRetries(15,15); // Кол-во попыток и время между попытками
      radio.openWritingPipe(pipes[1]); // Открываем канал передачи
      radio.openReadingPipe(1, pipes[0]); // Открываем один из 6-ти каналов приема
      radio.startListening(); // Начинаем слушать эфир
      delay(5000);
      radio.printDetails();
    }

    void loop(void){

      //пока кнопка (buttonPin1)нажата отправляем пакет (111)в Arduino №2
      if (digitalRead(buttonPin1) == HIGH){
        msg[0] = 111;
        radio.stopListening();
        radio.write(msg, 1);
        radio.startListening();
      }

    }
    int serial_putc( char c, FILE *){
      Serial.write (c);
      return c;
    }

    void printf_begin(void){
      fdevopen(&serial_putc,0)
        ;
    }
     
  8. ИгорьК

    ИгорьК Гуру

    Код (Text):
    radio.write(msg, 1); // Подумайте хорошенько над этой строчкой!!! Сами подумайте.
    Кроме того, Вы забыли #include <nRF24L01.h>
    Я не говорю что это решит все проблемы - это на первый взгляд.
     
  9. Adeni

    Adeni Нуб

    Сделал переменную msg не массивом.
    Изменил в передатчике на radio.write(&msg, sizeof(msg));
    В приемнике на done = radio.read(&msg, sizeof(msg));
    Добавил и в приемник и в передатчик #include "nRF24L01.h"
    Ничего не помогло.

    Самое интересное, что изначально, пример который я нашел на ютубе, заработал, диоды загорались при нажатии на кнопку. Теперь же этот же самый пример ни в какую не хочет работать.
     
    Последнее редактирование: 18 июл 2014
  10. ИгорьК

    ИгорьК Гуру

    Попробуйте повторить вот этот пример. Он 100% рабочий.
     
  11. Adeni

    Adeni Нуб

    Так это стандартный пример из библиотеки RF24, он у меня тоже не работает как должно. На нем передатчики вообще не получают одинаковых параметров при загрузке скетча. Вот один из вариантов.
    [​IMG]

    Бывает даже что каналы совпадают, но остальные параметры отличаются.
     
  12. Adeni

    Adeni Нуб

    Вот они взяли вроде одинаковые параметры, но все равно не работает:
    [​IMG]

    Вот как у меня все подключено:
    [​IMG]
     
    Последнее редактирование: 19 июл 2014
  13. geher

    geher Гуру

    Такое ощущение, что радиомодули при старте инициализируются практически случайно (в результате какого-то дефекта или оно так и задумывалось, или еще почему, непонятно).
    В результате получается разнобой по параметрам и невозможность правильного соединения.

    Есть гипотеза, что надо задать им абсолютно все конфигурационные параметры.
    В том числе и то, что не задавалось в первом скрипте - размер пакета (setPayloadSize или enableDynamicPayloads для произвольного размера, но во втором случае потребуется перед каждым считыванием придется определять размер пакета при помощи getDynamicPayloadSize и его считывать).

    И еще. Поскольку радиомодуль запитывается через резисторы, а не от нормального источника питания с понятным напряжением, то разумно посмотреть, а какое там напряжение питания у него получается, не слишком ли низкое (все-таки у резисторов есть разброс характеристик, причем порой он бывает весьма значительным)?
     
  14. Adeni

    Adeni Нуб

    Питание они получают не через делитель, а от такого вот преобразователя: [​IMG]
    Так что с этим проблем быть не должно, выставил на нем 3.3 вольта.

    Т.е. вот так будет выглядеть код?
    Код (Text):
     radio.begin();
      radio.setDataRate(RF24_250KBPS); // Скорость передачи
      radio.setChannel(100); // Номер канала от 0 до 127
      radio.setRetries(15,15); // Кол-во попыток и время между попытками
      radio.setPayloadSize(8); // Устанавливаем  фиксированный размер пакета
      radio.openWritingPipe(pipes[0]); // Открываем канал передачи
      radio.openReadingPipe(1, pipes[1]); // Открываем один из 6-ти каналов приема
      radio.startListening(); // Начинаем слушать эфир
    UPD: Сейчас даже с указанием всех этих параметров в настройках одни нули... Ну не может же быть, чтобы все 5 модулей были бракованными.

    UPD2: С добавленной строкой radio.setPayloadSize(8); в распечатке параметры одинаковые, но все равно не работает.
     
    Последнее редактирование: 19 июл 2014
  15. ИгорьК

    ИгорьК Гуру

    Мне помогли две вещи в комплексе: конденсатор и правка библиотеки.
    В целом, работа с этими модулями началась таким-же безумием: вроде все соединено правильно, код понятен, но не работает.
     
  16. Adeni

    Adeni Нуб

    Конденсаторы на 10Мкф я подпаял сразу же как получил модули. Библиотеку тож подправил, как только наткнулся на Ваш пост. Т.е. в текущем состоянии я применил уже все найденные мной бубны, но видать еще какой-то надо искать :(

    Меня до сих пор удивляет, каким образом один раз мне все же удалось заставить эту систему работать ....
     
    Последнее редактирование: 21 июл 2014
  17. ИгорьК

    ИгорьК Гуру

    Интересная мысль. Попробуйте в файл конфигурации добавить еще:
    radio.setAutoAck(1);
    Вчера к передатчику прикрутил третий приемник - все работает. Передатчик посылает команды на три исполнительные устройства. Посмотрите мои скетчи по части конфигурации модуля здесь и здесь. Подтверждаю их работоспособность.
    Если все таки не работает, полагаю причину надо искать в кривости библиотек относительно Про Микро. Или SPI или NRF. Других причин даже представить не могу.
     
    Последнее редактирование: 22 июл 2014
  18. pit

    pit Нуб

    Здоров ребята!
    Я уже несколько месяцем ломаю голову по трансиверу nrf24l01 все как то не получается , кто может сказать в чем я ошибаюсь . СПОСИБО за помощь! вот код.
    #include "stm32f4xx.h"
    #include "stm32f4xx_gpio.h"
    #include "stm32f4xx_rcc.h"
    #include "stm32f4xx_spi.h"
    #define ce_on GPIO_SetBits(GPIOA, GPIO_Pin_2);
    #define ce_off GPIO_ResetBits(GPIOA, GPIO_Pin_2);
    #define cs_on GPIO_ResetBits(GPIOA, GPIO_Pin_4);
    #define cs_off GPIO_SetBits(GPIOA, GPIO_Pin_4);
    #define cs_onB GPIO_ResetBits(GPIOB, GPIO_Pin_12);
    #define cs_offB GPIO_SetBits(GPIOB, GPIO_Pin_12);
    #define ce_offB GPIO_ResetBits(GPIOB, GPIO_Pin_11);
    #define ce_onB GPIO_SetBits(GPIOB, GPIO_Pin_11);
    #define irqB GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10);
    #define led1_on GPIO_SetBits(GPIOD, GPIO_Pin_12);
    #define led1_off GPIO_ResetBits(GPIOD, GPIO_Pin_12);
    #define led2_on GPIO_SetBits(GPIOD, GPIO_Pin_13);
    #define led2_off GPIO_ResetBits(GPIOD, GPIO_Pin_13);
    #define led3_on GPIO_SetBits(GPIOD, GPIO_Pin_14);
    #define led3_off GPIO_ResetBits(GPIOD, GPIO_Pin_14);
    #define led4_on GPIO_SetBits(GPIOD, GPIO_Pin_15);
    #define led4_off GPIO_ResetBits(GPIOD, GPIO_Pin_15);

    int main(void)
    {

    nrf24l01_init();
    ms_100();
    write(0x20, 0x0A); // включаем модуль А
    writeB(0x20, 0x0A); // включаем модуль B
    ms_1_5_();
    int t;

    uint8_t dec = 0;


    // channel

    write(0x25, 100);
    writeB(0x25, 100);
    //


    led1_on;
    uint8_t d = 0;
    uint8_t def = 0;






    while(1)
    {

    // На одном контроллере подключены два трансивера , цель заключается в том,
    // чтоб убедиться что все работает ( передать данные через один трансивере а принять на ругом)
    // замете что функции с большой быквы B например writeB() это обраение передающему модулю а если без B ,
    // то обращение принимающему модулю.
    write(0x20, 0x0b); // трансивер А устанавливается на приемник с помощью регистра конфигурации
    ce_on; // поднимаем ногу CE принимающего модуля
    mcs_130(); // ждем 130 микросекунд
    writeB(0xa0, d); // передаем данные в payload
    writeB(0x20, 0x0a); // Устанавливаем трансивер Б на выход
    ce_onB; // поднимаем ногу CE передающего модуля
    mcs_130(); // для уверенности ждем 130 микросекунд
    ce_offB; // опускаем ногу CE передающего модуля
    dec = readB(0x07); // читаем регистр статуса
    write(0x27, dec); // сбрасываем флажки
    dec = 0;
    dec = read(0x07);
    write(0x27, dec);
    def = read(0x61); // читаем из регистра payload принимающего модуля
    dec = read(0x07);
    write(0x27, dec);

    d ++;


    if(def == 0xaa){
    led1_on
    }else{
    led1_off;
    }


    if(def == 0xa0){
    led2_on
    }else{
    led2_off;
    }

    if(def == 0xff){
    led3_on
    }else{
    led3_off;
    }

    if(def == 0x0f){
    led4_on
    }else{
    led4_off;
    }

    ms_100();


    }
    }
     
  19. djcorsar7

    djcorsar7 Нуб

    А где вы на Pro Micro pin CE или SS нашли ?
     
    Последнее редактирование модератором: 24 фев 2018