Конфликт библиотек SD и LedControl

Тема в разделе "Arduino & Shields", создана пользователем Stas0232, 20 июн 2016.

  1. Stas0232

    Stas0232 Нерд

    Добрый день!

    Цель: в проекте необходимо использование 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)); то индикатор работает хорошо)

    Тема была начата на другом сайте, но там только натолкнули на разные мысли, которые пока не принесли результатов. Видимо не хватает знаний.
     
  2. ZAZ-965

    ZAZ-965 Гуру

    @Stas0232, посмотрел исходный код библиотеки LedControl на github.com/wayoda/LedControl - совершенно не понравился. Автор сам пишет, что писал библиотеку не зная Arduino http://wayoda.github.io/LedControl/pages/faq
    Варианты - переписать библиотеку, взять другой дисплей.
     
  3. Stas0232

    Stas0232 Нерд

    А аналога библиотеки для ардуинки нету? Код которого бы "совершенно не понравился"?
    Вроде как "7-ми сегментный индикатор" распространенная вещь, да и с помощью этого драйвера(MAX7221) легко подключается и работает с ардуино(даже не из-за сокращения пинов, а из-за того, что сам заботиться о работе индикаторов).
     
  4. AlexU

    AlexU Гуру

    Не видно инициализации 7-го пина:
    Код (C++):
    pinMode(7, OUTPUT);
    digitalWrite(7, HIGH);
    Я так понимаю все остальные пины заняты, раз Вы параллельно вешаете и картридер и драйвер на ICSP разъём?
     
  5. Stas0232

    Stas0232 Нерд

    На самом деле найти еще три пина удалось бы, но какой тогда смысл в SPI? А если понадобится еще одно устройство на этой шине - еще четыре пина? Мне и приглянулся SPI из-за того, что можно вешать N устройств на один ICSP, только с разными CS-выходами.
     
  6. AlexU

    AlexU Гуру

    Дело в том, что в LedControl используется "программный SPI" -- утверждать не буду, но может случиться так, что этот "программный SPI" может нарушить работу аппаратного SPI.
    По поводу инициализации 7-го пина -- делали?
     
  7. ZAZ-965

    ZAZ-965 Гуру

    По-моему, в 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);
    .......
    )
     
  8. AlexU

    AlexU Гуру

    Да, есть такое дело. Получается конфликт программного и аппаратного SPI -- или библиотеку LedControl править, или разносить по разным пинам.
     
  9. ZAZ-965

    ZAZ-965 Гуру

    @Stas0232, попробуйте эту библиотеку https://github.com/jacken/LedControl_HW_SPI. Человек форкнул библиотеку и переписал функцию spiTransfer на hardware SPI. Все осталось тоже, только инициализация изменится
    Код (C++):
    LedControl lc=LedControl(7,1)  //LedControl(int csPin, int numDevices)
     
     
  10. Stas0232

    Stas0232 Нерд

    Ооо, спасибо, буду пробовать. Как раз появилая Arduino UNO. А то я еще на свою Leonardo подумывал. Там ведь пины SPI другие.
    Отпишу о результате.
     
  11. Stas0232

    Stas0232 Нерд

    В общем на макетке заработало. Ура и спасибо. Конечно не без косяков.
    Вообще мне нужно вытащить сам контроллер, и его и всю периферию напрямую запитать от 5в. Когда с платы включается воспроизведение звука через библиотеку TMRpcm, то из-за количества зажженных в данный момент сегментов на 7-ном табло возрастает посторонний писк. Один раз попробовал запитать от другого источника +5в(с другой ардуинки) - пошло чистенько. Но в остальные разы вообще воспроизводиться отказывается... слышен дурной и сильный дребезго в месте с которым зажигаются все индикаторы и нормально дальше уже не работают. Короче пока не знаю. Надо пробовать собрать целиком схему и включить. Но пока пугает.