Cổng kết nối: USB Type-B.Bo mạch Arduino Uno R3 có nhiều chân I/O kỹ thuật số và analog, cổng USB để kết nối với máy tính, cổng ngoại vi ví dụ như cổng nguồn, cổng nối tiếp, nút nhấn để
Trang 1Đại học Bách Khoa Hà NộiTrường Cơ Khí - -
Đề tài : Hệ thống thanh chắn tàu tự động điều khiển qua
AVR
Tên sinh viên : Đặng Đức Anh 20207753
Nguyễn Huy Hoàng 20207763 Nguyễn Minh Hoàng 20207764
Đỗ Minh Quân 20207779 Tên môn học : Vi xử lý
Giảng viên hướng dẫn : TS.Đặng Thái Việt
Trang 2Mục lục
Lời mở đầu………3
Chương I: Tổng quan đề tài……… 4
1 Yêu cầu……….4
1.1 Hoạt động của sản phẩm………4
1.2 Các linh kiện sử dụng……….4
2 Ứng dụng……… 4
Chương II: Tổng quan vi điều khiển Atmega328P và các linh kiện sử dụng… 5
1 Vi điều khiển Atmega328P……….5
2 Các linh kiện sử dụng……….7
Chương III: Thiết kế mạch và quá trình thực hiện……… 10
1 Sơ đồ khối của mạch điều khiển……… 10
2 Sơ đồ nguyên lý……….11
3 Nguyên lý hoạt động……….11
4 Code chạy chương trình………12
Chương IV: Các chức năng chính của AVR……… …13
1 Điều khiển đèn led và cảm biến hc sr04……….13
2 Điều khiển động cơ servo ……….13
2.1 Điều khiển động cơ servo thông qua tín hiệu PWM 2.2 Cổng kết nối 2.3 Thanh ghi 2.4Các thanh ghi điều khiển TCCR1A và TCCR1B 3 Giao tiếp I2C với AVR……….17
4.1 Giao tiếp I2C 4.2 Thanh ghi Chương V: Tổng kết………21
Trang 3Để tìm hiểu, học tập về vi xử lý, đưa các tính năng của vi xử lý vào cuộc sống, nhóm em quyết định tìm hiểu về vi điều khiển AVR, một dòng vi điều khiển rất phổ biến và được sử dụng rộng rãi trong các ứng dụng nhúng, điện tử tiêu thụ ít năng lượng.Đặc biệt là vi điều khiển ATMEGA328P
Dưới sự hướng dẫn nhiệt tình của Thầy Giáo TS.Đặng Thái Việt
nhóm em tham gia tìm hiểu đề tài: “Rào chắn tàu điều khiển qua AVR”.
Rào chắn tàu là thiết bị báo hiệu được đặt tại các nút giao thông đường bộ với đường sắt Rào chắn tàu bao gồm 1 barrie thanh chắn , 1 đèn led và 1 LCD truyền tải thông tin đi hoặc dừng Đến với đề tài này nhóm em hướng đến hiểu được cách thức hoạt động của vi xử lý Atmega328P, xây dựng một mạch điện đầu tiên trong nghành cơ điện tử của mình.
Trang 4Chương I : Tổng quan đề tài
- Sử dụng để quản lý luồng giao thông, đặc biệt là ở những nơi
có sự giao nhau giữa đường sắt và các tuyến đường khác, giúp đảm bảo an toàn cho người và phương tiện giao thông Khi tàu đang tiến vào hoặc rời khỏi khu vực đường sắt
Trang 5CHƯƠNG II: TỔNG QUAN VI ĐIỀU KHIỂN ATMEGA328P VÀ CÁC LINH KIỆN XỬ DỤNG
1. Vi điều khiển Atmega328P
Vi điều khiển ATmega328P là một trong những vi điều khiển phổ biến được sử dụng trong nhiều ứng dụng nhúng và dự án điện tử Được sản xuất bởi Atmel (nay là một phần của Microchip
Technology), ATmega328P thuộc dòng vi điều khiển AVR, nổi tiếngvới kiến trúc RISC và tính năng hiệu suất cao
Vi điều khiển Atmega328P hiệu suất cao, công suất thấp, sử dụngkiến trúc RISC với tập lệnh đơn giản và dễ hiểu Bộ nhớ lưu trữFlash 32 KB ; 2KB bộ nhớ SRAM ; 1KB bộ nhớ EEPROM Tần sốhoạt động lên đến 20 MHz (phụ thuộc vào điều kiện làm việc vànguồn điện) Giao diện USART, SPI, I2C cho việc giao tiếp với cácthiết bị ngoại vi và giao tiếp nội bộ ATmega328P có nhiều chânGPIO cho việc kết nối và điều khiển các linh kiện và cảm biến ngoại
vi Hoạt động ở điện áp từ 1.8V đến 5.5V, làm cho việc tích hợp và
sử dụng dễ dàng
Sơ đồ chân của Atmega328P
Trang 6
Hình ảnh thực tế của atmega328P Sơ đồ chân atmega328PChức năng các chân của atmega328P
- VCC ( chân 7 ) :Nguồn cấp cho vi điều khiển (điện áp hoạt động thông thường là 5V)
- GND (Pin 8 và Pin 22): Mối nối đất
- Port B (Pin 14-19): Cổng I/O số 8-bit, có thể được sử dụng cho nhiều mục đích như đầu ra số, đầu vào số, hoặc làm các chân của các giao tiếp ngoại vi như SPI (Serial Peripheral Interface)
- Port C (Pin 23-28): Cổng I/O số 7-bit, thường được sử dụng cho đầu vào analog (ADC), cũng có thể được sử dụng cho các chức năng khác
- Port D (Pin 2-5, 11-13): Cổng I/O số 8-bit, giống như Port B, thường được sử dụng cho nhiều mục đích
- RESET (Pin 1): Chân này được sử dụng để làm lại vi điều khiển
- XTAL1 và XTAL2 (Pin 9 và Pin 10): Đầu vào cho các tín hiệu dao động ngoại vi hoặc từ bên ngoài để tạo ra xung clock cho vi điều khiển
- AVCC (Pin 20): Điện áp cho mô-đun chuyển đổi analog-to-digital(ADC) Thường được kết nối với nguồn cấp ngoại vi
- AREF (Pin 21): Điện áp tham chiếu cho các chuyển đổi ADC
- AIN0 - AIN5 (Pin 23-28): Các chân đầu vào analog cho chuyển đổi ADC
- SCK (Pin 13), MISO (Pin 12), MOSI (Pin 11), SS (Pin 10): Chân kết nối cho giao tiếp SPI
- OC0A, OC0B (Pin 12 và Pin 15): Chân đầu ra PWM cho Timer/Counter 0
- OC1A, OC1B (Pin 15 và Pin 16): Chân đầu ra PWM cho Timer/Counter 1
- OC2A, OC2B (Pin 17 và Pin 14): Chân đầu ra PWM cho Timer/Counter 2
Sơ đồ kết nối chân của Atmega328P với Arduino
Trang 73 Dòng tối đa từ cổng USB: 500mA.
4 Dòng tối đa từ cổng ngoại vi (External Power): 900mA.
5 Bộ nhớ Flash: 32 KB (trong đó 0.5 KB được sử dụng cho
bootloader)
6 SRAM: 2 KB.
7 EEPROM: 1 KB.
8 Tần số dao động: 16 MHz.
9 Cổng kết nối: USB Type-B.
Bo mạch Arduino Uno R3 có nhiều chân I/O kỹ thuật số và analog, cổng USB để kết nối với máy tính, cổng ngoại vi (ví dụ như cổng nguồn, cổng nối tiếp), nút nhấn để chương trình, và nhiều tính năng khác giúp người sử dụng thử nghiệm và phát triển các ứng dụng điện tử
Arduino Uno R3 thường được sử dụng trong nhiều dự án khác nhau như làm mô hình, điều khiển cảm biến, làm các thiết bị IoT, và nhiều ứng dụng khác trong lĩnh vực điện tử và lập trình nhúng
Trang 8b Cảm biến đo khoảng cách HCSR04
Cảm biến đo khoảng cách HCSR04 là một thiết bị chuyên dụng được
sử dụng để đo khoảng cách từ cảm biến đến một vật thể hoặc bề mặt Tên đầy đủ của HCSR04 là "Ultrasonic Sensor HC-SR04"
Một số đặc điểm chính của cảm biến HCSR04 :
+ Cảm biến sử dụng sóng siêu âm để đo khoảng cách Nó phát sóng một tín hiệu sóng siêu âm và đo thời gian nó mất để sóng âm phản xạ
từ vật thể trở lại
+ Cảm biến thường có hai bộ phận chính: một bộ phát sóng sóng siêu
âm và một bộ thu sóng siêu âm Cả hai bộ phận này thường được đặt
ở hai đầu của mô-đun cảm biến
+ Khoảng đo: Thường khoảng từ vài centimet đến vài mét, phụ thuộcvào mô hình cụ thể
+ Thường có bốn chân: VCC (nguồn), Trig (tín hiệu kích thích), Echo (tín hiệu nhận), và GND (đất)
+ Sử dụng tín hiệu Trig để kích thích sóng siêu âm và sử dụng tín hiệu Echo để đo thời gian phản xạ
Trang 9
c LCD 16x2
LCD (Liquid Crystal Display), tiếng Việt thường được dịch là "Màn
hình LCD" hoặc "Màn hình tinh thể lỏng." Đây là một loại màn hình
hiển thị được sử dụng rộng rãi trong các thiết bị điện tử như điện
thoại di động, máy tính xách tay, máy tính đồng bộ, máy tính bảng,
đồng hồ thông minh, máy tính điều khiển, và nhiều ứng dụng khác
Các loại màn hình LCD có thể khác nhau về kích thước, độ phân
giải, màu sắc, và cách kết nối Trong các dự án điện tử, màn hình
LCD thường được sử dụng để hiển thị thông tin và kết quả từ các vi
điều khiển, vi xử lý, hoặc các thiết bị khác
d Động cơ servo
Động cơ servo là một loại động cơ được sử dụng rộng rãi trong các
ứng dụng điều khiển vị trí, thường được sử dụng trong các dự án điện
tử và robot Việc sử dụng động cơ servo rất phổ biến vì chúng cung
cấp khả năng kiểm soát vị trí chính xác và dễ dàng tích hợp với vi xử
lý Arduino
Một số đặc điểm chính của động cơ servo
Trang 10+Kiểm soát PWM: Động cơ servo nhận tín hiệu PWM từ Arduino đểxác định vị trí cần giữ Chu kỳ PWM được sử dụng để đặt vị trí của cần điều khiển.
+Góc xoay giới hạn: Đa số động cơ servo được thiết kế để xoay trong một khoảng góc nhất định, thường là từ 0 đến 180 độ Một số
mô hình có thể xoay 360 độ hoặc có góc xoay lớn hơn
+Độ chính xác cao: Động cơ servo cung cấp khả năng kiểm soát vị trí với độ chính xác cao, làm cho chúng thích hợp cho các ứng dụng yêu cầu điều khiển chính xác vị trí
Trang 11Chương III Thiết kế mạch và quá trình thực hiện
1 Sơ đồ khối của mạch điều khiển
Mạch điều khiển gôm 5 khối chính : Khối nguồn ; Khối xử lý trung tâm VXL Atmega328P ; Servo ; Bảng led ; Cảm biến
Trang 12- Chân 9 Arduino nối với động cơ servo
- Các chân 4,5,6,9,10,11,12 của PCF8574 lần lượt nối với các chân
độ và màn hình LCD sẽ hiển thị trạng thái “Stop” và đèn led đỏ bật sáng Sau đó 15s servo motor sẽ di chuyển cổng chắn về góc 0
độ và màn hình LCD sẽ hiển thị trạng thái “Go” và đèn led đỏ tắt
4 Code chạy chương trình
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
Servo myservo; // Tạo một đối tượng servo để điều khiển servo motor
Trang 13LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ I2C của màn hình LCD
và kích thước của màn hình
const int ledPin = 13; // Chân kết nối đèn LED
const int echoPin = 7; // Chân kết nối cảm biến siêu âm HCSR04 (echo)
const int trigPin = 8; // Chân kết nối cảm biến siêu âm HCSR04 (trig)int state = 0; // Biến trạng thái: 0 - Đóng, 1 - Mở
// Đọc khoảng cách từ cảm biến siêu âm
long duration, distance;
digitalWrite(ledPin, HIGH); // Bật đèn LED màu đỏ
delay(15000); // Đợi 15 giây
Trang 14state = 0; // Chuyển sang trạng thái mở
Chương IV Các chức năng chính của vi điều khiển Atmega328P
1 Điều khiển led và cảm biến siêu âm HCSR04
- Led được cắm vào chân 13 và chỉ nhận tín hiệu “ON” “OFF” từ viđiều khiển
- Cảm biến siêu âm HCSR04 kết nối chân số 7 và 8
+ Sử dụng công thức để tính toán distance=int(duration/2/29.412);+ Sử dụng hàm digitalwrite để xuất tín hiệu
+ Sử dụng hàm pulesIn để đọc tín hiệu
2 Điều khiển động cơ servo
2.1 Điều khiển động cơ servo thông qua tín hiệu PWM
- PWM (Pulse Width Modulation) là một kỹ thuật rất phổ biến trong lĩnh vực điện tử và lập trình nhúng Trên vi điều khiển ATmega328P, PWM thường được sử dụng để điều khiển độ sáng của đèn LED, tốc
độ của động cơ DC, và nhiều ứng dụng khác
- PWM (Điều chế độ rộng xung) có thể tạo ra một sóng vuông từ các chân nhất định của vi điều khiển và có thể điều chỉnh thời gian mà tín hiệu sẽ ở trạng thái on (Duty cycle)
Trang 15- Điều chỉnh độ rộng xung PWM (Pulse Width Modulation) là điều chế độ rộng của xung (sự chênh lệch thời gian giữa xung "ON" và
"OFF") mà không làm thay đổi tần số của tín hiệu điện
Các pha của servo SG90
- Các pha của servo thường được biểu diễn qua độ rộng của xung PWM Dưới đây là cách thể hiện các pha của servo SG90 :
+ Trung tâm (Pha 0): Khi xung PWM có độ rộng xấp xỉ 1.5 ms trong chu kỳ 20 ms, servo sẽ ở trung tâm vị trí của mình Điều nàytương đương với góc xoay 90 độ (phụ thuộc vào biên độ của servo)
+ Pha 1 (quay về góc nhỏ hơn): Khi độ rộng xung giảm xuống dưới 1.5 ms, servo sẽ di chuyển về phía một trong các hướng, tùy thuộc vào hướng xoay cụ thể của servo Độ rộng xung nhỏ hơn 1.5 ms sẽ dẫn đến một góc xoay nhỏ hơn 90 độ
+ Pha 2 (quay về góc lớn hơn): Ngược lại, khi độ rộng xung tăng lên trên 1.5 ms, servo sẽ di chuyển về phía còn lại, tăng góc xoay của nó Độ rộng xung lớn hơn 1.5 ms sẽ dẫn đến một góc xoay lớn hơn 90 độ
2.2 Cổng kết nối
- Timer của Arduino có trên 5 chân digital pin 5,6,9,10,11 Qúa trình
sử dụng băm xung PWM để thay đổi góc quay của động cơ servo SG90 của bài sẽ sử dụng chế độ Fast PWM của Timer 1 vì vậy chân PB! và PB2 trên vi điều khiển Atmega328p tương ứng với 2 chân digital pin 9,10 của Arduino sẽ được sử dụng
2.3 Thanh ghi
- Timer 1 gộp 2 thanh ghi 8 bit để thành byte cao và byte thấp của 1 thanh ghi 16 bit
Trang 16+ 2 thanh ghi đếm TCNT1H và TCNT1L tạo thành thanh ghi đếm 16bit
+ 2 thanh ghi Output compare register 16 bit OCR1A và OCR1B được gộp từ 2 thanh ghi 8 bit, từ đó có 2 đầu ra là 2 cờ )OCF1A và OCF1B
- Quá trình: Khi thanh ghi đếm đạt đến giá trị của thanh ghi OCR thì
cờ OCF sẽ dựng lên
- Khởi tạo thanh ghi
2.4 Các thanh ghi điều khiển TCCR1A và TCCR1B
a Các thanh ghi control regiter
- 3 thanh ghi Clock Selector CS10, CS11, CS12 để chọn hệ số Prescaling cho Timer
Trang 17- 4 thanh ghi từ WGM10 đến WGM13 : 4 bit WGM giúp có 16 chế độPWM để lựa chọn Cơ cấu sử dụng mode 14 của PWM nên các thanhghi WGM11, WGM12 và WGM13 sẽ set lên 1, WGM10 set về 0 Khi đó giá trị top sẽ là ICR1
- 4 bit xác định chế độ xuất ra của OC1A và OC1B : Mỗi cổng A và cổng B có 2 bit là COM1A1 và COM1A0 để chọn chế độ xung cho cổng đầu ra OC1A và OC1B
b Quá trình PWM
- Thanh ghi đếm TCNT1 sẽ chạy, tăng dần từ giá trị được đặt ban đầu
- Khi TCNT1 bằng với OCR1A, OC1A sẽ clear từ 1 về 0
- Khi TCNT1 tiếp tục tăng đến khi đạt được giá trị Top là ICR1 (Mode 14) OC1A sẽ được set về 1 Từ đó ta tạo được xung PWM
c Quá trình hoạt động của động cơ servo SG90
Trang 18- Xung PWM khi vào servo sẽ được biến đổi thành tín hiệu điện
- Tại Servo sẽ được trang bị 1 bộ chiết áp Chiết áp làm nhiệm vụ đo
vị trí góc của servo hiện tại và gửi tín hiệu điện về lại cho servo
- Comparator trong Servo khi thấy có sự chênh lệch về điện áp sẽ quay động cơ servo để không còn xảy ra chênh lệch, từ đó tạo ra sự thay đổi về góc cho Servo
3 Giao tiếp của I2C với AVR
3.1 Giao tiếp của I2C
- Giao tiếp I2C (Inter-Integrated Circuit) giữa LCD1602 và
ATmega328P thường sử dụng hai chân là SDA (Data Line) và SCL (Clock Line) Dưới đây là mô tả cách dữ liệu được truyền qua các bit của SDA và SCL trong quá trình giao tiếp I2C
Bit Ra (Output) từ ATmega328P đến LCD1602:
1 Trạng thái ban đầu:
• Chân SDA và SCL đều ở trạng thái cao (1)
• ATmega328P xác định trạng thái cần truyền (Start Condition)
3 Địa chỉ Slave và Bit R/W:
• ATmega328P gửi 7 bit địa chỉ của Slave(LCD1602) theo sau bởi bit R/W(Read/Write) Bit R/W xác định là ghi (0) hoặc đọc (1)
4 Xác nhận Slave đang hoạt động:
• LCD1602 xác nhận rằng nó đang hoạt động bằng cách trả lại một bit ACK (Acknowledgment) Nếu không có slave phản hồi, có thể xảy ra lỗi
5 Truyền Dữ liệu 8 bit:
• ATmega328P truyền 8 bit dữ liệu theo sau bởi bit ACK sau mỗi byte
Trang 191 Trạng thái ban đầu:
• Chân SDA và SCL đều ở trạng thái cao (1)
2 Start Condition:
• ATmega328P đặt chân SDA ở trạng thái thấp trong khi giảm chân SCL từ cao xuống thấp (Start Condition)
3 Địa chỉ Slave và Bit R/W:
• ATmega328P gửi 7 bit địa chỉ của Slave (LCD1602) theo sau bởi bit R/W (Read/Write)
4 Xác nhận Slave đang hoạt động:
• LCD1602 xác nhận rằng nó đang hoạt động bằng cách trả lại một bit ACK (Acknowledgment)
Chế độ Write
Trang 20Chế độ Read3.2 Thanh ghi
a Kết nối ứng dụng với TWI trong một đường truyền điển hình
Hành động của ứng dụng
- 1 : Ứng dụng ghi vào TWCR để khởi xướng truyền bắt đầu
- 3 : Kiểm tra TWSR để xem START đã được gửi chưa Ứng dụng tải SLA+W vào TWDR và tải các tín hiệu điều khiển thích hợp vào TWCR, đảm bảo rằng TWINT được ghi vào 1 và TWSTA được ghi về 0
- 5 : Kiểm tra TwitterR để xem SLA+W đã được gửi và đã nhận được ACK chưa Ứng dụng tải dữ liệu vào TWDR và tải cá tín hiệu điều khiển thích hợp vào TWCR, đảm bảo rằng TWINT được ghi vào 1
- 7 : Kiểm traTWSR để xem dữ liệu đã được gửi và nhận được ACK chưa Ứng dụng tải các tín hiệu điều khiển thích hợp để gửi STOP vào TWCR, đảm bảo rằng TWINT được ghi vào một Hành động của phần cứng TWI
- 2 : Bộ TWINT Mã trạng thái cho biết điều kiện BẮT ĐẦU đã
Trang 21- 4 : Bộ TWINT Mã trạng thái cho biết SLA+W đã gửi, ACK đã nhận
- 6 : Bộ TWINT Mã trạng thái cho biết dữ liệu đã gửi, ACK đã nhận
Trang 220 0 0 0 1 0 0 0
Chương V: Tổng kết
- Trong thời gian đầu tìm hiểu vi điều khiển nhóm em đã cố gắng tìm hiểu các tài liệu , các bài báo khoa học để hiểu rõ hơn về cấu tạo , chức năng và cách thức hoạt động của vi điều khiển ( ở bài tập lớn lần này là vi điều khiển Atmega328P) đồng thời hiểu hơn
về tác dụng của VXL với các thành phần linh kiện khi nhóm em thực hiện bước đầu của bài tập lớn này
- Sau khi trang bị đầy đủ thông tin thì nhóm em sẽ hướng tới việc hoàn thiện sản phẩm 1 cách hoàn hảo nhất Bên cạnh đó vì là lần đầu tiên tìm hiểu về vi điều khiển nên thông tin còn nhiều sai sót, nhóm em mong thầy góp ý và chỉ dạy thêm
THE END _