Per Fingerprint Modul über Arduino den Zugriff auf Servo ansteuern

Sich per Fingerabdruck zu authentifizieren, ist heutzutage kein großer Aufwand mehr. Hier wird gezeigt wie in wenigen Schritten, ein simuliertes elektronisches Schloss, somit ohne Schlüssel etwas auf oder zu schließen kann.
Es ist das Fingerprint Optical Sensor Module JM-101b, das es ermöglicht, mit einem Arduino Uno Clone, in diesem Beispiel einen Servomotor SG90, zu steuern.
Auch ein Relais mit angeschlossenem elektronischem Türschloss wäre möglich.
Im Video wird gezeigt, wie das Module angelernt wird und wie der Betrieb eingerichtet wird.

Quelle: BSI

Details zur Funktionsweise dieser Fingerabdruckerkennung kann man beim Bundesamt für Sicherheit (BSI) finden.

Microcontrollerboard: Elegoo Uno R3
Fingerprint Optical Sensor: Module JM-101b
Servomotor: SG90

optional: elektrisches Türschloss

Adafruit Bibliotheke: https://github.com/adafruit/Adafruit_…

Quellcode:

// Schloss mit Fingerprint Module oeffnen

#include <Adafruit_Fingerprint.h>
#include <Servo.h>
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
Servo servoschloss;
void setup()  
{
  //pinMode (6,OUTPUT);
  //pinMode (8,OUTPUT);
  servoschloss.attach(9);
  servoschloss.write(75); // Startposition des Servo
  Serial.begin(9600);
  
  Serial.println("\n\nAdafruit finger detect test");

  // set the data rate for the sensor serial port
  finger.begin(57600);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
  Serial.print(F("Security level: ")); Serial.println(finger.security_level);
  Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
  
  finger.getTemplateCount();

  if (finger.templateCount == 0) {
    Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
  } 
  else {
    Serial.println("Waiting for valid finger...");
      Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  }
}

void loop()                     // schleife 
{
  getFingerprintID();
  delay(50);            //don't ned to run this at full speed.
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }
  
  // OK converted!
  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
    if(finger.fingerID==2)  {     
      servoschloss.write(110); //oeffnen mit dem Winkel 110°
      delay(3000); //Das Programm stoppt fuer 3 Sekunden
      servoschloss.write(75); //schließen mit dem Winkel 75°
       }
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    //digitalWrite(8,HIGH);    delay(2000);    digitalWrite(8,LOW);    
    return p;
  }   
  
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence); 

  return finger.fingerID;
}

// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;
  
  // found a match!
  
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID; 
}
, ,