Главная - Компьютеры
Биометрический замок – настройка сканера и программирование микроконтроллера. Самодельный биометрический замок с отпечатком пальца на входную гаражную дверь Сканер отпечатков пальцев для разных шаблонов ардуино

Так как у меня нет машины, то мне не нужно везде носить с собой ключи. Из-за этого оказывалось, что я несколько раз оказывался без ключей вне дома и мне приходилось ждать, пока кто-либо из родственников вернётся домой и впустит меня, и в какой-то момент я решил, что нужно что-то с этим сделать и сконструировал самодельный гаражный замок.

В этом проекте я расскажу, как сделать замок с отпечатком пальца на входную дверь.

Шаг 1: Материалы


Вот список необходимых материалов и инструментов.

Электроника:

  • Сканер отпечатков пальцев (и коннектор JST)
  • Набор LCD (c ATmega328)
  • ATtiny85
  • NPN-транзистор
  • Динамик-пищалка
  • Провод для спикера
  • Кейс (в шаге 9 будут файлы для 3Д-печати)
  • Медная плёнка
  • Регулятор напряжения 5V
  • Батарейка 9V
  • Коннектор для батарейки 9V
  • SPDT-выключатель

Для удобства я приложу готовый вишлист на сайте Sparkfun.

Инструмент:

  • Паяльник и припой
  • Изолента
  • Провода и джамперы
  • Кусачки / стриппер
  • Плата прототипирования
  • Разные резисторы
  • Винты
  • Дрель
  • Несколько светодиодов для тестирования
  • Плата FTDI 5V
  • Пистолет с горячим клеем
  • Доступ к 3Д-принтеру
  • Опционально: сокет для интегральных схем (8-пиновый для ATtiny и 28-пиновый для ATmega)
  • Опционально: еще одна плата Ардуино / конденсатор 10uF (подробности в шаге 5)

Шаг 2: Схема устройства






Приобретённый в Sparkfun LCD-набор шёл с ATmega328, управляющей дисплеем. ATmega328 достаточно мощна и может быть использована не только для управления дисплеем, но и для других задач. Ввиду этого мы можем использовать её вместо Ардуино для коммуникации со сканером отпечатков пальцев и отправки команд на ATtiny85, управления дисплеем и пищалкой.

Чтобы биометрический дверной замок не работал всё время, я встроил в него выключатель, срабатывающий в тот момент, когда кейс закрывается. Если кейс закрыт — питание на девайс не подается, и мы экономим ресурсы батарейки.

Важная заметка: Сканнер отпечатков пальцев работает при напряжении 3.3V, так что я рекомендую использовать разделитель напряжения, который будет преобразовывать сигналы от ATmega к 3.2V. Разделитель напряжения состоит из резистора на 560 Ом между D10 / вторым пином сканера и резистором на 1 КОм между GND / вторым пином сканера.

Распиновка LCD:

  • D10 — пин 1 сканера (черный провод)
  • D11 — пин 2 сканера (через разделитель напряжения)
  • D12 — ATtiny85
  • D13 — Пищалка

Распиновка ATtiny85:

  • Пин 5 (0 в коде программы) — вход с ATmega
  • Пин 3 (4 в коде программы) — транзистор / желтый светодиод
  • Пин 7 (2 в коде программы) — светодиод индикации

Шаг 3: Собираем компоненты из LCD-набора

Название шага говорит само за себя: handy-dandy quick start/assembly guide

Шаг 4: Собираем схему на плате прототипирования




Размещение компонентов на плате остается за вами, просто старайтесь припаивать провода так, чтобы они смотрели в одну сторону и не заламывались.

После сборки я покрыл верх и низ платы горячим клеем — это закрепило и изолировало элементы схемы. Горячий клей не повредит микросхему.

Как и с основной платой, припаяйте все к плате ATtiny и нанесите горячий клей для закрепления и изоляции компонентов. Регулятор напряжения может очень сильно греться, поэтому будет хорошей идеей не наносить горячий клей на него и поверхности, располагающиеся рядом с ним. Также лучше не покрывать горячим клеем плату ATtiny, ведь вы можете захотеть снять и перепрограммировать её.

Шаг 5: Программирование ATmega328

Как уже говорилось в шаге 2, у ATmega328 достаточно сильный процессор и достаточно пинов для управления LCD, в то время как он управляет другими дополнительными компонентами. Чтобы добиться этого, нужно запрограммировать чип.

Если у вас есть Arduino Uno или Duemilanove, вы можете просто снять с них чип и заменить его тем, который шел в наборе. Либо вы можете найти плату FTDI Basic Breakout (5V) и припаять насадки к её стороне (смотрите картинки в шаге 3)

Также вам нужно будет залить код в режиме «Duemilanove w/ ATmega328».

Код внизу — рабочая программа для проверки работоспособности девайса.

#include "LiquidCrystal.h" LiquidCrystal lcd(2,3,4,5,6,7,8); void setup() { pinMode(9, OUTPUT); //подсветка pinMode(13, OUTPUT); //пищалка lcd.begin(16, 2); //16 знаков в ширину, 2 в высоту digitalWrite(9, HIGH); //включаем подсветку lcd.print(" Hello world! "); //центрируйте текст при помощи пробелов delay(2000); } void loop() { //пищалка включается и выключается, её состояние отображается на дисплее lcd.clear(); lcd.print(" Buzzer is on "); tone(13, 262, 1000); delay(1000); lcd.clear(); lcd.print(" Buzzer is off "); delay(1000); } Файлы

Шаг 6: Настраиваем сканер отпечатков пальцев

Для коммуникации со сканером я использовал эту библиотеку . Прямая ссылка на скачивание .

Для проверки работоспособности кода загрузите эту программу проверки «миганием».

У сканера отпечатков есть своя встроенная память для хранения данных. Так что после того, как вы убедитесь, что сканер работает, загрузите эту программу, чтобы добавить ваш отпечаток в базу данных под id #0. Откройте последовательную консоль и просто следуйте инструкциям.

Программа мигания светодиода для проверки сканера

/* Этот простой код включит и выключит светодиод. Он используется для того, чтобы понять, работает ли коммуникация. */ #include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Настройка железа - сканер пальцев соединён с: //цифровым пином 10(arduino rx, fps tx) //цифроывм пином 11(arduino tx - резистор 560ohm fps tx - резистор 1000ohm - GND) //это понижает 5v tx примерно до 3.2v и мы не сожжем наш сканер FPS_GT511C3 fps(10, 11); void setup(){ Serial.begin(9600); fps.UseSerialDebug = true; // вы сможете увидеть сообщения на последовательном дебаг-экране fps.Open(); } void loop(){ // тест мигания светодиодов для сканера fps.SetLED(true); // включает LED внутри сканера delay(1000); fps.SetLED(false);// выключает LED внутри сканера delay(1000); }

Программа регистрации данных в сканер

#include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Настройка железа - сканер пальцев соединён с: //цифровым пином 10(arduino rx, fps tx) //цифроывм пином 11(arduino tx - резистор 560ohm fps tx - резистор 1000ohm - GND) //это понижает 5v tx примерно до 3.2v и мы не сожжем наш сканер FPS_GT511C3 fps(10, 11); void setup(){ Serial.begin(9600); delay(100); fps.Open(); fps.SetLED(true); Enroll(); } void Enroll(){ // Тест регистрации // поиск открытого id int enrollid = 0; fps.EnrollStart(enrollid); // регистрация Serial.print("Press finger to Enroll #"); Serial.println(enrollid); while(fps.IsPressFinger() == false) delay(100); bool bret = fps.CaptureFinger(true); int iret = 0; if (bret != false) { Serial.println("Remove finger"); fps.Enroll1(); while(fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger again"); while(fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); fps.Enroll2(); while(fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger yet again"); while(fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); iret = fps.Enroll3(); if (iret == 0) { Serial.println("Enrolling Successfull"); } else { Serial.print("Enrolling Failed with error code:"); Serial.println(iret); } } else Serial.println("Failed to capture third finger"); } else Serial.println("Failed to capture second finger"); } else Serial.println("Failed to capture first finger"); } void loop(){ delay(100000); } Файлы

Шаг 7: Программируем ATtiny85


ATtiny85 — это что-то типа дешевого Ардуино, собранного в одном чипе. ATtiny85 может быть запрограммирована другим Ардуино, включая ATmega328, который есть в нашем наборе LCD. В проекте он используется для запуска очень простых команд: проверить сигнал с ATmega и открыть ворота, если сигнал правильный.

Чтобы запрограммировать его, подключите всё согласно приложенным фотографиям. Затем скачайте необходимые файлы и следуйте этой инструкции .

После загрузки кода, пин 13 на Ардуино (встроенный светодиод) должен загореться, оповещая, что код загружен.

Итоговый код:

//Получает краткий сигнал от основного модуля для закрытия реле void setup(){ pinMode(2,OUTPUT); //LEd индикации через резистор на 10K pinMode(4,OUTPUT); //пин странзистора, открывающий гараж pinMode(0,INPUT); //ввод delay(500); //даём девайсу время для старта digitalWrite(2, HIGH); //LED индикации } void loop(){ if(digitalRead(0)){ //простой паттерн для переключения транзистора delay(125); if(digitalRead(0)==false){ delay(55); //ждём, так как таймер ATtiny не идеален if(digitalRead(0)){ delay(55); if(digitalRead(0)==false){ delay(55); if(digitalRead(0)){ delay(55); if(digitalRead(0)==false){ digitalWrite(4, HIGH); //транзистор "нажимает" кнопку delay(1000); digitalWrite(4,LOW); digitalWrite(2,LOW); delay(1000); digitalWrite(2, HIGH); } } } } } } } Файлы

Шаг 8: Итоговый код

Ниже приложена программа для Ардуино, которую я написал с использованием библиотек сканера и дисплея. Чтобы было понятно, что происходит в каждой части программы, я постарался закомментировать всё наилучшим образом. После загрузки этого кода всё должно заработать и всё что останется сделать — интегрировать систему в дверь.

Предупреждение: если библиотека сканера не работает, то попробуйте использовать старую версию IDE Ардуино .

Код для ATmega238:

#include "LiquidCrystal.h" //библиотека дисплея #include "FPS_GT511C3.h" //библиотека fps (сканера отпечатков) #include "SoftwareSerial.h" //используется библиотекой сканера //Настраиваем пины дисплея и сканера LiquidCrystal lcd(2, 3, 4, 5, 6, 7, 8); //распиновка дисплея FPS_GT511C3 fps(10, 11); //RX, TX boolean isFinger = false; //true если библиотека fps засечет палец на сканере //выходные пины const int buzzerPin = 13; const int backlightPin = 9; const int attinyPin = 12; const String idNames = { "self","Bro", "Ryan", "Mom", "Dad", "Auntie", "Grandma", "Zeide", "Person", "person", "Thumb"}; void setup(){ //настраиваем выходы pinMode(buzzerPin, OUTPUT); pinMode(backlightPin, OUTPUT); pinMode(attinyPin, OUTPUT); //для отладки //Serial.begin(9600); fps.UseSerialDebug = false; //становится true для отладки fps через последовательный порт //инициализация библиотек lcd.begin(16,2); digitalWrite(backlightPin, HIGH); //подсветка LCD fps.Open(); fps.SetLED(true); //светодиод на fps //звук загрузки for(int i=0; i<30; i++){ tone(buzzerPin, 50+10*i, 30); delay(30); } tone(buzzerPin, 350); //вывод стартового сообщения lcd.print("Put your finger "); //команда вывода на экран lcd.setCursor(0, 1); //устанавливаем курсор на нулевую колонку первой строки lcd.print(" on the scanner "); delay(150); noTone(buzzerPin); //останавливаем стартовый звук } void loop(){ //сканируем и распознаём отпечаток, когда приложен палец waitForFinger(); lcd.clear(); //очищаем экран и устанавливаем курсов в положение 0,0 fps.CaptureFinger(false); //захватываем отпечаток для идентификации int id = fps.Identify1_N(); //идентифицируем отпечаток и сохраняем id if(id <= 10){ lcd.print(" Access granted "); //сообщение об успехе lcd.setCursor(0,1); //выводим на экран имя когда дверь открывается String message = " Hey " + idNames + "!"; lcd.print(message); tone(buzzerPin, 262, 1000); delay(1500); //отправляем сигнал для открытия двери digitalWrite(attinyPin, HIGH); //первый импульс синхронизирует задержку (10ms) delay(5); digitalWrite(attinyPin, LOW); delay(3); digitalWrite(attinyPin, HIGH); //следующие два - открывают дверь delay(15); digitalWrite(attinyPin, LOW); delay(5); digitalWrite(attinyPin, HIGH); delay(10); digitalWrite(attinyPin, LOW); delay(1000); lcd.clear(); lcd.print("Don"t forget to "); lcd.setCursor(0,1); lcd.print(" shut me off! "); delay(2000); waitForFinger(); //нажмите чтобы продолжить запись while(true){ //сохраняет новый отпечаток //выводит сообщение на экран lcd.clear(); lcd.print(centerText("So you want to")); lcd.setCursor(0,1); lcd.print(centerText("scan a new one?")); delay(2000); //Скопировано и слегка модифицировано из примера регистрации данных: int enrollid = 11; //выбираете какой id переписать\создать //отпустите палец, когда хотите записать id/имя, напечатанное на экране waitForFinger(); //ждёт, когда будет нажат fps while(enrollid==11){ for (int i = 1; i1){ lcd.print(i); enrollid = i-1; break; } } } //предупреждение, если в данном слоте уже есть данные if(fps.CheckEnrolled(enrollid)){ lcd.clear(); lcd.print(" Warning! ID #"); lcd.print(enrollid); lcd.setCursor(0,1); lcd.print(" has data. OK? "); delay(2500); waitForFinger(); //ждёт, когда будет нажат fps fps.DeleteID(enrollid); //удаляет данные delay(100); } //Enroll fps.EnrollStart(enrollid); lcd.clear(); lcd.print("Place finger to "); lcd.setCursor(0,1); lcd.print("enroll #"); lcd.print(enrollid); //выводит id, который был добавлен waitForFinger(); //ждёт, когда будет нажат fps //захватывает отпечаток и сохраняет его в память трижды для точности данных bool bret = fps.CaptureFinger(true); //картинка высокого качества для записи int iret = 0; //в случае ошибки if (bret != false){ //первая регистрация lcd.clear(); lcd.print(" Remove finger "); fps.Enroll1(); while(fps.IsPressFinger() == true) delay(100); //ждёт пока уберут палец lcd.clear(); lcd.print(" Press again "); waitForFinger(); //ждёт, когда будет нажат fps bret = fps.CaptureFinger(true); if (bret != false){ //вторая регистрация lcd.clear(); lcd.print(" Remove finger "); fps.Enroll2(); while(fps.IsPressFinger() == true) delay(100); lcd.clear(); lcd.print("Press yet again "); waitForFinger(); bret = fps.CaptureFinger(true); if (bret != false){ //третья регистрация iret = fps.Enroll3(); if (iret == 0){ //проверяет, были ли какие-нибудь ошибки lcd.clear(); lcd.print(" Success! "); delay(2000); beep(); //выключает Ардуино } else{ //запускает этот код в случае любой ошибки lcd.clear(); lcd.print("Fail. Try again "); delay(1000); } } lcd.clear(); lcd.print(" Failed 3rd "); //ошибка на третьей записи delay(1000); } lcd.clear(); lcd.print(" Failed 2nd "); //ошибка на второй записи delay(1000); } lcd.clear(); lcd.print(" Failed 1st "); //ошибка на первой записи delay(1000); } } else{ lcd.print("Fingerprint is"); //если отпечаток не распознан lcd.setCursor(0,1); lcd.print(" unverified "); delay(2000); lcd.clear(); lcd.print("Please try again"); lcd.setCursor(0,1); lcd.print("Use your pointer"); //pointer - указательный палец (можете использовать любой и заменить это слово) delay(500); } delay(250); } void beep(){ //издаёт звуки, чтобы кто-нибудь закрыл кейс lcd.clear(); lcd.print("Please close the"); lcd.setCursor(0,1); lcd.print(" case! "); for(int i=0;i=80 && !fps.IsPressFinger()){ beep(); } } timer = 0; //обнуляет таймер как только функция завершится } String centerText(String s) { //центрует текст на дисплее, чтобы он лучше смотрелся while(16-s.length()>1){ //если текст нуждается в центровке s = " " + s + " "; //равномерно добавляет пробелы с обеих сторон } return s; } Файлы

Для создания простой биометрической системы безопасности для защиты вашего автомобиля от несанкционированного доступа нам понадобится датчик отпечатков пальцев и микроконтроллер Arduino. Данный проект использует учебный материал Adafruit. Для облегчения повторения используется полный программный код из этого материала, с небольшими изменениями.

Для начала мы модифицируем пусковую систему транспортного средства. Основным соединением является проводник IG от замка зажигания, по которому подается напряжение питания на регулятор напряжения, далее на микроконтроллер Arduino для его включения и выключения и сканирования пальца на датчике в течение 10 секунд. При совпадении отпечатка пальца система активирует релейный блок, который управляет реле стартера. Теперь вы можете завести двигатель. Через 10 секунд датчик, реагирующий на отпечатки пальцев, отключается. Вы можете включить его повторно, повторив цикл запуска зажигания. Если в течение 10 секунд датчик не определил отпечаток пальца или отпечаток не совпадает с эталонным, тогда система запуска отключается, и пуск двигателя не происходит.

Поскольку каждое транспортное средство имеет свою систему конфигурации запуска, то вам необходимо проконсультироваться с электриком по электрооборудованию автомобиля или просмотреть электрическую схему до модификации системы запуска двигателя.

Примите во внимание, что датчик, реагирующий на отпечатки пальцев, не запускает двигатель. Он всего лишь активирует и деактивирует реле стартера, которое запрещает или разрешает запуск двигателя.

В данном проекте противоугонное устройство устанавливается на 2-х дверный купе Mitsubishi Lancer 2000.

Шаг 1: Используемые компоненты

Шаг 4: Загрузка основной программы

Подключите датчик, реагирующий на отпечатки пальцев, как показано на схеме и загрузите основную программу. Подключите светодиод и резистор к выводу 12 для контроля правильности выполнения операций.

Программа работает по принципу учебного материала Adafruit Fingerprint. Однако я немного изменил программный код и добавил таймер для отключения датчика через 10 секунд, чтобы избежать отвлечения внимания от мигающего светодиода датчика.

Шаг 5: Сборка, часть 1

Выкрутите винты под приборной панелью. Ослабьте рычаг механизма выключения запора капота. Снимите нижнюю часть приборной панели. В свободное место поместите датчик.

Шаг 6: Сборка, часть 2

Отмерьте требуемое расстояние и вырежьте небольшую зону для надежной установки датчика.

Шаг 7: Сборка, часть 3

Плату с Arduino Uno лучше всего установить за датчиком определения отпечатков пальцев. Я немного подточил посадочное место, чтобы плата Arduino Uno заняла правильное положение.

Что нужно

  1. Модуль отпечатков пальцев FPM10A
  2. RFID-модуль RC522
  3. Arduino mega (теоретически можно использовать и другие платы но я остановился на данной из-за количества выводов)
  4. 1 лицензия на 1С 8.2 (толстый клиент в моём случае, под тонкий пилите сами)
  5. Связь по Com порту с помощью MsCommLib.MsComm (нужна лицензия, ягуглится даже тут)
  6. Среда разработки для ардуино (использована 1.8.5)
  7. Планшет с USB интерфейсом.
  8. Обвязка: Резистор 1 Кило ОМ, кнопка на замыкание, проводочки, "синяя" изолента, терморектальный крипоанализатор по желанию (можно скрутить проводочки если с данным прибором вас связывают тесные непередаваемые ощущения), USB кабель для ардуиино, прямые руки и кривые извилины среднестатистического 1с ника в т.ч. для изготовления корпуса для всего этого чуда.

Примечания: на фото цвета проводов разнятся - в процессе монтажа порвал несколько проводов т.к. они были совсем Huawei и пришлось брать других доступных цветов.

Система сообщений дублируется в критических моментах специально.
Сразу предупреждаю что может у среднестатистического инженера могут потечь слезы из глаз из канифоли но это мой вообще первый Ардуино проект да еще и такой сложности и вроде оно работает и работает стабильно. Сначала была идея сделать всё через сеть (wifi + проводная) но прикинув затраты на отладку и создание своего http сервиса и внедрение всё в 1с я решил использовать com, в любом случае всю логику можно без изменения конфы вынести во внешнюю обработку.

Можно ещё вставить систему фотографирования входящего сотрудника через web камеру планшета, добавить реле и управлять электронными воротами, допилить интеграцию с ЗУП через внешнюю обработку, передаваемую через параметры запуска и аннигиляцию масленницы для особо опасных проходных секретной важности).

Полезная критика приветствуется.

Пролог

Видя цены на существующие пропусные системы и системы учета времени меня медленно начала душить зеленая сущность. Долго ходив около ардуинки и её модулей наткнулся на модуль отпечатков пальцев FPM10A. Данный модуль в зависимости от версии может запоминать большое количество отпечатков пальцев - от 50 до бесконечности её флеш памяти и используется в большинстве модулей производителей биометрического контроля. Однако в моём проекте из-за библиотеки оно ограниченно 254. Сразу предупреждаю что выкладываю свою измученно-найденную библиотеку для ардуино т.к. долго мучался с поиском и угробил 3 дня на поиски и отладку библиотеки для данного модуля.

Описание модулей

Библиотека, использованная в проекте позволяет использовать до 256 (byte) отпечатков пальцев. Мне это количество было избыточным, в крайнем случае можно использовать по 1 модулю на каждых 256 сотрудников.
Количество RFID меток ограниченно лишь уникальностью их UID т.к. база может хранится в 1С и привязанна к сотрудникам. Метки можно использовать все совместимые. Теоретически могут подходить всякие ключи от домофонов, карты метро и карты тройка.
Соединение с 1с идёт по com порту через библиотеку MsCommLib.MsComm но можно переписать под любую другую. Драйвера для com порта для Ардуинки должны ставится вместе со средой разработки ардуино но так же ягуглятся.
Всё спаенное прячется в коробку, связывается по сети (я использовал WiFi но можно и внешнюю USB сетевую карту использовать).

Алгоритм работы

Аппаратно:

  1. Модули ардуино спаиваем/скручиваем
  2. Подключаем к ПК-программатору и заливаем прошивку в арду, запускаем тест, убеждаемся в работоспособности команд
  3. Через USB соединяются с планшетом на Windows 10. На планшете заменяем либо через автозагрузку:

А) через батник:

    пуск - выполнить: shell:startup

    создаем там через "блокнот" файл с именем hz.bat и содержанием (уверен что сами справитесь с параметрами файловой базы - у меня sql): "C:\Program Files\1cv8\ ... \bin\1cv8.exe" ENTERPRISE /SServerName:Port\DBName" /NUser /PPassword

Б) более совершенный через замену шелла делаем через VB script (обязательно создайте кроме пользователя по умолчанию другого без запуска шелла):

    создаем через "блокнот" файл с именем C:\hz\hz.vbs и содержанием

set oShell=createobject("wscript.shell")
sCmd="""C:\Program Files\1cv8\ ... \bin\1cv8.exe"" ENTERPRISE /SServerName:Port\DBName" /NUser /PPassword"
oShell.run sCmd,true
sCmd="shutdown /r /t 0"
oShell.run sCmd

    пуск - выполнить: regedit, идём по ветке: Current User\Software\Microsoft\Windows NT\CurrentVersion\Winlogon

    добавляем строковый параметр "Shell" (REG_SZ)

    редактируем его: "wscript C:\hz\hz.vbs" (без кавычек в параметре)

    ребут и тест. 1с должна запускаться без explorera

  1. Далее убеждаемся в работоспособности и упаковываем в коробку

Программно:

  1. В обычном состоянии ардуино опрашивает сканер отпечатков пальцев, RFID сканер, кнопку администрирования и посылает по com порту команды ожидания.
  2. Как только в поле зрения считывателей появляется палец посылаем команду в com порт и 1с видит либо ID пальца, либо UID метки через чтение переменных.
  3. Кнопка нужна для администирования отпечатков. При её нажатии 1с опрашивает пароль-логин и дальше может присвоить сотруднику либо ID сканера либо UID карты через систему сообщений.

Для связи с 1с используется следующие строки (обработку я делал для своей конфы и своего табеля, она в проекте просто для примера но включена в исходники):

Подключение к com порту

Процедура СтартСистемы() ComPort = Новый COMОбъект("MsCommLib.MsComm"); Попытка ComPort.CommPort = 3; ComPort.Settings = "9600,N,8,1"; ComPort.Handshaking = 0; ComPort.InBufferCount = 0; ComPort.InBufferSize = 70; ComPort.InputLen = 0; ComPort.InputMode = 1; ComPort.NullDiscard = 0; ComPort.PortOpen = Истина; Исключение Предупреждение("Не возможно открыть порт!"); ЭтаФорма.Закрыть(); КонецПопытки; чСекунд = 0; ПодключитьОбработчикОжидания("ВывестиДанныеСПорта", 1, Ложь); // Подключим обработчик для мониторинга порта КонецПроцедуры

Отключение от com порта

Процедура КонецСистемы() ОтключитьОбработчикОжидания("ВывестиДанныеСПорта"); ComPort.PortOpen = Ложь; ComPort = ""; КонецПроцедуры

Считывание данных с com порта

Процедура ВывестиДанныеСПорта() Экспорт ДанныеСПорта = ""; Если ComPort.PortOpen Тогда //ComPort.Output = "1"; ДанныеСПорта = ComPort.Input; ОбработатьЗашифрованнуюСтроку(ДанныеСПорта); Если СокрЛП(ПредСотрудник) <> "" Тогда чСекунд = чСекунд + 1; КонецЕсли; Если чСекунд > 60 Тогда ПредСотрудник = 0; чСекунд = 0; КонецЕсли; Иначе Предупреждение("Порт не открывается"); ЭтаФорма.Закрыть(); КонецЕсли; КонецПроцедуры Процедура ОбработатьЗашифрованнуюСтроку(ДанныеСПорта) Массив = ДанныеСПорта.Выгрузить(); ИндексМин = ДанныеСПорта.GetLowerBound(0); ИндексМакс = ДанныеСПорта.GetUpperBound(0); СтрокаИнфо = ""; Для Индекс = ИндексМин По ИндексМакс - 1 Цикл СимволПолученный = СокрЛП(Массив.Получить(Индекс)); Если СимволПолученный = "13" Тогда Если Не Приостановить Тогда СтрокаИнфо = ОбработкаСтроки(СтрокаИнфо); //Тут обработка сообщений КонецЕсли; Иначе СтрокаИнфо = СтрокаИнфо + Символ(Число(СимволПолученный)); КонецЕсли; КонецЦикла; КонецПроцедуры

Отправка информации в com порт

Процедура ОтправитьВПорт(Отправить) Если ComPort.PortOpen Тогда ComPort.Output = СокрЛП(Отправить); Иначе Сообщить("Порт не открывается",СтатусСообщения.ОченьВажное); КонецЕсли; КонецПроцедуры

Код проекта для Arduino Mega

#include // подключаем библиотеку для работы с модулем отпечатков пальцев #include // подключаем библиотеку для работы с программным UART #include #include const int buttonPin = 2; // номер входа, подключенный к кнопке для входа в режим программирования int buttonState = 0; // переменная для хранения состояния кнопки int modeState = 0; // переменная для хранения состояния устройства. 0 - ожидание сканера отпечатков. 1 - программирование uint8_t id; // идентификационный номер, под которым будет сохранён шаблон отпечатка пальца String frcUID = ""; // идентификационный номер считывателя rfid int rfidYes = 0; // успешный ввод RFID SoftwareSerial mySerial(10, 11); // объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА(RX, TX); // Можно указывать любые выводы, поддерживающие прерывание PCINTx Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); // объявляем объект finger для работы с библиотекой Adafruit_Fingerprint ИМЯ_ОБЪЕКТА = Adafruit_Fingerprint(ПАРАМЕТР); // ПАРАМЕТР - ссылка на объект для работы с UART к которому подключен модуль, например: &Serial1 MFRC522 mfrc522(53, 5); // Create MFRC522 instance void setup() { pinMode(buttonPin, INPUT); // инициализируем пин, подключенный к кнопке, как вход Serial.begin(9600); // Инициализация аппаратного UART на скорости 9600 while (!Serial); // Ожидание инициализации аппаратного UART delay(500); SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader details delay(500); // Ожидание инициализации модуля отпечатков пальцев Serial.println(". . . Scan sensor . . ."); // Вывод сообщения "Поиск сенсора" finger.begin(57600); // Инициализация программного UART на скорости 57600 (скорость модуля по умолчанию) Serial.println(finger.verifyPassword()); if (finger.verifyPassword()) { Serial.println(". . . Found sensor! . . ."); // Если модуль отпечатков обнаружен, выводим сообщение "сенсор обнаружен" } else { Serial.println(". . . Did not find sensor . . ."); // Если модуль отпечатков не обнаружен, выводим сообщение "сенсор не обнаружен" и входим в бесконечный цикл: while(1); while (1); } Serial.println(". . . Please put your finger on the scanner or rfid . . ."); } void loop() { //Работа с кнопкой! buttonState = digitalRead(buttonPin); // считываем значения с входа кнопки if (buttonState == HIGH) { modeState = 1; // входим в режим программирования ДАЛЕЕ } switch (modeState) { case 0: frcUID = ""; //Работа в режиме опроса отпечатков пальцев и rfid if (finger.getImage() == FINGERPRINT_OK) { // Захватываем изображение, если результат выполнения равен константе FINGERPRINT_OK (корректная загрузка изображения), то проходим дальше if (finger.image2Tz() == FINGERPRINT_OK) { // Конвертируем полученное изображение, если результат выполнения равен константе FINGERPRINT_OK (изображение сконвертировано), то проходим дальше if (finger.fingerFastSearch() == FINGERPRINT_OK) { // Находим соответствие в базе данных отпечатков пальцев, если результат выполнения равен константе FINGERPRINT_OK (найдено соответствие), то проходим дальше frcUID = ". . . Found ID=" + String(finger.fingerID) + ", confidence=" + String(finger.confidence) + "! . . ."; Serial.println(frcUID); } } } if (mfrc522.PICC_IsNewCardPresent()) { delay(100); if (mfrc522.PICC_ReadCardSerial()) { //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); frcUID = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { frcUID = frcUID + (mfrc522.uid.uidByte[i]); } frcUID = ". . . Found RFID UID=" + frcUID + "@ . . ."; Serial.println(frcUID); } } delay(100); // Задержка перед следующим сканированием 0,5 сек (нет смысла запускать на полной скорости) Serial.println(". . . Please put your finger on the scanner or rfid . . ."); break; case 1: Serial.println(". . . Programming mode . . ."); // Входим в режим программирования delay(400); Serial.println(". . . Programming mode . . ."); // Входим в режим программирования delay(400); Serial.println(". . . Programming mode . . ."); // Входим в режим программирования delay(400); Serial.println(". . . Programming mode . . ."); // Входим в режим программирования id = readnumber(); // Ожидание получения цифры, введённой с COM-порта if (id >= 255) { // Если 255 (макс ид) то входим в режим ожидания снова modeState = 0; } else { if (id < 254) { // Если 254 то rfid иначе палец 0-253 modeState = 2; // Пытаемся отсканировать палец } else { modeState = 3; // Пытаемся отсканировать rfid uid } } break; case 2: while (!getFingerprintEnroll()); // Пытаемся получить ответ об присваивании ID modeState = 1; break; case 3: rfidYes = 0; Serial.println(". . . Put RFID in Scanner! . . ."); delay(400); Serial.println(". . . Put RFID in Scanner! . . ."); delay(400); Serial.println(". . . Put RFID in Scanner! . . ."); delay(5000); if (mfrc522.PICC_IsNewCardPresent()) { // Пытаемся отсканировать rfid uid delay(100); if (mfrc522.PICC_ReadCardSerial()) { //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); frcUID = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { frcUID = frcUID + (mfrc522.uid.uidByte[i]); } frcUID = ". . . New RFID UID=" + frcUID + "@ . . ."; rfidYes = 1; Serial.println(frcUID); delay(400); Serial.println(frcUID); delay(400); Serial.println(frcUID); delay(400); Serial.println(frcUID); } } if (rfidYes == 0) { Serial.println(". . . RFID error! . . ."); delay(400); } modeState = 1; break; } } // функция возвращает номер, введённый с COM-порта uint8_t readnumber(void) { int num = -1; // Переменная с номером, который требуется вернуть while (num < 0) { // Вход в цикл, пока переменная num не станет >= 0 while (!Serial.available()); // Ожидание пока в буфере COM-порта нет появятся данные while (Serial.available()) { // Цикл пока в буфере COM-порта не закончатся данные char c = Serial.read(); // Присваиваем очередной символ из COM-порта в переменную c if (isdigit(c)) { // Если значение переменной с - цифра, то... if (num < 0) { num = 0; // Увеличиваем значение num на один порядок } else { num *= 10; } num += c - "0"; // Прибавляем к значению num цифру из переменной c } delay(5); // Задержка на 5мс, чтоб в буфер COM-порта успели догрузиться следующие символы (если таковые имеются) } } return num; // Возвращение введённого числа } uint8_t getFingerprintEnroll() { int p; // Переменная для получения результатов выполнения функций //Загрузка первого изображения отпечатка пальца p = -1; Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" delay(400); Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" delay(400); Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" delay(400); Serial.println(". . . Please put your new finger on the scanner . . ."); // Вывод сообщения "Пожалуйста положите Ваш палец на сканер" while (p != FINGERPRINT_OK) { // Вход в цикл, пока переменная p не станет равна константе FINGERPRINT_OK (корректная загрузка изображения) p = finger.getImage(); // Захватываем изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println(" Ok!"); break; // Изображение отпечатка пальца корректно загрузилось case FINGERPRINT_NOFINGER: Serial.println(". . . Please put your new finger on the scanner . . ."); break;// Сканер не обнаружил отпечаток пальца case FINGERPRINT_PACKETRECIEVEERR: Serial.println(". . . Communication error . . ."); break; // Ошибка соединения case FINGERPRINT_IMAGEFAIL: Serial.println(". . . Imaging error Please try again . . ."); break; // Ошибка изображения default: Serial.println(". . . Unknown error Please try again . . ."); break; // Неизвестная ошибка } } //Конвертирование изображения первого отпечатка пальца p = finger.image2Tz(1); Serial.print (". . . Image converting . . ."); // Конвертируем первое изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println("Ok!"); 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(". . . No fingerprint on image . . ."); return p; // Ошибка конвертирования case FINGERPRINT_INVALIDIMAGE: Serial.println(". . . No fingerprint on image . . ."); return p; // Ошибка изображения default: Serial.println(". . . Unknown error . . ."); return p; // Неизвестная ошибка } //Просим убрать палец от сканера p = 0; while (p != FINGERPRINT_NOFINGER) { // Вход в цикл, пока переменная p не станет равна константе FINGERPRINT_NOFINGER (сканер не обнаружил отпечаток пальца) Serial.println(". . . Please remove your finger from the scanner . . ."); // Вывод сообщения "Пожалуйста уберите Ваш палец со сканера" delay(400); p = finger.getImage(); // Захватываем изображение и возвращаем результат выполнения данной операции в переменную p } Serial.println(" Ok!"); //Загрузка второго изображения отпечатка пальца p = -1; Serial.println(". . . Place same finger again . . ."); // Вывод сообщения "Пожалуйста положите тот же палец еще раз" delay(400); while (p != FINGERPRINT_OK) { // Вход в цикл, пока переменная p не станет равна константе FINGERPRINT_OK (корректная загрузка изображения) p = finger.getImage(); // Захватываем изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println(" Ok!"); break; // Изображение отпечатка пальца корректно загрузилось case FINGERPRINT_NOFINGER: Serial.println(". . . Place same finger again . . ."); break; // Сканер не обнаружил отпечаток пальца case FINGERPRINT_PACKETRECIEVEERR: Serial.println(". . . Communication error . . ."); break; // Ошибка соединения case FINGERPRINT_IMAGEFAIL: Serial.println(". . . Imaging error . . ."); break; // Ошибка изображения default: Serial.println(". . . Unknown error . . ."); break; // Неизвестная ошибка } } //Конвертирование изображения второго отпечатка пальца p = finger.image2Tz(2); Serial.print (". . . Image 2 converting . . ."); // Конвертируем второе изображение и возвращаем результат выполнения данной операции в переменную p switch (p) { // Проверка ответа... case FINGERPRINT_OK: Serial.println("Ok!"); 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(". . . No fingerprint on image . . ."); return p; // Ошибка конвертирования case FINGERPRINT_INVALIDIMAGE: Serial.println(". . . No fingerprint on image . . ."); return p; // Ошибка изображения default: Serial.println(". . . Unknown error . . ."); return p; // Неизвестная ошибка } //Создание модели (шаблона) отпечатка пальца, по двум изображениям p = finger.createModel(); Serial.print (". . . Creating model . . ."); // Создание модели (шаблона) отпечатка пальца, по двум изображениям if (p == FINGERPRINT_OK) { Serial.println(". . . Model create! Ok! . . ."); } else // Модель (шаблон) отпечатка пальца создана if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println(". . . Communication error . . ."); return p; } else // Ошибка соединения if (p == FINGERPRINT_ENROLLMISMATCH) { Serial.println(". . . Fingerprints did not match . . ."); return p; } else // Отпечатки пальцев не совпадают { Serial.println(". . . Unknown error . . ."); // Неизвестная ошибка return p; } //Сохранение, ранее созданной, модели (шаблона) отпечатка пальца, под определённым ранее, идентификационным номером p = finger.storeModel(id); //Serial.println(". . . Saving model . . ."); Serial.println(". . . Saving model . . ."); //Serial.println(". . . Saving model in ID="); Serial.print(id); Serial.print(": "); // Сохранение модели (шаблона) отпечатка пальца, по двум изображениям if (p == FINGERPRINT_OK) { frcUID = ". . . Model save in ID=" + String(id) + "! . . ."; Serial.println(frcUID); delay(1500); Serial.println(frcUID); delay(400); Serial.println(frcUID); delay(400); Serial.println(frcUID); } else // Модель (шаблон) отпечатка пальца сохранена if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println(". . . Communication error . . ."); return p; } else // Ошибка соединения if (p == FINGERPRINT_BADLOCATION) { Serial.println(". . . Could not store in that location . . ."); return p; } else // Не удалось сохранить в этом месте if (p == FINGERPRINT_FLASHERR) { Serial.println(". . . Error writing to flash . . ."); return p; } else // Ошибка записи в flash память { Serial.println(". . . Unknown error . . ."); // Неизвестная ошибка return p; } }

Эпилог

Цена планшета около 10 000 руб. (на самом деле от 7000 новые можно купить с 1 Gb ОЗУ но с 4Gb 1с будет поприятнее двигаться, я вообще взял б.у. с рук за 6000 в идеальном состоянии с 1Gb но повозился с оптимизацией).

Проходная делалась для мебельного производства поэтому корпус я изготовил там же. Думаю что можно напилить "смесь опилок с картоном" в магазине за 1 000 руб. и скрутить саморезами/склеить суперклеем. В крайнем случае можно взять готовый ящик (например электрошкафчик) и выпилить там окно.

Модули ардуинки и прочее около 2 000 руб.

Удовольствие от мозгового штурма и изготовления - бесценно!

Если вы используете относительно старое устройство, то не стоит расстраиваться раньше времени. Вместо того, чтобы обменивать старый ноутбук на более современный, с уже встроенным биометрическим датчиком, вы можете подключить к нему USB .

PQI Mini USB Fingerprint Reader это отличный выбор для тех, кто хочет дать старому оборудованию вторую жизнь. Сканер был создан специально для работы с новой функцией Hello, доступной на девайсах с Windows 10. Однако, устройство поддерживает и версии операционных систем Windows 7 и 8.

Одно из главных достоинств датчика в том, что он имеет возможность 360-градусного сканирования. Поэтому вам не придется беспокоиться о том, как лучше всего подключить устройство к ПК. Используйте ближайший USB порт и начинайте работу. Когда сканеру потребуется отпечаток пальца, то он автоматически повернется туда, куда нужно и сравнит полученные данные с сохраненной копией.

PQI Mini USB Fingerprint Reader может хранить в памяти до 10 различных профилей. Поэтому устройство отлично подходит для совместного использования или тех случаев, когда вам потребуется отсканировать дополнительный палец (если «основной» загрязнится или травмируется).

PQI Mini USB Fingerprint Reader доступен по вполне демократичной цене, что делает его отличным выбором для тех, кто ищет стартовую модель. Кроме того, сканер достаточно портативный, чтобы без особых проблем носить его с собой.

Verifi P2000 Fingerprint Reader

Если вы используете стационарный компьютер на котором не так просто добраться до USB портов, то обратите внимание на Verifi P2000 Fingerprint Reader. Он легко подключается к ПК, а главное его можно разместить недалеко от компьютера, для более комфортного использования.

Сканер изготовлен из ударопрочного металла и прослужит не один год. Несмотря на прочную конструкцию, у него хороший коэффициент распознавания отпечатков пальцев. Поэтому вам не придется постоянно менять положение пальца только для того, чтобы добиться полного совпадения. В большинстве случаев достаточно будет провести по датчику всего раз.

При создании модели P2000, компания Verifit планировала сделать прочное и долговечное устройство так, чтобы это не оказывало никакого влияния на процесс сканирования и точность распознавания результатов. Verifi P2000 Fingerprint Reader это достаточно портативное устройство, которое можно легко носить с собой. Кроме того, оно совместимо с куда большим количеством компьютеров, чем другие подобные модели.

Kensington VeriMark

Для невероятно маленького сканера отпечатков пальцев у Kensington VeriMark есть практически все, что нужно для комфортной работы. Модель может похвастаться поддержкой 360-градусного сканирования и небольшим размером. Но главное, что делает Kensington VeriMark таким ценным, дополнительный функционал.

Все полученные данные устройство хранит в зашифрованном виде. Когда датчик сканирует отпечаток пальца, он тут же его шифрует. Прервать данный процесс невозможно, поэтому взломать программное или аппаратное обеспечение и извлечь биометрические данные не получится.

Кроме того, устройство использует особый шаблон для расшифровки полученных сканов, который есть только у производителя. Это делает его более защищенным от хакерских атак и других попыток получения несанкционированного доступа.

Сканер поддерживает работу с относительно старыми портами независимо от версии выпуска. Если вы используете модель с , то при помощи адаптера USB-C к USB-A устройство можно подключить к относительно старому ноутбуку или компьютеру без поддержки более современных USB портов.

Benss Fingerprint Reader Analyzer

Benss Fingerprint Reader Analyzer это еще один сканер, который способен облегчить вам жизнь и избавить от кучи проблем. Как правило, более простые модели сперва делают один контрольный снимок, после чего сравнивают все последующие отпечатки с первоначальным результатом. Это значит, что если с оригинальным снимком (с которым сравниваются все другие сканы) что-то произойдет, то вероятность совпадения итоговых результатов сильно упадет.

Benss Fingerprint Reader Analyzer работает за счет самообучающегося алгоритма, который автоматически создает и обновляет ваш профиль при каждом касании. Чем дольше вы пользуетесь устройством, тем точнее будут результаты. Благодаря этому сканер труднее обмануть при помощи поддельных отпечатков пальцев. Так как датчик постоянно сканирует ваш палец и обновляет базу данных, то он сразу же обнаруживает попытки получения несанкционированного доступа.

Это одно из самых эффективных устройств для противостояния хакерским атакам. Его коэффициент ложного пропуска (False Acceptance Rate) составляет менее 0.002%, а это значит что для взлома устройства придется действительно постараться. В то же время, это не сильно осложняет работу, его коэффициент FRR (False Rejection Rate - отказ в доступе человеку, зарегистрированному в системе) составляет всего 3%.

IDEM BioScan Compact

Если вы ищите сканер с возможностями для кастомизации, то IDEM BioScan Compact вам точно понравится. Чтобы расширить его базовые возможности и получить дополнительный функционал, достаточно загрузить с официального сайта производителя специальное программное обеспечение.

После этого вы сможете шифровать на компьютере отдельные файлы и папки, а также хранить в специальной программе данные логинов и паролей для доступа к веб-сайтам. Так вы сможете авторизоваться на любых интернет порталах при помощи обычного прикосновения пальца к датчику.

Даже если не брать в расчет дополнительный функционал, то BioScan Compact считается достойной моделью. Устройство способно хранить до 10 различных отпечатков пальцев, может похвастаться небольшими габаритами, а также встроенной защитой для распознавания фальшивых биометрических данных.

Blucoil SecuGen Hamster Pro 20

Blucoil SecuGen Hamster Pro 20 — это идеальный сканер отпечатков пальцев для профессиональных нужд. Из-за того, что модель предлагает настройки повышенной безопасности, его стоимость почти в два раза выше других устройств из нашего списка.

Кроме того, это один из немногих сканеров с официальной поддержкой Linux. Поэтому неважно, какой именно операционной системой вы пользуетесь, датчик подходит для выполнения любых задач.

SecuGen Hamster Pro 20 — это ударопрочное устройство с защитой от царапин, попадания внутрь воды и пыли. Сканер способен отслеживать следы, оставшиеся после предыдущих проверок и отклонять нечеткие результаты.

Кроме того, Blucoil SecuGen Hamster Pro 20 является энергосберегающим устройством, поэтому автоматически выключается, если в течение долгого времени им никто не пользуется.

Дополнительная безопасность

За последние годы было выпущено огромное количество мобильных и десктопных устройств со встроенными сканерами отпечатков пальцев и с каждым годом их количество только растет. Если у вашего компьютера нет встроенного датчика для распознавания биометрических данных, то не стоит расстраиваться. Существует огромное множество USB-сканеров для ПК и ноутбуков, совместимых практически со всеми популярными моделями.

Для создания связи с датчиком отпечатков, была использована инструкция от Джоша Хоули (прямая загрузка инструкции ).

Чтобы отладить работу сканера отпечатков пальцев с буквенным табло, надо синхронизации.

Датчик отпечатков пальцев имеет собственную память для хранения отсканированных снимков. Так что после того, как датчик начнет работать, загрузите этот , добавив его в базу данных отпечатков пальцев под адресом 0. Откройте на компьютере консоль управления и следуйте всплывающим подсказкам.

Коды – Blink Example:

/* Library example for controlling the GT-511C3 Finger Print Scanner (FPS) */ #include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Hardware setup - FPS connected to: //digital pin 10(arduino rx, fps tx) //digital pin 11(arduino tx - 560ohm resistor fps tx - 1000ohm resistor - ground) //this brings the 5v tx line down to about 3.2v so we dont fry our fps FPS_GT511C3 fps(10, 11); void setup(){ Serial.begin(9600); fps.UseSerialDebug = true; // so you can see the messages in the serial debug screen fps.Open(); } void loop(){ // FPS Blink LED Test fps.SetLED(true); // turn on the LED inside the fps delay(1000); fps.SetLED(false);// turn off the LED inside the fps delay(1000); }

Коды – Enroll Example:

/* FPS_Enroll.ino - Library example for controlling the GT-511C3 Finger Print Scanner (FPS) */ #include "FPS_GT511C3.h" #include "SoftwareSerial.h" //Hardware setup - FPS connected to: //digital pin 10(arduino rx, fps tx) //digital pin 11(arduino tx - 560ohm resistor fps tx - 1000ohm resistor - ground) //this brings the 5v tx line down to about 3.2v so we dont fry our fps FPS_GT511C3 fps(10, 11); void setup(){ Serial.begin(9600); delay(100); fps.Open(); fps.SetLED(true); Enroll(); } void Enroll(){ // Enroll test // find open enroll id int enrollid = 0; fps.EnrollStart(enrollid); // enroll Serial.print("Press finger to Enroll #"); Serial.println(enrollid); while(fps.IsPressFinger() == false) delay(100); bool bret = fps.CaptureFinger(true); int iret = 0; if (bret != false) { Serial.println("Remove finger"); fps.Enroll1(); while(fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger again"); while(fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); fps.Enroll2(); while(fps.IsPressFinger() == true) delay(100); Serial.println("Press same finger yet again"); while(fps.IsPressFinger() == false) delay(100); bret = fps.CaptureFinger(true); if (bret != false) { Serial.println("Remove finger"); iret = fps.Enroll3(); if (iret == 0) { Serial.println("Enrolling Successfull"); } else { Serial.print("Enrolling Failed with error code:"); Serial.println(iret); } } else Serial.println("Failed to capture third finger"); } else Serial.println("Failed to capture second finger"); } else Serial.println("Failed to capture first finger"); } void loop(){ delay(100000); }

Файл синхронизации:

Файл регистрации эскизов:

Этап 7: программирование процессора ATtiny85

Микрочип ATtiny85 стоит дешево, и полностью совместим с платой Arduino, наверное, он самая лучшая электродеталь из когда-либо созданных!

Программатор Arduino также нужен, чтобы перепрошить микросхему ATmega328, которая управляет работой ЖК-дисплея.

В собираемом устройстве процессор ATtiny будет выполнять очень простые команды: проверять наличие сигнала от ATmega и открывать дверь гаража, когда сигнал будет подтвержден.

Чтобы запрограммировать работу процессора, его надо подключить при помощи макетной платы к программатору вместе с конденсатором 10 мкФ, как показано на картинке ниже.

А затем загрузить окончательный код и следовать рекомендациям инструкции от High-Low Tech .

После , выход 13 на плате Arduino, соединённый со светодиодом, нужно перевести в состояние HIGH для отслеживания работы по световой индикации.

Окончательный код для ATtiny :

//fpsAttiny by Nodcah //Recieves a brief signal from the main module to close a relay void setup(){ pinMode(2,OUTPUT); //indicator led through 10K resistor pinMode(4,OUTPUT); //trasistor pin that opens the garage pinMode(0,INPUT); //input delay(500); //give things time to start up digitalWrite(2, HIGH); //indicator LED } void loop(){ if(digitalRead(0)){ //simple pattern to trigger the transistor delay(125); if(digitalRead(0)==false){ delay(55); //the timings are off because the ATtiny"s timer isn"t perfect if(digitalRead(0)){ delay(55); if(digitalRead(0)==false){ delay(55); if(digitalRead(0)){ delay(55); if(digitalRead(0)==false){ digitalWrite(4, HIGH); //transistor "presses" the button delay(1000); digitalWrite(4,LOW); digitalWrite(2,LOW); delay(1000); digitalWrite(2, HIGH); } } } } } } }

Биометрический замок – окончательный код, вырезание крышки, подготовка гаража GPS часы на Arduino Биометрический замок – Схема и сборка ЖК дисплея



 


Читайте:



Как на смартфоне Нокиа Х2 две сим карты установить свою мелодию на нужный контакт

Как на смартфоне Нокиа Х2 две сим карты установить свою мелодию на нужный контакт

ibnlive.in.com Как поставить мелодию на Нокиа Люмиа? Люди задаются этим вопросом сразу после покупки телефона. Ведь, обычно, во всех современных...

Бесплатные программы для Windows скачать бесплатно

Бесплатные программы для Windows скачать бесплатно

Microsoft .NET Framework разработана для программ, которые работают на архитектуре «.NET». Первая ее версия вышла в 2002-м году в качестве аналога...

Как записать любой ISO-образ на флешку

Как записать любой ISO-образ на флешку

Здравствуйте, друзья! Сегодня вновь поговорим о создании загрузочной флешки.Как создать загрузочное USB-устройство? В каких целях его использовать...

Звонки с неизвестных номеров

Звонки с неизвестных номеров

В последнее время в России пользователи столкнулись с новым видом “спама”, при котором абоненту постоянно звонят и сбрасывают с неизвестных...

feed-image RSS