Bản mạch hoàn chỉnh của thiết bị được xây dựng như trong hình 22. Cảm biến được đặt tại phía ngoài của mạch để tối ưu khoảng cách từ cảm biến tới các vật thể cần phát hiện. Nhiệm vụ của thực nghiệm là kiểm tra về mặt định tính và định lượng các chức năng của thiết bị: phát hiện xe ôtô, đếm lưu lượng xe ôtô, tính vận tốc của xe khi đi qua thiết bị…
Trong thực nghiệm của chúng tôi, thiết bị được đặt trên vỉa hè (tại điểm nút cầu vượt Mai Dịch). Khoảng cách từ thiết bị tới làn đường gần nhất là 1m, tới làn đường thứ hai là 3m. Ở đây chúng tôi thực hiện hai cấu hình phục vụ cho thí nghiệm. Cấu hình thứ nhất, thiết bị gồm 1 cảm biến HMC1052 (Hình 23), có hai trục cảm biến. Cấu hình này nhằm mục đích phát hiện các xe ô tô chuyển động qua và đếm lượng xe qua thiết bị trong 1 khoảng thời gian định trước. Thiết bị được đặt sao cho trục cảm nhận X sẽ vuông góc với hướng của làn chuyển động của các xe, còn trục Y dọc theo làn đường và có hướng cùng với hướng chuyển động của các phương tiện.
Hình 23. Cấu hình cảm biến đặt trên vỉa hè làn đường giao thông
Trên máy tính có phần mềm thu thập và xử lý dữ liệu (phần mềm này được viết bằng ngôn ngữ Visual Basic 6.0), có giao diện thân thiện và thể hiện các thông số như: dạng tín hiệu, lưu lượng xe qua thiết bị, thời gian đếm xe…
Hình 24. Dạng tín hiệu thu được khi xe tải - xe tải – xe con đi qua cảm biến
Qua các dạng tín hiệu thu nhận được ta thấy rằng, biên độ của biến thiên tín hiệu thu được khi có xe ôtô đi qua phụ thuộc vào từng loại xe ôtô. Đối với những xe có nhiều thành phần sắt từ hơn, xe dài hơn, có nhiều bánh hơn…độ rộng tín hiệu biến thiên lớn hơn và biên độ lớn hơn (xét khi các xe chạy cùng một làn đường),đây là đặc điểm quan trọng giúp phân loại các xe ôtô. Một yếu tố khác cũng làm thay đổi độ rộng tín hiệu biến thiên, đó là tốc độ chuyển động của các xe khi đi qua cảm biến. Với cùng một xe ôtô, nếu ôtô chuyển động với vận tốc chậm, thì độ rộng tín hiệu biến thiên sẽ lớn hơn khi xe chuyển với vận tốc nhanh hơn. Khoảng cách từ cảm biến tới các xe ôtô quyết định đến biên độ của thay đổi tín hiệu. Bằng thuật toán và giá trị ngưỡng phù hợp, thiết bị đã nhận biết và tính được lưu lượng xe ôtô qua cảm biến. Giá trị ngưỡng đựơc lựa chọn thông qua các kết quả thực nghiệm.
Để kiểm tra độ chính xác và ổn định của thiết bị khi tính lưu lượng xe ôtô, chúng tôi thực hiện nhiều phép đo ở nhiều khoảng thời gian khác nhau. Kết quả thu được từ thiết bị sẽ được so sánh với kết quảđếm thủ công, từ đó xác định sai số của thiết bị. Hình 27 là kết quả của hai lần đo tại điểm nút giao thông cầu Mai Dịch..Qua hai lần đo, sai số của kết quả do thiết bị trong lần đo 1 là 10%, lần 2 là 7.5%.
Nguyên nhân chính dẫn đến sai số của thiết bịđo là do thuật toán phát hiện xe ôtô. Trong thuật toán trên (hình 26), hai giá trị ngưỡng được lựa chọn để so sánh, phát hiện xe. Khi xe ôtô chuyển động ở khoảng cách xa thiết bị thì độ biến thiên của tín hiệu là rất nhỏ, dưới mức giá trị ngưỡng đã chọn. Do đó các xe này sẽ không được thiết bị phát hiện. Một nguyên nhân khác gây ra sai số đó là trường hợp khi có hơn một xe cùng đi qua thiết bị, thiết bị chỉ coi là có một xe. Tuy nhiên trên tại các vị trí chỉ có một làn xe ôtô, thì nguyên nhân này được bỏ qua.
(a) (b)
Hình 27. Kết quả tính lượng xe tại điểm nút cầu Mai Dịch: (a) Trên cầu, từ 10h 30 đến 10h 45
(b)Trên cầu, từ 11h đến 11h 10
Kết quả thực nghiệm cũng đã kiểm tra vùng phát hiện xe của thiết bị. Trong vùng có bán kính 3 m, thiết bị sẽ nhận biết được và được tính khi cần xác định lưu lượng. Một thông số quan trọng trong việc xác định vận tốc của xe đó là giới hạn vận
tốc mà thiết bị có thể phát hiện được. Trong thực nghiệm, xác định được giới hạn này là khó khăn. Tuy nhiên theo lý thuyết, giới hạn này là hoàn toàn xác định. Thông qua vùng phát hiện của thiết bị và tốc độ thu nhận dữ liệu về máy tính xử lý, giới hạn vận tốc này được xác định. Về cơ bản, cảm biến phát hiện được nhiễu loạn từ trường tới tần số 15MHz, tốc độ biến đổi của ADC đạt 2.000 mẫu/s. Các thao tác xử lý và việc truyền thông giữa thiết bị và máy tính làm cho tốc độ lấy mẫu thực đạt được trên máy tính là 30 mẫu/second. Như vậy thời gian giữa hai mẫu là :
033 . 0 30 1 = (s) Do đó vận tốc đạt được là: ) / ( 324 ) / ( 90 033 . 0 3 h km s m ≈ ≈
Trong thực tếđiều kiện giao thông ở nước ta, thì giới hạn này chấp nhận được.
Với nhiều phép đo thực hiện ở nhiều thời điểm trong ngày, cho phép đưa ra lưu đồ thể hiện lưu lượng xe qua điểm nút đặt thiết bị trong ngày. Điều này rất có ý nghĩa khi cần giám sát hoạt động giao thông trên các làn đường, đường xa lộ, đường cao tốc…Ví dụ: hệ thống quản lý có thể cảnh báo khả năng tắc ngẽn có thể xảy ra ở các thời điểm trong ngày.
Hình 28. Cấu hình khi sử dụng hai cảm biến đặt cách nhau 2m
Trên cơ sở phát hiện được các xe ôtô, thiết bị có thể cải tiến để xác định được tốc độ của các xe ôtô. Bằng cấu hình sử dụng hai cảm biến đặt cách nhau s = 2 m, ta có thể xác định chính xác vận tốc của chúng. Thông qua xác định thời điểm xe đi qua hai cảm biến, t1 và t2, vận tốc của xe được xác định.
1 2 t t t = − ∆ (2.2) t s v ∆ =
Một vấn đề được đặt ra đó là nhận biết chính xác xe khi đi qua 2 cảm biến để xác định thời điểm qua cảm biến của từng xe. Do đặc điểm của cấu hình và các linh kiện phụ điện tử thụ động khác trong thiết bị, nên tín hiệu thu về từ hai cảm biến đối với cùng một xe là không hoàn toàn giống nhau (vềđộ rộng tín hiệu biến đổi, biên độ biến đổi…). Trong sự sai khác cho phép giữa hai tín hiệu thu về từ hai cảm biến, thiết bị sẽ nhận biết là cùng một xe. Trong điều kiện bình thường, khi các xe ôtô chạy ở khoảng cách an toàn thì việc phân biệt xe là dễ dàng. Vận tốc thu được sẽ là vận tốc tức thời của xe ở thời điểm đi qua thiết bị. Để giám sát được hoạt động giao thông trong một vùng, cần thiết có nhiều thiết bị đặt tại nhiều vị trí và được kết nối với trạm trung tâm. Tuy nhiên công việc này đòi hỏi có sự đầu tư lớn về nhiều mặt. Thiết bị chúng tôi xây dựng được là cơ sở cho việc xây dựng hệ thống lớn trong tương lai.
Kết luận
Thiết bị chúng tôi xây dựng có khả năng nhận biết xe ôtô khi chúng chuyển
động qua ở khoảng cách không quá 3 m. Thuật toán đếm xe áp dụng cho thiết bị, đã
được kiểm nghiệm trong thực tế, thu được kết quả khả quan với độ chính xác 92%. Phần cứng của thiết bị đã được xây dựng có khả năng tính vận tốc xe ôtô khi chúng đi qua điểm khả sát. Trong thời gian gấn, chúng tôi sẽ nâng cấp phần mềm để đếm xe chính xác hơn, và xác định được tốc đô của các xe ôtô khi chúng đi qua.
Các kết quả thu được khi thực nghiệm tại điểm nút giao thông cầu vượt Mai Dịch, bước đầu đã khảo sát được độ chính xác của ứng dụng. Thiết bị đã xác định
được thông số cơ bản là lượng xe chuyển động qua một điểm, và hoàn toàn có khả
năng xác định được thông số vận tốc của xe khi nâng cấp phần mềm.Việc xây dựng một khối đo này thành công sẽ đảm bảo cho khả năng xây dựng một mạng giữa các khối đo. Các khối đo này có thểđược đặt tại nhiều điểm nút giao thông. Đó là cơ sở để
Tài liệu tham khảo
[1] GS.TSKH Nguyễn Phú Thuỳ, “Vật lý và các hiện tượng từ”,
NXB ĐHQG Hà nội.
[2] Micheal J.Caruso, Lucky S.Withanawasam, “Vehicle detection and
Compass Applications using AMR Magnetic sensors”. [3] Application Notes AN-201, 202, 204, and 207
Honeywell SSEC, www.ssec.honeywell.com
[4] B.B.Pant, “Magnetoresistive Sensors”, Scientific Honeyweller.
[5] “1, 2 and 3-axis magnetic sensors”, Datasheets, www.ssec.honeywell.com [6] Steven A.Macintyre, “Magnetic Field Measurement”.
[7] “A summary of Vehicle Detection and Surveillance Technologies used in Intelligent Transportation Systems”
[8] “Freeway Operations Handbook”, Chapter15: “Detection and Surveillance”
http://ops.fhwa.dot.gov/Travel/traffic/freeway_management_handbook/chapte r15_01.htm.
Phụ lục 1
Phụ lục 2
Mã chương trình viết cho vi xử lý AT90S8535
/**************************************************************/ // Chuong trinh thuc hien gui cac gia tri ADC bien doi duoc
/**************************************************************/ #include"io8535v.h" #include"macros.h" #include"math.h" void Init_adc0(); void Init_adc1(); void Init_uart();
void send_byte(unsigned char temp); void delay(unsigned int interval);
/**********************************************************/ void main()
{
unsigned char low_byte_0,high_byte_0,low_byte_1,high_byte_1; unsigned char tmp_low_0,tmp_high_0,tmp_low_1,tmp_high_1; unsigned int i; low_byte_0=0; high_byte_0=0; low_byte_1=0; high_byte_1=0; tmp_low_0=0; tmp_high_0=0; tmp_low_1=0; tmp_high_1=0; Init_uart();
SREG|=0x80;//Enable global interrupt
//Get data from AMR sensor (with 2-sensitive axis) //firstly X-axis, then Y-axis
while(1)
{
//Use ADC0 Init_adc0();
ADCSR|=0x40;//Start conversion
while((ADCSR & 0x10)==0x00){;}//Waiting for ADC conversion complete tmp_low_0=ADCL; tmp_high_0=ADCH; delay(3); Init_adc1(); low_byte_0=tmp_low_0 & 0x7F; high_byte_0=((tmp_high_0<<1)|0x80)|(tmp_low_0>>7); ADCSR|=0x40;//Start conversion
while((ADCSR & 0x10)==0x00){;}//Waiting for ADC conversion complete
tmp_low_1=ADCL; tmp_high_1=ADCH; //Encode the data
low_byte_1=tmp_low_1 & 0x7F;
high_byte_1=((tmp_high_1<<1)|0x80)|(tmp_low_1>>7); //Gui du lieu theo khung duoc dinh dang Frame= 0xFF send_byte(0xFF);
delay(20); //Gui du lieu kenh X
send_byte(low_byte_0); delay(20);
send_byte(high_byte_0); delay(20);
//Gui du lieu cua truc Y send_byte(0xFE); delay(20); send_byte(low_byte_1); delay(20); send_byte(high_byte_1); delay(10); }
} /*************************************************************/ void Init_adc0() { ADCSR=0x80;//ADEN_ADSC_ADFR_ADIF_ADIE_ADPS2_ADPS1_ADPS0 ADMUX=0x00;//Channel 0 } /*************************************************************/ void Init_adc1() { ADCSR=0x80;// ADMUX=01;//Select channel 1 } /*************************************************************/ void Init_uart() {
UBRR=51;//Chon toc do Baud =9600 UCR=0x18; //1111 1000
//RXCIE_TXCIE_UDRIE__RXEN_TXEN_CHR9_TXB8_RXB8 }
/*************************************************************/ void delay(unsigned int interval)
{
unsigned int i,j,k; for (i=0;i<interval;i++) for(j=0;j<interval;j++) for(k=0;k<interval;k++); } /*************************************************************/ void send_byte(unsigned char tmp)
{
do
UDR=tmp; }
Mã chương trình viết bằng ngôn ngữ Visual Basic, thực hiện thu và xử lý dữ
liệu trên máy tính
Option Explicit
Dim Counter, R1, R2 As Integer Dim j As Byte
Dim Detected As Boolean
Dim Current_X1, Current_Y1, Old_X1, Old_Y1, Org_X1, Org_Y1, End_X1, dx As Long
Dim tmp_low_0, tmp_high_0, low_byte_0, high_byte_0 As Byte Dim data_1, value_comp As Integer 'Luu du lieu nhan duoc Dim ADCL_0, ADCH_0 As Byte
Dim time_1, time_2 As Long
Private Declare Function InitCommonControls Lib "comctl32.dll" () As Long
Public Sub Grid_Screen(dx As Long)
' Thuc hien ve luoi man hinh
Picture1.ScaleMode = 1 Picture1.DrawWidth = 3
Picture1.Line (1, 5 * 102 * dx)-(Picture1.ScaleWidth, 5 * 102 * dx), vbBlue Picture1.Line (3, 0)-(3, Picture1.ScaleHeight()), vbBlue
For j = 0 To 10 Step 1 Picture1.Line (0, j * 102 * dx)-(100, j * 102 * dx), vbBlue Next j Picture1.DrawWidth = 1 For j = 0 To 50 Step 1 Picture1.Line (0, j * 102 * dx / 5)-(Picture1.ScaleWidth, j * 102 * dx / 5), vbGreen Next j End Sub
Public Sub Draw_Signal()
' Thu tuc Draw() thuc hien ve dang tin hieu tu du lieu thu duoc
dx = Picture1.ScaleHeight() / 1024
Current_Y1 = CLng(Picture1.ScaleHeight() - data_1 * dx) If Current_X1 > End_X1 Then
Current_X1 = 0 Old_X1 = 0 Picture1.Cls Picture1.ScaleMode = 1 ' Axial Grid_Screen (dx) Else Current_X1 = Old_X1 + 30 End If
Picture1.Line (Old_X1, Old_Y1)-(Current_X1, Current_Y1), vbBlack Old_X1 = Current_X1
Old_Y1 = Current_Y1
End Sub
Public Function In_Port() As Integer
‘ Doc du lieu tu cong COM1
Do
DoEvents
Loop Until MSComm1.InBufferCount <> 0 In_Port = Asc(MSComm1.Input)
End Function
Private Sub InitComm()
' Ham nay thuc hien khoi dong COM1
On Error GoTo ERR_OPEN_PORT With MSComm1 .CommPort = 1 .Settings = "9600,N,8,1" .InBufferSize = 1 .InputLen = 1 .InputMode = comInputModeText .PortOpen = True End With Exit Sub
ERR_OPEN_PORT:
'MsgBox "Error while attemp to open the Port. Please restart your PC", vbInformation + vbOKOnly
MsgBox Err.Description
End Sub
Private Sub Exit_Port()
' Dong cong noi tiep RS232
On Error GoTo ERR_CLOSE_PORT MSComm1.PortOpen = False Exit Sub
ERR_CLOSE_PORT:
'MsgBox "The Port can't close!", vbInformation + vbOKOnly MsgBox Err.Description
End Sub
Private Sub CmdClear_Click()
TxtX = " " 'TxtY = " " Counter = 0
End Sub
Private Sub CmdExit_Click()
Unload FrmMain
End Sub
Private Sub CmdSave_Click()
CommonDialog1.Filter = "Text files (*.txt)|*.txt" CommonDialog1.ShowSave
If CommonDialog1.FileName <> "" Then
Open CommonDialog1.FileName For Output As #1 Print #1, vbTab & vbTab & "Du lieu cua truc X" Print #1, TxtX.Text
End If Close #1
End Sub
Private Sub CmdStart_Click()
'**************Khi nguoi su dung Click nut Start*********** '-Nhan du lieu ve qua cong noi tiep RS232
' +Kiem tra du lieu thu duoc: Nhan byte cao truoc, ' Byte thap sau
'-Thuc hien ve tin hieu thu duoc
'**********************************************************
Dim tmp As Integer
'Dim ADCL, ADCH, Tmp_ADCH, Tmp_ADCL As Byte Dim i As Long Org_X1 = 0 End_X1 = Picture1.ScaleWidth() Org_Y1 = Picture1.ScaleHeight() Current_X1 = -2 Old_X1 = -2 Old_Y1 = 0
time_1 = Hour(Time) * 3600 + Minute(Time) * 60 + Second(Time) Do
time_2 = Hour(Time) * 3600 + Minute(Time) * 60 + Second(Time) LblTime.Caption = "Waiting..."
Loop Until (time_2 - time_1) > 10 Counter = 0
Detected = True IGNORE_0: tmp = In_Port()
If tmp = 255 Then ' Khung du lieu cua truc X tmp = In_Port() ' Nhan byte thap truoc
low_byte_0 = CByte(tmp)
tmp = In_Port() ' Nhan byte cao
high_byte_0 = CByte(tmp) Else
GoTo IGNORE_0 End If
ADCL_0 = low_byte_0 + ((high_byte_0 Mod 2) * 128) ' Tmp_ADCL | ((Tmp_ADCH & 0x01)<<7)
ADCH_0 = (high_byte_0 Mod 128) / 2 ' (Tmp_ADCH & 0x7F)>>1
data_1 = ADCH_0 * 256 + ADCL_0 value_comp = data_1
LblCompare.Caption = value_comp i = 0
While (1) IGNORE:
tmp = In_Port()
If tmp = 255 Then ' Khung du lieu cua truc X tmp = In_Port() ' Nhan byte thap truoc
low_byte_0 = CByte(tmp)
tmp = In_Port() ' Nhan byte cao
high_byte_0 = CByte(tmp) Else
GoTo IGNORE End If
' Khoi phuc du lieu
ADCL_0 = low_byte_0 + ((high_byte_0 Mod 2) * 128) ' Tmp_ADCL | ((Tmp_ADCH & 0x01)<<7)
ADCH_0 = (high_byte_0 Mod 128) / 2 ' (Tmp_ADCH & 0x7F)>>1
data_1 = ADCH_0 * 256 + ADCL_0 i = i + 1
LblCompare.Caption = i TxtX = TxtX & " " & data_1 R1 = Abs(value_comp - data_1)
If (R1 > 10) And (Detected = True) Then Counter = Counter + 1
LblCounter.Caption = CStr(Counter) Detected = False
ElseIf R1 < 5 Then Detected = True End If
Draw_Signal ' Ve tin hieu
time_2 = Hour(Time) * 3600 + Minute(Time) * 60 + Second(Time) LblTime.Caption = time_2 - time_1
Wend
End Sub
Private Sub Form_Initialize()
InitCommonControls Picture1.Cls
dx = Picture1.ScaleHeight / 1024 Grid_Screen (dx)
End Sub
Private Sub Form_Load()
InitComm Counter = 0
LblCounter.Caption = CStr(Counter)
End Sub
Private Sub Form_Unload(Cancel As Integer)
' Dong cong noi tiep RS232
Exit_Port
A B C D 6 5 4 3 2 1 D C B A Title Number Revision Size B
Date: 6-Jun-2005 Sheet of
C20 C7 C21 C8 Vin 1 GND 2 +5V 3 U12 UA7805UC D2 +5V 10 9 8 U3C LM324A R62 R60 R61 +5 V +2.5V +5V C3 Q4 NPN R58 R67 R68 C10 C9 COMMON IN RESET C16 C22 R49 TTL RESET 1 2 3 J7 MANUAL COMMON R1 R2 R3 3 2 6 7 1 5 4 8 U1 AD620N +2.5V +2.5V +5V +2.5V 1 2 3 4 5 JP1 5 HEARDER 6 7 8 9 10 JP2 5 HEADER_2 +5V RESET 3 2 1 4 11 U3A LM324A R5 R4 R7 R6 +2.5V C1 C2 +5V R12 R48 R13 3 2 6 7 1 5 4 8 U2 AD620N +2.5V +2.5V +5V +2.5V 5 6 7 U3B LM324A R15 R14 R16 R50 +2.5V C4 +5V A 1 B 3 TAP 2 R69 A 1 B 3 TAP 2 R70 S1B C50 D1 R47 +5V 1 16 2 15 3 14 4 13 5 12 6 11 7 10 8 9 U5 MAX232 C46 C17 C18 C19 C49 RxD CMOS TxD CMOS RxD TTL TxD TTL ADC1 ADC0 R8 R17 + C11 + C12 +2.5V +2.5V S3 R52 R51 +5 V MANUAL 1 2 3 4 5 6 7 8 9 10 JP10 +5V PB0 (T0) 1 PB1 (T1) 2 PB2 (AIN0) 3 PB3 (AIN1) 4 PB4 (/SS) 5 PB5 (MOSI) 6 PB6 (MISO) 7 PB7 (SCK) 8 /RESET 9 VCC 10 GND 11 XTAL2 12 XTAL1 13 PD0 (RxD) 14 PD1 (TxD) 15 PD2 (INT0) 16 PD3 (INT1) 17 PD4 (OC1B) 18 PD5 (OC1A) 19 PD6 (ICP) 20 PA0 (ADC0) 40 PA1 (ADC1) 39 PA2 (ADC2) 38 PA3 (ADC3) 37 PA4 (ADC4) 36 PA5 (ADC5) 35 PA6 (ADC6) 34 PA7 (ADC7) 33 AREF 32 AGND 31