Hình 4.14: Khối chương trình
Khối lấy dữ liệu từ file .TXT
Hình 4.15: Khối lấy dữ liệu từ file .TXT
Khối lấy dữ liệu từ file .TXT có ô trỏ cho phép nạp file dữ liệu đuôi .TXT, chuyển sang dạng text, xuất thành mảng dữ liệu theo từng cột.
73
Khối tín hiệu tay số
Hình 4.16: Khối tín hiệu tay số
Là khối điều kiện gồm default (tay số 1 2 3), -1 (tay số P), -2 (tay số R)
Khối xác định thời điểm tai nạn
Hình 4.17:Khối xác định thời điểm tai nạn
Khối dựa trên giá trị gia tốc thẳng đạt giá trị > 2.5g (24m/s2) hay gia tốc ngang đạt giá trị >1g (9.81 m/s2) để xác định thời điểm xảy ra tai nạn.
74
Khối tách dữ liệu thành các tín hiệu riêng biệt
Hình 4.18: Khối tách dữ liệu thành các tín hiệu riêng biệt
Khối này tách các dữ liệu theo của file dữ liệu thành các cột dữ liệu riêng biệt ứng với mỗi thông số, dữ liệu được tách ra và ở dạng chuỗi.
Khối vẽ đồ thị tọa độ chuyền động của ô tô
Hình 4.19: Khối vẽ đồ thị tọa độ chuyền động của ô tô
Tọa độ chuyển động của ô tô được tính toán như mô tả ở phần hình ảnh 4.12: Giao diện đồ thị tọa độ quỹ đạo chuyển động của xe.
75
Ngoài giao diện chính, nhóm nghiên cứu còn tạo thêm 2 giao diện đồ thị để thể hiện từng thông số của xe trong quá trình tai nạn.
Hình 4.20: Đồ thị hành vi người lái và sự chuyển động của xe
Các đồ thị chia thành 2 nhóm chính: Nhóm 1 là các thông số thể hiện tác động của người lái lên xe. Nhóm 2 là các thông số chuyển động thực tế của xe
Đồ thị diễn tả quá trình thay đổi của từng thông số đã lưu trữ theo thời gian thực
Hình 4.21: Đồ thị tín hiệu của xe
Đồ thị này giúp dễ dàng so sánh mỗi tương quan giữa hành vi của người lái và chuyển động thực tế của xe trên cũng 1 trục thời gian xung quanh thời điểm tai nạn.
76
Hình 4.22: Giao diện thông số bàn đạp ga và tốc độ theo thời gian
77
Hình 4.24: Giao diện thông số tay số, phanh và ly hợp của xe
Trên đây là một giao diện hiển thị khác hỗ trợ xử lý tai nạn với các thông số có tương quan với nhau: Bàn đạp ga – tốc độ xe, góc lái – góc Yaw xe, … các đồ thị này giúp điều tra viên có thể so sánh các hành vi của người lái và thông số tình trạng thực tế của xe.
78
CHƯƠNG 5: KẾT QUẢ THỰC NGHIỆM 5.1. Lắp đặt thiết bị
Vì việc lấy dữ liệu tai nạn khó thực hiện trong thực tế nên nhóm sẽ thiết kế mô hình giả lập tai nạn với các thông số giá trị bàn đạp ga, tốc độ xe, phanh, tín hiệu lái xe, tay số, ly hợp và truyền dữ liệu giao tiếp với mô hình thu thập dữ liệu bằng mạng truyền thông CAN.
.
Hình 5.1: Sơ đồ đấu dây module giả lập
Ở module giả lập các giá trị thay đổi từ các nút bấm và biến trở giả lập thông số tạo ra các tín hiệu tốc độ xe, vị trí bàn đạp chân ga, góc đánh vô lăng, vị trí tay số, bàn đạp phanh, ly hợp, tín hiệu lỗi SRS của xe theo thời gian thực của module RTC DS1307. Các tín hiệu này được Arduino ghi nhận và truyền thông qua mạng CAN đến module lưu trữ dữ liệu tai nạn.
79
Hình 5.2: Sơ đồ đấu dây giữa 2 mô hình (module giả lập bên trái và module
thu thập dữ liệu bên phải)
Đồng thời Nhóm nghiên cứu cũng di chuyển module lưu trữ dữ liệu để tạo ra các tín hiệu về góc xoay, gia tốc và giả tín hiệu tai nạn.
80
5.2. Kết quả thu được
5.2.1. Kết quả thu được trên Module giả lập
Hình 5.4: Giao diện hiển thị của module giả lập
Màn hình LCD thể hiện các thông số vị trí bàn đạp ga, góc đánh vô lăng, tốc độ và tay số hiện tại điều khiển chính xác điều kiện giả lập.
81
5.2.2. Kết quả lưu trữ trên thẻ SD
Hình 5.5: Kết quả lưu được trên thẻ SD
Các tín hiệu được lưu dưới dạng file .txt trong thẻ nhớ. Mỗi tín hiệu được chia thành các cột riêng biệt nhằm dễ dàng cho việc xử lý số liệu trên Labview
82
5.2.3. Kết quả hiển thị trên Labview
Hình 5.6: Kết quả hiển thị trên Labview
Giao diện Labview thể hiện các thông số chuyển động trước và sau tai nạn 30s. Giúp người điều tra viên đánh giá tai nạn có được cái nhìn tổng quan về các thông số và các thay đổi trong thời điểm xảy ra tai nạn.
Thông số SRS: Trạng thái về dây an toàn, túi khí có bị lỗi trong thời gian tai nạn
hay không. Thông số giúp đánh giá về người trong xe có hay không sử dụng dây an toàn.
Thông số gia tốc: Thông số gia tốc được tính toán dựa vào sự thay đổi vận tốc delta
V trong một khoảng thời gian nhỏ lấy mẫu, gia tốc được tính với đơn vị m/s2, đại lượng này đặc trưng cho sự thay đổi vận tốc của xe theo thời gian, người ta cũng dựa vào số liệu gia tốc để nhận định và phân tích mức độ nghiêm trọng của vụ tai nạn, vì nếu gia tốc lớn, các thuộc tính liên quan đến đại lượng gia tốc như lực quán tính, momen quán tính cũng sẽ rất lớn, những thành phần này sẽ là thước đo cho sự nghiệm trọng của vụ tai nạn.
Thông số vận tốc: Thông số vận tốc cho biết tốc độ của xe trước, trong và sau thời
điểm xảy ra tai nạn, đại lượng này giúp người điều tra biết được tại thời điểm xảy ra tai nạn, người điều khiển phương tiện có đang phạm luật quá tốc độ hay không.
Thông số tay số: Thông số tay số giúp điều tra viên đánh giá hành vi tác động của
người lái lên xe. Số tiến (1,2,3) số lùi (R), hay số trung gian(N) ảnh hưởng đến tốc độ và hướng chuyển động của xe.
83
Thông số bàn đạp ga: Dữ liệu bàn đạp ga được lấy từ cảm biến bàn đạp ga, nó cho
biết tại thời điểm trước, trong và sau va chạm, người lái xe có đang đạp bàn đạp ga hay không, giá trị phần trăm bàn đạp ga là bao nhiêu.
Thông số bàn đạp phanh: Dữ liệu bàn đạp phanh (phần trăm bàn đạp phanh) được
lấy từ công tắc cảm biến lực đạp phanh kết hợp với dữ liệu bàn đạp ga cho biết liệu người lái có chủ động giảm tốc để tránh tai nạn hoặc giảm thiểu mức độ nghiêm trọng của tai nạn hay không.
Thông số góc lái: Dữ liệu thông số góc lái được lấy từ cảm biến góc lái của xe, lắp
tại vị trí vô lăng lái. Đại lượng này giúp người điều tra viên biết được tại thời điểm trước, trong và sau va chạm, người lái xe đang lái xe với góc lái như thế nào, người lái có chủ động đánh lái để tránh tai nạn hoặc giảm mức độ nghiêm trọng của tai nạn hay không.
84
Hình 5.8: Kết quả đồ thị tín hiệu xe
85
Hình 5.10: Giao diện thông số góc lái và góc Yaw của xe theo thời gian
86
Chương 6. KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN 6.1. Những kết quả đạt được
Sau thời gian thực hiện đồ án với sự hướng dẫn và giúp đỡ của giảng viên hướng dẫn
ThS Nguyễn Trọng Thức, nhóm đã hoàn thành đề tài và đạt được những kết quả sau:
Thực hiện giả lập một vài thông số quan trọng cần thu thập để xử lý và tái hiện sau khi xe bị tai nạn, lưu trữ dữ liệu vào thẻ nhớ thông qua việc lấy dữ liệu bằng giao thức CAN, tăng mẫu lấy dữ liệu để đạt được số dữ liệu lưu được là 8 lần/giây.
Thiết kế công cụ hiển thị lại các giá trị đã thu thập được thành đồ thị theo thời gian để thuận tiện cho quá trình phân tích.
Qua đề tài này chúng em có cơ hội tìm hiểu sâu hơn về chuẩn giao tiếp CAN trên xe ô tô, kết hợp các module, cảm biến và lập trình vi điều khiển vào thực tế, nâng cao kỹ năng tìm kiếm, sàng lọc và đọc hiểu tài liệu, thấy được những thiếu xót trong kiến thức để có thể học tập và trao dồi hơn cho những công việc sau này.
6.2. Hướng phát triển của đề tài
Sử dụng bộ lọc nhiễu để tăng độ chính xác của cảm biến MPU 6050 và loại bỏ giá trị của gia tốc trọng trường lên gia tốc thẳng và gia tốc ngang để tính vận tốc thực tế của xe.
Thử nghiệm thiết bị trên xe thực tế có hỗ trợ cung cấp các thông số quan trọng như góc lái, phanh, tay số, …
Sử dụng kết hợp thông qua module bluetooth, module wifi để thu thập dữ liệu trên xe, lưu trữ trên server
Sử dụng cảm biến GPS để thu được tọa độ tại nạn, kết hợp với cảm biến gia tốc để đo chính xác tốc độ thực tế của xe
87
TÀI LIỆU THAM KHẢO
(1) https://www.rietveld.nl/wp-content/uploads/2019/04/EDR-Event-Data-Recorder- 2019.pdf truy cập 17/11/2020 (2) https://www.aaam.org/education-resource-center/public-position-statements/event- data-recorder-position-statement/ truy cập 17/11/2020 (3) https://carsexplained.wordpress.com/2017/02/21/fundamentals-of-car-science-pitch- and-roll/ truy cập 5/1/2021 (4) https://mesidas.com/can-canbus/ truy cập 11/1/2021 (5) https://news.hoikysuotovn.com/cau-truc-tren-giac-chan-doan-obd-ii-va-y-nghia-cac- con-so-trong-ma-loi-obd-ii/ truy cập 15/1/2021
(6) https://en.wikipedia.org/wiki/OBD-II_PIDs truy cập ngày 15/1/2021
(7) http://dammedientu.vn/chuan-giao-tiep-spi-va-cach-ket-noi/ truy cập ngày 9/1/2021 (8) http://arduino.vn/bai-viet/1053-giao-tiep-i2c-voi-nhieu-module truy cập ngày
8/1/2021 (9) http://dammedientu.vn/gioi-thieu-chuan-giao-tiep-i2c/ (10) https://stackoverflow.com/questions/58469297/how-do-i-calculate-the-yaw-pitch- and-roll-of-a-point-in-3d?noredirect=1&lq=1 (11) https://www.analog.com/en/technical-articles/mems-gyroscope-provides- precision-inertial-sensing.html?fbclid=IwAR1k8X3WwFM8Z9o4vYc- eP2KbcX9N6x3DYcoZ-lIvnCA82oRAcuv7nmhfQ8 (12) https://sensorwiki.org/sensors/gyroscope?fbclid=IwAR0uKr-O7tweqTpYye- Zwl73D4Pi6xzeqHasSU-ul0hJ7qu1j5V8KPK4LII (13) http://www.formula1-dictionary.net/motions_of_f1_car.html (14) https://www.geotab.com/white-paper/collision-reconstruction-with-telematics/
88
PHỤ LỤC
Code module giả lập:
1. #include <mcp_can.h> // khai báo thư viện CAN
2. #include <SPI.h> //Khai báo thư viện SPI
3. #include <Wire.h> //Khai báo thư viện wire cho I2C
4. #include <LiquidCrystal_I2C.h> //Khai báo thư viện I2C
5. LiquidCrystal_I2C lcd(0x27,20,4);
6. #include <RTClib.h> //Khai báo thư viện RTC
7. int readA0();
8. RTC_DS1307 rtc;
9. char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
10. int St,Sp, STA;
11. const int VPA = A3;
12. const int Speed=A2;
13. const int Steer=A1;
14. const int Clutch=4;
15. const int SRS=5;
16. const int Brake=8;
17. const int SPI_CS_PIN = 10;
18. MCP_CAN CAN(SPI_CS_PIN); //Set CS pin của module CAN Bus
19. void setup() 20. { Serial.begin(9600); 21. 22. if (! rtc.begin()) 23. { 24. Serial.print("Couldn't find RTC"); 25. while (1); 26. } 27. 28. if (! rtc.isrunning())
89
29. {
30. Serial.print("RTC is NOT running!");
31. Serial.println();
32. }
33. rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
34. pinMode(0, OUTPUT); //Khai báo các chân tín hiệu
35. pinMode(Clutch, INPUT); 36. pinMode(VPA, INPUT); 37. pinMode(Speed, INPUT); 38. pinMode(Steer, INPUT); 39. pinMode(SRS, INPUT); 40. pinMode(A0, INPUT);
41. lcd.init(); //Khởi tạo LCD
42. lcd.backlight();
43. lcd.print("VPA:"); //VARIBLE PEDAL ACCELARATE
44. lcd.setCursor(9,0);
45. lcd.print("Speed:"); //VEHICLE SPEED
46. lcd.setCursor(0,1);
47. lcd.print("STA:"); //STEERING ANGLE
48. lcd.setCursor(9,1);
49. lcd.print("Gear:"); //GEAR NUMBER
50. while (CAN_OK != CAN.begin(CAN_500KBPS)) // khởi tạo tốc độ CAN : baudrate = 500k
51. {
52. Serial.println("CAN BUS Shield init fail");
53. Serial.println(" Init CAN BUS Shield again");
54. digitalWrite(0,LOW);
55. delay(100);
56. }
57. Serial.println("CAN BUS Shield init ok!");
90
59. }
60. unsigned char DataVPA[8] = {0x02, 0x41, 0x49, 0, 0, 0, 0, 0}; //khởi tạo smg
61. unsigned char DataSpeed[8] = {0x02, 0x41, 0x0D, 0, 0, 0, 0, 0};
62. unsigned char DataSteer[8] = {0x02, 0x41, 0x25, 0, 0, 0, 0, 0};
63. unsigned char DataGear[8] = {0x02, 0x41, 0x26, 0, 0, 0, 0};
64. unsigned char DataBrake[8] = {0x02, 0x41, 0x60, 0, 0, 0, 0, 0};
65. unsigned char DataSRS[8] = {0x02, 0x41, 0x28, 0, 0, 0, 0, 0};
66. unsigned char DataClutch[8] = {0x02, 0x41, 0x35, 0, 0, 0, 0, 0};
67. unsigned char DataTime[8] = {0x02, 0x41, 0x30, 0, 0, 0, 0, 0};
68. unsigned char DataDate[8] = {0x02, 0x41, 0x31, 0, 0, 0, 0, 0};
69. void loop()
70. {
71. DateTime now = rtc.now(); //gán giá trị cho smg
72. DataDate[3]=now.day(); 73. DataDate[4]=now.month(); 74. DataDate[5]=(now.year()/1000)*10+(now.year()%1000)/100; 75. DataDate[6]=now.year()%100; 76. DataTime[3]=now.hour(); 77. DataTime[4]=now.minute(); 78. DataTime[5]=now.second(); 79. DataGear[3]=readA0(); 80. DataBrake[3]=digitalRead(Brake); 81. DataSRS[3]=digitalRead(SRS); 82. DataClutch[3]=digitalRead(Clutch); 83. DataVPA[3]=map(analogRead(VPA),0,1023,0,100);
84. Sp=map(analogRead(Speed),0,1023,0,120); //gán giá trị speed
85. DataSpeed[3]=Sp;
86. St=map(analogRead(Steer),0,1023,-100,100); //gán giá trị steer
87. STA=map(analogRead(Steer),0,1023,-600,600);
88. DataSteer[3]=abs(St); //gán giá trị steer cho msg
91 90. { 91. DataSteer[4]=1; 92. } 93. else 94. { 95. DataSteer[4]=0; 96. } 97. lcd.setCursor(4,0); 98. if (DataVPA[3]<10) {lcd.print("00");} 99. if (DataVPA[3]>=10&&DataVPA[3]<100) {lcd.print("0");} 100. lcd.print(DataVPA[3]); 101. lcd.setCursor(15,0); 102. if (Sp<10) {lcd.print("00");} 103. if (Sp>=10&&Sp<100) {lcd.print("0");} 104. lcd.print(Sp); 105. lcd.setCursor(4,1); 106. if (STA>0) {lcd.print("+");} 107. if (STA<0) {lcd.print("-");} 108. if (abs(STA)<10) {lcd.print("00");} 109. if (abs(STA)>=10&&abs(STA)<100) {lcd.print("0");} 110. lcd.print(abs(STA)); 111. lcd.setCursor(15,1); 112. switch (DataGear[3]){ 113. case 5: 114. lcd.print("R"); 115. break; 116. case 4: 117. lcd.print("P"); 118. break; 119. case 0: 120. lcd.print("N");
92 121. break; 122. default: 123. lcd.print(DataGear[3]); 124. break; 125. }
126. CAN.sendMsgBuf(0x7E, 0, 8, DataDate); //gửi dữ liệu qua CAN
127. delay(10); 128. CAN.sendMsgBuf(0x7E, 0, 8, DataTime); 129. delay(10); 130. CAN.sendMsgBuf(0x7E8, 0, 8, DataVPA); 131. delay(10); 132. CAN.sendMsgBuf(0x7E8, 0, 8, DataSpeed); 133. delay(10); 134. CAN.sendMsgBuf(0x264, 0, 8, DataSteer); 135. delay(10); 136. CAN.sendMsgBuf(0x1D0, 0, 8, DataGear); 137. delay(10); 138. CAN.sendMsgBuf(0x194, 0, 8, DataSRS); 139. delay(10); 140. CAN.sendMsgBuf(0x136, 0, 8, DataClutch); 141. delay(10); 142. CAN.sendMsgBuf(0x30, 0, 8, DataBrake); 143. delay(10); 144. }
145. int readA0(){ //chương trình con đọc dữ liệu tay số
146. int Gr; 147. int y = floor(map(analogRead(A0),0,1023,0,200)); 148. if (y >= 163 && y <= 170) { 149. Gr=0; 150. } 151. if (y >= 156 && y <= 160) {
93 152. Gr=4; 153. } 154. if (y >= 145 && y <= 155 ) { 155. Gr=1; 156. } 157. if (y >= 125 && y <= 135) { 158. Gr=2; 159. } 160. if (y >=95 && y <= 110) { 161. Gr=3; 162. } 163. if (y >= 0 && y <= 10) { 164. Gr=5; 165. } 166. return Gr; 167. } ////END