Skocz do zawartości

Pomocna odpowiedź

Napisano (edytowany)

Witam,
Zainspirował mnie pomysł ze strony: https://create.arduino.cc/projecthub/kksjunior/windows-pc-lock-unlock-using-rfid-5021a6?ref=tag&ref_id=rfid&offset=0
aczkolwiek zmieniłbym parę rzeczy.

Części do projektu:

-Arduino Pro Micro

-Moduł RFID RC522

-Dioda LED zielona

-Dioda LED czerwona

-2 Rezystory 220Ohm

-Rezystor 67Ohm

-Rezystor 270Ohm

-Buzzer (opcjonalne)

-Przełącznik na 3 piny (opcjonalne)


Najpierw zaprojektowałem sam układ, który wygląda o tak:

Schematic_rfid-pc_Sheet-1_20190111213919.thumb.png.87c22834385f60cd18869eb34caa0a16.png

Gdy wszystko było gotowe zabrałem się do podłączania do breadboard'a testującego, ponieważ zawsze dobrze jest sprawdzić obwód zanim się go przylutuje na stałe.

 

Chciałem jednak wziąć ten projekt o krok dalej, i zaprojektowałem płytkę PCB, i zamówiłem ją na https://jlcpcb.com :

PCB_RFID-ACCES-BOARD_20190111214852.thumb.png.7474607c6183369af7279db3b5d51b9b.png

Pojawił się jednak mały problem, ponieważ mam tylko arduino nano i uno, ale potrzeba mikroprocesora atmega32u4, który można znaleźć tylko w arduino MEGA i pro Micro.

Wybrałem Pro Micro, ponieważ chcę, aby ten obwód był jak najmniejszy.

Po podłączeniu wszystkiego, działało to bez problemu.
 

Dla zainteresowanych, oto kod:

pc.rar

 


Teraz tylko czekam, aż moja PCB przyjedzie. 🙂

Edytowano przez JEREDEK

Udostępnij ten post


Link to post
Share on other sites

@JEREDEK, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Cieszę się, rozpocząłeś swojego workloga na Forbocie. Życzę powodzenia przy kontynuacji Twojego projektu. Zgłosiłeś ten temat do naszej akcji rabatowej organizowanej z Botlandem, ale pamiętaj jednak, że akcja ta aktualnie dotyczyły wyłącznie ukończonych projektów odpisanych w odpowiedni sposób. W związku z tym projekt ten nie został zaakceptowany, ale oczywiście będzie mógł go zgłosić, gdy ukończysz opisane urządzenie 😉 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Natrafiłem na problem z Arduino Pro micro. Na moim breadboardzie użyłem dzielnika napięcia z rezystorem 68R i 156R, ale gdy zmierzyłem, leciało napięcie 2.9V zamiast 3.3V,
 

Oto rozwiązanie:
Użyłem wzoru Vo = Vin*(R2/R1+R2) = 5*(156/68+156) = 3.4
Natomiast po zmierzeniu napięcia wejściowego, nie było to 5V ale 4V. Mam problem z moją płytką, więc użyłem innego wzoru
Vo = Vin*(R2/R1+R2) = 4*(330/68/330) = 3,3

Natomiast chciałem też oddać parę płytek znajomym, więc postanowiłem zamiast dzielnika napięcia zastosować regulator 3.3V: Holtek Semicon HT7533-1 , w pakiecie TO-92. 

Schematic_rfid-pc_Sheet-1_20190111213919.thumb.png.daf628884220484e6b5e6098ad41db55.png

Zmieniłem też lekko kod, oto on:

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

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

uint8_t successRead;    // Variable integer to keep if we have Successful Read from Reader
byte storedCard[4];   // Stores an ID read from EEPROM
byte readCard[4];   // Stores scanned ID read from RFID Module
int x = 1;
String readid;


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

void setup() {
	Serial.begin(9600);		// Initialize serial communications with the PC
			// Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
	SPI.begin();// Init SPI bus
  Keyboard.begin();
	mfrc522.PCD_Init();		// Init MFRC522
	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 temp(byte *buffer, byte bufferSize)//function to store card uid as a string datatype.
{
  readid="";
  for(byte i = 0;i<bufferSize; i++)
  {
    readid=readid+String(buffer[i], HEX);
  }
}

void loop() {
  
 successRead = getID();

 if (successRead == 1)
 {
  temp(mfrc522.uid.uidByte, mfrc522.uid.size);

  if (readid == "6a6b1f7") // Card ID here
  {  
    if (x == 1)
    {
    Keyboard.press(KEY_ESC);
    delay(100);
    Keyboard.releaseAll();
    delay(500);
    Keyboard.print("1234"); // Your Password Here
    Serial.print(readid);
    x = 2;
    }  
    if (x == 2){
      Keyboard.press(KEY_LEFT_GUI);
      Keyboard.press('l');
      delay(100);
      Keyboard.releaseAll();
      x = 1
    }
  }
   successRead = 0;
 }
  
}


///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
  // I think we should assume every PICC as they have 4 byte UID
  // Until we support 7 byte PICCs
  
  //Serial.println(F("Scanned PICC's UID:"));
  for ( uint8_t i = 0; i < 4; i++) {  //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
  }
  Serial.println("");
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

Martwię się o temperaturę, więc chciałbym się was spytać: Czy mogę zastosować takie rozwiązanie?

Edytowano przez JEREDEK

Udostępnij ten post


Link to post
Share on other sites

@JEREDEK, a jaki prąd będzie pobierany przez urządzenie? Mierzyłeś już coś w praktyce?

Udostępnij ten post


Link to post
Share on other sites

Mój amperomierz nie wiem czemu odmawia posłuszeństwa, ale mój zasilacz przy napięciu 3.3V rejestruje przepływ prądu o wartości 0.01A bez karty i 0.02A kiedy przyłożę kartę do odczytania.

IMG_1099.thumb.JPG.52ba1a65231d404401790805c215c963.JPG

UPDATE:
Nie znam się na miernikach, ale chyba płynie tam 0.7 mikro Ampera.

Datasheet potwierdza:

fad.thumb.PNG.1c3fbc15e2ae018f3f8d1c98505524ae.PNG

Udostępnij ten post


Link to post
Share on other sites

@JEREDEK takie zasilacze nie nadają się do pomiaru małych prąd - ich wskazania należy traktować tylko jako wskazówki.

Jeśli jednak ten pomiar jest poprawny, to znaczy, że szczytowo układ będzie pobierał 20mA, a Twój stabilizator działa poprawnie do 100mA, więc raczej nic złego się nie stanie.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Okay, miałem problem, ponieważ okazało się, że powódem dla którego moje Arduino wysyłało 4V, było poluzowanie portu MicroUSB, które odpadło. 

Po zamówienie nowych, wysyłało one 4.78 V, więc podjechałem do Poznania, i kupiłem regulator 3.3V (LM2950 33 716), po podłączeniu wszystkiego na BreadBoardzie działało, więc zaprojektowałem nową płykę i ja zamówiłem.

PCB_RFID-ACCES-BOARD_20190111214852.thumb.png.3c864b97e08dceab695d1b05bc046c5c.png

Za miesiąc powinna przyjść (Bo z chin).

W starym kodzie był glitch gdzie jak się zablokowało komputer, to od razu wpisywał hasło, ale Windows nie zdążył się jeszcze zalogować. Oto nowy kod:
 

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

#define RST_PIN         9          // Configurable
#define SS_PIN          10         // Configurable

uint8_t successRead;    // Variable integer to keep if we have Successful Read from Reader
byte storedCard[4];   // Stores an ID read from EEPROM
byte readCard[4];   // Stores scanned ID read from RFID Module
int x = 1;
String readid;


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

void setup() {
	Serial.begin(9600);		// Initialize serial communications with the PC
			// Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
	SPI.begin();// Init SPI bus
  Keyboard.begin();
	mfrc522.PCD_Init();		// Init MFRC522
	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 temp(byte *buffer, byte bufferSize)//function to store card uid as a string datatype.
{
  readid="";
  for(byte i = 0;i<bufferSize; i++)
  {
    readid=readid+String(buffer[i], HEX);
  }
}

void loop() {
  
 successRead = getID();

 if (successRead == 1)
 {
  temp(mfrc522.uid.uidByte, mfrc522.uid.size);

  if (readid == "6a6b1f7")
  {  
    if (x == 1)
    {
    Keyboard.press(KEY_ESC);
    delay(100);
    Keyboard.releaseAll();
    delay(500);
    Keyboard.print("8659");
    Serial.print(readid);
    blk;
    x = 2;
    return;
    }  
    if (x == 2){
      Keyboard.press(KEY_LEFT_GUI);
      Keyboard.press('l');
      delay(100);
      Keyboard.releaseAll();
      x = 1;
      return;
    }
  }
   successRead = 0;
 }
 else
 {
  blke;
 }
  
}


///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
  // I think we should assume every PICC as they have 4 byte UID
  // Until we support 7 byte PICCs
  
  //Serial.println(F("Scanned PICC's UID:"));
  for ( uint8_t i = 0; i < 4; i++) {  //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
  }
  Serial.println("");
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

uint8_t blk()
{
  digitalWrite(6, HIGH);
  delay(200);
  digitalWrite(6, LOW);
}

uint8_t blke()
{
  digitalWrite(6, HIGH);
  delay(1000);
  digitalWrite(6, LOW);
}

 

Edytowano przez JEREDEK

Udostępnij ten post


Link to post
Share on other sites

Okay, zamówiłem płytkę z JLCPCB, poczekałem miesiąc, i przyszła. Muszę powiedzieć, że jestem BARDZO zadowolony z roboty którą odwalili. Są idealnej jakości, przyszłali ich dziesięć, a zapłaciłem tylko 20 zł! (bez dostawy 6 zł!!)

Płytka działa bez zarzutu, oprócz migającej diody i buzzera. To usterka w kodzie, ale nie mogę jej znaleźć. Pomożecie?

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

#define RST_PIN         9          // Configurable
#define SS_PIN          10         // Configurable

uint8_t successRead;    // Variable integer to keep if we have Successful Read from Reader
byte storedCard[4];   // Stores an ID read from EEPROM
byte readCard[4];   // Stores scanned ID read from RFID Module
int x = 1;
String readid;


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

void setup() {
  Serial.begin(9600);   // Initialize serial communications with the PC
      // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();// Init SPI bus
  Keyboard.begin();
  pinMode(2, OUTPUT);
  mfrc522.PCD_Init();   // Init MFRC522
  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 temp(byte *buffer, byte bufferSize)//function to store card uid as a string datatype.
{
  readid="";
  for(byte i = 0;i<bufferSize; i++)
  {
    readid=readid+String(buffer[i], HEX);
  }
}

void loop() {
  
 successRead = getID();

 if (successRead == 1)
 {
  temp(mfrc522.uid.uidByte, mfrc522.uid.size);

  if (readid == "6a6b1f7")
  {  
    if (x == 1)
    {
    Keyboard.press(KEY_ESC);
    delay(100);
    Keyboard.releaseAll();
    delay(500);
    Keyboard.print("8659");
    Serial.print(readid);
    blk;
    x = 2;
    return;
    }  
    if (x == 2){
      Keyboard.press(KEY_LEFT_GUI);
      Keyboard.press('l');
      delay(100);
      Keyboard.releaseAll();
      x = 1;
      return;
    }
  }
   successRead = 0;
 }
 else
 {
  blke;
 }
  
}


///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
  // I think we should assume every PICC as they have 4 byte UID
  // Until we support 7 byte PICCs
  
  //Serial.println(F("Scanned PICC's UID:"));
  for ( uint8_t i = 0; i < 4; i++) {  //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
  }
  Serial.println("");
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

uint8_t blk()
{
  digitalWrite(2, HIGH);
  delay(200);
  digitalWrite(2, LOW);
}

uint8_t blke()
{
  digitalWrite(2, HIGH);
  delay(1000);
  digitalWrite(2, LOW);
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
2 godziny temu, JEREDEK napisał:

Płytka działa bez zarzutu, oprócz migającej diody i buzzera. To usterka w kodzie, ale nie mogę jej znaleźć. Pomożecie?

Opisz trochę dokładnie co się dzieje, nie mamy płytki przed sobą, więc ciężko debugować. Miga dioda, nie miga, powinna migać, nie powinna itd. Napisz co się dzieje, a co powinno się według Ciebie dziać 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A, tak przepraszam.gdy przyłożę kartę to dioda powinna mignąć krótko lub długo (zależy czy dobra karta) a arduino wysyła tylko hasło, odblokowując komputer.

Udostępnij ten post


Link to post
Share on other sites

Nadal nie mogę znaleźć błędu, kompiluje się dobrze 😞 . Adminie nasz, @Treker jakieś pomysły? 😂

Udostępnij ten post


Link to post
Share on other sites

Niestety nie rozumiem jak ma działać ten program, więc ciężko jest mi udzielić jakieś pomocy. Masz tam funkcje "blk()", która wygląda jakby miała służyć do migania diodami, ale są z nią dwa problemy:

  • jest błędna, bo zabrakło Ci chyba jeszcze jednego delay,
  • nigdzie jej nie wywołujesz (albo tego nie widzę).

Dobrze zgadłem, że to ta funkcja miałaby odpowiadać za miganie?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
Dnia 11.03.2019 o 13:14, JEREDEK napisał:

Serial.print(readid);

blk;

x = 2;

Może nawiasy by się przydały przy blk(), tak samo blke() ?

  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

@Treker Tak, funkcje blk() i blke() odpowiadają za mruganie.

@Elvis Tak! O to właśnie chodziło! Dzięki wielkie! 😄

Teraz projekt jest nareszcie zakończony!

IMG_1414.rar

Dziękuję wam wszystkim za pomoc, w końcu projekt udał się lepiej niż się spodziewałem 😄 

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...