• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
rfid rc522
#1
Mam problem z rfid rc522. Nie mogę za żadne skarby odczytać tagów.  Mam dwa czytniki i żaden nie działa. 
podłączam go do arduino uno tak:
zasilanie 3.3v
RST          9
SDA(SS)    10
MOSI        11
MISO        12
SCK          13

Po załadowaniu tego programu:
Kod:
/*
* --------------------------------------------------------------------------------------------------------------------
* Example sketch/program showing how to read data from a PICC to serial.
* --------------------------------------------------------------------------------------------------------------------
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
*
* Example sketch/program showing how to read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID
* Reader on the Arduino SPI interface.
*
* When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE
* then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When
* you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
* will show the ID/UID, type and any data blocks it can read. Note: you may see "Timeout in communication" messages
* when removing the PICC from reading distance too early.
*
* If your reader supports it, this sketch/program will read all the PICCs presented (that is: multiple tag reading).
* So if you stack two or more PICCs on top of each other and present them to the reader, it will first output all
* details of the first and then the next PICC. Note that this may take some time as all data blocks are dumped, so
* keep the PICCs at reading distance until complete.
*
* @license Released into the public domain.
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
*             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
*             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
* Signal      Pin          Pin           Pin       Pin        Pin              Pin
* -----------------------------------------------------------------------------------------
* RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
* SPI SS      SDA(SS)      10            53        D10        10               10
* SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
* SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
* SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
*/

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_PIN          10         // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

void setup() {
    Serial.begin(9600);        // Initialize serial communications with the PC
    while (!Serial);        // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init();        // Init MFRC522
    delay(4);                // Optional delay. Some board do need more time after init to be ready, see Readme
    mfrc522.PCD_DumpVersionToSerial();    // Show details of PCD - MFRC522 Card Reader details
    Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
    // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Dump debug info about the card; PICC_HaltA() is automatically called
    mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

Na porcie mam takie coś:
Kod:
17:31:55.793 -> Firmware Version: 0x12 = counterfeit chip
17:31:55.793 -> Scan PICC to see UID, SAK, type, and data blocks...

i tyle. Przyłożenie breloka nic nie daje. W czym może być problem?
 
Odpowiedź
#2
UNO jest na 5V, RFID 3.3V. Powinieneś użyć konwertera poziomów logicznych. Czasami coś tam działa bez, ale co do zasady się należy w niego wyposażyć i ewentualnie potem szukać problemów gdzie indziej.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Które wyjścia podłączyć do konwertera? Mam 4 kanałowy a wyjść jest 5. Czy wszystkie muszą być podłączone? Pytam bo informacji na temat konwertera i rc522 praktycznie nie ma. Na filmikach, schematach nie nikt nie używa konwertera.
 
Odpowiedź
#4
Pin 10 podłącz przez dzielnik rezystorowy. Sprawdź miernikiem napięcie 3.3V i 5V UNO po podłączeniu wszystkiego, ja swój moduł podłączałem bez konwertera i było OK. Co do zasady wszystko co wychodzi z 5V w kierunku 3.3V może uszkodzić moduł, czasami wystarczy wstawić rezystor np. 1k na linię i jest bezpieczniej. Wszystko co wychodzi z 3.3V na 5V może nie zostać odczytane jako 1 logiczne gdy moduł 3.3V wystawia stan wysoki. Rezystor obniży prąd, dzielnik napięcie i prąd, a również podniesienie poziomu sygnału w drugą stronę zapewnia tylko konwerter. Pin MISO jest wejściem w UNO.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
(02-06-2020, 12:29)kaczakat napisał(a): Pin 10 podłącz przez dzielnik rezystorowy. Sprawdź miernikiem napięcie 3.3V i 5V UNO po podłączeniu wszystkiego, ja swój moduł podłączałem bez konwertera i było OK. Co do zasady wszystko co wychodzi z 5V w kierunku 3.3V może uszkodzić moduł, czasami wystarczy wstawić rezystor np. 1k na linię i jest bezpieczniej. Wszystko co wychodzi z 3.3V na 5V może nie zostać odczytane jako 1 logiczne gdy moduł 3.3V wystawia stan wysoki. Rezystor obniży prąd, dzielnik napięcie i prąd, a również podniesienie poziomu sygnału w drugą stronę zapewnia tylko konwerter. Pin MISO jest wejściem w UNO.

Spróbowałem czegoś innego, mianowicie dałem zasilanie z zewnętrznego źródła i  działa. Przypuszczam, że pin 3.3v jest za mało wydajny (jeżeli to możliwe). Zmniejszyłem napięcie nawet do 2.5V i też jest ok. Teraz zastanawiam się, czy podłączać konwerter. Jeżeli do tej pory nie upaliłem czytnika może znosi napięcie 5V.
 
Odpowiedź
#6
Dlatego sugerowałem pomiar napięcia 3.3V. Dziwne, że nie daje prądu, nawet w klonach z CH340 jest go niby więcej niż ten czytnik ma potrzebę w szczycie poboru.
Co do konwertera to Twój wybór, ja podłączyłem bez i działa. Niektóre moduły są na 3V ale tolerują 5V, wtedy bardziej chodzi o to co przy danym napięciu jest 1 a co 0.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(02-06-2020, 20:41)kaczakat napisał(a): Dlatego sugerowałem pomiar napięcia 3.3V. Dziwne, że nie daje prądu, nawet w klonach z CH340 jest go niby więcej niż ten czytnik ma potrzebę w szczycie poboru.
Co do konwertera to Twój wybór, ja podłączyłem bez i działa. Niektóre moduły są na 3V ale tolerują 5V, wtedy bardziej chodzi o to co przy danym napięciu jest 1 a co 0.
 Na razie nie będę używał konwentera.  Pytanie mam. Chcę zapisać zmieniony tag w eeprom. Napisałem takie coś:


Kod:
void zmianaTag1(){                                                                   // zmiana tagu1
String content= "";
lcd.clear();
lcd.setCursor(0,0);  
lcd.print(F("Przyluz brelok"));
while(1){
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()){

    Serial.print("UID tag :");
    for (byte i = 0; i < mfrc522.uid.size; i++)
      {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
      content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
      content.concat(String(mfrc522.uid.uidByte[i], HEX));
      }
  content.toUpperCase();
   }
if(content.length() == 12){                                                         // jesli tag prawidlowo zeskanowany czyli dlugosc zmienne content rowna 12
  content = tag1;                                                                   // przypisanie odczytanego tagu do tag1                                                              
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("Tag1 zmieniony:"));
  lcd.setCursor(0,1);
  lcd.print(tag1);
  zapisTag1EEPROM();
  delay(3000);
  lcd.clear(); 
  break;
  }
 }
}

void zapisTag1EEPROM(){                                                                            // zapis tag1 w eeprom od adresu 0

  for (int adresTag1=0; adresTag1 <= tag1.length()-1; adresTag1++)                    
    Serial.println(tag1.length());
    Serial.print(F("Zapisany znak  "));                             
    Serial.print(tag1.charAt(adresTag1));                             
    Serial.print(F(" Pod Adresem EEPROM "));                            
    Serial.println(adresTag1);
    EEPROM.update(adresTag1, (tag1.charAt(adresTag1) - 48));                
  }                                                                  
  Serial.println(F("Ciag zapisany do EEPROM")); 
  odczytTag1EEPROM();
}

void odczytTag1EEPROM(){                                                                          // odczyt tag1 z eeprom od adresu 0
                                                                     
for (int adresTag1=0; adresTag1 <=c; adresTag1++)                                    
  {
    odczytTag1 += EEPROM.read(adresTag1);                                 
    Serial.print(F("Odczytany Znak "));                             
    Serial.print(EEPROM.read(adresTag1));                                   
    Serial.print(F(" Z Adresu EEPROM "));                         
    Serial.println(adresTag1);  
  }                                                                       
  Serial.print(F("odczytTag1 = "));                                 
  Serial.println(odczytTag1);
  tag1=odczytTag1;
}

kod działa prawie ok z tym, że nieprawidłowo odczytuje znaki inne niż cyfry:

Kod:
12:30:37.204 -> Zapisany znak  7 Pod Adresem EEPROM 0
12:30:37.238 -> Zapisany znak  9 Pod Adresem EEPROM 1
12:30:37.271 -> Zapisany znak    Pod Adresem EEPROM 2
12:30:37.305 -> Zapisany znak  4 Pod Adresem EEPROM 3
12:30:37.339 -> Zapisany znak  1 Pod Adresem EEPROM 4
12:30:37.408 -> Zapisany znak    Pod Adresem EEPROM 5
12:30:37.443 -> Zapisany znak  7 Pod Adresem EEPROM 6
12:30:37.474 -> Zapisany znak  2 Pod Adresem EEPROM 7
12:30:37.541 -> Zapisany znak    Pod Adresem EEPROM 8
12:30:37.576 -> Zapisany znak  C Pod Adresem EEPROM 9
12:30:37.609 -> Zapisany znak  1 Pod Adresem EEPROM 10
12:30:37.678 -> Ciag zapisany do EEPROM
12:30:37.678 -> Odczytany Znak 7 Z Adresu EEPROM 0
12:30:37.746 -> Odczytany Znak 9 Z Adresu EEPROM 1
12:30:37.781 -> Odczytany Znak 240 Z Adresu EEPROM 2
12:30:37.813 -> Odczytany Znak 4 Z Adresu EEPROM 3
12:30:37.847 -> Odczytany Znak 1 Z Adresu EEPROM 4
12:30:37.881 -> Odczytany Znak 240 Z Adresu EEPROM 5
12:30:37.915 -> Odczytany Znak 7 Z Adresu EEPROM 6
12:30:37.983 -> Odczytany Znak 2 Z Adresu EEPROM 7
12:30:38.016 -> Odczytany Znak 240 Z Adresu EEPROM 8
12:30:38.050 -> Odczytany Znak 19 Z Adresu EEPROM 9
12:30:38.083 -> Odczytany Znak 1 Z Adresu EEPROM 10
12:30:38.117 -> odczytTag1 = 792404124072240191
 
Jak ogarnąć to, żeby znaki inne niż cyfry były prawidłowo odczytywane z eeprom?
A może jest inny sposób na zapisanie np.  string= " A1 77 B9 VD" ?
 
Odpowiedź
#8
Ale jak źle? Od razu wydrukowałeś co zapisujesz, masz 7,9, PUSTE POLE,4,1,PUSTE POLE, 0, itd. Puste pola to 240 (akurat w tym przypadku), znak niedrukowalny (czy tam akurat w tym zestawie czcionek używanych na serial port, bo czasami dla różnych wartości jakieś krzaczki się pojawią). Możesz sobie to odczytać jako bajty i jako bajty wydrukować na serial, a jak chcesz mieć literki to wartość liczbowa bajtu zapisanego musi być z zakresu ASCII literek.
Zrób sobie tablicę char z tym napisem, przeleć po indeksie tablicy w pętli for i powpisuj te literki, które potrzebujesz.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
Znalazłem takie coś, trochę pozmieniałem, powywalałem zbędne linijki i efekt końcowy taki:

Kod:
void zapisTag1EEPROM(){                                                                           
char add = 70;                                                                                    
  int _size = tag1.length();
  int i;
  for(i=0;i<_size;i++)
  {
    EEPROM.update(add+i,tag1[i]);
  }
  EEPROM.update(add+_size,'\0'); 
  odczytTag1EEPROM();
}

void odczytTag1EEPROM(){                                                                         
char add = 71;                                                                                   
  int i;
  char data[100];                                                                                
  int len=0;
  unsigned char k;
  k=EEPROM.read(add);
  while(k != '\0')                                                                             
  {   
    k=EEPROM.read(add+len);
    data[len]=k;
    len++;
  }
  data[len]='\0';
  tag1=data;
  Serial.println("odczytany tag1 z eeprom:    ");
  Serial.println(tag1);

}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości