RFID SDcard и mega

Тема в разделе "Arduino & Shields", создана пользователем I_v_a_n, 5 июл 2015.

  1. I_v_a_n

    I_v_a_n Нуб

    Всем здрасти, вопрос в следущем можно ли 2 устройства spi подключить к меге, читал что можно, загоняешь одно устройство в лоу и тогда оно активируется потом в хай деактивируем и так же со вторым, но на деле ничего не получилось((
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Схему и код показывайте, все телепаты по отпускам разбежались, лето же.
     
  3. I_v_a_n

    I_v_a_n Нуб

    Код (Text):
    #include <DS1302.h>
    #include <Wire.h>
    #include <LiquidCrystal.h>
    #include <SD.h>
    #include <SPI.h>
    #include <MFRC522.h>

    #define SS_PIN 53
    #define RST_PIN 8
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    MFRC522::MIFARE_Key key;

    DS1302 rtc(22, 24, 26);    // (RST, DAT, CLK)
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    Time t;
    File myFile;

      int podacha10bt1 = 30;  
    int podacha1bt1 = 31;
    int kurokbt1 = 32;
    int podacha10bt2 = 33;  
    int podacha1bt2 = 34;
    int kurokbt2 = 35;
    int podacha10bt3 = 36;  
    int podacha1bt3 = 37;
    int kurokbt3 = 38;
    int offbt = 39;
    int nastrel1 = 0;
    int zadanie1 = 0;
    int magaz1 = 0;
    int nastrel2 = 0;
    int zadanie2 = 0;
    int magaz2 = 0;
    int nastrel3 = 0;
    int zadanie3 = 0;
    int magaz3 = 0;
    int obsh_nastrel= 0;
    int flag=0;
    int flag1=0;
    int flag2=0;
    int flag2_1=0;
    int flag3=0;
    int flag3_1=0;



    unsigned long math_time,old_time,real_time;
    unsigned long math_time2,old_time2,real_time2;
    unsigned long math_time3,old_time3,real_time3;

    static boolean output = LOW;
    static boolean output2 = LOW;
    static boolean output3 = LOW;
    static boolean output2_1 = LOW;
    static boolean output2_2 = LOW;
    static boolean output2_3 = LOW;
    static boolean output3_1 = LOW;
    static boolean output3_2 = LOW;
    static boolean output3_3 = LOW;
    static boolean outoffbt= LOW;


    void setup()
    {
     
      pinMode(10, OUTPUT);
      pinMode(SS_PIN, OUTPUT);
      digitalWrite(SS_PIN, HIGH);
      digitalWrite(10, HIGH);
        //  rtc.halt(false);
        //rtc.writeProtect(false);
      //rtc.setDOW(MONDAY);        // Set Day-of-Week to FRIDAY  Monday
      //rtc.setTime(20, 37, 0);    // Set the time to 12:00:00 (24hr format)
    //rtc.setDate(23, 12, 2013);  // Set the date to August 6th, 2010
      Serial.begin(9600);
          delay(100);  
              digitalWrite(10, LOW);
      if (!SD.begin(10)) {
        Serial.println("initialization failed!");
        return;
      }
      Serial.println("initialization done.");
    digitalWrite(10, HIGH);
                   
      pinMode(podacha10bt1, INPUT);
      pinMode(podacha1bt1, INPUT);
      pinMode(kurokbt1, INPUT);
      pinMode(podacha10bt2, INPUT);
      pinMode(podacha1bt2, INPUT);
      pinMode(kurokbt2, INPUT);
      pinMode(podacha10bt3, INPUT);
      pinMode(podacha1bt3, INPUT);
      pinMode(kurokbt3, INPUT);
      pinMode(offbt, INPUT);
      lcd.begin(20, 4);
      delay(100);
      SPI.begin();
        digitalWrite(SS_PIN, LOW);
        mfrc522.PCD_Init();
          digitalWrite(SS_PIN, HIGH);
            for (byte i = 0; i < 6; i++) {
                    key.keyByte[i] = 0xFF;
                    }


    }

    void loop()
    {
     
      t = rtc.getTime();
    output = digitalRead(podacha10bt1);
    output2 = digitalRead(podacha1bt1);
    output3 = digitalRead(kurokbt1);
    output2_1 = digitalRead(podacha10bt2);
    output2_2 = digitalRead(podacha1bt2);
    output2_3 = digitalRead(kurokbt2);
    output3_1 = digitalRead(podacha10bt3);
    output3_2 = digitalRead(podacha1bt3);
    output3_3 = digitalRead(kurokbt3);
    outoffbt = digitalRead(offbt);
    delay(30);
      digitalWrite(SS_PIN, LOW);
    if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
                delay(50);
                return;
            }
            digitalWrite(SS_PIN, HIGH);
            Serial.print(F("Card UID:"));
            for (byte i = 0; i < mfrc522.uid.size; i++) {
                    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                    Serial.print(mfrc522.uid.uidByte[i], HEX);
            }
            Serial.println();
           
     

          //.........Устройство 1.............
    if(digitalRead(podacha10bt1)==HIGH && output==HIGH)
        {
            math_time = 0;
            old_time = millis();
            while(math_time < 4000 && output > LOW)
              {
                real_time = millis();            //получить реальное время
                math_time = real_time - old_time; //считаем длительность удержания
                output=digitalRead(podacha10bt1);
              }
            if(math_time > 3999 && magaz1 < 100)
              {
                magaz1 += 300;
              }
              else if(math_time > 200 && zadanie1 == 0 && magaz1 >= 10)
                {
                  zadanie1 +=10;
              }
        }    
     
      if(output2==LOW && magaz1 > 0 && flag1==0)
        {
          flag1=1;
          }
      if(output2==HIGH && magaz1 > 0 && flag1==1)
        {
        zadanie1 +=1;
        nastrel1 = nastrel1 -= 1;
        obsh_nastrel = obsh_nastrel -=1 ;
        flag1=0;
      }


      if(output3==LOW && zadanie1 > 0 && flag==0)
        {
          flag=1;
      }
      if(output3==HIGH && zadanie1 > 0 && flag==1)
        {
        zadanie1 -=1;
        magaz1 -= 1;
        nastrel1 = nastrel1 +=1 ;
        obsh_nastrel = obsh_nastrel +=1 ;
        flag=0;
      }
                //.........Устройство 2.............
     
      if(digitalRead(podacha10bt2)==HIGH && output2_1==HIGH)
        {
            math_time2 = 0;
            old_time2 = millis();
            while(math_time2 < 4000 && output2_1 > LOW)
              {
                real_time2 = millis();            //получить реальное время
                math_time2 = real_time2 - old_time2; //считаем длительность удержания
                output2_1=digitalRead(podacha10bt2);
              }
            if(math_time2 > 3999 && magaz2 < 100)
              {
                magaz2 += 300;
              }
              else if(math_time2 > 200 && zadanie2 == 0 && magaz2 >= 10)
                {
                  zadanie2 +=10;
              }
        }    
     
      if(output2_2==LOW && magaz2 > 0 && flag2==0)
        {
          flag2=1;
          }
      if(output2_2==HIGH && magaz2 > 0 && flag2==1)
        {
        zadanie2 +=1;
        nastrel2 = nastrel2 -= 1;
        obsh_nastrel = obsh_nastrel -=1 ;
        flag2=0;
      }


      if(output2_3==LOW && zadanie2 > 0 && flag2_1==0)
        {
          flag2_1=1;
      }
      if(output2_3==HIGH && zadanie2 > 0 && flag2_1==1)
        {
        zadanie2 -=1;
        magaz2 -= 1;
        nastrel2 = nastrel2 +=1 ;
        obsh_nastrel = obsh_nastrel +=1 ;
        flag2_1=0;
      }
     
            //.........Устройство 3.............
           
      if(digitalRead(podacha10bt3)==HIGH && output3_1==HIGH)
        {
            math_time3 = 0;
            old_time3 = millis();
            while(math_time3 < 4000 && output3_1 > LOW)
              {
                real_time3 = millis();            //получить реальное время
                math_time3 = real_time3 - old_time3; //считаем длительность удержания
                output3_1=digitalRead(podacha10bt3);
              }
            if(math_time3 > 3999 && magaz3 < 100)
              {
                magaz3 += 300;
              }
              else if(math_time3 > 200 && zadanie3 == 0 && magaz3 >= 10)
                {
                  zadanie3 +=10;
              }
        }    
     
      if(output3_2==LOW && magaz3 > 0 && flag3==0)
        {
          flag3=1;
          }
      if(output3_2==HIGH && magaz3 > 0 && flag3==1)
        {
        zadanie3 +=1;
        nastrel3 = nastrel3 -= 1;
        obsh_nastrel = obsh_nastrel -=1 ;
        flag3=0;
      }


      if(output3_3==LOW && zadanie3 > 0 && flag3_1==0)
        {
          flag3_1=1;
      }
      if(output3_3==HIGH && zadanie3 > 0 && flag3_1==1)
        {
        zadanie3 -=1;
        magaz3 -= 1;
        nastrel3 = nastrel3 +=1 ;
        obsh_nastrel = obsh_nastrel +=1 ;
        flag3_1=0;
      }

      lcd.setCursor(0, 0);
      lcd.print("No");
      lcd.print(" ");
      lcd.print("OST");  
      lcd.print(" ");
      lcd.print("MAG");
      lcd.print(" ");
      lcd.print("SUM-");
      lcd.print(" ");
      lcd.print(obsh_nastrel);
      lcd.print(" ");
     
      lcd.setCursor(0, 1);
      lcd.print("1");          
      lcd.setCursor(3, 1);
      lcd.print(zadanie1);
      lcd.print(" ");
      lcd.setCursor(7, 1);
      lcd.print(magaz1);
      lcd.print(" ");
      lcd.setCursor(11, 1);
      lcd.print(nastrel1);
      lcd.print(" ");
      lcd.setCursor(17, 1);
      lcd.print("AIR");
     
     
      lcd.setCursor(0, 2);
      lcd.print("2");          
      lcd.setCursor(3, 2);
      lcd.print(zadanie2);  
      lcd.print(" ");
      lcd.setCursor(7, 2);
      lcd.print(magaz2);
      lcd.print(" ");
      lcd.setCursor(11, 2);
      lcd.print(nastrel2);
      lcd.print(" ");
      lcd.setCursor(16, 2);
      lcd.print("SOFT");
     
      lcd.setCursor(0, 3);
      lcd.print("3");          
      lcd.setCursor(3, 3);
      lcd.print(zadanie3);  
      lcd.print(" ");
      lcd.setCursor(7, 3);
      lcd.print(magaz3);
      lcd.print(" ");
      lcd.setCursor(11, 3);
      lcd.print(nastrel3);
      lcd.print(" ");
      lcd.setCursor(15, 3);
      lcd.print("ARENA");
      if(outoffbt == HIGH){
        digitalWrite(10, LOW);
      myFile = SD.open("test.txt", FILE_WRITE);
      if (myFile) {
     
        Serial.print("Writing to test.txt...");
        myFile.print(rtc.getDateStr());
        myFile.print("    ");
        myFile.print(rtc.getTimeStr());
        myFile.print("    ");
        myFile.println(obsh_nastrel);
        myFile.close();
          Serial.println("done.");
      } else {
        // if the file didn't open, print an error:
      Serial.println("Error writing");
      }
    digitalWrite(10, HIGH);
        }
    }
     
     
  4. I_v_a_n

    I_v_a_n Нуб

    sr card 52 clk 51 mosi 50miso 10cs
    rfid 52clk 51 mosi 50miso 8reset 53ss
     
  5. geher

    geher Гуру

    Вопросы.
    1. Не установлен ли какой-нибудь шилд, работающий с SPI? Такой шилд может соединять пины разъема ICSP с пинами 10-13 ардуино, что приводит на меге к соединению пинов 10 и 53.
    2. Как подключена SD карта? Через какой-нибудь шилд или отдельным модулем к пинам 10, 50-52?
    Если через шилд, то, во-первых, часто для SD карты в качестве чип-селектора используется пин 4. А во-вторых, часто используется не разъем ICSP, а просто используются пины 11-13, что на меге работать не будет.

    Также полезна будет информация про то, что именно не работает.
     
  6. I_v_a_n

    I_v_a_n Нуб

    подключено проводами напрямую, шилды не использую. Не работают ни рфид ни сд. По отдельности все работает. А и если одно из устройств отсоеденить и ребутнуть ардуинку то работает
     
  7. geher

    geher Гуру

    Гипотезы:
    1. Питание. Улучшить характеристики источника питания.
    2. Проблема в одном из устройств, приводящая к тому, что оно "не обращает внимания" на пин чип-селектора, что приводит к тому, что оно все время активно. Что делать в этом случае, не знаю.
    3. Библиотека RFID сканера сама работает с чип-селектором, в результате чего он переводится в LOW. Надо переводить в HIGH после завершения всех манипуляций с классом mfrc522.
     
  8. I_v_a_n

    I_v_a_n Нуб

    Спасибо!!! Учту. Завтра попробую
     
  9. DrProg

    DrProg Вечный нерд

    Я так обесточивал одноустройство, включал другое и наоборот. Причем делал это через транзисторы, которыми управлял цифровыми пинами. Так же работал с несколькими устройствами на одном аналоговом порту, когда аналоговые порты в дифиците.
     
  10. geher

    geher Гуру

    У меня как-то на SPI сидели дисплей, подключенный через сдвиговый регистр, радиомодуль NRF24L01 и SD карта. Все работало без особых плясок.
     
    Последнее редактирование: 7 июл 2015
  11. I_v_a_n

    I_v_a_n Нуб

    Пункты 1 и 2 перепробовал, не получилось
     
  12. I_v_a_n

    I_v_a_n Нуб

    Код (Text):
    /**
    * Read a card using a mfrc522 reader on your SPI interface
    * Pin layout should be as follows (on Arduino Uno):
    * MOSI: Pin 11 / 51  ICSP-4
    * MISO: Pin 12 / 50  ICSP-1
    * SCK: Pin 13 / 52  ISCP-3
    * SS: Pin 10 / 53
    * RST: Pin 9


    */
    //#include <SD.h>
    #include <SPI.h>
    #include <MFRC522.h>
    #include <LiquidCrystal.h>

    #define SS_PIN 53
    #define RST_PIN 9
    int CS_pin = 10;
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    MFRC522::MIFARE_Key key;

    //File myFile;



    void setup()
    {
      Serial.begin(9600);
        // Disable SD Card
            pinMode(CS_pin, OUTPUT);
            digitalWrite(CS_pin, HIGH);
           
            // Disable RFID
            pinMode(SS_PIN, OUTPUT);
          //  digitalWrite(SS_PIN, LOW);
    digitalWrite(SS_PIN, LOW);
      SPI.begin();
      mfrc522.PCD_Init();
      for (byte i = 0; i < 6; i++) {
                    key.keyByte[i] = 0xFF;
            }
            digitalWrite(SS_PIN, HIGH);
    //  Serial.println("Initializing Card");
    //digitalWrite(CS_pin, LOW);
        //  if (!SD.begin(CS_pin)) {
          //    Serial.println("Card Failed");
          //    return;
        //  }
        //  Serial.println("Card Ready");  
           
      //  digitalWrite(CS_pin, HIGH);  
           
    }

    void loop()
    {
        // Enable RFID
            digitalWrite(SS_PIN, LOW);
        if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
                delay(50);
                return;
            }

            Serial.print(F("Card UID:"));
            for (byte i = 0; i < mfrc522.uid.size; i++) {
                    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                    Serial.print(mfrc522.uid.uidByte[i], HEX);
          }  
            Serial.println();          
        // Disable RFID
            digitalWrite(SS_PIN, HIGH);
         
            //Enable SD Card
            digitalWrite(CS_pin, LOW);
                   
        myFile = SD.open("sensey.txt");
      if (myFile) {
        Serial.println("sensey.txt:");
       
        // read from the file until there's nothing else in it:
        while (myFile.available()) {
            Serial.write(myFile.read());
        }
        // close the file:
        myFile.close();
      } else {
          // if the file didn't open, print an error:
        Serial.println("error opening sensey.txt");
      }
    // Disable SD Card
            digitalWrite(CS_pin, HIGH);
           
            //Enable RFID
          //  digitalWrite(SS_PIN, LOW);
            // Halt PICC
            mfrc522.PICC_HaltA();
    }
     
    Зматил такую штуку, если при перезагрузке оставить карточку на рфид модуле, в сериал начинает сыпать и айди карты и содержимое файла, но стоит убрать карту все прекращается, и при повторном подносе карты никак не реагирует
     
  13. I_v_a_n

    I_v_a_n Нуб

    Интересный подход, но цифровых пинов свободных к сожалению нет, но есть аналоговые. Какие транзисторы использовали и можно ли на аналоговых сделать? Делал управление подсветкой но использовал цифровые пины использовал ШИМ
     
  14. DrProg

    DrProg Вечный нерд

    Транзисторы обычные полевые, открываются на землю при подаче сигнала. Если нет цифровых пинов, можно управлять аналоговыми. Схема такая: включили устройство, выждали несколько милисекунд (20 например), считали показание, выключили, включили следующее. Я так делал с несколькими датчиками влажности почвы, при использовании регистра можно их очень много поочередно использовать на один аналоговый вход. SPI это два аналоговых пина, работать с ними по тому же принципу. Схему нарисовать?
     
  15. I_v_a_n

    I_v_a_n Нуб

    Спасибо большое, нет схемку не надо. А аналоговые пины тоже можно в HIGH и LOW выставлять, или цифрами 1023 и 0?
     
  16. I_v_a_n

    I_v_a_n Нуб

    получается транзистор ставим в разрыв по питанию рфид на землю? Т.е. грубо говоря переключатель, замкнули землю считали показания разомкнули. Я вас правильно понял?
     
  17. DrProg

    DrProg Вечный нерд

    Да, по сути включаем землю, мне кажется так правильнее. Управляющие аналоговые пины не забудьте сконфигурировать в OUTPUT.
     
  18. I_v_a_n

    I_v_a_n Нуб

    Все понял, спасибо большое за помощь