Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
  1. Главная
  2. Raspberry Pi
  3. Помогите подключить nRF24l01+

Помогите подключить nRF24l01+

Запланировано Прикреплена Закрыта Перенесена Raspberry Pi
17 Сообщения 1 Posters 393 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • piP Не в сети
    piP Не в сети
    pi
    написал в отредактировано pi
    #6

    Спасибо за подробный ответ!
    Приведенные выше ошибки пропали, появилась новая:

    pi@MediaServer:~/MyProg $ sudo g++ -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -L /home/pi/RF24/RPi/RF24  -lrf24 arcon.c -o rpi
    /usr/bin/ld: cannot find -lrf24
    collect2: error: ld returned 1 exit status
    

    Понятия не имею что такое lrf24…

    Без этого параметра валится куча ошибок:

    pi@MediaServer:~/MyProg $ sudo g++ -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -L /home/pi/RF24/RPi/RF24 arcon.c -o rpi
    /tmp/ccuf7ZZm.o: In function `setup()':
    arcon.c:(.text+0xc): undefined reference to `RF24::begin()'
    arcon.c:(.text+0x14): undefined reference to `RF24::enableDynamicPayloads()'
    arcon.c:(.text+0x20): undefined reference to `RF24::setAutoAck(bool)'
    arcon.c:(.text+0x30): undefined reference to `RF24::setRetries(unsigned char, unsigned char)'
    arcon.c:(.text+0x3c): undefined reference to `RF24::setDataRate(rf24_datarate_e)'
    arcon.c:(.text+0x48): undefined reference to `RF24::setPALevel(unsigned char)'
    arcon.c:(.text+0x54): undefined reference to `RF24::setChannel(unsigned char)'
    arcon.c:(.text+0x60): undefined reference to `RF24::setCRCLength(rf24_crclength_e)'
    arcon.c:(.text+0x74): undefined reference to `RF24::openReadingPipe(unsigned char, unsigned long long)'
    arcon.c:(.text+0x80): undefined reference to `RF24::startListening()'
    /tmp/ccuf7ZZm.o: In function `loop()':
    arcon.c:(.text+0xf4): undefined reference to `bcm2835_delay'
    arcon.c:(.text+0x14c): undefined reference to `RF24::available()'
    arcon.c:(.text+0x15c): undefined reference to `RF24::getDynamicPayloadSize()'
    arcon.c:(.text+0x16c): undefined reference to `RF24::read(void*, unsigned char)'
    /tmp/ccuf7ZZm.o: In function `_GLOBAL__sub_I_radio':
    arcon.c:(.text.startup+0x60): undefined reference to `RF24::RF24(unsigned char, unsigned char, unsigned int)'
    collect2: error: ld returned 1 exit status
    
    1 ответ Последний ответ
    0
    • piP Не в сети
      piP Не в сети
      pi
      написал в отредактировано pi
      #7

      Понятия не имею что такое lrf24…
      Это подсказка линковщику ld (вызывается компилятором g++) что часть функций, которые описаны в RF24.h находится в динамической библиотеке lrf4. На самом деле она называется lrf24-bcm…
      Если ты при установке библиотеки RF24 выполнял make install то в '/usr/local/lib' у тебя должно быть примерно так (должны быть скомпилированная библиотека и симлинки на неё):

      pi@raspberrypi:~/nrf24l01/RF24/RPi/RF24/examples $ ls -l /usr/local/lib
      total 44
      lrwxrwxrwx 1 root staff 33 May 19 19:46 librf24-bcm.so -> /usr/local/lib/librf24-bcm.so.1.0
      lrwxrwxrwx 1 root staff 33 May 19 19:46 librf24-bcm.so.1 -> /usr/local/lib/librf24-bcm.so.1.0
      -rwxr-xr-x 1 root staff 40792 May 19 19:46 librf24-bcm.so.1.0
      drwxrwsr-x 4 root staff 4096 Mar 18 11:13 python2.7и в '/usr/local/include' (должна быть папка RF24 с заголовчными файлами)ls -l /usr/local/include/
      total 4
      drwxr-sr-x 2 root staff 4096 May 19 19:46 RF24
      

      Теперь о компиляции.

      pi@MediaServer:~/MyProg $ sudo g++ -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -L /home/pi/RF24/RPi/RF24 -lrf24 arcon.c -o rpi
      /usr/bin/ld: cannot find -lrf24
      collect2: error: ld returned 1 exit status
      

      Во-первых, sudo не нужен.
      Во-вторых -L /home/pi/RF24/RPi/RF24 вроде должен сообщать линковщику где искать библиотеки. Поскольку у меня (и у тебя скорее всего тоже) библиотека установлена командойmake installто библиотека уже будет в папке /usr/loca/lib, про которую линковщик и так в курсе, поэтому этот параметр можно убрать.
      -lrf24нужно заменить на -lrf24-bcmтак как имя у библиотеки изменилось.

      Далее

      #include "/home/pi/RF24/RPi/RF24/RF24.h"
      

      должен указвать на RF24.h c закомментированными define'ами.
      Я изменил это на #include <RF24.h> и добавил параметр-I../

      В итоге такой код (файл находится в папке /home/pi/nrf24l01/RF24/RPi/RF24/examples)

      pi@raspberrypi:~/nrf24l01/RF24/RPi/RF24/examples $ cat testrf24.cpp
      #include <cstdlib>
      #include <iostream>
      #include "RF24.h"
      #include <fstream>
      using namespace std;
      
      // spi device, spi speed, ce gpio pin
      //RF24 radio("/dev/spidev0.0",8000000,25);
      RF24 radio(12,13,25);//значения просто для примера, чтобы компилятор не ругался.
      
      void setup(void)
      {
      // init radio for reading
      radio.begin();
      radio.enableDynamicPayloads();
      radio.setAutoAck(1);
      radio.setRetries(15,15);
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_MAX);
      radio.setChannel(76);
      radio.setCRCLength(RF24_CRC_16);
      radio.openReadingPipe(1,0xF0F0F0F0E1LL);
      radio.startListening();
      }
      
      void loop(void)
      {
      char receivePayload[64];
      while (radio.available())
      {
      uint8_t len = radio.getDynamicPayloadSize();
      radio.read(receivePayload, len);
      // Костыль для создания промежуточного файла.
      ofstream out("/dev/nrf24");
      out << receivePayload << "\n";
      out.close ();
      //cout<<"\n Data="<<receivePayload;
      delay(200);
      }
      }
      
      int main(int argc, char** argv)
      {
      cout << "Driver initialized, please check values of /dev/nrf24" << endl;
      setup();
      while(1)
      loop();
      
      return 0;
      }
      

      компилируется такой командой

      g++ -Wall -Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s -I../ -lrf24-bcm testrf24.cpp -o rpi
      
      1 ответ Последний ответ
      0
      • piP Не в сети
        piP Не в сети
        pi
        написал в отредактировано
        #8

        Большое спасибо, прога компиллируется!
        Связать устройства пока не смог, буду мучать их дальше.

        1 ответ Последний ответ
        0
        • piP Не в сети
          piP Не в сети
          pi
          написал в отредактировано
          #9

          Мне тоже скоро должны прийти такие модули. Когда придут буду разбираться с подключением и настройкой. Думаю совместно сможем заставить их работать.

          1 ответ Последний ответ
          0
          • piP Не в сети
            piP Не в сети
            pi
            написал в отредактировано pi
            #10

            fort (2016-05-30 17:29:17):Мне тоже скоро должны прийти такие модули. Когда придут буду разбираться с подключением и настройкой. Думаю совместно сможем заставить их работать.

            Отлично, а то я что-то застопорился. С ардуино, вроде проблем не должно быть — модуль выдает о себе инфу, значит работает. Что-то, видимо, на стороне Raspnerry.

            1 ответ Последний ответ
            0
            • piP Не в сети
              piP Не в сети
              pi
              написал в отредактировано pi
              #11

              Добрый день.
              Подскажите, как увидеть все данные, идущие по каналу?
              Нужно записывать данные, передаваемые китайским ваттметром, но не знаю параметров передачи (канал, размер payload, адрес). В пример приёма добавил цикл с перебором каналов, но ничего не получаю.

              #include #include #include <RF24/RF24.h>
              
              using namespace std;
              
              // gpio pins, spi speed
              RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ);
              
              int main(int argc, char** argv)
              {
              char receivePayload[16];
              uint8_t pipe_num=0;
              
              radio.begin();
              radio.setPALevel(RF24_PA_MAX);
              radio.setDataRate(RF24_1MBPS);
              radio.setCRCLength(RF24_CRC_16);
              radio.setRetries(15, 15);
              radio.setAutoAck(1);
              
              for( int i=0; i<126; i++){
              radio.setChannel(i);
              radio.enableDynamicPayloads();
              // radio.setPayloadSize(32);
              radio.openReadingPipe(0,0xE8E8F0F0E2LL);
              radio.openReadingPipe(1,0xC1C2C2C2C2LL);
              radio.openReadingPipe(2,0xC1C2C2C2C3LL);
              radio.openReadingPipe(3,0xC1C2C2C2C4LL);
              radio.openReadingPipe(4,0xC1C2C2C2C5LL);
              radio.openReadingPipe(5,0xC1C2C2C2C6LL);
              
              radio.startListening();
              printf(«Start channel %i \n»,i);
              
              for(int k=0; k<300000;k++) {
              while (radio.available(&pipe_num))
              {
              // Clear measurement values
              memset(receivePayload,0,sizeof(receivePayload));
              
              // radio.read(&receivePayload, sizeof(receivePayload));
              uint8_t len = radio.getDynamicPayloadSize();
              radio.read(receivePayload, len);
              printf(«pipe %d: %s\n», pipe_num, receivePayload);
              }
              }
              radio.stopListening();
              }
              
              return 0;
              }
              
              1 ответ Последний ответ
              0
              • piP Не в сети
                piP Не в сети
                pi
                написал в отредактировано pi
                #12

                Еще один вопрос.

                Включаю через raspi-config SPI, в его текстовом GUI получаю сообщение:
                The SPI interface is enabled
                Выхожу из raspi-config
                В консоли вижу:

                /usr/bin/raspi-config: 597: /usr/bin/raspi-config: dtparam: not found
                

                Означает ли это, что SPI не включился и дальше пытаться работать с nRF24l01+ смысла нет?
                Как проверить работоспособность SPI?

                1 ответ Последний ответ
                0
                • piP Не в сети
                  piP Не в сети
                  pi
                  написал в отредактировано pi
                  #13

                  raspi-config, по-моему, при включении SPI просто правит файл /boot/config.txt. Как написано здесь достаточно просто добавить/раскомментировать

                  dtparam=spi=on
                  

                  Насколько я понял, при включении SPI после перезагрузки в каталоге /dev/ должны появиться уcтройства spidev0.0 и spidev1.1.
                  Также при наличии подключенного устройства в выводе dmesg должно быть что-то про SPI. Проверить можно так

                  dmesg | grep -i spi
                  

                  У меня на моей малине B+ через SPI не заработал считыватель MFRC522, хотя с ардуиной он работает. Возможно для работы SPI нужно еще что-то докрутить.

                  1 ответ Последний ответ
                  0
                  • piP Не в сети
                    piP Не в сети
                    pi
                    написал в отредактировано
                    #14

                    завелось!) еще раз спасибо.

                    Почему не работало.

                    1. Изначально последовал одному из советов и припаял на радиомодуль электролит на 1 мкФ (в других туториалах советовали больше). Также понятия не имел, что у конденсаторов может быть полярность.) Поэтому на одном из модулей он стоял неправильно. Был ли причиной конденсатор 1мкФ не знаю, но полярность — однозначно сыграла роль.
                    2. Установил правильно конденсаторы на 4,7 мкФ. Проще всего оказалось воткнуть вот так

                    И заработало.

                    1 ответ Последний ответ
                    0
                    • piP Не в сети
                      piP Не в сети
                      pi
                      написал в отредактировано pi
                      #15

                      Вот и хорошо.
                      Мне вот только пришли оми модули, решил проверить их работу.
                      Моя система — Rpi B+:

                      uname -a
                      Linux raspberrypi 4.4.9+ #884 Fri May 6 17:25:37 BST 2016 armv6l GNU/Linux
                      

                      Сначала ставим библиотеку как описано здесь.

                      Папки examples_rpi у меня не оказалось, зато есть examples_linx. Переходим в неё и компилируем примеры.

                      pi@raspberrypi ~/RF24/examples_linux $ make
                      arm-linux-gnueabihf-g++ -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -Ofast -Wall -pthread  -I/usr/local/include/RF24/.. -I.. -L/usr/local/lib gettingstarted_call_response.cpp -lrf24 -o gettingstarted_call_response
                      arm-linux-gnueabihf-g++ -march=armv6zk -mtune=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -Ofast -Wall -pthread  -I/usr/local/include/RF24/.. -I.. -L/usr/local/lib pingpair_dyn.cpp -lrf24 -o pingpair_dyn
                      pingpair_dyn.cpp: In function ‘int main(int, char**)’:
                      pingpair_dyn.cpp:201:42: warning: ‘len’ may be used uninitialized in this function [-Wmaybe-uninitialized]
                             radio.write( receive_payload, len );
                                                                ^
                      pi@raspberrypi ~/RF24/examples_linux $ sudo ./transfer
                      

                      Примеры скомпилировались, но не работают:

                      pi@raspberrypi ~/RF24/examples_linux $ sudo ./gettingstarted
                      RF24/examples/GettingStarted/
                      ================ SPI Configuration ================
                      CSN Pin          = CE0 (PI Hardware Driven)
                      CE Pin           = Custom GPIO22
                      Clock Speed      = 8 Mhz
                      ================ NRF Configuration ================
                      STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
                      RX_ADDR_P0-1     = 0x544d52687c 0xabcdabcd71
                      RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
                      TX_ADDR          = 0x544d52687c
                      RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00
                      EN_AA            = 0x3f
                      EN_RXADDR        = 0x03
                      RF_CH            = 0x4c
                      RF_SETUP         = 0x07
                      CONFIG           = 0x0e
                      DYNPD/FEATURE    = 0x00 0x00
                      Data Rate        = 1MBPS
                      Model            = nRF24L01+
                      CRC Length       = 16 bits
                      PA Power         = PA_MAX
                      
                       ************ Role Setup ***********
                      Choose a role: Enter 0 for pong_back, 1 for ping_out (CTRL+C to exit)
                      &gt;1
                      Role: Ping Out, starting transmission
                      
                      Now sending...
                      RF24 HARDWARE FAIL: Radio not responding, verify pin connections, wiring, etc.
                      RF24 HARDWARE FAIL: Radio not responding, verify pin connections, wiring, etc.
                      RF24 HARDWARE FAIL: Radio not responding, verify pin connections, wiring, etc.
                       Правим файл gettingstarted.cpp меняем строчку:
                      RF24 radio(22,0);на 
                      RF24 radio(25,0); и файл transfer.cpp меняем строчку:
                      RF24 radio(RPI_V2_GPIO_P1_15, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ); на RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_24, BCM2835_SPI_SPEED_8MHZ); поскольку у меня пин CE модуля подключен к 22 пину малины (он же GPIO25).
                      Теперь запускаем пример снова:
                      pi@raspberrypi ~/RF24/examples_linux $ sudo ./transfer
                      RF24/examples/Transfer/
                      ================ SPI Configuration ================
                      CSN Pin          = CE0 (PI Hardware Driven)
                      CE Pin           = Custom GPIO25
                      Clock Speed      = 8 Mhz
                      ================ NRF Configuration ================
                      STATUS           = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
                      RX_ADDR_P0-1     = 0x544d52687c 0xabcdabcd71
                      RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
                      TX_ADDR          = 0x544d52687c
                      RX_PW_P0-6       = 0x20 0x20 0x00 0x00 0x00 0x00
                      EN_AA            = 0x3f
                      EN_RXADDR        = 0x03
                      RF_CH            = 0x01
                      RF_SETUP         = 0x07
                      CONFIG           = 0x0a
                      DYNPD/FEATURE    = 0x00 0x00
                      Data Rate        = 1MBPS
                      Model            = nRF24L01+
                      CRC Length       = 8 bits
                      PA Power         = PA_MAX
                      
                       ************ Role Setup ***********
                      Choose a role: Enter 0 for receiver, 1 for transmitter (CTRL+C to exit)
                      &gt;1
                      Role: Ping Out, starting transmission
                      
                      Initiating Basic Data Transfer
                      

                      На арудине получаем:

                      Payload Count: 0
                      Rate: 0.00
                      Payload Count: 0
                      Rate: 2.40
                      Payload Count: 75
                      Rate: 13.44
                      Payload Count: 420
                      Rate: 13.34
                      Payload Count: 417
                      Rate: 13.15
                      Payload Count: 411
                      

                      Для ардуины библотека ставилась через «Управление библиотеками», использовался пример Transfer.
                      Что важно, в обоих примерах (в малине и на ардуине) используются идентичные настройки (номера каналов, адреса скорость) и есть возможность переключения режима работы приёмник/передатчик.

                      1 ответ Последний ответ
                      0
                      • piP Не в сети
                        piP Не в сети
                        pi
                        написал в отредактировано
                        #16

                        P.S. На малине пример запускать надо от рута, иначе (как писали выше) получим segmentation fault.
                        P.P.S. С ардуиной модуль заработал без конденсатора. Возможно пока используюся малые скорости и низкая мощность его отсутствие не сказывается.
                        Схема подключения к ардуине (правда у меня не исползуется другой контакт, который в одном ряду с питанием, вроде IRQ) —
                        Схема подключения к малиен —

                        1 ответ Последний ответ
                        0
                        • piP Не в сети
                          piP Не в сети
                          pi
                          написал в отредактировано pi
                          #17

                          А не сталкивались со 100% загрузкой процессора?
                          Насколько я понимаю, это из-за цикла в loop:

                          while (radio.available())
                              {
                          ...
                              }
                          

                          видимо, цикл прогоняется на максимальной скорости, поэтому загрузка 100%.
                          Поставил в начало цикла

                          sleep (15);
                          

                          Теперь загрузка 0, данные пока не пропадали, но как-то на душе не спокойно. Может правильней как-то, например, все, что в loop вложить в цикл, ждущий активности на gpio? Если да, то как это организовать?

                          1 ответ Последний ответ
                          0

                          • Войти

                          • Нет учётной записи? Зарегистрироваться

                          • Login or register to search.
                          • Первое сообщение
                            Последнее сообщение
                          0
                          • Категории
                          • Главная
                          • Документация
                          • Последние
                          • Пользователи