三脚闸闸机防逃票装置

摘 要

本文是对基于Arduino编程实现逃票报警的原理以及相关制作、调试过程的简要介绍。对装置的基本组件、搭建过程、编程思路以及运行结果也会一并提及。

本方案以Arduino单片机为控制核心,装置共分为三个部分:第一部分为闸机前段的单个光电开关,用于检测是否有人要通过闸机,第二部分为在闸机杆部末端的加速度传感器,用于检测通过闸机的人是否买票,第三部分为在闸机后部的一前一后两个光电开关与蜂鸣器,光电开关用于检测是否有人经过与经过的方向,以防有人从反向进入;蜂鸣器用于警报有人逃票。其检测过程为:当有乘客要经过闸机时,首先,在闸机前部的光电开关会检测到有乘客经过,打开之后的系统。然后,如果乘客未逃票,那么当他推动闸机时,位于闸机杆部末端的加速度传感器就会检测到重力加速度方向上的变化,发出一个信号,关闭在闸机后部的蜂鸣器;当有乘客逃票时,那么他不会推动闸机杆部,加速度传感器并不会被触发,因此之后的蜂鸣器未被关闭。最后,当乘客经过闸机后部时,会先后触发两个光电开关,两个光电开关就会一次发出信号给蜂鸣器,若乘客未逃票,那么蜂鸣器已被关闭,不会发出警报;若乘客逃票,则蜂鸣器未被关闭,那么蜂鸣器便会发出警报,提示站内管理人员有人逃票。若有人反向进入闸机,在闸机后部的两个光电开关会被按照相反的次序被触动,不会引发蜂鸣器发出警报。

本系统在硬件设计方面,以Arduino单片机为控制核心,以mpu6050整合性6轴运动处理组件、光电开关、蜂鸣器来实现检测逃票并报警的功能。在软件方面,利用Arduino语言进行编程。并且,用前后两个光电开关,实现防止反向误触的问题。设计巧妙,所花费的成本较低,不仅有实用价值,而且易于批量化生产,市场前景也较为广大。

关键词:上海地铁检票闸机、三角闸、防逃票装置、Arduino、单片机、mpu6050整合性6轴运动处理组件、光电开关、蜂鸣器、电刷

目 录

摘 要 2

引言 4

一、研究背景及现状 4

(一)背景 4

(二)现状 5

(三) Arduino单片机概述 6

二、应用原理 8

三、技术与方法 9

(一)硬件设计 9

(二)软件开发 10

1.Arduino语言 10

2. 算法设计 11

3.mpu6050整合性6轴运动处理组件的程序实现 12

(三)闸机模型的制作 16

四、性能测试 16

五、结论 17

六、致谢与感想 17

参考文献 18

引言

当前上海地铁日客流量趋近一千万。据统计,上海每天逃票人数占上海地铁客流总数的0.16%左右,每天损失约48000元。针对上海地铁乘客逃票情形严重的现象,结合上海地铁大客流量及检票系统的特点,本文设计独立于自动检票系统的基于上海地铁三角闸的防逃票装置,,该硬件及软件方案对地铁防逃票有着积极的作用。

一、研究背景及现状

(一)背景

随着上海城市的发展,城市轨道交通发展迅猛,地铁站点遍布全上海。上海现在多数站点使用的均为三脚轴闸机验票机(见图1),此类闸机易于逃票,所以有一部分人(据调查约有6.5%)选择钻过闸机来逃票,粗略估计约损失189万人民币每年。到2020年年底,上海市轨道交通运营规模将超过830公里。于是为了公共的利益与社会风气的良好,我们决定采用Arduino单片机技术结合物理及Arduino编程技术,来创造一款可以检测并报警的防逃票装置。

图1

图1

图1

图2

图2

(二)现状

我们使用 “问卷星”这一软件进行统计,对于地铁逃票的现状有一定的了解,并在此基础上有针对性的对装置进行设计和制造。让我们用图片说明当前地铁逃票现状。(见图2、图3、图4、图5)

图3

图3

图2 图3

图4

图4

图4 图5

图5

图5

由此可见,有相当一部分人会逃票,按上海平均日客流量969万人次计算(2018年数据),每年约有63万人逃票,若按平均票价3元计算,则每年损失189万人民币,可见该装置有很大的作用与发展前景。

现阶段国内外的类似防逃票装置几乎都采用红外探测器来实现对逃票者的监测[1]。然而,这种方法容易受到干扰(若被某些东西遮挡就会失灵或着产生误触),并且如果对于带小孩(上海地铁1.3米以下免费)以及带行李的乘客极易造成不必要的麻烦(易发生误触)。同时红外感测器可以测到钻过去逃票的人,而不能测到跨越闸机杆逃票的人。故我们采用现在无人使用的加速度传感器来实现对逃票者的监测。我们的装置的优越性就在于,由于加速度传感器测的是杆的加速度,所以如果敢没有动就再结合前后的光电开关就能实现防逃票功能。我们的方案是从最根源上出发,即杆不转动一定是逃票,转动一定是正常通过,将所有的套票方式都包含在内,且不容易发生误触。

(三) Arduino单片机概述

Arduino,是一个基于开放原始码的软硬件平台,构建于开放原始码simple I/O介面版,并且具有使用类似Java,C语言的Processing/Wiring开发环境。

其主要特点如下:

1.开放源代码的电路图设计,程序开发接口免费下载,也可依个人需求自己修改。

2.使用低价格的微处理控制器(AVR系列控制器),可以采用USB接口供电,不需外接电源,也可以使用外部9VDC输入。

3.Arduino支持ISP在线烧,可以将新的“bootloader”固件烧入AVR芯片。有了bootloader之后,可以通过串口或者USB to Rs232线更新固件。

4.可依据官方提供的Eagle格式PCB和SCH电路图简化Arduino模组,完成独立运作的微处理控制;可简单地与传感器,各式各样的电子元件连接(例如:红外线,超音波,热敏电阻,光敏电阻,伺服马达,…等)

5.支持多种互动程序,如:Flash、Max/Msp、VVVV、PD、C、Processing等。

6.应用方面,利用Arduino,突破以往只能使用鼠标、键盘、CCD等输入的装置的互动内容,可以更简单地达成单人或多人游戏互动。

以上即为我们选择arduino的原因。

二、应用原理

我们所设计的这个装置共分为三个部分:第一部分为闸机前段的单个光电开关,用于检测是否有人要通过闸机,第二部分为在闸机杆部末端的加速度传感器,用于检测通过闸机的人是否买票,第三部分为在闸机后部的一前一后两个光电开关与蜂鸣器,光电开关用于检测是否有人经过与经过的方向,以防有人从反向进入;蜂鸣器用于警报有人逃票。其检测过程为:当有乘客要经过闸机时,首先,在闸机前部的光电开关会检测到有乘客经过,打开之后的系统。然后,如果乘客未逃票,那么当他推动闸机时,位于闸机杆部末端的加速度传感器就会检测到重力加速度方向上的变化,发出一个信号,关闭在闸机后部的蜂鸣器;当有乘客逃票时,那么他不会推动闸机杆部,加速度传感器并不会被触发,因此之后的蜂鸣器未被关闭。最后,当乘客经过闸机后部时,会先后触发两个光电开关,两个光电开关就会一次发出信号给蜂鸣器,若乘客未逃票,那么蜂鸣器已被关闭,不会发出警报;若乘客逃票,则蜂鸣器未被关闭,那么蜂鸣器便会发出警报,提示站内管理人员有人逃票。若有人反向进入闸机,在闸机后部的两个光电开关会被按照相反的次序被触动,不会引发蜂鸣器发出警报。

三、技术与方法

(一)硬件设计

本装置的硬件部分分为几个模块:光电开关、Arduino单片机、电源、mpu6050整合性6轴运动处理组件、蜂鸣器。电源连接在Arduino单片机上给整个装置供电。装置以Arduino单片机为核心,连接mpu6050整合性6轴运动处理组件和两个光电开关共同控制蜂鸣器机,从而实现逃票报警。将光电开关安置在闸机的最前端,用于探测是否有人进入。当光电开关遇到人通过时,将反馈提供到单片机里从打开mpu6050整合性6轴运动处理组件,检测三脚轴是否转动,若有则关闭后续装置,没有则打开后一个光电开关,后一个光电开关检测到有人通过则控制蜂鸣器报警,从而实现整个装置报警功能,且避免了反向通过而产生的误触。硬件框架图如图6

图6

图6

图6

图7

图7

(二)软件开发

1.Arduino语言

Arduino语言具有如下特点:

(1)开放源代码的电路图设计,程序开发接口免费下载,也可依需求自己修改。

(2)使用低价格的微处理控制器(AVR系列控制器),可以采用USB接口供电,不需外接电源,也可以使用外部9VDC输入。

(3)Arduino支持ISP在线烧,可以将新的“bootloader”固件烧入AVR芯片。有了bootloader之后,可以通过串口或者USB to Rs232线更新固件。

(4)可依据官方提供的Eagle格式PCB和SCH电路图简化Arduino模组,完成独立运作的微处理控制;可简单地与传感器,各式各样的电子元件连接(例如:红外线,超音波,热敏电阻,光敏电阻,伺服马达,…等)

(5)支持多种互动程序,如:Flash、Max/Msp、VVVV、PD、C、Processing等。

(6)应用方面,利用Arduino,突破以往只能使用鼠标、键盘、CCD等输入的装置的互动内容,可以更简单地达成单人或多人游戏互动。

Arduino的功能:

Arduino可以让我们快速使用与Macromedia Flash, Processing, Max/MSP, Pure Data, SuperCollider等软件结合,作出互动作品。Arduino可以使用现有的电子元件例如开关或者传感器或者其他控制器件、LED、步进马达或其他输出装置。Arduino也可以独立运行,并与软件进行交互,例如:Macromedia Flash, Processing,Max/MSP, Pure Data,VVVV或其他互动软件,Arduino的IDE界面基于开放源代码,可以让我们免费下载使用,开发出更多令人惊艳的互动作品。

Arduino可使用ICSP线上烧入器,将「bootloader」烧入新的IC晶片;可依据官方电路图,简化Arduino模组,完成独立运作的微处理控制;可简单地与传感器,各式各样的电子元件连接(例如:红外线,超声波,热敏电阻,光敏电阻,伺服马达等);支援多样的互动程序例如: Macromedia Flash、Max/Msp、VVVV、PD、C、Processing等;使用低价格的微处理控制器(ATMEGA 8-168);USB接口,不需外接电源。另外有提供9V直流电源输入;在应用方面,利用Arduino,突破以往只能使用鼠标,键盘,CCD等输入的装置进行互动内容的设计,可以更简单地达成单人或多人游戏互动。

2. 算法设计

软件流程见图 7

图8

图8

图7

图9

图9

3.mpu6050整合性6轴运动处理组件的程序实现

本装置的核心程序就是mpu6050的编写,它也是本次项目的一个难点,我们在这里展示对于它的编程方法。

#include

long accelX, accelY, accelZ; // 定义为全局变量,可直接在函数内部使用

float gForceX, gForceY, gForceZ;

long gyroX, gyroY, gyroZ;

float rotX, rotY, rotZ;

void setup() {

Serial.begin(9600);

Wire.begin();

setupMPU();

}

void loop() {

recordAccelRegisters();

recordGyroRegisters();

printData();

delay(100);

}

void setupMPU(){

// REGISTER 0x6B/REGISTER 107:Power Management 1

Wire.beginTransmission(0b1101000); //This is the I2C address of the MPU (b1101000/b1101001 for AC0 low/high datasheet Sec. 9.2)

Wire.write(0x6B); //Accessing the register 6B/107 - Power Management (Sec. 4.30)

Wire.write(0b00000000); //Setting SLEEP register to 0, using the internal 8 Mhz oscillator

Wire.endTransmission();

// REGISTER 0x1b/REGISTER 27:Gyroscope Configuration

Wire.beginTransmission(0b1101000); //I2C address of the MPU

Wire.write(0x1B); //Accessing the register 1B - Gyroscope Configuration (Sec. 4.4)

Wire.write(0x00000000); //Setting the gyro to full scale +/- 250deg./s (转化为rpm:250/360 * 60 = 41.67rpm) 最高可以转化为2000deg./s

Wire.endTransmission();

// REGISTER 0x1C/REGISTER 28:ACCELEROMETER CONFIGURATION

Wire.beginTransmission(0b1101000); //I2C address of the MPU

Wire.write(0x1C); //Accessing the register 1C - Acccelerometer Configuration (Sec. 4.5)

Wire.write(0b00000000); //Setting the accel to +/- 2g(if choose +/- 16g,the value would be 0b00011000)

Wire.endTransmission();

}

void recordAccelRegisters() {

// REGISTER 0x3B~0x40/REGISTER 59~64

Wire.beginTransmission(0b1101000); //I2C address of the MPU

Wire.write(0x3B); //Starting register for Accel Readings

Wire.endTransmission();

Wire.requestFrom(0b1101000,6); //Request Accel Registers (3B - 40)

// 使用了左移<<和位运算|。Wire.read()一次读取1bytes,并在下一次调用时自动读取下一个地址的数据

while(Wire.available() < 6); // Waiting for all the 6 bytes data to be sent from the slave machine (必须等待所有数据存储到缓冲区后才能读取)

accelX = Wire.read()<<8|Wire.read(); //Store first two bytes into accelX (自动存储为定义的long型值)

accelY = Wire.read()<<8|Wire.read(); //Store middle two bytes into accelY

accelZ = Wire.read()<<8|Wire.read(); //Store last two bytes into accelZ

processAccelData();

}

void processAccelData(){

gForceX = accelX / 16384.0; //float = long / float

gForceY = accelY / 16384.0;

gForceZ = accelZ / 16384.0;

}

void recordGyroRegisters() {

// REGISTER 0x43~0x48/REGISTER 67~72

Wire.beginTransmission(0b1101000); //I2C address of the MPU

Wire.write(0x43); //Starting register for Gyro Readings

Wire.endTransmission();

Wire.requestFrom(0b1101000,6); //Request Gyro Registers (43 ~ 48)

while(Wire.available() < 6);

gyroX = Wire.read()<<8|Wire.read(); //Store first two bytes into accelX

gyroY = Wire.read()<<8|Wire.read(); //Store middle two bytes into accelY

gyroZ = Wire.read()<<8|Wire.read(); //Store last two bytes into accelZ

processGyroData();

}

void processGyroData() {

rotX = gyroX / 131.0;

rotY = gyroY / 131.0;

rotZ = gyroZ / 131.0;

}

void printData() {

Serial.print("Gyro (deg)");

Serial.print(" X=");

Serial.print(rotX);

Serial.print(" Y=");

Serial.print(rotY);

Serial.print(" Z=");

Serial.print(rotZ);

Serial.print(" Accel (g)");

Serial.print(" X=");

Serial.print(gForceX);

Serial.print(" Y=");

Serial.print(gForceY);

Serial.print(" Z=");

Serial.println(gForceZ);

}

(三)闸机模型的制作

我们将闸机等比例缩小,以此便于实验和展示。闸机模型主要以木质材料为主题,便于操作和打孔。(见图8、图9)

图10

图10

图9

图11

图11

四、性能测试

1、调试

首先,调试光电开关,利用手机的摄像头观察红外发射器是否打开(人肉眼看不见红外线)

接着,调试mpu6050,确定加速度变化范围(即达到多大的数值才算有效的推杆)

具体过程见图10(初始值)、 图11(有效推杆值)

图1

图1

图10

图1

图1

图11

图1

图1

可见图11中有一段明显的波动,那就是推杆所产生的加速度的变化,由公式a=(x^2+y^2+z^2)^1/2得到加速度的变化有效值。

最后,对准光电开关,使其能正常地接受红外信号。

2、实验

正向正常通过:装置正常,不报警。

正向逃票钻过或跨过:装置正常,蜂鸣器响。

反向通过:装置正常,不发生误触,蜂鸣器不响。

3、遇到的问题

问题:由于mpu6050是装在闸机的三脚轴上的。所以,连接的线难以穿过,线放在三脚轴外会被三脚杆绕住。

解决方法:在反复思考与查阅资料后,我们选择使用中空的固定螺丝来使线穿过,从而实现加速度传感器的固定。见图12、图13、图14

效果:问题成功解决了,导线不会被三脚轴绕住。

五、结论

本装置可以运用于所有的三脚轴验闸机,成本低廉,适合大批量生产,有助于提高社会公共秩序,减少政府的经济损失,建议交通部门能够大面积安装。

六、致谢与感想

致谢:我们设计三角闸闸机的防逃票装置已经告一段落。在我的同学和我的共同努力下,三角闸闸机防逃票装置已经成功被设计出来了。在这个过程中,我了解到了理论与实践有着极大的不同,我们所设计的装置需要经过实践才能使用。这段时间内我们学到了很多知识,拓宽了眼界。非常感谢老师们给我们提供的指导与帮助,不仅在论文方面帮助了我们,而且在理论方面同样也指导了我们。

由于我们自身的知识与经验的不足,我们所设计的三角闸闸机防逃票装置在某些方面一定有些不足之处。在这次设计的过程中,虽然我们的绘图能力有所不足,但我们将会在未来的时间内不断完善自我,敬请各位老师批评指正。

参考文献

[1] 陈彦旭, 师蔚. 基于上海地铁闸机的防逃票装置设计[J]. 科技风, 2014(3):36-37.

[2]郑宇娇, 姚轶臣, 黄丽珍,等. 地铁进出口验票监测及报警系统优化[J]. 轻工科技, 2014(12):73-75.

[3]虞曹. 纽约地铁采用防止逃票新技术[J]. 交通与运输, 1994(2):31-31.

[4]陶俊哲. 基于arduino的智能小车的遥控自动化

[5]Simon Monk. 《Arduino编程从零开始》. 2013

[6]邵贝贝. 单片机嵌入式应用的在线开发方法.北京.清华大学出社.2004

[7]臧杰,阎岩. 汽车构造. 北京. 机械工业出版社.2005 哈尔滨工业大学课程设计说明书

[8]安鹏,马伟.S12单片机模块应用及程序调试. 电子产品世界. 2006.

[9]黄容、赵毅 .《c语言程序设计》.清华大学出版社

[10]张宁 . 《c语言其实很简单》.清华大学出版社.2015