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("В рекламе")); перерыв; по умолчанию: перерыв; } перерыв; по умолчанию: перерыв; } }
@Luck3, 👍4
1 ответ
Лучший ответ:
При использовании SPI, контакт 10 никогда не должен использоваться как ВХОД. В противном случае Atmega может перейти в режим SPI Slave. Но вы используете контакт 10 как контакт RX.
Просто поменяйте местами контакты 9 и 10 и обновите свой код соответствующим образом.
- Проблема с NRF24L01
- Проблемы nRF24l01+. Данные принимаются как 0
- nRF24L01 +pa +lna link не связывается
- Код правильный? Nrf24l01
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Пустое значение не игнорируется, как должно быть.
- Более 4 MCP23S17 на 1 шине SPI
- RaspberryPi Pico SPI и nrf24l01