Parçalar · 10 dk okuma

Parmak İzi Sensörü Arduino: AS608, R307 ve Kapı Kilidi Yapımı

Parmak izi sensörü Arduino ile nasıl kullanılır? AS608/R307 kablo renkleri, Adafruit Fingerprint ile kayıt ve doğrulama, röleli kilit, ESP32 ve hata çözümü.

Parmak izi sensörü, Arduino projelerine "kimsin?" sorusunu tek dokunuşla soran ve parmağını tanıdığında kapı, çekmece ya da kasa açabilen bir okuyucudur. Hobi elektroniğinde en yaygın modeller AS608 ve R307 tabanlı optik modüllerdir: parmağın görüntüsünü kendi içinde işler, parmak izlerini kendi belleğinde saklar ve Arduino'ya yalnızca "ID 3 ile eşleşti" gibi kısa bir cevap gönderir. Bu yüzden Arduino Uno gibi küçük bir kart bile yüzlerce kişilik bir parmak izi kilidini rahatça yönetebilir.

Bu rehberde sensörün nasıl çalıştığını, renkleri üreticiye göre değişen kablolarını nasıl doğru bağlayacağını, Adafruit Fingerprint kütüphanesiyle parmak izi kaydetmeyi (enroll) ve doğrulamayı, ID ile güven skorunun ne anlama geldiğini öğreneceksin. Ardından röle ve 12 V solenoid ile gerçek bir kapı kilidi kuracak, aynı işi ESP32 ve Raspberry Pi Pico ile yapacak ve meşhur "Did not find fingerprint sensor" hatasını adım adım çözeceksin.

AS608 optik parmak izi sensörü ve 6 kablolu bağlantı soketi
AS608 optik parmak izi sensörü: prizmalı okuma camı, görüntüyü işleyen DSP yongası ve ince kablolu soket seti. Kablo renkleri satıcıya göre değişir.

Parmak izi sensörü nedir, nasıl çalışır?

AS608 ve R307 gibi modüller optik sensörlerdir. Parmağını cama koyduğunda içerideki LED, camın altındaki prizmayı aydınlatır; parmak izinin tepeleri camla temas ettiği için ışığı farklı yansıtır, çukurları ise temas etmez. Küçük bir kamera bu deseni yaklaşık 500 dpi çözünürlükte gri tonlu bir görüntü olarak çeker. Modülün içindeki DSP yongası görüntüden çizgilerin bittiği ve çatallandığı noktaları (minutiae) çıkarır ve bunları birkaç yüz baytlık bir özellik dosyasına dönüştürür. Aynı parmaktan alınan iki özellik dosyası birleştirilince bir şablon (template) oluşur ve bu şablon, sensörün kendi flash belleğine bir ID numarasıyla kaydedilir.

Doğrulama sırasında sensör yeni görüntüyü yine özellik dosyasına çevirir ve kayıtlı şablonların hepsiyle karşılaştırır. Bu 1:N arama genellikle bir saniyenin altında biter; sonunda sensör eşleşen ID'yi ve eşleşmenin ne kadar güçlü olduğunu gösteren bir güven skorunu (confidence) gönderir. Önemli nokta şu: parmak izinin resmi Arduino'ya hiç gelmez, tüm ağır iş sensörde yapılır. Arduino seri port (UART) üzerinden yalnızca komut gönderir ve kısa cevaplar okur.

ÖzellikAS608 modülüR307FPM10A / ZFM-20
Besleme3,3 V4,2–6 V (genellikle 5 V)3,6–6 V
Kayıt kapasitesiGenellikle 300 (bazı kartlarda 162)1000162
HaberleşmeUART (TTL), varsayılan 57600 bpsUART (TTL), varsayılan 57600 bpsUART (TTL), varsayılan 57600 bps
Dokunma algılama piniVar (WAK + Vt)Var (Touch + 3.3VT)Çoğunda yok
Güvenlik seviyesi1–51–51–5
Hatalı kabul oranı (FAR)< %0,001< %0,001< %0,001
Arduino kütüphanesiAdafruit FingerprintAdafruit FingerprintAdafruit Fingerprint

Tablodaki değerler satıcıya ve kart sürümüne göre değişebilir, özellikle kapasite. En güvenilir yöntem, aşağıdaki test kodunu çalıştırıp sensörün kendi bildirdiği kapasiteyi okumaktır. Üç kavramı da netleştirelim: ID, şablonun bellekteki sıra numarasıdır (0'dan kapasitenin bir eksiğine kadar); güvenlik seviyesi, 1 (en hoşgörülü) ile 5 (en sıkı) arasında eşleşme eşiğini belirler; güven skoru ise her doğrulamada sensörün verdiği benzerlik puanıdır.

Kablo renkleri ve besleme: hangi kablo nereye?

Parmak izi sensörlerinde en çok yapılan hata, kablo renklerinin standart olduğunu sanmaktır. Aynı model sensör bir satıcıda kırmızı-siyah-sarı-beyaz, başka bir satıcıda kırmızı-siyah-yeşil-mavi kabloyla gelebilir; Adafruit bile farklı sensör sürümleri için farklı renk düzenleri listeler. Bu yüzden renge değil, sensörün arkasındaki ya da soketin yanındaki pin yazılarına ve satıcının şemasına bak. AS608 modüllerinde genellikle 6 pin bulunur: V+ (Vi), TX, RX, GND, WAK (Touch) ve Vt (3.3VT). Temel kullanım için yalnızca ilk dördü yeterlidir.

Sensör piniGöreviArduino UnoESP32Raspberry Pi Pico
V+ / Vi / VCCBesleme3.3V (AS608) ya da 5V (R307)3V3 (R307 için 5V/VIN)3V3(OUT) (R307 için VBUS)
GNDToprakGNDGNDGND
TXSensörden veri çıkışıD2 (SoftwareSerial RX)GPIO 16 (RX2)GP1 (UART0 RX)
RXSensöre veri girişiD3 (SoftwareSerial TX)GPIO 17 (TX2)GP0 (UART0 TX)
WAK / TouchParmak algılandı sinyali (isteğe bağlı)D4GPIO 27GP2
Vt / 3.3VTDokunma devresinin beslemesi (isteğe bağlı)3.3V3V33V3(OUT)
AS608 kartlarının çoğu 3,3 V ile çalışır; üzerinde 3.3V yazan bir sensöre 5 V vermek onu kalıcı olarak bozabilir. R307 ise 5 V ister ve 3,3 V'ta çoğu zaman hiç cevap vermez. Arduino Uno'nun 3.3V pini resmi olarak yalnızca 50 mA verebilir; optik sensör görüntü alırken akımı yükselir (Adafruit kendi optik sensörü için 120 mA'e kadar çalışma akımı belirtir). Kart rastgele resetleniyor ya da sensör ara sıra kayboluyorsa sensörü AMS1117 gibi harici bir 3,3 V regülatörden besle ve GND'leri birleştir. Uno'nun D3 pini 5 V çıkış verdiği için 3,3 V'luk bir sensörün RX hattına 1 kΩ + 2 kΩ'luk bir gerilim bölücü koymak en güvenli yoldur.

WAK (ya da Touch) pini, sensörün çok az akım çeken dokunma algılama devresine bağlıdır. Vt pinine 3,3 V verildiğinde parmak cama değdiği anda seviyesini değiştirir; çoğu modülde HIGH olur, bazılarında LOW, bu yüzden kendi kartında dene. Pille çalışan bir kilitte ana beslemeyi bir MOSFET ile kesip yalnızca Vt'yi açık bırakabilir, WAK sinyaliyle mikrodenetleyiciyi uykudan uyandırıp sensörü ancak o zaman çalıştırabilirsin.

Adafruit Fingerprint kütüphanesini kurmak

  1. Arduino IDE'de Araçlar > Kütüphaneleri Yönet menüsünü aç, Adafruit Fingerprint Sensor Library ara ve kur. Kütüphane eklemeyi hiç yapmadıysan Arduino'ya Kütüphane Ekleme yazısına göz at.
  2. Kütüphane AS608, R307, R503, FPM10A ve ZFM serisi gibi aynı komut setini kullanan sensörlerin hepsiyle çalışır; kod değiştirmen gerekmez.
  3. Dosya > Örnekler menüsünde enroll (kayıt), fingerprint (doğrulama), delete (tek kaydı silme) ve emptyDatabase (hepsini silme) örneklerini bulursun.
  4. Uno ve Nano'da sensör, USB'nin kullandığı 0 ve 1 numaralı pinleri meşgul etmemek için SoftwareSerial ile D2 ve D3'e bağlanır. Mega, Leonardo ve ESP32 gibi ikinci donanım seri portu olan kartlarda Serial1 ya da Serial2 kullanılır.

İlk test: sensör bulunuyor mu?

Kayda geçmeden önce sensörün Arduino ile konuştuğundan emin olalım. Aşağıdaki kod sensörü önce varsayılan 57600 bps hızında arar, bulamazsa diğer yaygın hızları dener. Sensörü bulduğunda hangi hızda cevap verdiğini, bildirdiği kapasiteyi, güvenlik seviyesini ve kayıtlı parmak izi sayısını Seri Monitör'e yazar. Seri Monitör'ü 9600 baud'a ayarlamayı unutma; bu, sensörün hızından bağımsızdır.

C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2#include <SoftwareSerial.h>
3
4SoftwareSerial fpSerial(2, 3);            // D2 = RX (sensör TX), D3 = TX (sensör RX) / D2 = RX (sensor TX), D3 = TX (sensor RX)
5Adafruit_Fingerprint finger(&fpSerial);
6
7const uint32_t rates[] = {57600, 9600, 19200, 38400, 115200};   // denenecek hızlar / baud rates to try
8
9void setup() {
10  Serial.begin(9600);
11  Serial.println(F("Sensor araniyor / searching for sensor..."));
12  bool found = false;
13  for (uint8_t i = 0; i < 5 && !found; i++) {
14    finger.begin(rates[i]);               // 1 sn bekler, portu açar / waits 1 s, opens the port
15    if (finger.verifyPassword()) {        // sensör cevap verdi mi? / did the sensor answer?
16      Serial.print(F("Bulundu / found @ "));
17      Serial.println(rates[i]);
18      found = true;
19    }
20  }
21  if (!found) {
22    Serial.println(F("Did not find fingerprint sensor :("));
23    while (1) delay(1);
24  }
25  finger.getParameters();                 // kapasite ve ayarları oku / read capacity and settings
26  Serial.print(F("Kapasite / capacity: "));
27  Serial.println(finger.capacity);
28  Serial.print(F("Guvenlik / security level: "));
29  Serial.println(finger.security_level);
30  finger.getTemplateCount();              // kayıtlı şablon sayısı / number of stored templates
31  Serial.print(F("Kayitli iz / templates: "));
32  Serial.println(finger.templateCount);
33}
34
35void loop() {
36}

Parmak izi kaydetme (enroll) adım adım

Kayıt sırasında sensör aynı parmağın iki ayrı görüntüsünü alır, bunları iki ayrı tampona (CharBuffer1 ve CharBuffer2) özellik dosyası olarak koyar, ikisini birleştirip şablon oluşturur ve şablonu seçtiğin ID'ye yazar. Adafruit'in hazır enroll örneği ID'yi 1–127 aralığında sorar ve tek baytlık bir değişkende tutar. Aşağıdaki sadeleştirilmiş sürüm ID'yi 16 bit tutar ve üst sınırı sensörün gerçek kapasitesinden alır; böylece 300 ya da 1000 kayıtlı sensörlerin tamamını kullanabilirsin. Kütüphanedeki adımlar şöyledir:

  1. getImage(): Parmak cama konana kadar görüntü almaya çalışır; parmak yoksa FINGERPRINT_NOFINGER döner.
  2. image2Tz(1): İlk görüntüyü özellik dosyasına çevirip 1 numaralı tampona koyar.
  3. Parmak kaldırılır ve aynı parmak yeniden konur; image2Tz(2) ikinci görüntüyü 2 numaralı tampona koyar.
  4. createModel(): İki tamponu karşılaştırıp birleştirir; parmaklar uyuşmazsa FINGERPRINT_ENROLLMISMATCH döner.
  5. storeModel(id): Şablonu sensörün flash belleğine kalıcı olarak yazar; elektrik kesilse de silinmez.
C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2#include <SoftwareSerial.h>
3
4SoftwareSerial fpSerial(2, 3);            // D2 = RX, D3 = TX
5Adafruit_Fingerprint finger(&fpSerial);
6
7void setup() {
8  Serial.begin(9600);
9  finger.begin(57600);
10  if (!finger.verifyPassword()) {
11    Serial.println(F("Did not find fingerprint sensor :("));
12    while (1) delay(1);
13  }
14  finger.getParameters();                 // gerçek kapasiteyi öğren / learn the real capacity
15  Serial.println(F("Kayit modu / enroll mode"));
16}
17
18// Parmak gelene kadar bekle, görüntüyü tampona çevir / wait for a finger, convert the image into a buffer
19bool captureTo(uint8_t slot) {
20  while (finger.getImage() != FINGERPRINT_OK) delay(50);
21  uint8_t p = finger.image2Tz(slot);
22  if (p != FINGERPRINT_OK) {
23    Serial.print(F("Goruntu kotu / bad image, kod / code 0x"));
24    Serial.println(p, HEX);
25    return false;
26  }
27  return true;
28}
29
30void loop() {
31  Serial.print(F("ID gir / enter ID (1-"));
32  Serial.print(finger.capacity - 1);
33  Serial.println(F("):"));
34  while (!Serial.available()) delay(10);
35  uint16_t id = Serial.parseInt();
36  while (Serial.available()) Serial.read();   // satır sonunu temizle / clear the line ending
37  if (id == 0 || id >= finger.capacity) return;
38
39  Serial.println(F("Parmagini koy / place your finger"));
40  if (!captureTo(1)) return;
41  Serial.println(F("Kaldir / remove your finger"));
42  delay(1000);
43  while (finger.getImage() != FINGERPRINT_NOFINGER) delay(50);   // parmak kalkana kadar / until the finger is lifted
44
45  Serial.println(F("Ayni parmagi tekrar koy / place the same finger again"));
46  if (!captureTo(2)) return;
47
48  uint8_t p = finger.createModel();       // iki görüntüyü birleştir / merge the two images
49  if (p == FINGERPRINT_ENROLLMISMATCH) {
50    Serial.println(F("Fingerprints did not match"));
51    return;
52  }
53  if (p != FINGERPRINT_OK) return;
54
55  p = finger.storeModel(id);              // sensörün flash belleğine yaz / write to the sensor's flash
56  if (p == FINGERPRINT_OK) {
57    Serial.print(F("Kaydedildi / stored, ID #"));
58    Serial.println(id);
59  } else {
60    Serial.print(F("Kayit hatasi / store error 0x"));
61    Serial.println(p, HEX);
62  }
63}
Seri Monitör'e ID'yi yazıp Enter'a bas ve yönergeleri izle. İyi bir kayıt, sonraki bütün doğrulamaların kalitesini belirler: parmağını camın ortasına, çok bastırmadan koy ve ikinci görüntüde açıyı çok az değiştir. Her gün kullanılacak bir kilitte aynı parmağı iki farklı ID ile (bir kez düz, bir kez hafif yan) kaydetmek reddedilme oranını belirgin şekilde düşürür. Hangi ID'nin kime ait olduğunu not et; sensör yalnızca numara bilir, isim bilmez.

Parmak izi doğrulama: ID ve güven skoru

Doğrulamada önce getImage() ile görüntü alınır, image2Tz() ile özellik dosyasına çevrilir, ardından kayıtlı şablonlar arasında arama yapılır. Kütüphanede iki arama fonksiyonu vardır: fingerFastSearch() hızlıdır ama kütüphanenin gönderdiği komut yalnızca ilk 163 kaydı (ID 0–162) tarar; fingerSearch() ise getParameters() ile okunan kapasitenin tamamında arar. 162'den büyük ID kullanacaksan fingerSearch() kullan ve setup() içinde mutlaka getParameters() çağır; aksi halde kütüphane kapasiteyi varsayılan 64 kabul eder ve yalnızca ilk 64 kaydı arar.

Arama başarılı olduğunda finger.fingerID eşleşen kaydın numarasını, finger.confidence ise güven skorunu verir. Eşleşme kararını sensör zaten güvenlik seviyesine göre kendisi verir; skor yalnızca eşleşmenin ne kadar güçlü olduğunu gösterir. İyi kaydedilmiş bir parmakta skor genellikle birkaç onluk ile birkaç yüz arasında çıkar. Daha sıkı bir kilit istersen setSecurityLevel(4) ya da setSecurityLevel(5) ile eşiği yükseltebilir veya kodunda ek bir alt sınır koyabilirsin (ör. 50'nin altını reddet). Eşiği yükseltmek yanlış kişinin kabul edilme ihtimalini azaltır ama doğru kişinin reddedilme ihtimalini artırır; dengeyi kendi parmaklarınla deneyerek bul.

Dönüş koduSeri Monitör mesajıAnlamı ve çözüm
FINGERPRINT_OK (0x00)Image taken / Stored!İşlem başarılı.
FINGERPRINT_NOFINGER (0x02)No finger detectedCamda parmak yok; döngüde beklemeye devam et.
FINGERPRINT_PACKETRECIEVEERR (0x01)Communication errorCevap paketi alınamadı; kabloyu, hızı ve beslemeyi kontrol et.
FINGERPRINT_IMAGEFAIL (0x03)Imaging errorGörüntü alınamadı; parmağı yeniden yerleştir.
FINGERPRINT_IMAGEMESS (0x06)Image too messyGörüntü bulanık; camı temizle, parmak çok ıslak ya da çok kuru olabilir.
FINGERPRINT_FEATUREFAIL (0x07)Could not find fingerprint featuresYeterli ayrıntı yok; parmağı ortala ve hafifçe bastır.
FINGERPRINT_NOTFOUND (0x09)Did not find a matchEşleşen kayıt yok; parmak kayıtlı değil ya da kötü kaydedilmiş.
FINGERPRINT_ENROLLMISMATCH (0x0A)Fingerprints did not matchKayıttaki iki görüntü uyuşmadı; işlemi tekrarla.
FINGERPRINT_BADLOCATION (0x0B)Could not store in that locationID kapasitenin dışında; getParameters() ile sınırı oku.
FINGERPRINT_FLASHERR (0x18)Error writing to flashSensörün belleğine yazılamadı; beslemeyi ve kabloları kontrol et.

Röle ve solenoid ile parmak izli kapı kilidi

Şimdi öğrendiklerimizi birleştirip yetkili parmakta kilidi 3 saniye açan, yetkisiz parmakta üç kez öten ve art arda 5 hatalı denemede sistemi 30 saniye kilitleyen bir kapı kilidi yapalım. Kilit olarak 12 V'luk bir solenoid kilit kullanıyoruz. Solenoid 0,5–1 A çektiği için Arduino pinine asla doğrudan bağlanmaz; araya bir röle modülü ya da lojik seviyeli bir MOSFET konur. Bağlantı şöyle: röle modülünün VCC ve GND pinleri Arduino'nun 5V ve GND'sine, IN pini D8'e, aktif buzzer D9'a, 12 V adaptörün artısı rölenin COM ucuna, rölenin NO ucu solenoidin artısına, solenoidin eksisi de adaptörün eksisine gider.

Solenoid bir bobindir ve akımı kesildiği anda yüksek bir ters gerilim üretir. Bu yüzden solenoidin uçlarına ters yönde bir 1N4007 diyot bağla; diyotun çizgili ucu artıya gelmeli. Röle yerine MOSFET kullanacaksan IRLZ44N gibi lojik seviyeli bir model seç ve 12 V kaynağın eksisini Arduino'nun GND'sine bağla. Ayrıntılar için MOSFET ile yüksek akım sürmek yazısına, MOSFET'in bacak sırası için Transistör Bacak Bağlantıları aracına bakabilirsin.

C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2#include <SoftwareSerial.h>
3
4SoftwareSerial fpSerial(2, 3);            // D2 = RX, D3 = TX
5Adafruit_Fingerprint finger(&fpSerial);
6
7const int RELAY_PIN = 8;                  // röle modülü IN / relay module IN
8const int BUZZER_PIN = 9;                 // aktif buzzer / active buzzer
9const uint8_t RELAY_ON = LOW;             // çoğu röle modülü LOW ile çeker / most relay modules switch on LOW
10const uint8_t RELAY_OFF = HIGH;
11const uint16_t MIN_CONFIDENCE = 50;       // ek güven eşiği / extra confidence threshold
12const unsigned long OPEN_MS = 3000;       // kilidin açık kalma süresi / unlock time
13
14uint8_t failCount = 0;
15
16void setup() {
17  digitalWrite(RELAY_PIN, RELAY_OFF);     // açılışta kilitli kalsın / stay locked at power-up
18  pinMode(RELAY_PIN, OUTPUT);
19  pinMode(BUZZER_PIN, OUTPUT);
20  Serial.begin(9600);
21  finger.begin(57600);
22  if (!finger.verifyPassword()) {
23    Serial.println(F("Did not find fingerprint sensor :("));
24    while (1) delay(1);
25  }
26  finger.getParameters();                 // fingerSearch için kapasite / capacity for fingerSearch
27}
28
29// Eşleşen ID; parmak yoksa -1, tanınmadıysa -2 / matching ID; -1 no finger, -2 not recognised
30int readFinger() {
31  if (finger.getImage() != FINGERPRINT_OK) return -1;
32  if (finger.image2Tz(1) != FINGERPRINT_OK) return -2;
33  if (finger.fingerSearch(1) != FINGERPRINT_OK) return -2;
34  if (finger.confidence < MIN_CONFIDENCE) return -2;
35  return finger.fingerID;
36}
37
38void beep(int count, int ms) {
39  for (int i = 0; i < count; i++) {
40    digitalWrite(BUZZER_PIN, HIGH);
41    delay(ms);
42    digitalWrite(BUZZER_PIN, LOW);
43    delay(ms);
44  }
45}
46
47void loop() {
48  int id = readFinger();
49  if (id >= 0) {
50    Serial.print(F("Hos geldin / welcome, ID #"));
51    Serial.print(id);
52    Serial.print(F(", guven / confidence "));
53    Serial.println(finger.confidence);
54    failCount = 0;
55    beep(1, 100);
56    digitalWrite(RELAY_PIN, RELAY_ON);    // kilidi aç / unlock
57    delay(OPEN_MS);
58    digitalWrite(RELAY_PIN, RELAY_OFF);   // yeniden kilitle / lock again
59  } else if (id == -2) {
60    failCount++;
61    Serial.println(F("Yetkisiz / not authorised"));
62    beep(3, 80);
63    if (failCount >= 5) {                 // 5 hatada 30 sn bekle / 30 s lockout after 5 failures
64      Serial.println(F("30 sn kilitli / locked for 30 s"));
65      delay(30000);
66      failCount = 0;
67    }
68    delay(1000);
69  }
70  delay(50);
71}
Bu proje öğrenmek ve hobi amaçlı kullanım için harikadır ama tek başına gerçek bir güvenlik sistemi değildir. Optik sensörler iyi hazırlanmış bir parmak izi kalıbıyla kandırılabilir, kablolara ulaşan biri de röleyi doğrudan tetikleyebilir. Gerçek bir kapıda elektronik kısmı içeride tut, mekanik bir anahtar ya da yedek açma yolu bırak ve elektrik kesilince kilidin ne yapacağını düşün: kutu tipi solenoidler genellikle güç yokken kilitli kalır, elektromıknatıslı kilitler ise açılır. Solenoidi uzun süre enerjili bırakma; bobin ısınır ve zarar görebilir.

ESP32 ile parmak izi sensörü: Serial2 bağlantısı

ESP32'nin üç donanım seri portu olduğu için SoftwareSerial'a gerek yoktur; sensörü UART2'ye (Serial2) bağlarsın. ESP32 3,3 V ile çalıştığı için AS608'in sinyal seviyeleriyle birebir uyumludur ve gerilim bölücü gerekmez. Dikkat etmen gereken tek nokta pinlerdir: güncel Arduino-ESP32 çekirdeğinde (3.x) Serial2'nin varsayılan pinleri, eski rehberlerdeki GPIO 16/17 değil, GPIO 4 (RX) ve GPIO 25 (TX)'tir. Bu yüzden Serial2.begin() içine pinleri açıkça yazmalısın; kütüphanenin begin() fonksiyonu daha önce ayarlanan pinleri korur. Kartının pin haritasını Pinout aracında görebilirsin.

C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2
3#define FP_RX 16                          // ESP32 RX2 <- sensör TX / sensor TX
4#define FP_TX 17                          // ESP32 TX2 -> sensör RX / sensor RX
5const int RELAY_PIN = 23;                 // röle modülü IN / relay module IN
6
7Adafruit_Fingerprint finger(&Serial2);
8
9void setup() {
10  Serial.begin(115200);
11  pinMode(RELAY_PIN, OUTPUT);
12  digitalWrite(RELAY_PIN, HIGH);          // LOW tetiklemeli röle kapalı / active-LOW relay off
13  Serial2.begin(57600, SERIAL_8N1, FP_RX, FP_TX);   // pinleri açıkça ver / set the pins explicitly
14  finger.begin(57600);                    // önceki pinleri korur / keeps the pins set above
15  if (!finger.verifyPassword()) {
16    Serial.println("Did not find fingerprint sensor :(");
17    while (true) delay(10);
18  }
19  finger.getParameters();
20  finger.getTemplateCount();
21  Serial.printf("Kapasite / capacity: %u, kayitli / stored: %u\n", finger.capacity, finger.templateCount);
22}
23
24void loop() {
25  if (finger.getImage() == FINGERPRINT_OK && finger.image2Tz(1) == FINGERPRINT_OK) {
26    if (finger.fingerSearch(1) == FINGERPRINT_OK) {
27      Serial.printf("ID #%u, guven / confidence %u\n", finger.fingerID, finger.confidence);
28      digitalWrite(RELAY_PIN, LOW);       // kilidi aç / unlock
29      delay(3000);
30      digitalWrite(RELAY_PIN, HIGH);      // yeniden kilitle / lock again
31    } else {
32      Serial.println("Did not find a match");
33      delay(1000);
34    }
35  }
36  delay(50);
37}

ESP32-WROVER modüllü kartlarda GPIO 16 ve 17 PSRAM'e bağlıdır; böyle bir kartta FP_RX ve FP_TX'i örneğin 25 ve 26 yap. ESP32-C3'te yalnızca iki UART olduğundan Serial2 yoktur; aynı kodu Serial1 ve istediğin iki pinle kullanabilirsin. Wi-Fi sayesinde her girişi saatiyle bir sunucuya kaydedebilir ya da tanınmayan bir parmakta Telegram botu ile telefonuna bildirim gönderebilirsin.

Raspberry Pi Pico ve MicroPython ile parmak izi sensörü

MicroPython için Adafruit kütüphanesinin resmi bir karşılığı yok, ama sensörün protokolü basit olduğu için birkaç satırla kendin konuşabilirsin. Her paket EF 01 başlangıç koduyla başlar; ardından 4 baytlık adres (varsayılan FF FF FF FF), paket tipi (01 komut, 07 cevap), 2 baytlık uzunluk, komut ve parametreler, en sonda da tip, uzunluk ve veri baytlarının toplamından oluşan 2 baytlık sağlama toplamı gelir. Cevabın ilk veri baytı onay kodudur: 00 başarılı, 02 parmak yok, 09 eşleşme yok. Aşağıdaki kod sensörü doğrular, kapasiteyi okur ve konan parmağı ID ve güven skoruyla tanır. Pico 3,3 V ile çalıştığı için AS608'i doğrudan 3V3(OUT) pinine bağlayabilirsin; Pico'ya yeni başlıyorsan Raspberry Pi Pico Nedir? yazısı iyi bir başlangıçtır.

MicroPython
1from machine import UART, Pin
2import time
3
4# GP0 = UART0 TX -> sensör RX, GP1 = UART0 RX <- sensör TX / sensor RX, sensor TX
5uart = UART(0, baudrate=57600, tx=Pin(0), rx=Pin(1), timeout=2000, timeout_char=100)
6HEADER = b'\xEF\x01\xFF\xFF\xFF\xFF'          # başlangıç kodu + adres / start code + address
7
8def command(*data):
9    while uart.any():                          # eski baytları at / drop stale bytes
10        uart.read()
11    length = len(data) + 2                     # veri + 2 bayt sağlama / data + 2-byte checksum
12    body = bytes([0x01, length >> 8, length & 0xFF]) + bytes(data)   # 0x01 = komut paketi / command packet
13    s = sum(body)
14    uart.write(HEADER + body + bytes([(s >> 8) & 0xFF, s & 0xFF]))
15    head = uart.read(9)                        # başlık + tip + uzunluk / header + type + length
16    if not head or len(head) < 9 or head[0] != 0xEF:
17        return None
18    n = (head[7] << 8) | head[8]
19    rest = uart.read(n)
20    if not rest or len(rest) < n:
21        return None
22    return rest[:-2]                           # sağlama hariç veri / data without checksum
23
24def ok(r):
25    return r is not None and r[0] == 0x00      # 0x00 = başarılı / success
26
27time.sleep(1)                                  # sensörün açılmasını bekle / let the sensor boot up
28if not ok(command(0x13, 0, 0, 0, 0)):          # VfyPwd: şifre 0 / password 0
29    print("Did not find fingerprint sensor")
30    while True:
31        time.sleep(1)
32
33p = command(0x0F)                              # ReadSysPara: sistem parametreleri / system parameters
34capacity = (p[5] << 8) | p[6] if ok(p) else 162
35print("Kapasite / capacity:", capacity)
36
37def identify():
38    if not ok(command(0x01)):                  # GenImg: parmak yoksa 0x02 / 0x02 = no finger
39        return None
40    if not ok(command(0x02, 1)):               # Img2Tz: CharBuffer1'e çevir / convert into CharBuffer1
41        return (-1, 0)
42    r = command(0x04, 1, 0, 0, capacity >> 8, capacity & 0xFF)   # Search: tüm kayıtlar / all records
43    if not ok(r):
44        return (-1, 0)                         # 0x09 = eşleşme yok / no match
45    return ((r[1] << 8) | r[2], (r[3] << 8) | r[4])   # (ID, güven / confidence)
46
47while True:
48    res = identify()
49    if res:
50        fid, score = res
51        if fid >= 0:
52            print("ID", fid, "guven / confidence", score)
53        else:
54            print("Eslesme yok / no match")
55        time.sleep(1)
56    time.sleep_ms(100)

"Did not find fingerprint sensor" hatası ve diğer sık sorunlar

Bu mesaj, kütüphanenin verifyPassword() komutuna sensörden geçerli bir cevap alamadığı anlamına gelir; sensörün bozuk olduğunu göstermez. Vakaların büyük çoğunluğu kablolamadan, beslemeden ya da yanlış hızdan kaynaklanır. Aşağıdaki tabloyu yukarıdan aşağıya doğru kontrol et:

BelirtiOlası nedenÇözüm
Did not find fingerprint sensor :(TX ve RX düz bağlanmışSensörün TX'i Arduino'nun RX'ine (D2), RX'i TX'ine (D3) gider. İki veri kablosunun yerini değiştirmek zarar vermez; dene.
Did not find fingerprint sensor :(Kablo renklerine güvenilmişKart üzerindeki pin yazılarına ya da satıcı şemasına göre yeniden bağla; GND'yi multimetreyle doğrula.
Did not find fingerprint sensor :(Yanlış ya da yetersiz beslemeAS608'e 3,3 V, R307'ye 5 V ver; Uno'nun 3.3V pini yetmiyorsa harici regülatör kullan ve GND'leri birleştir.
Did not find fingerprint sensor :(Sensör farklı bir hızdaİlk test kodundaki hız taramasını çalıştır, bulunan değeri finger.begin() içine yaz.
Did not find fingerprint sensor :(Sensörün şifresi değiştirilmişŞifreyi kurucuya ver: Adafruit_Fingerprint finger(&fpSerial, 0x12345678);
Mega ya da Leonardo'da sensör bulunamıyorSoftwareSerial her pinde veri alamazSerial1 kullan: Mega'da RX1 19, TX1 18; Leonardo'da RX 0, TX 1.
ESP32'de sensör bulunamıyorSerial2 varsayılan pinleri farklı ya da PSRAM çakışmasıSerial2.begin(57600, SERIAL_8N1, RX, TX) ile pinleri açıkça yaz; WROVER'da 16/17'yi kullanma.
Sık sık "Communication error"Gevşek soket, uzun ya da ince kabloKabloları kısa tut, breadboard yerine lehimli bağlantı kullan, beslemeye 100 µF kondansatör ekle.
Kayıtlı parmak sık reddediliyorKirli cam, kuru ya da ıslak parmak, tek açıdan kayıtCamı yumuşak bir bezle sil, aynı parmağı iki ID ile kaydet, gerekirse güvenlik seviyesini 2'ye düşür.
Sensör ısınıyor, LED hiç yanmıyorBesleme ters ya da AS608'e 5 V verilmişGücü hemen kes ve bağlantıyı düzelt; sensör zarar görmüş olabilir.
Sorunu hızla daraltmak için sensörü bir USB-TTL dönüştürücüye bağlayıp SFGDemo gibi bir Windows test programıyla denemek iyi bir yöntemdir: programda sensör görünüyorsa sorun Arduino tarafındaki kabloda ya da koddadır. Ayrıca Seri Monitör'ün hızı (9600) ile sensörün hızı (57600) farklı şeylerdir; ikisini karıştırma.

Waveshare UART parmak izi okuyucu: kısa not

Waveshare UART parmak izi okuyucu modülü ve kontrol kartı
Waveshare UART Fingerprint Reader: optik sensör, şerit kabloyla STM32F205 işlemcili ayrı bir kontrol kartına bağlanır; kartta VCC, GND, TXD, RXD, BL ve RST pinleri bulunur.

Waveshare'in UART parmak izi okuyucusu, görünüşü benzese de AS608 ve R307'den farklı bir protokol konuşur: komutlar 8 baytlıktır, 0xF5 ile başlayıp 0xF5 ile biter ve varsayılan hız 19200 bps'dir. Bu nedenle Adafruit Fingerprint kütüphanesiyle çalışmaz; Waveshare'in kullanım kılavuzundaki komut tablosu ve örnek kodları kullanılır. Kayıtta parmak üç kez okutulur, her kullanıcıya 1–3 arası bir yetki seviyesi atanabilir ve 1:N karşılaştırma tek bir komutla yapılır. Kart 3,3 V ya da 5 V ile beslenebilir; TXD'yi mikrodenetleyicinin RX'ine, RXD'yi TX'ine bağlarsın. Hazır kütüphane ve örnek bolluğu istiyorsan AS608 ya da R307, kendi protokol kodunu yazmaktan çekinmiyorsan Waveshare iyi bir seçimdir.

Parmak izi sensörü ile proje fikirleri

  • Parmak izli çekmece ya da kasa: Servo ya da solenoidle açılan, yetkisiz denemede alarm veren küçük bir kasa. Servolu kilit mekanizması için Servo Motor Nedir? yazısına bak.
  • İki aşamalı kapı: Önce parmak izi, ardından keypad ile PIN kodu isteyen daha güvenli bir giriş.
  • Kart ya da parmak: Aynı kilide bir RFID RC522 okuyucu ekleyerek kartı olanın kartla, olmayanın parmakla girmesi.
  • Yoklama sistemi: Okul ya da kulüp için her ID'yi bir isimle eşleştirip giriş saatlerini kaydetmek.
  • Ekranlı kilit: Karşılama mesajını ve kişinin adını bir OLED ekranda göstermek.
  • Ev alarmıyla birlikte: Parmak iziyle kurulup kapatılan bir Arduino alarm sistemi.

Parmak izi sensörü, birkaç kablo ve doğru kütüphaneyle projene gerçek bir kimlik katmanı ekler: önce sensörü test et, parmakları özenle kaydet, sonra röle ve solenoidle kilidi kur. BlueGrays uygulamasında akıllı elektronik kasa, RFID kimlik doğrulama, ESP32 RFID kapı kilidi ve keypad şifre uygulaması gibi güvenlik projelerini devre şemaları ve kodlarıyla adım adım bulabilir, parmak izi sensörünü eklemek için hazır bir temel edinebilirsin.

Sıkça sorulan sorular

Parmak izi sensörü kaç parmak izi kaydedebilir?

Modele göre değişir: AS608 kartları genellikle 300 (bazıları 162), R307 1000, FPM10A ve ZFM-20 ise 162 kayıt tutar. Kendi sensörünün kapasitesini öğrenmek için getParameters() fonksiyonunu çağırıp finger.capacity değerini Seri Monitör'e yazdır. Aynı parmağı iki ID ile kaydedersen iki yer harcadığını unutma.

Parmak izi sensörü 5V mu 3.3V mu çalışır?

AS608 kartlarının çoğu 3,3 V ister; R307 ise 4,2–6 V aralığında, genellikle 5 V ile çalışır. Sensörün üzerindeki yazıyı ve satıcının teknik bilgisini kontrol etmeden besleme verme. 5 V'luk Arduino'nun TX çıkışını 3,3 V'luk bir sensörün RX'ine bağlarken gerilim bölücü kullanmak en güvenlisidir.

Parmak izleri Arduino'da mı saklanır, elektrik kesilince silinir mi?

Hayır, şablonlar sensörün kendi flash belleğinde saklanır ve elektrik kesilince silinmez. Arduino'yu değiştirsen ya da yeni kod yüklesen bile kayıtlar sensörde kalır. Arduino tarafında yalnızca hangi ID'nin kime ait olduğunu tutman gerekir; istersen bunu EEPROM'a kaydedebilirsin.

"Did not find fingerprint sensor" hatası nasıl çözülür?

Önce TX ve RX'in çapraz bağlandığından emin ol: sensörün TX'i Arduino'nun RX pinine (Uno'da D2) gider. Sonra beslemenin doğru gerilimde ve yeterli akımda olduğunu, GND'lerin ortak olduğunu kontrol et. Hâlâ bulunamıyorsa sensör farklı bir hızda ya da şifreyle çalışıyor olabilir; farklı baud hızlarını deneyen bir test kodu çalıştır.

AS608 ile R307 arasındaki fark nedir?

İkisi de aynı komut setini kullanan optik sensörlerdir ve Adafruit Fingerprint kütüphanesiyle aynı kodla çalışır. Temel farklar besleme ve kapasitededir: AS608 kartları genellikle 3,3 V ile çalışır ve yaklaşık 300 kayıt tutar, R307 ise 5 V ile çalışır ve 1000 kayıt tutabilir. Bağlamadan önce pin sırasını kendi modelinin etiketinden kontrol et.

Kayıtlı bir parmak izi nasıl silinir?

Tek bir kaydı silmek için finger.deleteModel(id), tüm kayıtları silmek için finger.emptyDatabase() fonksiyonunu kullan. Kütüphanedeki delete ve emptyDatabase örnekleri bu işi Seri Monitör üzerinden yapar. Silinen ID'ye daha sonra yeni bir parmak izi kaydedebilirsin.

Tüm projeleri gör
Akıllı Elektronik Kasa
#92İleri
Premium

Akıllı Elektronik Kasa

Değerli eşyalarını saklayabileceğin, şifreyle açılan küçük bir kasa. Tuş takımından dört haneli şifreni girersin; doğruysa servo motor kilidi açar, yeşil ışık yanar ve ekran kasanın durumunu yazar, he

4.7(42)
63
ESP32 RFID Kapı Kilidi (RC522 + Servo + OLED + Buzzer + LED)
#137İleri
Premium

ESP32 RFID Kapı Kilidi (RC522 + Servo + OLED + Buzzer + LED)

ESP32 ile RC522 RFID modülü, SG90 servo motoru, SSD1306 OLED ekran, aktif buzzer ve 2 LED kullanarak akıllı bir kapı kilidi yapıyoruz. Kart okutulduğunda, UID kod içinde tanımlı yetkili kartlar listesiyle karşılaştırılır — yetkiliyse servo motoru döndürerek kilit açılır (yeşil LED + 2 kısa bip), 5 saniye sonra otomatik kilitler. Yetkisiz kartta kırmızı LED yanar, 3 hızlı bip ile uyarı verir ve OLED'de yakalanan UID gösterilir. Gerçek IoT güvenlik senaryosu için pratik ve öğretici — SPI protokolü

4.8(9)
15
RFID Kimlik Doğrulama
#54Orta
Premium

RFID Kimlik Doğrulama

Apartman kapısındaki kartlı giriş gibi: RFID okuyucuya kartını yaklaştırırsın, Arduino kartın numarasını kayıtlı olanla karşılaştırır. Doğru kartta yeşil, yabancı kartta kırmızı LED üç saniye yanar ve

4.8(64)
83
RFID Değer Okuma
#53Başlangıç
Premium

RFID Değer Okuma

Apartman anahtarlığında ya da giriş kartında gizli bir kimlik numarası saklıdır; bu proje onu okur. Kartı RFID okuyucuya yaklaştırınca Arduino kartın numarasını bilgisayar ekranına yazar. Kartlı kapı

4.7(47)
61
4x4 Keypad LCD Ekran Şifre Uygulaması
#64İleri
Premium

4x4 Keypad LCD Ekran Şifre Uygulaması

Doğru şifreyi bilmeyenin giremediği küçük bir elektronik kapı kilidi. Kare tuşuna basıp şifreyi tuş takımından girersin; şifre doğruysa ekranda giriş izni yazar, yeşil LED yanar ve servo motor kapıyı

4.8(59)
75
ESP32 RFID RC522 Kart Okuyucu (LCD Ekranlı)
#123Orta

ESP32 RFID RC522 Kart Okuyucu (LCD Ekranlı)

Bu projede MFRC522 tabanlı RC522 RFID modülünü ESP32'ye SPI üzerinden bağlayıp kart/etiket UID'sini okuyacağız. Kapı kilidi, üyelik sistemi ve giriş kontrolü gibi uygulamaların temelini oluşturur. Okunan UID'yi LCD ekranda göstereceğiz; bu sürümde yetkili kart listesiyle karşılaştırma yapılmaz. DİKKAT: RC522 sadece 3.3V ile çalışır, 5V verirseniz modül yanar!

4.8(21)
39
Reed Röle Kapı Sensörü
#38Başlangıç
Premium

Reed Röle Kapı Sensörü

Kapın açık mı kapalı mı, bir ışığa bakarak anla. Kapıya küçük bir mıknatıs, kasaya da mıknatısı hisseden bir anahtar takarsın; kapı kapalıyken ikisi yan yana durur ve yeşil LED yanar, kapı açılıp mıkn

4.7(34)
44
ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)
#145İleri
Premium

ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)

PIR sensörü hareket algıladığında buzzer ve LED'i aktif eden, aynı anda Telegram üzerinden sahibine anlık bildirim gönderen akıllı bir güvenlik alarm sistemidir. Tekrarlayan alarmların sıklığını sınırlamak için 30 saniyelik cooldown (bekleme süresi) mekanizması vardır; bu mekanizma PIR sensörünün yanlış algılamalarını doğrulamaz veya ortadan kaldırmaz. Ev güvenliği, garaj izleme, depo veya çalışma odası gibi alanlarda kullanılabilir. Telegram entegrasyonu sayesinde nerede olursanız olun anında h

0.0(0)
9