RFID rdm6300

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

  1. DIYMan

    DIYMan Guest

    Балуюсь тут с сабжем - забавная штукенция, секса никакого, всё по двум проводкам, работает с SoftwareSerial, ляпота, да и только. Набросал быстренько скетчик, который лочит/разлочит "систему" при поднесении известных ключей:

    Код (C++):
    #include <SoftwareSerial.h>

    // на каких пинах подключен RFID-считыватель
    SoftwareSerial sSerial(8,9);

    // тестовый пин, на котором будем включать светодиод, говорящий о том, что система закрыта/открыта
    const int ledPin = 13;

    // флаг, что юзер залогинен
    bool isUserLoggedIn = false;

    // длина ключа RFID-метки
    const byte RFID_TAG_LENGTH = 14;

    // сюда будем читать ключ
    byte enteredKey[RFID_TAG_LENGTH] = {0};
    // здесь будем хранить информацию о последнем сравненном ключе, чтобы избежать повторного выполнения кода
    byte lastKey[RFID_TAG_LENGTH] = {0};

    // массив ключей, которые нам известны
    byte knownKeys[][RFID_TAG_LENGTH]=
    {
      { 0x02, 0x30, 0x39, 0x30, 0x30, 0x34, 0x46, 0x35, 0x33, 0x46, 0x33, 0x45, 0x36, 0x03 }
    , { 0x02, 0x30, 0x46, 0x30, 0x30, 0x36, 0x31, 0x42, 0x46, 0x39, 0x32, 0x34, 0x33, 0x03 }
    // сюда дописывать ключи
    , {0,0,0,0,0,0,0,0,0,0,0,0,0,0} // заглушка, признак окончания массива ключей  
    };

    byte writePos = 0; // позиция записи
    unsigned long eraseKeyTimer = 0; // таймер присутствия ключа в считывателе
    const unsigned int waitEraseInterval = 1000; // через сколько миллисекунд можно повторно приложить ключ

    void setup()
    {
      Serial.begin(57600);
      sSerial.begin(9600);

      pinMode(ledPin,OUTPUT);
      digitalWrite(ledPin,LOW);

      Serial.println(F("System ready, locked."));

    }
    // сравниваем ключи на совпадение
    bool sameKey(byte* k1, byte* k2)
    {
      return !memcmp(k1,k2,RFID_TAG_LENGTH);
    }
    // проверяем - известен ли нам ключ
    bool isKnownKey(byte* key)
    {
      byte pos = 0;
      while(1)
      {
        if(!memcmp(knownKeys[pos],key,RFID_TAG_LENGTH)) // ключ совпал
        {
          return true;
        }
       
        if(knownKeys[pos][0] == 0) // дошли до конца массива известных ключей
          break;
        pos++;
      }
      return false;
    }
    void loop()
    {

      if(sSerial.available())
      {
        // есть данные от ключа, считываем их
        while(sSerial.available())
        {
           enteredKey[writePos++] = sSerial.read();
           if(writePos >= RFID_TAG_LENGTH)
           {
             // прочитали весь ключ, проверяем его
             writePos = 0;
             if(isKnownKey(enteredKey)) // ключ известен
             {
                if(!sameKey(enteredKey,lastKey)) // если только его не продолжают держать у считывателя
                {
                  // пишем, что мы узнали ключ
                  Serial.println(F("Key known :)))"));

                  // меняем статус системы
                  isUserLoggedIn = !isUserLoggedIn;
                  digitalWrite(ledPin,isUserLoggedIn ? HIGH: LOW);
                  Serial.println(isUserLoggedIn ? F("System unlocked.") : F("System locked."));
                }
             }
             else // ключ неизвестен
             {
              // если только ключ не тот же, т.е. если его не держат на считывателе
              if(!sameKey(enteredKey,lastKey))
                Serial.println(F("Key unknown :("));
             }
             // запоминаем, какой ключ на считывателе
             memcpy(lastKey,enteredKey,RFID_TAG_LENGTH);

            // обновляем таймер присутствия ключа в считывателе
             eraseKeyTimer = millis();
           } // if(writePos >= RFID_TAG_LENGTH)
         
        } // while
       
      } // if

      // если ключ отсутствует больше N секунд - стираем информацию о последнем введённом ключе
      if(millis() - eraseKeyTimer > waitEraseInterval)
      {
         memset(lastKey,0,RFID_TAG_LENGTH);
      }
     
     
      /*
       // тестовый код для считывания поднесённых ключей
      if(sSerial.available())
      {
        while(sSerial.available())
        {
          char ch = sSerial.read();
          Serial.print("0x");
          if(ch < 16)
            Serial.print('0');
          Serial.print(ch, 16);
          Serial.print(' ');
         
        }

        Serial.println();
      }
      */


    }
    Но вот возник, собственно, вопрос: а какие практические применения у подобных игрушек (RFID, я имею в виду) в DIY-сегменте? Открыть/закрыть замок какой - это понятно. Ну а дальше - что? Не будешь же делать систему допусков, как на предприятии? Зачем оно в DIY?

    А накидайте мне вариантов, плз - для чего всё это, кроме баловства?
     
  2. ostrov

    ostrov Гуру

    А у меня метки к ней пришли неподходящие. ( Заказал правильных, сижу, жду.

    Меня в данном ридере привлекло заявленное расстояние чтения метки. Есть задачи, где 2-3 см мало, надо хотя бы 10. Потому к вам просьба: замерьте опытным путем максимальное расстояние с которого он берет метку. Если не трудно, конечно.
     
  3. DIYMan

    DIYMan Guest

    Да вот только сегодня игрался: питал от Uno, саму Uno - к USB-порту ноута. Не берёт метки с 10 см, максимум - те же 2-3 см, почти вплотную подносить приходится. Антенну пробовал переполюсовывать (ну а вдруг, хотя, понятно - там нету плюса и минуса в чистом виде) - на дальность считывания не влияет. Подключал только питание, RX/TX и антенну, выводы для внешнего светодиода не подключал.

    Так что не знаю, о каких 10 см может идти речь. Возможно, в идеальных условиях, да если поднять напругу на пару вольт (не стал копаться в даташите и смотреть диапазон рабочих напряжений) - ну может быть, хотя, если честно - я сомневаюсь, от слова "очень".
     
  4. DIYMan

    DIYMan Guest

  5. ostrov

    ostrov Гуру

    О том, что он понимает только TK4100 и EM4100, а не любые 125КГцовые метки я понял позже чем надо. )

    Расстояние замерьте, пожалуйста, а я подкину идей для воплощения.

    А, сорри, только сейчас заметил ответ выше! Вопрос снимается на обдумывание ответа.
     
    Последнее редактирование: 27 июн 2016
  6. DIYMan

    DIYMan Guest

    Имею в наличии 6 казанных по ссылке меток. Вертикально если их подносить - не реагирует вообще, даже когда метка жопкой проходит ниже плоскости антенны. Если подносить горизонтально, то среднее расстояние, на котором происходит считывание - 2,5-3 см, не больше. Т.е. даже о 5 см речи не идёт. Повторюсь про условия: питается всё от Uno, 5В, сама Uno - от USB компа, выходное на пине 5В ардуины - 4,96В.
     
  7. ostrov

    ostrov Гуру

    Да, я ответ не сразу увидел.

    Понял. Хреново. Я то купился на обещанные 10-15 см, придется что то другое придумывать теперь. Получается, что у него плюс только один: простота считывания кода и экономия памяти МК соответственно. А минусы: цена, хрупкость и редкость.
     
  8. 9xA59kK

    9xA59kK Гик

    Можно попробовать перемотать антену\катушку.
    Я тоже выписывал подобный модуль, у меня он вообще не больше 1-1.5 см работал.
    Поэтому перешел на RC522 , низкая цена расстояние в таких же пределах(2-3см) что и у rdm630. Плюс читает NFC метки\ключи, так же проверял на телефоне Самсунг NFC , тоже работает.
     
    Последнее редактирование: 27 июн 2016
  9. ostrov

    ostrov Гуру

    Пришли еще два RDM6300 и благодаря им выяснилось почему первый не работал. Называется найди отличие (снизу рабочий):
    [​IMG]

    Но увы, метки видит, как сообщалось выше, еще ближе чем RC522 несмотря на внушительных размеров катушку. А потому плюс у него остался только один: простота считывания, не надо ни библиотек ни огромных кодов, сразу результат на лицо RX.
     
    DIYMan нравится это.
  10. Tomasina

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

    хе, диодик сэкономили.
     
  11. ZAZ-965

    ZAZ-965 Гуру

    Принципиальная схема RDM6300 никому не попадалась? Думаю увеличить дальность можно увеличив размер катушки, соответственно пересчитав емкость в контуре.
     
  12. lsvit

    lsvit Нуб

    Спасибо за такой хороший скетч!
    Я в программировании не силён, но у этого скетча есть небольшой баг, не могу определить почему.
    Если ключ подносить и сразу убирать - всё работает хорошо. А если ключ приложить и не убирать, то он перестаёт видеть ключ совсем, пока ресет не нажму. А в мониторе порта пишет вот так:
    System locked.
    Key known :)))
    System unlocked.
    Key known :)))
    System locked. - вот тут я ключ приложил и не убирал
    Key unknown :(
    Key unknown :(
    Key unknown :(
    Key unknown :(
    Несмотря на то, что это тот же самый ключ. да и вообще все известные ключи перестают работать.
    Помогите, кто сможет понять в чем дело)
     
  13. ostrov

    ostrov Гуру

    У меня вот возникла одна безумная идея как увеличить дальность извращенным способом, но проверить пока не могу, так как ридер на руках только один. Исхожу из того, что дальность ограничена не приемником, а мощностью катушки, которая создает необходимый ток для работы чипа в брелке, это подтверждает тот факт, что карточка с бОльшим радиусом катушки срабатывает дальше. Соответственно, надо попробовать обеспечить брелок отдельным питанием. Сделать это, ничего не разбирая и не ломая, можно только одним способом - от другой катушки. То есть схема такая: одной катушкой расположенной рядом питаем, со второй считываем замеряя расстояние. Теоретически, должно ловить заметно дальше. Если это так, то кое-где вполне себе выход. У кого таких ридеров два и более? Проверить идею сможете?
     
  14. vuk

    vuk Нуб

    А как насчет увеличить диагональ прямоугольной антенны до размеров входной двери? Это возможно? Если возможно, то что для этого нужно - пересчитать количество витков или длины провода для согласования резонанси с меткой или брелком, поставить другие транзисторы или опперационник добавить?

    Идея сделать охранные ворота для товаром в магазине одежды с метками на 125 КГц.
    Такие профессиональные ворота очень дорогие и используют другие частоты.
     
  15. DetSimen

    DetSimen Guest

    а ты думаешь за 3 рубля на ардуине сделаешь с функционалом профессиональных ворот? Забуть.
     
    parovoZZ нравится это.
  16. parovoZZ

    parovoZZ Гуру

    что за метка? С чипом или электроакустическая?
     
  17. vuk

    vuk Нуб

  18. parovoZZ

    parovoZZ Гуру

    Дистанция - 15 см. Мне это нравится)) Скорее всего попутали см с мм.
    Если модуляция амплитудная, то смотри считку ST-PR150EM - до 70см.
     
  19. vuk

    vuk Нуб

    Странно, что везде пишут частоту 125 КГц, хотя на самом деле на катушке частота 127,2 КГц.
     
  20. vuk

    vuk Нуб

    ST-PR150EM - до 20 см