SD и mfrc522 на UNO

one_player
Offline
Зарегистрирован: 15.11.2016

Добрый день.

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

#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 пины

digitalWrite(9, HIGH);
digitalWrite(4, HIGH);

Потом в loop_e

переводил в LOW каждый раз когда нужна работа определенного модуля 

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. Тем более что в один момент времени должен работать только один модуль.

 

 

one_player
Offline
Зарегистрирован: 15.11.2016

Отвечаю сам себе.

При связке UNO+RC522+SDcard необходимо MISO пин SD и 12й пин MISO ардуинки уно подключить через резистор 220 Ом. При таком подключении все работает и без всяких программных дерганей SS пинов  wink