Đồ án tốt nghiệp Hệ thống kiểm soát người ra vào phòng tự động + code

27 6 0
Đồ án tốt nghiệp  Hệ thống kiểm soát người ra vào phòng tự động + code

Đ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

Ngày nay, các hệ thống nhúng trở nên phổ biến và đóng vai trò quan trọng trong đời sống con người. Ví dụ quanh ta có rất nhiều sản phẩm nhúng như lò vi sóng, nồi cơm điện, điều hòa, điện thoại di động, ô tô, xe máy, máy bay, tàu thủy, các đầu đo, cơ cấu chấp hành thông minh, robot v.v… Ta có thể thấy hiện nay hệ thống nhúng có mặt ở mọi nơi trong cuộc sống quanh chúng ta.

BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THƠNG BÁO CÁO ĐỒ ÁN THIẾT KẾ HỆ THỐNG NHÚNG Đề tài: Hệ thống kiểm soát người vào phòng tự động MỤC LỤC LỜI MỞ ĐẦU I, Tổng quan RTOS: 1.1 Khái niệm RTOS: 1.2 Các thành phần RTOS phương thức hoạt động: II, FreeRTOS 2.1 Tổng quan FreeRTOS 2.2 Các Task FreeRTOS 12 III, STM32F103C8T6 14 3.1 Giới thiệu sơ lược: 14 3.2 Cấu hình chi tiết STM32F103C8T6: 15 3.3 Thông số kỹ thuật: 18 IV, Màn hình LCD 16x2 20 V, Cảm biến vật cản hồng ngoại 23 VI, Giao tiếp STM32F103C8T6 với LCD 16×2 thơng qua moudle I2C 23 6.1 Kết nối MCU STM32 với LCD 23 6.2 Địa Module I2C PCF8574 24 VII, Mạch nguyên lý, PCB, mạch thực tế 25 LỜI MỞ ĐẦU Ngày nay, hệ thống nhúng trở nên phổ biến đóng vai trị quan trọng đời sống người Ví dụ quanh ta có nhiều sản phẩm nhúng lị vi sóng, nồi cơm điện, điều hịa, điện thoại di động, ô tô, xe máy, máy bay, tàu thủy, đầu đo, cấu chấp hành thông minh, robot v.v… Ta thấy hệ thống nhúng có mặt nơi sống quanh Qua môn học hệ thống nhúng, chúng em hiểu thêm hệ thống nhúng thực tế, đặc điểm, tính ưu việt tính ứng dụng chúng người Với mong muốn làm rõ kiến thức học giới thiệu ứng dụng hệ thống nhúng, nhóm chúng em đưa mơ hình mạch đếm số người vào phòng tự động – sản phẩm quen thuộc có tính ứng dụng cao thực tế Do thời tian thực kiến thức hạn chế nên cịn nhiều sai sót q trình thực đề tài, nhóm chúng em mong nhận bổ sung đóng góp thầy bạn để đề tài hoàn thiện Chúng em xin chân thành cảm ơn thầy tận tình hướng dẫn, giảng dạy giúp đỡ chúng em thực đề tài này! Sinh viên thực đề tài Nhóm I, Tổng quan RTOS: 1.1 Khái niệm RTOS: + RTOS viết tắt cụm từ Real-time operating system hay hệ điều hành thời gian thực thường nhúng dòng vi điều khiển dùng để điều khiển thiết bị cách nhanh chóng đa nhiệm (multi tasking) + Hệ điều hành thời gian thực (realtime): sinh cho tác vụ cần phản hồi nhanh hệ thống, thường nhúng loại vi điều khiển khơng có giao diện (GUI) tương tác với người dùng Chúng cần phản hồi nhanh đa số tác vụ tương tác với thiết bị, máy móc khác khơng phải người Các tài nguyên bên hữu hạn nên chậm trễ làm hệ thống làm việc hoàn toàn sai lệch 1.2 Các thành phần RTOS phương thức hoạt động: + Kernel hay gọi Nhân có nhiệm vụ quản lý điều phối Task Mọi kiện (Even) ngắt, Timer, data truyền tới… qua Kernel xử lý để định xem nên làm Thời gian xử lý Kernel thường nhanh nên độ trễ thấp + Task đoạn chương trình thực thi nhiều vấn đề đó, Kernel quản lý Kernel quản lý việc chuyển đổi task, lưu lại ngữ cảnh task bị hủy khôi phục lại ngữ cảnh task cách: • Kiểm tra thời gian thực thi định nghĩa trước (time slice tạo ngắt systick) • Khi có kiện unblocking task có quyền cao xảy (signal, queue, semaphore,…) • Khi task gọi hàm Yield() để ép Kernel chuyển sang task khác mà chờ cho hết time slice • Khi khởi động kernel tạo task mặc định gọi Idle Task Một task RTOS thường có trạng thái sau: • RUNNING: thực thi • READY: sẵn sàng để thực • WAITING: chờ kiện • INACTIVE: khơng kích hoạt + Scheduler – Lập lịch: Đây thành phần kernel định task thực thi Có số luật cho scheduling như: Cooperative: giống với lập trình thơng thường, task thực thi task chạy dừng lại, nhược điểm task dùng hết tất tài nguyên CPU Round-robin: task thực thời gian định trước (time slice) khơng có ưu tiên Priority base: Task phân quyền cao thực trước, task có quyền giống với round-robin, task có mức ưu tiên thấp thực cuối time slice Priority-based pre-emptive: Các task có mức ưu tiên cao ln nhường task có mức ưu tiên thấp thực thi trước + Kết nối Inter-task & Chia sẻ tài nguyên: để hệ thống hoạt động ổn định task cần phải kết nối trao đổi liệu với để chia sẻ tài nguyên, số khái niệm cần lưu ý: Với Inter-task Communication: • Signal Events – Đồng task • Message queue – Trao đổi tin nhắn task hoạt động giống FIFO • Mail queue – Trao đổi liệu task sử dụng đợi khối nhớ Với Resource Sharing: • Semaphores – Truy xuất tài nguyên liên tục từ task khác • Mutex – Đồng hóa truy cập tài nguyên sử dụng Mutual Exclusion + Signal event dùng để đồng task, ví dụ bắt task phải thực thi kiện định sẵn Mỗi task gán tối đa 32 signal event + Message queue – Hàng đợi tin nhắn chế cho phép task kết nối với nhau, FIFO ( First In First Out) buffer định nghĩa độ dài (số phần tử mà buffer lưu trữ) kích thước liệu (kích thước thành phần buffer) Task ghi vào đợi (queue) • Task bị khóa (block) gửi liệu tới message queue đầy đủ • Task hết bị khóa (unblock) nhớ message queue trống • Trường hợp nhiều task mà bị block task với mức ưu tiên cao unblock trước Task đọc từ đợi (queue) • Task bị block message queue trống • Task unblock có liệu message queue • Tương tự ghi task unblock dựa mức độ ưu tiên + Mail queue truyền liệu truyền dạng khối(memory block) thay dạng đơn Mỗi memory block cần phải cấp phát trước đưa liệu vào giải phóng sau đưa liệu Thao tác gửi liệu với mail queue Cấp phát nhớ từ mail queue cho liệu đặt mail queue Lưu liệu cần gửi vào nhớ cấp phát Đưa liệu vào mail queue Thao tác nhận liệu mail queue task khác Lấy liệu từ mail queue, có hàm để trả lại cấu trúc/ đối tượng Lấy trỏ chứa liệu Giải phóng nhớ sau sử dụng liệu + Semaphore Được sử dụng để đồng task với kiện khác hệ thống Có loại: Binary semaphore: Semaphore mã thông báo giống mã thông báo cho phép tác vụ thực việc thực thi tác vụ nhận semaphore Nếu không, tác vụ trạng thái khối thực thi trừ có semaphore nhị phân • Có token • Chỉ có hoạt động đồng Counting semaphore: đưa Token cho Task sử dụng tài nguyên, tài nguyên sử dụng hết Task cịn lại phải chờ đến Tài nguyên giải phóng trở lại Couting semaphore dùng để: Counting event • Một event handler ‘give’ semaphore có event xảy (tăng giá trị đếm semaphore) • Một task handler ‘take’ semaphore thực thi kiện (giảm giá trị đếm semaphore) • Count value khác số kiện xảy số kiện thực thi • Trong trường hợp counting event semaphore khởi tạo giá trị đếm Resource management • Count value số resource sẵn có • Để điều khiển kiểm soát resource task dựa count value semaphore(giá trị giảm), count value giảm xuống nghĩa khơng có resource free • Khi task finish với resource give semaphore trở lại để tăng count value semaphore • Trong trường hợp resouce management count value với giá trị max count value semaphore tạo + Mutex: Sử dụng cho việc loại trừ (mutial exclution), hoạt động token để bảo vệ tài nguyên chia sẻ Một task muốn truy cập vào tài nguyên chia sẻ • Cần yêu cầu (đợi) mutex trước truy cập vào tài nguyên chia sẻ (Sharing Resourse) • Đưa token kết thúc với tài nguyên Tại thời điểm có task có mutex Những task khác muốn mutex phải block task cũ thả mutex Về Mutex giống binary semaphore sử dụng cho việc loại trừ đồng II, FreeRTOS 2.1 Tổng quan FreeRTOS - Để sử dụng FreeRTOS, cách bạn phải biết sử dụng API(nói dễ hiểu hàm cung cấp sẵn) nó, bảng tổng quan API FreeRTOS mô tả cụ thể Phân loại API FreeRTOS API Mô tả Tạo task xTaskCreate Tạo task vTaskDelete Xóa task vTaskDelay Delay task Control task Phân loại API Control kernel Messagequeues Semaphores Timers FreeRTOS API Mô tả vTaskPrioritySet Set quyền cho task vTaskSuspend Suspend task vTaskResume Tiếp tục task vTaskStartScheduler Start kernel scheduler vTaskSuspendAll Suspend taats task xTaskResumeAll Tiếp tục taất task taskYIELD Foce chuyển đổi context taskENTER_CRITICAL Vào critical section(dùng context switching) taskEXIT_CRITICAL Thoát khỏi critical section xQueueCreate Tạo queue xQueueSend Gửi data vào queue xQueueReceive Nhận data từ queue xSemaphoreCreateBinary Tạo binary semaphore xSemaphoreCreateCounting Tạo counting semaphore xSemaphoreCreateMutex Tạo mutex semaphore xSemaphoreTake Take semaphore xSemaphoreGive Give semaphore xTimerCreate Tạo timer 10 • Sau có định nghĩa trước thời gian thực thi (execution time), thời gian time slide lấy systick interrupt • Khi có event unblock quyền ưu tiên cao (higher priority) xảy signal,queue, semaphore, • Khi task gọi hàm osThreadYield () để thông báo kernel chuyển sang task khác mà không đợi tới kết thúc time slice - FreeRTOS OS interrupt: Với core Cortex implement số tính giúp hỗ trợ can thiệp trực tiếp vào os hệ thống, ngắt chuyên dụng cho os + PendSV interrupt: • Trong interrupt scheduler • Quyền ngắt NVIC mức thấp • Khơng bị trigger ngoại vi • Trạng thái chờ xử lý từ ngắt khác từ task muốn kết thúc sớm(non MPU version) + SVC interrupt • Interrupt gọi tập lệnh SVC • Được gọi task muốn kết thúc sớm (MPU version) • Trong ngắt set pending state (MPU version) - Stack pointer: stack pointer + Process stack pointer • Được sử dụng interrupt • Cấp phát linker q trình compile + Main stack pointer • Mỗi task có stack pointer • Trong q trình switch context stack pointer khởi tạo task xác - Mức độ ưu tiên task thay đổi cách dùng hàm osThreadSetPriority() Với CMSIS-RTOS có số priority level sau: 13 • osPriorityIdle – priority thấp • osPriorityLow • osPriorityBelowNormal • osPriorityNormal – priority mặc định • osPriorityHigh • osPriorityRealtime III, STM32F103C8T6 3.1 Giới thiệu sơ lược: - STM32 dòng chip phổ biến ST với nhiều họ thông dụng F0,F1,F2,F3,F4… Stm32f103 thuộc họ F1 với lõi ARM COTEX M3 STM32F103 vi điều khiển 32 bit, tốc độ tối đa 72Mhz - Một số ứng dụng chính: dùng cho driver để điều khiển ứng dụng, điều khiển ứng dụng thông thường, máy tính thiết bị ngoại vi chơi game, GPS bản, ứng dụng công nghiệp, thiết bị lập trình PLC, biến tần, máy in, máy quét, hệ thống cảnh báo, thiết bị liên lạc nội bộ… - Phần mềm lập trình: có nhiều trình biên dịch cho STM32 IAR Embedded Workbench, Keil C… - Thư viện lập trình: có nhiều loại thư viện lập trình cho STM32 như: STM32snippets, STM32Cube LL, STM32Cube HAL, Standard Peripheral Libraries, Mbed core - Mạch nạp: có nhiều loại mạch nạp : ULINK, J-LINK , CMSIS-DAP, STLINK… - Sơ lược Board trên: • cổng Mini USB dùng để cấp nguồn, nạp debug 14 • MCU bao gồm MCU nạp MCU dùng để lập trình • Có chân Output riêng cho chân mạch nạp MCU1 • Có chân Output đầy đủ cho chân MCU2 • Chân cấp nguồn ngồi riêng cho MCU2 khơng sử dụng nguồn từ USB • Thạch anh 32,768khz dùng cho RTC Backup • Chân nạp dùng cho chế độ nạp boot loader • Nút Reset led hiển thị chân PB9, led báo nguồn cho MCU2 3.2 Cấu hình chi tiết STM32F103C8T6: Minh họa chân nối quanh cạnh PCB, bao gồm nguồn 15 Nguồn cấp vào chân +5V, +3.3V cổng USB, với điện áp phù hợp Chân đánh dấu “5V” (khơng có dấu cộng) chân input chịu áp 5V Chân đánh dấu dấu cộng chân input nguồn Bốn chân đầu board (màu xanh đậm) dùng để lập trình thiết bị Lưu ý chân lập trình DIO có khả chân GPIO PA13 Tương tự vậy, DCLK có khả trở thành chân GPIO PA14 Xuyên suốt sách này, bạn học cách cấu hình cho chip STM32 Ở chân lập trình, lưu ý điện áp cấp vào +3.3V Về mặt điện, chân tương tự chân khác có nhãn “+3.3V” Trong hình trên, chúng có màu cam nhạt Power USB/+5V cấp nguồn cáp USB, nguồn đến đầu nối MicroUSB B Nguồn cấp 5V điều chỉnh thành +3.3V mà MCU cần Tương tự, chân có nhãn “+5V” (với dấu cộng), sử dụng chân nguồn vào Dòng đến điều áp dịng cấp qua cổng USB Nếu có Nguồn cấp +3.3V, để ngỏ chân input +5V Nối trực tiếp nguồn cấp +3.3V với chân input +3.3V (đảm bảo không cắm cáp USB) Cách dùng điều áp tự vơ hiệu hóa khơng có cấp vào chân input 5V Khi cấp nguồn cho vào chân input +3.3V, nối nguồn với đầu VOUT điều áp Trong trường hợp này, khơng có nguồn 5V chạy vào VIN điều áp Chân CE nối với VIN, VIN để hở, chân CE nối đất qua tụ điện Mức áp thấp CE làm cho điều áp tắt hệ thống bên Sơ đồ khối điều áp 5V sang 3.3V Tuy nhiên, có dịng điện nhỏ vào chiết áp điều áp Dòng điện từ +3.3V bạn xuống đất, thông qua điện trở nội R1 R2 điều áp Các điện 16 trở có trị số lớn, nên dịng qua khơng đáng kể Nhưng cần lưu ý điều đo dòng cho ứng dụng nguồn-siêu-thấp dùng pin PCB có nút gắn nhãn RESET chân nối bên board với nhãn “R.” Chân nối cho phép mạch reset MCU cần Mạch Reset STM32F103C8T6 Kết nối “R” tìm thấy mép PCB • ARM 32-bit Cortex M3 với clock max 72Mhz • Bộ nhớ: • • o 64 kbytes nhớ Flash(bộ nhớ lập trình) o 20kbytes SRAM Clock, reset quản lý nguồn o Điện áp hoạt động 2.0V -> 3.6V o Power on reset(POR), Power down reset(PDR) programmable voltage detector (PVD) o Sử dụng thạch anh từ 4Mhz -> 20Mhz o Thạch anh nội dùng dao động RC mode 8Mhz 40khz o Sử dụng thạch anh 32.768khz sử dụng cho RTC Trong trường hợp điện áp thấp: o Có mode: ngủ, ngừng hoạt động hoạt động chế độ chờ o Cấp nguồn chân Vbat pin để hoạt động RTC sử dụng lưu trữ data nguồn cấp 17 • • • • • ADC 12 bit với kênh cho o Khoảng giá trị chuyển đổi từ – 3.6V o Lấy mẫu nhiều kênh kênh o Có cảm biến nhiệt độ nội DMA: chuyển đổi giúp tăng tốc độ xử lý can thiệp sâu CPU o kênh DMA o Hỗ trợ DMA cho ADC, I2C, SPI, UART Timer o timer 16 bit hỗ trợ mode IC/OC/PWM o timer 16 bit hỗ trợ để điều khiển động với mode bảo vệ ngắt input, dead-time o watdog timer dùng để bảo vệ kiểm tra lỗi o sysTick timer 24 bit đếm xuống dùng cho ứng dụng hàm Delay… Hỗ trợ kênh giao tiếp bao gồm: o I2C(SMBus/PMBus) o USART(ISO 7816 interface, LIN, IrDA capability, modem control) o SPIs (18 Mbit/s) o CAN interface (2.0B Active) o USB 2.0 full-speed interface Kiểm tra lỗi CRC 96-bit ID 3.3 Thơng số kỹ thuật: • Vi điều khiển: STM32F103C8T6 • Điện áp cấp 5VDC qua cổng Micro USB chuyển đổi thành 3.3VDC qua IC nguồn cấp cho Vi điều khiển • Tích hợp sẵn thạch anh 8Mhz • Tích hợp sẵn thạnh anh 32Khz cho ứng dụng RTC 18 • Ra chân đầy đủ tất GPIO giao tiếp: CAN, I2C, SPI, UART, USB,… • Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset • Kích thước: 53.34 x 15.24mm • Sử dụng với mạch nạp: o ST-Link Mini o J-link o USB TO COM • Kết nối chân nạp ST-Link Mini • Nạp theo chuẩn SWD o TCK — SWCLK o TMS — SWDIO o GND — GND o 3.3V — 3.3V 19 IV, Màn hình LCD 16x2 Màn hình LCD 16x2 sử dụng driver HD44780, có khả hiển thị dòng với dòng 16 ký tự Màn hình LCD 16x02 - Thơng số kỹ thuật: • Điện áp hoạt động: 5V • Kích thước hình LCD 1602: x 3.6 x 0.8 cm • Màu nền: xanh xanh dương • Màu chữ: Màu đen • Khoảng cách hai chân kết nối: 0.1 inch • Tiện dụng kết nối với Breadboard - Ưu điểm: • Tên chân ghi mặt sau hình LCD hổ trợ việc kết nối, dây điện • Có đèn led nền, dùng biến trở PWM điều chình độ sáng để sử dụng điện • Có thể điều khiển với dây tín hiệu • Có ký tự xây dựng hổ trợ tiếng Anh tiếng Nhật 20 Mặt sau hình LCD 1602 - Sơ đồ kết nối hình LCD: • Chân số - VSS: Chân nối đất cho LCD nối với GND mạch điều khiển • Chân số - VDD: Chân cấp nguồn cho LCD, nối với VCC 5V mạch điều khiển • Chân số - VE: Điều chỉnh độ tương phản LCD • Chân số - RS: chân chọn ghi, nối với logic "0" logic "1": o Logic “0”: Bus DB0 - DB7 nối với ghi lệnh IR LCD (ở chế độ “ghi” - write) nối với đếm địa LCD (ở chế độ “đọc” - read) o Logic “1”: Bus DB0 - DB7 nối với ghi liệu DR bên LCD • Chân số - R/W : chân chọn chế độ đọc/ghi (Read/Write), nối với logic “0” để ghi nối với logic “1” đọc • Chân số - E : chân cho phép (Enable) Sau tín hiệu đặt lên bus DB0DB7, lệnh chấp nhận có xung cho phép chân sau: o Ở chế độ ghi: Dữ liệu bus LCD chuyển vào ghi bên phát xung (high-to-low transition) tín hiệu chân E o Ở chế độ đọc: Dữ liệu LCD xuất DB0-DB7 phát cạnh lên (low-to-high transition) chân E LCD giữ bus đến chân E xuống mức thấp 21 • Chân số đến 14 - D0 đến D7: đường bus liệu dùng để trao đổi thông tin với MPU Có chế độ sử dụng đường bus là: Chế độ bit (dữ liệu truyền đường, với bit MSB bit DB7) Chế độ bit (dữ liệu truyền đường từ DB4 tới DB7, bit MSB DB7) • Chân số 15 - A : nguồn dương cho đèn • Chân số 16 - K : nguồn âm cho đèn Sơ đồ kết nối LCD 1602 - Chế độ bit bit LCD Màn hình LCD hoạt động hai chế độ khác nhau, chế độ bit chế độ bit Ở chế độ bit, gửi liệu nibble, sau nibble Nibble nhóm bốn bit, bốn bit (D0-D3) byte tạo thành nibble bốn bit (D4-D7) tạo thành nibble Điều cho phép ta gửi liệu bit Trong chế độ bit, gửi liệu bit trực tiếp hành trình sử dụng tất dòng liệu Chế độ 8-bit nhanh hoàn hảo so với chế độ 4-bit Nhưng nhược điểm lớn cần đường liệu kết nối với vi điều khiển Điều làm cho sử dụng hết chân I / O MCU chúng tôi, chế độ 4-bit sử dụng rộng rãi Khơng có chân điều khiển sử dụng để thiết lập chế độ Nó cách lập trình thay đổi 22 V, Cảm biến vật cản hồng ngoại Cảm biến có khả nhận biết vật cản môi trường với cặp LED thu phát hồng ngoại để truyền nhận liệu hồng ngoại Tia hồng ngoại phát với tần số định, có vật cản đường truyền LED phát phản xạ vào LED thu hồng ngoại, LED báo vật cản module sáng, khơng có vật cản, LED tắt Với khả phát vật cản khoảng ~ 30cm khoảng cách điều chỉnh thơng qua chiết áp cảm biến cho thích hợp với ứng dụng cụ thể như: xe dò line, xe tránh vật cản, … - Thơng số kỹ thuật • IC so sánh: LM393 • Điện áp: 3.3V - 6VDC • Dịng tiêu thụ: ▪ Vcc = 3.3V: 23 mA ▪ Vcc = 5.0V: 43 mA • Góc hoạt động: 35° • Khoảng cách phát hiện: ~ 30 cm • LED báo nguồn LED báo tín hiệu ngõ • Mức logic ngõ ra: ▪ Mức thấp - 0V: có vật cản ▪ Mức cao - 5V: khơng có vật cản • Kích thước: 3.2cm x 1.4cm VI, Giao tiếp STM32F103C8T6 với LCD 16×2 thơng qua moudle I2C 6.1 Kết nối MCU STM32 với LCD Module I2C PCF8574 sử dụng để làm trung gian kết nối MCU STM32F103C8T6 LCD hình bảng bên dưới: 23 Các chân GND, VCC, SDA, SCL nối với STM32 sau: STM32 PCF8574 GND GND VCC (nối nguồn 5V) PB6 SCL PB7 SDA Nguồn 5V LCD lấy từ chân 5V kit nạp ST Link V2 Trên module I2C có biến trở điều chỉnh độ tương phản hình LCD cần 6.2 Địa Module I2C PCF8574 Module I2C PCF8574 hỗ trợ giao tiếp I2C với 7bit địa chỉ, có bit cố định bit người dùng tùy chỉnh có dạng 0 A2 A1 A0 Mặc định, module nhà sản xuất để chân A0, A1, A2 mức logic cao nên PCF8574 có địa 0x27 Để thay đổi địa IC cần, bạn tùy chọn thay đổi mức logic chân 24 Khi lập trình I2C để giao tiếp STM32 module này, byte bao gồm 7bit địa 1bit W vào vị trí có trọng số thấp nhất(ghi liệu), lúc Byte giao tiếp I2C có giá trị: 01001110 (0x4E) VII, Mạch nguyên lý, PCB, mạch thực tế 25 Mạch nguyên lý Mạch PCB 26 Mạch PCB dạng 3D Ảnh mạch thật 27

Ngày đăng: 03/10/2023, 17:09

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan