您现在的位置是:首页 > 汽车

基于Arduino和RFID的汽车点火系统

2024-04-30 02:04:41

  现在大部分汽车都配备了无钥匙进入和一键式点火系统,您只需将钥匙放在口袋里,只需将手指放在门把手上的电容传感器上即可打开车门。在此项目中,我们通过使用 RFID 和指纹传感器为该系统添加了更多安全功能。RFID 传感器将验证用户的许可证,指纹传感器仅允许授权人员进入车辆。

  对于这个基于指纹的汽车点火系统,我们使用带有 R305 指纹传感器和 EM18 RFID 阅读器的 Arduino

  使用的材料

  Arduino纳米

  R305 指纹传感器

  EM18 RFID阅读器

  16*2 字母数字液晶屏

  直流电机

  L293D电机驱动IC

  Veroboard 或面包板(无论哪个可用)

  连接线

  12V直流电池

  EM18 RFID阅读器模块

poYBAGLnj8-AB5zkAAUNzdoMC5A446.png

  RFID代表射频识别。它指的是一种技术,其中数字数据被编码在 RFID 标签中,并且可以由 RFID 阅读器使用无线电波对其进行解码。RFID 类似于条形码,其中来自标签的数据由设备解码。RFID技术用于各种应用,如安全系统、员工考勤系统、 RFID门锁、基于RFID的投票机、收费系统等。

  EM18 Reader是一个可以读取存储在RFID标签中的ID信息的模块。RFID 标签存储一个 12 位唯一编号,当标签进入读取器的范围内时,该编号可由 EM18 读取器模块解码。该模块以 125 kHz 的频率运行,具有内置天线,并使用 5 伏直流电源供电

  它提供串行数据输出,范围为 8-12 厘米。串行通信参数为 8 个数据位、1 个停止位和 9600 波特率。

pYYBAGLnj8yAWn-SAAFS-J33A8o423.png

  EM18 特点:

  工作电压:+4.5V 至 +5.5V DC

  电流消耗:50mA

  工作频率:125KHZ

  工作温度:0-80℃

  通讯波特率:9600

  阅读距离:8-12厘米

  天线:内置

  EM18 引脚排列:

pYYBAGLnj8eAa5UNAABYn0iu-34526.png

  引脚说明:

  VCC:4.5-5V直流电压输入

  GND:接地引脚

  蜂鸣器:蜂鸣器或 LED 引脚

  TX:EM18 串行数据发送引脚,用于 RS232(输出)

  SEL:使用 RS232 必须为 HIGH(如果使用 WEIGAND,则为 LOW)

  数据0:WEIGAND数据0

  数据 1:WEIGAND 数据 1

  要了解有关 RFID 和标签的更多信息,请查看我们以前 基于 RFID 的项目。

  使用 Arduino 找出 RFID 标签唯一的 12 位代码

  在为Arduino 汽车点火系统编程 Arduino 之前,首先,我们需要找出 12 位 RFID 标签的唯一代码。正如我们之前所讨论的,RFID 标签包含一个 12 位的唯一代码,可以使用 RFID 阅读器对其进行解码。当我们在阅读器附近刷RFID标签时,阅读器将通过输出串口给出唯一代码。首先,根据电路图将 Arduino 连接到 RFID 阅读器,然后将以下给定代码上传到 Arduino。

  整数计数 = 0;

 

char card_no[12];
无效设置()
{
   序列号.开始(9600);
}
无效循环()
{
   如果(串行。可用())
   {
      计数 = 0;
      而(Serial.available() && 计数 < 12)
      {
         card_no[count] = Serial.read();
         计数++;
         延迟(5);
      }
      序列号.print(card_no);
   }
}

 

  成功上传代码后,打开串口监视器,将波特率设置为9600。然后在读卡器附近刷卡。然后 12 位代码将开始显示在串行监视器上。对所有使用过的 RFID 标签执行此过程,并记下它以供将来参考。

  电路原理

  该基于指纹的点火系统的电路图如下所示:

poYBAGLnj8GAVf29AAGtmaOaPgc889.png

  就我而言,我已将完整的电路焊接在 perf 板上,如下所示:

pYYBAGLnj7-AU5jOAAmDMu60E3w435.png

  指纹传感器模块

  指纹传感器模块或指纹扫描仪 是一个模块,它捕获指纹图像,然后将其转换为等效模板,并由 Arduino 将它们保存到其内存中的选定 ID(位置)上。在这里,所有过程都由 Arduino 控制,例如拍摄指纹图像、将其转换为模板、存储位置等。

pYYBAGLnj7iAFVadAAK0altPhZk032.png

  我们之前使用相同的 R305 传感器构建了投票机、考勤系统、安全系统等。您可以在此处查看所有基于指纹的项目。

  将指纹注册到传感器:

  在继续程序之前,我们需要安装指纹传感器所需的库。在这里,我们使用“ Adafruit_Fingerprint.h ”来使用 R305 指纹传感器。所以首先使用下面给出的链接下载库:

  Adafruit 指纹传感器库

  成功下载后,在 Arduino IDE 中,转到文件》 工具 》 包含库 》 添加 .zip 库,然后选择 zip 文件位置以安装库。

  成功安装库后,请按照以下步骤在传感器内存中注册新指纹。

  1.在 Arduino IDE 中,转到文件》示例》 Adafruit 指纹 传感器 库》注册。

  2.将代码上传到Arduino,打开串口监视器,波特率为9600。

  重要提示:将程序中的软件串行引脚更改为 SoftwareSerial mySerial(12, 11)。

  3.您应该输入要存储指纹的指纹 ID。因为这是我的第一个指纹,所以我在左上角输入 1,然后单击发送按钮。

poYBAGLnj7SAZzkCAAERCp64N0U583.png

  4.然后指纹传感器上的灯会闪烁,表示您应该将手指放在传感器上,然后按照串行监视器上显示的步骤操作,直到它确认您成功注册。

RFID无钥匙点火编程

此生物识别点火系统的完整代码在本教程的末尾给出。在这里,我们将解释代码的几个重要部分。

首先是包含所有必需的库。在我的例子中,我包含了“ Adafruit_Fingerprint.h ”用于使用 R305 指纹传感器。然后配置将连接指纹传感器的串行端口。就我而言,我已将 12 声明为 RX 引脚,将 11 声明为 TX 引脚。

 

#include  
#include  
SoftwareSerial mySerial(12,11); 
Adafruit_Fingerprint 手指 = Adafruit_Fingerprint(&mySerial);

 

在下一步中,声明将在整个代码中使用的所有变量。然后用 Arduino 定义 LCD 连接引脚,然后声明LiquidCrystal类的对象。

 

字符输入[12];
整数计数 = 0;
整数a = 0;
const int rs = 6, en = 7, d4 = 2, d5 = 3, d6 = 4, d7 = 5; 
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

 

接下来,在loop() 中,编写代码以获取 RFID 标签的唯一 12 位代码,并将它们存储在一个数组中。在这里,数组的元素将与内存中存储的唯一代码进行匹配,以获取经过身份验证的人员详细信息。

 

计数 = 0; 
    while (Serial.available() && count < 12) 
    { 
      input[count] = Serial.read(); 
      计数++;
      延迟(5);
    }

 

poYBAGLnj6uAGWuyAAQepqX1SMk948.png

  然后,将接收到的数组与存储的标签代码进行比较。如果代码匹配,那么许可证被认为是有效的,这允许用户放置有效的指纹。否则,它将显示无效的许可证。

 

if ((strncmp(input, "3F009590566C", 12) == 0) && (a == 0)) 
      { 
        lcd.setCursor(0, 0); 
        lcd.print("许可证有效"); 
        lcd.setCursor(0, 1); 
        lcd.print("欢迎"); 
        延迟(1000);
        a = 1; 
        指纹(); 
      }

 

在下一步中,将编写一个函数getFingerprintID ,该函数将为已注册的指纹返回一个有效的指纹 ID。

 

int getFingerprintID() 
{ 
  uint8_t p = finger.getImage(); 
  如果(p!= FINGERPRINT_OK)返回-1;
  p = 手指.image2Tz(); 
  如果(p!= FINGERPRINT_OK)返回-1;
  p = finger.fingerFastSearch(); 
  如果(p!= FINGERPRINT_OK)返回-1;
  返回finger.fingerID;
}

 

在RFID 匹配成功后调用的函数指纹()内部,调用getFingerprintID函数以获取有效的指纹 ID。然后使用if-else 循环进行比较,得到经过身份验证的人员数据的信息,如果数据匹配,则车辆被点燃,否则将提示输入错误的指纹。

 

int指纹ID = getFingerprintID(); 
        延迟(50);
        if (fingerprintID == 1) 
        { 
          lcd.setCursor(0, 0); 
          lcd.print("已授予访问权限"); 
          lcd.setCursor(0, 1); 
          lcd.print("车辆启动"); 
          数字写入(9,高);
          数字写入(10,低);
          而(1);
        }

 

  这就是这个RFID 汽车点火系统的工作原理,它为您的汽车增加了两层安全性。

pYYBAGLnj6KAVuO2AAWVNErxJS8701.png

#include 
#include 
字符输入[12];
整数计数 = 0;
整数a = 0;
const int rs = 6, en = 7, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySerial(12,11);
Adafruit_Fingerprint 手指 = Adafruit_Fingerprint(&mySerial);
无效设置()
{
  pinMode(9,输出);
  pinMode(10,输出);
  数字写入(9,低);
  数字写入(10,低);
  序列号.开始(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("欢迎来到");
  lcd.setCursor(0, 1);
  lcd.print("电路文摘");
  延迟(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("请刷卡");
  lcd.setCursor(0, 1);
  lcd.print("你的许可证");
}
无效循环()
{
  if (Serial.available())
  {
    计数 = 0;
    while (Serial.available() && count < 12)
    {
      输入[计数] = Serial.read();
      计数++;
      延迟(5);
    }
    如果(计数 == 12)
    {
      if ((strncmp(input, "3F009590566C", 12) == 0) && (a == 0))
      {
        lcd.setCursor(0, 0);
        lcd.print("许可证有效");
        lcd.setCursor(0, 1);
        lcd.print("欢迎");
        延迟(1000);
        a = 1;
        指纹();
      }
      否则 if ((strncmp(input, "0B0028883E95", 12) == 0) && (a == 0))
      {
        lcd.setCursor(0, 0);
        lcd.print("许可证有效");
        lcd.setCursor(0, 1);
        lcd.print("欢迎");
        延迟(1000);
        a = 1;
        指纹();
      }
      别的
      {
        如果 (a != 1)
        {
          lcd.setCursor(0, 0);
          lcd.print("许可证无效");
          lcd.setCursor(0, 1);
          lcd.print("再试一次!!!");
          延迟(2000);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("请刷卡");
          lcd.setCursor(0, 1);
          lcd.print("你的许可证");
        }
      }
    }
  }
}
int getFingerprintID()
{
  uint8_t p = finger.getImage();
  如果(p!= FINGERPRINT_OK)返回-1;
  p = 手指.image2Tz();
  如果(p!= FINGERPRINT_OK)返回-1;
  p = finger.fingerFastSearch();
  如果(p!= FINGERPRINT_OK)返回-1;
  返回finger.fingerID;
}
无效指纹()
{
  手指.开始(57600);
        而(a==1)
        {
        int指纹ID = getFingerprintID();
        延迟(50);
        如果(指纹 ID == 1)
        {
          lcd.setCursor(0, 0);
          lcd.print("已授予访问权限");
          lcd.setCursor(0, 1);
          lcd.print("车辆启动");
          数字写入(9,高);
          数字写入(10,低);
          而(1);
        }
        else if (fingerprintID == 2)
        {
          lcd.setCursor(0, 0);
          lcd.print("已授予访问权限");
          lcd.setCursor(0, 1);
          lcd.print("车辆启动");
          数字写入(9,高);
          数字写入(10,低);
          而(1);
        }
        别的
        {
          lcd.setCursor(0, 0);
          lcd.print("请放置一个");
          lcd.setCursor(0, 1);
          lcd.print("有效手指");
        }
        }
}