1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Thiết kế, thi công mô hình hệ thống phân loại gạch tự động

112 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Thiết Kế, Thi Công Mô Hình Hệ Thống Phân Loại Gạch Tự Động
Tác giả Hồ Ngọc Quỳnh, Trần Văn Thắng
Người hướng dẫn ThS. Phùng Sơn Thanh
Trường học Trường Đại Học Sư Phạm Kỹ Thuật Thành Phố Hồ Chí Minh
Chuyên ngành Công Nghệ Kỹ Thuật Điều Khiển Và Tự Động Hóa
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2023
Thành phố Tp. Hồ Chí Minh
Định dạng
Số trang 112
Dung lượng 25,71 MB

Nội dung

Trang 8 - Thiết kế giao diện người dùng.Hướng giải quyết:- Sử dụng các thanh trượt vitme để thiết kế hệ cơ cấu gắp, cùng với xylanh kẹp, xoay, AC Servo HG-KR13, HG-KR53.- Bộ điều khiển:

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH ĐỒ ÁN TỐT NGHIỆP NGÀNH CNKT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA THIẾT KẾ, THI CÔNG MÔ HÌNH HỆ THỐNG PHÂN LOẠI GẠCH TỰ ĐỘNG GVHD: ThS PHÙNG SƠN THANH SVTH : HỒ NGỌC QUỲNH TRẦN VĂN THẮNG SKL011314 Tp Hồ Chí Minh, tháng 7/2023 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH KHOA ĐÀO TẠO CHẤT LƯỢNG CAO ĐỒ ÁN TỐT NGHIỆP ĐỀ TÀI: THIẾT KẾ, THI CÔNG MÔ HÌNH HỆ THỐNG PHÂN LOẠI GẠCH TỰ ĐỘNG GVHD: ThS PHÙNG SƠN THANH SVTH : HỒ NGỌC QUỲNH 19151164 TRẦN VĂN THẮNG 19151176 Khố : 2019-2023 Ngành : CNKTĐK TỰ ĐỘNG HĨA Tp Hồ Chí Minh, 14 tháng năm 2023 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh phúc *** Tp Hồ Chí Minh, ngày 30 tháng 06 năm 2023 NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: HỒ NGỌC QUỲNH MSSV: 19151164 Họ tên sinh viên: TRẦN VĂN THẮNG MSSV: 19151176 Ngành: CNKTDK TỰ ĐỘNG HÓA Lớp: 19151CL2B Giảng viên hướng dẫn: ThS PHÙNG SƠN THANH Ngày nhận đề tài: 20-02-2023 ĐT: 0983960600 Ngày nộp đề tài: 30-06-2023 Tên đề tài: THIẾT KẾ, THI CÔNG MÔ HÌNH HỆ THỐNG PHÂN LOẠI GẠCH TỰ ĐỘNG Các số liệu, tài liệu ban đầu: - Những phương pháp thực tế được áp dụng điều khiển động AC Servo - Hệ thống phân loại ứng dụng xử lý ảnh - Tính ứng dụng của phân loại gạch thực tế Nội dung thực đề tài: - Tìm hiểu về PLC Mitsubishi dòng Q, module ngõ vào, module ngõ ra, position module - Nghiên cứu cách điều khiển vị trí động AC Servo - Phối hợp chuyển động giữa các trục vitme XYZ - Tìm hiểu về giải thuật xử lý ảnh phân loại sản phẩm - Thiết kế và thi công phần cứng cho mô hình - Viết chương trình điều khiển và chương trình xử lý ảnh - Thiết kế giao diện giám sát hệ thống - Chạy thử, hiệu chỉnh và cải tiến mô hình - Thực hiện viết báo cáo cho đề tài - Báo cáo đề tài tốt nghiệp Sản phẩm: Mơ hình hệ thống phân loại gạch tự động TRƯỞNG NGÀNH GIẢNG VIÊN HƯỚNG DẪN CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh Phúc ******* PHIẾU NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN Họ tên sinh viên: HỒ NGỌC QUỲNH MSSV: 19151164 Họ tên sinh viên: TRẦN VĂN THẮNG MSSV: 19151176 Ngành: CNKTDK TỰ ĐỘNG HÓA Tên đề tài: THIẾT KẾ, THI CÔNG MÔ HÌNH HỆ THỐNG PHÂN LOẠI GẠCH TỰ ĐỘNG Họ và tên Giáo viên hướng dẫn: ThS PHÙNG SƠN THANH NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại: Điểm:……………….(Bằngchữ: .) Tp Hồ Chí Minh, ngày tháng năm 2023 Giáo viên hướng dẫn (Ký & ghi rõ họ tên) CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự – Hạnh Phúc ******* PHIẾU NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN Họ tên sinh viên: HỒ NGỌC QUỲNH MSSV: 19151164 Họ tên sinh viên: TRẦN VĂN THẮNG MSSV: 19151176 Ngành: CNKTDK TỰ ĐỘNG HÓA Tên đề tài: THIẾT KẾ, THI CÔNG MÔ HÌNH HỆ THỐNG PHÂN LOẠI GẠCH TỰ ĐỘNG Họ và tên Giáo viên phản biện: NHẬN XÉT Về nội dung đề tài & khối lượng thực hiện: Ưu điểm: Khuyết điểm: Đề nghị cho bảo vệ hay không? Đánh giá loại Điểm:……………….(Bằngchữ: .) Tp Hồ Chí Minh, ngày tháng Giáo viên phản biện (Ký & ghi rõ họ tên) năm 2023 LỜI CẢM ƠN Đầu tiên, nhóm em xin chân thành cảm ơn Thầy hướng dẫn Ths.Phùng Sơn Thanh tận tình giúp đỡ nhóm q trình nghiên cứu đề tài, ln dành thời gian, công sức, kinh nghiệm dẫn q trình thực Ngồi ra, nhóm muốn bày tỏ lịng biết ơn tới q thầy trường Đại học Sư Phạm Kỹ Thuật TP.HCM, trang bị kiến thức giúp đỡ chúng em, giải khó khăn, hỗ trợ phương tiện thí nghiệm suốt trình tìm hiểu nghiên cứu thực đề tài Nhóm xin cảm ơn anh chị khóa trước bạn học cùng, có ý kiến đóng góp bổ sung, giúp đỡ, hướng dẫn giới thiệu tài liệu tham khảo Sau nhóm muốn gửi lời cảm ơn gia đình bạn bè nhóm, ln ln bên cạnh động viên hỗ trợ, lời khích lệ khơng giúp vượt qua khỏi khó khăn q trình thực mà cịn mang lại tự tin, ý chí kiên cường q trình thực để đồ án hồn thành tốt đẹp Một lần nữa, nhóm xin chân thành cảm ơn tất người giúp đỡ trình thực đồ án với đề tài “Thiết Kế, Thi Công Mô Hình Hệ Thống Phân Loại Gạch Tự Động” Nhóm xin gửi lời chúc sức khỏe thành công đến quý thầy cô giáo, xin chúc thầy tiếp tục có nhiều thành cơng công việc sống, tiếp tục đào tạo sinh viên giỏi để đóng góp cho phát triển nhà trường đất nước Nhóm chúc anh chị bạn học nhiều sức khoẻ, học tập tốt để chuẩn bị kiến thức vững vàng cho tương lai Nhóm xin chân thành cảm ơn TP Hồ Chí Minh, ngày 30 tháng 06 năm 2023 Sinh viên thực TÓM TẮT Đồ án tập trung việc nghiên cứu phát triển hệ thống phân loại gắp thả sản phẩm Hệ thống thiết kế để cải thiện hiệu tăng suất trình gắp thả sản phẩm quy trình sản xuất đóng gói Để giải toán đặt gắp thả sản phẩm cách xác hiệu quả, ta cần phân tích u cầu để có hiểu biết xác hệ thống Vấn đề đặt ra: - Thiết kế thi công hệ cấu gắp trục - Viết chương trình điều khiển cho hệ thống cấu gắp, băng tải, van điện từ - Lắp đặt camera, phân loại sản phẩm xử lý ảnh - Thiết kế giao diện người dùng Hướng giải quyết: - Sử dụng trượt vitme để thiết kế hệ cấu gắp, với xylanh kẹp, xoay, AC Servo HG-KR13, HG-KR53 - Bộ điều khiển: PLC Q03UDCPU, Driver MR-J3-10B, Driver điều khiển step motor - Phần mềm lập trình: GX Works2 để viết chương trình điều khiển, Visual Studio để viết thuật toán xử lý ảnh giao diện giám sát, GT SoftGot2000 thiết kế giao diện điều khiển - Sử dụng thiết bị khoan, cắt, để thiết kế chi tiết Đồ án thiết kế thi công thành công hệ thống gắp thả sản phẩm, nhận thấy hệ thống tồn số hạn chế, bao gồm giới hạn tốc độ, độ xác khí khả tương thích sử dụng sản phẩm khác Bên cạnh hạn chế đó, đồ án đề cải tiến phát triển cho hệ thống, bao gồm việc mở rộng phần khí, sử dụng động có cơng suất lớn Đồ án hồn thành việc nghiên cứu thiết kế hệ thống gắp thả sản phẩm, với khả hoạt động đáng tin cậy đáp ứng yêu cầu xác hiệu Ngoài ra, dự án đề xuất cải tiến phát triển tiềm cho hệ thống tương lai MỤC LỤC LỜI CẢM ƠN i TÓM TẮT ii MỤC LỤC iii DANH MỤC CÁC BẢNG vi DANH MỤC HÌNH ẢNH vii Chương TỔNG QUAN 1.1 ĐẶT VẤN ĐỀ 1.2 MỤC TIÊU 1.3 NỘI DUNG NGHIÊN CỨU 1.4 GIỚI HẠN Chương CƠ SỞ LÝ THUYẾT 2.1 TỔNG QUAN VỀ HỆ THỐNG 3 2.1.1 Phân Loại Sản Phẩm Ứng Dụng Xử Lý Ảnh 2.1.2 Hệ Thống Gắp Thả Vật Trục XYZ 2.2 GIỚI THIỆU CHUNG VỀ PLC 2.2.1 Khái Niệm 2.2.2 Đặc Điểm 2.3 HỆ THỐNG AC SERVO 2.3.1 Động Cơ Servo 6 2.3.1.1 Khái Niệm 2.3.1.2 Động Cơ Dc Servo 2.3.1.3 Động Cơ Ac Servo 2.3.2 Bộ Điều Khiển Servo 2.4 ENCODER 2.5 HỆ THỐNG XYLANH KHÍ NÉN 9 11 2.5.1 Van Điện Từ 11 2.5.2 Xylanh Khí Nén 12 2.6 HỆ THỐNG STEP MOTOR 2.6.1 Step Motor 13 13 2.6.1.1 Khái Niệm 13 2.6.1.2 Cấu Tạo 13 2.6.1.3 Nguyên Lý Hoạt Động 14 2.6.2 Bộ Điều Khiển Step Motor 2.7 ĐIỀU KHIỂN VỊ TRÍ AC SERVO 14 15 2.7.1 Điều Khiển Tuyến Tính Một Trục 15 2.7.2 Điều Khiển Nội Suy Tuyến Tính 16 2.7.3 Điều Khiển Nội Suy Cung Tròn Với Điểm Phụ 16 2.7.4 Điều Khiển Nội Suy Cung Tròn Với Điểm Trung Tâm 17 2.8 TỔNG QUAN VỀ XỬ LÝ ẢNH 17 2.8.1 Gaussian Blur 17 2.8.2 Background Subtraction 19 2.8.3 Webcam Xử Lý Ảnh 19 THIẾT KẾ VÀ THI CÔNG MƠ HÌNH 21 Chương 3.1 GIỚI THIỆU CHUNG VỀ HỆ THỐNG 21 3.2 YÊU CẦU 22 3.3 THIẾT KẾ 22 3.3.1 Phần Cơ Khí 22 3.3.2 Lựa Chọn Thiết Bị Điện 24 3.3.2.1 Bộ Điều Khiển Lập Trình Mitsubishi 24 3.3.2.2 Hệ AC Servo 30 3.3.2.3 Hệ Step Motor 34 3.3.2.4 Cảm Biến 36 3.3.2.5 Các Thiết Bị Khác 37 3.4 SƠ ĐỒ KẾT NỐI 40 3.5 THI CÔNG 45 3.5.1 Phần Cơ Khí 45 3.5.2 Phần Điện 46 10 PHỤ LỤC _capture.Read(frame); if (!frame.IsEmpty) { bitmapBG = frame.ToImage(); pictureBox1.Image = bitmapBG.ToBitmap(); } } catch (Exception ex) { MessageBox.Show("Có lỗi xảy tải ảnh từ Camera: " + ex.Message); } } private void button2_Click(object sender, EventArgs e) { try { _capture.Start(); Mat frame = new Mat(); _capture.Read(frame); if (!frame.IsEmpty) { bitmapFG = frame.ToImage(); pictureBox1.Image = bitmapFG.ToBitmap(); } } catch (Exception ex) { MessageBox.Show("Có lỗi xảy tải ảnh từ Camera: " + ex.Message); } } private void button3_Click(object sender, EventArgs e) { // Kiểm tra xem bitmapBG bitmapFG khởi tạo gán giá trị chưa if (bitmapBG == null || bitmapFG == null) { MessageBox.Show("Vui lòng tải ảnh Background Foreground trước thực phép trừ nền"); return; } perimeter = 0; 98 PHỤ LỤC area = 0; // Load ảnh Background Foreground //Image imgBg = bitmapBG.ToImage(); // Tạo ảnh đầu Image imgOutputBG = new Image(bitmapBG.Size); // Làm mịn ảnh đầu vào Gaussian Blur CvInvoke.GaussianBlur(bitmapBG, imgOutputBG, new Size(3, 3), 1.5, 1.5, BorderType.Default); // Hiển thị ảnh kết PictureBox //Image imgFg = bitmapFG.ToImage(); Image imgOutputFG = new Image(bitmapFG.Size); // Làm mịn ảnh đầu vào Gaussian Blur CvInvoke.GaussianBlur(bitmapFG, imgOutputFG, new Size(3, 3), 1.5, 1.5, BorderType.Default); // Trừ để phát vật thể Image imgDiff = imgOutputBG.Convert().AbsDiff(imgOutputFG.Convert()); // Hiển thị ảnh lên PictureBox2 pictureBox2.Image = imgDiff.AsBitmap(); Image binaryImg = imgDiff.ThresholdBinary(new Gray(44), new Gray(255)); VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); Mat hierarchy = new Mat(); CvInvoke.FindContours(binaryImg, contours, hierarchy, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple); Image colorImg = imgDiff.Convert(); double maxArea = 0; int maxIndex = 0; for (int i = 0; i < contours.Size; i++) { double area = CvInvoke.ContourArea(contours[i]); if (area > maxArea) { maxArea = area; maxIndex = i; } } if (contours.Size>0) { 99 PHỤ LỤC Rectangle rect = CvInvoke.BoundingRectangle(contours[maxIndex]); colorImg.Draw(rect, new Bgr(Color.Red), 5); // Vẽ hình chữ nhật đường bao có diện tích lớn perimeter = CvInvoke.ArcLength(contours[maxIndex], true); // Tính chu vi area = maxArea; // Gán diện tích diện tích lớn } else MessageBox.Show("Vui lịng chụp lại background và foreground", "warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); label1.Text = "Total Perimeter: " + perimeter.ToString() + ", Total Area: " + area.ToString(); pictureBox3.Image = colorImg.ToBitmap(); pictureBox2.Image = binaryImg.ToBitmap(); } private void timer1_Tick(object sender, EventArgs e) { try { _capture.Start(); Mat frame = new Mat(); _capture.Read(frame); if (!frame.IsEmpty) { bitmapFG = frame.ToImage(); pictureBox1.Image = bitmapFG.ToBitmap(); } } catch (Exception ex) { MessageBox.Show("Có lỗi xảy tải ảnh từ Camera: " + ex.Message); } // Kiểm tra xem bitmapBG bitmapFG khởi tạo gán giá trị chưa if (bitmapBG == null || bitmapFG == null) { MessageBox.Show("Vui lòng tải ảnh Background Foreground trước thực phép trừ nền"); return; } // Load ảnh Background Foreground Image imgOutputBG = new Image(bitmapBG.Size); // Làm mịn ảnh đầu vào Gaussian Blur 100 PHỤ LỤC CvInvoke.GaussianBlur(bitmapBG, imgOutputBG, new Size(3, 3), 1.5, 1.5, BorderType.Default); // Hiển thị ảnh kết PictureBox //Image imgFg = bitmapFG.ToImage(); Image imgOutputFG = new Image(bitmapFG.Size); // Làm mịn ảnh đầu vào Gaussian Blur CvInvoke.GaussianBlur(bitmapFG, imgOutputFG, new Size(3, 3), 1.5, 1.5, BorderType.Default); // Trừ để phát vật thể Image imgDiff = imgOutputBG.Convert().AbsDiff(imgOutputFG.Convert()); // Hiển thị ảnh lên PictureBox2 pictureBox2.Image = imgDiff.AsBitmap(); Image binaryImg = imgDiff.ThresholdBinary(new Gray(44), new Gray(255)); VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint(); Mat hierarchy = new Mat(); CvInvoke.FindContours(binaryImg, contours, hierarchy, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple); Image colorImg = imgDiff.Convert(); double maxArea = 0; int maxIndex = 0; for (int i = 0; i < contours.Size; i++) { double area = CvInvoke.ContourArea(contours[i]); if (area > maxArea) { maxArea = area; maxIndex = i; } } if (contours.Size > 0) { Rectangle rect = CvInvoke.BoundingRectangle(contours[maxIndex]); colorImg.Draw(rect, new Bgr(Color.Red), 5); // Vẽ hình chữ nhật đường bao có diện tích lớn perimeter2 = CvInvoke.ArcLength(contours[maxIndex], true); // Tính chu vi 101 PHỤ LỤC area2 = maxArea; // Gán diện tích diện tích lớn } pictureBox3.Image = colorImg.ToBitmap(); pictureBox2.Image = binaryImg.ToBitmap(); if (Math.Abs(perimeter2 - perimeter) < 700 && Math.Abs(area2 - area) < 13000) { if (delay == 0) { bit = "1"; dem++; delay = 1; } } else { delay = 0; bit = "0"; } if (bit=="1") { gt++; } gtst = gt.ToString(); SetText(gtst); StartSendValue(bit); label4.Text = "Total Perimeter: " + perimeter2.ToString() + ", Total Area: " + area2.ToString(); } private void button6_Click(object sender, EventArgs e) { timer1.Start(); } private void SetText(string text) { if (label3.InvokeRequired) { 102 PHỤ LỤC label3.Invoke(new Action(SetText), text); } else { label3.Text = text; } } } }  Giao Diện Và Code Form 2: Giao diện form Code form 2: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; 103 PHỤ LỤC using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ActUtlTypeLib; using SymbolFactoryDotNet; using System.Threading; namespace XLA4 { public partial class Form2 : Form { public delegate void SendValueDelegate(string value); public SendValueDelegate SendValue; private string ReceiveData1; private int read_result = 0; private int gach=0; private int gachloi = 0; private int dao=0; private int tt = 0; private Point originalLocation; public Form2() { InitializeComponent(); Form1 f2 = new Form1(); f2.StartSendValue += loadData; if (gach>0) { txtRec.Text = gach.ToString(); } } public ActUtlType plc = new ActUtlType(); private void Form2_Load(object sender, EventArgs e) { } private void loadData(String dulieu) { ReceiveData1 = dulieu; if ((ReceiveData1 == "1")&&(dao==0)) { 104 PHỤ LỤC gach++; SetText(gach.ToString()); String Memory = "1"; plc.SetDevice("m100", Convert.ToInt16(Memory)); dao = 1; } else if ((ReceiveData1 == "0")) { String Memory0 = "0"; plc.SetDevice("m100", Convert.ToInt16(Memory0)); } int x40 = 0; plc.GetDevice("x40", out x40); if (x40 == 1) { dao = 0; } int read_loi = 0; plc.GetDevice("y82", out read_loi); if (read_loi == && tt==0) { gachloi++; textBox2.Text = gachloi.ToString(); tt = 1; } else if (read_loi == && tt == 1) { tt = 0; } int gachchuan = 0; gachchuan = gach + gachloi; textBox1.Text = gachchuan.ToString(); } private void button4_Click(object sender, EventArgs e) { plc.ActLogicalStationNumber = 1; plc.Open(); plc.GetDevice("y20", out read_result); if (read_result == 1) 105 PHỤ LỤC { button4.BackColor = Color.Green; button4.Enabled = false; button5.Enabled = true; } else { MessageBox.Show("Vui lòng kiểm tra kết nối", "warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void button5_Click(object sender, EventArgs e) { read_result = 0; plc.Close(); button4.BackColor = Color.White; button4.Enabled = true; button5.Enabled = false; } private void SetText(string text) { if (txtRec.InvokeRequired) { txtRec.Invoke(new Action(SetText), text); } else { txtRec.Text = text; } } private void button1_Click(object sender, EventArgs e) { Form1 f2 = new Form1(); f2.StartSendValue += loadData; f2.ShowDialog(); } private void ON_OFF(StandardControl sd, byte Value) { if(Value == 1) { 106 PHỤ LỤC sd.DiscreteValue1 = true; sd.DiscreteValue2 = false; sd.DiscreteValue3 = false; } if (Value == 2) { sd.DiscreteValue1 = false; sd.DiscreteValue2 = true; sd.DiscreteValue3 = false; } if (Value == 3) { sd.DiscreteValue1 = false; sd.DiscreteValue2 = false; sd.DiscreteValue3 = true; } } void MoveObject(Control control, int x, int y) { // Lưu lại vị trí ban đầu Control originalLocation = control.Location; // Lấy tọa độ Control int currentX = control.Location.X; int currentY = control.Location.Y; // Tính toán khoảng cách tọa độ điểm đến int dx = x - currentX; int dy = y - currentY; // Tính tốn số lượng bước di chuyển cần thiết int steps = Math.Max(Math.Abs(dx), Math.Abs(dy)); // Tính toán khoảng cách di chuyển trục X Y bước float stepX = (float)dx / steps; float stepY = (float)dy / steps; // Di chuyển Control đến điểm đến for (int i = 0; i MoveObject(control, x, y))); } else { MoveObject(control, x, y); } } 110 PHỤ LỤC private void UpdateControlVisibility(Control control, bool visible) { if (control.InvokeRequired) { control.Invoke(new Action(UpdateControlVisibility), new object[] { control, visible }); } else { control.Visible = visible; } } } } 111

Ngày đăng: 28/12/2023, 18:49

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w