Tải bản đầy đủ (.docx) (16 trang)

Bài tiểu luận môn thực hành cơ sở (1)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 16 trang )

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG

BÀI TẬP LỚN
MƠN HỌC: THỰC HÀNH CƠ SỞ
NHĨM MƠN HỌC:01
Đề tài: Đếm số người vào – ra hiển thị lên LCD 128x64
Giảng viên: Nguyễn Đức Việt
Sinh viên:

Mã số sinh viên:

Nguyễn Đình Tới

B19DCDT199

Trần Huỳnh Anh Đức

B19DCDT063

Mai Văn Khoái

B19DCDT123

Nguyễn Thành Liêm

B19DCDT128

Đỗ Văn Đồng

B19DCDT055


Hà Nội 2022
1


PHẦN I. CÁC LINH KIỆN ĐƯỢC SỬ DỤNG
STT
1
2
3
4
5

Tên linh kiện
Adruino UNO R3
Cảm biến hồng ngoại E18-D80NK
LCD128x64
Dây cắm
Board test

*Ngồi ra cịn chuẩn bị thêm:
- Kìm
- Keo dán
-…

2


Phần II.
Tìm hiểu về các linh kiện được sử dụng
1. Giới thiệu về Arduino uno:

Arduino Uno là một bảng mạch vi điều khiển nguồn mở dựa trên vi điều khiển
Microchip ATmega328 được phát triển bởi Arduino.cc. Bảng mạch được trang bị các bộ
chân đầu vào/ đầu ra Digital và Analog có thể giao tiếp với các bảng mạch mở rộng khác
nhau. Mạch Arduino Uno thích hợp cho những bạn mới tiếp cận và đam mê về điện tử,
lập trình…Dựa trên nền tảng mở do Arduino.cc cung cấp các bạn dễ dàng xây dựng cho
mình một dự án nhanh nhất ( lập trình Robot, xe tự hành, điều khiển bật tắt led…).

3


1.1 Thơng số kĩ thuật:

1.2 Power
+LED: Có 1 LED được tích hợp trên bảng mạch và được nối vào chân D13. Khi
chân có giá trị mức cao (HIGH) thì LED sẽ sáng và LED tắt khi ở mức thấp (LOW).
+VIN: Chân này dùng để cấp nguồn ngoài (điện áp cấp từ 7-12VDC).
+5V: Điện áp ra 5V (dòng điện trên mỗi chân này tối đa là 500mA).
Chip điều khiển

ATmega328P

Điện áp hoạt động

5V

Điện áp đầu vào(khuyên
dùng)

7-12V


Điện áp đầu vào (giới hạn)

6-20V

Số chân Digital

14 (of which 6 provide PWM output)

Số chân PWM Digital

6

Số chân Analog

6

Dòng điện DC trên mỗi chân
I/O

20 mA

Dòng điện DC trên chân
3.3V

50 mA

Flash Memory

32 KB (ATmega328P) of which 0.5 KB used by
bootloader


SRAM

2 KB (ATmega328P)

EEPROM

1 KB (ATmega328P)

Tốc độ thạch anh

16 MHz

LED_BUILTIN

13

Chiều dài

68.6 mm

Chiều rộng

53.4 mm

Cân nặng

25 g

4



+3V3: Điện áp ra 3.3V (dòng điện trên mỗi chân này tối đa là 50mA)
+GND: Là chân mang điện cực âm trên board.
+IOREF: Điệp áp hoạt động của vi điều khiển trên Arduino UNO và có thể đọc
điện áp trên chân IOREF. Chân IOREF không dùng để làm chân cấp nguồn.

1.3 Bộ nhớ
-Vi điều khiển ATmega328:
+32 KB bộ nhớ Plash: trong đó bootloader chiếm 0.5KB.
+2 KB cho SRAM: (Static Random Access Menory): giá trị các biến khai
báo sẽ được lưu ở đây. Khai báo càng nhiều biến thì càng tốn nhiều bộ nhớ RAM. Khi
mất nguồn dữ liệu trên SRAM sẽ bị mất.
+1 KB cho EEPROM: (Electrically Eraseble Programmable Read Only
Memory): Là nơi có thể đọc và ghi dữ liệu vào đây và không bị mất dữ liệu khi mất
nguồn.
1.4 Các chân đầu ra
Trên Board Arduino Uno có 14 chân Digital được sửdụng để làm chân đầu
vào và đầu ra và chúng sử dụng các hàm pinMode(), digitalWrite(), digitalRead(). Giá
trị điện áp trên mỗi chân là 5V, dòng trên mỗi chân là 20mA và bên trong có điện trở kéo
lên là 20-50 ohm. Dòng tối đa trên mỗi chân I/O không vượt quá 40mA để tránh trường
hợp gây hỏng board mạch.
Ngồi ra, một số chân Digital có chức năng đặt biệt:
Serial: 0 (RX) và 1 (TX): Được sử dụng để nhận dữ liệu (RX) và truyền dữ
liệu (TX) TTL.
Ngắt ngoài: Chân 2 và 3.
5


PWM: 3, 5, 6, 9 và 11 Cung cấp đầu ra xung PWM với độ phân giải 8 bit bằng

hàm analogWrite ().
SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Các chân này hỗ trợ giao tiếp
SPI bằng thư viện SPI.
LED: Có 1 LED được tích hợp trên bảng mạch và được nối vào chân D13. Khi
chân có giá trị mức cao (HIGH) thì LED sẽ sáng và LED tắt khi ở mức thấp (LOW).
TWI/I2C: A4 (SDA) và A5 (SCL) hỗ trợ giao tiếp I2C/TWI với các thiết bị
khác.

Ứng dụng Arduino uno:
+Arduino có nhiều ứng dụng trong đời sống, trong việc chế tạo các thiết bị điện
tử chất lượng cao. Một số ứng dụng có thể kể đến như:
+Lập trình robot: Arduino chính là một phần quan trọng trong trung tâm xử lí
giúp điều khiển được hoạt động của robot
+Lập trình máy bay khơng người lái. Có thể nói đây là ứng dụng có nhiều kì vọng
trong tương lai.
+Game tương tác: chúng ta có thể dùng Arduino để tương tác với Joystick, màn
hình,… để chơi các trị như Tetrix, phá gạch, Mario… và nhiều game rất sáng tạo nữa
6


+Arduino điều khiển thiết bị ánh sáng cảm biến tốt. Là một trong những bộ phần
quan trọng trong cây đèn giao thông, các hiệu ứng đèn nháy được cài đặt làm nổi bật các
biển quảng cáo.
+Arduino cũng được ứng dụng trong máy in 3D và nhiều ứng dụng khác tùy
thuộc vào khả năng sáng tạo của người sử dụng.

2. Giới thiệu về LCD 128x64
LCD Graphic (gọi tắt là GLCD) loại chấm khơng màu là các loại màn hình tinh thể
lỏng nhỏ dùng để hiển thị tí tự (chữ, số) hoặc hình ảnh. Nhưng khác với Text LCD,
GLCD khơng được chia thành các ơ để hiển thị các mã ASCII vì nó khơng có bộ nhớ

CGRAM (Character Generation RAM).
GLCD 128x64 gồm 128 cột và 64 hàng tương ứng có 128x64=8192 chấm (dot). Mỗi
chấm tương ứng với 1 bit dữ liệu, và như thế cần 8192 bits hay 1024 bytes RAM để chứa
dữ liệu hiển thị đầy mỗi 128x64 GLCD. Tùy theo loại chip điều khiển mà nguyên lý hoạt
động của GLCD có thể khác nhau.

Chip KS0108 có một loại bộ nhớ duy nhất đó là RAM. Vì vậy, dữ liệu ghi vào RAM
sẽ được hiển thị trực tiếp trên GLCD. Mỗi chip KS0108 có 512 bytes RAM tương đương
với 4096 chấm trên một nửa (64x64) LCD. RAM của KS0108 chỉ cho phép truy cập theo
từng byte, điều đó có nghĩa nghĩa mỗi lần bạn viết một giá trị vào một byte nào đó trên
RAM của GLCD, sẽ có 8 chấm nằm trên cùng một cột bị tác động. Vì lý do này, 64 dòng
GLCD thường được chia thành 8 pages, mỗi page có độ cao 8 bit và rộng 128 cột.
Nếu bạn đang cần tìm một cơng cụ để có thể hiển thị những hình ảnh đồ họa rõ nét nhất
thì LCD Graphic sẽ là sự lựa chọn đúng đắn.
7


3.Dây cảm biến hông ngoại

Cảm biến vật cản hồng ngoại E18-D80NK Adjustable IR Infrared Proximity Sensor
tại là loại chất lượng tốt với độ bền và độ ổn định cao, cảm biến sử dụng ánh sáng hồng
ngoại để xác định vật cản phía trước cảm biến, cảm biến phát ra tia hống ngoại với dải tần
số chuyên biệt cho khả năng chống nhiễu tốt kể cả ở điều khiện ánh sáng ngoài trời.
Cảm biến vật cản hồng ngoại E18-D80NK Adjustable IR Infrared Proximity Sensor
có thể chỉnh khoảng cách mong muốn thơng qua biến trở trên cảm biến, cảm biến có ngõ
ra là cấu trúc Transistor NPN (sinking sensors) đã được nối điện trở nội 10k lên VCC nên
có thể sử dụng ngay mà không cần trở kéo lên VCC.
Thông số ki thuật:
 Model: E18-D80NK
 Dạng đóng ngắt: Thường mở (NO - Normally Open)

 Số dây tín hiệu: 3 dây (2 dây cấp nguồn DC và 1 dây tín hiệu).
 Nguồn điện cung cấp: 5VDC.
 Khoảng cách phát hiện: 3 ~ 80cm.
 Có thể điều chỉnh khoảng cách qua biến trở.
 Dịng kích ngõ ra: 300mA.
 Chân tín hiệu ngõ ra: dạng Transistor NPN đã được kéo nội trở 10k lên VCC,
khi có vật cản sẽ xuất ra mức thấp (Low-GND), khi khơng có vật cản sẽ ở mức
cao (High-VCC).
 Chất liệu sản phẩm: nhựa.
 Có led hiển thị ngõ ra màu đỏ.
 Kích thước: 18 x 45mm
Sơ đồ chân:
1. Màu nâu: VCC, nguồn dương 5VDC.
2. Màu xanh dương: GND, nguồn âm 0VDC
3. Màu đen: Chân tín hiệu cấu trúc Transistor NPN đã kéo trở nội 10k lên VCC.
Hướng dẫn kết nối:
Vì cảm biến đã được kéo trở nội 10k lên VCC nên điện áp mức cao của chân tín
hiệu (Vout) của cảm biến cũng chính là điện áp VCC, có hai trường hợp như sau:
+Nếu mạch cần giao tiếp sử dụng mức tín hiệu có điện áp bằng với điện
áp VCC của cảm biến (Ví dụ cảm biến và Arduino cùng cấp nguồn chung là
8


VCC=5VDC, điện áp giao tiếp của Arduino cũng là 5VDC và Vout của cảm biến cũng là
5VDC) thì khơng cần nối trở Rx mà nối trực tiếp chân tín hiệu của cảm biến với chân tín
hiệu của Arduino.
+Nếu mạch cần giao tiếp sử dụng mức tín hiệu có điện áp khác với điện
áp VCC của cảm biến (Ví dụ cảm biến cấp VCC=10VDC, điện áp giao tiếp của
Arduino=5VDC) thì cần nối thêm trở Rx như hình dưới để giá trị của Vout=5VDC không
làm cháy mạch Arduino, giá trị của Rx được tính theo cơng thức cầu phân áp là: Rx=

(Vout*R1) / (VCC-Vout) = (5*10) / (10-5) = 10k.

Phần II.Sơ đồ nguyên lý

9


PHẦN II.
MẠCH MƠ PHỎNG VÀ MẠCH THỰC TẾ
1. Mạch mơ phỏng

2. Mạch thực tế

10


PHẦN III. Code
#include "U8glib.h"
#define DELAY_TIMEOUT 1500
U8GLIB_ST7920_128X64_1X u8g(13,11,10);
int ir_right_pin = 6;
int ir_left_pin = 7;
int ir_right_state = 0;
int ir_left_state = 0;
int ir_right_state_last = -1;
11


int ir_left_state_last = -1;
int in_counter = 0;

int out_counter = 0;
bool bWalkIn = false;
bool bWalkOut = false;
unsigned long tm;
// Để hiển thị giá trị số nguyên
enum {BufSize=8};
char buf[BufSize];
void draw(void) {
// Các lệnh vẽ lên trên màn hình lcd
u8g.setFont(u8g_font_fub20);
u8g.drawStr( 10, 25, "IN");
u8g.drawStr( 65, 25, "OUT");
u8g.setFont(u8g_font_timB24);
if( in_counter < 10){
snprintf (buf, BufSize, "00%d", in_counter);
}
else if( in_counter < 100){
snprintf (buf, BufSize, "0%d", in_counter);
}
u8g.drawStr( 5, 60, buf);
if( out_counter < 10){
snprintf (buf, BufSize, "00%d", out_counter);
}
else if( out_counter < 100){
snprintf (buf, BufSize, "0%d", out_counter);
12


}
u8g.drawStr( 70, 60, buf);

u8g.drawLine(60,0,60,63);
}
void setup(void) {
Serial.begin(9600);
pinMode( ir_right_pin, INPUT);
pinMode( ir_left_pin , INPUT);
// Gán giá trị màu mặc định
if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
u8g.setColorIndex(255); // white
}
else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
u8g.setColorIndex(3);
// max intensity
}
else if ( u8g.getMode() == U8G_MODE_BW ) {
u8g.setColorIndex(1);
// pixel on
}
else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
u8g.setHiColorByRGB(255,255,255);
}
updateLCD();
}
void loop(void) {
ir_right_state = digitalRead( ir_right_pin );
ir_left_state = digitalRead( ir_left_pin );
13


Serial.print( ir_left_state );

Serial.print( " " );
Serial.println( ir_right_state );
checkWalkIn();
checkWalkOUT();
}
void checkWalkIn(){
if( ir_right_state != ir_right_state_last ){
ir_right_state_last = ir_right_state;
if( (bWalkIn == false) && ( ir_right_state == LOW ) ){
bWalkIn = true;
tm = millis();
}
}
if( (millis() - tm) > DELAY_TIMEOUT ){
bWalkIn = false;
}
if( bWalkIn && (ir_left_state == LOW) && (ir_right_state ==
HIGH) ){
bWalkIn = false;
in_counter++;
updateLCD();
}
}
void checkWalkOUT(){
if( ir_left_state != ir_left_state_last ){
ir_left_state_last = ir_left_state;
14


if( (bWalkOut == false) && ( ir_left_state == LOW ) ){

bWalkOut = true;
tm = millis();
}
}
if( (millis() - tm) > DELAY_TIMEOUT ){
bWalkOut = false;
}
if( bWalkOut && (ir_right_state == LOW) && (ir_left_state ==
HIGH) ){
bWalkOut = false;
out_counter++;
updateLCD();
}
}
void updateLCD(){
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}

15


PHẦN IV.
Nguyên lý hoạt động
Cảm biến hồng ngoại E18-D80NK xác định được vật cản trong khoảng 3-80cm. Nếu cảm
biến nhân tín hiệu = 1 thì khơng phát hiện vật cản, nếu cảm biến nhân tín hiệu = 0 thì phát
hiện vật cản. Khi có người vào cảm biến bên trái nhận tín hiệu là 0 và bên phải nhận tin
hiệu là 1 nên số người vào sẽ được tăng lên và hiển thị trên lcd 128x64. Ngược lại, khi có

người ra cảm biến bên phải nhận tín hiệu là 0 và bên trái nhận tin hiệu là 1 nên số người
ra sẽ được tăng lên và hiển thị trên lcd 128x64.

16



×