NRF24L01 первый опыт

Wiring, Processing, библиотеки

NRF24L01 первый опыт

Сообщение Djeck » 05 дек 2013, 21:25

Здравствуйте,
Решил опробовать радио модули NRF24L011. http://robocraft.ru/shop/index.php?route=product/product&path=54&product_id=268
Задача №1 просто передать переменную от одной ардуины до второй.
В начале пробовал пользоваться библиотекой Mirf, но даже пробные примеры не заработали.
Далее решил опробовать библиотеку RF24, тоже безрезультатно.

Передатчик Craftduino
Пины:
13 - SCK
12 - MISO
11 - MOSI
10 - CSN
9 - CE
IRQ не используется
питание подано от стабилизатора 3,3.
Код передатчика
Код: Выделить всё
#include <SPI.h>
#include "RF24.h" // Подключаем скачанную библиотеку RF24.

//Контакты от радио модуля NRF24L01 подключаем к pins -> Arduino
//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 10//CE -> 9
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
RF24 radio(9,10);

const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи

int msg[1]; //переменная для отправки радио сигнала

void setup(void){ 
  Serial.begin(9600); 
  radio.begin();
  radio.openWritingPipe(pipe); // Открываем канал передачи
 
  msg[0] = 123;
  msg[1] = 125;
}
void loop() {
 
 radio.write(msg, 1);
 Serial.println(msg[0]);
 delay(3000);
 

}


В качестве приемника использую Arduino Mega, соответственно номера пинов SPI тоже изменены.
Пины:
52 - SCK
51 - MOSI
50 - MISO
42 - CSN
40 - CE

Код:
Код: Выделить всё
#include <SPI.h>
#include "RF24.h"



//Контакты от радио модуля NRF24L01+ подключаем к pins -> Arduino
//SCK -> 13//MISO -> 12//MOSI -> 11//CSN -> 42//CE -> 40
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10
RF24 radio(40,42);

const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала

int msg[1]; //переменная для приёма радио сигнала

void setup()
{
  Serial.begin(9600);

  radio.begin();
  radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
  radio.startListening(); // Начинаем слушать эфир

}
void loop()
{

  if (radio.available())
  {
    radio.read(msg, 1);
    Serial.println(msg[0]);
  }

}


Распиновку проверил уже по 100 раз, контакты надежные.
Питание радиомодулей раздельное, на каждый свой стабилизатор на 3,3В.
Где-то вычитал, что у стабилизатора может иногда проседать напряжение, потому на выходе подключил электролитический конденсатор на 100мкФ.
Мультиметром замерил напряжение, все точно, напряжение корректное.

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

В наличии имеется логический анализатор. Просмотр интерфейса показывает что модули по крайней мере что-то отсылают ардуине, так что видимо они все же рабочие.
Djeck
 
Сообщения: 21
Зарегистрирован: 26 сен 2012, 09:26
programming: TurboPascal

Re: NRF24L01 первый опыт

Сообщение Zoltberg » 09 дек 2013, 16:56

Я их проверяю такими скетчами:
передатчик
Код: Выделить всё
#include <nrf24l01p.h>
#include <SPI.h>

enum
{
  SPI_SS_PIN = 10,
  NRF_CE_PIN = 9,
 
  NRF_CHANNEL = 120,
  NRF_POWER_UP_DELAY = 2,
  NRF_PAYLOAD_LENGTH = 16
};

const char test_data[] = "TestPayload";

void setup()
{
  SPI.begin();
   
  pinMode(SPI_SS_PIN, OUTPUT);
  digitalWrite(SPI_SS_PIN, HIGH);
 
  pinMode(NRF_CE_PIN, OUTPUT);
  digitalWrite(NRF_CE_PIN, LOW);
 
  uint8_t address[5] = { 0xE2, 0xE4, 0x23, 0xE4, 0x02 };
  nrf_init(address);
 
  Serial.begin(57600);
  Serial.println("Init");
}

void loop()
{
  delay(500);
 
  Serial.print("Trying to send packet...");
 
  static uint8_t payload[NRF_PAYLOAD_LENGTH];
  strcpy((char*)payload, test_data);
  nrf24l01p_write_tx_payload(payload, sizeof(payload));

  digitalWrite(NRF_CE_PIN, HIGH);
  delay(1);
  digitalWrite(NRF_CE_PIN, LOW);

  do {} while (!(nrf24l01p_get_irq_flags() & (1 << NRF24L01P_IRQ_TX_DS)));
  nrf24l01p_clear_irq_flag(NRF24L01P_IRQ_TX_DS);
  Serial.println(" done");
}

void nrf_init(uint8_t *address)
{
    delay(200);

    nrf24l01p_get_clear_irq_flags();
    nrf24l01p_close_pipe(NRF24L01P_ALL);
    nrf24l01p_open_pipe(NRF24L01P_TX, false);
    nrf24l01p_set_rx_payload_width(NRF24L01P_PIPE0, NRF_PAYLOAD_LENGTH);
    nrf24l01p_set_crc_mode(NRF24L01P_CRC_16BIT);
    nrf24l01p_set_address_width(NRF24L01P_AW_5BYTES);
    nrf24l01p_set_address(NRF24L01P_TX, address);
    nrf24l01p_set_operation_mode(NRF24L01P_PTX);
    nrf24l01p_set_rf_channel(NRF_CHANNEL);

    nrf24l01p_set_power_mode(NRF24L01P_PWR_UP);
    delay(NRF_POWER_UP_DELAY);
}

void nrf24l01p_spi_ss(nrf24l01p_spi_ss_level_t level)
{
  digitalWrite(SPI_SS_PIN, (level == NRF24L01P_SPI_SS_LOW ? LOW : HIGH));
}

uint8_t nrf24l01p_spi_rw(uint8_t value)
{
  return SPI.transfer(value);
}

приёмник
Код: Выделить всё
#include <nrf24l01p.h>
#include <SPI.h>

enum
{
  SPI_SS_PIN = 10,
  NRF_CE_PIN = 9,
 
  NRF_CHANNEL = 120,
  NRF_POWER_UP_DELAY = 2,
  NRF_PAYLOAD_LENGTH = 16
};

void setup()
{
  SPI.begin();
   
  pinMode(SPI_SS_PIN, OUTPUT);
  digitalWrite(SPI_SS_PIN, HIGH);
 
  pinMode(NRF_CE_PIN, OUTPUT);
  digitalWrite(NRF_CE_PIN, HIGH);
 
  uint8_t address[5] = { 0xE2, 0xE4, 0x23, 0xE4, 0x02 };
  nrf_init(address);
 
  Serial.begin(57600);
  Serial.println("Init");
}

void loop()
{
  Serial.println("Waiting for a packet...");
 
  do {} while (!(nrf24l01p_get_irq_flags() & (1 << NRF24L01P_IRQ_RX_DR)));
  nrf24l01p_clear_irq_flag(NRF24L01P_IRQ_RX_DR);
 
  static char payload[NRF_PAYLOAD_LENGTH];
  nrf24l01p_read_rx_payload((uint8_t*)payload);//, sizeof(payload));

  Serial.print(">>");
  Serial.println(payload);
}

void nrf_init(uint8_t *address)
{
    delay(100);

    nrf24l01p_get_clear_irq_flags();
    nrf24l01p_close_pipe(NRF24L01P_ALL);
    nrf24l01p_open_pipe(NRF24L01P_PIPE0, false);
    nrf24l01p_set_crc_mode(NRF24L01P_CRC_16BIT);
    nrf24l01p_set_address_width(NRF24L01P_AW_5BYTES);
    nrf24l01p_set_address(NRF24L01P_PIPE0, address);
    nrf24l01p_set_operation_mode(NRF24L01P_PRX);
    nrf24l01p_set_rx_payload_width(NRF24L01P_PIPE0, NRF_PAYLOAD_LENGTH);
    nrf24l01p_set_rf_channel(NRF_CHANNEL);

    nrf24l01p_set_power_mode(NRF24L01P_PWR_UP);
    delay(NRF_POWER_UP_DELAY);
}

void nrf24l01p_spi_ss(nrf24l01p_spi_ss_level_t level)
{
  digitalWrite(SPI_SS_PIN, (level == NRF24L01P_SPI_SS_LOW ? LOW : HIGH));
}

uint8_t nrf24l01p_spi_rw(uint8_t value)
{
  return SPI.transfer(value);
}

библиотека
nrf.zip
(9.86 КБ) Скачиваний: 3920

Попробуйте :nez-nayu:
сон разума рождает чудовищ
Аватара пользователя
Zoltberg
Администратор
 
Сообщения: 290
Зарегистрирован: 05 май 2011, 20:36
Откуда: Калининград

Re: NRF24L01 первый опыт

Сообщение Djeck » 10 дек 2013, 07:28

За пример спасибо.
Попробовал скопировать код, только изменив номера портов для CE и SS на свои 40 и 42.
К сожалению этот пример тоже не помог.

В коде нашел nrf24l01p_get_irq_flags().
Правильно ли я понимаю, что в вашем скетче используется irq?
Если да, то к какому пину его подключать?
Djeck
 
Сообщения: 21
Зарегистрирован: 26 сен 2012, 09:26
programming: TurboPascal

Re: NRF24L01 первый опыт

Сообщение Djeck » 11 дек 2013, 07:19

Повторная проверка прошла успешно. IRQ подключать не требуется.
Пакеты отсылаются и доставляются.
К слову мой скетч оказался все равно не рабочим, так что Zoltberg, спасибо вам большое.
Без вас я бы все еще колупался со скетчем, не имея даже представления о месте проблемы(подключение, сгоревший модуль, прошивка), а ведь модулей еще и два.
По крайней мере на этом этапе я уже знаю, что модули рабочие, а подключение правильное, так что буду уже дальше копаться в скетче.

Пользуясь случаем, хочу уточнить о питании радиомодулей.
Чтобы не рисковать и не гадать, не сгорел ли модуль, я подключал питание от отдельного стабилизатора на 3.3В.
Теперь же хотелось использовать более удобное подключение, непосредственно от Arduino.

На Craftduino и на Arduino Mega 1280, есть пин с питанием на 3.3В.
Можно ли nrf24L01 подключать к данному пину?
В одних источниках пишут, мол там простой делитель напряжения, так что оно довольно сильно гуляет в зависимости от нагрузки и велик риск сжечь модуль.
В других пишут, что питание подается от FT232 и им можно пользоваться.
Так можно или нет?
Djeck
 
Сообщения: 21
Зарегистрирован: 26 сен 2012, 09:26
programming: TurboPascal

Re: NRF24L01 первый опыт

Сообщение Zoltberg » 11 дек 2013, 15:54

Отлично :bra_vo:
Да IRQ не нужен, прошу прощения за запоздалый ответ.
Подключаю к выводу 3.3В на крафтине, проблем нет.
Это напряжение с внутреннего стабилизатора FT232, гляньте схемы, никаких делителей, врут всё :hi_hi_hi:
На новых плтах где нет FT232 - Uno, Leonardo, Mega2560 - стоит отдельный стабилизатор на 3.3в, так что пользуйтесь.
сон разума рождает чудовищ
Аватара пользователя
Zoltberg
Администратор
 
Сообщения: 290
Зарегистрирован: 05 май 2011, 20:36
Откуда: Калининград

Re: NRF24L01 первый опыт

Сообщение Djeck » 19 дек 2013, 08:57

Поковырявшись далее обнаружил, что проблема не только в скетче, но и в успешной перепрошивке дуины.
Почему-то если NRF24L01 подключена к дуине, то хоть Arduino IDE и сообщает об успешной перепрошивке, дуина не работает даже с тестовым софтом.
А вот если отключить хотя бы питание NRF24L01, то перепрошивка проходит успешно, и скетч работает.

Уж не по SPI ли заливается скетч, и в случае с подключенным радиомодулем, конфликтует?
Насколько знаю, в готовой дуине скетч льется по COM порту, разве нет? По крайней мере при перепрошивке мигают диоды COM порта.

Если все же скетч льется по COM порту, почему же тогда возникают проблемы с перепрошивкой дуины при подключенном радиомодуле?
Djeck
 
Сообщения: 21
Зарегистрирован: 26 сен 2012, 09:26
programming: TurboPascal

Re: NRF24L01 первый опыт

Сообщение Andrew » 19 янв 2014, 16:05

Добрый вечер. Купил в общем я два модуля NRF24L01, поключил выводы к нужным пинам (как в Вашем скетче), получил две схемы. И вот какая проблема - если прошиваю любую из схем как передатчик - всё вроде в порядке, пакеты отправляются. А вот если прошить схему как приёмник - она постоянно ижидает пекет, и ничего не принемает. Подскажите пожалуйста, в чём может быть проблемма. Заранее спасибо.
Andrew
 
Сообщения: 1
Зарегистрирован: 19 янв 2014, 16:00
programming: C,C++,C#

Re: NRF24L01 первый опыт

Сообщение intruderok » 20 авг 2014, 18:31

ничего не помогает...
intruderok
 
Сообщения: 1
Зарегистрирован: 20 авг 2014, 18:30

Re: NRF24L01 первый опыт

Сообщение chu » 04 окт 2014, 07:42

chu
 
Сообщения: 2
Зарегистрирован: 29 май 2012, 05:59
programming: forth

Re: NRF24L01 первый опыт

Сообщение druulian » 23 дек 2014, 14:01

Пробуйте припаять конденсаторы между Vcc и Gnd прямо на сам модуль. У меня без них тоже ничего не работало.
Пробовал керамический 1 мкФ - заработал, но половина пакетов терялась. С электролитом на 470 мкФ все стало нормально. Когда тот же электролит на 470 стоял на макетке по тем же контактам (+ 20 см проводов AWG24) - ничего не работало.
druulian
 
Сообщения: 2
Зарегистрирован: 23 дек 2014, 13:51
programming: Python


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

© 2009-2017 |  О проекте  |  Политика Конфиденциальности  |