Проблема с RFID-RC522 меткой

Тема в разделе "Arduino & Shields", создана пользователем ACID, 2 фев 2017.

  1. ACID

    ACID Нуб

    Пользовался RFID меткой с библиотекой <MFRC522.h>. Возникла проблема, при поиске новой метки цикл программы останавливается. То есть ждет пока поднесут метку.
    Код (C++):
     // poisk novoy metki
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
      // Vibor metki
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
    Мне же нужно, чтобы программа продолжала работать циклически. Пытался использовать библиотеку <RFID.h> , но бесполезно. Пытался как-то работать с выходом прерывания RC522 - IRQ. Но по видимому он не работает. Прошу помощи, как сделать опрос метки по прерыванию или же так, чтобы программа продолжала работать, а не ждала пока сработает rfid метка.
     
  2. Tomasina

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

    Убери первый if, он не дает скетчу выполниться дальше, пока нет метки.
     
  3. ACID

    ACID Нуб

    Код (C++):
    ! mfrc522.PICC_IsNewCardPresent();
      // Vibor metki
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
    Если так, то он работает точно так же и стопорится.

    Код (C++):
    ! mfrc522.PICC_IsNewCardPresent();
      // Vibor metki
    ! mfrc522.PICC_ReadCardSerial()
     
    Если так, то серво после задержки закрывается и сразу же открывается, как я понимаю он хранит старое значение. Проблема не решилась.
     
  4. Tomasina

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

    убрать первый if:
    Код (C++):
     // poisk novoy metki
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
     
  5. ACID

    ACID Нуб

    Код (C++):
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
      }
      // Vibor metki
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
       uidDec = 0;
      // Vida4a seriynogo nomera metki
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec * 256 + uidDecTemp;
      }
      // Serial.println("Card UID: ");
    //  Serial.println(uidDec);
      if (uidDec == 2422114125)
      {
        servo.write(90);
        delay(3000);
      }
    Вот весь код. Если первый if убрать, то серво вообще не будет реагировать. Не будет работать.
     
  6. Tomasina

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

    Ну почему у меня работает, а у вас нет?
     
  7. ACID

    ACID Нуб

    Код (C++):
    #include <Servo.h>
    #include <SPI.h>
    #include <MFRC522.h> // библиотека "RFID".
    #define SS_PIN 53
    #define RST_PIN 5
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
    Servo servo;

    void setup() {
      Serial.begin(9600);
    // Serial.println("Waiting for card...");
      SPI.begin();  //  инициализация SPI / Init SPI bus.
      mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
      servo.attach(10);
      servo.write(0);  // устанавливаем серву в закрытое сосотояние
    }
    void loop() {
      // Vibor metki
      if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
      }
       uidDec = 0;
      // Vida4a seriynogo nomera metki
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec * 256 + uidDecTemp;
      }
    //  Serial.println("Card UID: ");
    // Serial.println(uidDec); // Выводим UID метки в консоль.
      if (uidDec == 2422114125) // Сравниваем Uid метки, если он равен заданому то серва открывает.
      {
        servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.)
        delay(3000); // пауза 3 сек и механизм запирается.
      }
      servo.write(0);  // устанавливаем серву в закрытое сосотояние
    }
    Можете сами проверить. rfid без этой команды не работает
     
  8. Tomasina

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

    работает ;)
    Код (C++):
    #include <Servo.h>
    #include <SPI.h>
    #include <MFRC522.h> // библиотека "RFID".
    #define SS_PIN 53
    #define RST_PIN 5
    unsigned long uidDec;   // для хранения номера метки в десятичном формате

    MFRC522 mfrc522(SS_PIN, RST_PIN);
    Servo servo;
    unsigned long readRFID();

    void setup()
    {
      Serial.begin(9600);
      // Serial.println("Waiting for card...");
      SPI.begin();  //  инициализация SPI / Init SPI bus.
      mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
      servo.attach(10);
      servo.write(0);  // устанавливаем серву в закрытое сосотояние
    }

    void loop()
    {
      uidDec = readRFID();
     
      if (uidDec > 0)
      {
        Serial.print("Card UID: ");
        Serial.println(uidDec);
      }

      if (uidDec == 2422114125)
      {
        servo.write(90);
        delay(3000);
      }

      servo.write(0);  // устанавливаем серву в закрытое сосотояние
    }

    // Чтение меток
    unsigned long readRFID()
    {
      if ( !mfrc522.PICC_IsNewCardPresent()) return 0;
      if ( !mfrc522.PICC_ReadCardSerial()) return 0;
      // Vida4a seriynogo nomera metki
      unsigned long uidDecTemp;  // для временного хранения номера метки в десятичном формате
      for (byte i = 0; i < mfrc522.uid.size; i++)
      {
        uidDecTemp = mfrc522.uid.uidByte[i];
        uidDec = uidDec * 256 + uidDecTemp;
      }
      return uidDec;
    }
     
     
    ACID нравится это.
  9. ACID

    ACID Нуб

    Спасибо большое, очень помогли:)
     
  10. ACID

    ACID Нуб

    Ещё вопрос если не надоел) Можно ли как-то servo.write(0) в условие "если" добавить? Там нужна булевская переменная, пытаюсь сделать ее булевской, ругается на точку.
     
  11. Tomasina

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

    код где?
     
  12. ACID

    ACID Нуб

    Код (C++):
    if (analogRead(photorez3)<400)
    Грубо говоря в это условие еще нужно добавить условие
    Код (C++):
    servo.write(90);
    Но там понятное дело нужна булевская переменная. Возможно ли в условие команду servo.write(90) добавить? То есть если 90 градусов, то условие выполняется.
     
  13. Tomasina

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

    Код (C++):
    unsigned int servoAngle = 0;
    // в это месте что-то меняет переменную servoAngle
    if(analogRead(photorez3) < 400)
       {
       if(servoAngle == 90)
          {
             servoAngle = 0;
             servo.write(servoAngle);
          }
       else
          {
             servoAngle = 90;
             servo.write(servoAngle);
          }
       }
     
     
    ACID нравится это.
  14. ACID

    ACID Нуб

    Жаль что до меня не дошло =) Спасибо большое :rolleyes: Вы используете unsigned int потому что меньше байт эти переменные занимают?)
     
    Последнее редактирование: 14 фев 2017
  15. Tomasina

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

    Потому что unsigned int может быть только положительным числом, в отличие от просто int.
    Если у тебя угол поворота не превышает 255, можно вообще тип byte использовать, для экономии ресурсов.