Помогите подключить nRF24l01+
-
Большое спасибо, прога компиллируется!
Связать устройства пока не смог, буду мучать их дальше. -
Мне тоже скоро должны прийти такие модули. Когда придут буду разбираться с подключением и настройкой. Думаю совместно сможем заставить их работать.
-
fort (2016-05-30 17:29:17):Мне тоже скоро должны прийти такие модули. Когда придут буду разбираться с подключением и настройкой. Думаю совместно сможем заставить их работать.
Отлично, а то я что-то застопорился. С ардуино, вроде проблем не должно быть — модуль выдает о себе инфу, значит работает. Что-то, видимо, на стороне Raspnerry. -
Добрый день.
Подскажите, как увидеть все данные, идущие по каналу?
Нужно записывать данные, передаваемые китайским ваттметром, но не знаю параметров передачи (канал, размер 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;
} -
Еще один вопрос.
Включаю через 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? -
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 мкФ (в других туториалах советовали больше). Также понятия не имел, что у конденсаторов может быть полярность.) Поэтому на одном из модулей он стоял неправильно. Был ли причиной конденсатор 1мкФ не знаю, но полярность — однозначно сыграла роль.
- Установил правильно конденсаторы на 4,7 мкФ. Проще всего оказалось воткнуть вот так
И заработало.
-
Вот и хорошо.
Мне вот только пришли оми модули, решил проверить их работу.
Моя система — 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)
>1
Role: Ping Out, starting transmissionNow 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)
>1
Role: Ping Out, starting transmissionInitiating 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. Что важно, в обоих примерах (в малине и на ардуине) используются идентичные настройки (номера каналов, адреса скорость) и есть возможность переключения режима работы приёмник/передатчик. -
P.S. На малине пример запускать надо от рута, иначе (как писали выше) получим segmentation fault.
P.P.S. С ардуиной модуль заработал без конденсатора. Возможно пока используюся малые скорости и низкая мощность его отсутствие не сказывается.
Схема подключения к ардуине (правда у меня не исползуется другой контакт, который в одном ряду с питанием, вроде IRQ) —
Схема подключения к малиен — -
А не сталкивались со 100% загрузкой процессора?
Насколько я понимаю, это из-за цикла в loop:
while (radio.available())
{
...
}
видимо, цикл прогоняется на максимальной скорости, поэтому загрузка 100%.
Поставил в начало цикла
sleep (15);
Теперь загрузка 0, данные пока не пропадали, но как-то на душе не спокойно. Может правильней как-то, например, все, что в loop вложить в цикл, ждущий активности на gpio? Если да, то как это организовать?