Эмулятор карт rfid 125 кгц

Тема в разделе "Arduino & Shields", создана пользователем Конст, 24 мар 2021.

  1. Конст

    Конст Нуб

    Добрый день.

    По ссылке был найден интересный проект, позволяющий эмулировать карты RFID.
    С подбором деталей и сборкой на макетке проблем не возникло.
    Проверил - всё работает и считыватель считывает.
    Далее захотелось усовершенствовать проект и подключить матричную клавиатуру, чтобы вводить ID карты с неё.
    Но далее возникли сложности - очевидные варианты с условным оператором не работают.

    Подскажите, в каком направлении думать.
    Спасибо.

    Код (C++):
    #define ANTENNA 2
    #define CARD_ID 0x0001020304

    volatile int bit_counter=0;
    volatile int byte_counter=0;
    volatile int half=0;

    uint8_t data[8];

    void data_card_ul() {
      uint64_t card_id = (uint64_t)CARD_ID;
      uint64_t data_card_ul = (uint64_t)0x1FFF; //first 9 bit as 1
      int32_t i;
      uint8_t tmp_nybble;
      uint8_t column_parity_bits = 0;
      for (i = 9; i >= 0; i--) { //5 bytes = 10 nybbles
        tmp_nybble = (uint8_t) (0x0f & (card_id >> i*4));
        data_card_ul = (data_card_ul << 4) | tmp_nybble;
        data_card_ul = (data_card_ul << 1) | ((tmp_nybble >> 3 & 0x01) ^ (tmp_nybble >> 2 & 0x01) ^\
          (tmp_nybble >> 1 & 0x01) ^ (tmp_nybble  & 0x01));
        column_parity_bits ^= tmp_nybble;
      }
      data_card_ul = (data_card_ul << 4) | column_parity_bits;
      data_card_ul = (data_card_ul << 1); //1 stop bit = 0
      for (i = 0; i < 8; i++) {
        data[i] = (uint8_t)(0xFF & (data_card_ul >> (7 - i) * 8));
      }
    }

    void setupTimer1() {
      noInterrupts();
      // Clear registers
      TCCR1A = 0;
      TCCR1B = 0;
      TCNT1 = 0;

      // 3906.25 Hz (16000000/((4095+1)*1))
      OCR1A = 4095;
      // Prescaler 1
      TCCR1B |= (1 << CS10);
      // Output Compare Match A Interrupt Enable
      TIMSK1 |= (1 << OCIE1A);
      interrupts();
    }

    void setup() {
      pinMode(ANTENNA, OUTPUT);  
      data_card_ul();
      setupTimer1();
    }

    void loop() {
    }

    ISR(TIMER1_COMPA_vect) {
            TCNT1=0;
        if (((data[byte_counter] << bit_counter)&0x80)==0x00) {
            if (half==0) digitalWrite(ANTENNA, LOW);
            if (half==1) digitalWrite(ANTENNA, HIGH);
        }
        else {
            if (half==0) digitalWrite(ANTENNA, HIGH);
            if (half==1) digitalWrite(ANTENNA, LOW);
        }
       
        half++;
        if (half==2) {
            half=0;
            bit_counter++;
            if (bit_counter==8) {
                bit_counter=0;
                byte_counter=(byte_counter+1)%8;
            }
        }
    }
     
  2. parovoZZ

    parovoZZ Гуру

    Для начала необходимо поморгать светодиодом, затем поморгать светодиодом от нажатий кнопки в различных вариациях, затем поморгать светодиодом от матричной клавиатуры. Тогда придёт осознание того, что как в МК работает.
    В коде не вижу работы с матричной клавиатурой или мы говорим о разных вещах.
     
  3. Конст

    Конст Нуб

    Вы правы, здесь этого нет. Вечером добавлю полноценный скетч.