Подключение nRF24l01+ к Arduino Due

stilfer
Offline
Зарегистрирован: 19.11.2014

  Здравствуйте! Приобрел два модуля nRF24l01+, подключил один к Arduino Nano, другой Arduino Due. При программировании с Nano проблем не возникло, а вот с Due не могу сдвинуться с места. Перерыл кучу форумов, ничего дельного не нашел. Вообщем суть проблемы в том, что когда выбираю в среде плату Due, при использовании библиотеки Mirf на этапе компиляции ругается:

Build options changed, rebuilding all
C:\Users\stilfer\Desktop\arduino-1.5.8\libraries\Mirf\MirfHardwareSpiDriver.cpp: In member function 'virtual void MirfHardwareSpiDriver::begin()':
C:\Users\stilfer\Desktop\arduino-1.5.8\libraries\Mirf\MirfHardwareSpiDriver.cpp:9:22: error: 'SPI_2XCLOCK_MASK' was not declared in this scope
  SPI.setClockDivider(SPI_2XCLOCK_MASK);
                      ^
Ошибка компиляции.

С библиотекой RF24  пробовал, ни каких признаков передачи не подает, пробовал проверить как указано в статье http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/  , с помощью кода :

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10); // Для Уно
//RF24 radio(9,53);// Для Меги
const uint8_t num_channels = 128;
uint8_t values[num_channels];
void setup(void)
{
  Serial.begin(57600);
  printf_begin();
  radio.begin();
  radio.setAutoAck(false);
  radio.startListening();

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);              // И посмотрим на это пять секунд.

  radio.stopListening();
  int i = 0;    // А это напечатает нам заголовки всех 127 каналов
  while ( i < num_channels )  {
    printf("%x",i>>4);
    ++i;
  }
  printf("\n\r");
  i = 0;
  while ( i < num_channels ) {
    printf("%x",i&0xf);
    ++i;
  }
  printf("\n\r");
}
const int num_reps = 100;

void loop(void)
{
  memset(values,0,sizeof(values));
  int rep_counter = num_reps;
  while (rep_counter--) {
    int i = num_channels;
    while (i--) {
      radio.setChannel(i);
      radio.startListening();
      delayMicroseconds(128);
      radio.stopListening();
      if ( radio.testCarrier() )
        ++values[i];
    }
  }
  int i = 0;
  while ( i < num_channels ) {
    printf("%x",min(0xf,values[i]&0xf));
    ++i;
  }
  printf("\n\r");
}
int serial_putc( char c, FILE * ) {
  Serial.write( c );
  return c;
}

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
}
 

Ругается на:

sketch_nov19a.ino: In function 'void printf_begin()':
sketch_nov19a.ino:64:29: error: 'fdevopen' was not declared in this scope
Ошибка компиляции.

А вот Nano реагирует на этот код вполне нормально, и модуль ответил. Я так понял что это какие - то особенности архитектуры процессора arm sam3. Помогите пожалуйста разобраться! 

 
MaksMS
Offline
Зарегистрирован: 11.03.2013

Вот тут заявлена поддержка Due ..

Radjah
Offline
Зарегистрирован: 06.08.2014
stilfer
Offline
Зарегистрирован: 19.11.2014

Спасибо большое! Заработало! Еще на due проблема была в том, что я CE на 8 ногу сажал, а CSN на 7. Сначала поставил библиотеку, которую вы ,MaksMS, посоветовали, потом переткнул CE на 9 вход, CSN на 10, и модуль стал отвечать))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

она реально лучше обычно либы?

Optimized High Speed Arduino driver for nRF24L01 2.4GHz Wireless Transceiver

 

forfrends
Offline
Зарегистрирован: 24.02.2015

Radjah пишет:

Я вот так делал 

У меня данный метод не решает проблемы 'fdevopen' was not declared in this scope . Что можете посоветовать?

Radjah
Offline
Зарегистрирован: 06.08.2014

Я свой хрустальный шар пропил.

forfrends
Offline
Зарегистрирован: 24.02.2015

Radjah, у вас код из первого поста прошивается в DUE? Я взял код для проверки работоспособности (точно такой же как в первом посте). При попытке прошить ардуино DUE выдает ошибку  'fdevopen' was not declared in this scope

Пробовал добавить этот код:

1 #ifdef __arm__
2 #define SPI_CLOCK_DIV4 21
3 #define _BV(bit) (1 << (bit))
4 #define printf_P printf
5 #endif

Результата не увидел, все та же ошибка.  

Нашел что нужно 

fdevopen( &serial_putc, 0 );

заменить на

#if !defined(__arm__)

fdevopen( &serial_putc, 0 );

#endif

Только сто попробовал. В результате код пршивается, но ответа от датчика нет.