TỔNG QUAN VỀ HỆ THỐNG
Đặt vấn đề
Khoa học kỹ thuật ngày càng phát triển đã dẫn đến sự ra đời của nhiều loại đồng hồ, đặc biệt là đồng hồ cơ và đồng hồ số Đồng hồ số không chỉ có độ chính xác cao hơn mà còn tiết kiệm chi phí và tích hợp nhiều tính năng vượt trội so với đồng hồ cơ và các loại đồng hồ truyền thống.
Lý do chọn đề tài
Trên thị trường hiện nay, chỉ có một số loại đồng hồ kim và đồng hồ số đơn giản để xem giờ Đồng hồ thời gian thực với LED nháy theo nhạc không chỉ giúp người dùng theo dõi thời gian mà còn mang lại sự mới lạ, đẹp mắt và dễ sử dụng.
Thiết bị sử dụng vi điều khiển để xử lý, mang lại độ chính xác cao và giao tiếp trực tiếp với các module thông dụng, tạo thành một hệ thống thống nhất Nhờ đó, thiết bị giúp người dùng và gia đình sắp xếp, quản lý thời gian một cách hiệu quả và tin cậy hơn.
Mục đích nghiên cứu đề tài
Thiết kế và thi công đồng hồ thời gian thực với khả năng hiển thị thời gian chính xác Đồng hồ được trang bị đèn LED có thể nháy theo nhạc, tạo hiệu ứng sinh động Giao diện của sản phẩm đẹp mắt và tiện lợi, mang lại trải nghiệm tốt cho người dùng.
Giải pháp thiết kế
Hệ thống được thiết kế gồm 6 khối: Khối nguồn, khối thời gian, khối vi điều khiển, khối hiển thị, khối điều khiển, khối cảm biến âm thanh.
Hình 1: Sơ đồ khối Chức năng của các khối:
- Khối nguồn: cung cấp nguồn hoạt động cho hệ thống vi điều khiển.
Khối xử lý trung tâm là bộ phận quan trọng nhất của hệ thống, đảm nhiệm việc xử lý tín hiệu từ khối thời gian thực và khối cảm biến âm thanh Nó hiển thị thông tin lên khối hiển thị và nhận tín hiệu điều khiển để thay đổi trạng thái hoạt động của hệ thống.
- Khối hiển thị: Hiển thị các thông số thời gian như giờ, phút, giây và
Khối RTC, hay còn gọi là chíp thời gian thực, đóng vai trò quan trọng trong việc cung cấp thời gian chính xác cho vi điều khiển Nó sử dụng thời gian tuyệt đối mà con người đang sử dụng, đảm bảo rằng các quá trình xử lý diễn ra đúng thời điểm.
- Khối điều khiển: Sử dụng nút bấm Thực hiện chức năng nhập các dữ liệu đưa đến vi điều khiển và bao gồm thao tác thay đổi hiển thị.
- Khối cảm biến âm thanh: Cảm biến âm thanh có chức nặng nhận biết được âm thanh giúp LED nháy theo điệu nhạc.
CƠ SỞ LÝ THUYẾT
Tìm hiểu về hệ điều hành nhúng thời gian thực FreeRTOS
Hệ điều hành thời gian thực (RTOS) là loại hệ điều hành chuyên dụng cho các hệ thống nhúng, được thiết kế nhằm tiết kiệm tài nguyên và đảm bảo độ tin cậy Với phần cứng hạn chế về RAM và ROM, RTOS thường có thiết kế tối giản phù hợp với các ứng dụng cụ thể để đạt hiệu suất tối ưu Để khai thác tối đa sức mạnh của CPU, các nhà phát triển có thể viết mã quan trọng bằng ngôn ngữ máy hoặc ngôn ngữ khả chuyển như C, giúp cải thiện tốc độ, giảm chi phí và tăng khả năng bảo trì.
Một số hệ điều hành nhúng phổ biến bao gồm QNX, PDOS, pSOS, VxWorks, Nucleus, ERCOS, EMERALDS và Windows CE Trong đồ án môn học này, chúng tôi chọn FreeRTOS, một hệ điều hành nhúng thời gian thực, vì nó rất phù hợp cho nghiên cứu và học tập về các kỹ thuật và công nghệ liên quan đến viết hệ điều hành, đặc biệt là hệ điều hành nhúng thời gian thực FreeRTOS cũng hỗ trợ việc phát triển và mở rộng các thành phần của hệ điều hành, như bổ sung mô-đun, trình điều khiển và chuyển đổi môi trường thực hiện.
2.1.1 Lịch sử phát triển của hệ điều hành nhúng thời gian thực FreeRTOS
FreeRTOS là một hệ điều hành thời gian thực miễn phí, được Richard Barry phát hành từ năm 2003 và hiện đang được cộng đồng mã nguồn mở hỗ trợ mạnh mẽ Hệ điều hành này có tính khả chuyển cao, mã nguồn mở và có thể tải xuống miễn phí, phù hợp cho các ứng dụng thương mại, đặc biệt là trong các hệ nhúng thời gian thực nhỏ Với mã nguồn chủ yếu được viết bằng ngôn ngữ C, FreeRTOS có khả năng tương thích tốt với nhiều nền tảng khác nhau Ưu điểm nổi bật của nó là dung lượng nhỏ gọn, cho phép hoạt động trên các nền tảng mà nhiều hệ thống khác không thể chạy FreeRTOS có thể được port cho nhiều kiến trúc vi điều khiển và công cụ phát triển khác nhau, với mỗi port chính thức đi kèm các ứng dụng ví dụ nhằm thể hiện sự riêng biệt của lõi Cộng đồng mạng cung cấp hỗ trợ miễn phí, trong khi dịch vụ hỗ trợ thương mại với các dịch vụ phát triển đầy đủ cũng được cung cấp.
FreeRTOS được cấp giấy phép theo phiên bản sửa đổi của GPL (Giấy phép Công cộng Tổng quát), cho phép sử dụng trong các ứng dụng thương mại Bên cạnh FreeRTOS, còn có OpenRTOS và SafeRTOS OpenRTOS là phiên bản thương mại của FreeRTOS.org và không liên quan đến GPL SafeRTOS được xây dựng dựa trên FreeRTOS nhưng đã trải qua quá trình phân tích, chứng minh bằng tài liệu và kiểm tra nghiêm ngặt theo tiêu chuẩn IEC61508 Tiêu chuẩn IEC61508 SIL3 đã được phát triển độc lập nhằm hoàn thiện tài liệu cho SafeRTOS.
2.1.2 Cách thức hoạt động của FreeRTOS.
RTOS, hay Hệ điều hành thời gian thực, là một thành phần quan trọng trong chương trình, chịu trách nhiệm điều phối các tác vụ, lập lịch và phân mức ưu tiên cho chúng, cũng như tiếp nhận các thông điệp được gửi từ các tác vụ.
RTOS là một hệ thống phức tạp, chủ yếu thực hiện việc xử lý các trạng thái máy (State Machine) Để giải quyết bài toán với nhiều trạng thái máy, chúng ta thường sử dụng cấu trúc vòng lặp vô hạn kết hợp với câu lệnh switch, trong đó mỗi trạng thái được quản lý và chuyển tiếp đến các tác vụ tương ứng, như sau: while(1) { switch(state) { state= 2; case 2: //Code for Task 2; state= 3; case 3: //Code for Task 3; state= 4; case 4: //Code for Task 4; state=1; }.
Chương trình sẽ thực hiện từ trạng thái 1 đến trạng thái 4 và sau đó quay lại Mỗi khi có sự thay đổi trạng thái, chương trình sẽ tự động chuyển sang xử lý nhiệm vụ tương ứng.
Phương pháp này gặp nhược điểm như tài nguyên sử dụng chung, tốc độ chuyển chậm khi thay đổi trạng thái do yêu cầu hoàn thành mỗi tác vụ trước khi chuyển sang tác vụ khác, và khó khăn trong việc kiểm soát khi có nhiều tác vụ cùng lúc.
RTOS (Real-Time Operating System) hoạt động thông qua Nhân Kernel, điều phối các tác vụ (Task) với mức ưu tiên khác nhau và thực thi theo chu kỳ cố định Khi có sự kiện như ngắt, tín hiệu hoặc tin nhắn giữa các Task, Kernel sẽ chuyển tiếp thông tin đến Task tương ứng để đảm bảo hoạt động hiệu quả.
Sự chuyển dịch giữa các Task rất linh động, độ trễ thấp mang lại độ tin cậy cao cho chương trình.
2.1.3 Các chức năng của FreeRTOS.
Quản lý công việc trong ứng dụng được tổ chức thành các đơn vị nhỏ gọi là tác vụ (Task), cho phép lập lịch và thực hiện tuần tự dưới dạng 'Chủ đề' hoặc 'Nhiệm vụ' Điều này giúp đạt được tính đồng thời trong ứng dụng thời gian thực Quản lý tác vụ qua Kernel bao gồm việc tạo, kết thúc và thay đổi mức độ ưu tiên của tác vụ Quá trình tạo tác vụ liên quan đến việc thiết lập Khối điều khiển tác vụ (TCB), chứa thông tin về id tác vụ, mức độ ưu tiên và trạng thái tác vụ như nhàn rỗi, đang chạy, sẵn sàng hoặc đã kết thúc.
Lập lịch tác vụ ghi lại trạng thái của từng tác vụ và xác định tác vụ có mức độ ưu tiên cao nhất để thực thi, trong khi tác vụ đang chạy sẽ bị tạm ngừng Đồng bộ hóa tác vụ rất quan trọng để đảm bảo thông tin được truyền an toàn giữa các nhiệm vụ, cho phép chúng chia sẻ tài nguyên như bộ đệm và thiết bị I/O.
Quản lý bộ nhớ trong RTOS đóng vai trò quan trọng trong việc phân bổ bộ nhớ cho từng chương trình Có hai loại quản lý bộ nhớ chính là quản lý ngăn xếp và quản lý đống, mỗi loại đều có những đặc điểm và ứng dụng riêng.
Quản lý thời gian là yếu tố quan trọng trong việc lên lịch cho các tác vụ trong khoảng thời gian xác định, yêu cầu có các ngắt định kỳ Để thực hiện điều này, phần cứng Timer được lập trình nhằm tạo ra các ngắt cho bộ xử lý, và ngắt thời gian này được gọi là System Tick.
Xử lý ngắt là cơ chế mà CPU nhận thông báo về các sự kiện không đồng bộ thông qua ngắt Nó cho phép xử lý hiệu quả các sự kiện bằng cách xác định trình xử lý ngắt và quản lý quy trình dịch vụ ngắt, bao gồm việc tạo ra và xóa chúng.
Quản lý I/O thiết bị cung cấp một khung thống nhất thông qua API, giúp truy cập vào các trình điều khiển thiết bị phần cứng cụ thể Điều này cho phép xác định thiết bị phù hợp cho các yêu cầu I/O.
Giới thiệu các thiết bị phần cứng sử dụng
Khi bắt đầu tìm hiểu về lập trình và nghiên cứu chế tạo với Arduino, Arduino Uno R3 là lựa chọn lý tưởng cho người mới Với thiết kế dễ sử dụng và tính năng thân thiện, Arduino Uno R3 đã phát triển đến thế hệ thứ 3, giúp người học dễ dàng tiếp cận và làm quen với lập trình.
Arduino Uno là một bo mạch được thiết kế với vi điều khiển AVR Atmega 328 làm bộ xử lý trung tâm Cấu tạo của nó bao gồm nhiều thành phần quan trọng.
Cổng USB là giao tiếp quan trọng cho việc tải code từ máy tính lên vi điều khiển, đồng thời cũng phục vụ như một giao tiếp serial để truyền dữ liệu giữa vi điều khiển và máy tính.
Để cung cấp nguồn cho Arduino, bạn có thể sử dụng cổng USB, nhưng trong trường hợp không thể kết nối với máy tính, cần sử dụng nguồn ngoài từ 9V đến 12V.
- Có 14 chân vào/ra số đánh số thứ tự từ 0 đến 13, ngoài ra có một chân nối đất (GND) và một chân điện áp tham chiếu (AREF)
Vi điều khiển AVR là bộ xử lý trung tâm của toàn bộ bo mạch Arduino Mỗi mẫu Arduino sử dụng một loại chip khác nhau, và trong trường hợp của Arduino Uno, chip được sử dụng là ATMega328.
- Điện áp đầu vào (Giới hạn): 6-20V
- Chân vào/ra (I/O) số: 14 ( 6 chân có thể cho đầu ra PWM)
- Dòng điện trong mỗi chân I/O: 40mA
- Dòng điện chân nguồn 3.3V: 50mA
- Bộ nhớ trong: 32 KB (ATmega328)
Vi điều khiển của Arduino Uno
Arduino UNO sử dụng ba loại vi điều khiển 8bit AVR, bao gồm ATmega8, ATmega168 và ATmega328 Bộ vi điều khiển này có khả năng thực hiện các tác vụ đơn giản như điều khiển đèn LED nhấp nháy, xử lý tín hiệu cho xe điều khiển từ xa, và tạo ra một trạm đo nhiệt độ - độ ẩm với khả năng hiển thị trên màn hình LCD.
Arduino UNO được thiết kế với vi điều khiển ATmega328, có giá khoảng 90.000đ Nếu bạn cần một giải pháp tiết kiệm hơn, có thể lựa chọn các vi điều khiển khác như ATmega8 với bộ nhớ flash 8KB giá khoảng 45.000đ, hoặc ATmega168 với bộ nhớ flash 16KB giá khoảng 65.000đ, đáp ứng nhu cầu phần cứng tương đương.
Điện áp của Arduino UNO có thể được cung cấp 5V qua cổng USB hoặc từ nguồn ngoài với điện áp khuyên dùng từ 7-12V DC, giới hạn từ 6-20V Sử dụng pin vuông 9V là lựa chọn hợp lý nếu không có nguồn từ cổng USB Lưu ý rằng việc cung cấp điện áp vượt quá giới hạn sẽ gây hỏng Arduino UNO.
GND (Ground) là cực âm của nguồn điện cung cấp cho Arduino UNO Khi sử dụng các thiết bị với nguồn điện riêng biệt, các chân GND này cần phải được kết nối với nhau để đảm bảo hoạt động ổn định.
- 5V ; cấp điện áp 5V đầu ra Dòng tối đa cho phép ở chân này là 500mA
- 3.3V : cấp điện áp 3.3V đầu ra Dòng tối đa cho phép ở chân này là 50mA
- Vin ( Voltage Input ) : để cấp nguồn ngoài cho Arduino UNO , bạn nối cực dương của nguồn với chân này và cực âm của nguồn với chân GND
IOREF là chân trên Arduino UNO dùng để đo điện áp hoạt động của vi điều khiển, luôn ổn định ở mức 5V Tuy nhiên, bạn không nên sử dụng chân này để lấy nguồn 5V vì chức năng chính của nó không phải là cung cấp điện.
- RESET : việc nhấn nút Reset trên board để reset vi điều khiển tương đương với việc chân RESET được nối với GND qua 1 điện trở 10K
Vi điều khiển Atmega328 tiêu chuẩn mang đến cho người dùng 32KB bộ nhớ Flash, nơi lưu trữ các đoạn lệnh đã lập trình Mặc dù một phần nhỏ dung lượng này sẽ được sử dụng cho bootloader, người dùng thường không cần lo lắng vì vẫn còn khoảng 20KB bộ nhớ khả dụng cho các ứng dụng khác.
SRAM (Bộ nhớ truy cập ngẫu nhiên tĩnh) có dung lượng 2KB, nơi lưu trữ giá trị các biến bạn khai báo trong lập trình Số lượng biến bạn khai báo càng nhiều thì càng cần nhiều bộ nhớ RAM Tuy nhiên, bộ nhớ RAM thường không phải là mối bận tâm lớn trong quá trình lập trình Cần lưu ý rằng khi mất điện, dữ liệu trên SRAM sẽ bị mất.
1KB cho EEPROM (Bộ nhớ chỉ đọc có thể lập trình và xóa điện tử) giống như một ổ cứng mini, cho phép bạn đọc và ghi dữ liệu mà không lo mất mát khi mất điện, khác với dữ liệu trên SRAM.
Arduino Uno R3 có 14 chân digital để đọc và xuất tín hiệu với hai mức điện áp 0V và 5V Mỗi chân có dòng vào ra tối đa 40mA và được trang bị điện trở pull-up từ trong vi điều khiển ATmega328, mặc dù các điện trở này không được kết nối mặc định.
Một số chân digital có các chức năng đặc biệt như sau :
Chân Serial 0 (RX) và 1 (TX) trên Arduino Uno được sử dụng để gửi và nhận dữ liệu TTL Serial, cho phép giao tiếp với các thiết bị khác Kết nối Bluetooth thường được coi là kết nối Serial không dây Nếu không cần giao tiếp Serial, bạn nên tránh sử dụng hai chân này để tiết kiệm tài nguyên.
THIẾT KẾ VÀ THI CÔNG SẢN PHẨM
Thiết kế và thi công phần cứng
Kết nối Arduino và các thiết bị.
Arduino và Module RTC Arduino và cảm biến âm thanh
Arduino UNO Module RTC Arduino UNO Cảm biến âm thanh
Sơ đồ kết nối các thiết bị mô phỏng trên proteus:
Trong mô phỏng mạch trên Proteus, chúng em sử dụng cáp 7 màu để kết nối các module với nhau Việc này không chỉ giúp các thiết bị kết nối ổn định mà còn tạo điều kiện thuận lợi cho việc nâng cấp và sửa chữa.
Sơ đồ kết nối các thiết bị thực tế:
Hình 3 2: Thiết kế và thi công vỏ hộp để chứa và bảo vệ các thiết bị
Thiết kế và thi công phần mềm
3.2.1 Chương trình hiển thị lên LED P10.
Hiển thị thông tin lên led ma trận nói chung và led p10 nói riêng thường sử dụng phương pháp quét led.
Thuật toán quét LED truyền thống có thể gây khó chịu cho người dùng và ảnh hưởng đến chất lượng hiển thị Để khắc phục vấn đề này, chúng tôi đã áp dụng phương pháp ngắt timer, cho phép thực hiện thuật toán quét LED một cách hiệu quả hơn Phương pháp này hoạt động như một module tự động, giúp quét LED và hiển thị thông tin trên màn hình một cách mượt mà.
Để đảm bảo mối liên hệ giữa chương trình và hàm ngắt, hàm main cần ghi dữ liệu vào một Buffer (bộ đệm hiển thị) Buffer này là một mảng dữ liệu chứa thông tin cần hiển thị Khi hàm main muốn hiển thị nội dung, nó chỉ cần ghi vào bộ đệm, trong khi hàm ngắt sẽ tự động lấy dữ liệu từ bộ đệm để hiển thị một cách định kỳ và tự động.
Phương pháp ngắt timer trong thuật toán quét LED cho LED P10 (32x16) yêu cầu quản lý 512 LED, tương đương với 512 bit Mỗi LED bao gồm ba màu RGB, do đó cần thêm một chiều để quản lý màu sắc.
Khai bảo một mảng 3 chiều: char Buffer_display[3][16][4] để quản lý ma trận LED và làm bộ đệm cho chương trình ngắt Timer.
Xây dựng chương trình ngắt quét LED sử dụng bộ Timer1 của Arduino là cần thiết để đảm bảo không gây ảnh hưởng đến mắt và não bộ, với tần số tối thiểu là 24-30fps Trong dự án này, chúng tôi đã chọn quét với tốc độ 33 khung hình mỗi giây Đối với LED P10, mỗi khung hình sẽ hoàn thành sau 8 lần quét, và mỗi lần ngắt chỉ cho phép sáng một hàng Thời gian cho mỗi lần ngắt được tính là 1 / (8 x 33) = 0.0037 giây.
Giá trị nạp vào thanh ghi TCNT1 = 2^16 – 0.0037*(16 *10^6)/256.
3.2.2 Thiết kế chương trình chính.
Lưu đồ thuật toán của chương trình chính.
Chương trình chính được chia thành hai tác vụ, trong đó tác vụ “taskRealTime” có nhiệm vụ đọc và hiển thị các thông số thời gian bao gồm giờ, phút và giây.
Animation có vai trò quan trọng trong việc hiển thị hiệu ứng chuyển động và nháy theo nhạc Các tác vụ giao tiếp thông qua hàng đợi "mode" và được điều khiển bởi chương trình điều khiển được mô tả trong mục 3.2.3.
Lưu đồ thuật toán tác vụ taskRealTime:
Hình 3 6: Lưu đồ thuật toán tác vụ taskRealTimeLưu đồ thuật toán tác vụ “animation”:
Hình 3 7: Lưu đồ thuật toán tác vụ “animation” 3.2.3 Chương trình điều khiển sản phẩm.
Sơ đồ điều khiển sản phẩm
Chương trình điều khiển nhận dữ liệu trực tiếp từ người dùng thông qua nút nhấn, cho phép tương tác thời gian thực Để đảm bảo quá trình này diễn ra mượt mà, chúng tôi đã sử dụng tính năng ngắt cứng trên Arduino Uno.
Lưu đồ thuật toán chương trình điều khiển:
Hình 3 9: Lưu đồ thuật toán chương trình điều khiển
TỔNG KẾT
Nhận xét, đánh giá
số hạn chế như sau:
- Chưa điều chỉnh được ngày, tháng, năm.
- Sản phẩm chưa có tính thẩm mỹ cao.
Hướng phát triển
- Có thêm hiển thị nhiệt độ và độ ẩm.
- Tích hợp thêm nhiều hiệu ứng có thể chuyển mode qua nút nhấn, không dây smartphone hoặc PC thông qua các chuẩn không dây (bluetooth, wifi, NFC, )
- Đọc tín hiệu âm thanh qua cổng usb của pc.
- Tích hợp phát nhạc trực tiếp từ SD Card hoặc USB có thêm các chức năng như máy nghe nhạc
- Bổ sung thêm cột led để nháy theo 2 mức âm thanh trái phải riêng biệt.
- Thiết kế mô hình với kích thước nhỏ gọn, kiểu dáng đẹp hơn.
Kết luận
Mặc dù đã nỗ lực rất nhiều, nhưng do hạn chế về thời gian và năng lực, chúng tôi không thể tránh khỏi những sai sót Chúng tôi rất mong nhận được ý kiến đóng góp từ các thầy cô và bạn bè để hoàn thiện hơn.
Trong báo cáo này, chúng em đã sử dụng các tài liệu tham khảo:
[1] “Giáo Trình Vi Điều Khiển” Của GV Phạm Hùng Kim Khánh
[2] Từ các trang web: www.dientuvietnam.net, codientu.org
[3] Vi điều khiển với lập trình C_Ngô Diên Tập Trang Web tham khảo http://arduino.vn/bai-viet/369-giao-tiep-i2c-va-su-dung-module-realtime- clock-ds1307