Добрый день! Цель: в проекте необходимо использование microSD и 2-4 разрядного 7-го индикатора. MicroSD необходима для сохранения данных о статистике + воспроизведения голоса с помощью библиотеки TMRpcm. 7-ный индикатор нужен для отображения числовых данных с помощью драйвера Max7221 и библиотеки LedControl. Ниже набросал простой пример кода. Проблема: по отдельности все работает(если использовать одно из двух: SD или Max7221). Данные сохраняются и голос воспроизводиться, 7-ный индикатор обновляет значения. Если включать вместе, то индикатор зажигает все сегменты всех разрядов и больше ничего не делает. А SD работает нормально. Даже нашел в каком моменте ломается. У меня Arduino Leonardo и там пины для SPI другие. Библиотека SD сама выбирает пины в зависимости от контроллера, а в LedControl прописываю в конструктор. У меня это 16 - MOSI и 15 - SCK для LedControl. MISO не используется. Сперва создаю экземпляр LedControl и назначаю нужные пины. И в тот момент когда вызываю метод SD.begin() Max7221 уже отказывается работать. Выводы MOSI и SCK подключены паралельно на Max7221 и на модуль sd карты. Только выводы CS различаются(Кстати CS у меня прописывает 17 пин на леонардо, но работает на том, на который я прямо укажу). Пока обхожусь без голоса(DFPlayer через UART), но запись/чтение данных с microSD и работа с 7-ным индикатором нужны полюбому. Кто сталкивался с такой проблемой или знает конкретное решение, чтобы все работало так, как требуется, прошу помочь. А да, у меня вот такой модуль microSD. P.S. Причем интересно, что LedControl не тредует подключения SPI в .ino, а SD требует. Код (C++): #include <LedControl.h> #include <SD.h> #include <SPI.h> #include <TMRpcm.h> /* Инициализация дисплея LedControl lc=LedControl(DIN,CLK,LOAD,количество модулей); DIN,CLK,LOAD можно подключать к любым выводам контроллера */ LedControl lc=LedControl(16,15,7,1); TMRpcm tmrpcm; void setup() { pinMode(10, OUTPUT); pinMode(6, OUTPUT); Serial.println(SD.begin(6)); tmrpcm.speakerPin = 5; tmrpcm.setVolume(5); digitalWrite(6, HIGH); lc.shutdown(0,false); lc.setIntensity(0,10); lc.clearDisplay(0); } void loop() { lc.clearDisplay(0); delay(3000); lc.setDigit(0,0,1,false); delay(3000); lc.setDigit(0,1,2,false); delay(3000); tmrpcm.play("1.wav"); } Когда ставлю комент на //Serial.println(SD.begin(6)); то индикатор работает хорошо) Тема была начата на другом сайте, но там только натолкнули на разные мысли, которые пока не принесли результатов. Видимо не хватает знаний.
@Stas0232, посмотрел исходный код библиотеки LedControl на github.com/wayoda/LedControl - совершенно не понравился. Автор сам пишет, что писал библиотеку не зная Arduino http://wayoda.github.io/LedControl/pages/faq Варианты - переписать библиотеку, взять другой дисплей.
А аналога библиотеки для ардуинки нету? Код которого бы "совершенно не понравился"? Вроде как "7-ми сегментный индикатор" распространенная вещь, да и с помощью этого драйвера(MAX7221) легко подключается и работает с ардуино(даже не из-за сокращения пинов, а из-за того, что сам заботиться о работе индикаторов).
Не видно инициализации 7-го пина: Код (C++): pinMode(7, OUTPUT); digitalWrite(7, HIGH); Я так понимаю все остальные пины заняты, раз Вы параллельно вешаете и картридер и драйвер на ICSP разъём?
На самом деле найти еще три пина удалось бы, но какой тогда смысл в SPI? А если понадобится еще одно устройство на этой шине - еще четыре пина? Мне и приглянулся SPI из-за того, что можно вешать N устройств на один ICSP, только с разными CS-выходами.
Дело в том, что в LedControl используется "программный SPI" -- утверждать не буду, но может случиться так, что этот "программный SPI" может нарушить работу аппаратного SPI. По поводу инициализации 7-го пина -- делали?
По-моему, в LedControl(16,15,7,1) третьим параметром идет Код (C++): LedControl::LedControl(int SPI_MOSI, int SPI_CLK, int SPI_CS, int numDevices) { ..... pinMode(SPI_CS,OUTPUT); digitalWrite(SPI_CS,HIGH); ....... )
Да, есть такое дело. Получается конфликт программного и аппаратного SPI -- или библиотеку LedControl править, или разносить по разным пинам.
@Stas0232, попробуйте эту библиотеку https://github.com/jacken/LedControl_HW_SPI. Человек форкнул библиотеку и переписал функцию spiTransfer на hardware SPI. Все осталось тоже, только инициализация изменится Код (C++): LedControl lc=LedControl(7,1) //LedControl(int csPin, int numDevices)
Ооо, спасибо, буду пробовать. Как раз появилая Arduino UNO. А то я еще на свою Leonardo подумывал. Там ведь пины SPI другие. Отпишу о результате.
В общем на макетке заработало. Ура и спасибо. Конечно не без косяков. Вообще мне нужно вытащить сам контроллер, и его и всю периферию напрямую запитать от 5в. Когда с платы включается воспроизведение звука через библиотеку TMRpcm, то из-за количества зажженных в данный момент сегментов на 7-ном табло возрастает посторонний писк. Один раз попробовал запитать от другого источника +5в(с другой ардуинки) - пошло чистенько. Но в остальные разы вообще воспроизводиться отказывается... слышен дурной и сильный дребезго в месте с которым зажигаются все индикаторы и нормально дальше уже не работают. Короче пока не знаю. Надо пробовать собрать целиком схему и включить. Но пока пугает.