NRF24l01 работает на Arduino Uno, но не работает на Mega

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Раньше я делал передатчик и приемник, все работало. Сейчас решил повторить - прошлый пример у меня не пошел. Тогда решил проверить так, как указано здесь форумчанином Zoldberg http://robocraft.ru/forum/viewtopic.php?f=27&t=667
И понял, в чем может быть проблема. Код использую один и тот же

Код: Выделить всё

#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);
}
Загрузил в Uno, все работает - терминал пишет Trying to send packet... Done.
Я так понял, это значит, что NRF24l01 работает.
Чтобы все было число, я этот NRF24l01 подключил к Arduino Mega! Загрузил ту же программу. Все таже. И тут я заметил - Trying to send packet... Done. не пишет.
Не пишет ничего. Я перепроверил все. Не пашет. Тогда я посмотрел, что происходит на Uno еще раз - все время работает TX - данные в com-порт-терминал все время подгружаются из Ардуино. С Мега же я нашел интересный момент. Надпись Trying to send packet... Done. Передается лишь 3 раза после загрузки скетча. Потом TX заканчивается. Если выткнуть Ардуино из ЮСБ и воткнуть обратно - ничего нет, TX просто умер. Если нажать на RESET - аналогично. И лишь при повторной загрузке скетча TX снова работает раза 3 до того, как происходит этот дикий зависунчик. Что происходит? Почему Мега-то не работает, что может быть не так. Я заметил, что на ней вместо кварца есть маленький-маленький прямоугольничек, не очень похожий на кварц. Но мало ли... Как так вообще? Какая разница между мега и уно может быть? как проверить, что не так с Мега?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Может пины другие нужны?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Я даже понял, что пины нужны другие, отправлять с помощью меги получилось, то есть пишет DOne, но вот отправить и принять с помощью стандартного экзампла уже не получается. Елки палки, в чем проблема?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Пришлось попотеть с пинами, но в итоге схема ни с того ни с сего заработала. Мигаю диодом на расстоянии 5 метров, управляя процессом с компьютера! Всем спасибо!!!
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

нужно понимать, какие контакты подключены к спи железному
номера на большой плате могут не совпадать с номерами на мелких
а еще диапазон может быть засран и придется подбирать канал
у меня так с пары см ничего не ловилось, хотя сканер улавливал посылки
убил кучу времени, пока не начал тупо перебирать канал и еще есть поддельные китайские модули, там баг в даташите китаезы запилили в железе
а есть старые без + маркировки и там нет технологии всей этой и чутье плохое, поэтому многие примеры не будут работать на старых модулях или подделках
тематические ответы только в форуме, в приват не пишите
Реклама
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Сообщение kras »

Вроде просто контакты не так подключил. Потому что просто в голову пришло проверить соединения, переписать пину в программе, и вот в процессе этого вдруг смотрю - диод загорелся;)
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Ответить

Вернуться в «Практика»