Bài 22/31: Sử dụng Màn hình Hiển thị Bảy Đoạn với Arduino và Xúc xắc Điện tử | SunFounder Robojax
Trong bài học này, chúng ta sẽ khám phá cách điều khiển màn hình hiển thị bảy đoạn (seven-segment display) bằng Arduino. Thay vì sử dụng hơn một chục chân I/O để điều khiển trực tiếp từng đoạn LED, chúng ta áp dụng một mẹo thông minh: thanh ghi dịch (shift register). Con chip nhỏ và rẻ tiền này cho phép chúng ta điều khiển cả bảy đoạn (cộng với dấu chấm thập phân) chỉ bằng ba dây từ Arduino. Đây là một kỹ thuật nền tảng trong điện tử, giúp bạn mở rộng số lượng đầu ra có sẵn trên vi điều khiển của mình, từ đó có thể xây dựng các dự án phức tạp hơn mà không cần nâng cấp bo mạch.
Ngoài bộ đếm cơ bản, chúng ta sẽ xây dựng một con xúc xắc điện tử. Dự án này không chỉ củng cố kiến thức về điều khiển màn hình hiển thị mà còn giới thiệu đầu vào từ người dùng thông qua nút nhấn và khái niệm ngắt (interrupt), tạo ra một thiết bị tương tác và phản hồi nhanh. Hướng dẫn này dựa trên một bài học từ Khóa học Arduino Robojax, sử dụng bộ kit Arduino 3-trong-1 SunFounder.
Dưới đây là một vài ý tưởng thực tế bạn có thể xây dựng với kiến thức này:
- Tạo bảng điểm đơn giản cho các trò chơi như bóng bàn hoặc bóng rổ.
- Xây dựng bộ hẹn giờ kỹ thuật số cho trò chơi cờ bàn hoặc đồng hồ đếm ngược trong nhà bếp.
- Tạo bộ tạo số ngẫu nhiên cho trò chơi hoặc việc ra quyết định.
- Chế tạo nhiệt kế kỹ thuật số cơ bản bằng cách thêm cảm biến nhiệt độ.
Phần cứng và Linh kiện
Trước khi bắt đầu, hãy chuẩn bị các linh kiện cần thiết. Cốt lõi của dự án này là thanh ghi dịch 74HC595, chìa khóa để giảm thiểu số chân cần sử dụng. Thay vì kết nối từng đoạn trong bảy đoạn trực tiếp với Arduino, chúng ta kết nối chúng với thanh ghi dịch. Arduino sau đó gửi dữ liệu cho một chữ số một cách nối tiếp (từng bit một) đến chip, chip này sẽ xuất ra mẫu tín hiệu chính xác để làm sáng các đoạn.
- Arduino Uno (hoặc bo mạch tương thích)
- Màn hình hiển thị bảy đoạn (model 5161AS, cực âm chung)
- IC thanh ghi dịch 74HC595
- Nút nhấn
- Điện trở (220Ω - 330Ω)
- Dây jumper
- Breadboard
Màn hình 5161AS là loại cực âm chung (common cathode). Điều này có nghĩa là tất cả các cực âm (phía âm) của các đèn LED bên trong được nối chung với một chân nối đất. Để làm sáng một đoạn, bạn cung cấp điện áp dương cho chân dương (anode) cụ thể của đoạn đó. 74HC595 hoạt động như một cầu nối, nhận dữ liệu nối tiếp từ Arduino và xuất ra các tín hiệu song song cần thiết để điều khiển các cực dương này.
Hướng dẫn Đấu dây
Việc đấu dây thanh ghi dịch và màn hình hiển thị có vẻ phức tạp, nhưng làm theo sơ đồ từng bước là rất quan trọng. Video (tại 04:48) cung cấp hướng dẫn chi tiết về quá trình này. Chip 74HC595 có một khấc ở một đầu để xác định chân 1. Các chân được đánh số ngược chiều kim đồng hồ từ khấc (1-8 ở một bên, 9-16 ở bên kia).
Dưới đây là tóm tắt cách đấu dây từ video:
- Nguồn và Nối đất: Kết nối chân 8 và chân 13 của 74HC595 với thanh nối đất. Kết nối chân 10 và chân 16 với thanh 5V.
- Đường Dữ liệu: Kết nối các chân kỹ thuật số của Arduino với các chân dữ liệu của thanh ghi dịch: Chân 12 (STcp) với chân 12 của chip, Chân 8 (SHcp) với chân 11 của chip, và Chân 11 (DS) với chân 14 của chip.
- Màn hình hiển thị đến Thanh ghi dịch: Đây là phần phức tạp nhất. Video (tại 07:18) trình bày chi tiết từng kết nối. Ví dụ, đoạn 'a' trên màn hình kết nối với chân 6 của chip, đoạn 'b' với chân 5, v.v. Các chân cực âm chung của màn hình được nối với đất thông qua một điện trở.
Để có hướng dẫn trực quan và chính xác, vui lòng tham khảo sơ đồ đấu dây chính thức:
Các kết nối chân chính xác là rất quan trọng và rất dễ mắc lỗi. Hãy dành thời gian và kiểm tra kỹ từng dây so với sơ đồ. Video là một nguồn tài liệu tuyệt vời để bạn làm theo.
Giải thích Mã
Hai ví dụ mã được cung cấp trong bài học này. Ví dụ đầu tiên là bộ đếm đơn giản, và ví dụ thứ hai xây dựng dựa trên nó để tạo ra con xúc xắc điện tử. Cả hai đều chia sẻ cùng một logic cốt lõi để điều khiển màn hình hiển thị.
Dưới đây là mã cho bộ đếm cơ bản:
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595
const int DS = 11; //Pin connected to DS of 74HC595
int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
Ở đầu mã, bạn có thể cấu hình ba chân kết nối với thanh ghi dịch. STcp, SHcp và DS được gán cho các chân 12, 8 và 11 của Arduino. datArray[] là một phần quan trọng. Đây là một bảng tra cứu chứa các giá trị thập lục phân cho các chữ số từ 0 đến 9. Mỗi giá trị đại diện cho mẫu các đoạn cần làm sáng cho chữ số cụ thể đó.
Hàm loop() chạy bộ đếm. Nó sử dụng vòng lặp for để đếm từ 0 đến 9. Bên trong vòng lặp, mã gửi dữ liệu cho số hiện tại đến thanh ghi dịch. delay(1000) ở cuối đặt tốc độ của bộ đếm tính bằng mili giây. Thay đổi giá trị này thành 100 để đếm nhanh hơn, hoặc 500 để chậm hơn.
Mã xúc xắc điện tử giới thiệu một yếu tố mới: đầu vào từ người dùng qua một nút nhấn. Các thay đổi cấu hình chính là:
const int buttonPin = 2;
//...
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);
Ở đây, buttonPin được đặt ở chân kỹ thuật số 2. Chân này đặc biệt vì nó có thể được dùng như một ngắt. Ngắt cho phép Arduino dừng ngay việc đang làm khi nút được nhấn, đảm bảo phản hồi nhanh và đáng tin cậy. Chế độ FALLING kích hoạt ngắt khi nút được nhấn (tín hiệu chuyển từ CAO xuống THẤP).
Hàm rollDice được gọi bởi ngắt. Nó chuyển đổi biến state giữa 0 và 1. Khi state là 0, xúc xắc đang "lăn," và vòng lặp chính loop() sẽ hiển thị số ngẫu nhiên. Khi nút được nhấn lần nữa, state chuyển thành 1, dừng vòng lặp và hiển thị kết quả cuối cùng. Hàm showNumber() giống logic của bộ đếm, nhưng nó nhận một số làm đối số để hiển thị.
Dự án Trực tiếp và Trình diễn
Khi mã được tải lên, bộ đếm sẽ bắt đầu chạy, hiển thị các số từ 0 đến 9 với độ trễ một giây (trong video ở phút 15:04). Video trình diễn việc thay đổi độ trễ để làm bộ đếm chạy nhanh hơn nhiều.
Trình diễn xúc xắc điện tử (trong video ở phút 20:15) cho thấy nút hoạt động. Khi bạn nhấn một lần, màn hình bắt đầu lướt nhanh qua các số. Nhấn lại sẽ dừng việc lướt, để lại một số ngẫu nhiên từ 1 đến 6 hiển thị, giống như một con xúc xắc thật.
Các Chương
- [00:00] Giới thiệu về Dự án Màn hình Bảy Đoạn
- [01:25] Hiểu về Màn hình Bảy Đoạn
- [03:51] Bảng dữ liệu và Thông số kỹ thuật của Màn hình 5161AS
- [04:48] Kết nối Màn hình và Thanh ghi Dịch
- [12:24] Mã Arduino cho Bộ đếm 0-9
- [15:04] Trình diễn Bộ đếm và Điều chỉnh Tốc độ
- [16:27] Xây dựng Dự án Xúc xắc Điện tử
- [20:15] Trình diễn Xúc xắc Điện tử và Chống nhiễu phím
/*
Lesson 23/31: Using Seven Segment Display
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc
*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595
const int DS = 11; //Pin connected to DS of 74HC595
int datArray[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void setup ()
{
//set pins to output
pinMode(STcp,OUTPUT);
pinMode(SHcp,OUTPUT);
pinMode(DS,OUTPUT);
}
void loop()
{
for(int num = 0; num <10; num++)
{
digitalWrite(STcp,LOW); //ground ST_CP and hold low for as long as you are transmitting
shiftOut(DS,SHcp,MSBFIRST,datArray[num]);
digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data
delay(1000);
}
}
/*
Lesson 23/31: Electronic Dice
Get this code and watch video Download and resource page https://robojax.com/RJT605
YouTube video https://www.youtube.com/watch?v=3qoGAYh0lbc
*/
const int STcp = 12;//Pin connected to ST_CP of 74HC595
const int SHcp = 8;//Pin connected to SH_CP of 74HC595
const int DS = 11; //Pin connected to DS of 74HC595
const int buttonPin = 2;
int datArray[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
int number = 0;
int state = 0;
void setup ()
{
//set pins to output
pinMode(STcp, OUTPUT);
pinMode(SHcp, OUTPUT);
pinMode(DS, OUTPUT);
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), rollDice, FALLING);
}
void loop()
{
if (state == 0) {
showNumber((int)random(1, 7));
delay(50);
}
}
void showNumber(int num) {
digitalWrite(STcp, LOW); //ground ST_CP and hold low for as long as you are transmitting
shiftOut(DS, SHcp, MSBFIRST, datArray[num]);
//return the latch pin high to signal chip that it
//no longer needs to listen for information
digitalWrite(STcp, HIGH); //pull the ST_CPST_CP to save the data
}
void rollDice() {
state = !state;
}
Common Course Links
Common Course Files
Nghĩ bạn có thể cần
-
AmazonSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
Amazon
-
Amazon
-
Amazon
-
Amazon
Tài nguyên & tài liệu tham khảo
-
Tài liệuDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
Bên ngoàiPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
Tập tin📁
Thư viện Arduino (tệp nén)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB