构建 Arduino 自动化收费闸系统(RFID + IR)

发布: (2025年12月29日 GMT+8 03:44)
13 min read
原文: Dev.to

Source: Dev.to

构建 Arduino 自动化收费闸系统(RFID + 红外)

简介

在这篇教程中,我将向大家展示如何使用 ArduinoRFID 阅读器和 红外(IR) 传感器来制作一个简易的自动化收费闸系统。系统的工作原理如下:

  1. 当车辆(或模型车)靠近闸门时,红外传感器检测到障碍物并触发闸门打开的准备工作。
  2. 车辆的 RFID 标签(或卡片)被读取器扫描。如果标签在白名单中,闸门会打开并允许车辆通过;否则闸门保持关闭并发出警报。
  3. 通过 舵机 控制闸门的升降,使用 蜂鸣器 提供声音提示,使用 LED 显示系统状态。

这个项目非常适合作为学习 Arduino、传感器融合以及基本的嵌入式编程的入门项目。

所需材料

编号零件备注
1Arduino Uno(或兼容板)主控板
2MFRC522 RFID 读取器读取 13.56 MHz RFID 卡/标签
3IR 发射/接收对(红外障碍传感器)检测车辆是否靠近
4舵机 SG90控制闸门的升降
5蜂鸣器(有源)声音提示
6LED(红/绿)状态指示
7220 Ω 电阻限流 LED
8面包板 + 跳线原型搭建
9电源(5 V USB 或外接电池)为 Arduino 供电
10RFID 卡/标签用作“通行证”

提示:如果你想让系统更稳固,可以把舵机和闸门机构装在 3D 打印的支架上,或使用小型的机械门。

电路连接

下面是各个元件的接线方式(不包括代码块):

  • MFRC522 RFID 读取器

    • SDA → Arduino Pin 10
    • SCK → Arduino Pin 13
    • MOSI → Arduino Pin 11
    • MISO → Arduino Pin 12
    • IRQ → 未使用(可留空)
    • GND → Arduino GND
    • RST → Arduino Pin 9
    • 3.3V → Arduino 3.3V
  • 红外障碍传感器(常见的模块版)

    • VCC → Arduino 5V
    • GND → Arduino GND
    • OUT → Arduino Pin 2(数字输入)
  • 舵机 SG90

    • 信号线 → Arduino Pin 6(PWM)
    • VCC → Arduino 5V(或外部 5 V 电源)
    • GND → Arduino GND
  • 蜂鸣器

    • 正极 → Arduino Pin 8
    • 负极 → Arduino GND
  • LED(绿)

    • 正极 → 220 Ω 电阻 → Arduino Pin 4
    • 负极 → GND
  • LED(红)

    • 正极 → 220 Ω 电阻 → Arduino Pin 5
    • 负极 → GND

注意:MFRC522 工作在 3.3 V,切勿直接接到 5 V,否则会损坏模块。

程序说明

下面的代码实现了以下功能:

  1. 初始化 所有外设(RFID、舵机、传感器、指示灯、蜂鸣器)。
  2. IR 传感器 检测到车辆靠近时,系统进入“等待 RFID”模式。
  3. 读取 RFID 卡号并与预设的白名单进行比对。
    • 若卡号在白名单内,舵机转到 打开 位置(闸门升起),绿灯亮起,蜂鸣器发出短促提示音。
    • 若卡号不在白名单,红灯亮起,蜂鸣器发出长音警报,闸门保持关闭。
  4. 当车辆通过后(IR 传感器返回低电平),闸门自动关闭并恢复待机状态。
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>

// 引脚定义
#define SS_PIN 10
#define RST_PIN 9
#define IR_PIN 2
#define SERVO_PIN 6
#define BUZZER_PIN 8
#define GREEN_LED 4
#define RED_LED 5

MFRC522 rfid(SS_PIN, RST_PIN);
Servo gateServo;

// 预设白名单(示例卡号)
byte authorizedUID[4][4] = {
  {0xDE, 0xAD, 0xBE, 0xEF},
  {0x12, 0x34, 0x56, 0x78},
  {0xAB, 0xCD, 0xEF, 0x01},
  {0x00, 0x11, 0x22, 0x33}
};

bool isAuthorized(byte *uid, byte uidSize) {
  for (byte i = 0; i < 4; i++) {
    bool match = true;
    for (byte j = 0; j < uidSize; j++) {
      if (uid[j] != authorizedUID[i][j]) {
        match = false;
        break;
      }
    }
    if (match) return true;
  }
  return false;
}

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();

  pinMode(IR_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);

  gateServo.attach(SERVO_PIN);
  gateServo.write(0); // 关闭位置

  digitalWrite(GREEN_LED, LOW);
  digitalWrite(RED_LED, LOW);
}

void loop() {
  // 检测车辆是否靠近
  if (digitalRead(IR_PIN) == HIGH) {
    // 车辆已到达,等待 RFID
    Serial.println("Vehicle detected, waiting for RFID...");
    while (!rfid.PICC_IsNewCardPresent()) {
      // 等待卡片出现
    }
    if (rfid.PICC_ReadCardSerial()) {
      Serial.print("Card UID: ");
      for (byte i = 0; i < rfid.uid.size; i++) {
        Serial.print(rfid.uid.uidByte[i], HEX);
        Serial.print(" ");
      }
      Serial.println();

      if (isAuthorized(rfid.uid.uidByte, rfid.uid.size)) {
        // 授权通过
        Serial.println("Access granted");
        digitalWrite(GREEN_LED, HIGH);
        digitalWrite(RED_LED, LOW);
        tone(BUZZER_PIN, 1000, 200); // 短促提示音
        gateServo.write(90); // 打开闸门
        delay(3000); // 保持打开 3 秒
        gateServo.write(0); // 关闭闸门
        digitalWrite(GREEN_LED, LOW);
      } else {
        // 未授权
        Serial.println("Access denied");
        digitalWrite(GREEN_LED, LOW);
        digitalWrite(RED_LED, HIGH);
        tone(BUZZER_PIN, 500, 1000); // 长音警报
        delay(2000);
        digitalWrite(RED_LED, LOW);
      }
      rfid.PICC_HaltA(); // 停止读取当前卡片
    }
  }
}

代码要点

行号说明
1‑3引入 SPIMFRC522(RFID)和 Servo 库。
9‑15定义所有使用的 GPIO 引脚。
18‑26创建一个 4 条授权 UID(卡号)的白名单数组。
28‑38isAuthorized() 函数遍历白名单,判断读取到的 UID 是否匹配。
40‑55setup() 中完成硬件初始化、舵机复位、指示灯关闭等准备工作。
57‑84loop() 主循环:
• 检测 IR 传感器是否被触发。
• 若检测到车辆,等待 RFID 卡片。
• 读取卡片 UID 并调用 isAuthorized() 判断。
• 根据结果控制舵机、LED、蜂鸣器。

系统演示

  1. 车辆靠近:红外传感器输出 HIGH,Arduino 打印 “Vehicle detected, waiting for RFID…”。
  2. 刷卡:将已授权的 RFID 卡靠近读取器,系统识别后绿灯亮起,舵机转到 90°(闸门打开),蜂鸣器发出短促提示音。
  3. 未授权卡:红灯亮起,蜂鸣器发出长音警报,闸门保持关闭。

小技巧:如果你想让闸门在车辆离开后自动关闭,只需在 loop() 中加入对 IR 传感器恢复 LOW 的检测,然后调用 gateServo.write(0)

可能的改进

  • 使用 LCD/OLED 显示屏:实时显示车辆状态、卡号或错误信息。
  • 加入网络功能:通过 ESP8266/ESP32 将通行记录上传到云端或本地服务器。
  • 多点检测:在入口和出口各放置一个 IR 传感器,实现双向计数。
  • 电磁锁:用电磁锁代替舵机,实现更可靠的闸门锁定。

结论

通过本项目,你可以快速搭建一个基于 ArduinoRFID红外 传感器的自动化收费闸系统。它展示了如何将多种传感器融合在一起,实现 感知 → 判断 → 执行 的完整闭环控制。只要稍作改动,就能把它扩展为更复杂的门禁、停车场或物流分拣系统。

祝你玩得开心,动手实验吧!如果你有任何问题或改进想法,欢迎在评论区交流。

🚗 介绍

在自动化正在革新日常系统的时代,使用 Arduino 构建自动收费闸系统既是一个实用又具教育意义的项目。该系统旨在消除人工收费,利用简易传感器和 RFID 技术创建智能、无接触的收费解决方案,适合爱好者、学生和创客。

Automatic Toll Gate Overview

Source:

📈 工作原理:逐步说明

1. 车辆检测

在入口处安装的红外(IR)传感器检测到车辆靠近时,会触发 Arduino 开始收费流程。

2. RFID 验证

系统等待车辆的 RFID 卡被读取。每张 RFID 卡在 Arduino 内存中保存有唯一标识符和模拟余额。

3. 卡片校验

读取后:

  • Arduino 检查 RFID 标签是否在已知卡片列表中。
  • 验证余额是否足以支付通行费。
  • 若余额充足,则扣除通行费。
  • 若卡片未授权或余额不足,则触发拒绝访问信号(红色 LED)。

4. 大门操作

校验成功后触发:

  • 绿色 LED 点亮。
  • 伺服电机将大门打开约 90°。
  • 当车辆通过出口的 IR 传感器后,大门再次关闭,系统为下一辆车重置。

Gate operation diagram

LED 指示灯

  • 绿色 LED → D7
  • 红色 LED → D6
  • 两个 LED 共享地线。

红外传感器

  • 入口 IR → D2
  • 出口 IR → D3
  • 两个传感器均连接到 5 V 和地。

伺服电机

  • 伺服信号 → D5
  • 5 V 电源和地 → 公共轨

Wiring layout

Source:

💻 Arduino 代码说明

该草图被组织成清晰的章节。

// Libraries
#include 
#include 
#include 

// Define pins, objects, and variables here
// ...

void setup() {
  Serial.begin(9600);
  SPI.begin();                // Init SPI bus
  rfid.PCD_Init();            // Init RFID reader
  pinMode(entryIRPin, INPUT);
  pinMode(exitIRPin, INPUT);
  pinMode(greenLEDPin, OUTPUT);
  pinMode(redLEDPin, OUTPUT);
  servo.attach(servoPin);
  servo.write(closedAngle);  // Start with gate closed
}

void loop() {
  // 1. Wait for vehicle entry (IR sensor)
  if (digitalRead(entryIRPin) == LOW) {
    // 2. Look for RFID card
    if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
      // 3. Validate card ID and balance
      //    (compare with stored IDs, deduct toll, etc.)
      // 4. Control LEDs and servo
      //    - Green LED on, servo opens
      //    - After exit IR triggers, close gate and reset
    }
  }
}

代码初始化了串口监视、SPI 通信、RFID 读取器、I/O 引脚以及舵机。在主循环中,它:

  1. 等待入口红外传感器的信号。
  2. 扫描是否有新的 RFID 卡。
  3. 将卡号与预定义标签进行比对,验证余额,并相应地更新 LED 和舵机。
  4. 当出口红外传感器被触发时关闭闸门,并为下一辆车重置。

🛠 故障排除技巧

  • RFID 未检测到卡片?
    确保 RFID 读取器获得正确的 3.3 V 电源,并且接线与 SPI 引脚布局相匹配。

  • 舵机抖动或不动作?
    核实舵机拥有足够的电流供应,并且信号引脚已正确定义。

  • 红外传感器过于灵敏或不稳定?
    调整传感器位置,并考虑在代码中添加小的延时以消除误触发。

🚀 未来改进

  • 添加 LCD 显示屏以显示余额和状态信息。
  • 集成 Wi‑Fi(ESP32/ESP8266)用于云端记录交易。
  • 开发移动应用,实现实时余额查询和通知。
  • 将交易日志存储在 SD 卡或远程数据库中。

🏁 结论

Automatic Toll Gate System Project Using Arduino 是一个强大且适合初学者的项目,展示了微控制器和传感器如何自动化诸如收费收取等现实世界的流程。从车辆检测到 RFID 支付处理再到闸门控制,这个项目将硬件与软件融合在有趣的学习体验中。

进一步探索诸如 LCD 状态显示或物联网连接等增强功能,让你的系统更智能!

Back to Blog

相关文章

阅读更多 »