SD и mfrc522 на UNO

Тема в разделе "Arduino & Shields", создана пользователем one_player, 29 ноя 2016.

Метки:
  1. one_player

    one_player Нерд

    Добрый день.
    Хочу при считывании rfid меток что бы UID метки писался на SD карту. Что mfrc522 что SD модуль оба подключаются по SPI на UNO. И вот вроде все по отдельности работает как надо но стоит подключить вместе и не работает ничего.
    Я понимаю что для работы SPI с несколькими устройствами необходимо что бы у каждого устройства был SS подключен к разному пину.
    И так код который хочу что бы заработал.
    Код (C++):

    #include <SPI.h>
    #include <MFRC522.h> //RFID
    #include <SD.h>
    //Константы
    // Ридер SCK 13, MOSI 11, MISO 12
    // SD SCK 13, MOSI 11, MISO 12
    #define SS_PIN 9 //SDA
    #define RST_PIN 8 //RST

    MFRC522 mfrc522(SS_PIN, RST_PIN);
    unsigned long uidDec, uidDecTemp;// Значение UID

    File myFile;
    void setup()
    {
      Serial.begin(9600);
      SPI.begin();            //  инициализация SPI / Init SPI bus.
      SD.begin(4);            //  инициализация SD SS
      mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
      }

    void loop()
    {
        // Поиск новой метки
        if ( ! mfrc522.PICC_IsNewCardPresent()){
          return;
        }
        // Выбор метки
        if ( ! mfrc522.PICC_ReadCardSerial()){
          return;
        }
        uidDec = 0;
        // Выдача серийного номера метки.
        for (byte i = 0; i < mfrc522.uid.size; i++){
          uidDecTemp = mfrc522.uid.uidByte[i];
          uidDec = uidDec * 256 + uidDecTemp;
        }
        Serial.println(uidDec); // Выводим UID метки в консоль.
         if (SD.exists("example.txt")) {
        Serial.println("example.txt exists.");
        } else {
          Serial.println("example.txt doesn't exist.");
        }
    }
     
    И так в моем понимании SS у mfrc522 (9) и SD (4) разные и после считывания метки и выдачи ее в Сериал должно написать есть ли example.txt на карте или нет. Но при считывании карты ничего не происходит.
    Да знаю что для того что бы SPI понимал с каким ему модулем работать в данный момент необходимо "дернуть" пин SS.
    По этому пробовал в Сетапе сначала отключить все SS пины
    Код (C++):

    digitalWrite(9, HIGH);
    digitalWrite(4, HIGH);
     
    Потом в loop_e
    переводил в LOW каждый раз когда нужна работа определенного модуля
    Код (C++):
    void loop()
    {
       digitalWrite(4, HIGH); //Держим SD отключенной
       digitalWrite(9, LOW); //Включаем RFID
        // Поиск новой метки
        if ( ! mfrc522.PICC_IsNewCardPresent()){
          return;
        }
        // Выбор метки
        if ( ! mfrc522.PICC_ReadCardSerial()){
          return;
        }
        uidDec = 0;
        // Выдача серийного номера метки.
        for (byte i = 0; i < mfrc522.uid.size; i++){
          uidDecTemp = mfrc522.uid.uidByte[i];
          uidDec = uidDec * 256 + uidDecTemp;
        }
        Serial.println(uidDec); // Выводим UID метки в консоль.
       digitalWrite(9, HIGH); //Выключаем RFID
       digitalWrite(4, LOW); //Включаем SD
         if (SD.exists("example.txt")) {
        Serial.println("example.txt exists.");
        } else {
          Serial.println("example.txt doesn't exist.");
        }
       digitalWrite(4, HIGH); //Выключаем SD
    // И далее все по кругу
    }
    Понимаю код авно еще то. Но гугление показало что у зеленых новичков вроде меня не всегда получается справится с работой SPI.
    Подскажите пожалуйста как работать с двумя модулями подключёнными по SPI. Тем более что в один момент времени должен работать только один модуль.
     
  2. Vetrinus

    Vetrinus Гик

    mfrc522.PCD_Init() точно не принимает никаких параметров?
     
  3. one_player

    one_player Нерд

    Вот ровно так как у меня в IDE так и скопировал сюда так и залил на UNO. Если вытащить MOSI и MISO от SD и ребутнуть UNO сразу в сериал начинает слать UID метки.
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    ридеры RFID с какой версией прошивки (firmware_check.ino из примеров)?
    Если 0x92,то все должно работать. Если 0x12, то увы, там китайцы сэкономили (какая-то линия постоянно тянет сигнал к нулю, блокируя остальные устройства на SPI).
     
  5. one_player

    one_player Нерд

    Добрый день. Вот проверка из примера.
     
  6. one_player

    one_player Нерд

    Может у кого то есть еще идеи ?
     
  7. one_player

    one_player Нерд

    И так Ответ.
    Для того что бы такая связка заработала необходимо между 12м пином ардуино и MISO пином SD модуля поставить резистор на 220 Ом.
    После этого вся связка заработала безо всяких танцев с бубном.
    Всем спасибо за участие!
     
    Последнее редактирование: 12 дек 2016
    Tomasina нравится это.
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    хм, надо будет попробовать.