Arduino Mega 2560 nrf24l01 и DMD по SPI

leds
Offline
Зарегистрирован: 20.10.2014

Приветствую. 

Есть необходимость подключить радиомодуль nrf24l01 к Меге, но на ней уже весит бегущая строка подключенная по SPI с применением библиотеки DMD. При чём для бегущей строки принципиально использовать железный SPI, ибо важна скорость развертки.

Как можно прикрутить радиомодуль к контроллеру?

Читал про одновлеменное nrf24l01 и Ethernet платы, но не понял. 

SCK – 52 , MOSI – 51, MISO – 50 общие для обеих устройств ,а SS(CS) вывод у каждого свой.

SS - на 53, как его поменять для радиомодуля nrf24l01?

MikSer
Offline
Зарегистрирован: 27.01.2012
leds
Offline
Зарегистрирован: 20.10.2014

Спасибо. Хорошая библиотека. Но есть проблема:

Вешаю радиомодуль на пины прописанные поумолчанию в библиотеке

const uint8_t SOFT_SPI_MISO_PIN = 16; const uint8_t SOFT_SPI_MOSI_PIN = 15; const uint8_t SOFT_SPI_SCK_PIN = 14;

Без исползования библиотеки DMD всё равботает чётко. НО когда начинаю её использовать, половина данных теряется.

 

Если же подключать на аналоговые пины, Как на схеме

 

То в UNO это работает, а в Меге почему то нет. В Меге надо как-то подругому соединить?

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

Ничего не мешает использовать этот же SPI интерфейс для обеих железяк, только CS на разные садятся

leds
Offline
Зарегистрирован: 20.10.2014

Вот мой скетч

#include <SPI.h>
#include <RF24.h>
int messageLength = 12;  //message checksum, Make sure to 
//  change it if your string is a different length 
int msg[1];
RF24 radio(17,18);
const uint64_t pipe = 0xE8E8F0F0E1LL;
String theMessage = ""; 
String latestMessage = "";  //this is used in the html output

#include <Wire.h>      //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>        //
#include <TimerOne.h>   //
#include "stell.h"
//Fire up; the DMD library as dmd
DMD dmd(3,2);
char Arr[4]={'1','2','3','4'};
void ScanDMD(){
  dmd.scanDisplayBySPI();
} 
int inc = 0;
 
 
void setup(void){
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(1,pipe);
  radio.startListening();
  Serial.print("server is at ");
    Timer1.initialize( 1500 );           //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
    Timer1.attachInterrupt( ScanDMD );   //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI()
    dmd.selectFont(e2);  

}

void ShowClockNumbers(){
   dmd.drawChar(  0,  0,  Arr[0], GRAPHICS_OR );   // thousands
   dmd.drawChar(  23,  0, Arr[1], GRAPHICS_OR );   // thousands
   dmd.drawChar(  46,  0,'.', GRAPHICS_OR );   // thousands
   dmd.drawChar(  55,  0, Arr[2], GRAPHICS_OR );   // thousands
   dmd.drawChar(  78,  0, Arr[3], GRAPHICS_OR );   // thousands
}

void loop(void){
  if (radio.available()){        
    bool done = false;  
      done = radio.read(msg, 1); 
      char theChar = msg[0];
      if (msg[0] != 2){
          theMessage.concat(theChar);
          Serial.print(theChar);        
        }
      else {       
       if (theMessage.length() == messageLength) { 
        Serial.println(theMessage);
        latestMessage = theMessage;
       }
       theMessage= ""; 
      }   
  }
  ShowClockNumbers();   
}

 

Если убрать функцию 

 //ShowClockNumbers();

То данные принимаются корректно. Стоит её отобразить, так начинаются потери.

 

 

MikSer
Offline
Зарегистрирован: 27.01.2012

всему виной он

13

#include <TimerOne.h>   //

 

leds
Offline
Зарегистрирован: 20.10.2014

Ну а как без него то?

MikSer
Offline
Зарегистрирован: 27.01.2012

а вот ради эксперимента попробуй использовать DMD2 beta и переопредели пины для SoftDMD.

#define DISPLAYS_ACROSS 4
#define DISPLAYS_DOWN 1
#define pin_noe 4
#define pin_a 5
#define pin_b 6
#define pin_sck 8
#define pin_clk 7
#define pin_r_data 9

SoftDMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN, pin_noe, pin_a, pin_b, pin_sck, pin_clk, pin_r_data); 

как то так. Будут ли потери или нет?

alexvs
Offline
Зарегистрирован: 22.07.2014

Вместо библиотеки <RF24.h>  , я использовал библиотеку <iBoardRF24.h>. 

Там используется soft SPI прямо внутри библиотеки, строка инициализации выглядит как

iBoardRF24 radio(/*cepin*/3,/*cspin*/8,/*mosi_pin*/5,/*miso_pin*/6,/*sck_pin*/7,/*irq_pin*/2);

Попробуй, может бкдет работать нормально в твоем случае.