ĐỒ ÁN TỐT NGHIỆP HỆ THỐNG QUẢN LÝ BÃI ĐÕ XE TÀI LIỆU ĐÍNH KÈM FILE CODE CHI TIẾT Sừ dụng vi điều khiển STM32, ESP 32 cùng các giao thức UART, I2C Ban đầu khi khởi động nó sẽ thực hiện việc đọc dữ liêu ngày giờ từ internet bằng ESP8266 sau đấy chuyển sang STM32F103C8T6 qua giao tiếp UART để xử lý chuyển dữ liệu ngày giờ hiện tại lên LCD qua giao thưc I2C. Với xe đi vào nếu như cảm biến hồng ngoại thứ nhất thay đổi thì động cơ servo hoạt động sẽ nhấc thanh chắn lên)đồng thời sau khi ô tô đi qua cảm biến hồng ngoại thứ 2 thì động cơ servo sẽ hạ thanh chắn xuống như ban đầu , đồng thời thì biến đếm sẽ tăng lên 1. Với xe đi ra thì mạch cũng hoạt động tương tự .
CƠ SỞ LÝ THUYẾT
Khái niệm về Vi xử lý và Vi điều khiển
Bộ vi xử lý, hay còn gọi là CPU (đơn vị xử lý trung tâm), là một thành phần quan trọng trong máy tính, có chức năng thực hiện các phép toán logic, tính toán, kiểm soát hệ thống và lưu trữ dữ liệu Vi xử lý đảm nhiệm vai trò xử lý các dữ liệu đầu vào và đầu ra, góp phần quyết định hiệu suất hoạt động của hệ thống máy tính.
Thiết bị ngoại vi nhận dữ liệu đầu vào và trả kết quả để hoạt động hiệu quả Intel đã giới thiệu dòng vi xử lý 4 bit đầu tiên vào tháng 11 năm 1971, đánh dấu bước tiến quan trọng trong công nghệ vi xử lý.
Hình 1.1 Các loại cấu trúc
+ Các vi xử lý đầu tiên sử dụng cấu trúc Von-Neumann Trong cấu trúc
Kiến trúc Von Neumann kết hợp bộ nhớ dữ liệu và bộ nhớ chương trình trong một hệ thống duy nhất Khi xử lý lệnh từ bộ nhớ hoặc yêu cầu từ I/O, lệnh được truyền qua bus vào thanh ghi, sau đó được xử lý tại đây Kết quả có thể được lưu trữ trở lại bộ nhớ thông qua các bus Tuy nhiên, kiến trúc này gặp phải một số nhược điểm, bao gồm tốc độ chậm và việc truyền dữ liệu không thể diễn ra đồng thời do việc chia sẻ bus chung.
Cấu trúc Harvard, được sử dụng trong các vi điều khiển như Atmega328 và Atmega168 của Arduino, có đặc điểm là tách biệt bộ nhớ dữ liệu và bộ nhớ chương trình cùng với các bus Trong cấu trúc này, có hai loại lập trình CPU: microprogramming và hardwired programming, trong đó microprogramming thường chậm hơn so với hardwired programming.
+ Kiến trúc tập lệnh Complex Instruction Set Computer:
CISC (Complex Instruction Set Computer) là kiến trúc máy tính với tập lệnh phức tạp, dẫn đến thời gian thực hiện lệnh lâu hơn do phải xử lý opcode và các toán hạng Một ví dụ điển hình của cấu trúc CISC là X86, nơi tốc độ thực hiện lệnh thường chậm hơn so với các kiến trúc đơn giản hơn.
Bộ vi xử lý RISC (Reduced Instruction Set Computer) là một kiến trúc với tập lệnh rút gọn, cho phép thực hiện nhanh chóng và đơn giản mà không cần cấu trúc phức tạp Kiến trúc này thường được áp dụng trong các ứng dụng hệ thống nhúng, với các ví dụ điển hình như SHARC và PowerPC.
Bộ vi xử lý là thành phần quan trọng trong các ứng dụng nhỏ, và việc lựa chọn bộ vi xử lý phù hợp phụ thuộc vào ứng dụng cụ thể cũng như các thiết bị ngoại vi đi kèm.
Vi điều khiển là một máy tính nhỏ, bao gồm CPU, bộ nhớ (RAM, ROM), thiết bị ngoại vi, timers và counters, được tích hợp trong một mạch tích hợp (IC) Tất cả các thành phần này được kết nối qua hệ thống bus trên board mạch Vi điều khiển cho phép giao tiếp dễ dàng và nhanh chóng với các thiết bị ngoại vi như cổng nối tiếp, ADC, DAC, Bluetooth và Wi-Fi, với tốc độ cao hơn so với bộ vi xử lý Hầu hết vi điều khiển sử dụng kiến trúc RISC, trong khi một số khác như 8051 và Motorola sử dụng kiến trúc CISC.
1.1.3 Đặc điểm nổi bật của STM32
Những đặc điểm nổi trội của dòng ARM Cortex đã thu hút các nhà sản xuất
Hơn 240 dòng vi điều khiển dựa trên nhân Cortex đã được giới thiệu, trong đó dòng STM32F1 của ST Microelectronic nổi bật với nền tảng lõi ARM Cortex-M3 Lõi ARM Cortex-M3 là phiên bản cải tiến của lõi ARM7, mang lại thành công lớn cho ARM.
STM đã giới thiệu 4 dòng vi điều khiển dựa trên ARM7 và ARM9, nhưng STM32 đánh dấu một bước tiến quan trọng về chi phí và hiệu suất Với giá chỉ gần 1 Euro cho số lượng lớn, STM32 thực sự là một thách thức đối với các vi điều khiển 8 và 16-bit truyền thống.
Có 14 biến thể STM32 được chia thành hai dòng: dòng Performance với tần số CPU lên tới 72MHz và dòng Access với tần số 36MHz Các biến thể này hoàn toàn tương thích về bố trí chân và phần mềm, với kích thước bộ nhớ FLASH ROM lên tới 512K và SRAM lên tới 64K.
Các ngoại vi của STM32, bao gồm ADC, timer, I2C, SPI, CAN, USB và RTC, mang lại nhiều tính năng độc đáo Bộ ADC 12-bit tích hợp cảm biến nhiệt độ cho phép tự động hiệu chỉnh khi nhiệt độ thay đổi và hỗ trợ nhiều chế độ chuyển đổi Mỗi bộ định thời có 4 khối capture compare, cho phép bắt sự kiện và tạo dạng sóng đầu ra, đồng thời có thể liên kết với nhau để tạo ra các định thời phức tạp hơn Bộ định thời cao cấp hỗ trợ điều khiển động cơ với 6 đầu ra PWM có dead time lập trình được và đường break input để đảm bảo an toàn trong trường hợp khẩn cấp Ngoài ra, ngoại vi SPI được trang bị khối kiểm tổng CRC phần cứng cho 8 và 16 word, hỗ trợ hiệu quả cho giao tiếp với thẻ nhớ SD hoặc MMC.
STM32 hỗ trợ tối đa 12 kênh DMA (Direct Memory Access), cho phép truyền dữ liệu đến và từ các thanh ghi ngoại vi với kích thước dữ liệu 8/16 hoặc 32-bit Mỗi ngoại vi đi kèm với một bộ điều khiển DMA để gửi hoặc yêu cầu dữ liệu theo nhu cầu Bộ phân xử bus nội và ma trận bus giúp giảm thiểu tranh chấp giữa truy cập dữ liệu qua CPU và các kênh DMA, cho phép các đơn vị DMA hoạt động linh hoạt và tự động điều khiển luồng dữ liệu bên trong vi điều khiển.
STM32 là một vi điều khiển tiêu thụ năng lượng thấp và đạt hiệu suất cao
Vi điều khiển hoạt động ở điện áp 2V với tần số 72MHz và chỉ tiêu thụ 36mA khi tất cả các khối bên trong đều hoạt động Nhờ vào các chế độ tiết kiệm năng lượng của Cortex, STM32 chỉ tiêu thụ 2μA ở chế độ Standby Bộ dao động nội RC 8MHz giúp chip nhanh chóng thoát khỏi chế độ tiết kiệm năng lượng trong khi bộ dao động ngoài khởi động, từ đó giảm đáng kể mức tiêu thụ năng lượng tổng thể.
Ngày nay, các ứng dụng hiện đại phải hoạt động trong môi trường khắc nghiệt, yêu cầu tính an toàn cao, sức mạnh xử lý và nhiều thiết bị ngoại vi tinh vi Để đáp ứng các yêu cầu này, STM32 cung cấp nhiều tính năng phần cứng hỗ trợ tối ưu cho các ứng dụng Các tính năng này bao gồm bộ phát hiện điện áp thấp, hệ thống bảo vệ xung Clock và hai bộ Watchdogs Bộ Watchdog đầu tiên là Watchdog cửa sổ, yêu cầu được làm tươi trong một khoảng thời gian xác định; nếu không, nó sẽ kích hoạt Bộ thứ hai là Watchdog độc lập, với bộ dao động bên ngoài tách biệt khỏi xung nhịp hệ thống chính, giúp phát hiện lỗi của bộ dao động chính và tự động chuyển sang bộ dao động nội RC 8MHz.
Hệ điều hành thời gian thực (Real-time operating system)
Thời gian thực là khái niệm khó định nghĩa, nhưng theo nghĩa đen, hệ thống cần phản ứng ngay lập tức và phù hợp với yêu cầu Thời gian thực của một sự kiện có nghĩa là nó xảy ra ngay lập tức Ví dụ, khi chuyển khoản tiền giữa các tài khoản, một hệ thống thời gian thực sẽ cập nhật tài khoản ngay lập tức, trái ngược với hệ thống không phải thời gian thực.
Việc xử lý dữ liệu sẽ được thực hiện vào cuối mỗi ngày, dẫn đến việc cập nhật thông tin có thể phải chờ đến ngày hôm sau Trong một hệ thống đa phương tiện, khả năng xử lý video và audio đúng thời gian chuẩn là rất quan trọng; nếu không, sẽ xảy ra hiện tượng giật hình, trễ tiếng, hoặc các lỗi khác.
Hệ thống thời gian thực không chỉ cần phản ứng nhanh mà còn phải đảm bảo độ tin cậy và chính xác Đặc biệt, trong các hệ thống điều khiển như ô tô và dây chuyền sản xuất, độ chính xác đóng vai trò cực kỳ quan trọng.
Hệ thống thời gian thực được phân thành hai loại dựa trên yêu cầu về thời gian: thời gian thực cứng (hard real-time) và thời gian thực mềm (soft real-time).
- Thời gian thực cứng (hard real-time): Một hệ thống thời gian thực cứng cần một sự đảm bảo về thời gian đáp ứng trong trường hợp xấu nhất
Hệ thống bao gồm hệ điều hành, ứng dụng và phần cứng cần được thiết kế để đảm bảo thời gian đáp ứng, có thể tính bằng mili giây (ms) hoặc nano giây (ns) Việc đảm bảo thời gian đáp ứng là cực kỳ quan trọng, bởi nếu không, có thể xảy ra những hậu quả nghiêm trọng cho hệ thống Điều này đặc biệt quan trọng trong các lĩnh vực như quốc phòng, điều khiển giao thông, máy bay, thu thập dữ liệu và thiết bị y tế.
Hệ thống thời gian thực mềm (soft real-time) cho phép một mức độ linh hoạt trong việc đáp ứng yêu cầu về thời gian, không phải lúc nào cũng cần phải chính xác Ví dụ, trong các hệ thống xem phim, việc hệ thống bị treo hoặc giật hình không gây ra hậu quả nghiêm trọng Tuy nhiên, nếu sự cố này xảy ra quá thường xuyên, hệ thống có thể bị coi là không đạt yêu cầu, đặc biệt trong các ứng dụng như thoại VoIP hay hệ thống audio, video.
Tiêu chuẩn POSIX 1003.1b định nghĩa hệ điều hành thời gian thực là khả năng cung cấp dịch vụ trong một khoảng thời gian nhất định Hệ thống thời gian thực có thể được đặc trưng bởi các tính năng như độ tin cậy và hiệu suất trong việc xử lý các tác vụ theo thời gian đã định.
+ Đa nhiệm/Đa luồng (Multitasking/multithreading): Một hệ điều hành thời gian thực phải có khả năng xử lý đa nhiệm và đa luồng
Hệ điều hành thời gian thực cần thiết lập cơ chế ưu tiên cho các tác vụ, trong đó các chức năng có yêu cầu giới hạn thời gian cao được ưu tiên xử lý.
+ Thừa kế ưu tiên (Priority inheritance): Hệ điều thành thời gian thực phải có cơ chế thừa kế ưu tiên
Chiếm quyền (Preemption) là tính năng quan trọng trong hệ điều hành thời gian thực, cho phép tác vụ có mức ưu tiên cao hơn ngừng hoặc chiếm quyền điều khiển từ tác vụ có mức ưu tiên thấp hơn khi cần thiết.
Trễ ngắt (Interrupt latency) là khoảng thời gian từ khi một ngắt phần cứng xảy ra cho đến khi hàm xử lý ngắt bắt đầu thực thi Đối với các hệ điều hành thời gian thực, việc có trễ ngắt có thể đoán được và tối ưu là rất quan trọng, với yêu cầu rằng thời gian này nên càng ngắn càng tốt.
Trễ lập lịch (Scheduler latency) là khoảng thời gian từ khi một tác vụ có khả năng chạy cho đến khi nó thực sự bắt đầu thực thi Đối với một hệ điều hành thời gian thực, việc xác định được trễ lập lịch là rất quan trọng.
Trong hệ thống nhúng, việc đồng bộ và truyền thông giữa các process là rất quan trọng, với hình thức phổ biến nhất là gửi các bản tin Để đảm bảo hoạt động hiệu quả, một hệ điều hành thời gian thực cần có cơ chế xử lý bản tin ổn định và kịp thời.
+ Phân phối bộ nhớ động (Dynamic memory allocation): Một hệ điều hành thờigian thực cần cung cấp các hàm cung cấp bộ nhớ với thời gian cố định.
Giao thức kết nối
Giao thức truyền thông là yếu tố then chốt trong việc tổ chức giao tiếp giữa các thiết bị, được thiết kế đa dạng theo yêu cầu của hệ thống Những giao thức này quy định các quy tắc cụ thể, giúp đảm bảo quá trình truyền dữ liệu diễn ra thành công giữa các thiết bị.
Các hệ thống nhúng, vi điều khiển và máy tính thường sử dụng giao thức UART để giao tiếp phần cứng giữa các thiết bị UART nổi bật với việc chỉ cần hai dây để truyền và nhận dữ liệu, điều này giúp đơn giản hóa cấu trúc truyền thông so với các giao thức khác.
Mặc dù giao thức truyền thông phần cứng như UART được sử dụng rộng rãi, nhưng việc tối ưu hóa vẫn chưa hoàn toàn đạt yêu cầu Thực hiện đúng giao thức khung truyền thường bị bỏ qua khi sử dụng module UART trong bộ vi điều khiển.
UART là một giao thức truyền thông phần cứng sử dụng giao tiếp nối tiếp không đồng bộ với tốc độ có thể điều chỉnh Đặc điểm không đồng bộ có nghĩa là không cần tín hiệu đồng hồ để đồng bộ hóa các bit dữ liệu từ thiết bị phát đến thiết bị nhận.
Trong giao tiếp UART, hai thiết bị UART kết nối trực tiếp với nhau UART chuyển đổi dữ liệu từ dạng song song của thiết bị điều khiển, chẳng hạn như CPU, thành dạng nối tiếp, sau đó truyền dữ liệu này đến UART nhận, nơi dữ liệu nối tiếp được chuyển đổi trở lại thành dạng song song cho thiết bị nhận.
Hình 1.3 Sơ đồ kết nối UART
Hai đường dây mà mỗi thiết bị UART sử dụng để truyền dữ liệu đó là:
UART là giao thức truyền dữ liệu không đồng bộ, không sử dụng tín hiệu đồng hồ để đồng bộ hóa việc truyền và nhận bit Thay vào đó, UART thêm các bit start và stop vào gói dữ liệu, giúp xác định điểm bắt đầu và kết thúc của gói, cho phép UART nhận biết thời điểm bắt đầu đọc các bit.
Khi UART phát hiện bit start, nó bắt đầu đọc các bit với một tốc độ nhất định gọi là tốc độ truyền (baud rate) Tốc độ truyền đo lường tốc độ truyền dữ liệu, được biểu thị bằng bit trên giây (bps - bit per second).
UART cần hoạt động với cùng một tốc độ truyền, và sự chênh lệch giữa tốc độ truyền và nhận chỉ được phép khoảng 10% Nếu vượt quá giới hạn này, thời gian các bit sẽ bị lệch quá nhiều.
Cả hai UART cũng phải được cấu hình để truyền và nhận cùng một cấu trúc gói dữ liệu
Số lượng dây sử dụng 2
Phương pháp truyền Bất đồng bộ
Truyền nối tiếp hay song song? Nối tiếp
Số lượng thiết bị chủ tối đa 1
Số lượng thiết bị tớ tối đa 1
• Cách thức hoạt động của giao tiếp UART
UART nhận dữ liệu từ bus dữ liệu, nơi mà các thiết bị như CPU, bộ nhớ hoặc vi điều khiển gửi thông tin Dữ liệu được truyền từ bus đến UART ở dạng song song Sau khi nhận, UART sẽ thêm một bit start, một bit chẵn lẻ và một bit stop để tạo thành gói dữ liệu Gói dữ liệu này sau đó được xuất ra dưới dạng nối tiếp từng bit qua chân Tx Tại chân Rx, UART nhận gói dữ liệu từng bit và chuyển đổi lại về dạng song song, đồng thời loại bỏ các bit start, chẵn lẻ và stop Cuối cùng, UART chuyển gói dữ liệu song song trở lại bus dữ liệu ở đầu nhận.
Dữ liệu qua UART được tổ chức thành các gói, mỗi gói bao gồm 1 bit start, từ 5 đến 9 bit dữ liệu (tùy thuộc vào cấu hình của UART), một bit chẵn lẻ (parity bit) tùy chọn và 1 hoặc 2 bit stop.
Đường truyền dữ liệu UART duy trì mức điện áp cao khi không có dữ liệu, và để bắt đầu truyền, UART kéo mức điện áp từ cao xuống thấp trong một chu kỳ đồng hồ Khi phát hiện sự chuyển đổi này, UART bắt đầu đọc các bit trong khung dữ liệu với tốc độ truyền đã định.
Data Frame (Khung dữ liệu)
Khung dữ liệu chứa dữ liệu thực tế đang được truyền Nó có thể dài từ 5 bit đến
Trong giao thức 8 bit, nếu sử dụng bit chẵn lẻ, khung dữ liệu sẽ có độ dài 8 bit Ngược lại, nếu không sử dụng bit chẵn lẻ, khung dữ liệu có thể kéo dài đến 9 bit Thông thường, dữ liệu được truyền theo thứ tự từ bit có trọng số bé nhất (LSB - Least Significant Bit) trước tiên.
Parity Bit (Bit chẵn lẻ)
Tính chẵn lẻ xác định đặc tính chẵn hoặc lẻ của một số, trong khi bit chẵn lẻ là phương pháp mà UART sử dụng để phát hiện sự thay đổi dữ liệu trong quá trình truyền Những thay đổi này có thể xảy ra do bức xạ điện từ, tốc độ truyền không đồng bộ hoặc việc truyền dữ liệu ở khoảng cách xa.
Sau khi nhận khung dữ liệu, UART sẽ đếm số bit có giá trị 1 và xác định tổng số này là chẵn hay lẻ Nếu bit parity là 0 (parity chẵn), tổng số bit 1 trong khung dữ liệu phải là một số chẵn Ngược lại, nếu bit parity là 1 (parity lẻ), tổng số bit 1 sẽ là một số lẻ.
Khi bit chẵn lẻ khớp với dữ liệu, UART xác nhận rằng quá trình truyền diễn ra mà không có lỗi Ngược lại, nếu bit chẵn lẻ là 0 mà tổng là số lẻ, hoặc bit chẵn lẻ là 1 mà tổng là số chẵn, UART sẽ nhận biết rằng có sự thay đổi trong các bit của khung dữ liệu.
THIẾT KẾ HỆ THỐNG
Phần cứng vật lý
Sơ đồ 2.1 Sơ đồ khối
Cung cấp nguồn nuôi tất cả linh kiện trong mạch
ESP8266 là một mạch vi điều khiển mạnh mẽ, cho phép người dùng điều khiển các thiết bị điện tử một cách linh hoạt Đặc biệt, nó được trang bị kết nối Wi-Fi 2.4GHz, hỗ trợ cho việc lập trình và phát triển ứng dụng IoT hiệu quả.
Hình 2.1 Hình thực tế esp8266
Sơ đồ 2.2 Sơ đồ chân esp8266
- WiFi: 2.4 GHz hỗ trợ chuẩn 802.11 b/g/n
- Điện áp vào: 5V thông qua cổng USB
- Số chân I/O: 11 (tất cả các chân I/O đều có Interrupt/PWM/I2C/One-wire, trừ chân D0)
Số chân Analog Input: 1 (điện áp vào tối đa 3.3V)
Giao tiếp: Cable Micro USB ( tương đương cáp sạc điện thoại )
Hỗ trợ bảo mật: WPA/WPA2
Tích hợp giao thức TCP/IP
Lập trình trên các ngôn ngữ: C/C++, Micropython,… b Cảm biến vật cản hồng ngoại
Module cảm biến hồng ngoại phát hiện vật cản tự động điều chỉnh theo môi trường xung quanh, với cặp mắt phát hiện tia hồng ngoại ở tần số nhất định Khi phát hiện vật cản, tín hiệu được gửi đi và đèn báo màu xanh lá cây sáng lên, đồng thời đầu ra tín hiệu ở mức thấp Khoảng cách hoạt động hiệu quả từ 2 đến 30 cm, với điện áp làm việc từ 3,3V đến 5V Phạm vi phát hiện có thể điều chỉnh dễ dàng thông qua núm chiết áp, giúp việc lắp ráp và sử dụng trở nên đơn giản Sản phẩm này rất hữu ích trong việc chế tạo robot tránh vật cản.
Hình 2.2 Cảm biến vật cản hồng ngoại LM393
Cảm biến hồng ngoại có nhiều ứng dụng khác nhau từ robot đến tự động hóa Nguyên lí làm việc của cảm biến hồng ngoại như sau :
LED hồng ngoại phát ra ánh sáng với bước sóng hồng ngoại, trong khi LED thu nhận có nội trở rất lớn, khoảng vài trăm kOhm Khi LED thu nhận tia hồng ngoại đủ mạnh, nội trở của nó sẽ giảm xuống còn khoảng vài chục Ohm.
Khi có vật cản phía trước, các chum hồng ngoại sẽ phản xạ lại và thay đổi giá trị nội trở, dẫn đến sự thay đổi điện áp ở đầu vào không đảo của Op amp Khoảng cách giữa vật cản và cảm biến càng gần, sự thay đổi điện áp càng lớn Điện áp đầu vào không đảo được so sánh với giá trị điện áp cố định tại R3; nếu điện áp này lớn hơn điện áp ở đầu đảo, Op amp sẽ xuất mức 1 (+Vcc), ngược lại sẽ xuất mức 0 (GND) Các điện trở R1, R2, và R4 cũng đóng vai trò quan trọng trong mạch này.
Số 21 được áp dụng để đảm bảo dòng điện tối thiểu 10mA chạy qua các thiết bị LED hồng ngoại như photodiode và đèn LED thông thường Biến trở R3 được sử dụng để điều chỉnh độ nhạy của mạch.
- Khoảng cách phát hiện: 2 ~ 30 cm
- LED báo nguồn và LED báo tín hiệu ngõ ra
+ Mức thấp - 0V: khi có vật cản + Mức cao - 5V: khi không có vật cản
Sơ đồ 2.3 Sơ đồ cảm biến vật cản hồng ngoại
• VCC: điện áp chuyển đổi từ 3.3V đến 5V (có thể được kết nối trực tiếp đến vi điều khiển 5V và 3.3V)
• OUT: đầu ra kỹ thuật số (0 và 1)
2.1.3 Khối đầu ra a LCD 16x2 và giao tiếp với vi điều khiển :
- VEE của LCD được nối với biến trở và nguồn 5V để diều chỉnh độ sáng của LCD
- chân điều khiển (RS,RW,E )
- Chân điều khiển độ sáng tối của LCD chân VEE ta sử dụng 1 biến trở để điều chỉnh thích hợp
Sơ đồ 2.4 Sơ đồ chân LCD
LCD có quá nhiều nhiều chân gây khó khăn trong quá trình đấu nối và chiếm dụng nhiều chân trên vi điều khiển
• Module I2C LCD ra đời và giải quyết vấn để này
- Thay vì phải mất 6 chân vi điều khiển để kết nối với LCD 16×2 (RS,
EN, D7, D6, D5 và D4) thì module IC2 bạn chỉ cần tốn 2 chân (SCL, SDA) để kết nối
- Module I2C hỗ trợ các loại LCD sử dụng driver HD44780(LCD 16×2, LCD 20×4, …) và tương thích với hầu hết các vi điều khiển hiện nay
Tiết kiệm chân cho vi điều khiển
Dễ dàng kết nối với LCD
VSS 1 VDD 2 VEE 3 RS 4 RW 5 E 6 D0 7 D1 8 D2 9 D3 10 D4 11 D5 12 D6 13 D7 14 A 15 K 16
- Điện áp hoạt động: 2.5-6V DC
- Hỗ trợ màn hình: LCD1602,1604,2004 (driver HD44780)
- Địa chỉ mặc định: 0X27 (có thể điều chỉnh bằng ngắn mạch chân A0/A1/A2)
- Tích hợp Jump chốt để cung cấp đèn cho LCD hoặc ngắt
- Tích hợp biến trở xoay điều chỉnh độ tương phản cho LCD
- Các lỗi thường gặp khi sử dụng I2C LCD
- Hiển thị một dãy ô vuông
- Màn hình chỉ in ra một ký tự đầu
- Các lỗi này chủ yếu là do sai địa chỉ bus, để fix lỗi chỉ cần thay địa chỉ mặc định là “0x27” thành “0x3F
- Trong trường hợp vẫn không được các bạn fix lỗi bằng cách nạp code tìm địa chỉ bus của I2C
Sau khi tìm địa chỉ, bạn chỉ cần thay vào vị trí “0x27” để hoàn tất Động cơ servo SG90 là loại nhỏ gọn, phổ biến trong việc làm mô hình nhỏ hoặc các cơ cấu kéo nhẹ Với khả năng phản ứng nhanh và góc quay 180 độ, động cơ này có bánh răng bằng nhựa, nên cần cẩn trọng khi nâng tải nặng để tránh hư hỏng Động cơ RC Servo 9G đã tích hợp sẵn Driver điều khiển, cho phép dễ dàng điều khiển góc quay thông qua phương pháp điều độ rộng xung PWM.
• Điện áp hoạt động: 4.8-5VDC
• Tốc độ: 0.12 sec/ 60 deg (4.8VDC)
❖ Phương pháp điều khiển PWM:
• Độ rộng xung 0.5ms ~ 2.5ms tương ứng 0-180 độ
• Tần số 50Hz, chu kỳ 20ms c LED
LED (diode phát sáng) là thiết bị có khả năng phát ra ánh sáng, tia hồng ngoại và tia cực tím Cấu trúc của LED bao gồm một khối bán dẫn loại p kết hợp với một khối bán dẫn loại n, tương tự như diode thông thường.
2.1.4 Khối xử lý (vi điều khiển STM32F103C8T6)
STM32F103C8T6 là vi điều khiển 32bit, thuộc họ F1 của dòng chipSTM32 hãng
Tốc độ tối đa 72Mhz
Clock, reset và quản lý nguồn Điện áp hoạt động từ 2.0 → 3.6V
Sử dụng thạch anh ngoài từ 4Mhz → 20Mhz
Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40Khz
Chế độ điện áp thấp:
Có các mode: ngủ, ngừng hoạt động hoặc hoạt động ở chế độ chờ
- 2 bộ ADC 12 bit với 9 kênh cho mỗi bộ
Khoảng giá trị chuyển đổi từ 0 – 3.6 V
Có chế độ lấy mẫu 1 kênh hoặc nhiều kênh
Có hỗ trợ DMA cho ADC, UART, I2C, SPI
3 Timer 16 bit hỗ trợ các mode Input Capture/ Output Compare/ PWM
1 Timer 16 bit hỗ trợ để điều khiển động cơ với các mode bảo vệ ngắt Input, dead- time
2 Watchdog Timer để bảo vệ và kiểm tra lỗi
1 Systick Timer 24 bit đếm xuống cho hàm Delay,…
- Có hỗ trợ 9 kênh giao tiếp:
- Kiểm tra lỗi CRC và 96-bit ID
Các thông số kĩ thuật:
- Điện áp cấp 5VDC qua cổng Micro USB sẽ được chuyển đổi thành 3.3VDC qua IC nguồn và cấp cho Vi điều khiển chính
- Tích hợp sẵn thạch anh 8Mhz
- Tích hợp sẵn thạnh anh 32Khz cho các ứng dụng RTC
- Ra chân đầy đủ tất cả các GPIO và giao tiếp: CAN, I2C, SPI, UART, USB,
- Tích hợp Led trạng thái nguồn, Led PC13, Nút Reset
Hệ điều hành àC/OS
àC/OS là một hệ điều hành thời gian thực được áp dụng cho nhiều dự án yêu cầu cao về đáp ứng thời gian, như hàng không và y tế Nó không phải là một hệ điều hành hoàn chỉnh, mà chỉ là nhân thời gian thực phục vụ cho các ứng dụng Hệ điều hành àC/OS hỗ trợ nhiều tính năng quan trọng.
• Quản lý truy cập tới miền găng của àC/OS
• Cấu trúc và trạng thái của các tác vụ
• Quản lý nhịp đồng hồ
• Khởi động hệ thống àC/OS, hệ thống đa nhiệm
Miền găng trong àC/OS chớnh là vũng mà mó lệnh xảy ra tranh chấp tài nguyờn dùng chung khi có nhiều tiến trình cùng thực hiện miền găng
VD: Khi có hai yêu cầu đồng thời gửi đến máy chủ để cập nhật một đối tượng, và giá trị của yêu cầu này ảnh hưởng đến yêu cầu kia, thì những đoạn mã liên quan được gọi là miền găng.
Để đảm bảo toàn vẹn dữ liệu trong các hệ điều hành có nhiều tiến trình, cần đảm bảo chỉ một tiến trình được thực hiện tại một thời điểm trong đoạn găng Có nhiều giải pháp để xử lý vấn đề này, bao gồm Semaphore, Test&Set và cấm ngắt Hệ điều hành C/OS sử dụng giải pháp vô hiệu hóa các ngắt khi tiến trình thực thi trong miền găng thông qua hai hàm OS_ENTER_CRITICAL() và OS_EXIT_CRITICAL() Các hàm này có thể được định nghĩa khác nhau tùy thuộc vào vi xử lý và được lưu trữ trong file cấu hình (OS_CPU.H).
2.2.2 Cấu trúc và các trạng thái của các tác vụ
Một tác vụ là một hàm lặp vô hạn Nó giống như các hàm khác trong C VD: void Tesk(void *data )
Call one of àC / OS's services :
Hệ điều hành C/OS có khả năng quản lý tối đa 64 tác vụ, trong đó bao gồm 2 tác vụ hệ thống với độ ưu tiên từ OS_LOWEST_PRIO-0 đến OS_LOWEST_PRIO-3 Điều này có nghĩa là người dùng chỉ có thể quản lý 56 tác vụ, và mỗi tác vụ sẽ có một độ ưu tiên duy nhất từ OS_LOWEST_PRIO.
0 tới OS_LOWEST_PRIO-2 và àC/OS luụn chạy tỏc vụ cú độ ưu tiờn cao nhất trước
OSTaskCreate() và OSTaskCreateEx() là 2 hàm trong àC/OS dựng để tạo cỏc tác vụ
Mỗi tỏc vụ trong àC/OS cú thể ở trong cỏc trạng thỏi sau:
- DORMANT: Tác vụ nằm trong bộ nhớ (ROM hoặc RAM) nhưng chưa được khởi tạo
- READY: Đây là trạng thái khi tác vụ được tạo ra
- RUNNING: Là trạng thái khi tác vụ đó được thực thi
- WAITING (WAITING FOR AN EVENT): Đang chờ sự kiện nào đó
- INTERRUPTED: Ngắt xuất hiện khi đang thực thi tác vụ và CPU đang thực thi thủ tục ngắt
Trạng thái DORMANT tương ứng với tác vụ đã nằm trong chương trình nhưng chưa nằm trong sự quản lý của àC/OS Khi àC/OS gọi hàm tạo
Khi sử dụng OSTaskCreate() hoặc OSTaskCreateEx(), tác vụ sẽ được quản lý bởi hệ điều hành và chuyển sang trạng thái READY Nếu tác vụ bị xóa khỏi àC/OS bằng lệnh OSTaskDel(), nó sẽ chuyển về trạng thái DORMANT Tác vụ có thể được tạo ra bất cứ lúc nào, và nếu được gán quyền cao hơn, nó sẽ ngay lập tức chiếm quyền điều khiển của CPU.
Quá trình đa nhiệm khởi động khi gọi hàm OSStart(), sau đó hàm này sẽ chọn tác vụ có trạng thái READY với độ ưu tiên cao nhất để chuyển sang trạng thái RUNNING.
Một tác vụ có thể tự trì hoãn bằng cách sử dụng hàm OSTimeDly(), trong khi các tác vụ có quyền ưu tiên cao hơn vẫn có thể chiếm quyền CPU Khi thời gian trì hoãn kết thúc, hàm OSTimeTick() sẽ khôi phục trạng thái RUNNING cho tác vụ đó.
Tác vụ đang chạy có thể chờ đợi sự xuất hiện của các sự kiện khác thông qua việc gọi các hàm như OSMboxPend(), OSSemPend() hoặc OSQPend(), dẫn đến việc chuyển sang trạng thái WAITTING Trong trạng thái này, tác vụ có độ ưu tiên cao nhất tiếp theo sẽ được quyền sử dụng CPU Khi sự kiện xảy ra, tác vụ sẽ trở lại trạng thái READY và được thông báo bởi một tác vụ khác hoặc thông qua ISR Tác vụ đang chạy có thể bị ngắt trừ khi hệ thống điều khiển ngắt và sẽ chuyển sang trạng thái INTERRUPTED Khi ngắt xảy ra, tác vụ bị tạm dừng và ISR sẽ chiếm quyền điều khiển CPU Nếu tất cả các tác vụ đều đang chờ sự kiện, hệ thống sẽ thực hiện tác vụ OSTaskIdle().
2.2.3 Lập lịch tác vụ àC/OS sự dụng bộ lập lịch tỏc vụ được thực hiện bởi hàm OSSched(), nú luụn chọn tác vụ có độ ưu tiên cao nhất để thực thi Lập lịch mức ISR sẽ được quản lý bởi hàm OSIntExit() (lập lịch sau khi thoát khỏi ngắt)
Thời gian lập lịch các tác vụ là hằng số và không bị ảnh hưởng bởi số lượng tác vụ Khi ứng dụng gọi OSSchedLock() hoặc khi có ngắt (OSIntNessting>0), quá trình lập lịch tác vụ sẽ dừng lại.
2.2.4 Ngắt trong àC/OS àC/OS yờu cầu dịch vụ ngắt ISR viết bằng hợp ngữ
Call OSIntEnter() or increment OSIntNesting directly;
Excute user code to service ISR;
Exucute a return from interrup instructions;
Khi tăng trực tiếp OSIntNesting thì sẽ ngắt nhanh hơn do việc gọi hàm OSIntEnter() sẽ phải thực hiện vô hiệu hóa các ngắt khác
2.2.5 Nhịp đồng hồ àC/OS yờu cầu cung cấp một đồng hồ thời gian để thực thi cỏc chức năng liờn quan đến đo thời gian mà cỏc dịch vụ cần đến Trong àC/OS, người phỏt triển cho phép ngắt thời gian sau khi khởi động hệ thống đa nhiệm (OSTart()) nhưng không cho phộp ngắt thời gian xảy ra giữa OSInit() và OSStart() vỡ khi đú àC/OS sẽ trong trạng thái không được định nghĩa và sẽ xảy ra lỗi
Nhịp đồng hồ trong àC/OS được quản lý qua hàm OSTimeTick() từ một ngắt đồng hồ Để thực hiện điều này, mã ngắt cho đồng hồ cần được viết bằng hợp ngữ hoặc gọi hàm OSTimeTick() từ một tác vụ có độ ưu tiên cao hơn tác vụ hiện tại, được gọi là TickTask.
2.2.6 Khởi động hệ thống àC/OS
Để khởi tạo hệ thống àC/OS, cần sử dụng hàm OSInit(), đây là hàm bắt buộc phải gọi trước khi sử dụng bất kỳ dịch vụ nào Hàm OSInit() sẽ thiết lập tất cả các biến và cấu trúc dữ liệu của àC/OS, đồng thời khởi tạo tác vụ OSTaskIdle() với độ ưu tiên thấp nhất là OS_LOWEST_PRIO Để khởi động hệ thống đa nhiệm, cần gọi hàm OSStart(), nhưng trước đó, ít nhất một tác vụ cho chương trình ứng dụng phải được tạo ra.
XÂY DỰNG HỆ THỐNG
Sơ đồ nguyên lý
Sơ đồ 3.1 Sơ đồ nguyên lý
Sau khi cấp nguồn cho các mạch ổn định, mạch sẽ khởi động và đọc dữ liệu ngày giờ từ internet qua ESP8266, sau đó truyền sang STM32F103C8T6 qua giao tiếp UART để xử lý và hiển thị lên LCD qua giao thức I2C Khi có xe đi vào, nếu cảm biến hồng ngoại thứ nhất phát hiện thay đổi, động cơ servo sẽ nhấc thanh chắn lên Sau khi xe đi qua cảm biến hồng ngoại thứ hai, động cơ servo sẽ hạ thanh chắn xuống và biến đếm sẽ tăng lên 1 Quy trình tương tự cũng diễn ra khi xe đi ra.
Mô hình 3.1 Mô hình thực tế