Arduino Nano nRF24L01+ DFPlayer Mini SPI Проблема

Я работаю с клоном платы Arduino Nano (CH340) над беспроводным управлением DFPlayer Mini, трансивером, отправляющим переменную Struct с MachinePrefix (на всякий случай), типом звука (у меня есть несколько папок по типу машин) и количеством звуков.

Трансивер работает нормально, а вот приемник нет. Если я загружаю данные в Arduino, DFPlayer воспроизводит первую песню один раз (строка 43 - myDFPlayer.play(1)), но после nRF24 init не работает.

После инициализации nRF24 я все еще получаю данные в допустимом формате и диапазоне. Если я закомментирую часть nRF24, DFPlayer работает, но вместе — нет. Я читал о работе двух устройств на одной шине SPI, но не понимаю, в чем проблема. Я думаю, проблема в том же выводе MOSI. По-моему, он должен работать, но не работает.

Есть предложения?

Вот код получателя:

#включать
#включить "RF24.h"
#включить "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

RF24 myRadio (8, 9); // КЭ, КС
адреса байтов[][6] = {"Sx001"};

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(тип uint8_t, значение int);

структура данныхStruct {
короткий машинныйПрефикс;
короткий звукТип;
короткий звукЧисло;
} данныеПолучены;

недействительная настройка() {
mySoftwareSerial.begin(9600);
Серийный.begin(115200);
задержка(1000);
Serial.println(F("RF24+dfplayermini-receiver"));
Serial.println(F("Инициализация DFPlayer ... (может занять 3~5 секунд)"));
if (!myDFPlayer.begin(mySoftwareSerial)) { //Используем softwareSerial для связи с mp3.
Serial.println(F("Невозможно начать:"));
Serial.println(F("1.Пожалуйста, проверьте соединение еще раз!"));
Serial.println(F("2.Пожалуйста, вставьте SD-карту!"));
пока(истина);
}

Serial.println(F("DFPlayer Mini онлайн."));
myDFPlayer.setTimeOut(500);
myDFPlayer.volume(5); //Установить значение громкости. От 0 до 30
myDFPlayer.play(1); //Воспроизвести первый mp3
//----------------------------
задержка(1000);
myRadio.begin(); // Запускаем физическое радио nRF24L01
myRadio.setChannel(108); // Выше большинства каналов Wi-Fi
// Установите низкий уровень PA, чтобы предотвратить проблемы, связанные с питанием, поскольку это
// эскиз getting_started и вероятность близкого расположения устройств. RF24_PA_MAX — значение по умолчанию.
myRadio.setPALevel(RF24_PA_MAX);
myRadio.setDataRate(RF24_250KBPS);
// myRadio.setPALevel(RF24_PA_MAX); // Раскомментируйте для большей мощности
myRadio.openReadingPipe(1, address[0]); // Использовать первую запись в массиве 'addresses' (сейчас только 1)
моеРадио.начатьПрослушивание();
Serial.println(F("RF24 в сети."));
}//--(конец настройки)---

void loop() { /****** ЦИКЛ ******/
если (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Вывести подробное сообщение от DFPlayer для обработки различных ошибок и состояний.
}
if (myRadio.available()) { // Проверка входящих данных от передатчика
while (myRadio.available()) { // Пока есть готовые данные
myRadio.read( &dataReceived, sizeof(dataReceived) ); // Получить полезные данные
}
Serial.println("цикл");
myDFPlayer.loop(3);
если (dataReceived.machinePrefix == 11001) {
Serial.println("тот же префикс устройства");
int playingData = dataReceived.soundNumber;
если (myDFPlayer.available()) {
Serial.println("игрок доступен");
Serial.println(myDFPlayer.readType());
Serial.println(myDFPlayer.read());
}
myDFPlayer.play(2);
}
Serial.println(dataReceived.machinePrefix);
Serial.println(dataReceived.soundType);
Serial.println(dataReceived.soundNumber);
Serial.println("----------------------------");
} //КОНЕЦ Радио доступно
}//--(конец основного цикла)---

/*----------*/
void printDetail(тип uint8_t, значение int){
переключатель (тип) {
кейс Таймаут:
Serial.println(F("Время вышло!"));
перерыв;
случай WrongStack:
Serial.println(F("Неправильный стек!"));
перерыв;
случай DFPlayerCardInserted:
Serial.println(F("Карта вставлена!"));
перерыв;
случай DFPlayerCardRemoved:
Serial.println(F("Карта извлечена!"));
перерыв;
случай DFPlayerCardOnline:
Serial.println(F("Карта онлайн!"));
перерыв;
случай DFPlayerPlayFinished:
Serial.print(F("Номер:"));
Serial.print(значение);
Serial.println(F("Игра окончена!"));
перерыв;
случай DFPlayerError:
Serial.print(F("DFPlayerError:"));
переключатель (значение) {
дело Занято:
Serial.println(F("Карта не найдена"));
перерыв;
случай Спящий:
Serial.println(F("Спит"));
перерыв;
случай SerialWrongStack:
Serial.println(F("Получить неправильный стек"));
перерыв;
случай CheckSumNotMatch:
Serial.println(F("Контрольная сумма не совпадает"));
перерыв;
       случай FileIndexOut:
Serial.println(F("Индекс файла вышел за пределы"));
перерыв;
случай FileMismatch:
Serial.println(F("Не удается найти файл"));
перерыв;
случай Реклама:
Serial.println(F("В рекламе"));
перерыв;
по умолчанию:
перерыв;
}
перерыв;
по умолчанию:
перерыв;
}
}

Изображение схемы

, 👍4


1 ответ


Лучший ответ:

3

При использовании SPI, контакт 10 никогда не должен использоваться как ВХОД. В противном случае Atmega может перейти в режим SPI Slave. Но вы используете контакт 10 как контакт RX.

Просто поменяйте местами контакты 9 и 10 и обновите свой код соответствующим образом.

,