Từ mong muốn được ứng dụng các kiến thức đã học vào lập trình ở 1 môi trường khác cụ thể là hệ điều hành Linux, nhóm đã quyết định thực hiện đề tài:“Đồng hồ số hiển thị LCD sử dụng Beagl
NGHIÊN CỨU TỔNG QUAN
Tổng quan về hệ điều hành Linux
1.1.1: Khái niệm và lịch sử phát triển
Linux là một hệ điều hành mã nguồn mở, quản lý trực tiếp phần cứng và tài nguyên hệ thống như CPU, bộ nhớ và lưu trữ Vai trò của hệ điều hành là trung gian giữa các ứng dụng và phần cứng, tạo kết nối giữa phần mềm và tài nguyên vật lý để hoạt động hiệu quả.
Linux được sáng tạo vào năm 1991 bởi Linus Torvalds, một sinh viên tại Đại học Helsinki, với mục đích thay thế hệ điều hành Minix dựa trên mã nguồn mở và miễn phí Ban đầu, phần mềm này có tên là Freax, nhưng sau đó đã được đổi thành Linux theo tên của chính Torvalds để phân phối mã nguồn Linux nhanh chóng trở thành hệ điều hành phổ biến nhờ tính linh hoạt, mã nguồn mở và cộng đồng phát triển rộng lớn.
“Linux” ra đời nhờ sự kết hợp của hai cái tên “Freax” và “Linus”
1.1.2: Cấu trúc của hệ điều hành Linux
Hình 1.1: Cấu trúc tầng hệ điều hành Linux
Hệ điều hành Linux sẽ gồm 2 tầng chính: User space và Kernel space
Không gian người dùng (User space) bao gồm các ứng dụng, phần mềm và tiện ích của người dùng, đồng thời chứa các chương trình thực thi các yêu cầu từ người dùng gửi đến tầng kernel Đây là nơi chạy các ứng dụng cá nhân, đảm bảo cho hoạt động của hệ điều hành và trải nghiệm người dùng mượt mà Trong không gian người dùng, các ứng dụng như trình duyệt web, phần mềm văn phòng, trò chơi và các tiện ích khác hoạt động độc lập với kernel, giúp tối ưu hóa hiệu suất và bảo mật hệ thống.
Kernel space là thành phần cốt lõi của hệ điều hành, được ví như trái tim của hệ thống, chứa các module và thư viện quản lý giao tiếp giữa phần cứng máy tính và các ứng dụng Đây là môi trường mà nhóm chúng tôi đã chọn để lập trình trong đề tài này, nhằm đảm bảo hiệu quả và tối ưu hóa hoạt động của hệ thống.
1.1.3: Cấu trúc cây thư mục của Linux
Khác so với hệ điều hành Windows, hệ điều hành Linux quản lý file theo sơ đồ cây thư mục Cụ thể như sau:
Hình 1.2: Cấu trúc cây thư mục trong Linux
- root: Thư mục cha của tất cả thư mục
- /bin: Chứa các tập tin thực thi của người dùng
Thư mục /sbin chứa các tệp tin thực thi quan trọng của hệ thống, chủ yếu dùng để cấu hình hệ thống và quản lý các hoạt động hệ thống cần quyền Root hoặc Super User Các lệnh trong /sbin thường được sử dụng để thực hiện các tác vụ quản trị hệ thống như cấu hình mạng, quản lý thiết bị và thiết lập các dịch vụ hệ thống Việc truy cập và thực thi các lệnh này yêu cầu quyền cao, đảm bảo an toàn và bảo mật cho hệ thống.
- /etc: Chứa các tập tin cấu hình cần thiết cho tất cả các chương trình và các đoạn mã khời động, tắt các chương trình đơn
- /dev: chứa các tập tin thiết bị đầu cuối hay bất kỳ thiết bị nào gắn vào hệ thống
- /proc: chứa các thông tin tiến trình đang chạy
- /var: chứa các tập tin mà dung lượng lớn dần theo thời gian sử dụng
- /tmp: chứa các tập tin tạm được khởi tạo bởi người dùng và hệ thống Sẽ bị xóa khi hệ thống khời động lại
- /usr: chứa các tập lệnh thực thi, thư viện, tài liệu mã nguồn cho các chương trình của người dùng
- /usr/bin chứa các tập tin thực thi cho các chương trình của người dùng
- /usr/sbin chứa các tập tin thực thi cho quản trị hệ thống
- /usr/lib chứa các tập tin thư viện /usr/bin và /usr/sbin
- /usr/local chứa các chương trình của người dùng mà bạn cài từ mã nguồn
- /boot: chứa các tập tin của chương trình khởi động máy
- /lib: chứa các tập tin thư viện hỗ trợ các tập tin thực thi trong /bin và /sbin
- /mnt: thư mục mount tạm thời, người quản trị hệ thống có thể mount các tập tin hệ thống
- /srv: dữ liệu dịch vụ máy chủ
1.1.4: Hệ thống quản lý User
Vào những năm 1970, hệ điều hành chủ yếu là các chương trình vi điều khiển đơn giản Tuy nhiên, Unix đã phát triển một khái niệm mới về User trong hệ điều hành, đó là một đối tượng quản lý tài nguyên riêng biệt trong hệ thống Khái niệm User giúp hệ điều hành phân chia và kiểm soát quyền truy cập, nâng cao tính bảo mật và hiệu quả hoạt động của hệ thống.
Linux kernel
Năm 1991, Linus Torvalds đã phát triển Linux Kernel dựa trên nhân UNIX, phục vụ cho máy tính của ông Linux Kernel được cấu thành từ sáu thành phần chính, phản ánh chức năng đa dạng của hệ điều hành Việc xây dựng kernel từ nhân UNIX giúp Linux trở thành hệ điều hành mở, linh hoạt và phổ biến trên nhiều nền tảng Các thành phần của Linux Kernel đóng vai trò quan trọng trong việc đảm bảo hoạt động ổn định, quản lý phần cứng, xử lý hệ thống và cung cấp dịch vụ cho phần mềm ứng dụng Linux Kernel không ngừng phát triển, đem lại sự tối ưu hóa và mở rộng tính năng cho hệ điều hành mã nguồn mở này.
- Process management: có nhiệm vụ quản lý các tiến trình, bao gồm các công việc:
+ Tạo/hủy các tiến trình
Lập lịch cho các tiến trình là quá trình lên kế hoạch để CPU biết khi nào thực thi chương trình, thời gian thực thi bao lâu và dự định chuyển sang chương trình tiếp theo Điều này đảm bảo quản lý hiệu quả nguồn tài nguyên của hệ thống, tối ưu hóa hiệu suất hoạt động của máy tính và duy trì hoạt động liên tục của các tiến trình.
+Hỗ trợ các tiến trình giao tiếp với nhau
+ Đồng bộ hoạt động của các tiến trình để tránh xảy ra tranh chấp tài nguyên
- Memory management: có nhiệm vụ quản lý bộ nhớ, bao gồm các công việc:
+ Cấp phát bộ nhớ trước khi đưa chương trình vào, thu hồi bộ nhớ khi tiến trình kết thúc
+ Đảm bảo chương trình nào cũng có cơ hội được đưa vào bộ nhớ
+ Bảo vệ vùng nhớ của mỗi tiến trình
- Device management: có nhiệm vụ quản lý thiết bị, bao gồm các công việc:
+ Điều khiển hoạt động của các thiết bị
+ Giám sát trạng thái của các thiết bị
+ Trao đổi dữ liệu với các thiết bị
+ Lập lịch sử dụng các thiết bị, đặc biệt là thiết bị lưu trữ (ví dụ ổ cứng)
- File system management: có nhiệm vụ quản lý dữ liệu trên thiết bị lưu trữ (như ổ cứng, thẻ nhớ) Quản lý dữ liệu gồm các công việc: thêm, tìm kiếm, sửa, xóa dữ liệu
- Networking management: có nhiệm vụ quản lý các gói tin (packet) theo mô hình TCP/IP
- System call Interface: có nhiệm vụ cung cấp các dịch vụ sử dụng phần cứng cho các tiến trình Mỗi dịch vụ được gọi là một system call Khi một tiến trình cần sử dụng một dịch vụ nào đó của kernel, tiến trình sẽ gọi một system call System call cũng tương tự như các hàm bình thường khác (library call) Chỉ có điều, các library call được cung cấp bởi các thư viện trong user space, còn các system call được cung cấp bởi kernel
Hình 1.3: Kiến trúc Linux kernel theo khối
Lập trình trên hệ điều hành Linux
Lập trình trên hệ điều hành Linux đòi hỏi phải sử dụng công cụ biên dịch phù hợp để thực thi mã nguồn Khác với các IDE tích hợp nhiều chức năng như trình chỉnh sửa mã, trình biên dịch, và công cụ gỡ lỗi, lập trình trên Linux thường sử dụng GCC để biên dịch và chạy chương trình Việc sử dụng GCC là lựa chọn phổ biến giúp biên dịch mã nguồn nhanh chóng và hiệu quả trên hệ điều hành Linux.
Hình 1.4: Quá trình biên dịch chương trình
Quá trình xử lý chương trình bắt đầu khi nạp file nguồn vào hệ thống và trải qua bước tiền xử lý (Preprocessor), nhằm sinh ra các file i đã được phân biệt dựa trên đọc header của file nguồn Sau đó, file i sẽ được biên dịch thành mã máy (Assemble) và tạo ra file đối tượng (.o) Cuối cùng, các file o sẽ được liên kết với nhau cùng các thư viện cần thiết để tạo thành file thực thi (.exe).
Kết luận chương
Trong Chương I, nhóm đã cung cấp tổng quan về hệ điều hành Linux, Linux kernel cùng các kiến thức cơ bản về lập trình trên tầng User Chương II tiếp tục trình bày quá trình nghiên cứu và thiết kế đồng hồ số sử dụng nền tảng Beaglebone.
NGHIÊN CỨU THIẾT KẾ ĐỒNG HỒ SỐ
Chương này sẽ trình bày chi tiết về cơ sở lý thuyết của dề tài, quá trình thiết kế phần mềm cũng và phần cứng
2.1.1: Máy tính nhúng Beaglebone Black(BBB) a: Thông tin chung
BeagleBone Black là main Linux mạnh mẽ với cấu hình cao và khả năng mở rộng vượt trội, phù hợp cho các dự án đòi hỏi hiệu suất cao và kết nối đa dạng Bo mạch chủ kích thước nhỏ gọn 8,6 x 5,3 cm được trang bị bộ xử lý ARM Cortex-A8 tốc độ 1GHz của Texas Instruments, hỗ trợ tăng tốc đồ họa hiệu quả Thiết bị có 46 chân kết nối ngoại vi, bộ nhớ flash 2GB tích hợp cùng bộ nhớ DDR3 512MB giúp đảm bảo hoạt động ổn định và đa nhiệm Ngoài ra, BeagleBone Black còn tích hợp cổng USB, kết nối Ethernet và HDMI với khả năng xử lý độ phân giải 1280 x 1024 pixel, phù hợp cho các ứng dụng đa phương tiện và IoT Nguồn điện 5V DC có thể cấp qua cổng USB hoặc qua các adaptor phù hợp, đảm bảo cung cấp nguồn năng lượng ổn định cho thiết bị.
- Vi xử lí AM3358 1GHz ARM® Cortex-A8
- 4GB 8-bit eMMC Onboard Flash
- 2x Vi điều khiển 32-bit PRU
- USB Client for power and communications
Tương thích với các hệ điều hành:
- Cloud9 IDE on Node.js with BoneScript
Để giao tiếp với máy tính nhúng BBB qua PC, nhóm đã sử dụng các công cụ phù hợp như sơ đồ chân BBB nhằm đảm bảo kết nối hiệu quả Trong đó, hình 2.2 trình bày rõ sơ đồ chân BBB và phương pháp giao tiếp giữa máy tính nhúng và PC, giúp tối ưu hóa quá trình truyền dữ liệu và điều khiển thiết bị Việc sử dụng các công cụ này là yếu tố then chốt trong việc thiết lập mối liên kết chắc chắn giữa PC và máy tính nhúng BBB, đảm bảo hoạt động ổn định và chính xác trong quá trình thực hiện dự án.
Putty là phần mềm giúp người dùng điều khiển server qua internet một cách dễ dàng và an toàn Nó hỗ trợ nhiều giao thức mạng như SCP, SSH, Rlogin, Telnet, giúp thực hiện các kết nối từ xa một cách linh hoạt Trong đề tài, nhóm sử dụng Putty để thực hiện kết nối SSH, đảm bảo quá trình quản lý server diễn ra hiệu quả và bảo mật.
Module USB to COM FT232 là mạch chuyển đổi tín hiệu USB sang UART, sử dụng chip FT232RL của FTDI, giúp kết nối dễ dàng với các thiết bị như BeagleBone Black (BBB) Module hỗ trợ giao thức UART, mang lại khả năng giao tiếp linh hoạt và hiệu quả, phù hợp để làm việc với phần mềm Putty để thực hiện giao tiếp serial dễ dàng và nhanh chóng Sản phẩm này là giải pháp lý tưởng cho các dự án cần kết nối giữa máy tính và các thiết bị nhúng qua giao diện USB và UART.
Hình 2.3: Sơ đồ chân UART BBB và FT232
LCD (Liquid Crystal Display) được sử dụng trong rất nhiều các ứng dụng của
Vi điều khiển LCD có nhiều ưu điểm vượt trội so với các dạng hiển thị khác nhờ khả năng hiển thị đa dạng các ký tự như chữ, số và ký tự đồ họa một cách trực quan LCD dễ dàng tích hợp vào các mạch ứng dụng qua nhiều giao thức giao tiếp khác nhau, tiết kiệm tài nguyên hệ thống và có chi phí thấp, phù hợp cho nhiều dự án điện tử và tự động hóa.
- Hiển thị tối đa 16 ký tự trên 2 dòng
- Chức năng các chân của LCD
+ Chân 1: (Vss) Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với GND của mạch điều khiển
+ Chân 2: VDD Là chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với VCC = 5V của mạch điều khiển
+ Chân 3: VEE là chân điều chỉnh độ tương phản của LCD
+ Chân 4: RS Là chân chọn thanh ghi (Register select) Nối chân RS với logic “0” (GND) hoặc logic “1” (VCC) để chọn thanh ghi
- Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ
“ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read)
- Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD
Pin 5 (R/W) is the read/write select pin for the LCD Connecting R/W to logic "0" enables the LCD's write mode, allowing data to be written to the display Conversely, connecting R/W to logic "1" sets the LCD to read mode, enabling data to be read from it Properly configuring this pin is essential for correct communication with the LCD in your embedded projects.
Chân 6, còn gọi là chân E (Enable), có vai trò cho phép hoạt động của các lệnh sau khi các tín hiệu đã được đặt lên bus DB0 đến DB7 Các lệnh chỉ được chấp nhận khi có một xung kích hoạt chân E, đảm bảo quá trình truy cập dữ liệu diễn ra chính xác và có kiểm soát.
Trong chế độ ghi, dữ liệu trên bus sẽ được LCD chuyển vào và lưu trữ trong thanh ghi nội bộ của nó khi phát hiện một xung chuyển từ mức cao xuống thấp trên chân E Quá trình này đảm bảo dữ liệu được ghi chính xác vào bộ nhớ LCD, thúc đẩy hiệu suất hoạt động của thiết bị Việc nhận biết tín hiệu E là yếu tố quyết định trong quá trình ghi dữ liệu, giúp nâng cao độ tin cậy và hiệu quả của hệ thống hiển thị LCD.
- Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân E xuống mức thấp
+ Chân 7 - 14: DB0 - DB7 - Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU Có 2 chế độ sử dụng 8 đường bus này:
- Chế độ 8 bit: Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7
- Chế độ 4 bit: Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7
+ Chân 15: Nguồn dương cho đèn
+ Chân 16: GND cho đèn nền
Hình 2.4: Sơ đồ chân LCD 16x2
- Nằm trong khối Device management giới thiệu ở phần 1.2
Phần mềm là tập hợp các lệnh và hướng dẫn giúp CPU tương tác hiệu quả với các thiết bị như chuột, bàn phím, ổ cứng, card mạng, loa và màn hình Nó đóng vai trò quan trọng trong việc điều phối hoạt động của các thiết bị phần cứng, đảm bảo hệ thống hoạt động mượt mà và ổn định Việc vận hành chính xác phần mềm giúp nâng cao hiệu suất và trải nghiệm người dùng trong quá trình sử dụng máy tính.
- Linux có rất nhiều loại Device(I2C, Ethernet, …) nhưng chủ yếu chia làm 3 loại chính:
A character device facilitates data exchange between the CPU and hardware devices using small data units, with the minimum data size being one byte Examples of character devices include peripherals such as mice, keyboards, and speakers, which communicate with the computer system on a byte-by-byte basis This data transfer process is essential for real-time input and output operations, ensuring efficient interaction between the CPU and various hardware components.
Block device là thiết bị lưu trữ, trong đó lượng dữ liệu nhỏ nhất trao đổi giữa CPU và thiết bị là một khối (block), thường gồm nhiều byte, ví dụ như 512 byte Đây là đơn vị dữ liệu cơ bản trong các hệ thống lưu trữ như ổ cứng, giúp tối ưu hóa quá trình truyền tải và quản lý dữ liệu.
Trong mạng máy tính, thiết bị mạng (network device) thường trao đổi dữ liệu dưới dạng các gói tin nhỏ nhất, gọi là frame hoặc packet, gồm nhiều byte dữ liệu không cố định về kích thước Gói tin này đóng vai trò là đơn vị truyền thông chính giữa CPU và các thiết bị mạng, giúp đảm bảo quá trình truyền dữ liệu diễn ra hiệu quả Các thiết bị mạng phổ biến như card mạng NIC hoặc chip Wifi đều hoạt động dựa trên nguyên lý xử lý và truyền gửi các gói tin này.
Device driver được chia làm 2 thành phần:
Thành phần này là phần quan trọng của hệ điều hành, cung cấp các dịch vụ đọc và ghi dữ liệu của thiết bị một cách hiệu quả Nó cho phép hệ điều hành hoạt động độc lập với cấu trúc phần cứng của thiết bị, đảm bảo tính linh hoạt và khả năng tương thích cao Nhờ đó, các hệ điều hành có thể quản lý thiết bị một cách tối ưu, nâng cao hiệu suất và độ ổn định của hệ thống.
Thành phần Device specific chứa các lệnh hướng dẫn CPU điều khiển, giám sát và trao đổi dữ liệu với thiết bị, được xây dựng dựa trên datasheet của thiết bị Datasheet là tài liệu do nhà sản xuất cung cấp, mô tả sơ đồ khối chức năng, nguyên lý hoạt động, hiệu suất, đặc tính điện và đặc biệt là bản đồ thanh ghi (register map), giúp hiểu rõ cách thiết bị hoạt động và lập trình phù hợp.
ĐÁNH GIÁ KẾT QUẢ
Kết quả
Danh sách các file code:
Hình 3.1: Danh sách file code
Sau quá trình make file, các file object sinh ra:
Hình 3.2: Danh sách file object
Trong đó lcd.ko là kernel module
Sau khi biên dịch thành công kernel module, người dùng có thể cài đặt module bằng lệnh "sudo insmod lcd.ko" như đã hướng dẫn trong Chương II Sau khi tải kernel module, hệ điều hành sẽ hiển thị danh sách các driver có trong OS, bao gồm driver mới đã được thêm vào, giúp quản lý và vận hành hệ thống hiệu quả hơn.
Hình 3.3: Danh sách các driver hiện có
Ta có thể thấy driver lcd được kiển thị ở đầu tiên, với size là 16384 KB
Kiểm tra device file trong thư mục /dev khi đã load thành công module vào OS
Hình 3.4: Danh sách device file của OS
Có thể thấy, device file đã được tạo như trong lưu đồ phần mềm
Tiếp đó, ta xử lý về thời gian và ghi từ OS xuống device để hiển thị lên LCD
Hình 3.5: Thời gian thực từ OS
Sau khi xác định thời gian từ OS, Linux hỗ trợ toán tử “>” để ghi trực tiếp dữ liệu lên file thiết bị Việc sử dụng lệnh này cho phép người dùng ghi dữ liệu một cách nhanh chóng và chính xác vào các device file trên hệ thống Linux, đảm bảo quá trình vận hành diễn ra hiệu quả.
Đánh giá kết quả và hướng phát triển
Đề tài đã thành công trong việc hiển thị thời gian thực lên màn hình LCD, đảm bảo tính chính xác và độ rõ nét của dữ liệu hiển thị Quá trình thực hiện dựa trên lập trình driver cho tầng kernel của hệ điều hành Linux, giúp tối ưu hiệu suất và khả năng tương tác Việc tích hợp này góp phần nâng cao khả năng quản lý thời gian trong các hệ thống nhúng sử dụng Linux, đồng thời phù hợp với các yêu cầu của dự án về tính năng và độ ổn định.
- Chưa tối ưu phần mềm dẫn tới phần cứng chưa được tối ưu
- Sử dụng I2C driver để tiết kiệm IO cũng như dễ dàng phát triển tích hợp ngoại vi
- Thiết kế PCB cho sản phẩm sau khi đã hoàn thiện phần mềm
- Viết thêm chương trình tạo các hiệu ứng, cập nhật thời gian từ OS ra LCD
3.3: Kết luận chương Ở chương III, nhóm đã tập trung theo dõi, đánh giá, kiểm tra quá trình thực hiện chức năng của sản phẩm Qua đó rút ra kết luận và tìm hiểu thêm hướng phát triển hể hoàn thiện hơn nữa sản phẩm
Sau gần 3 tháng nghiên cứu và làm việc tích cực dưới sự hướng dẫn tận tình của thầy Nguyễn Văn Thành, nhóm đã hoàn thành thành công đề tài “Đồng hồ số hiển thị LCD sử dụng Beaglebone” Dự án đã đạt được những kết quả đáng kể trong việc thiết kế và lập trình màn hình hiển thị LCD cho đồng hồ số dựa trên nền tảng Beaglebone, góp phần nâng cao kỹ năng công nghệ và kiến thức về IoT Đây là thành quả thể hiện sự nỗ lực và kiến thức chuyên môn của nhóm trong việc phát triển các giải pháp thiết thực, phù hợp với xu hướng công nghệ hiện nay.
- Tìm hiểu tổng quan về hệ điều hành Linux
- Hiểu được nguyên lí cũng như cách thức hoạt động của luồng trao đổi dữ liệu trong các tầng của Linux
- Tìm hiểu, lập trình thành công Device driver cho Linux
Trong quá trình thực hiện đồ án, nhóm đã nhận được sự hướng dẫn tận tình từ thầy, giúp các thành viên thử thách bản thân với một đề tài khó, từ đó học hỏi cách tổ chức và giải quyết vấn đề một cách khoa học hơn Dù đã cố gắng hết sức, nhóm vẫn gặp phải một số sai sót trong quá trình thực hiện, và mong nhận được góp ý chân thành từ thầy để hoàn thiện dự án hơn nữa.
Xin chân thành cảm ơn!