Wireless Controller sử dụng điện áp 3.3VDC cho cấp nguồn và giao tiếp, nếucác bạn giao tiếp với các vi điều khiển 5VDC thì cần thêm 1 đế chuyển mứcđiện áp giao tiếp từ 5VDC sang 3.3VDC đ
Trang 1BÁO CÁO BÀI TẬP LỚN MÔN: ĐỒ ÁN THIẾT KẾ HỆ THỐNG NHÚNG
Trang 2kiện hỗ trợ, giúp đỡ chúng em suốt quá trình học tập và nghiên cứu vừa qua
Đặc biệt, trong học kỳ này, học viện đã tổ chức cho chúng em được tiếp cận vớicác môn học rất hữu ích đối với sinh viên Chúng em xin chân thành cảm ơn thầy
Nguyễn Ngọc Minh đã tận tâm hướng dẫn chúng em trong môn học đồ án thiết kế hệ thống nhúng Thầy đã luôn bên cạnh, tạo điều kiện trong suốt quá trình nghiên
cứu, động viên và giúp đỡ để chúng em hoàn thành tốt báo cáo này
Do kiến thức còn nhiều hạn chế và khả năng tiếp thu thực tế còn nhiều bỡ ngỡchưa hoàn hảo nên bài báo cáo sẽ còn nhiều thiếu sót, kính mong sự góp ý và giúp đỡ
từ thầy
Cuối cùng chúng em xin kính chúc quý thầy cô dồi dào sức khỏe, niềm tin để tiếp tục thực hiện sứ mệnh cao đẹp của mình là truyền đạt kiến thức cho thế hệ mai sau
Chúng em xin chân thành cảm ơn
BÁO CÁO BÀI TẬP LỚN MÔN: ĐỒ ÁN THIẾT KẾ HỆ THỐNG NHÚNG
Trang 32.3.5 Các khái niệm trong hệ điều hành thời gian thực RTOS 17
h
Trang 41, Tổng quan
1.1 Arduino
⮚ Arduino là một bo mạch vi điều khiển do một nhóm giáo sư và sinh viên nước
Ý thiết kế và đưa ra đầu tiên vào năm 2005 Mạch Arduino được sử dụng đểcảm nhận và điều khiển nhiều đối tượng khác nhau Nó có thể thực hiện nhiềunhiệm vụ lấy tín hiệu từ cảm biến đến điều khiển đèn, động cơ, và nhiều đốitượng khác Ngoài ra mạch còn có khả năng liên kết với nhiều module khácnhau như module đọc thẻ từ, ethernet shield, sim900A, ….để tăng khả ứngdụng của mạch
⮚ Phần cứng bao gồm một board mạch nguồn mở được thiết kế trên nền tảng vi
xử lý AVR Atmel 8bit, hoặc ARM, Atmel 32-bit,… Hiện phần cứng củaArduino có tất cả 6 phiên bản, Tuy nhiên phiên bản thường được sử dụng nhiềunhất là Arduino Uno và Arduino Mega
Hình 1.1 Cấu tạo của arduino
h
Trang 5⮚ Thông số cơ bản của Arduino Uno R3
● Vi điều khiển Atmega 328 (họ 8 bit)
● Điện áp hoạt động 5V – DC (cấp qua cổng USB)
● Tần số hoạt động16 MHz
● Dòng tiêu thụ 30mA
● Điện áp vào khuyên dùng 7 – 12V – DC
● Điện áp vào giới hạn 6 – 20V – DC
● Số chân Digital I/O 14 (6 chân PWM)
● Số chân Analog 6 (độ phân giải 10 bit)
● Dòng tối đa trên mỗi chân I/O 30 mA
Trang 6nguồn 5VDC cho các module khác (chỉ sử dụng 5V này nếu nguồn cấp
<12VDC)
Hình 1.2 Module L298
⮚ Thông số kỹ thuật:
● IC chính: L298 - Dual Full Bridge Driver
● Điện áp đầu vào: 5~30VDC
● Công suất tối đa: 25W 1 cầu (lưu ý công suất = dòng điện x điện áp nên ápcấp vào càng cao, dòng càng nhỏ, công suất có định 25W)
● Dòng tối đa cho mỗi cầu H là: 2A
● Mức điện áp logic: Low -0.3V~1.5V, High: 2.3V~Vss
● Kích thước: 43x43x27mm
1.3 Động cơ giảm tốc
⮚ Cặp Động cơ DC giảm tốc V1 Dual Shaft Plastic Geared TT Motor + bánh xe
là loại được lựa chọn và sử dụng nhiều nhất hiện nay cho các thiết kế khung
h
Trang 7Robot, xe, thuyền, , động cơ có chất lượng và giá thành vừa phải cùng với khảnăng dễ lắp ráp đem đến chi phí tiết kiệm và sự tiện dụng cho người sử dụng.
Hình 1.3 Động cơ giảm tốc màu vàng
⮚ Màn hình text LCD1602 xanh lá sử dụng driver HD44780, có khả năng hiển thị
2 dòng với mỗi dòng 16 ký tự, màn hình có độ bền cao, rất phổ biến, nhiều codemẫu và dễ sử dụng thích hợp cho những người mới học và làm dự án
h
Trang 8● Có thể được điều khiển với 6 dây tín hiệu
● Có bộ ký tự được xây dựng hổ trợ tiếng Anh và tiếng Nhật, xem thêmHD44780 datasheet để biết thêm chi tiết
h
Trang 91.5 Mạch chuyển đổi giao tiếp LCD
⮚ Để sử dụng các loại LCD có driver là HD44780(LCD 1602, LCD 2004, ),cần có ít nhất 6 chân của MCU kết nối với các chân RS, EN, D7, D6, D5 và D4
để có thể giao tiếp với LCD
⮚ Với module chuyển giao tiếp LCD sang I2C, các bạn chỉ cần 2 chân (SDA vàSCL) của MCU kết nối với 2 chân (SDA và SCL) của module là đã có thể hiểnthị thông tin lên LCD Ngoài ra có thể điều chỉnh được độ tương phản bởi biếntrở gắn trên module
Hình 1.5 Module PCF8574
1.6 Tay Điều Khiển PS2 Wireless Controller
Hình 1.6 Tay cầm PS2
h
Trang 10Wireless Controller sử dụng điện áp 3.3VDC cho cấp nguồn và giao tiếp, nếucác bạn giao tiếp với các vi điều khiển 5VDC thì cần thêm 1 đế chuyển mứcđiện áp giao tiếp từ 5VDC sang 3.3VDC để tránh trường hợp bộ nhận tín hiệucủa tay bị cháy.
Hình 1.7 Mạch chuyển tín hiệu tay cầm PS2
⮚ Đế chuyển mức điện áp giao tiếp 3.3-5VDC PS2 PS3 Controller Adapter được
sử dụng với các loại tay cầm điều khiển PS2, PS3 để chuyển mức điện áp giaotiếp tín hiệu của tay điều khiển từ 3.3VDC thành 5VDC và ngược lại để giaotiếp với các loại Vi Điều Khiển sử dụng 5VDC, tránh làm cháy tay điều khiển
h
Trang 11⮚ Thông số kỹ thuật:
● Kết nối được với tay cầm PS2, PS3
● Chuyển mức tín hiệu thành 3.3VDC và cấp nguồn cho tay cầm.2, Cơ sở lýthuyết
⮚ Chỉ cần có hai đường bus (dây) chung để điều khiển bất kỳ thiết bị / IC nào trênmạng I2C
⮚ Không cần thỏa thuận trước về tốc độ truyền dữ liệu như trong giao tiếp UART
Vì vậy, tốc độ truyền dữ liệu có thể được điều chỉnh bất cứ khi nào cần thiết
⮚ Cơ chế đơn giản để xác thực dữ liệu được truyền
⮚ Sử dụng hệ thống địa chỉ 7 bit để xác định một thiết bị / IC cụ thể trên bus I2C
⮚ Các mạng I2C dễ dàng mở rộng Các thiết bị mới có thể được kết nối đơn giảnvới hai đường bus chung I2C
h
Trang 12Hình 2.1 Sơ đồ khối I2C2.1.2 Giao thức truyền dữ liệu
Giao thức sau đây (tập hợp các quy tắc) được theo sau bởi thiết bị Master và các thiết
bị Slave để truyền dữ liệu giữa chúng
Dữ liệu được truyền giữa thiết bị Master và các thiết bị Slave thông qua một đường dữliệu SDA duy nhất, thông qua các chuỗi có cấu trúc gồm các số 0 và 1 (bit) Mỗi chuỗi
số 0 và 1 được gọi là giao dịch (transaction) và dữ liệu trong mỗi giao dịch có cấu trúcnhư sau:
Hình 2.2 Khung truyền I2C
⮚ Điều kiện bắt đầu (Start Condition)
● Bất cứ khi nào một thiết bị chủ / IC quyết định bắt đầu một giao dịch, nó sẽchuyển mạch SDA từ mức điện áp cao xuống mức điện áp thấp trước khiđường SCL chuyển từ cao xuống thấp
h
Trang 13● Khi điều kiện bắt đầu được gửi bởi thiết bị Master, tất cả các thiết bị Slaveđều hoạt động ngay cả khi chúng ở chế độ ngủ (sleep mode) và đợi bit địachỉ.
Hình 2.3 Sơ đồ xung bắt đầu truyền
⮚ Bit Read / Write Bit này xác định hướng truyền dữ liệu
● Nếu thiết bị Master / IC cần gửi dữ liệu đến thiết bị Slave, bit này được thiếtlập là ‘0’
● Nếu IC Master cần nhận dữ liệu từ thiết bị Slave, bit này được thiết lập là
‘1’
⮚ Bit ACK / NACK
● ACK / NACK là viết tắt của Acknowledged/Not-Acknowledged
h
Trang 14● Nếu địa chỉ vật lý của bất kỳ thiết bị Slave nào trùng với địa chỉ được thiết
bị Master phát, giá trị của bit này được set là ‘0’ bởi thiết bị Slave Ngượclại, nó vẫn ở mức logic ‘1’ (mặc định)
⮚ Điều kiện kết thúc (Stop condition)
● Sau khi các khung dữ liệu cần thiết được truyền qua đường SDA, thiết bịMaster chuyển đường SDA từ mức điện áp thấp sang mức điện áp cao trướckhi đường SCL chuyển từ cao xuống thấp
Hình 2.4 Sơ đồ xung kết thúc truyền
h
Trang 152.2 Chuẩn giao tiếp UART
2.2.1 Giới thiệu
⮚ Các tên đầy đủ UART là “Universal Asynchronous Receiver / Transmitter”, và
nó là một vi mạch sẵn có trong một vi điều khiển nhưng không giống như mộtgiao thức truyền thông (I2C & SPI)
⮚ Chức năng chính của UART là truyền dữ liệu nối tiếp Trong UART, giao tiếpgiữa hai thiết bị có thể được thực hiện theo hai cách là giao tiếp dữ liệu nối tiếp
và giao tiếp dữ liệu song song
Hình 2.5 Mô hình UART
⮚ Sơ đồ khối UART
h
Trang 16Hình 2.6 Các khối cơ bản trong UART
● Sơ đồ khối UART bao gồm hai thành phần là máy phát và máy thu đượchiển thị bên dưới Phần máy phát bao gồm ba khối là thanh ghi giữ truyền,thanh ghi dịch chuyển và logic điều khiển Tương tự, phần máy thu bao gồmmột thanh ghi giữ, thanh ghi thay đổi và logic điều khiển Hai phần nàythường được cung cấp bởi một bộ tạo tốc độ baud Trình tạo này được sửdụng để tạo tốc độ khi phần máy phát và phần máy thu phải truyền hoặcnhận dữ liệu
● Thanh ghi giữ trong máy phát bao gồm byte dữ liệu được truyền Các thanhghi thay đổi trong máy phát và máy thu di chuyển các bit sang phải hoặc tráicho đến khi một byte dữ liệu được truyền hoặc nhận Một logic điều khiểnđọc (hoặc) ghi được sử dụng để biết khi nào nên đọc hoặc viết
● Máy phát tốc độ baud giữa máy phát và máy thu tạo ra tốc độ dao động từ
110 bps đến 230400 bps Thông thường, tốc độ truyền của vi điều khiển là
9600 đến 115200
h
Trang 172.2.2 Giao thức truyên dữ liệu
Hình 2.7 Khung truyền dữ liệu trong UART
⮚ Start-bit: Start-bit còn được gọi là bit đồng bộ hóa được đặt trước dữ liệu thực
tế Nói chung, một đường truyền dữ liệu không hoạt động được điều khiển ởmức điện áp cao Để bắt đầu truyền dữ liệu, truyền UART kéo đường dữ liệu từmức điện áp cao (1) xuống mức điện áp thấp (0) UART thu được thông báo sựchuyển đổi này từ mức cao sang mức thấp qua đường dữ liệu cũng như bắt đầuhiểu dữ liệu thực Nói chung, chỉ có một start-bit
⮚ Bit dừng: Bit dừng được đặt ở phần cuối của gói dữ liệu Thông thường, bit nàydài 2 bit nhưng thường chỉ sử dụng 1 bit Để dừng sóng, UART giữ đường dữliệu ở mức điện áp cao
⮚ Bit chẵn lẻ: Bit chẵn lẻ cho phép người nhận đảm bảo liệu dữ liệu được thu thập
có đúng hay không Đây là một hệ thống kiểm tra lỗi cấp thấp & bit chẵn lẻ cósẵn trong hai phạm vi như Chẵn lẻ – chẵn lẻ cũng như Chẵn lẻ – lẻ Trên thực
tế, bit này không được sử dụng rộng rãi nên không bắt buộc
⮚ Dữ liệu bit hoặc khung dữ liệu: Các bit dữ liệu bao gồm dữ liệu thực đượctruyền từ người gửi đến người nhận Độ dài khung dữ liệu có thể nằm trongkhoảng 5 & 8 Nếu bit chẵn lẻ không được sử dụng thì chiều dài khung dữ liệu
có thể dài 9 bit Nói chung, LSB của dữ liệu được truyền trước tiên sau đó nórất hữu ích cho việc truyền
h
Trang 182.3 Hệ điều hành thời gian thực FreeRTOS
2.3.1 RTOS là gì ?
⮚ RTOS là viết tắt của cụm từ Real-time operating system hay hệ điều hành thờigian thực thường được nhúng trong các dòng vi điều khiển dùng để điều khiểnthiết bị một cách nhanh chóng và đa nhiệm (multi tasking) Để hiểu rõ ràng nó
là gì trước hết hãy làm rõ khái niệm về hệ điều hành đã
● Hệ điều hành thông thường (non-realtime): như Window, linux, android,ios… chính là thứ mà chúng ta sử dụng hằng ngày
● Hệ điều hành thời gian thực (realtime): sinh ra cho các tác vụ cần sự phảnhồi nhanh của hệ thống, thường được nhúng trong các loại vi điều khiển vàkhông có giao diện (GUI) tương tác với người dùng Chúng cần phản hồinhanh bởi vì đa số các tác vụ tương tác với thiết bị, máy móc khác chứkhông phải con người Các tài nguyên bên trong rất hữu hạn nên chỉ một sựchậm trễ cũng có thể làm hệ thống làm việc hoàn toàn sai lệch
2.3.2 Khi nào cần sử dụng RTOS ?
Trang 19● Ứng dụng liên quan tới các tác vụ xử lý nhanh, xử lý ảnh, âm thanh.
● Nếu ứng dụng của bạn mà kích thước chương trình lớn dần và độ phức tạptăng lên thì RTOS sẽ rất hữu dụng trong trường hợp này, lúc đó RTOS sẽchia các ứng dụng phức tạp thành các phần nhỏ hơn và dễ quản lý hơn
● RTOS được sử dụng rất nhiều khi lập trình ESP32, ESP8266, STM32 và cácdòng chip khác
2.3.3 Tại sao lại phải dụng RTOS ?
⮚ Chia sẻ tài nguyên một cách đơn giản: cung cấp cơ chế để phân chia các yêucầu về bộ nhớ và ngoại vi của MCU
⮚ Dễ debug và phát triển: Mọi người trong nhóm có thể làm việc một cách độclập
⮚ Tăng tính linh động và dễ dàng bảo trì: thông qua API của RTOS,…
2.3.4 Cách hoạt động của RTOS
⮚ RTOS là một phân đoạn hoặc một phần của chương trình, trong đó nó giảiquyết việc điều phối các task, lập lịch và phân mức ưu tiên cho task, nắm bắtcác thông điệp gửi đi từ task
⮚ RTOS khá phức tạp, nói một cách dễ hiểu hơn là nó thực hiện việc xử lý cáctrạng thái máy (State Machine)
⮚ Để giải quyết một bài toán nhiều trạng thái máy, thông thường chúng ta sử dụngcode sau:
h
Trang 20Hình 2.8 Cấu trúc switch case tuần tự2.3.5 Các khái niệm trong hệ điều hành thời gian thực RTOS
2.3.5.1 Kernel – Nhân
⮚ Kernel hay còn gọi là Nhân có nhiệm vụ quản lý và điều phối các Task
⮚ Mọi sự kiện (Even) như ngắt, Timer, data truyền tới… đều qua Kernel xử lý đểquyết định xem nên làm gì tiếp theo
⮚ Thời gian xử lý của Kernel thường rất nhanh nên độ trễ rất thấp
2.3.5.2 Task -Tác vụ
⮚ Bạn cứ tưởng tượng một chương trình là một công ty, với ông to nhất là Giámđốc – Kernel Ông này chỉ điều hành và chả biết nghiệp vụ gì cả, để thực hiệncác nghiệp vụ khác nhau, công ty đó cần các nhân viên Và các nhân viên đógọi là các Task
⮚ Nói đơn giản, Task là một đoạn chương trình thực thi một hoặc nhiều vấn đề gì
đó, được Kernel quản lý
⮚ Kernel sẽ quản lý việc chuyển đổi giữa các task, nó sẽ lưu lại ngữ cảnh của tasksắp bị hủy và khôi phục lại ngữ cảnh của task tiếp theo bằng cách:
⮚ Kiểm tra thời gian thực thi đã được định nghĩa trước (time slice được tạo ra bởingắt systick)
h
Trang 21⮚ Khi có các sự kiện unblocking một task có quyền cao hơn xảy ra (signal, queue,semaphore,…)
⮚ Khi task gọi hàm Yield() để ép Kernel chuyển sang các task khác mà khôngphải chờ cho hết time slice
⮚ Khi khởi động thì kernel sẽ tạo ra một task mặc định gọi là Idle Task
2.3.5.3 Task States – Trạng thái Task
Trang 22● Cooperative: giống với lập trình thông thường, mỗi task chỉ có thể thực thikhi task đang chạy dừng lại, nhược điểm của nó là task này có thể dùng hếttất cả tài nguyên của CPU
● Round-robin: mỗi task được thực hiện trong thời gian định trước (time slice)
và không có ưu tiên
● Priority base: Task được phân quyền cao nhất sẽ được thực hiện trước, nếucác task có cùng quyền như nhau thì sẽ giống với round-robin, các task cómức ưu tiên thấp hơn sẽ được thực hiện cho đến cuối time slice
⮚ Khối input chia làm hai khối chính:
● Khối thứ nhất: Nhận dữ liệu qua tay cầm PS2 thông qua mạch chuyển đổi tín hiệu PS2 được kết nối với arduino uno
h
Trang 23● Khối thứ hai: Nhận dữ liệu từ app trên điện thoại được kết nối qua module bluetooth HC06 gửi cho arudino UNO theo chuẩn giao tiếp UART
⮚ Khối output: Từ dữ liệu nhận được thì vi điều khiển sẽ tiến hành hiển thị dữ liệuqua màn hình LCD cũng như điều khiển động cơ di chuyển theo ý muốn
3.2 Giao tiếp HC06 với arudino
Hình 3.2 Sơ đồ kết nối HC06 với arduino uno
⮚ Thực hiện đấu bắt chéo, chân TX của arduino đấu với chân RX của HC06 và ngược lại chân TX của HC06 đấu với chân RX của arduino
⮚ Cài đặt app trên điện thoại để gửi dữ liệu xuống HC06:
Hình 3.3 Hình ảnh giao diện app
h
Trang 253.3 Giao tiếp tay cầm PS2 với arudino
Hình 3.5 Sơ đồ mạch tín hiệu tay cầm PS2
● Pin 1 (data) => Arduino digital pin 12
● Pin 2 (command) => Arduino digital pin 11
● Pin 4 (ground) => Arduino Gnd pin
● Pin 5 (power) => Arduino 3.3V pin
● Pin 6 (attention) => Arduino digital pin 10
● Pin 7 (clock) => Arduino digital pin 13
h
Trang 26Hình 3.4 Các nút bấm trên tay cầm PS2
⮚ Các nút chỉ hướng:
● PSB_PAD_UP = D-pad up button;
● PSB_PAD_DOWN = D-pad down button;
● PSB_PAD_LEFT = D-pad left button
● PSB_PAD_RIGHT = D-pad right button
⮚ Các nút hành động:
● PSB_GREEN or PSB_TRIANGLE = green triangle button
● PSB_RED or PSB_CIRCLE = red circle button
● PSB_BLUE or PSB_CROSS = blue x button
● PSB_PINK or PSB_SQUARE = pink square button
⮚ Các nút kích hoạt (triggers):
h
Trang 27● PSB_L1 = left side trigger button 1
● PSB_R1 = right side trigger button 1
● PSB_L2 = left side trigger button 2
● PSB_R2 = right side trigger button 2
● PSB_L3 = left stick push button (yes, you can press the stick as a pusshbutton)
● PSB_R3 = right stick push button
⮚ Menu:
● PSB_SELECT = select button
● PSB_START = start button