Arduino Mega 2560 nrf24l01 и DMD по SPI
- Войдите на сайт для отправки комментариев
 
      Пнд, 20/10/2014 - 13:13
          
      Приветствую.
Есть необходимость подключить радиомодуль nrf24l01 к Меге, но на ней уже весит бегущая строка подключенная по SPI с применением библиотеки DMD. При чём для бегущей строки принципиально использовать железный SPI, ибо важна скорость развертки.
Как можно прикрутить радиомодуль к контроллеру?
Читал про одновлеменное nrf24l01 и Ethernet платы, но не понял.
SCK – 52 , MOSI – 51, MISO – 50 общие для обеих устройств ,а SS(CS) вывод у каждого свой.
SS - на 53, как его поменять для радиомодуля nrf24l01?
          
https://github.com/shnae/rf24_plus_softSPI
http://shanes.net/how-to-use-an-nrf24l01-rf24-with-an-arduino-ethernet-shield/
Спасибо. Хорошая библиотека. Но есть проблема:
Вешаю радиомодуль на пины прописанные поумолчанию в библиотеке
Без исползования библиотеки DMD всё равботает чётко. НО когда начинаю её использовать, половина данных теряется.
Если же подключать на аналоговые пины, Как на схеме
То в UNO это работает, а в Меге почему то нет. В Меге надо как-то подругому соединить?
Ничего не мешает использовать этот же SPI интерфейс для обеих железяк, только CS на разные садятся
Вот мой скетч
#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(); }Если убрать функцию
То данные принимаются корректно. Стоит её отобразить, так начинаются потери.
всему виной он
13#include <TimerOne.h> //Ну а как без него то?
а вот ради эксперимента попробуй использовать DMD2 beta и переопредели пины для SoftDMD.
как то так. Будут ли потери или нет?
Вместо библиотеки <RF24.h> , я использовал библиотеку <iBoardRF24.h>.
Там используется soft SPI прямо внутри библиотеки, строка инициализации выглядит как
Попробуй, может бкдет работать нормально в твоем случае.