You are on page 1of 410

PHẠM QUANG HUY - NGUYỄN TRỌNG HIẾU

V I A I Ể U K H IỂ N V À ỈN G D Ụ N G ■

ARDUINO
DÀNHCIO
NCIÍÍÍI Tự HỌC ■ ■

NHÀ XUẤT BẢN BÁCH KHOA HÀ NỘI


Clờl THIỆU u m u a O I W H » r* l0C

GIÁO TRÌNH THỰC HÀNH DỪNG CHO SINH VIÊN


CÁC TRƯỜNG KỸ THUẬT

MỘT QUYỂN SÁCH RẤT HỮU ÍCH VÀ CẨN THIẾT


KHÔNG THỂ THIẾU D ư ợc
VỚI CÁC HỌC SINH, SINH VIÊN
CHUYÊN NGÀNH ĐIỆN, DIỆN TỬ, c ơ ĐIỆN TỬ,
GIAO THÔNG, Tự DỘNG HỎA VÀ NHỮNG NGƯỜI
YÊU THÍCH DIỆN TỬ.
QUYẾN SÁCH RẤT THUẬN TIỆN TRONG VIỆC Tự HỌC
VỞI CÁC HƯỚNG DẪN CỤ THỂ, ĐẨY DỦ
VÀ RẤT THỰC TIỄN, GIÚP BẠN HỌC
THỰC HÀNH DẠT HIỆU QUẢ CAO.

SÁCH DO NHÓM NGHIÊN cứu


ỨNG DỤNG MULTIMEDIA TRONG GIẢNG DẠY
CỦA TỦ SÁCH STK BIÊN SOẠN VỚI PHƯƠNG CHÂM:
■ XEM THAO TÁC BẰNG HÌNH ẢNH;
• HỌC NHANH CHÓNG DỄ DÀNG;
• ỪNG DỤNG NGAY NHỮNG GÌ DÃ HỌC.
AIDUIM M M CM N O rtlT fiq C ũ đ l THIỆU

G lứ l T H IỆ U ■

C húc mừrig các bạn đến với tủ sách STK qua bộ sách Tự động hóa-
Thực hành điều khiển lập trình (P LC ), vi xử lý và vi điều khiển.
Bộ sách này gồm những chu yên đề sau:
1. Lập trình điều khiển với S 7-T ia Portal.
2. Tự động hóa tích hợp toàn diện-Hướng dẫn sử dụng S im atic Tia Portal.
3. Đ iều khiển lập trình và tạo giao diệ n HM I với W inC C F lexible.
4. Đ iều khiển lập trình và tạo giao diện HM I với Plc O m ron.
5. Đ iều khiển lập trình S cada - T ruyền thõ ng trong cô n g nghiệp.
6. G iáo trình thực hành vi xử lý.
7. G iáo trình thực hành vi điều khiển.
8. G iáo trình thực hành vi xừ lý và vi điều khiển với Proteus.
9. Lập trình điề u khiển với Arduino.
10. Vi điều khiển và ứng dụ n g -A rd u in o dành cho người tự học.
11. A rduino dành cho người bắt đầu.
12. Tự học lập trình điều khiển với A rduino.
13. Vi điều khiển và ứng dụ n g -L ậ p trình A rduino từ A-Z.
14. Lập trình điều khiển với R asphberry-R asphberry dành cho người tự học.
T ên gọi củ a sách của 8 tặp đầu tiên hết sức quen th u ộ c với sinh viên,
kỹ sư chuyên ngành Đ iệ n -Đ iệ n tử. 6 tặp còn lại giới thiệ u tới bạn đọc với m ột
cái tên mới là A rduino và Raspberry. Vậy A rduino và R aspberry là gì? Những
tĩnh vực nào có thể ứng dụng được A rduino, giá thà nh A rd u in o có m ắc lắm
không, A rduino có dễ dùng và dễ sử dụng hay không và n h iề u câu hỏi khác
nữa mà những người làm kỹ thu ật m uốn b iế t trước khi thử nghiệm với Arduino.
Riêng về bo m ạch Raspberry các bạn có thể tham khảo trên m ạng cũn g như
tham khảo phần phụ lục cuối sách.
A rduino được lạ o ra đầu tiên tại Ivrea - Italy vào năm 2005. Arduino
chính thức được đưa ra giới thiệu vào năm 2005 như là m ột cõn g cụ khiêm tổn
dành cho các sinh vièn của giáo sư M assim o Banzi, là m ột trong những người
phát triển Arduino, tại trường Interaction Design Instistute (IDI). M ặc dù hầu như
không được tiếp thị gì cả, tin tức về A rduino vẫn lan truyền với tốc độ chó ng m ặt
nhờ những lời truyền m iệng tố t đẹp củ a những người dùng đầu tiên. Arduino
làm việc trẽn nguồn mở dựa trèn nền tảng m ạch m ẫu điện tử (Kit), bao gồm m ột
vi điều khiển, m ột ngôn ngữ lập trinh và m ột IDE (trình soạn thảo).

3
cim TKIẼU IIM u a CM * M I r t IOC

Arduino là m ột cõng cụ để thực hiện các ứng dụng tưong tác. đuợc thiẽt
kế để nhăm làm đơn giản những tác vụ dành cho những người r^ói bãt đáu sư
dụng vi điều khiển cho nhiều mục đích (như tạo Robot, trang tri quảng cáo SỪ
dụng LED, quang báo, điều khiển động cơ, điều khiển nhiệt đõ. áp suất độ
ẩm...). Arduino được lắp ráp với các linh kiện điện tử thiết bị diện_ tương (ự như
trò chơi lắp ráp Lego, nhưng Arduino vẫn đủ linh hoạt cho các cnuyẽn gia phát
triển các dự án phức tạp.

Vào năm 2008, Arduino bắt đầu được một số thành viên trong các
cộng đồng giới thiệu trẽn các trang mạng nhưng cũng chỉ phát triển gói gọn
trong m ột sô' chuyên viên mà thôi. Tới năm 2011 tình hình sáng sủa hơn, cuộc
thi Robocon tại Việt Nam góp phần phát triển nhanh hơn việc sử dụng Arduino
từ những nhóm sinh viên mê say tham gia Robocon. Hầu như các robot thi
Robocon hiện tại đều ít nhiều sử dụng Arduino cùng các bo mạch mở rộng
cho nó. Tại Việt Nam, Arduino chủ yếu được nghiên cứu và ứng dụng tại các
trường Đại Học. Nếu chịu khó tra cứu từ khóa Arđuino trên mạng, bạn sẽ truy
cập không biết bao nhiẽu trang web cho phép bạn tải về các Ebook cũng như
các bài hướng dẫn (tutorial) kiểu bắt tay chỉ việc, học lặp trình điều khiển
Arduino từ cơ bản đến nãng cao. Nhờ vậy, tại các nước phát triển Arduino đã
xăm nhập đến cả những học sinh mới hpc cấp 3 sử dụng cả Iphone, Ipad để
điều khiển từ xa máy bay, vật thể không người lái, các mạch báo động lắp ráp
trong nhà, lắp ráp các loại robot khác nhau trong khi các học sinh đó không
được trang bị sâu kiến thức Đ iện-điện tử so với các các sinh viên chuyên
ngành. Nhiều mạch điện tử trong số đó đủ hàm lượng hpc thuật để làm các
đề tài tốt nghiệp cho sinh viẽn chuyên ngành Điện-Đ iện tử.

Vào năm 2015, Arduino Uno có lẽ là bo mạch tốt nhất dành cho các
bạn sinh viên, học sinh muốn tìm hiểu, nghiên cứu về vi điều khiển đề ứng
dụng trong cuộc sống, trong công nghiệp, trong khoa hpc, thi Robocon..

Những người mới bắt đầu sử dụng vi điều khiển có thể áp dụng
Arduino vào những ứng dụng thực tiễn trong đời sổng với những lý do sau:

• Bo mạch có giá rẻ, dễ sử dụng ứng dụng trong nhiều ngành nghề như:
Thi Robot, điều khiển các bảng quảng cáo, quang báo sử dụng LED
đơn, LED ma trận, điều khiển động cơ, điều khiển nhiệt độ hiển thị
kết quả đo trên LED 7 đoạn, LCD. Bo mạch (phần cứng) được thiết kế
có mã nguồn mở cho cả phần cứng lẫn phần mềm.
Với ý tưởng mã nguồn mở (Open sources) có nghĩa là phần cứng
phần mềm, sơ đồ mạch, phần mềm soạn thảo cùa IDE để viết code ý
tưởng thiết kế, sẽ không phải mất tiền mua, Arduino là m ót kit xử ly
được dùng để lập trình tương tác với các thiết bị phần cứng như cảm
biến, động cơ,_

4
MDB1N0 PAWN CHO HGƯỜI T f BỢC tlứ l THIỆĐ

• Đ iểm hấp dẫn ở A rduino là cá c bạn lặp trình với n g ôn ngữ rất dễ
học (giống như c , C++, M atlab), c á c phần tử ngoại vi trên kit A rd u in o
đều được chu ẩn hóa, với giá thành rẻ phù hợp với túi tiề n cho người
sử dụng bo m ạch Arduino.

• A rduino có thể dễ dàng ph át triển nh iề u chức năng hơn qua cá c bo


m ạch mở rộng có tên chung là S hields. Bo m ạch A rdu in o có thể được
lắp ráp với các linh kiện điện tử, thiế t bị điện khác có cấu trú c tương tụ
như trò chơi lắp ráp Lego, nhưng bo m ạch A rdu in o vẫn đủ linh ho ạt để
cho cá c chu yên gia phát triển các dự án từ đơn giản cho đến phức tạp
của cá c chu yên gia.

• Arduino thực sự đã gây sóng gió trên thị trường người dùng DIY (là
những người tự chế ra sản phẩm củ a mình) trên toàn thế giới trong vài
năm gần đây. s ố lượng người dùng cực lớn và đa dạng với trình độ trải
rộng từ bậc phổ thông lên đến đại học đã làm cho ngay cả những người
tạo ra chú ng phải ngạc nhiên về mức độ phổ biến.

Arduino là gì mà có thể khiến ngay cả những sinh viê n và nhà nghiên


cứu tại các trường đại học danh tiếng như MIT, Stanford, C arnegie M ellon phải
sử dụng. Ngay cả G oogle cũng m uốn hỗ trợ khi cho ra đời bo m ạch Arduino
Mega A D K dùng để phát triển các ứng dụng A ndroid tương tác với cảm biến và
các thiết bị khác?

• Arduino thật ra là m ột bo m ạch vi điều khiển được dùng để lậ p trình


tương tác với các thiết bị phần cứng như cảm biến, động cơ, đèn hoặc
các thiế t bị khác. Đ ặc điểm nổi bật của Arduino là m ôi trường phát triển
ứng dụng rất dễ sử dụng, với m ột ngôn ngữ lập trình có thể học m ột
cách nhanh chóng ngay cả với người ít am hiểu về điện từ và lập trình.

• Và điều làm nên hiện tượng A rduino chính là: Phần cứng cho bo m ạch
A rduino có giá khá rẻ, tại thời điểm tháng 1-2015, ch ỉ với khoảng
350.000 đ, người dùng đã có thể sở hữu m ộ t bo m ạch A rduino M ega
2560 R3 (theo nguyên bản Arduỉno, phiên bản ch ấ t lượng tốt) với số
lượng cổng giao tiếp ngoại vi và dung lượng bộ nhớ nhiều nhất so với
các dạng bo m ạch của Arduino. H ay bo m ạch A rdu in o UNO có cổng
USB sử dụng rộng rãi nhất hiện nay có giá khoảng 23 0.00 0 đ. M ộ t bo
m ạch A rduino UNO nếu m ua ở châu  u có giá khoảng 15-20 $ u s ,
m ua đồ T rung Q uốc còn có giá rẻ b ấ t ngờ (kho ản g 8 đến 12 $ US).
V iệ c thay thế con ch ip vi điều khiển trẽn bo m ạch (xem như trái tim
cùa bo m ạch) nếu bị chá y cũn g có thể m ua dễ dà ng với chi phí không
quá US $ 4. Vì vậy, bạn có thể yên tâm đủ khả năng tài chính để khắc
phục cho những sai lầm nếu có.


6IỬ I THIỆU AIMW u a a» WW rtW j-

Arduino có nền tảng làm việc khác với các bo mạch truóc đo co trẽn
thị trường từ các hãng khác nhau vì các tính năng sau:

• Arduino làm việc trong một môi trường đa hệ điều hãnn nó có thê
chạy trên W indows, Macintosh, và Linux.

• Nó làm việc dựa trên IDE với một trình soạn thảo trong m õi trường
phát triển tích hợp, môi trường phát triển này rất dễ sừ dung được sử
dụng bởi các nghệ sĩ và những nhà thiết kế.

• Chương trình thiết kế (lập trinh) có thể được tải từ máy tinh vào bo
mạch thông qua cổng USB (cáp USB), không phải là một cổng nối tiếp
(serial port). Tính năng này rất hữu ích, bởi vì nhiều máy tính đời mới
khõng có cổng nối tiếp.

• Do dự án Aduino có mã nguồn mở cả phần cứng và phần mềm nên


nếu muốn, bạn có thể tải về các sơ đó mạch, mua tất cà các thành
phần, và tự làm bo mạch cho riêng bạn, mà không phải trà bất cứ điểu
gì tới các nhà sản xuất của Arduino.
• Có một cộng đồng năng động của người sử dụng, vì vậy có rất nhiếu
người trong cộng đóng có thể giúp bạn.

• Sách vở viết hướng dẫn sử dụng Arduino rất đa dạng từ nhiều nguồn,
nhiều tác giả khác nhau (tiếng Anh). Đa số các sách đều có các bài
tập từ cơ bản cho đến nâng cao. Các bài tập trong sách đều cỏ mã
nguồn để người đọc dễ theo dôi kiểm tra.

• Dự án Arduino được phát triền trong một môi trường giáo dục và do đó
rất tốt cho người mới bắt đầu làm quen với Arduino có được những thứ
làm việc một cách nhanh chóng.

ĐỐI TƯỢNG SỬ DỤNG SÁCH

Cuốn sách này được soạn nhằm giúp người mới bắt đầu làm quen với
vi xử lý, điều khiển, những kỹ sư ra trường đã lâu không có điều kiện cũng
như thời gian để hiểu những lệnh rối rắm, phức tạp của các họ vi xử lý, vi điều
khiển thì nay có thể áp dụng các kiến thức trong sách để tự học, lặp trình điều
khiển nhiều mạch điện tử ứng dụng trong cõng nghiệp cũng nhu dãn dụng.
Nhiều lợi ích mà họ có thể nhận được từ việc học cách sử dụng lặp trinh điều
khiển trẽn nền tảng Arduino qua việc áp dụng triết lý của những naưói sáng
lập ra nó. Cuốn sách này ban đầu được các tác giả dự định đưoc viết cho
những người bắt đầu làm quen với Điện-Điện tử, các học sinh trung cấD nghé
cũng như các học sinh cấp 3 có thể khai thác và úng dụng A rauin; 3ijịu
khiển. Nhưng càng đi sâu, vấn dề cáng trỏ nên phức tạp bài hai n o v/è n " lá n
chính sau:

6
A1 H IM SARI CM MCếSl I f MC B ấ lT B Ệ I

• V iệ c xử lý hinh ảnh m inh họa m ất rất nhiều thời gian, việc c h ụ p các
m ạch điện lắp ráp cá c linh kiện với bo m ạch bằng m áy ảnh khõng đ ạ t
do ảnh không rõ nét trong quá trình in ấn. V iệ c vẽ hình m inh họa bằng
cá c phần m ềm chu yên dùng như C o relD raw hay Adobe Illu stra to r thì
có thuận lợi là ảnh rất rõ nhưng m ất rất nh iề u thời gian.

• Nếu ch ỉ lặp trình A rdu in o cho v iệ c điều khiển LED , tạo cá c hiệu ứng
cho LED thì đáp ứng được đối tượng đề ra ngay từ đầu nhưng sẽ làm
người họ c hiểu sai sửc m ạnh củ a A rduino là chỉ có điều khiển LED
trong q u ả n g cáo.

N hiều ung dụng điều khiển khác phức tạp hơn như:

> Đ iều khiển LED 7 đoạn, LED m a trận, LCD.


> Đ iều khiển động cơ DC, động cơ servo, động cơ bước.
> Đ iều khiển ngõ ra theo yêu cầ u với đầu vào là các cảm biến
nh iệ t độ, áp suất, độ ẩm , quang trở, siê u àm.
> T ru yề n thõ ng nối tiếp.
> G iao tiếp qua Ethernet.
> Đ ọc và ghi thẻ nhớ SD Card.
> C ông nghệ RFID để đọc và điều khiển thẻ.
> N h iều ứng dụng khác nữa ...
Các bạn có th ể tham khảo các Ebook liên quan đến học A rd u in o và
Rapberry) từ cơ bản đến nâng cao trình bày trong phụ lục (G ồm 2 đĩa DVD)
và các bài v iế t (tutorial) trên m ạng để khai thác và sử d ụ ng có hiệu quả
Arduino trong dãn dũng cũ n g như công nghiệp.
Các tác giả hy vọng sau khi xuấ t bản cuốn sách sử dụng A rduino, bo
m ạch này sẽ được phổ biến rộng rãi. Có nhiều người hơn nh ất là cá c giáo
viên bắt đầu đưa A rdu in o vào giảng dạy và ứng dụng nó và o m ôn học của
minh. Qua kinh nghiệm nhiều năm viế t sách và dạy học, ch ắ c chắ n sẽ có
nhiều người sử dụng bo m ạch A rdu in o để lặp trình để tạo các sản phẩm rất
thực tế trong sản xuấ t cũn g như đưa vào giảng dạy góp p h ần đổ i mới việ c dạy
và học. Chúng tôi tin chắc: Nếu bạn đọc đã có chuyên m ôn nhất định, các
bạn sẽ là những nhà thiế t kẽ kiêm nghệ sĩ và cuốn sách này sẽ dành cho
bạn.
Đ iều m ong m uốn của các tác giả khi lổ n g hợp và bièn soạn bộ sách
học lặp trình điều khiển với A rduino là m ang đến bạn đọc những thố ng tin
mới, các cõng cụ lặp trình đơn giản, cho phép m ột người khõng ch u yê n về lĩnh
vực Đ iện-Đ iệ n tử trong vòng 3 tới 5 ngày thực hành là bắt đầu khai thác và
áp dụng A rdu in o vào trong công việc.

7
C lỉl TH1ỆB U M IM CM ■ » « ! Tf lệ t

Rất nhiều sinh viên trong cũng như ngoài ngành Điên nnũng nguòi
mới bắt đẩu tiếp cận điện tử (vi điều khiển) lẳn đầu đều nghĩ rằng:Họ phải
học cách để xây dựng tất cả mọi thứ từ đầu thưởng đều "bỏ cùa chạy lấy
người' sau vài buổi học đầu tiên, đây là một sự lãng phí thời gian:

Những gì bạn muốn khi hpc là dể


làm việc được, một khi sử dụng được Arduino
sẽ là động lực cho bạn học những lý thuyết
phức tạp của các họ vi điều khiển kinh điển tại
các trường.

Nội dung sách gổm 10 chương và phụ


lục.

Lưu ý : Các bạn nên xem và thực hành các bài


tập trong sách “LẬP TRÌNH ĐIỂU KHIỂN VỚI
ARDUINO” cũng do tủ sách STK biên soạn trước
khi thực hành các bài tập trong chuyên đề này.

• CHƯƠNG 1: GIỔI THIỆU.


. CHƯƠNG 2: PHẦN CỨNG VÀ PHẦN MẾM ARDUINO.
• CHƯƠNG 3: ĐIỂU KHIEN v à t ạ o h iệ u ứ n g vớ i 6 LED.
• CHƯƠNG 4: ĐIỂU KHIỂN VÀ TẠO HIỆU ỨNG VÔI 12 LED.
. CHƯƠNG 5: ĐIỂU KHIỂN VÀ TẠO HIỆU ỨNG VỐI 12 LED
THEO MẢNG.
. CHƯƠNG 6: QUẢNG CÁO VỚI LED MA TRẬN.
• CHƯƠNG 7: ĐIỀU KHIỂN LED 7 ĐOẠN.
. CHƯƠNG 8: HlỂN THỊ KẾT QUẢ ĐO NHIỆT ĐỘ VÀ ĐỘ Ẩ m bằ n g
LED 7 ĐOẠN.
. CHƯƠNG 9: ARDUINO VÀ MODULE CẢM BIỂN ẢM THANH.
• CHƯƠNG 10: ARDUINO VÀ MODULE CẢM BIẾN ÁNH SÁNG.
• PHỤ LỤC: GIỚI THIỆU SÁCH VÀ EBOOK HỌC ARDUINO VÀ
RASPBERRY.
Một số điểm cần lưu ý khi sử dụng sách:

• Tài liệu biên soạn trên phiên bản Arduino chạy trẽn nền W indows
nếu máy tinh các bạn dùng hệ điều hành Linux hay Mac vẫn có thể
thực hành các bài tập trong sách mà không ảnh hưởng nhiếu đến việc
thực hành hãy tham khảo thêm trong trang web'
h ttp ://w w w .a rd u in o .cc/

8
A l— — lẢ m CM M tế il T f I f c a il T1ÊI

• Bo m ạch A rd u in o sử dụng trong sách là A rduino UNO, cá c bạn vẫn có


thể dùng cá c bo m ạch A rduino có cổn g USB khác để thực hành (cần
lưu ý khai báo bo m ạch tương ứng trong phần m ềm và cá c chân kết
nối trong p h ần cứng chính xác).
• V iệ c tìm hiểu cá ch tải chương trình cũn g như các sách, phim học liên
quan đến A rd u in o cũng như các chương trình khác liên quan đến vi
điều khiển cá c bạn có thể tham khảo bài viế t “C ÁC H T Ả I DỮ LIỆU
T R Ê N M Ạ N G VÓ I U TO R R EN T” tải về theo đường dẫn sau để có thể
khai thác nguồn tài nguyên vô cù n g phong phú trên m ạng qua việ c tải
về các Ebook, phim , chương trình và nhiều hơn nữa mà không m ất
nhiều thời gian với v iệ c sử dụng utorrent.

http://w w w .m ed iafire.co m /view /74m q 6yq w 8xz8h ftl

(Lưu ý : Nếu trang web h ttp ://to rre n tc ra z y .c o m không truy cập được,
bạn đọc có th ề vào trang web h ttp ://k ic k a s s .s o /.

Trong quá trình bièn soạn không thể tránh khỏi thiế u sót, chú ng tôi
m ong được cá c bạn đọc góp ý, trao đổ i về tủ sách STK để nội dung
biên soạn ngày càn g tốt hơn.

H ãy tải về các dữ liệu (code lặp trinh) theo đường dẫn sau để thực
hành các bài tập trong sách:

http://w w w .stkb oo k.co m

Hy vọng cá c bạn sẽ nhanh chó ng khai thác có hiệu quả bo m ạch


Arduino trong cõ rig v iệ c của mình.

M ọi thắc m ắc, góp ý xin gừi về hộp thư: nh asa chstk@ y a h o o .co m .vn .

TỦ SÁCH STK

742 ĐIỆN BIÊN PHỦ - QUẬN 10 - TP H ồ CHÍ MINH

* ( 0 8 ) 38334168 - 0903728344

Trang web: w w w .stkb o ok.co m ,w w w .nhasachstk.com

Email: nhasachstk@ yahoo.com .vn, stkbook@ yahoo.com .vn

Rất m ong nhận được nhiều ý kiến đóng góp, nhất là ý kiến của các
thầy, cô có nhiều kinh nghiệm giảng dạy các chủ đề liên quan trong sách để
sách được hoàn thiệ n hơn trong những lần tái bản sau.

C ác tác giả

9
6IỚI THIỆU IIIM IM M i 1 1 1 TI — c

TÀI LIỆU THAM KHẢO


Còn nhiều tài liệu (Ebook) cũng như phim học Arduĩno Raspberry trẽn
mạng các bạn có thể tải về tham khảo, học để hiểu sâu hon về cách lập trình
trẽn Arduino. Các bạn có thể liên hệ tủ sách STK để có các tãi liệu hướng
dẫn sử dụng bo mạch Arduino sau:
• 30 Arduino Projects For The Evil genius.
• Arduino Adventures Escape from Gemini Station.
• Arduino A Quickstart Guide.
• Arduino Android Projects for the Evil Genius.
• Arduino Cookbook.
• Arduino for Dummy.
• Arduino In Action.
• Arduino projects to save the world.
• Arduino Starter Kit Manual.
• Atmospheric Monitoring With Arduino.
• Beginning Android ADK with Arduino.
• Beginning Sensor Networks with Arduino and Raspberry Pi.
• Build an Arduino Compatible Breadboard Microcontroller.
• Building Autonomous Line Followers using Arduino and PID.
• Environmental Monitoring with Arduino.
• Learn Electronics with Arduino.
• Make a Mind Controlled Arduino Robot.
• Make an Arduino Controlled Robot.
• Practical Arduino Cool Projects for Open Source Hardware.
• Professional Android Open Accessory Programming W ith Arduino
V413HAV
• Programming Your Home Automate with Arduino, Android, and Your
Computer.
• Practical Arduino Cool Projects for Open Source Hardware.
• Practical Arduino Engineering.
• Programming Arduino Next Steps Going Further with s * e :; -
Lưu ỷ: Còn nhiều tài liệu học Arduino khác với đáy đủ code 5 Sz r.sn dễ
dàng kiểm tra kết quả chua trình bày ở dây.

10
ARDUINO DÀIW CHO NGƯƠI Tự HỌC CHƯƠNG 1: Slửl THIỆU THIẾT KỂ QUẢNG CẢO

CHƯdNG 1

GI0I THIỆU THIẾT KẾ qUẢNG CÁO


N gày nay, công nghệ quảng cáo ngày càng tiên tiến. Công nghệ trang
trí đèn LED hiện đang dược sử dụng rộng rãi trong nhiều ngành, nhiều tĩnh
vực. Nếu có dịp đi trên phố bạn sẽ gặp những bảng hiệu quảng cáo rất nổi
bật, nhấp nháy nhiếu m àu và bắt mắt. Đ èn LED đã thực sự xâ m nhập vào
cuộ c sống, đ ặ c b iệ t là trong hệ thống chiếu sáng và trong ng àn h quản g cáo.
Nhìn vào những bảng hiệu LED trê n đường phố ta m di thực sự nhận thấ y rõ
rệt, ứng dụng đèn LED trong quảng cáo đã phát triể n như thê nào trong
những năm qua. Những năm gán đáy, khi nhu cáu thẩ m mỹ đã được nâng lên
m ột bậc. C ác bảng hiệu quảng cáo từ đó cũng có những cuộc cách m ạ n j cho
riêng nó kèm theo đó là sự đa dạng về chủng loại cũng như phong cách. Nổi
b ật hơn cả trong số đó là sự lên ngôi của dèn LED , m ột trong những linh kiện
điện tử được các nhà th iế t kế quảng cáo rất ưu ái trong giai đoạn hiện nay.
V ậy đâu là sức hấp dẫn đã làm cho quảng cáo bằng đèn LED “ lên
ngôi" trong giai đoạn hiện nay. Sau đây là m ột vài điểm khác b iệ t nổi bặt của
việ c quảng cáo bằng đ è n LED:
Những hiệu quả của việc sử dụng bảng hiệu quảng cáo bằng LED
• Đ èn LED là m ộ t loại bóng đèn phát sáng đời mới tiêu hao năng lượng
thấp, có nh iề u m àu sắ c để chọn lựa, và có nhiều ứng dụng trong cuộ c
sống ngày nay và tương lai.
• Kích thước nhỏ, dễ lắp ráp, có thể ph át sáng nhiều m àu và có độ
thẩm m ỹ cao.
• T iế t kiệm đ iệ n năng: Ước tính chỉ với công suấ t 1/5 so với tấ t cả các
công nghệ chiếu sáng khác. T iế t kiệm rất nhiều năng lượng (1000
bóng đèn LED = 1 bóng đèn Neon 0,6 m). N goài ra tu ổ i thọ của đèn
LED có thể lẽn dến 100.000 giờ (tương đương 10 năm ).
• Tính sử dụng rộng rãi và an toàn: Không gâ y nên chá y nổ như dèn
neon và có thể sử dụng ở bất cứ nơi đâu.
Đ èn LED đã thực sự trở thành công nghệ chiếu sáng tiế t kiệm, hiệu
quả nhất trong giai đoạn này, nhất là đối với lĩnh vực quảng cáo. Với nhiéu tính
năng vượt trội của nó, đèn LED sẽ là công nghệ chiếu sáng trong tương lai.
M ột số úng dụng thường gặp của LED:
• Làm bảng hiệu cho các cửa hàng, trung tâm thương m ại.
• Sừ dụng trong trường học: T hông báo lịch học, tuyể n s in h -

11
CHƯƠHe 1: Glđl THIỆU ĨH IỂ ĨIÉ QUẢNB CẤO lig 0 0 B lt D I T lí HOC

• Làm bang thông báo trong các cơ quan: Ngân hàng, buu đ>ẻn. cóng ty
xô so kien thiet, ủy ban nhân dân, chi cục thuế chứng khoan
• Sử dụng trên đường giao thông: Làm cổng chào thông báo tinh hình
giao thõng._
• Làm bang quảng cáo cho công ty, nhà hàng showroom, siêu thị.
Hiện nay đèn LED đã bắt đáu thay thế dán các loại các loại dèn thõng
dụng trong chỉeu sáng mặc dầu giá thành còn khá cao nhưng so vê lãu dài
thì rất tiết kiệm về mặt năng lượng, cụ thể trong chiếu sáng công cộng: Đèn
đường LED, đèn chiếu sáng vỉa hè..., trong chiếu sáng quảng cáo Neon-LED
thay cho đèn Neon-sign tiết kiệm 50% điẹn nâng, các bảng quảng cáo LED
rất sinh động và tiết kiệm năng lượng. Để tạo thành các bảng hiệu có thõng
tin cố định người ta thường dùng các loại LED đơn với nhiéu màu sắc để tạo
các ký tự và hình ảnh, dùng mạch điện tử diéu khiển sự chđp tắt và tạo hiệu
ứng ánh sáng mong muốn. Việc sử dụng đèn LED và mạch điện từ để tạo các
hiệu ủng ánh sáng nhằm mục dich gây sự chú ý và truyền đạt thông tin cùa
công ty đến khách hàng hoặc người đi đường .
• LEDsign: Là các bảng hiệu (biển hiệu) có sử dụng LED để trang tri và gây
sự chú ý cao trong cảnh báo và trong kinh doanh để thu hút sự chú ý cùa
khách hàng. Một số tên liên quan: Bảng thông tin điện tử, Bàng hiệu LED,
Bàng quang báo, Màn hình LED, LED Display, LEDsign...
• Bảng điện tử có thông tin thay đổi được còn gọi là bảng quang báo
hay màn hình điện tử LED.

Do có nhiều màu sắc,


nhiều cách hiển thị sinh
động, dễ thu hút sự chủ ý
tđi mọi người. Dễ thay dổi
thông tin trên bảng điện
tử, nên đây được xem
như là phương tiện dể
truyến đạt thông tin hiện
đại, nhanh chóng.

12
MOW N) DAM CHO Kirill Tự HỌC CHƯƠMG1: e ifll THIỆU THIẾT IÉ QUẦBC CÂĐ

B IỂN H IỆU Q UẢN G CÁO NEON SIGN


Neon sign thường được gắn trê n các bảng hiệu với nh iề u hình dạng và
kích thước khá c nhau.
Nhưng neon sign th ậ t sự là gì?
Nó là m ộ t lo ại đèn dùng các ống thủy tinh trung tính có đường kính
khác nhau được uốn th à n h chữ hay biểu tượng theo yê u cấu khách hàng, bẽn
trong có chứa khí hiếm như neon hay argon, hay bất kỳ khí trơ khá c trong m ôi
trường áp suấ t thấp p h á t xạ ánh sáng. Neon cho ra ánh sáng m àu đỏ trong
khi argon ánh sáng yế u hơn thường là ánh sáng vàng, xanh dương, xanh lá
cây, trắng . Neon sign ph át sáng khi ta cấp m ộ t nguổn áp cao vào đèn.
Sử dụng m ặt nhôm làm nến để gắn đèn neon sign là m ột trong
những cách thể hiện hiệu quả và đẹp m ắt. Neon sign sở hữu vẻ đẹp ánh sáng
lung linh huyén ảo vế đ ê m và đặc b iệ t có rất nhiểu m àu sắ c để cho bạn
lựa chọn để thể hiện nộ i dung. Đ èn neon sign được uốn bằng tay theo nội
dung th iế t kế. B iển đèn neon signs được làm bằng các ống duợc uốn theo các
hình khác nhau. Đường kính ống thường là 8-11 mm cho cá c đèn trong nhà và
12-13 m m cho đè n trong nhà cỡ Iđn, ngoài trời.
Đ èn có đường kính càng nhỏ thì càng dễ uốn cong thà nh hình ảnh
nhưng khó nhìn th ấ y từ xa. ố n g kích thước Iđn hơn dễ nhìn thấy và thích hợp
dùng làm tên cửa hiệu. T uy nhiên, ống lớn khó làm cá c chữ nhò.
CHƯƠNG 1: Glửl THIỆU THIẾT IẾ QUẦNG CÁO I M u a 0 » * ư o i TƯ HOC

Neon sign có nhiểu màu được uốn theo chữ viết hoặc hinh ảnh thường
dùng để trang trí, quảng cáo và biển hiệu các quán rượu, nhà hàng, sòng bạc,
khách sạn, và những nơi vui chơi giài trí. Bằng cách thiết kế các bộ phận
chuyển mạch, có thể tạo ra vô số hình ảnh sống động và rực rỡ.

14
ABDUmODÀNHCHONBƯƠI TựHỌC _________ CHƯƠH6 1: EỊỞI THIỆU THIẾT KẾ qUẦNC CÁQ
CHƯƠH61: Bllìl THIỆU THIÉTIÉ QUẦIK CÁO U M a » » « ) I Tự nọc

BẢNG HIỆU LED


Đây là bảng sử dụng các đèn LED rời có màu sắc khác nhau, được
gắn vào một tấm cổ định theo hình dáng khách hàng yéu cáu (bóng LED, gắn
chạy xung quanh viển chữ, các chữ). Một chương trình sẽ diéu khiển bật tảt
nháy sáng đèn để tạo ra hiệu ứng mong muốn. Loại bảng hiệu này có thể tạo
những hiệu ứng khá dẹp mắt trong khi giá thành lại thấp hơn so vđi biển hiệu
LED ma trận hay màn hình full color. Nhược điểm Idn nhất của loại bảng này
là nội dung hiển thị trên bảng loại này không thể thay dổi dược. Đèn LED có
ưu điểm sáng được cả ban ngày và gây được sự chú ý cao.

Ánh sáng đèn LED được tạo ra


bởi vật liệu bán dẫn do dó độ sáng
luôn ổn dịnh. Nội dung quảng cáo có
thể chuyển động lên xuống, trái phải,
nhấp nháy. Đây là loại bảng quảng cáo
sử dụng công nghệ siêu tiết kiệm điện
năng, hiệu quả quảng cáo cao. Bảng
hiệu quảng cáo rất hiệu quả cho các
cửa hàng điện thoại, xe máy, shop thời
trang, vàng bạc, đá quý, mỹ phẩm, làm
dẹp, cắt tóc, nhà hàng, quán bar, quán
cafe... Đặc biệt dùng để làm các bảng
vẫy và bảng cỡ nhỏ.
ARĐUMODA* CHOKưdl TựHỌC CHtM* 1:6lđl THIỆU THIẾT IÉ QUẢIK CÁO

Bảng LED vẫy là m ột ứng dụng phổ biến nhất vé đèn LED , sử dụng
bảng hiệu LED vẫy hình ảnh hiển thị vô cùng sống động và cuốn hút. Bảng
LED vẫy có giá thành rẻ, chi phí thấp mà hiệu quả đem lại cao. Đ ặc biệt với
LED vẫy trên nén chữ nổi là m ột sự lựa chọn làm thay đổ i cả không gian, bề
m ặt cùa doanh nghiệp, tạo vẻ ấn tượng thu hút với người nhìn từ xa.
Với kích thư đc và trọng lượng nhẹ, có thể lắp đặt, di dởi theo nhiểu vị
trí mà bạn m uốn. K ế t cấu và giá thành cùa bảng LED vẫy phụ th u ộ c chủ yếu
vào sô lượng LED sừ dụng trê n bảng hiệu sẽ giúp bạn có nhiều lụa chọn
trong yê u cấu th iế t kế để có m ột bảng hiệu ưng ý.

BẢNG Q UẢNG CÁ O LED VAY

Đ ây là bảng sử dụng cá c đèn LED rời có m àu sắc khác nhau, được


gắn vào m ột tấm nến cô định theo hình dáng khách hàng yê u cáu. M ột bo
m ạch được lặp trinh sẽ điểu khiển bậ t/tắt đèn cũng như thay d ổ i m àu sắc để
tạo ra hiệu ứng m ong muốn.

Loại bảng này có thê’ tạo những hiệu úng khá đẹp m ắt trong khi giá
thà nh lại tháp hon so v đ i b ả n g L E D m a tr ậ ũ iia y màn hình full color.

17
CHƯƠHS 1: eiớl THIỆU TH IỄĨIÉ QOÀK CÁO U M m Ktoi n f »ọc

Nhược điểm lớn nhất của loại bảng này là nội dung hiền thị trẽn bảng
loại này không thể thay đổi được.
Ưu điểm của sản phẩm
• Bảng LED vẫy là một ứng dụng phổ biến nhất vế LED. sừ dụng bảng
LED vẫy hình ảnh hiển thị vô cùng sống dộng và cuốn hút.
• Bảng LED vẫy có giá thành rẻ, chi phi tháp mà hiệu quà dem lại cao.
Đặc biệt với LED trên nén chữ nổi là một sự lựa chọn làm thay đổi cả
không gian, bế mặt của doanh nghiệp, tạo vẻ ấn tượng thu hút vđi
người nhìn ngay từ dằng xa.
LED là thành phần chính cùa bảng quảng cáo LED vẫy, chúng ta cán
tìm hiểu LED trước khi thành lập mạch diện tử điếu khiển nó.
ĐÈN LED LÀ GÌ?
Có nhiều người hiểu đèn LED là gì nhưng cũng không ít người chưa biết.
LED viết tắt cùa cụm từ tiếng Anh Light Emitting Diode, tạm dịch là Diode phát
quang nó là các diode có khả năng phát ra ánh sáng hoặc tia hống ngoại, tử
ngoại tùy từng loại LED. Cũng giống như diode, LED được cấu tạo từ một bán
dẫn loại p ghép với một bán dẫn loại N. Nó có tinh chất cùa một diode chỉ cho
■lòng điện chạy qua theo một chiếu, vì thế đa số trường hợp ta phài nuôi đèn
LED b nguốn điện một chiều. Nếu ta nối đèn LED vđi một nguỗn xoay chiéu
CO điẹn áp p i'r '^ t f p thì đèn LED vẫn sáng. Trong trường hợp này, chỉ một nửa
chu kỳ cùa dòng xù?v -chi®u di qua đư<=,c đèn LED và làm cho nó Phát sán9
Nếu muốn kiểm chứng, bạ,? có thể nối đèn LED với nguón xoay chiéu rói dùng
điện thoại có camera quay lại. Bạ.v s® thấy nó nhấp nháy chứ không sáng liên
tục. Nếu dùng nguồn 1 chiều (DC) thi không có hiện tượng này. LED phát sáng
là do sự tái hợp của điện tử và lỗ trông trong phất bán dân khi có dòng điện
chạy qua. Sự tái hợp này sẽ giải phóng năng lượng dưới dạng bức xạ ánh sáng.
Tùy theo loại bán dẫn được sừ dụng mà năng lượng được giải phóng khác nhau
và ánh sáng phát ra có màu sắc khác nhau. LED đơn sắc chỉ phát ra ánh sáng
trong một vùng bước sóng nhỏ và không phát ra các bưóc sóng khác. Không
giống như bóng đèn sợi dốt thông thường hoạt động dựa trên việc dốt nóng dày
tóc, nguyên lý phát quang cùa đèn LED làm cho nó có hiệụ suất phát sáng cao
hơn nhiểu do ít bị hao tổn nhiệt.
Cấu tạo của đèn LED
Bộ phận chính của một đèn LED là hai lớp bán dẫn loại p và loại N
đặt tiếp xúc vđi nhau. Kích thưđc cùa các Iđp bán dẫn này rất nhò, ch! cd vài
phán trăm milimet. Do vậy cõng nghệ chế tạo đèn LED cũng dòi hòi công
nghệ cao. ồ Việt Nam đã sản xuất được đèn LED, không tính việc nhập chip
về rối chế tạo thành phẩm. Phán trinh bày trang bẽn mô tả lớp bán dẫn và
cấu tạo bên trong của một bónp đèn LED ttiông thường.

1Q 9
ARDUIRO DAM CHO MGƯỪI ĩự HỌC CHƯƠNG 1: Glđl THIỆP THIẾT ÍẺ QUẦHC CA ũ

Lớp bán dẫn được vẽ phóng đạ i lên để cho ta dễ hình dung. Thực tế
việ c nôi điệ n cực cho các lớp bán dẫn này rất khó vì kích thước rất nhò. Hình
trê n mô tả sá t thự c tế hơn với lớp bán dẫn được đặt trong m ộ t đĩa p h ản quang.
Vỏ bọc bên ngoài được làm bằng nhựa trong suố t hoặc có thể pha th ẽ m chất
tạo m àu. Lớp vỏ này có tác dụng làm giá đỡ, bảo vệ kế t cấ u của đèn đông
thời phần chóp cầu phía trê n có tá c dụng hội tụ hưđng ánh sáng ph át ra theo
m ột hưổng với m ộ t g ó c mở nhất định. Vì cấu tạo phần bán dẫn và dây nố i bên
trong rất nhỏ nên nếu chúng ta tác động lực quá m ạnh vào chân điệ n cực cùa
đèn LED có thể gây phá vỡ kết cấu và có thể làm hỏng đèn.
H iện nay đã có những loại bóng LED cao cấp dùng cho biển quảng
cáo LE D sign cỡ lớn. Đường kính bóng LED có hai loại: loại 5 ly b ọ c nhựa
thành 8 ly và loại 8 ly b ọ c nhựa thà nh 12 ly.

Loại LED mới này có đủ


cả đơn sắc, 7 m àu và fu ll color.
Hình dưới là m ộ t số dạng LED
hay dùng ngoài thị rường. C ác
bạn sẽ được giới th iệ u m ột số
loại chính để tham khảo.

19
CHƯƠNG 1: Glửl THIỆU THIẾT IẼ QUẢNG CÁO Ấ IĐ U U B 1 » a o K U O I Tự HOC

• Loại LED 5 ly bọc nhựa 8 ly: Loại này có lẽ lá loai có gia rè nhẵt cùa
dòng LED đúc. Nó có màu sắc tương tự như LED 5 ly đon sãc thông
thường. Mỗi bóng LED dã dược nối sẵn điện trở hạn dong phù hợp.
Bạn chi việc nối hai đầu dây cùa cụm thẳng vào nguòn 5V hoặc 12V
là LED sáng. Các bóng LED được bọc nhựa kin nẽn có thể chống
được nước mưa. Điều khiển giống như LED 5 ly thưởng, nỗi chung cực
dương cùa các cụm bóng còn cực âm nối vào mạch diếu khiển.
Loại LED 8 ly bọc nhựa 12 ly đơn sắc: Loại này tương tự như loại 5
ly chỉ khác kích thưđc. Thường dùng cho những biển chữ Iđn, treo ở
trẽn cao.
Loại LED 8 ly bọc nhựa 12 ly bày màu: Loại náy có 4 đáu dây cho mỗi
LED. Thực ra 7 màu là kết quà pha trộn giữa 3 màu đỏ, xanh lá, xanh
dương. Ví dụ, nếu ta cho màu đỏ sáng cùng màu xanh dương sẽ có
màu tím, màu đò sáng cùng màu xanh lá sẽ có màu vàng.... Mỗi bóng
ta sẽ có 1 dây dương chung và ba dây còn lại là của ba màu.

LED dúc nối dây sẵn dùng


cho biển LEDsign cđ lổn
Loại LED đúc full color: Mỗi
bóng loại này được gắn 1 chip diều
khiển màu và có 4 đầu dãy ra. Tùy
theo loại LED ta có thể điểu khiển
bằng mạch diếu khiển thông thường
hoặc phải mua cùa nhà sàn xuất. Loại
LED này khi gắn cán phải vẽ lại đúng
theo sơ đó vị trí từng bóng. Nói chung
việc điểu khiển tưong đối phức tạp.
Phải dân trong nghề điện từ mới có
thể thực hiện được.

20
AROUINO DAW CHO « ư ừ l Tự HỌC CHƯƠNG 1 :6IƠI THIỆU THIẾT KẼ qUẤNe CÃO

Loại LED full color này tuy có giá thành m ắc nhưng cho nhiều hiệu
ứng tùy vào v iệ c bố trí và điểu khiển m àu.

Đ èn LED ch iếu âm -
LED cụm
Được sử dụng nếu các
bạn m uốn có được kiểu chữ
nổi chiếu sáng như hình bên.
Loại LED này bán
sẵn, người th iế t kế chi việ c
m ua vể và gắn là xong.

Đ è n LED d ây
S ù d ụ ng đ è n LED dây
có thể lắp đ ặ t chạ y phía trong
m ặt kính. V ào bu ổ i tối có thể
tạo ra cá c hiệu ứng đ ổ i m àu
và hình ảnh khác nhau. Vào
thời gian ban ngày, c á c dãy
đèn LED này cũng không ảnh
hưởng nhiều đến kiên trú c bế
m ặt kính.

21
CHƯƠHG 1: GIỚI THIỆII THIẾT IỄ QUẢfE CẤD Aiun^i I f ao T* jjg

ĐÈN LED CHIỂU SÁNG NGHỆ THUẬT


Các bộ đèn pha LED công suất -300W có thể chiếu xa dến 150 m, và
có thể tạo được nhiều hiệu ứng đổi màu khác nhau, ứng dụng cho công trình
này, các hiệu ứng ánh sáng từ màu tĩnh dến các hiệu ứng dổi màu khác nhau

Các LED
được tự động
kích hoạt từ khi
mặt trời lặn đến
12h đêm khõng
những làm công
trinh nổi bật, trở
thành một điểm
đến thú vị cho
khách du lịch, mà
còn có ý nghĩa
trong việc tiết
kiệm năng lượng.

Với hiệu quả mang lại: Chi phi bảo trì thấp, tiết kiệm diện, có thể
đổi màu thể hiện được nét độc dáo của đường cong kiến trúc công trinh, ánh
sáng tập trung vào các chi tiết công trình, không có ánh sáng thừa gây lãng
phí và ô nhiễm ánh sáng. Sừ dụng LED rất hiệu quả so vđi việc sừ dụng các
bộ đèn pha thông thường hàng ngàn W att có tuổi thp thấp và tỏa nhiếu nhiệt.

22
AKDUtaO B Á M CHO K ư ữ l ĩự HỌC CHƯƠNG 1: Glđl THIỆU THIẾT IỂ QUẦNG CÁO

MÀN HÌNH LED FU LL COLOR


M à n hình fu ll color dẫn đầu về khả năng hiển thị thô ng tin m ộ t cách rõ
ràng và sinh động nh ất so với cá c sản phẩm bảng điệ n tử có trẽ n thị trường
hiện nay.

Do khả năng
hiển th ị m ộ t d ả i rộng
c á c m àu s ắ c và m ộ t
bộ xừ lý m ạnh m ẽ,
bảng điện tử loại này
có khả năng hiển thị
những hình ảnh video
như m ộ t m àn hình TV
nhưng vdi kích thư đc
linh ho ạt the o yê u cầu
của khách hàng.

Nhờ sự linh h o ạ t về kích thư đc này, có thể tạo m ộ t bàng qu ản g cáo


kế t hợp các m odule full color (ví dụ để hiển thị logo của doanh ng hiệp hay cửa
hàng) với c á c m odule ít m àu hơn để giảm giá thà nh trong khi vẫn tạo được
hiệu ứng mong m uốn.
Đ ặ c đ iể m chính c ủ a sản phẩm m àn hình full color:
• K ố t cấu hiện đạ i vđ i những tinh năng vượt trội.
• Kich thước đa dạng, ph ục vụ nhOng địa điểm quảng cáo tám cỡ. M àn
hình fu ll color khắc ph ục được độ sáng của m áy chiếu, hay kích thưđc
chưa đù lổn c ủ a LC D..
CHƯƠNG t e iđ l THIỆU 1 H Ẽ T I Ẽ QUẢNE CÁO AIOUIK !*■ ao KtfOI TUnot

So vđi các sản phẩm quàng cáo phát sáng hiện có thi dãy la san
phẩm có đặc điểm gây sự chú ý cao nhất, dễ quan s á t dẻ h|é u n^af
bởi hình ảnh sốnq đõnq và trực quan hơn cả.

Bảng quảng cáo LEDsign - Các bước tiến hành

Phần trình bày


sau giới thiệu với các
bạn các bước dể làm
ra một bảng quảng
cáo LEDsign hay còn
gọi là bảng vẫy.
ở đây chi giới
thiệu sơ lược cho bạn
thấy tổng quan, tùy
vào cụ thể mà có các
bước chi tiết cụ thể.

24
ABDUIRO D À M CHO MGƯỪI ĩự H Ọ C CHƯƠNG 1: eiđl THIỆU THIẾT «Ễ QUẢNG CÁO

BƯỚC 1: T H IẾ T KẼ'

K hi định làm m ột bảng quảng cáo, khâu th iế t kế là m ộ t khâu bắt buộc


và rất quan trọng. Để th iế t kế m ột bảng quảng cáo LE D sign cá c bạn cấn lưu ý
m ột vài đ iể m chung như sau:
• Kích thước cá c đ ố i tượng thể hiện trê n bảng phải đủ lớn để có thể
th ể hiện bằng cá c LED. C ác bạn cần biết, để thể hiện những đường
nét c ủ a th iế t kế thì ph ả i sắp xếp các dèn LED theo những nét đó.
Giữa các đèn đ è n với nhau có m ột khoảng cách nh ất định không quá
gần cũng như q u á xa. Thông thường khoảng 1cm - 2cm . Vì vậy nếu
những nét qu á nhỏ thì ta không thể thể hiện được.
• C á c đường n é t càng tách b iệ t càng dễ đi các đường điện (nối dây),
m ạch không bị rối sẽ dễ thi công và sửa chữa sau này.
• N ếu dùng LED đơn sắc chúng ta chỉ có 5 m àu: Xanh lá (G reen), Xanh
dương (Blue), Đỏ (Red), Vàng (Yellow ) và T rắng (W hite). Sau khi th iế t
kế xong những gì bạn m uốn thể hiện trê n bảng, cần phải đánh dấu
cá c điểm sẽ gắn LED trên những đường nét củ a th iế t kế. T ố t nhất, ta
nên đá nh d ấ u bằng vòng tròn có đường kinh bằng đúng đường kinh
đèn LED định dù ng . Khoảng cách giữa các LED nên chọn hợp lý tùy
th u ộ c vào th iế t kế củ a bạn.

BƯỚC 2: KHOAN L ỗ T H E O M AK ET T H IẾ T KẾ

Sau khi đã làm xong m aket (thường vẽ bằng chương trình Corel hay
AutoC AD ), tiến hành khoan lỗ trên bảng theo m aket đã làm. V ặ t liệu làm biển
có thể là m ica hay alum inum với màu nền thường có màu tối. Nếu sử dụng m áy
CNC thì chi cần lập trình để máy tự động khoan rất chính xác. Nếu không có
m áy CNC thì ta có thể in thiế t kế ra g iấ y ,rồ i dán lên m ặt bảng sau đó dùng
khoan tay thôi. LƯU ý: c ầ n dùng m ũi khoan có đường kinh bằng v đ i dưàng
kính cùa bóng LED. Như vậy bóng LED mới có thể lắp vừa khít vào lỗ khoan.
N ên khoan thù và i lỗ để thừ trước cho chắc. N ếu khoan v đ i m ica thì m ũi khoan
ph ả i m ài cho b đ t sắ c đi nếu không dễ gây phá vỡ lỗ khi khoan.

25
CHƯƠIK 1: eiứl THIỆU THIÉTIÉ QUẲK CẢO IM B !>■ ao PM I m mt

Bước 3: GẮN ĐÈN LED LẼN BẢNG


Sau khi đã khoan xong tất cả các lỗ trên bảng, ta tiến hành gãn LED
màu theo đúng thiết kế. Các LED được lắp vào các lỗ khoan từ phia sau
Phán chân bóng có thể được nối trước hoặc sau khi lắp vào lỗ. Phán nổi LED
tham khảo trong phán trình bày trước.
BƯỚC 4: LẮP MẠCH ĐIỂU KHlỂN v à l ậ p t r ìn h

Nếu có thể tự chế tạo mạch điểu khiển cho biểrk.LEDsign thì tốt. Bạn
sẽ học được nhiều thứ. Tuy nhiên việc mua mạch diếu ỉáiiển bán sẩn trên thị
trường sẽ không mất thời gian mà lại rẻ hơn tự làm nhiéu.
Với các bo mạch bán sẵn, người dùng chi cấn nối chung cực dương
của tất cả các khối LED. Cực âm của từng khối được nối vào từng kênh trên
mạch diéu khiển. Tùy theo việc bô trí các khối LED như thế nào và định cho
nhấp nháy kiểu g) thì sẽ có cách nối theo từng nhóm kênh để dễ điéu khiển
Các bo mạch bán sẵn thường cho người dùng phán mềm lập trình miễn phí và
rất dễ dùng. Ta có thể chpn hiệu ứng sáng dần, tắt dán, độ sáng bao nhiêu,
thời gian sáng v.v. Sau đó chỉ nhấn ‘ Chạy chương trình' là xong. Trong
chuyên đề này tuy hướng dẫn các bạn điểu khiển LED bằng bo mạch Arduino
nhưng việc lập trình sẽ khó hơn nhiéu so với các bo mạch chuyên dùng rất dễ
dùng. Tuy nhiên, việc hưđng dẫn điều khiển LED bằng bo mạch Arduino giúp
người học khai thác các cõng cụ và lệnh trong Arduino để từ đó thiết kế các
mạch ứng dụng khác phức tạp và đa dạng mà các bo mạch chuyên dùng để
điều khiển LED sẽ khó hay không thực hiện được.
BƯỚC 5: LÀM HỘP CHO BẢNG
Việc làm hộp cho bảng diện trước hết là để bảo vệ hệ thống điện cùa
bảng. Việc làm khung hộp đẹp cũng góp phẫn làm cho sản phẩm của chúng
ta chuyên nghiệp và bắt mắt hơn. Có nhiễu cách làm khung hộp, tùy bạn thấy
cách nào phù hợp và đẹp thì làm theo cách đó. Miễn sao phải đảm bảo chống
được nước mưa lọt vào làm hỏng hệ thống điện. Sau khi hoàn thiện tất cả các
bước bạn nên chạy thử và kiểm tra trong vài ngày xem có vấn đé gì không rối
mđi đi treo để đđ phải tháo lên tháo xuống khắc phục.

28
M D U IM D A W CHO IKƯ 0I Tự HỌC CHƯđNG 1: Glđl THIỆU THIẾT KÉ QUẢNG CÁO

Q U Ả N G CÁ O LED MA TR Ậ N
Bảng LED m a trận hay còn có cách gọ i đơn giản khác là bảng chữ chạy
đang được phát triển với nhiểu cài tiến vế chất lượng lẫn hiệu quả. Thay vi nội
dung quảng cáo cố định như bảng LED vẫy, người dùng có thể thường xuyên
cập nhặt nội dung trên bảng LED ma trận. Hoặc nếu thay đổ i hình thức hay địa
chỉ kinh doanh thì bảng LED chữ chạy vẫn có thể tận dụng tốt.
T ìm hiểu vể bảng quảng cáo LED ma trận
Bảng quảng cáo LED ma trậ n đã không còn xa lạ gì vđ i chúng ta nOa.
K hi di ngoài đường chúng ta gặp rất nhiểu bảng quảng cáo có thể cho dòng
thô ng tin hay hình ảnh trô i qua. Đó chính là loại bảng quảng cáo LED m a trận.
K hi bạn m uố n th iế t kế m ột bảng quảng cáo như vậy, bạn cần tìm hiểu vế nó.

11
CHƯƠNG 1: Glứl THIỆU THIẾT IỄ QUẢNE CÁO MDUIN) IẦ M cm w f t l l Tự nạt

Trên bảng LED ma trận, các bóng hoặc các cụm bóng LED được xép
thành các hàng và các cột. Dạng bố trí này giông như một ma trận nẽn ngươi ta
gọi đó là LED ma trận (LED matrix). Lấy ví dụ một biển quàng cáo LED ma trận
có 100 cột và 32 hàng ta sẽ có 3200 bóng dèn LED. Vì sao lại phài bó tri nhtèu
bóng đèn LED như vậy? Đó là vì người la muốn bảng ma trận LED có thê hiển
thị dược vãn bản hoặc hình ành giống như một màn hình. Các bạn biết, màn
hình cùa điện thoại đời thấp có khoảng 68 hàng và 98 cột. Ta thấy hình ảnh trên
màn hình điện thoại loại này cũng gán giống như hình ành hiển thị trẽn các
bảng quảng cáo LED ma trận. Nó gốm tập hợp những điểm rời rạc ghép lại. Số
hàng và số cột càng nhiều thì hình ảnh càng mịn. Hiện nay màn hình điện thoại
đã phát triển thành full color với 854 hàng và 480 cột. Màn hình LED ma trận
cũng vậy, đã có những màn hình LED full color có thể trinh chiếu video không
kém những loại màn hình nào khác. Hơn thế, màn hình LED có ưu thế là độ
sáng mạnh, có thể để ngoài trời mà vẫn hiển thị rõ hình ảnh.
Để phù hợp với ngành quảng cáo, có nhiều loại LED ma trận được
sản xuất. Có loại đơn sắc, đa sắc, full color, loại phân giải cao, phân giải thấp,
loại dùng trong nhà, loại dùng ngoài trời... LED đơn sắc thi mỗi điểm ảnh chi
có 1 LED loại 1 màu (đò, xanh, vàng...). Với ma trận LED đa sắc, mỗi điểm
ảnh có thể có 2 hoặc 3 bóng LED có màu khác nhau. Những LED màu khác
nhau khi sáng gần nhau sẽ pha trộn tạo thành các màu sắc khác nhau. Ví dụ,
màu xanh để gấn màu đỏ mắt ta sẽ thấy đó là màu vàng. Còn với LED full
color thì mỗi điểm ảnh sẽ có 3 màu cơ bản: Đỏ, xanh lá, xanh dương, việc pha
trộn các màu này với mức độ khác nhau sẽ tạo ra hàng triệu màu.

Các ma trận
LED được sản xuất
thành các module. Ví
dụ loại LED dơn sắc
P10, mỗi module có
16 hàng và 32 cột.
Khoảng cách
điểm ảnh cùa
module P10 là 10
mm. Do vậy module
P10 có kích thước là
16x32 cm.

28
ARDUINO DANH CHO NBƯÍtl Tự HỌC CHƯƠHG1: Clđl THIỆU THIẾT IẼ QUẦNG CÁŨ

Khi m uốn làm m ộ t bảng quảng cáo LED m a trận, bạn phải tinh toán
dựa trê n những kích thước có sẵn này để tính được tổng số LED sau đó tính
toán dòng và áp cho khối nguồn. P hần trình bày sau g iđ i thiệ u m odule P10 có
đ ầ y đủ cá c thà nh phấn cơ bản của m ột m odule, m ột khi đã hiểu rõ m odule
này thì sau này gặp ph ả i c á c m odule khác các bạn sẽ không bỡ ngỡ.
M ặ t trước củ a m odule LED P10 như hình trang bên.
Như c á c bạn đã biết, m odule P10 có nghĩa là khoảng cách điểm ảnh,
ở đ â y là hai bóng LED liên tiế p nhau là 10 mm. M ỗi điểm ảnh là m ộ t bóng
LED vì vậ y đ â y là loại P10 đơn sắ c có m àu đỏ. M odule này có 32 cộ t và 16
hàng tương đương với kích thước 160 X 320 mm. Đ ây là m odule loại chịu nưđc
nên khuôn nhựa được đ ú c rất khít với bóng LED để trá n h nước. C h iều d à y của
khuôn nhựa cũng d à y hơn loại sem i outdoor.

THÔNG SỐ KỸ THUẬT MODULE LED P10 M ÀU Đ ỏ NGOÀI TRỜI

Kích thưỏc module 320 m m X 160 m m

Kích thước điểm ảnh (pixel) 10 mm

Mật độ điểm ảnh 10.000 diểm/m2

Cấu hình điểm ảnh (pixel) 1R ( một màu đỏ )

Độ phân giải W:32 điểm * H: 16 điểm

Khoảng cách nhìn tốt nhất 10 - 100 m

Nhiệt độ làm việc thích hợp 20° — > 80°

Cưòng dộ sáng 2500 - 3000 cd/m2

Độ ẩm cho phép 10% — > 95%

MTBF £ 10.000 giò

Tuổi thọ £ 100.000 giò

Module được sử dụng Ngoài trời, chống chịu nước

Điểu khiển Thõng qua máy tính

Góc nhin ngang 120°

Góc nhln thẳng 110°

Thời gian bào hành 1 năm

Chứng ch! CO, CQ

29
CHƯƠHG1: Glđl THIỆU TH1ẼT IÉ QUẢIC CÁO I— i u a r t H t

«►£* * * « «►
' * ' • * « '♦ " • " • * ♦ • • • > ' • • •
! « '« / '♦ ♦ ;• # * * * * ♦ ♦ * ♦ '■ * * ♦' V ♦ V ♦ í ►♦ *
# ':♦ . * * V * * ♦ * * * '# '* v v V ♦ • ♦ ♦
' * '■ * * *•' ♦ * “ «►4» • • • • ♦ • ♦ *
W * <*■«►■“<* .♦'«►. *'• + V V “ì ỉ ' * ♦ • • • ♦ ♦ ♦ ♦ • • •
<*'♦ % *«ík'3Í’♦ ' » ^ f s r «►
« ifr > # ^ ' V * * ^ ♦ '^ V V ¥ • 'V • V * *
* * ' * ' 4 * ' * * «. ♦ Ị ? ' • • ' ¥ ¥ ¥ ■» «TV '«►«►♦ •
* «» « ệ '♦ '# '. # ; » 'iy-'ijf 'Y :t r V • > “ ¥ ¥ * V ¥ V «* «► ■ «► • ♦' • * • • •
^ ^ « w " ♦ '♦ 'r i* «►<£'*' ♦ '*■ ♦ * ' * • * ♦ » • •
•»«»«• ♦■'♦"♦' *■ '♦ ’♦ V >' '* '«• <»«* «►"«►«* «•

» « » » » '-* •* * ■ * • * ' * *>-•*"*- * • ■ * ■ • • • ■ « ■ * * * - * # ♦ * • • • ■ .


» 1*3* -* * »• » , ¥ ' ¥ ¥ ¥ ¥ tr *;••*■„*• «■ « «■ «■•«.• * ♦ ' * . • *
& 'à> « « í* «►'-» >» «> o « « «ỉ » «> «> «> «
Mặt sau của module là mạch điện từ có các vị trí để cắm giắc tín hiệu
và cấp nguốn nuôi. Trên thành của khuôn nhựa ở mặt sau cũng có các vị trl
để bắt vít và rãnh dể lắp gioăng chống nước.
Rãnh lắp gioăngchống nước Chỗ cấp nguổn 5 V

Giắc nối tin hiệu từ CPU Giắc nối tin hiệu vđi module sau
Khi mua module P10 bạn sẽ dược cung cấp dù giắc tin hiệu, dây nói
nguôn, và gioăng cao su. Mặt sau có 2 giắc tín hiệu. Các bạn nhìn theo chléu
mũi tên đánh dấu trên bo mạch. Giắc thứ nhất là để nối tín hiệu từ CPU vào
(nếu đây là module đáu hàng) hoặc từ module phía trưđc. Khi cắm cáp các
bạn chú ý trên bo mạch ỏ dấu mỗi giắc có chữ "OE-, phải cắm sao cho vị tri
OE ở module này nối với vị tri ’ OE’ ở module kia hoặc trên CPU.
CHtftiK 1: Glđl THIỆU THÉT IẾ QUẢNB CÁO

G iắ c thứ 2 để nối vđ i m odule phla sau. N ếu đ â y là m odule cuố i hàng


thl jắ c này để trống . N ố i nguồn cho m odule bằng d â y diệ n ho ặc cáp nguón
được cung cấp. Chú ý tới công suấ t củ a m ạch để chọn dây cho phù hợp. M ỗi
m odule P 10 sẽ tiê u thụ đòng cực đại khoảng 2 A. Vì th ế nếu bạn định nối 1
dây nguồn cho 20 m odule thì d â y ph ả i chịu được 40 A m à không bị nóng. T rên
bo m ạch có cá c linh kiện là cá c IC nguồn, gh i dịch... N ó i chung chú ng ta
không nên để cá c vậ t d ẫ n điệ n chạ m vào bo m ạch. Khi chạ y trá n h sờ tay vào
m ạch ở m ặt sau có th ể gây nhiễu hoặc chá y IC.
C á c bạn đã nắm được sơ lược cấu tạo của m odule LED P10. C ác loại
m odule khác cũng cấu tạo tương tự hoặc khác đô i chút.
C á c bạn có thể tiế p xú c hay tham khảo trê n m ạng để có thê m thông
tin cá c m odule khác.
B ảng LED m odule m a trận - C ác bước tiến hành
Bảng quảng cáo m a trận LED dễ làm hơn bảng LE D sign vì đã dược
Các nhà sản xu ấ t chế tạo sẵn thà nh các m odule. Chúng ta chỉ v iệ c ghép các
m odule bảng có kích thước theo yê u cắu và kết nối đúng là xong. T uy nhiên,
m ột số người lú c đầu sẽ thấ y ph úc tạp vì phải phân b iệ t nhiếu loại m odule
cũng như p h ả i c à i đ ặ t cho đúng c á c thông số từ phần m ềm điều khiển.
S au đây là c á c bưđc làm m ộ t biển m a trậ n LED.
Bước 1: T ín h to án th iế t kế
K hi định làm m ộ t bảng ma trận LED, cán b iế t kích thước bảng của bạn
là bao nhiêu. Kích thước quan trọng vì cá c loại m odule LED có kích thước cố
định. B ạn c h ỉ có thể g h é p m odule th à n h cá c tấm có kích thước bằng số
nguyên lần diệ n tích c ủ a m ộ t m odule. Nếu khung củ a bảng là b ắ t bu ộc và Iđn
hơn kích thước gh ép được từ cá c m odule thì phần thừa ra bạn sẽ để làm
khung hộp. N goài ra, bạn ph ả i chọn loại m odule thích hợp vđi kích thư dc và
tầm quan s á t c ù a bảng.
Nếu bảng ở gần, bạn phải chọn loại m odule có phân g iả i cao như P10,
P16. C òn ở xa bạn chỉ cần loại có độ phân g iả i thấp như P20 chẳng hạn. Hiện
nay có nh iề u loại m odule có kích thước khác nhau. Bảng dưới liệt kê m ộ t vài
loại để cá c bạn tham khảo.

Loại m odule Kích thưổc Khoảng cách pixel

P10 16 cm X 32 cm 10 mm

P20 16 cm X 32 cm 20 mm

P16 12,8 cm X 25,6 cm 16 mm

P7.62 24,4 cm X 12,2 cm 7,62 mm

31
CHƯƠNG 1: CIOI THIỆU THIỂTIÉ q ilÀ B CÁO U M ca m IIipc

THÕNG SỐ KỸ THUẬT MODULE LED P16 3 MÀU (LED Đ ỏ VÀ XANH)

Kích thưdc module 256 mm X 128 mm

Kích thước điểm ảnh (pixel) 15 mm

Mật độ điểm ảnh 3906 diểm/m2

Cấu hình diểm ảnh (pixel) 2R1G

Độ phãn giải W:32 điểm * H: 16 diểm

Khoảng cách nhìn tốt nhất 1 0 -1 0 0 m

Nhiệt độ làm việc thích hợp 20° — > 80°

Cường độ sáng I 4000 - 4500 cd/m2

Độ ẩm cho phép 10% — > 95%

MTBF I > 10.000 giờ

Tuổi thọ I s 100.000 giờ

Module dược sử dụng Ngoài trời, chống chịu nưdc

Điều khiển : Thông qua máy tính

Góc nhìn ngang Ị 120°

Góc nhìn thẳng ; 110°

Thời gian bảo hành ; 1 năm

Chứng chì ; CO, CQ

32
ABDUIWO DÀIH CHO K ư đ l Tự UQC CHƯƠNG 1: tlỡ l THIỆU THÉT KẼ QUẨMS CÀO

M odule P20 3 m àu, đò, vàng, xanh lá cây (G iá bán: K hoảng 210.000 đ
(ch ấ t lượng cao). P20 (3 m àu). 1/4 Hub 12 .320 X 160 mm. M odule P20 là sản
ph ầ m có ch ấ t lượng tốt. Độ sáng ổn định, đống đếu.

* Kích thước M odule: 320 X 160 mm.


« Đ ộ p h â n g iả i (khoảng cách 2 điểm ảnh): 20 mm.
* H iển thị 3 m àu: Đỏ, vàng, xanh lá cây
* G ó c nhìn: N g hiê ng 110 ± 5°, thẳng 60°
* Nhiệt độ hoạt động: 10 - 60°c.
» Phương ph áp quét: 1/4 chu kỳ.
« Cường độ sáng: 4500 mcd.
í N g uó n đ iệ n sử dụ ng : Nguồn 5V chu yên dụng.
* C P U điểu khiển: Dòng BX thông dụng: BX -4T2, B X-4A 1, BX -4A2
BX-A, S C L20Ũ 8......

33
CHƯƠNG 1: Elỡl THIỆU THIÉĨIÉ QUẨRE CÁO ù a ca k M i T| nc

Bước 2: Ghép module


Các module đếu được nhà sản xuất để sẵn vị trí bắt vít. Ngưdi thiết ké
dựa vào các vị trí này để tinh toán các khung xương ghép các module vdi
nhau. Thông thưởng nếu bảng có 3 hàng module trở lẽn chúng ta nẻn làm
xương chạy dọc lên. Ghép như vậy ta sẽ có các mảng góm các module chóng
lên nhau. Sau đổ ta sẽ làm các xương ngang chạy theo chiéu dài của bảng dé
bắt các mảng này lên.
Việc sử dụng module ngoài trời hay trong nhà cũng cán phải quan tàm
khi làm khung xương. Nếu là trong nhà bạn không cần phải để ý dến việc
chống nước, chi ghép làm sao cho khít là dược. Nếu là loại ngoài trời, module
sẽ có một gioăng cao su phía sau. Chúng ta phải làm viển để ép sát được
gioăng này mđi dảm bảo kín nước. Nếu không ta sẽ phải làm hộp chẩn nước
tốt. Các bạn cấn lưu ý khi ghép các module sao cho dễ tháo lắp nếu có trục
trặc. Nếu không, mỗi lán xử lý lại phải dỡ các bàng ra sẽ rất tốn công Khi
mua module, chúng ta sẽ dược cung cấp đù cáp tín hiệu và cáp nguón kết nối
tất cả các module với nhau. Sau khi ghép hoàn thiện các module chúng ta tiến
hành nối cáp nguốn và cáp tín hiệu.

BƯdc 3: Nối mạch điểu khiển CPU và chạy phẩn mểm

Có nhiều loại CPU trên thị trường phù hợp cho mỗi loại bảng và kích
thước của bạn. Giá cả có thể từ khoảng 250 ngàn dến vài triệu. Bạn nên chọn
CPU có tính năng điểu khiển dược số lượng điểm ảnh cao hơn số lượng diểm
ảnh trên bảng cùa bạn. Như vậy, khi chạy h)nh ảnh hoặc chữ mđi không bị
giật. Nếu bảng ít hàng thi CPU không cán bộ chia kênh (adapter). Bạn nên
mua cáp tín hiệu từ CPU ra module dài một chút để dễ thao tác và đặt CPU ở
vị trí mà bạn muốn. Mỗi hàng module trên bảng ta cán có một cáp tín hiệu nối
vổi CPU. CPU dược kết nối với máy tính bằng cổng COM. Nếu muốn dùng
cổng USB thì phải mua thêm một cáp chuyển đổi USB to COM. Nên mua loại
dây tốt để đảm bảo mua về là dùng được vì trên thị trường có nhiéu loại dãy
không đảm bảo chất lượng. Khi mua CPU bạn sẽ dược cung cấp phán mém
điéu khiển, nạp chữ hoặc hình ảnh. Mỗi phần mềm có cách dùng khác nhau

BƯđc 4: Làm khung hộp

Làm khung hộp cho bảng tùy theo yêu cáu và thiết kế cùa bạn

PHẨN CỨNG ĐIỆN BẢNG QUẢNG CÁO

Tinh toán nguồn nuôi cho bảng LEDsign


Chọn nguốn nuôi phù hợp cho bảng LED là một việc quan trọng
Nguồn nuôi phù hợp sẽ đảm bảo dộ bển cùa nguốn và cũng là dàm bảo dộ
sáng cùa bảng LED và bảng ít bị nóng.

34
A n n u m B Ằ H c«0 R tftfl I f BỌC CHƯƠNG 1: Clđl THIỆU THIẾT KẼ qUẨNE CÁO

N guón nuôi cho bảng


LED vẫ y th ô n g thưởng là loại
ng uồ n 12V DC. C ô ng suất
c ủ a nguó n được th ể hiện
b ằ ng dòng đ iệ n cực đ ạ i mà
n g uổ n có thể cung cấp dao
đ ộ n g từ 5A đ ế n 40A. Có 2 loại
nguổn DC là nguốn biến áp
thường và nguổ n sw itching.
T rê n thị trường hiện nay phổ
b iế n là lo ại ng uổ n sw itch ing
có nguổ n g ố c T rung Q uốc.

G iá th à n h loại nguồ n sw itching đã giảm đ i nhiều so vđ i trước kia và


được d ù ng phổ b iế n v) gọn nhẹ, độ bền cũng tương đố i tốt. T uy nhiên loại
nguồ n này rấ t dễ hòng nếu bị nước vào. V iệ c sửa chữa cũng không ph ả i dễ
d à ng với đa số người dùng.
L o ạ i nguồ n b iế n áp thường ít được sử dụng hơn vì nó nặng và cóng
kềnh. M uốn có công su ấ t càng cao thì biến áp càng phải to và rất nặng.
Nhược điểm này làm cho nó khó bố trí trong biển quảng cáo và dân quảng
cáo không thích. T u y vậ y lo ại này lại rất bến, việ c sửa chữa cũng dễ dàng.
B ấ t cứ ai có c h ú t kiế n thứ c vế điện tử là có thể sửa được.
Trở lại vấn để tính toán nguốn nuôi cho biển quàng cáo. C húng ta b iế t
rằng giá th à n h bảng qu ản g cáo LED thường được tính bằng số luợng LED . s ố
lượng LED cũn g d ù ng để tính toán công su ấ t nguốn nu ôi cần sừ dụ ng . M ột
LED 5 ly loại s iê u sáng trung bình tiêu thụ dòng điện từ 10 mA - 15 mA. Như
vậ y 1000 LED chú ng ta cần khoảng : 1000 X 15 mA = 15 A.
N ếu ta dù ng nguồ n 12V và đấu 3 tầng đèn LED (tham khảo về cá c sơ
đồ đấ u ỏ phấn sau) thì cùng m ột dòng điện sẽ nuôi được sổ luợng bóng gấp 3
lần. Đ ố i v đ i bàng LED vẫy, không phải lúc nào tấ t cả các LED đều sáng cho
nên bả ng sẽ không dùng h ế t 100% công suất. T uy vậy, để có hệ số an toàn
cao, chú ng ta nên chọ n nguồn nuôi có dòng cực đai cao hơn tổng công suất
c ủ a b ả ng m ộ t chút. K hi chạy th ù các bạn nên thừ kiểm tra xem nh iệ t độ của
nguố n nu ô i có nóng quá không. Nếu nguổn nuôi bị quá nóng sẽ nhanh hòng
và bạn nên ch ọ n m ộ t nguốn khác tố t hơn.
C á ch chọ n ng uồ n cung cấp cho số lượng LED trẽ n bảng qu ản g cáo:
• S ố lượng LED < = 2.500 Dùng nguồn 24 V - 5 A.
• S ố lượng LED < = 5.000 Dùng nguồn 24 V - 10 A.
• S ố lượng LED < = 7.500 Dùng nguổn 24 V - 15 A.

35
C M S 1: GIỚI THIỆU THIẾT IỄ QUẢNG CÁO J I T M u a O i m m ỉ | BỌC

38
ARDUIIIO D Ả m CHO NGƯ0I lự HỌC CHƯƠNG 1: Clửl THIỆU THIẾT KÉ QUẨHS CÀO

CÁ C S ơ ĐÓ Đ Ấ U Đ È N LED CH O BẢNG LEDSIGN


T ro n g q u á trinh làm bảng quảng cáo LED, có m ột vài kiểu đấu cho
đ è n LED . C á c đè n LED có m àu xanh, vàng, đỏ dùng để mô tả cho các cụ m
đ è n LED m à ta m uốn chủ ng nhấp nháy riêng biệt. C ác cụ m này được nối
chu ng cực dương. C á c điệ n trở chặn làm nhiệm vụ hạn chế dòng điện qua
LE D hay transìtor trên m ạch điều khiển. Vậy làm sao để đấu cá c cụm LED
trê n ? T a có c á c sơ đố đấu như sau:
K iểu 1: Đ ấ u ch u ng tấ t cả

Ỵí ? Ỷ' T

ở sơ đồ này, tấ t cả cực dương của cá c bóng được đấu chung và tấ t cả


c á c cực âm được đ ấ u chung. C ụm LED này tương đương vđi m ộ t LED có điện
áp nu ô i bằng điệ n áp nuôi cho 1 LED và dòng nuôi bằng tổng dòng nuôi các
LED riêng biệt. Ưu điểm c ủ a sơ đố này là dễ đấu, bạn chi việ c dùng m ột dây
d ẫn hàn tấ t cả cá c cực dương hay cực âm củ a tấ t cà các LED trong cụm lại
v đ i nhau. B ạn không ph ả i lo p h ân chia cá c bóng và không bị nhấm . Nhược
đ iể m rất Iđn củ a sơ đố này là hao tổn điện năng vì điện trở chặn sẽ phải có
cô n g s u ấ t cao để chịu được dòng tổng của tấ t cả các LED. Đ iện trở sẽ rất
nóng và nhạnh hỏng. Với sơ đồ này bạn phải dùng nguốn nuôi 5V DC để
giảm bớt hao tổ n n h iệ t trê n trở chặn. C ác loại mạch điều khiển dùng nguốn
5V cũng rất hiếm h o ặ c bạn ph ả i tự làm.
K iểu 2: C ác khối nối tiếp nhau
Với Sơ đồ này, ta sẽ chia cụm LED cần đấu thành 4 khối.

T ro n g m ỗi khối
này c á c LE D sẽ nối chung
t : t ? ị.
cực dương và chung cực W
âm . C á c khối này lại được
nố i nối tiế p vđi nhau. C ụm
LED này sẽ tương đương
Ỷ ¥ w, T- Ỷ Ỷ W
vđ i 4 LED n ố i tiếp nhau. —
Đ iện áp nu ô i cho khối này
sẽ b ằ ng 4 lần diệ n áp nuôi f *■:: Y':. f Ỷ: W
cho 1 LED . D òng điện
tương đương tổng dòng
đ iệ n trong m ộ t khối. tí ĩỊ ¥ ? ĩ
Y

37
CHƯƠNG 1:6IỜI THIỆU THIẾT (Ễ QUẢK CAO H M W IA M C W — m «ọc

ƯU điểm so với kiểu đấu thứ nhất dòng diện sẽ nhò hơn 4 lán vđi
cùng số bóng trong một cụm. Hao tổn điện trên trở chặn cũng giám 4 lán
Việc đấu nối cũng tương đối dễ. Dùng nguón nuôi 12V DC. Nhược d ẻ m là
vẫn phải dùng điện trở chặn có công suất tương đối Iđn. Thường một cụm
khoảng 50-100 bóng ta phải đùng điện trỏ 5 ohm công suất từ 2 w dến 5 w
Kiểu 3: Các cụm 4 tẩng nối song song

T V ịr T f t 1
■ T
T>:, i
r, Ỷ , t :■ ị J

ị-.-: 1N 1 ỉ % - 1
Ị ị
1 ,. 1 Ịk ị.-, Ệ% i
I I
Vđi sơ đố trên chúng ta nối 4 LED đơn nối tiếp nhau và nối vđi một
điện trỏ hạn dòng 220 ohm. Tiếp theo lại nối chung cực dương và nối chung
cực âm của tất cả các cụm này (nối song song). VI đã có điện trở chặn cho
từng cụm nhỏ nên không cấn diện trở chặn như ở mạch tổng quát nữa.
Lưu ý : Nếu không biết đấu LED bạn có thề gặp trường hợp cường độ
sáng của bảng quảng cáo thay đổi khi chạy các hiệu ứng nhấp nháy?
Tại sao bảng LED có hiện tượng LED lúc sáng lúc tối? Hãy xem bảng
LED dưới đây.

**#### .

ỉ? 'W ĩú / ĩf ; W í '. 'W


♦ ******** * ỉ* ♦£ * * * * * ’♦*•* sxữ
\ V jí r g ~ ĩi ..
,v «* w
*m *»« m* *«
I *» , v ** ♦» ♦**“*♦ *•«*•* «<»«•* •»
* * * \ **+■* •+
■ m i: * ! ♦ it * # ! «*
* * ' I I I ” * * ♦■§%* J S K 5 - ♦♦
•#« **
* Ĩ * * v f * * i ?♦«►«» • * V I: ♦♦
«**»* «•**»* v>»
M> t & I i i ' Mb
if * •4m
*
***»«#

38
AfiDUIMO DAW CHOKƯin Tự HỌC CHƯƠNG 1: Sldl THIỆU THIẾT ầắ QUẦMG CÁO

B ảng LED này gốm nhiéu LED đơn, nếu trê n bảng chỉ có vài chữ sáng
thì độ sán g củ a chữ rất cao. Nhưng khi tấ t cả các chữ cùng sáng thì độ sáng
c ủ a các chữ đé u bị giảm đi nh ié u m ặc dù nguổn nuôi bạn chọ n dù dòng để
c ấ p cho tấ t cả cá c bóng.
N g u yên nhân: H iện tượng trê n được g iả i thích như sơ đó sau:

G iả sử bạn dùng nguốn 12 I


V để cấ p cho bảng LED . " I

M ỗi đ è n LED trong hình bên


th ể hiện cho m ột khối đ è n LED trên
b ả ng qu ản g cáo. N g oà i những điện
trở m ắ c th ê m để chặ n cho từng khối
đ è n LE D không được th ể hiện trong
hình thì d â y d ẫ n điện từ nguốn nuôi
tđ i bảng LED cũng có m ột điệ n trở
dù là nhỏ được thể hiện bằng điện
trở R. C á c kh ố i đè n sẽ tiê u thụ m ột
dò ng điệ n là 11, 12, 13. N ếu bạn nối
nguồn bằng d â y đ iệ n nhỏ, dẫn đến
điệ n trở dây d ẫ n lớn, thê m vào điện
trở c á c m ối n ố i thì đ iệ n trở R có thể
cỡ 0,1 - 0,2 ohm.

T u y g iá trị đ iệ n trở nà y nhò nhưng dòng đ iệ n trê n m ỗi nhánh có thể


lên đ ế n 5A (tùy vào số LED ). Như vậy nếu cả 3 nhánh cùn g sáng thì dòng
tổn g cộn g ch ạ y qua R sẽ là 15 A.

Như vậ y s ụ t áp trê n d â y dẳn có thể lên đến:

V s ụ t áp = 15 X 0,1 = 1,5 V.

N hư vậy điệ n áp cấp trên hai đầu bảng điệ n tử của bạn sẽ chì còn là
12V - 1,5 V = 10,5 V. Đ ây chính là nguyên nhân khiến cho độ sáng cù a bảng
LE D giảm đi khi nhiểu bóng sáng cùng lúc.

C á c h kh ắc p hụ c

• Sử d ụ ng dây nố i chịu được dòng lớn (dây có điện trở nhỏ).

• G iả m độ d à i củ a dây dẫn từ nguồn nuôi tới bảng.

• Nâng cao ch ấ t lượng các mối nối, mối hàn.

Ưu đ iể m : Đ è n sáng đều v) dòng được chia rất déu. H ạn ch ế hao tổn


đ iệ n năng tốt. C ó thể nối sẵn những cụm 4 bóng này trưđc khi lắp lên biển để
rú t ngắn thời gian thi công.

39
CHƯƠNG 1: Glđl THIỆU THIỄT KẾ qOẢK CÃD AMOTU I « a c n b N i r tip t

Nhược điểm : Khi gắn lẽn bảng ta phải dùng dãy điện nối rát nhiéu
các cụm này với nhau, dễ bị nhấm.
Nếu số lượng LED lổn thường ta thường dùng nguón có diện áp lớn
hơn 5 V như 12 V hay 24 V để dùng nguồn nuôi có điện áp nhò.Do ápnguỗn
nuôi lớn hơn sụt áp trên LED nên ta cấn ghép nối tiếp các cụm LED
Do mỗi loại LED có sụt áp khác nhau nên bạn cần chú ý khi ghép
LED, các bạn có thể tham khảo sơ đố dấu LED vđi nguồn nuôi là 24 V như
sau (Bạn nên tham khảo sụt áp cho mỗi loại LED với màu khác nhau dẻ’ hiểu
rõ số lượng LED phải dùng khi đấu nối tiếp):
1. ĐỐI VỚI LED MÀU TRẮNG & XANH LÁ, XANH DƯƠNG
• Đấu nối tiếp 6 LED với 1 điện trở 680 ohm, cứ 3 cụm ta có thể chụm
lại thành 1 để tránh sự đan xen nhiéu mối nối, vừa đảm bảo cường độ
sáng và tuổi thọ của bóng LED.
• Trường hợp bảng LED có cụm thiếu LED <=3 LED ta dấu nối tiếp 3
LED với 1 điện trở 1,8 kohm
• Trường hợp bảng LED có cụm thiếu LED > 3 ta dấu cụm 6 bình
thường, còn thừa ta để phía trong bảng để đảm bảo cường độ sáng
đổng đều cho toàn bộ LED.
2. ĐỐI VỚI LED MÀU Đ ỏ & VÀNG
• Đấu nối tiếp 10 LED với 1 điện trở 470 ohm, cứ 3 cụm ta có thể chụm
lại thành 1 dể tránh sự đan xen nhiều mối nối, vừa đảm bảo cường độ
sáng và tuổi thọ của bóng LED.
• Trường hợp bảng LED có cụm thiếu LED <=5 LED ta đấu nối tiếp 3
LED với 1 điện trà 1,8 kohm.
• Trường hợp bảng LED có cụm thiếu LED > 5 ta dấu cụm 10 binh
thường, còn thừa ta để phía trong bảng để đảm bảo cường độ sáng
đồng đểu cho toàn bộ LED.

40
A I I I W lÀ M t M W i l l Tự I f c c m fftc ỉ : n A l C f K VÀ HẨM MỂH A IH IM

CHƯƠNG 2

PHẨN CỨNG VÀ PHẨN MỀM ARDUINO


PHẨN CỨNG ARDUINO
Đ ể có thể thự c hành với bo m ạch A rduino, ta cần có bo m ạch A rduino.
Có nhiều bo mạch Arduino với tên gọi khác nhau như Arduino UNO, Arduino
M ega 2560 M ega, A rd u in o D uem ilanove, A rduino D iecim ila, A rd u in o Lilypad,
A rdu in o Due, A rd u in o Yun, A rdu in o Robot, A rdu in o Tre, A rdu in o M icro,
A rd u in o Fio, A rd u in o Esplora, A rdu in o M ini, A rdu in o Nano, A rdu in o Pro M ini,
LilyP ad A rd u in o USB, LilyPad A rdu in o Sim ple, LilyP ad A rdu in o S im p leS nap ,
A rd u in o Pro, A rd u in o M ega A D K, A rduino R aspberry Pi. Bạn có thể xem dạng
b ê n ng oà i củ a các bo m ạch này ở cuối chương. T rong số cá c bo m ạch
A rd u in o kể trên, có những bo m ạch tiêu biểu sử dụng rộng rãi cho m ột nhóm
ứng d ụ ng cụ th ể nào đó như:
• A rd u in o UN O (Đ â y là bo m ạch A rduino chuẩn, người mới bắt đầu học
A rd u in o nên sử dụng).
• A rd u in o M ega 2560 R3.
• A rd u in o R a spb erry Pi.
Nếu là người m ới b ắ t đầu làm quen với A rduino, bo m ạch R aspberry Pi
là bo m ạch bạn chưa nên đụng tới.
Trong chương 2 chúng ta tìm hiểu chủ yếu phần cứng bo mạch Arduino sử
dụng rộng rãi nhất với giá vừa phải, có đẩy đủ những chức năng cơ bản để điều
khiển đó là Arduino UNO (có giá khoảng 240.000 đ vào tháng 1-2015). Đ ây cũng
là bo m ạch sử dụng xuyên suốt trong các bài tập trình bày trong sách. Ngoài ra,
bo m ạch Arduino M ega 2560 R3 cũng được giới thiệu nếu bạn cần dùng vào
những yêu cầu có số lượng ngõ vào ra lớn cũng như dung lượng bộ nhớ lớn hơn.
M ột khi đã thực hiện các bài tập trong sách, bạn nên tìm hiểu bo m ạch Raspberry
Pi (Tham khảo phần phụ lục cuối sách để có thông tin về bo m ạch này).

N ộ i dung trình b à y trong chương 2 bao gồm các chủ đề sau:

• Có những bo m ạch A rduino nào, có thể m ua bo m ạch A rdu in o ở đâu?


• A rd u in o là gi?
• Tim hiểu đ ặ c tính kỹ thu ật bo m ạch A rduino UNO.
• Tìm hiểu đặc tính kỹ th u ậ t bo m ạch A rduino Mega.
• Sử d ụ ng phần m ềm A rduino lập trình cho vài ứng dụng điều khiển LED
đơn đơn giản.

41
C riM C fc n i l C t K IIẢ nA N M ÍM U M M unoa iM M B H H m

MUA BO MẠCH ARDUINO ở ĐÂU ?


Arduino có rất nhiểu loại bo mạch:
Bạn có thể tham khảo tại website chính của Arduino tại địa chỉ:
ktlp://«rlgiai.ce/ea/Maii/Pridicti
Ở Việt Nam đã có nhiều nơi bán bo mạch Arduino sản xuất tại Ý hay
các nước châu Âu cũng như bo mạch sản xuất từ Trung Quốc, dù đổ của
Trung Quốc nhưng phần mểm vẫn là cùa Arduino. Cho nên, nếu bạn có chi
phí hạn hẹp vẫn có thể mua để học tập, nghiên cứu, sản xuất cũng tốt.
Arduino là gl?
Arduino được lạo ra dầu tiên tại Italy vào năm 2005 tại Interaction
Design Institute. Arđuino ch(nh thức được đưa ra giới thiệu vào năm 2005 như là
một công cụ dành cho các sinh viên của giáo sư Massimo Banzi, là một trong
những người phát triển Arduino, tại trưởng Interaction Design Instistute tvrea
(1 0 1 ). Mặc dù hầu như không được tiếp thị gl cả, tin tức về Arduino vẫn lan
truyền với tốc độ chóng mặt nhờ những lời truyền miệng tốt đẹp cùa những
người dùng đầu tiên. Arduino làm việc trên nguồn mỏ dựa trên nến tàng mạch
mẫu điện tử (Kit), bao gồm một vi điểu khiển, một ngôn ngữ lập trinh và một IDE
(trình soạn thảo). Arduino là một công cụ để thực hiện các ứng dụng tương tác,
được thiết kế để nhằm làm đơn giản những tác vụ dành cho những ngưởi mới
bắt đẩu sử dụng vi điều khiển cho nhiều mục đích (như tạo Robot, trang trl
quảng cáo sử dụng LED, quang báo, điều khiển dộng cơ, điều khiển nhiệt độ,
áp suất độ ẩm...) Arduino được lắp ráp với các linh kiện điện tử, thiết bị điện-
tương tự như trò chơi lắp ráp Lego, nhưng Arduino vẫn đủ linh hoạt cho các
chuyên gia phát triển các dự án phức tạp. Vào năm 2008, Arduino bắt dầu được
một số thành viên trong các cộng đồng giới thiệu trên các trang mạng nhưng
cũng chỉ phát triển gói gọn trong một số chuyên viên mà thôi. Nếu chịu khó tra
cứu từ khóa Arduino trên mạng, bạn sẽ truy cập không biết bao nhiêu trang web
cho phép bạn tài về các Ebook cũng như các bài hướng dẫn (tutorial) kiểu bắt
tay chỉ việc học lập trinh điều khiển Arduino từ cơ bản đến nâng cao.
Tại các nước phát triển Arduino đã xâm nhập đến cà những học sinh mói
học cấp 3 sử dụng cả Iphone, Ipad để điều khiển từ xa máy bay, vật thể không
người lái, các mạch báo động lắp ráp trong nhà, lắp ráp các loại robot khác
nhau trong khi các học sinh đó đâu được trang bị sâu kiến thức Điện-điện từ
bằng các các sinh viên chuyên ngành. Vào năm 2014, Arduino Uno có lẽ là bo
mạch tốt nhất dành cho các bạn sinh viên, học sinh muốn tìm hiểu, nghiên cửu
về vi điều khiển để ứng dụng trong cuộc sống, trong công nghiệp, trong khoa
học, thi Robocon... Vi điều khiển trong bo mạch Arduino như là một máy tinh
đây là bộ não của một hệ thống nhúng. Arduino là sự kết hợp giữa phần cC,rig
và phẩn mềm chạy trong một môi trường dễ dàng phát triển tạo các mẵu mđi

4Ỉ
U II M I A H CM K r tlT fM C a r « t M Ấ 1 O TK n n h v Ế H U M M

Đ â y là nền tản g cho các dự án (bài tập) m à ch ú n g tôi sẽ hướng dẫn


bạn thự c hành trong các chương sắp tới.
M ộ t vi điều khiển là m ôt m áy tính nhỏ với m ột bộ xử lý và bộ nhớ có thể
điể u khiển cá c chức năng củ a nhiều th iế t bị đã và đang sử dụng. M ộ t số vi
điều khiển được th iế t kế giúp kế t nối dễ dàng với m áy tính để lập trình cho các
m ụ c đích ch u yê n ngành. A rdu in o là m ộ t ví dụ về m ột trong cá c vi điều khiển
dễ d à ng lập trình để xây dựng cá c thiế t bị điện tử bô i vì bạn có thể kiểm soát
chức năng theo yêu cẩu th ô n g qua m ã (code). Vi điều khiển có thể điều khiển
và kiểm soá t củ a cả hai đầu và o và đầu ra. Ví dụ, bạn có thể làm nhấp nháy
m ộ t đèn LED bằng cách k ế t nối nó vào m ộ t châ n (pin) trong bo m ạch A rdu in o
cụ thể với m ã điều khiển cho p h é p cỏ dòng điệ n tại m ột chân trong m g iâ y và
sau đó tắ t trong n giây. LED là m ộ t ví dụ củ a ngõ ra, bạn cỏ thể điều khiển
LED b ằ ng cá ch sử d ụ ng m ột cảm biến, nút nhấn, ch u yể n đổi, hoặc m ộ t th iế t
bị khác từ đầu vào.
Hình bên là bo m ạch
A rd u in o UNO đ ặ t trong bàn
tay m ộ t người trưởng th à n h để
bạn có thể hình d u ng kích
thước th ậ t c ủ a bo m ạch này.
Hình trang bê n là m ặt
trước củ a 2 bo m ạch A rdu in o
UNO. Nhìn tho áng thì th ấ y 2
bo m ạch này g iố n g nhau,
nhưng nhìn kỹ b ạ n th ấ y m ột
số khác biệt.

V ề cơ bản, các ch â n ngõ và o và ngô ra trên bo m ạch như nhau nhưng


m ột số linh kiện â vị trí khác nhau. K hác b iệ t dễ nhận thấ y là n ú t nhấn R eset.
M ột m ạch thì n ú t R e set thì bố trí ở góc trẽ n bên trái bo m ạch, m ộ t m ạch thì bố
trí ỏ giữa bên phải bo m ạch.

M ặt trước bo m ạch A rduino UNO


mạch Arduino Uno.

BO MẠCH ARDUINO
P in s O -13: Pins 3.5.6,94041:
USB-to- Digital inputs Analog Outputs I
(PWM) pf
Trong hướng dẫn dự án đầu tiên này, giả định là bạn sẽ dùng

or ouỉpirts
SeriaỊ Reference
Ground
3
controller input
11 Pins 0.1:
\ s Serial

I
MA^'E #
fc'Y f/rrvrY
o f o pTv»
l B ọi r« rN rr or -o i, i í ,,,, JJ
VÀ CÁP USB

I
*»■ «-» * *________PKJTAI. P»V>!X~)

USB : 4 ! ! J G O iy N Q i ►Reset button


----- ML mm ARDUINO

JI_
tMJtf V.ÍN«* ' V«*
■Microcontroller
« .» L- _
__
__
__
__
__ _
__
__
__
__
__
__
__
__
__Ỉ
9-15V DC POW0J ANALOG I N A
voltage input SSkSil

Pins AO - A5:
i
Voltage Analog Inputs i
BOMẠCH Reset outputs (can also function
I
mốt bo

(connect to ground as
ARDUINO UNO to rew t) Ground a s digital
d « n a "I/O)

a
Connected directly to 915V DC voltage input 1
A i n m i I km c u le iii j y i t CStftfNC I: nku C tM V* H Ấ IM Ế M A IM U H

N ếu bạn cỏ m ột bo m ạch A rduino khác, bạn ph ả i đọc những trang


hướng dẫn tương ứng để sử dụng bo m ạch đó. Bạn cũn g cần m ộ t cá p (cable)
USB ch u ẩ n (A plug to B plug), tương tự cáp m áy in (USB printer)

P hần th ô n g số chi tiế t kỹ thu ật của bo m ạch các bạn có thể tham khảo
ở phụ lục cu ố i sách.

KIỂM TRA (T E S T IN G ) MẠCH ARDUINO


Bạn đồng hành với cá c phần cứng A rduino là phần m ềm , m ột tập hợp
các hướng dẫn ch o c á c phần cứng phải làm gì và làm thế nào để làm điểu đó.
Hai loại phần m ềm có thể được sử dụng.

Reset Button Ground Digital Pins

p . r £ < M j o 3 2 1 o a * 7 6 5 4 3 2 1 0
' i ị ' 0.0.1* — ' si
'Pin 13 LED
«381 ĩ l l ĩĩ. Ỉ i /
® *I?
4&X RX
A rduino ŨNÕ';«3í>ũn^Ẹ—
---------- ---
-S
•Power UED
083 'RX/TX LEDs
oo
ICSP

-M icrocontroller
B v>r«ww*rnuK»oxc
cc r> POWER A N A IO G IN

2 £ S5V Gnd V in 0 1 2 3 4 5
________ncteBiH isaasi ỊõỊgroioiHiiiBnf
Power Jack Power Pins Analog Pins

USB Socket

45
emrtfNS t (VẮNCfK VÁ PIẮI MÍM UMM Ằ tw iẩ m a i r t i T | I|C

Phần mềm IDE được cài đặt trên máy tính cá nhân của ban vả được sử
dụng để soạn và gửi bản phác thảo cho bo mạch Arduino.
Đầu tiên là môi trường phát triển tích hợp (IDE), được thảo luặn trong
chương này và thứ hai là Arduino phác thảo mà bạn tạo ra.

Để kiểm tra bo mạch ta thực hiện như sau:


• Khỏi động phần mềm Arduino.
• Nối cáp USB từ máy tính tới mạch Arduino Uno R3 (chú ý khi mua
có kèm theo cáp nối). Đèn Power LED sáng cho biết bo mạch được
cấp nguổn.
• Nhìn trên mạch Arduino, tại chân RX và TX, ta thấy RX/TX LEDs sáng
nhấp nháy.
Điều này cho la biết: Mạch Arduino mua về cơ bản là tốt.

PHẦN M ÉM ARDUINO
Để có thể thực hành với bo mạch Arduino sau khi tìm hiểu phấn cứng
chúng ta tìm hiểu phần mềm để lập trinh Arduino.
CÁCH TẢI CHƯƠNG TRÌNH ĐIỀU KHIEN
Arduino làm việc với mã nguồn mở. Nếu muốn tìm hiểu thông tin chi tiết
về Arduino bạn có thể vào trang web sau: http ://a rd u in o .cc
Bạn có thể tải chương trình từ trang chính của Arduino tại đường
dẫn sau: http://arduino.cc/en/Main/Software.

rót CJ» W. Immc Im


' ss
/ ộ ộ - <S%
Ỷ/ P>X«1«<«»: W(*«2 V fc>ìont í V. <■ ífcg i-9C**» WM'i*

Axduino IDE

Arduino 1.3.6
CfeanarSoXvarí
ã-ì:v:x-':ĩìí (:««•>*::•:«•/>. y«t

íV.ylu*, - Ì!W SỈ.V-. v»:> :.:>ĨMÍ*K


e í*r»
W’UK'M'.
'oe-s  ic k â n o 1 s 3 BSTA í w it h s u p p o rt f o r A r'. ;■ **
M
K.VX.*AVA5ÌZ-)Ĩ Yu~ and A iciu x^o Due b c s ĩ ó ỉ '
Nhấp chọn tab Download sau đó kéo xuống phần Arduino IDE và nháp
vào link Arduino phiên bản mới nhất (ò đây là A rduino 1.0.6).

46
U N M • À H CM K i l l T f l f c O M R ỉ: P IỈI a m ú n íu ìấ u u m m

Lưu ý: Tủy vào thời điểm bạn tả i về mả phiên bản có th ể khá c với phần
trình b à y trong sách.
Sau khi n h ấp ch u ộ t ta có m ộ t danh sách ph iê n bản hệ điều hành
dow nload, bạn có thể dow nload (tải về) theo hệ điểu hành mình đang dùng.
T ùy vào hệ điều hành mà bạn chọn phiên bản tương ứng, ở đây ta chọn
phiên bản hệ điều hành tải về là W indows Installer hay W indows (ZIP file) để tải
chương trinh về m áy tính của bạn.

- Windows Installer, Windows Zip file (for non-administrator install)

N h ấp và o W in d o w s In s ta lle r, bạn chờ để m áy tính tải về A rduino


1.0.6 IDE.
Du \0 aptfi <nn v t atfofrw-I.Q.fr-wipdoij'l] Q2J r*g) fft*n Ìiiliãnint? ị wCincd

N h ấp chọ n S ave > Save as trong cửa sổ mới mở

H ộp tho ại S ave A s xuấ t hiện, chỉ đường dẫn tới thư m ục lưu file sau đó
nhấp Save.
LƯU ý : N ếu m á y tính bạn đã cài đặt In te rn e t D o w n lo a d M a n a g e r sẽ
giúp v iệ c tải về nhanh hơn.

Ầ ' L, • ' SareA* 7± T r~ T ~ M


© - t .íi « *75£-4 (Ft) > 0 C H U O N G T R IN H ► V C- S M fth V CM J O N T S IN k fi

ỡrganiíe Newfokter ?= - ử

D o w n lo a d s A N i.-r.e 0 A t 'T 'e oifie d Typ* A

ịgịỊ Desktop [M iy tin h .e d u v n l& c k W t n ? C J .'O S 'iv ia 1?:55 “-•1; ío icỉiH

& OneDnve :ỷ i A d o b e O eafave C lou d Z i W X U 17:35 F*te fix tte i

C H U Ũ N G TR JNH KIEN TR UC 2 & M 2 3 U 1 5:: 3 •C:U fiS ce r


& nK diíchsỉk nhỵiặi
:fcr C O K H l Ĩ 2 í ỉ ữ ỉ ỉ z u P :vsl '\ \ i f
y»l ThisPC
:i< CHEN S i/2 01 4 l i ‘ 10 r . le f o ilie r
liberies :p: : ị ỉ DO H O A r - ls f o it e f
1 Ỉ S U 'Ỉ Ữ U » 3 Ỉ
*§. *GSDVANGall ■M F ikZ rtl» -3 .?v.1 K U K i? ? ;lc
$9?Netwcrtc ||i| GIA O D u e 1*15 ?:U fc -c ti

*•£ Ho^negrcup i_. 1SPRING S U T t v & e V i. u ':>< fc - c tr

Control Panri - i\ KatỗOke Builoef S tud io V3.0.í<ỉũ CSV: V t C K 11: J t ” - l i fc-tie r V

FtJt naiwe »fdư>ro- 1.C.6-kvtndov%^l) V


s* * t *4 ụ p c 6-W1NDOWSI1] File r*-w m d ow O D V

• V HiđeFo«đef*

47
CUiM £ nkuClK VÀ PIẨI HẾU W T f« c

Nếu nhấp View download ta sẽ thấy cửa sổ như hinh dưới cho biết
dung lượng file tải về (52.5 MB) cũng như thời gian còn lại để tải vé loàn bỗ
chương trình.
i9%0<»4Jino- l£.&-«f'nđowi(1)d3wfc»tfed nm*>43'<<cmn»t>nqr-^1

view and track your downloads í ironh Ểcmbadí P ■

Nsrne L c c a t io r Actions

a r d _ 6 - w in d o w s [1 ] 5 Ì5 M B 51% et25 5K5/scc


Pau5€ CancH
j

Nếu bạn tải về file nén, dung lượng file tải vế sẽ là 93 MB thay vl
52,5MB nếu là file cài đặt. Tuy nhiên chỉ cần giải nén file này sau đó cài driver
là chạy được Arduino.
Sau khi tải về file nén, nhấp chuột phải vào file và chọn Extract files
như hình dưới.

............................
Name open
336 Extract files...
8 3 afđumơ-1.0.6-wínđows,zĩp Ỉ B

3 Extract Here
Jỉ
Cửa SO m m m m m rn
1

Extraction path O erttĩể 'A dvanced'

and options như Destination path ( * i be ơeated if does not exist) o m

h ìn h bẽn xuất V: Hem kàtkr

hiện. W i Desktop
: ífị}Extract and replace fies * : ị
ử 4 OneĐrive
Chọn đường ! 0 Extract and update files

dẫn bung file sau


exBfcng fifes arty iị M-S}TNbPC
Ị ề" jặ Desktop
Overwrite mode Ị ị (♦!--:£, Documents
đó nhấp OK để ! I Downloads
(•> A w before overwrite
thực hiện. o Overwrite wrthout prompt
í Ị ổỉ":jjị> Muse
í j ỔK Pidue*
o Skip exBtng f l «
I ; Ể K |U d e o i
; o Rename automaticaly Ị i ầ-xị* 4750-WIN7(C)
I Ị 4 -^ 4750-AINXP(p:)
W jcebneouj
ị I *7 50 -3 £ : )
E x tÕÍ.Iarrhves to silfc b a rs 4^ 4750^3=:)
LJ Keep broken Ses I : &*1ơ</0RwO'1**(GO
l ị ® -i 8G SO VANG (H :)
Q Ospfay fic i r> Exptofef
ị libraries
ị ệ -i I 8G 5D VANG (H:)
Save sitin g s
! Network

48
ABDUMO d a Nl CIO N ttrdl Tự IOC -CHƯƠNG 2: PHÁN CƯNG VA PBÁH M ĨM AIDUIHO

H inh bên là thư


m ục sau khi đã giải nén
chương trinh cài đặt.
N hấp Ctrl + A chọn
hết các file và thư m ục
trong thư m ục cài đặt sau
đó nhấp c h u ộ t ph ả i và
chọn P roperties.

T rong cửa sổ mới mỏ Add to archive...


ta sẽ có th ô n g tin về dung Add to “a.rduir»o-1.0.5jar"
lượng cù a chương trinh. Compress and email...
Campress to "*Fduino-1.0.5.rar" arvd email
L ư u ý : N ếu bạn tả i
Send to
về p h iê n bản Arduino 1.06
có dung lượng -9 3 MB, khi Cut
bung ra có dung lượng Copy

(-2 6 0 MB) tương đ ố i lớn so Create shortcut


với file nén tải về.
Delete
R enam e

Properties

G iải file nén ra, vào thư m ục drivers và chạy file dpin st-x86.exe nếu
m áy bạn đang cài W ind ow s phiên bản 32 bit hoặc d p in st-am d 6 4.ex e nếu là
phiên bản 64 bit.

Ị i , d r iv e r s 2/21/22146:11 ?M Filefolder
,|ị examples 2.'2t/,2014 5:11 PM File foider
ị. hardware £ 8 /2 8 1 4 6:11 -1M File folder
.!■> I-ÍV3 .:i ì Í4 ftúỉ 3M File folder
i , lib ------------- File folder
: libraries 2/2Í/2C14 6:U PM File fcider
i. reference 2/2L/2Ũ116:11 ?M File folder
tools 2 / 21/ 20 1 4 6 :1 1 P M Ftle folder
^ arđuino.exe 2/21/2014 5:11 PM Acpi!:=t:c - 1
ỔỊ& atduino_debijg.exe Z;a/2Ũ14&U PM
('ị: cygiconv-2.dll 2/21/2014 6:11 PM Apsiicĩt:!;'! esten:..
i ầ c y g w iril.d ll > 21/JC14 o :li PM Àss:j:5t:c-Ĩ .
■ứ:libusbO.đil 2/21/2214 6:11 ?M A p s h c i'ic i e/terii..
ị revĩsions-txt 2/21/20146:11 ?M Te>? D c a .r ^ n t

49
CHƯƠNG 2: PHÁN CƯNG VA PHÁN M É M AKDOINO A IIIIM lA li « K M IT fJ P C

Name Date mcdrtcd T>p«


j : FTDI USBDrivers 1c.'09/201-Í • F: ef 0d*‘
ardjino.cat W0Ỉ'20U 15:^6 cr.à-0 - ■kỉ
arduino.i-nf 16/05/201' 5.“V Setup Iricrmsncr. -<£
Ị dpinst-Bmd&i.exe 16/CÝ/2014 ':5:ic Appi-canc-t V.w-kE
^ dpinst-x86.exe 16/05/201415;46 App::csticn K • <£
jg : Olcl_Arduin.o_Driver5.rip ie ;& w u Ỉ Wc VVinP.AR, Zl? sr»:hr. c
: ; README.txt Text Docjrntn: • <E

Device Driver Installation Wizard - : • -

Welcome to the Device Driver


Installation Wizard!
Thus wizard helps you install the software drivers that some
computers devices need in order to work.

To continue. cBck Need.

Bock [ Cance

[3 Window's Security

Would you like to install this device software?

Name: Ardum o USB Driver


. j - P u b l i s h e r : A rdu in c LLC

p/| Always tru st software fro m "A rduino LLC". Install ị Don't Instdl

® You should onlv install driver softwvsre fro m publishers YOU trust. H e * :?
decide v>;hĩch de/ice scftvvsre i: Sfffe ro instaii?

50
ARPUIWO DANH CHO NGƯƠI ĩự HỌC CHƯƠNG l: PHẤN CIỈNC VÁ PUẮN MÉM AKDUINO

B ạn đợi trong giây lát, chương trình xuấ t hiện cửa sổ như hình dưới với
thô ng báo chương trình đã cài đật xong Drivers. Nhấp Finish kết thúc.
w ,ys/Ạ'Ị yy/W Ả > Ả -w . '/y?:? "-------------------------- -
De>/ice D riv e r i n s t a ll a ti o n W iz a r d ị
Ww-
Completing the Device Driver
Installation Wizard

The drivers were successfully installed on this computer.

You can now connect your device to this computer. If your device
came with instructions, please read them first

ị Dnver Name Status


ị s/iArduino LLC (www.ardui... Ready to use

r Back [ Cancel
fel
T iếp theo, bạn nối bo m ạch A rduino vào m áy tinh, m ột thông báo
Installing device d rive r so ftw are xuấ t hiện cho biết chương trình đang nhận
dạng bo m ạch. Lúc này trê n bo m ạch ta thấy, đèn LED ở góc phải sáng lên.

ÌÍ5MKS&SXKKSỊ*....... ■— ■— ■- - ■■/...... .V.V...V....V.... . . . . . V


M áy tính sẽ nhận
C o n t 'o l P a n e l (3 )
diện vào gắn tên 1 cổng
L>tíV*e Mdnaợer fL
COM nào đó cho th iế t bị
&& View d evkes and prrmterĩ
của bạn. N hấp vào biểu
tượng W in d ow s ở góc
■M Update device drivers 1
See m ore results
dưới b ê n trá i m àn hình 1
sau đó nhập device I device manager X • i S hut d o w n 1 ► ị
m anager và chọ n Device
M a n a g e r như hinh bên.
ÌP s Ễ É í iỉ ú l
• ! ’ V

SI
CHƯƠNG Z: PHẤN C0NG VÀ PHÁN MỂM UDDINO U I I I M IẲ U b i K W l T < BBC

Cửa sổ Device Manager như ■jSfr Devke Manager


hình bên xuất hiện. Nhấp chọn Ports
Rte Actiorv Vtew H*ip
(COM & LPT). Do bo mạch sử dung
m \® B E i i'j
là Arduino Uno nên bo mạch được
nhận diện như hình bên với cổng * ^ STKBGOK
ỉ> Batteries
COM được gán ở đây là COM4.
ỉ> C o m p u te r
Lưu ý: Giả sử bạn vẫn dùng cáp kết ì> - £ ĩ í Disk drives
nối USB đó nhưng gắn vào bo mạch ì> D isplay adapters
ì> Ữ V D/CD -RO M drives
Arduino khác, ở đây ta sử dụng bo
H u m a n In te rfa ce Devices
mạch Arduino Mega 2560 H3. Một í> C £ IDE ATA/ATAPI controữers
thông báo Installin g device driver i> Im a g in g devices

softw are xuất hiện sau đó thông ỉ> Keyboards


. -a M tce a nd o th e r p o in tin g úevices
báo như hình dưới cho biết cổng
i> s * i M o n ito rs
COM được gán ở đây là (COM5)
ỉ> ~ iỆ - N eU vork a dapters

s_ ArduirioMega 2560 'COM5' * x ữM i Portable De/ices


***& D e v ic e d r iv e r s o ftw a re 'trts ta ììtd s u c c e s s fu lly . Aj ^ Ports (COM & LPil :
A rđ u in o Ur>c (C OM 4)
ĩ> r i ì Processors [*■_________________

Nếu mở lại cửa sổ Device •;J ỊỊiẶi M onitors


Manager sau đó nhấp chọn Ports ;> ~ :|f Network adapters
(COM & LPT), ta sẽ thấy như sau: V jBfc Portable Devices
Như vậy là máy tính đã nhận J ỵỆ Ports (COM & LPT)
diện thiết bị của bạn rồi, hãy theo I ....Arduino Mega 2560 (COM5j
các hướng dẫn trong sách để thực ;> n Processors
hành với bo mạch Arduino. :> H i SD host adapters

(<-) (3) This PC ► 4750-4 (F:) ► OCHUONGTRINH ard u in o -1.0.6*’/Ã n d o w ỉ » a rd utn o-l.c.6

A . Cn eDrtve 0«T“ m o d ifie d T;~

•; nhasachstk nh asa chitk


: driven
■I This PC example!
Jig Desktop , harsware

:|-i Documents > java


D ow rtloadi

M u iif
, rfc'etcoce
£ Pictures
. toefs
s V id e c i A 1
* 4730-WIN 7 (Ù ) ardjtno.debug.exe
i i * 4750-WINXP ( W Ũ cy<ỹccnv-2.á I

^ 4750-3 CEO V cvgOTnl.fll


^ tfbjSb'j.aB
■ k 4750-4 (F:)
fe-.iSfcnstxt
v4> DVD RW C ru e f.Gsi

> 5G SC v a n : -h ■

52
ABDUIWO ĐANH CHO NGƯƠI ĩự HQC CHƯdNB 2: PHÁN CỨNG VA PHẦN MÉM ABDUIWO

Khi giải nén tập tin tải về,


n h ấp đúp và o thư m ục để mở m .
M B —
nó. Có m ột vài tập tin và thư
ARDUXNO
1
u p p w
m ục con bên trong. N hấp dúp
v à o file a rd u in o .e x e . vagt f

B iểu tượng chương trình


như hình bên xuấ t hiện. ■■ ■ ••
VMQ m 0*CT5iÓK. V u i r t VXL *JP* ra*
1
Sau đó là cửa sổ giao diện làm việc của chương trình như hình dưới xuất
hiện. C h ọn Tool > Board sau đó chọn bo m ạch A rduino mà bạn đang kết nối
với m áy tính, ở đ â y ta dùng bo m ạch A rduino UNO nên ta chọn Arduino Uno.
^ $<etch_nay27a ị Ardu*x> LO 5-r? ;

obfsl Help
A uto Format
Archive Sketch

Fix Encoding & Reload


ATm e^jr
Serial M om tcr
Ardưino Dtecimtla or Ouemilenove v ;/ ATmegaI63
Board

!
Ardoino f'-idno w / ATmega323
Serial Port Arđuino Nano w.; A7megai68
A rduino Mega 2560 or Mega AE>K
Programmer
Arđuĩna Meg3 (4Tmegal2£0;
Bum Bootloader
A rduino Leonardo

Kiểm tra bo m ạch A rduino (Testing Arduino)

T rong p h ần trước trình bày về phần cứng có phần nói về kiểm tra bo
m ạch. Nhưng do chưa trình bày về phần m ềm nên sẽ hơi mơ hồ với bạn đọc.

Phần trình bày sau hướng


dẫn các bạn chi tiế t hơn cách
kiểm tra bo m ạch.
• Khởi động phần m ểm
A rd u in o phiên bản 1.06
bạ n đã cài đặt.
• Lắp ráp LED như hình
b ê n ta thấy: C h ân dài của
LED (A no de ) nôi với ngõ
D13, châ n ngắn cùa LED
nối với chân G ND.

S3
CHƯƠNG 2: PHÁN CỨNG VA PHẤN M É M ARDUINO U I I I U I A * EM K H I I I I I I

• Trong khi hình trên bẽn


phải ta thấy: Chân dài
của LED (Anode) nối với
ngõ D12 qua điện trở hạn
dòng, chân ngắn của
LED nối với chân GND. 'ấ

s
Câu hỏi đặt ra là tại sao
mạch bên trái không dùng điện
trở khi nối trực tiếp vào bo
mạch. Câu trả lời là: Chân 13
« 3 ■' * V 8 y iU M
đã có điện trở nội IkQ bên » 3 i ị i * úti-m _ ( / >; «;
trong. Nếu chúng ta dùng chân ■ m n ỉ
12 thì bắt buộc phải dùng điện A rduino
trở đấu nối tiếp, ở đây ta lập
trình cho mạch điện trang bên:
Chân dài của LED (Anode) nối
với ngõ D13, chân ngắn của
.. 2» °**4* §
LED nối với chân GND. P I I I Ỉ I V Ỉ

Nối cáp USB đi kèm với bo mạch


lừ máy tính tđi bo mạch Arduino Uno
(Chú ý khi mua bo mạch phải có kèm
theo cáp nối), cần phải hiểu lập trinh
Arduino, từ màn hình soạn thảo IDE
chọn File > Exam ples > 01. B asics >
B link.
Đây là một thí dụ có sẵn của
Arduino thường dùng để kiểm Ira bo
mạch Arduino mói mua vé và là bài tãp
đầu tiên khi ban bát đầu học viết code.
:
skgtch_dec14a Ị Arduino 1.0.6 3 W M
Edit Sketch ĩ o c ls Help

New C trl+ N K 1
Open... C t r l* 0 01 Basics ► Anal ogR ea-
Sketchbook ► O i.D g ita l ► EareM in.ry ;rr

Examples ► ŨÍ A na lo g ► e in k
Close C trk W •>i.c ĩro m tiO Ìc d tic n ► D g ^ .-P - i
Save C trk S O S C ír-tr?! ► Fade
Save As... C fi- S 'r **.-5 06 Sensors ►

54
ARDDIWO DflHH CHO NGƯƠI Tự HỢC CHƯƠNG Z: PHÁN CỨN6 VA PHẤN MÉM ARDUISO

Chưa cần hiểu từng đoạn code của ví dụ Blink làm gì, bạn chỉ cần hiêu mục
đích của đoạn code trong vi dụ này là điều khiển một đèn LED tại chân 13 sáng 1
giây sau đó tắt 1 giây và cứ thế lặp đi lặp lại. Sau khi bạn nhấp chọn B lin k, trên
màn hinh xuất hiện cửa sổ như hình trang bên với đoạn mã xuất hiện:

T ills example code 13 i n th e p u b lic doit&in.

V.o đ i ỉ i e â 3 Kay 20XA


b y S c o tt F i f c s g e i i t i d

/./ th e s e tu p fu n c tio n ru n s once w hen YOU PL£2S o r p o w ftE th e

v o id setxqp () {
i f r n i t i s l i 'i s d ig r itâ l p in 13 as an o u tp u t.
pinW ccte( 1 3 , O UTPUT);
}

Ỉ / Che loop fu n c tio n r.'.ms overr. t-M'A ơve/. e g a ỉn £ocev«r


v o id lo o s () {

tìj.Ợ*: to •Ur 1.fce (13, H-lGH) ; / / tu r n th e LSD on (HIGH i s thf: OTi.ltữgỊiị:


dftiay(lOOO); ơ ô i t r o t a second
C Ì.Ìgir s i K r . i t f : ( 1 3 , L O U ); tu rn che IS D o f f b y K a fc in g th e v o it |

d e l a y (1 0 0 0 ); / / w a it f o r a second

Bạn nhấp và o V erify (biểu tượng

MI)
i) để kiểm tra code củ a ví dụ Blink.
M ộ t v ệ t sán g lan dần từ trái sang phài ở
phía dưới m àn hình cho biết chương trình
đang biên dịch đoạn mã.

55
CHƯƠNG 2: PHẤN GỬNG VA PHẤN MÉM ARDUINO U I I I M M B CM K H I '1 ICC

Kết thúc, một thông báo như hình dưới xuất hiện cho biết đã biẽn dịch
xong chương trình.

Kế tiếp, bạn nạp chường trinh Blink vào bo mạch Arduino. Nhấp vào

biểu tượng Upload có hình để tải đoạn chương trinh vừa biên dịch lên bo
mạch Arduino. Đèn LED RX và TX trên bo mạch chớp tắt. Nếu việc Upload
thành công, thông báo "Done uploading." xuất hiện trên thanh Status bar.

(Lưu ý: Nếu bạn dùng bo mạch Arduino Mini, NG, hay bo mạch khác bạn cắn
nhấp nút Reset trên bo mạch trước khi nhấp nút Upload)

B lỉn k ị Ấ rd u in o 10 .6 ~ a HB!
File Edit Sketch Tools Help

liá + iệ l i * Upload

1 Blirik

Cửa sổ Serial port not


S e r ia t p o r t n o t f o i m d
found như hình bên xuất hiện
với thông báo cho biết: Không
Serial port COM1 not found.
tim thấy cổng COM1.
Retry the upload W ith another serial port?
SS: Portable Devices
:£OM4....................................................
A - 0 1 Ports (COM & LP T ):
j Arduino Uno (COM4) OK Can-Ccỉ
£ 3 Processors ^

Điều này xảy ra vi măc định của chương trinh khi khài đõnạ = COM1
trong khi cài đặt bo mạch Arduino UNO rnáy báo cổng cho Ar z. - - _ J nũ
là COM4.

56
AKDUIWO P A HH CHO NGƯƠI Tự HỌC CHƯdNC 2 : PHÁN CUNS V Á PH Ấ N M É M A B D U IM

T rong cửa sổ Serial Serial port not found


port not found ta nhấp
OK chấ p nhận CO M 4 là Serial port COM2 not found.
cổn g truyền. Retry the upload with another serial part?
COM4

Cancel

M ột v ệ t sáng m àu xanh lan dần từ trái sang phải cho b iế t tiến trinh
Upload đang thực hiện. Sau đó hàng thông báo như hình dưới xuất hiện cho
b iế t kết thú c việ c Upload.

:ỉ ĩ I IĨ I S =1 I II m m m m ■ ife iip iti

B inary sk e tc h 3 i i e : 1,064 c y te s (of e 32,256 Dyne ạaxỉsuB ) 1


B iíisry s i e tc h a iz e : 1,084 b y te s (o f a 32,256 b y te m a x ix a t)
1

i Alduifto u«0 on COM4 0

Nhìn trê n bo m ạch A rduino UNO ngoài đèn LED m àu xanh bên phải bo
mạch sáng cho b iế t đang cấp nguồn, tại chân 13 ta thấy LED màu vàng cam
sáng nhấp nháy 1 giây. Đ iều này cho biết bo m ạch A rduino Uno tố t cũng như
đoạn mã lập trình tốt.

B ạn đã kiểm tra xong bo m ạch Arduino, b iế t cách Upload đoạn mã lập


trình và o bo m ạch. Trước khi thực hành điều khiển LED gắn và o chân D12
qua điệ n trở và châ n G ND cũng như thực hiện các bài tâp phức tạp hòn ta cần
tim hiểu giao diện và cách sử dụng phần m ềm .

57
CHƯƠNG 2: PHÁN CƯNG VÃ PHÁN M Ể M U D 0 » 0 U IIIM I M c * K H I T l Ịệ C

TÌM HIỂU TRÌNH SOẠN THẢO IDE CỦA ARDUINO (MÕI TRƯỞNG VIẾT
CODE CỦA ARDUINO)
C- ; SííokỊ ArđuìoolM- -
Comm and T in e B or
A re a •>L items
0 0
KS3 WZS I» i
k:>ns
m l Ijp illii! ! i l B p f
3 1
1 (
J>: ĩ tr x x ỹ r .ờ ă i f li; t o r a .il :5I;C*Ĩ.

v o x ii l o o f i O {
1
/ . ' pu u y o u r a a i/i c o d * h * i “ , i n r u n te p ĩa te d lv :

Text Area •*

Message ^
W in d o w Are<

Môi trường IDE tạo ra vùng soạn thảo để viết code gồm 3 vùng chính:
• Com m and Area (Vùng cửa sổ lệnh).
• Text Area (Vùng soạn thảo lệnh).
• Message W indow Area (Vùng cửa sổ thông báo).
Chúng ta sẽ lần lượt tim hiểu 3 vùng này.

1. COMMAND AREA (VÙNG CỬA s ổ LỆNH)

ÍT Biinkị Aìđuino 1.0.6 - n iiS


File Edit Sketch Tools Help

Command Area CÓ 3 thanh bar là: Title bar (Tiêu đế tên dư s ' Menu
Items (Thanh các Menu) và Icons (Thanh các biểu tượng).

58
ABDDWO OANH CHO NCtfifl ĩự IfC CHtftfNC ỉ: PBÁN C ÍR í VÃ PIÁN MỂM AHDUINO

T ittle b a r

M enu item s có 5 m enu bao gồm File, Edit, Sketch, Tool và Help.
^Fiie Edit Sketch Tools H«lp

M e n u F ile.
vis.-'/ts./■/•;>/.■*/,..>.-iX-.-ỉỹi.'. :■
R e Edit Sketch Tools Help
M ục File có nhiều m ục (con) phụ
New Ctrt*N
với m ục đích xử lý cá c tác vụ liên quan
Gptn... C trf» 0
đến file tương tự như m enu File của
Sketchbook *
M icrosoftW ord.
Examples *
N ew (Phím tắ t C trl + N): Mở dự Close c t ; i* w

án mới để viế t code. Khi nhấp New, Save C tit-S

cửa sổ như hình dưới xu ấ t hiện, ỏ giữa Save As-, Ctri* Shift-s
Upỉoứđ C trf*u
sổ có nền m àu trắng là vùng nhập
Upload Using Programmer Q rt* 5 h ift-U
code, tên file chương trình gán m ặc
định là s k e tc h ju n 18b. Phía dưới cùng Page Setup Otri*-Shift*-P

bên phải thô ng báo A rd u in o U no on Print C trf* p

COM4 cho b iế t cổn g sử dụng. P re fe f Ơ 1 C K C trl-*-C o m m a

Quit C trf*Q

$tetdi_dec14& ị Afd«sfiO .1,0,ộ

1 3 1 1 1 1 B
, . . - .
C-1 4 ó . . %' x ỈJ xì-.-ỳí 5 s&sw i § r ■

V Ù N G NHẬP CODE

O pe n (Phím tắt C trl + o ): Mỏ dự án cũ để sao chép hay sửa chữa.

58
CHƯƠNG l; PHÁN CƯNG VÀ PHÁN M É M U N M U 1 IIM IA JB t u K H I T I MC

Khi nhấp Open, hộp thoại Open an A rduino sketch., xuất hién yẽu cắu
bạn chĩ đường dẫn tới file dự án cũ trong khung Look in, sau do chọn file và
nnấp Open để mở dự án này.
ít- Cpen
' an Arauxto
.J 'T "'sketch...
' 'Z'/WMW/ “vm m m ;' "m m # ■mm'"”-'■"***#■■ m A P

: $ ■* >:* o -
N am e ^ D ale m o d ifie d T y pe je t

,ịỷ drivers 1 ' 1/8/2 01 4 8 * 5 PM file fo tde r


Recent Places 1 1 ^ /2 0 1 4 8 ^ 0 PM ' f i k fo ld e r
e*3tnp*e5 fv
- J U » .......... n»_ X.
.*:• hardware
[>õte crested: 5 /2 7 /?Ì)Í4 3:31 P M
,ịỹ }ava S u e m KB
Desktop .Ị lib Fordm:Oi.Ba-.ics, 02.D(qhdt, ồ ĩ A m i o g . 0 4 .C s r rm ir.iM ti J r -
. libraries 1 /8/2 01 4 a:4c PM File fo ld « r

i&i&i ,.ịý reference 1 /8/2 01 4 8:4c p m File fo ld « r

L ib ta n e i .£;• to o ỉs W / 2 0 H a:4c PM File fo (d «r

atdu in o.exe 1/8/2 01 4 8:4Ỗ PM A p p lic a tio n MQ< B

N ị: cygic o n v -2 .d ll 1 /8/2 01 4 8:45 PM A p p lic a tio n e x te rK .. s*? <B


m
co m p u tơ ;C c y g w in l. d ll T E N F IL E M ổ X U A T H IỆ N 1/8/2 01 4 8:45 PM A p pũ c ỏtìon exter*?. . 1.Ỉ.S<B
■j& libu sb0 .dll d K M U N G F IL E N A M E 1/9/2 01 4 3:45 PM A p p lic a tio n extenĩ... 43 <B
• re^isiorvutxt 1/a/20 14 3:45 PM Text Document t &<B
3&<B
w

rxtxSeriaJ.dll 1,<3/2014 3:45 PM A p p lic a tio n extern. . I 76 <B
N e tw o rk

FSe naffne. ( Zvtri


Flies of type

S ketchbook
Sketchbook
(Sách dự án) chứa
các dự án cũa bạn
trong thư mục mặc
định của Arduino.

Exam ples:

Tùy chọn này cho phép mở thí dụ cơ bản có sẵn để bạn tham khào giúp
bạn học viết code cho những dự án cùa bạn. Mục Examples rất cần thiết cho
các bạn mới học lập trinh điểu khiển Arduino.
skstch_đ«c U a 1A fd u in o 1.0.6
Fite Edit Sketch Toc;s Help

New Ctfi* H l ? V - ; 5 V i v ầ ẳ ẵ ữ ìấ
cpen... C trl*0 01.Bastes » AnatogReacSe* 4
Sketchbook 02-D'9 <aJ ► E-dreMĩrũrnưr->
Examples G3.Afie;og ► Elink
ctose Ctit+W 04.Com m unication * DtgrtiiReadCtr i
Save C trkS OS.Cantrol ► Fide
Save As... C trl* S h ift-s 06.S4T5ƠT5 • F.eadAnilc*^

EO
ARDUINO DANH CHO NGƯđl Tự HỌC CHƯƠNG 2: PHẤN CỈNE VÁ PHÁN MẼM ARDUINO

C á c dự án này được tổ chức thành nhóm , giả sử ò đây ta chọn nhóm


0 1 .B a s ic . 6 dự án m ẫu trong cửa sổ mới xuất hiện, ở đáy ta nhấp chọn B lin k .

Lưu ý: Dự
ũ í/ . . BUníí ị Afduirto '
án khi mở có định
rite Edit S te tch Too's Help
dạng .ino. (File dự
án mở có tên
B link.ino). Trong
chuyên đề này 11 -1ĩ' * x - ii a í) iC í c o d e is

được ký hiệu như


f iic c ilf iiid ĩi 2014
sau: by t. Y x i i z w t x t i l f i

Examples >
01. Basic > Blink.
/ / 't h tì t - f iV i') C u /je tic r ; V U ỈÌ3 o ;u - t' v h isr: í i ĩ . ' : : ì :ì i n : t iíV or poaer tj'tf:

Ta nhận VOĨ.Ỉ {
đƯỢc dự án B link
/'/ if .: v ia ; iz t ' l U '.jj .'- .f i i ĩ - i í i .15 'xỉi Oul'UUV.
p x r . K c í ': s ( 1 3 , U U 'm j T ) ;
(chớp tắt) như }
sau: Q uá trình
/V the iacp tuncriori iVí2i5 ỈV Ũ L cm d c v e v a g a in to í'
LED sán g trong 1 Ví*'j.ci Ị.o ơ p O {
d ig i (1 3 , H IG H ) ; tu Í1 : th " LED Oft ( K I Gí: I S th e
giây, sau đó LED «jf: Í Ò V ( I Ũ O O ) ; W iilt iv r 'A í c v o r u l
tắt trong 1 giây và d iạ it a iĩíỉiit s (1 3 / L O W ); tx ir r : i; h s LLD o ff b 'i u - ifc iiv r i chi
d e iftY ( lO O Q ) ; VcVJ.T, '1 f i ' i ' i w i f j
lặp đi lặp lại vói
vòng lặp là vô tận,
cho đến khi bo
m ạch A rdu in o bị
cắt nguổn điện
cung cấp cho bo
mạch.

S ave (C trl + S) B lin k 1 A rd u in


D ù ng để lưu kế t quả,
File i Edit Sketch "tools Help
trong trường hợp ta mở file
B lin k sau đó chọ n F ile > New C trkN
S ave thi cửa sổ S ke tch is Open... Ctrf+O
re a d -o n ly như hình dưới xuất Sketchbook ►
hiện báo cho người dùng biết: ►
Examples
File này được gán thuộc tính
Close Ctrl+W
chỉ đọc (rea d-o nly), bạn cần
lưu file này 0 vị trị khác. Nhấp Save Ctrl+S
OK để tiếp tục. Save As... Ctrl+Shift-I-S

61
CHƯỮNG 2: PHÁN CỪNG VÀ PHÁN M ÉM A H g m O A IIIIM ! * ■ ( ■ K M IT M K

Sketch is read-only

Some files are marked "read-only", so you'!!


need tơ re-save this sketch to another location,

lis p
Cửa so Save sketch fo ld e r as xuất hiện. Chọn đường dẫn IL'U file tại
mục Look in và tên file ở khung File name. Nhập xong nhấp vào nút Save.
....... V/ V Iw U fljp 1
* -.-I Save s k e u h t o x it r 3S-.

Save XV wduvio ~ * - 13- .... i

N am e Date m o d eled T ype s«ỉe

. Iibra ne i 4/1/2014 1 2 13 P M F it* fo ld er


Recent Places 5/28/2014 4 1 7 PM R l« fo ld e r
, i : MyBGnk

K
Desktop

i;
Libraries

;ẳs
C om pu te r

KJ •
*
N etw ork
(4c nair-e -

Save as type: ; <4 Res r *> u ^ r 1


-1
— r----—------ -
Cần lưu ý: c ỏ hai trường hợp.Nếu dựán đã được lưu, bạn nên nhó cứ
khoảng 5 phút một lân, bạn phảinhấp File > Save để lưu code, viArduino
không tự động lưu các đoạn code mới viết. Khi có sự cố như mất điên, các
đoạn code mới viết sẽ bị mất.

Save as... (C trl + S hift BfinSc 1Arduin


. - , . / /,/'/J//s/z/,.
+ S) r.li E dit S ketch T ool? H e ip

Dùng lệnh File > Save New Ctrt“ Kl


As Khi bạn muốn lưu file 0 O p e n ... C t r i- G
một ổ đĩa khác, thư mục khác, S k e tc h b o o k ►
hoặc đặl lên file khác. Khi E xam ples ►
chọn Save As, cừa sổ Save Close O'.’-
sketch fo ld e r as giống như
Save
khi chọn Save xuất hiên.
Save As... a - - _ - f-. c

U p lo a d Cv - „

62
ARDDINO DAW CHO NGƯƠI Tự BỌC CHƯƠNG 2: N ẤN C ỈN Í VẢ H ÁU MẼM ABĐUIHỮ

C h ọ n đường dẫn lưu file tại m ục L o o k in và tên file ở khung F ile nam e.
N h ập xong nhấp vào nút Save.
C á c bạn có thể tham khảo phần phụ lục cuối sách để có thêm thố ng tin
về phần m ềm lập trình trên Arduino.
T rong phần trinh bày trước các bạn đã tìm hiểu sơ về p h ần cứng và
phần m ềm A rduino. C húng ta đã được hướng dẫn cài đặt chương trình, làm
quen với bo m ạch A rd u in o UNO. C ác bạn đã biết mở 1 file m ẫu của chương
trình (Blink) để kiểm tra sơ bộ phần cứng và phần m ềm của A rduino UNO qua
LED có sẵn trên bo m ạch nối v ổ i chân 13.
T rong phẩn trình bà y ở cá c chương tiếp theo chúng ta sẽ lần lượt lặp
trình A rdu in o với cá c yêu cầu cụ thể để điều khiển LED đơn, LED ma trận,
LED 7 đoạn v.v. Đ ánh giá chu ng các bài tập này đều lập trinh phức tạp, để có
thể thực hành lập trình điều khiển cho các bài tập phức tạp này chú ng ta hãy
làm cá c bà i tập đơn giản nhất điều khiển đèn LED để làm quen với việ c lập
trinh Arduino.
C h ún g ta sẽ b ắ t đầu làm quen vởi phần cứng m ạch cũng như lập trình
với bo m ạch A rd u in o UNO qua bài tập đầu tiên điều khiển LED để hiểu rõ
phần lý th u yế t (phần cứng và phần m ềm ).
Đ ể b ắ t đầu bà i tậ p đầu tiên, bạn sẽ lập trình làm sáng LED tương tự như
bài tập m ẫu củ a chương trình. Tuy nhiên, bây giờ bạn sử dụng 1 đèn LED bên
ngoài kết nối với m ột chân ngõ ra số khác thay vì sử dụng LED ỏ chân số 13
của bo m ạch A rdu in o. Bạn cũn g được học các sử dụng phần cứng và phần
mềm gi để cho m ạch hoạt động và bạn cũng sẽ được giải thích chi tiế t các
câu lệnh (m ã trong ngôn ngữ A rduino sử dụng), bạn sẽ thấy các lệnh tương tự
như ngôn ngữ c .
Ngoài ra, c á c bạn còn tiến hành lập trình sao cho chân ngõ ra số của
Arduino lần lượt lên 1 (mức cao) theo m ột tuần tự nào đó. Bạn đọc sẽ được học
cách điều khiển ngõ ra của bo m ạch A rduino Uno bằng cách sử dụng LED đơn
và các nút nhấn đơn giản. Điều khiển LED 3 màu RGB cũng như thay đổi độ
sáng của LED bằng phần m ềm v.v Bạn sẽ gặp lại những linh kiện LED trong
toàn bộ các chương còn lại chứ không chỉ riêng chương này.
C húng ta sẽ bắt đầu thực hành với bài đầu tiên là:
Làm nhấp nháy 1 LED bên ngoài (bo mạch Arduino có m ột đèn LED gắn
trên bo m ạch ở chân 13 gọi là LED nội).

BÀI TẬ P 1: ĐIỂU KHIỂN LED NHẤP NHÁY


P h ầ n cứ n g
C ác linh kiện mà bạn cần có:

(3
C M C 2: PHÁN c ffw VA n « N M É M AIDUINO U IIIM I I I « K ie iu m

• Bo rr.ạch thử (Test board).


Loại bo mạch thừ (test board) sử dụng tốt nhất cho toàn c u í i sách nay la
loại test board 840 điểm như hình thực tế ở dưới. Chúng là loại pnõ blẻn nhat' co
kích thước: Chiểu dài là 16,5 cm và chiều rộng là 5,5 cm, có 840 lỗ trẽn lõng diên
tích của bo mạch thử.
Hình dưới là cấu lạo của test board, đây là thành phấn khóng thể chiếu
trong quá trình thực hành dùng để kiểm tra các mạch điẽn tử giúp nguòi học có
thể kết nối các chân linh kiện lại với nhau bằng dây nối tạo nẽn mach điện mà
không cần phải hàn.
Hâng 1 Hầng 3 Hảng 2 Hấng 4

X I i ________________
E5SS338
Í525353S3

3 >1%%M ị ị ị ị l >ì1ịĩ S ì il3 3fi«ỉ3 ý ĩ *: >)ị >15 5 5 5 5


. í| íị *; <5 ỉí l ị « $ ....................

& ?!>,íịsỊ f| 4 ^ ổ ^ ÍỊ ỈỊ ^ ỈỊ sjVfJíỊ í ^ ^ ^
ĩ ỉ ỉ t ư í í í í J j j j j ' j ’ j ị J ị ị ị f ịí !í íí Iị ( u ! t

Cấu tạo của test board

Thường thi chúng ta có thể kết nối những bo mạch nhỏ thành bo mạch lân
hơn vì chúng có các khớp để kết nối lại với nhau. Trong những bài tãp lớn hoặc
mạch có nhiều linh kiện thì chúng ta cẩn một bo mạch thử lớn để thực hiện. Dây
nối thường là dây đồng nhỏ bạn có thể sử dụng loại dây nào cũng được (thường
thi nên có dây cứng để dễ dàng cắm xuống test board). Tốt nhất bạn nén mua
loại dây đã làm sẵn cho tiện vì loại dây này sử dụng khá tốt, chúng chống chạm
mạch và kết nối voi test board dễ dàng.
Test board là một loại bảng nhựa giúp bạn cỏ thể sử dụng các linh kiện
trong mạch điện và kết nối cũng như tháo lắp chúng một cách dễ dàng mà
không cần phải hàn. Test board bao gốm các lỗ nối tiếp trẽn lưói bẽn dưói
test board thì các lỗ sẽ được kết nối bằng những dải kim loại. Nhũng dải kim
loại sẽ được nối tương tự như hình dưói:
Dải kim loại phía trên và phía dưói chạy song song bên trontj ’5 =- board
và được thiết kế để bạn kết nối nguồn cho mạch của minh. NhC"'_ -,r, |<jện
được cắm ở giữa test board sẽ dễ dàng kết nối vói nguồn nhò
có những test board vẽ các đưòng đò và đen cnạy song song c á ; £ ó p hja
trên và phía dưới để giúp bạn phân biêt nguôn dưong (đỏ) và đã’ - G \Z -’ tr-,I
ABDUWO C A W CHO W6tfơl Tự m e C M t 2: r i Ẩ I r tN t VÀ H Ấ N MỀM AMIIIW0

ỏ những test board loại lớn, các đường nguồn này bị tách ra, thường
được chỉ bằng m ột đường m àu đỏ bị đứt. V iệc này để giúp tạo ra những điện
áp khá c nhau cho các linh kiện trê n bo m ạch của bạn. Nếu chỉ sử dụng m ột
mức điện áp thì bạn nên kết nối thêm dây cho các vị trí chia của đường nguồn
trên te st board. Những dải d ù ng để kết nối các linh kiện trong phần giữa của
test board thì vu ô n g góc với đường nguồn và độ dài cũa chú ng nhỏ hơn đường
nguồn. Phần chính giữa của test board là m ột đoạn chia dài để tách b iệ t các
dải kết nối linh kiện.

V iệ c phân chia như vậy nhằm m ục đích


giúp ch ú n g ta dễ dàng gắn các chip (1C) lên test
board như hình dưới.

C á ch sử d ụ n g T e s t b o a rd :
• Bốn hàng trên của test board độc lập với nhau, mỗi hàng bao gồm 25 lỗ đồng.
• 62 cột củ a te st board độc lập với nhau, mỗl cột gồm 5 lỗ đổng.
• Liên kết bốn hàng trên lại với nhau và nối với nguồn dương (Vcc).
• Liên kết bốn hàng dưới lại với nhau và nối với Mass (GND).
• Các cột còn lại được cắm linh kiện như hình dưởi.

ỈT
— — — — — I
N g u ô n ơúong ■ ĩ -KsWi
: ỷ. X
i:íẵẩiaíầíỒKồẳHSĩẳt£
ĨH H Ì Ĩ ỉX
t c ------1 ặv:

i i>/
M ass ► ■ ìỉ •'

• Đ èn LED.
LED được b iế t là m ột diode ph át sáng (Ligh t Em itting Diode). M ột diode
là m ột linh kiện chỉ cho dòng điện chảy theo m ột chiều. N ếu dòng điệ n có xu
hướng chạ y theo chiều ngược lại thì diode sẽ ngăn cản điều này xả y ra, bạn
nên sử dụng loại LED 5 ly (5 mm ) bất cứ m àu nào. Và điều bạn cầ n quan tâm
là dòng điện và điện áp định mức cho LED sử dụng là bao nhiêu vì bạn cần
phải tinh toán giá trị điện trở hạn dòng cho nó (bạn sẽ tính toán điệ n trở ở
phần trình bày sau c ủ a chương). LED đỏ 5 ly được bán khá phổ biến và hình
dưới là m ột số dạng LED khác có bán tại các chợ điện tử.
CHƯƠNG 2 : PHẤN CỬNE VÀ P I Ắ I M Ế M A ID tN O U t t t M ! ! ■ CM K f l l 1 M i

Một đèn LED cũng


giống như một diode và
ngoài khả năng như diode,
nó còn có thể phát sáng.
LED có thể có màu sắc và
độ sáng khác nhau. Bao
gồm các dải tia cực tim
đến dải hổng ngoại (như
đèn LED trong điểu chỉnh
từ xa của TV). Bạn nên
chú ý cẩn thận khi dùng
LED: 2 chân của LED có
độ dài khác nhau và một
bên LED được mài phẳng
hơn so v ớ i h ìn h trụ ( h ìn h
bên). Đây là cách phân
biệt chân nào là anode
(chân dương) và chân nào
là cathode (chân âm).

Chân dài là chân được kết nối với nguồn dương còn chân ngắn hon
(phía mặt được mài phẳng) là chân âm được nối với đất hoặc nguồn áp thấp
hơn chân dương. Nếu bạn kết nối sai chân, nó sẽ không gây hại LED nếu bạn
không cấp một dòng điện quá lớn qua nó. Tuy nhiên, việc cấp dòng quá lớn
qua LED sẽ được hạn chế bằng các lắp điện trở hạn dòng để giới hạn mức
dòng điện qua LED. Nếu không có điện trở hạn dòng thì LED bạn có thể bị
cháy nếu có dòng điện thuận chạy qua LED.
Lưu ý:
• Tùy loại LED và cũng tùy vào màu LED mà dòng chảy qua mà Vi có thể
khác 2V, Khi sử dụng ta chọn dóng qua LED sao cho độ sáng như
ỷ. Dòng tôi đa nẽn khoảng 20mA, cho độ sáng vừa phải (liên tục) nén
chọn 12mA, nêu LED quét (không sáng liên tục) thi tăng dong gấp 2.
gấp 3 lấn ...
• Bạn củng có thể sử dụng LED 2 màu, 3 màu. Chúng có thèm một số
chân. MỘI đèn LED RGB có các chân để điều khiền LED đò. /a n h /á và
xanh dương chỉ trong một đèn LED, và loại LED này có 4 cbẳr. 1 chán
có thể là dương chung hoặc ãm chung và những chân r<ể diếu
khiển riêng lẻ. Bàng cách thay đồi độ sáng của R, G. B c , í _~ n 0(30
bạn có thể tạo ra bất kỳ màu nào ban muốn.

66
ARDU1WO I A W C H N C tứ l ĩ ự i q t CHƯƠNG 2 : PBÁN CUNG VÀ P IẤ N M ÉM AMUINO

Đ iện trở 100 ohm.

Linh kiện tiếp theo là điện trở. Đ iện trở là m ột linh kiện có chức năng
cản trở d ò ng điện khi có m ột điện áp trẽn 2 đầu của chúng, bạn có thể nghĩ
điện trở như m ột ông nước bị bóp nhỏ lại so với toàn đường ống. Vi vậy, khi
dòng nước (tương tự như dòng điện) chảy qua đoạn bị bóp này (điện trở) thì
dòng nước chả y qua sẽ chậm lại. Tương tự như thế, khi dòng điện qua điện
trở cũn g bị hạn ch ế (nhỏ) lại. Bạn có thể sử dụng điện trở đẽ’ giảm dòng điện
cũng như giảm điện áp cấp cho các linh kiện khác. G iá trị trỏ kháng được của
điện trở được tính bằng ohm và ký hiệu nó trong bảng chữ cái Hy Lạp là £i
(đọc là O m ega). T rong trường hợp này, chân số 10 của bo m ạch A rduino có
ngõ ra là điện 1 chiều 5V DC và dòng điện là 40 mA, với đèn LED của bạn có
điện áp và dòng điện định mức lần lượt là 35 mA. Vi vậy bạn cần m ột điện trà
giúp giảm điện áp từ 5V xuố ng 2V và dòng điện từ 40m A xuống 35 m A (đèn
LED có độ sán g cao nhất). Nếu bạn m uốn đèn LED có độ sáng thấp hơn bạn
có thể tăng giá trị điện trở (giảm dòng điện qua LED).
C h ú ý : Không bao giờ sử dụng 1 điện trở nhỏ hơn cần thiết. N ếu bạn
cho phép dòng điện quá lớn qua LED sẽ làm cháy LED và củng có thể gây
cháy các linh kiện khác của m ạch điện.
C ông thức để tính điện trỏ hạn dòng cho LED như sau:
R = (V, - V l) / 1
Với v s là điện áp nguồn cung cấp, V L là điện áp rơi của đèn LED và I là
dòng điện qua LED . Ví dụ LED bạn có điện áp là 2V và dòng điện là 35m A
được kết nối từ chân ngõ ra của bo m ạch A rdu in o (có thể cung cấp mức điện
áp cao nhất là +5V), vì thế điện trò m à bạn cẩn phải sử dụng được tính như
sau: R = (5 - 2) / 0.035. C húng ta tính được là 85,71 ohm.
Khi sản xu ấ t điệ n trở thì nhà sản xuấ t thường tạo ra các giá trị điện trở
theo chuẩn và theo ch u ẩ n thì điện trở có giá trị lổn hơn và gần giá trị tính được
nhất là 100 ohm . Và ch ú n g ta nên chọn các giá trị theo chuẩn lớn hơn giá trị
điện trở m à ch ú n g ta tính được. Nếu bạn chọn giá trị thấp hơn, thì dòng điên
qua những linh kiện ch ú n g ta cần hạn dòng sẽ lớn hơn cho ph ép và gây hư
hỏng linh kiện của chú ng ta. V ậ y cách nào bạn có thể tìm thấy m ột điên trỏ
100 ohm ? M ột điện trò thì quá nhỏ để nhà sản xuất ký hiệu số và ký tự cho
chú ng nên nhà sàn xuấ t sử dụng các vòng m àu thay cho việ c viế t các ký tự
rườm rà. T rên thân điện trỏ bạn sẽ tìm thấy 4 vòng màu (có thể nhiều hơn).
Bằng cách sử dụng bảng m àu bạn có thê tim được mã m àu đẽ SŨ dụng
cho việ c đọc trờ kháng cùa điện trở.

67
CHƯƠNG t PHÁN CtriK VẢ n Ắ I MẾU U I I M U H M ! « ■ CM H I T Ị t c

Dưa vão cảng máu


4k5 5% (hình bẽn) thi n ô : điên trò
100 ohm có 4 vò ng m àu vói
vòng đầu tiên có số 1 kỷ
hiệu là màu nâu. liếp theo
38Ôlt 2% c = I có số 0 là vòng màu đen.
Sau đó bạn cắn nnãn chúng
với 10’ (nói cách khác là
52?0k 1% c: thêm một số 0 à hàng đon
vị) nên chúng ta cán một
10PPM /C
vòng m àu náu. Vòng CUỐI
cùng là chỉ ra đõ sai số của
! *
điện trà. Nếu diên trò bạn
có vòng vàng, thi sai số là
t
i
ũ
±5%. Có nghĩa là nếu bạn
sử dụng diện trỏ có màu
ỉ m
ỉ«•
xác định là 100 ohm thì giá
trị thực tế có thể là 9 5 -1 0 5
1 ohm. Vì vậy, nếu bạn có
«
một đèn LED có điện áp
'X *'

% m hoạt động là 2V và dòng


Mii* điện định mức là 35 mA thi
©
bạn cần một điện trỏ có 3
X*.
vòng đầu tiên là Nâu, Đen,
0 Nâu. Vòng thứ 4 có thể bạn
Ề X*
không cần quan tâm nếu
không cần một điên trỏ quá
chinh xác.
Bây giờ chúng ta cùng
tìm một số giá trị rnẵu cùa
điện trở để ban làm quen
cách xem vòng màu để tinh
giá trị điện trở. N ế t ban cấn
một điện trở 10 K (hay 10
Kilo ohm), bạn cấn tim một
điện trỏ có các vong máu
nâu, đen, cam. Nếu ban cấn
điện trà 570K, ;-,i các vòng
màu sẽ lá xanh ã cãy tim
và vàng.

68
ARDUIWO DAW CIO NEIÍdl Tự nọc CHƯƠNG2: P1ẨI ClK VÀ H ẢI MẾIIAIBBIMO

M ột cách khác, nếu bạn tìm thấy m ột điện trở và m uốn b iế t giá trị của
nó, bạn sẽ làm ngược lại với phương pháp trên. Bây giờ bạn đã biết cách đọc
vòn g m àu cho điện trở và chọn điện trỏ có giá giá trị trỏ kháng thích hợp cho
LED , hãy m ua cá c linh kiện cần thiế t để hoàn thành bài tập này.
• D â y nối.

Hình dưới là bó dây sử dụng để thử


ng hiệm thực hành với A rduino (Giá khoảng
4 0 .000 đ cho 65 sợi vào thời điểm tháng 1-2015
tại chợ N h ậ t T ảo T P .H C M .
CHƯƠNG 2: PHÁN GỪNG VÀ PBẮN M É M AID D M O AIIVIM I I I BMSWITfMC

Với độ dài đủ kích cỡ, màu sắc đa dạng, tiên dụng, các dày H Ố I giúp
người học nhận biết dễ dàng các liên kết trên test board, dễ k iể "i 'ra mach
trên thiết kế của bạn.
Ngoài ra bạn cũng cần dây kết nối các module vói bo mạch Arduino qua
các dây nối male-male; female-female; male-female (đực-dưc: cải-cài: dưc-
cái) có giá như sau:
Độ dài 20 cm: Khoảng 8.000 đ/10 sợi.
Độ dài 30 cm: Khoảng: 10.000 đ/10 sợi.
Kết nố i phần cứng
Đầu tiên hãy chắc chắn rằng bo mạch Arduino bạn không cáp nguón
điện áp và cáp USB đã được ngắt kết nối. Sau đó hãy kết nối LED. điên trò
và dây nối với test board như hình dưới.

[
m
£ § 3 2 1 0 3 3 7 8 5 4 3 2 1 0

■^ I I I II I
: 5. 5. ĩ £ £ £.

™ A r d u in o u N O m> H M *

•. n 7

ầ m - U
I m ỆỆỀỂÊÊvễỀỊỀ^iẾí' ÍCSP

Nếu bạn sử dụng dây khác màu hay khác lỗ cắm trên test board mi vẫn
không có gì ảnh hưởng nhưng bạn phải đảm bảo rằng kết nối các đ á 1 , dãy vói
nhau là chinh xác như trong hình, cầ n thận khi cắm vào test boar:: -ếLi test
board bạn còn mới thi những lỗ trên test board còn cứng và khá ■ \ ế u ban
khõng sử dụng những dây cắm chuyên dùng mà dùng những đả , ;ấ ~ áưoc
tuốt từ các dây đổng nhò và cắm không cần thân có thể gãy h ò ' ; i t i - ay
kết nối lúc được lúc không

70
ARDUIWO ĐANH CHO NGƯƠI ĩự HỌG CHƯƠNG ỉ : PHẤN C IỈN Í VÁ PHẤN M ÉM ARDUINO

Hãy chắ c chắ n rằng


LED bạn kết nối đúng với cực
của nó, chân dài nối với chân
số 10 của bo m ạch Arduino
UNO. C hân dài là chân anode
(cực dương) của LED và
thường nối với nguồn áp +5 V
(trong bài tập thực hành này
chú ng ta nối với ngõ ra của bo
m ạch A rduino). C hân ngắn là
C athode và nối với đất
(thường gọi tắt là G ND).
Khi chắc chắn kết nối
m ọi thứ là đúng, hãy cấp
nguồn cho bo m ạch A rduino
UNO củ a bạn hoặc kết nối
nguồn qua cáp USB.

P h ầ n m ềm

Mở chương trình A rdu in o IDE và thêm mã lệnh dưới đây vào


chương trình:
// B ài 1 - Chớp tắt LED
int ledPin = 10;
void setupO {
p inM o de(led P in, O UTPUT);
}
void loop() {
d ig ita lW rite (le d P in , HIG H);
d e la y(1 000);
d igita lW rite (le dP in , LOW );
d e la y (1 000);

N hấn nút V e rify /C o m p ile ở thanh V e rify U p loa d


côn g cụ phía trên của chương trình Arduino
IDE và chắc chắ n rằng không có lỗi nào
được ph át hiện trong mã lệnh của bạn. ầ ầ ĩà a m m i

71
CHƯƠNG 2: PHÂN CƯNG VẦ PBẤM M Ế M U I I M U I I I M IẮ J B t * K W I I I l | t

Nếu mọi thứ đều chính xác, thì bạn nhấn nút Upload để tải ^ 3 lênh bạn
xuống bo mạch Arduino UNO. Nếu ráp mạch chính xác và lãp trmn dLng thi
bạn sẽ thấy LED trên test board chớp tắt mỗi giây. Bày giờ chúng :a cũng tim
hiểu mã lệnh và phần cứng để xem chúng hoạt động như thế nào
Tim hiểu mã lệnh bài tập 1 - Chớp tắ t LED
Dòng đầu của mã lệnh của bài tập này là:
// Bài 1 - Chớp tắt LED
Đây là một dòng hiểu là binh luận, đánh dấu hoặc giải thích. Ban có thể tao
ra một dòng như thế này trong mã lệnh bằng cách bắt đầu bằng dẩu 7r và bất cứ
văn bản nào theo sau nó khi biên dịch sẽ được chương trinh sẽ bò qua. Điéu này
có nghĩa, chương trình biên dịch sẽ hiểu nó không phải là một dòng lênh dể yêu
cầu vi điều khiển trong bo mạch Arduino xử lý. Những giải thích này rất có lợi
trong việc viết mã lệnh, chúng giúp bạn hiểu được mã lệnh của bạn dang xừ lý
những gì. Chúng sẽ giúp chương trinh của chúng ta trở nên dễ hiểL. hon nêu
chương trình của bạn phức tạp với hàng trăm dòng hoặc có khi lên đến cà ngàn
dòng lệnh. Vì khi nhìn vào từng dòng lệnh chúng ta không cần phài mò m im hiểu
các biến và chức năng hoạt động của dòng lệnh đó, mà chỉ cần nhìn sang nhũng
dòng giải thích là chúng ta có thể hiểu được dòng đó đang làm gì.
Có thể các bạn đặt câu hỏi: Đã là mã lệnh do chính minh tạo ra tại sao
lại không biết mà phải cần những dòng giải thích. Câu trả lời rằng, có thể bạn
viết mã lệnh trong ngày hoặc một phần nào đó thi bạn có thể nhớ được.
Nhưng nếu mã lệnh của bạn được viết trong nhiều ngày, nhiều tuấn, nhiếu
tháng thì có lẽ bạn sẽ không tài nào nhớ hết được. Vì vậy, khi viết chương
trình nào đó thì bạn nên thêm giải thích, chú thích hoặc bình luận nào đó để
dễ dàng gỡ rối sau này. Hoặc khi muốn người khác phát triển chương trinh do
chúng ta viết thì có lẽ những câu chú thích sẽ rất quý báu cho họ. Do Arduino
sử dụng mã nguồn mở, có thể bạn chia sẻ mã lệnh và sơ đồ mạch cho mọi
người trong cộng đổng. Chính những chú thích của bạn sẽ giúp ích cho nhiếu
người hiểu rõ đoạn mã đã viết.
Ngoài chú thích bằng cách bắt đầu bằng các ký tự “//” chúng ta còn có
thể chú thích bằng cách cách lạo ra một khôi chú thích bắt đầu bằng các ký
tự “/*” và kết thúc là các ký tự Ví dụ như sau:
/* Tất cả các dòng vãn bản trong khối chú thích này
sẽ không được Arduino IDE biên dịch 7
Và trinh biên dịch Arduino IDE sẽ tự động đổi màu cho các C-I ú *hích
của chúng ta.
Mã lệnh tiếp theo của chương trinh là:
int ledPin = 10;

72
ARDUINQ DANS CHI N ỉư d l Tự a g e CHƯƠNG 2: PIẤ N CÚNG VA rUÁM M ỂM ARDUINO

Chương trình biên dịch sẽ hiểu lệnh này như là m ột biến được khởi tạo,
m ột biến là nơi chứa dữ liệu cho chương trinh của chúng ta.
T rong trường hợp này bạn đã khỏi tạo m ột biến có kiểu int hay integer.
M ột biến integer là một biến có phạm vi số từ -32.768 đến 32.767. Tiếp
đến, bạn đã tạo cho biến integer này m ột tên là ledPin và gán m ột giá trị là 10
cho nó (bạn có thể tạo ra bất cứ tên gì bạn m uốn mà có thể không gọi là
ledPin. Nhưng ở đây do m uốn nó dễ hiểu và dễ nhớ vi vậy chúng ta nên đặt tên
là ledPin với ý nghĩa để điều khiển chân có kết nối với đèn LED). Trong bài tập
này, bạn sử dụng chân số 10 nên chúng ta phải gán giá trị 10 cho biến và cuối
dòng phải có dấu ch ấ m p h ẩ y (;) để báo kết thúc m ột dòng lệnh.
M ặc dù có thể tạo bất cứ tên gọi nào cho biến của bạn nhưng theo quy
ước, thi b ắ t đầu tên củ a m ỗi biến sẽ phải là m ột ký tự. Và phía sau ký tự này
có thể bao gồm các ký tự khác, các sô và các ký tự cho phép khác. C ần chú
ý rằng: M ã lệnh trong chương trình biên dịch của A rduino phân b iệ t chữ in
thường và in hoa. C uối cùng, bạn không thể sử dụng bất cứ từ khóa nào như
m a in , w h ile , s w itc h ,., là tên củ a m ột biến. Từ khóa là tên của biến, hằng và
cá c hàm là m ột ph ần đã được khai báo bên trong ngôn ngữ Arduino. Để giúp
bạn p h ân b iế t tên củ a m ột biến với m ột từ khóa thì chương trình A rduino IDE
có tô đỏ tấ t cả những từ khóa trong chương trinh.
Bạn hãy tưỏng tượng rằng m ột biến như là m ột hộp nhỏ chứa đựng
những thứ mà bạn m uốn chứa. Vì vậy, với chương trình này bạn đã tạo ra m ột
vùn g trong bộ nhớ để chứa m ột số có kiểu integer và lưu nó vào vùng nhd đó
m ột số 10. V iệc này giống như là bạn đã lấy số 10 và cất nó vào hộp nhỏ.
C u ố i cùn g, m ột biến được gọi là biến vì chú ng ta có thể thay đổi chúng.
Phần sau, bạn sẽ thực hiện tính toán trên các biến để tao ra những chương
trình có độ phức tạp cao hơn.
B ây giờ mã lệnh chú ng ta sẽ tiế p tục với:
void setupO {
p in M o de(led P in, OUTPUT);

}
M ột chương trinh của A rduino phải có r i c hàm setupO và lo o p (), nếu
không nó sẽ không làm việc. SetupO được gọi chương trình khởi tạo khi bắt
đầu. Và nó thường được v iế t trước hàm loop(). s ử dụng nó để khỏi tạo các
biến, chế độ chân, bắt đầu sử dụng thư viện, khai báo tốc độ tru yề n (Baud)....
Chức nãng th iế t lâp này sẽ chỉ chạy m ột lần, sau mỗi lần có nguồn hoặc thiết
lập lại bo m ạch Arduino.
D òng đẩu tiên cùa hàm setup là:
void setupO

7J
CHƯƠNG ỉ : PHÁN CƯNG VÀ PHÁN M Ế II A M O H g U IIIM l U i ■ K W IT IIft

NÓ báo cho trinh biên dịch biết là: Hàm này duoc goi la setup va nó sẽ
không trả về bất cứ giá trị nào khi được gọí và cùng knõng có bá: cứ tnóng só
thiết lập gì cho nó. Nếu hàm của bạn trà về một giá trị integer va Can cũng
c ầ n t h ê m t h ô n g s ố đ ể c h o n ó x ử lý th ì c h ú n g p h ả i đ ư ợ c v i ế t n h ư S â u

int myFunc(int X, int y)


Dòng lệnh này có nghĩa, bạn đã tạo một hàm tên là myFunc. Hám này
cần 2 thông số integer gọi là X và y. Một khi kết thúc hàm này thi nó sẽ trả vế
một giá trị số integer cho chúng ta (bởi vì có khai báo int phía truóc hàm).
Tất cả mã lệnh bên trong hàm được chứa trong dấu ngược nhọn khép
kín. Một dấu “{“ cho biết bắt đầu một khối mã lệnh và dấu “}" cho biẽt két thúc
khối mã lệnh này. Bất cứ thứ gi bên trong nó đều là mã lệnh thuõc hàm
(Chúng ta sẽ tim hiểu về hàm sau này, bây giờ bạn đừng lo lắng vế nó).
Trong chương trình này, bạn có hai hàm. Hàm đầu tiên đưoc gọi là
setup, mục đích của nó là khởi tạo những điểu cần thiết cho chương trinh bạn
hoạt động trước khi chương trinh chính hoạt động:
void setupO {
pinMode(ledPin, OUTPUT);
}
Hàm setup chỉ có một dòng lệnh là pinMode. Nó được gọi trong chưong
trinh biên dịch Arduino nếu bạn muốn thiết lập chế độ cho chân bo mạch
Arduino của bạn ở chế độ ngõ ra. Những thông số mà bạn cần thêm vào đó là
chân số bao nhiêu và chế độ của chân đó là gì (OUTPUT-Ngõ ra hoãc INPUT-
Ngõ vào). Trong chương trinh, bạn sử dụng có tên là ledPin và đã đưac gán giá
trị là 10. Vi vậy, dòng lệnh này được trinh biên dịch Arduino hiểu rằng chân số
10 sẽ ở chế độ ngõ ra. Vì hàm setupO chỉ chạy một lần khi bắt đầu, nên bây giờ
chúng ta sẽ tiếp tục tìm hiểu về vòng lặp chinh cùa chương trinh:
void loopO {

digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW):
delay(1000);
}
Sau khi tạo hàm setupO, mỗi dòng lệnh bên trong hàm locpi sẽ được
thực hiện từng dòng một đến dòng lệnh cuối cùng trong hàm loop' Sau đó
vòng lặp chính sẽ bắt đẩu lại từ dòng lệnh đẩu tiên cùa hàm vả n i sẽ 3-1 r\ ra
liên tục đến kh bo mach Arduino bị ngừng cấp nguốn hoăc khi c rv ;-~ •= -.'lấn
nút Reset trẽn bo mach.

74
ABPHBHIAM CM H6tfđl ĨỊdệC CHtftfNC l : PIẤI t i n t VÀ PBẤN HÉM ABDĐIKO

T ro n g bài lậ p này do chú ng ta m uốn LED bật trong vòng m ột giây rồi lại
tắ t cũn g trong vòng 1 g iâ y và sau đó lặp lại quá trình này. Do đó, những dòng
lệ n h để điểu khiển LED phải được viế t trong hàm loopO bài vi chú ng ta m uốn
nó lặp lạ i m ãi m ãi. D òng lệnh đầu tiên là:

d ig ita lW rite (le d P in , HIG H);

D ò ng lệnh này sẽ điều khiển ngõ ra chúng ta ở m ột mức T H Á P hoặc


m ộ t mức C A O (trong trường hợp này thl nó sẽ đưa chân số 10 của bo m ạch
A rd u in o lên mức CAO ). Khi bạn điều khiển ngõ ra là mức CAO thì bo m ạch
A rd u in o sẽ cung cấp m ột nguồn +5 V cho chân mà bạn điều khiển. Khi bạn
điề u khiển ngõ ra là mức T H Ấ P thi bo m ạch Arduino sẽ làm cho chân ngõ ra
xu ố n g mức ov và nó chính là G ND (M ass) trên bo m ạch A rduino. M ục đích
dòng lệnh này là làm cho chân số 10 lên mức +5 V để là LED sáng.
Sau đó là dòng lệnh:

delay(IOOO);

D òng lệnh này làm cho chương trình biên dịch hiểu rằng: Phải đợi 1000
m ilig iâ y (1000 m ilig iâ y tương đương với 1 giây) trước khi thực hiện dòng lệnh
tiế p theo là:
d ig ita lW rite (le d P in , LOW );
Nó sẽ làm ngõ ra của bạn xuống mức 0 V (trong trường hợp này là chân
số 10) vì vậ y đèn LED sẽ tắt. Sau đó m ột lệnh delay (làm trễ) khác sẽ làm
chương trinh ch ú n g ta đợi 1 giây trước khi kết thú c hàm loop(). Sau đó hàm
hàm loopO sẽ b ắ t đầu lại từ dòng lệnh đầu tiên.
B ạn hãy xem lại chương trình từng bước m ột lần nữa. Bạn sẽ thấy lập
trinh cho A rdu in o rấ t đơn giản:
// B à i 1 - Chớp tắ t LED
int ledP in = 10;
void setupQ {
p in M o de(led P in, O UTPUT);

)
void loopO {
d ig ita lW rite (le d P in , H IG H );
d e la y(100 0);
d ig ita lW rite (le d P in , LOW );
delay( 1000):

}
Chương trình trên được hiểu như sau:

75
CHƯƠNG 2: PHÁN CtfNG V * PBẮM M Ế U U I I M A Ỉ1 IU M ! * ■ cm ■ » TỊ w c

Chúng ta tạo ra một biến gọi là ledPin có giá trị là 10 S a t đo chuong


trinh sẽ thực hiện những dòng lệnh bẽn trong hàm setupO và tai dãy chuong
trinh sẽ thiết lập chân số 10 ở chế độ là ngõ ra. Sau đó chưong trinh tiép tục
thực hiện vòng lặp chinh, bạn thiết lập ngõ ra của chán 10 à múc CAO và
ngay lập tức, chân 10 có mức điện áp là 5 V. Sau đó, đợi 1 giãy và thiết láp
ngõ ra của chân 10 ờ mức THẤP và lại đợi 1 giây. Chương trình sẽ tự lãp lại
lệnh đầu tiên của hàm loop().
Kết quả là đèn LED sẽ chớp tắt đến khi nào chúng ta ngất nguốn điện
cấp cho bo mạch Arduino. Một khi đã hiểu đoạn mã lập trinh làm viẽc thế
nào, bạn có thể thay đổi mã lệnh để bật LED trong khoảng thoi gian khác và
tắt nó cũng trong một khoảng thời gian khác với yêu cầu ban đầu. Vi dụ, bạn
có thể làm LED sáng trong 2 giây và sau đó tắt trong nửa giây. Vòng lập
chính sẽ được viết như sau:
void loopO {
digitalWrite(ledPin, HIGH);
delay(2000);
digitalWrite(ledPin, LOW);
delay(500);
)
Nếu muốn LED tắt trong vòng 5 giây và sẽ nháy thật nhanh (250 ms)
như một đèn LED báo hiệu trong xe hơi bạn có thể viết mã như sau:
void loopO {
dĩgitalW rite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
delay(5000);
)
Để chớp tắt LED rất nhanh, bạn có thể thử chương trinh sau:
void loopO {
digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
delay(50);
}
Bằng cnch điều chình thời gian tắt và mở LED bạn có thể tao ra t ấ t kỳ
hiệu ứng nàc ban muốn (tất nhiên, chí những chương trinh sừ dụng 1 LED

76
ARPUWO 1A M » 1 NGtftfI Tự 1 9c CHlftfNG 2: PHÁN CIỈNG VA PHÁN M EM ARDUINO

C h u yê n đề này có đối tượng điểu khiển chủ yếu là LED nên phần trinh
bày sau giới thiệ u tóm tắt về LED để bạn đọc hiểu rõ hơn và khai thá c có hiệu
quả linh kiện điện tử này.
LỊC H SỬ P H Á T TRIỂN
H iện tượng biến điện thành ánh sáng được H. J. Round phát hiện đầu
tiên và o năm 1907 ở phòn g thí nghiệm Marconi, ổ n g đã dùng 1 dâ y dẫn và
tinh thể S ilic cá c-b u a (SiC ) chuyển điện thành ánh sáng bằng 1 sợi dây và
tinh thể Silic. O leg V la dim irovich Losev, nhà nghiên cứu người Nga công bố
lần đầu tiên đã tạo ra LED trên tạp chí khoa học Nga, Đức và Anh. Tuy nhiên
không có triển khai trong m ấy thập kỷ kế tiếp. Rubin Braunstein, công ty
Radio C o rporation of A m erica, phát hiện có bức xạ hồng ngoại trên họp chất
G aAs và các hợp ch ấ t khác vào năm 1955. Braunstein đã thí nghiêm trẽn các
diode G aSb, G aAs, Indium phosphide (InP), và S ilicon-germ anium (SiG e) ở
n h iệ t độ phòn g và ở 77 độ K. Năm 1961, các nhà thí nghiệm người Mỹ Robert
Biard và G ary Pittm an, làm việc ở Texas Instrum ents cũng phát hiện GaAs
p h át ra tia hồng ngoại khi có dòng điện chạy qua và đã nhận bằng ph át minh
LED hồng ngoại. LED đầu tiên phát ra ánh sáng có thể nhìn thấy là loại LED
đỏ, do N ick H olonyak, Jr. ph át hiện, vào năm 1962 khi đang làm việ c cho
G eneral E le ctric C om pany. H olonyak đã báo cáo hiện tượng này trong lá thư
gỏi cho tạp chí A pp lied P hysics Letters vào ngày 01-12-1962. H olonyak được
xem là cha đẻ củ a LED . M. G eorge Craford, m ột sinh viên tốt nghiệp trước
Holonyak, đã p h á t m inh ra LED vàng đầu tiên và đã cải thiện thêm độ sáng
lên 10 lần cho LED đỏ cũng như LED đỏ-cam vào năm 1972. Vào năm 1976,
T. P. Pearsall lần đầu tiên đã tạo ra LED công suấ t cao, hiệu suất cao cho
cáp quang nhờ và o v iệ c sáng chế ra vật liệu bán dẫn mới có khả năng phát ra
sóng điện từ phù hợp cho cáp quang.
QUÁ TRÌNH THƯƠNG M ẠI HÓA
LED đẩu tiên được thương m ại hóa để thay thế cho đèn c h ỉ thị làm bằng
đèn dây tóc, neon và m àn hình bảy đoạn. Đầu tiên là các th iế t bị m ắc tiền
trong phòn g thí ng hiệm . Sau đó là ti vi, radio, điện thoại, m áy tính và thậm chí
là đổng hổ. Đ ế n năm 1968, LED cực kỳ m ắc, cỡ 200 đôla Mỹ mà lại ít ửng
dụng. Năm 1968, C ông ty M onsanto là công ty đầu tiên sản xuất LED hàng
loạt dùng G ali asen ph ốt pho (G aAsP). Năm này, H ew lett Packard cũng giới
thiệu LED làm từ G aAsP do công ty M onsanto cung cấp. C ác LED này là LED
đỏ và có thấu kính nhựa đi kèm trên từng chữ số để có thể dùng trong m àn
hinh m áy tinh và c h ỉ đủ sáng để làm đèn chỉ thị. Thời gian sau đó thì LED
vàn g, cam ., cũn g trỏ nên phổ biến. Năm 1970, LED thậ t sự đã được thương
m ại hóa thành cô n g khi công ty Fairchild S em icon ducto r bán ra thị trường 5 xu
Mỹ cho m ỗi bó ng LED . C ông ty này đã sản xuất bằng quy trinh Planar do tiến
sĩ Jean H oerni ph át m inh khi làm việc cho họ.

77
CHƯƠNG ỉ : PHẤN CỨN6 VÀ P I Ắ I M Ễ H A I M M U IIIM I f CM K H I t i w t

Sự kết hợp giữa quy trình Planar và các phưong pháp dcng gói giúp
nhóm trưởng Thomas Brandt của công ty Fairchild đã có được khả nâng giảm
thiểu giá thành cần thiết. Các phương pháp này vẫn được cac cõng ty dùng
để sản xuất LED hiện nay. Ngành công nghệ vật liệu cho LED đã pnát triển
ngày càng mạnh mẽ. Công suất ngày càng tăng nhưng hiệu suát. đõ tin cãy
vẫn đạt được mức có thể chấp nhận. Việc phát minh và phát triển LED trắng
công suất cao nhanh chóng thay thế đèn dây tóc, đèn huỳnh quang. LED
ngày này đa sá có kích cỡ 5 mm T1% và 3 mm T1. Tuy nhiẽn, xu hưóngcõng
suất ngày càng lớn nên các kiểu đóng gói khác cũng được phát triển để đáp
ứng yêu cầu tÒE nhiệt. LED công suất cao ngày nay cấu trúc bên trong rất
phức tạp nhưng bể ngoài thì như các LED thời ban đầu.
LED XANH DA TRỜI VÀ LED TRẮNG
LED xanh da trời làm từ InGaN được phát minh đầu tiên do Shuji
Nakamura của công ty Nichia Corporation vào năm 1994. Hai kỹ thuât mấu
chốt là cấy GaN trên lớp nền Saphia và tạo lớp bán dẫn p từ GaN (do Isamu
Akasaki và H. Amano phát triển ở Nagoya). Năm 1995, Alberto Barbieri tại
phòng thí nghiệm đại học Cardiff đã nghiên cứu và giới thiệu LED ‘ tiếp xúc
trong suốt” có công suất, hiệu suất cao bằng cách dùng Indi thiếc ôxít. Sự ra
đời của LED xanh da trời cộng vđi LED hiệu suất cao nhanh chóng dẫn đến
sự ra đời LED trắng đầu tiên dùng Y3AI50 12:Ce. Hợp chất này có tên khác là
YAG, là lớp phủ để trộn ánh sáng vàng với ánh sáng xanh da tròi cho ra ánh
sáng trắng. Năm 2006, Nakamura được trao giải thưởng công nghệ thiên niên
kỷ cho phát minh này.
Hiệu suất, công suất cùa LED tăng theo hàm mũ, gấp đôi sau mỗi 3
năm kể từ năm 1960, tương tự như định luật Moore. Sự phát triển LED nói
chung đã đóng góp cho sự phát triển song song giữa các công nghê bán dẫn,
khoa học vật liệu và quang học. Người ta đã đặt tên nó là định luật Hartz, lấy
từ tên của tiến sĩ Roland Haitz. Năm 2001 và 2002, quy trinh cấy GaN lén chất
nền S i0 2 được hiện thực. Tháng 1 năm 2012, LED công suất lớn theo công
nghệ này được thương mại hóa. Tin đốn là dùng lấm đế S i0 2 6inch(15.24 cm)
thay vì tấm đế Saphia(Nhôm ôxít) 2inch(5.08 cm) sẽ làm giảm 90% giá tnành.
HOẠT ĐỘNG
Về mặt điện tử, hoạt động của LED giống với nhiều loại diode bán dẫn.
Hầu hết các vật liệu làm LED có chiết suất rất cao, tức là hấu hết ánh sáng
phát ra sẽ quay ngược vào bên trong thay vi phát ra ngoài không khí Do đó
công nghệ trích xuất ánh sáng từ LED cũng rất quan trọng, cần rất nhiéu sự
nghiên cứu và phát triển. Các chất bán dẫn như S i0 2 có chiết suất rất cao khi
chưa có lớp tráng phù. Điểu này sẽ ngăn cản photon đi ra khỏi chất bán dẫn
Đặc điểm này ảnh hưởng đến hiệu suất LED và tế bào quang điên, o . ié : suất
của S i0 2 là 3.96 (590 nm), còn không khí là 1.0002926.


\ ARDUINO B A M c m NGƯƠI ĩự HỌc CHƯƠNG 2: PHẤN CỈNC VÀ PHẤN M ÉM A8DUIN0

N ói chung, chỉ có những photon vuông góc với mặt bán dẫn hoặc góc tới
cỡ vài độ thi mới có thể thoát ra ngoài. Những photon này sẽ tạo thành 1 chùm
sáng dưới dạng hình nón. Những photon không thể thoát ra ngoài sẽ chui ngược
vào bên trong chất bán dẫn. Những phô ton phản xạ toàn phần có thể thoát ra
ngoài qua các m ặt khác của chất bán dẫn nếu góc tới đủ nhò và chất bán dẫn
đủ trong suố t để không hấp thụ hoàn toàn các photon. Tuy nhiên, với LED đều
vuông góc ở tất cả các m ặt thi ánh sáng hoàn toàn không thể thoát ra và sẽ
biến thành nhiệt làm nóng chất bán dẫn. Hình dáng lý tưỏng cho phép tối đa
phát sáng là dạng vi cầu, là các hình cầu có kích thước siêu nhỏ. Ánh sáng sẽ
phát ra từ điểm trung tâm và điện cực cũng phải chạm điểm trung tâm . Tất cà
ánh sáng phát ra sẽ vuông góc toàn bộ bề m ặt quà cầu, do đó sẽ không có
phản xạ. Bán cầu cũng có thể cho kết quả tương tự nếu m ặt lưng hoàn toàn
phẳng để phản xạ hoàn toàn các tia phát về phía m ặt lưng.
LỚP T R Á N G PHỦ
N h iều LED được bọc bằng 1 vỏ nhựa màu hoặc trong suốt vì 3 m ục đích
1. H àn LED vào bảng m ạch sẽ dễ hơn.
2. D ây dẫn bên trong LED rất m ỏng sẽ được bảo vệ tốt hơn.
3. Lớp nhựa sẽ đóng vai trò như là m ôi trường trung gian. C h iết suấ t của
vỏ nhựa sẽ thấp hơn ch iế t suất bán dẫn nhưng cao hơn không khí
Lý do thứ ba sẽ gia tăng khả năng phát sáng của LED vì nó sẽ như 1
thấu kính phân kỳ, cho p h ép ánh sáng có góc tới cao hơn góc tới hạn có thể
lọt ra ngoài không khí.
HIỆU SUẤT VÀ CÁC THÔNG s ố HOẠT ĐỘNG
LED dùng làm chỉ thị có công suất chỉ cỡ 30-60 mili oát. Năm 1999, Philips
Lumileds giới thiệu LED có thể hoạt động liên tục với công suất 1 w . Nó dùng 1 đế
bán dẫn lớn hơn rất nhiều so với LED chỉ thị. Thêm nữa là có bộ phận tản nhiệt
bằng kim loại. Một trong những Ưu điểm của LED là có hiệu suất chiếu sáng cao.
LED trắng nhanh chóng bắt kịp và vượt qua hiệu suất của đèn dây tóc. Năm 2002,
Lumileds chế tạo thành công LED 5 w với hiệu suất chiếu sáng từ 18-22 lumen/oát.
Để so sánh, đèn dây tóc 60-100 w có hiệu suất cỡ 15 ImA/V, còn đèn huỳnh quang
tốt thi 100 lm /w . Một vấn đề khá cũ là hiệu suất giảm nhanh khi tăng dòng qua
LED. Tháng 9 năm 2003, một loại LED xanh da trời được công ty Cree giói thiệu
phát ra 24 mW với dòng điện là 20 mA. Điều này có nghĩa là 1 bóng LED trắng sẽ
có 65 lm /w với dòng 20 mA. Đây chính là LED trắng có hiệu suất cao nhất thòi đó,
hơn 4 lần so với đèn dây tóc. Nãm 2006, họ giới thiệu sản phẩm mẫu đạt kỳ lục mói
cho hiệu suất của LED trắng là 131 lm /w với dòng điện 20 mA. Năm này. công ty
Nichia Corporation giỏi thiệu LED trắng vối hiệu suất 150lm /w cũng vói dòng điên
20mA. Năm 2011, Xlamp XM-L, 1 dòng sàn phẩm cùa hãng Cree phát ra 100 Im w
với công suất 10 w , hiẽu suất là 160 Im/vv nếu công suất là 2 w .

79
CHƯƠNG 2 : PHẤN CỨNG V A n Á l U É U A I I M K U IIIM u a O tK M IifJ H C

Nãm 2012, Cree giới thiệu LED trắng hiệu suất 254 ImAV. Trong thực
tố, LED chiếu sáng có công suất từ 1 w trỏ lẽn. dóng tiêu thụ dién ninh là 350
mA. Chú ý là hiệu suất nói trên chỉ tính riêng cho LED và duoi rnòi ưuòng
nhiệt độ thấp trong phòng thí nghiệm. Trên thực tế. nhiệt đô cao và mạch
nguồn cho LED cũng có thất thoát năng lượng nên hiệu suất thấp non nhiéu
Tháng 3 năm 2012, cree tuyên bố LED mẫu đã đạt được 208 Im.vv vói nhiệt
độ phòng, nhiệt độ màu là 4579 K.
TUỔI THỌ
Bán dẫn nói chung và LED nói riêng rất bền khi dòng tiêu thụ nhò và ò
nhiệt độ thấp. Nhiều LED sản xuất năm 1970-1980 vẫn còn cho toi ngày nay
Tuổi thọ thường là 25.000 cho đến 100.000 giờ nhưng nhiệt đô cao và dòng
tiêu thụ cao thi tuổi thọ sẽ giảm nhanh chóng. Dạng hư hỏng chung cùa LED
(và diode la-de) là sẽ dần giảm độ sáng, hiệu suất. Hư hỏng đột ngôt dù hiếm
nhưng cũng xảy ra.
Các LED đỏ thời kì đầu tuổi thọ khá ngắn. Với sự phát triển LED công
suất cao, LED hiện đại phải chịu nhiệt độ cao hơn, dòng tải cao hon ngáy xưa.
Điểu này có thể làm giảm tuổi thọ nhanh chóng. Đê’ phân loại LED theo tuổi
thọ, người đưa ra khái niệm L70 và L50, nghĩa là thời gian để hiệu suất chiếu
sáng còn 70% và 50%.
Như các loại đèn khác, LED cũng phụ thuộc vào nhiệt độ. Hầu hết các
nhà sản xuất đều công bố thông số cho nhiệt độ phòng 25°c. LED ngoài trời
như đèn giao thông hoặc chiếu sáng công cộng nơi có nhiệt độ quá thấp hoặc
quá cao có thể giảm độ sáng hoặc có thể làm hư hòng LED. LED táng đô
sáng ở nhiệt độ thấp tùy loại cụ thể, thường là -30°c. Do đó LED có thể là sự
lựa chọn tốt để chiếu sáng ở kho lạnh của siêu thị và tuổi thọ sẽ cao hon các
loại đèn khác. Vì LED ít phát nhiệt hơn đèn dây tóc nên sẽ có hiêu suất cao
hơn ở những nơi dùng máy lạnh. Tuy nhiên cũng vì ít phát ra hơi nóng nên
LED có thể không dùng được ở những nơi có tuyết rơi dày. Để giải quyết vấn
đề này, người ta có thể thêm một mạch điện tạo sức nóng. Thêm nữa, một
nghiên cứu vừa thành công tạo ra 1 loại tản nhiệt truyền nhiệt váo khu vực
thích hợp bên trong đèn LED.
LED XANH DA TRỜI VÀ LED TIA c ự c TÍM
LED xanh da trời hiện tại dựa trên chất bán dẫn có vùng cấm rông như
GaN (gallium nitride) và InGaN (indium gallium nitride). Chúng cỏ thể dược
gắn chung với LED xanh lá và LED đỏ để tạo ánh sáng Irắng dù LED trắng
ngày nay ít dùng cách này. LED xanh da trời đầu tiên do Jacques Pankove
làm bằng chất gallium nitride vào năm 1971 ở RCA Laboratories Tuy nhién
ánh sáng của nó quá yếu nên không dùng được trên thực lế và sau đó nghiên
cứu về gallium nitride không có tiến triển gi nhiểu.

to
ABDUIWO DAWI CM NGtftfl Tự Hgc CHƯƠNG l: PBÃN CllNS VÀ PHÁN M ÉM AHDUIWO

V à o thá ng 8 năm 1989, công ty Cree Inc. bán ra LED xanh da trời đầu
tiên dùng chấ t bán dẫn có vùn g cấm gián tiếp, silíc các-bua. LED bằng SiC có
hiệu su ấ t rất thấp, không quá 0.03% . C uối thập niên 1980, đột phá trong
ng hiên cứu m àng m ỏng G aN epitaxial và cấy p-type đã dẫn tới m ột kỷ nguyên
mới cho các th iế t bị quang điện dựa trên GaN. T rên nền tảng này, vào năm
1993 LED xanh nước biển có độ sáng cao đã được hiện thực do Shuji
N a kam u ra của côn g ty N ichia C orporation dùng gallium nitride. C uối thậ p kỷ
1990, LED xanh da trời đã được phổ biến rộng rãi. Chúng có m ột hoặc nhiều
lớp kích hoạt InG aN quantum w ells được kẹp giữa các lớp dày bằng G aN, gọi
là lớp che phủ. B ằng cách thay đổi tỷ lệ In-Ga trong lớp InGaN quantum wells,
về lý th u y ế t có ph át ra ánh sáng từ m àu tím cho đến m àu hổ phách. T hay đổi
tỷ lệ A l/G a trong A lum inium gallium nitride (AIG aN) rồi dùng làm lớp che phủ
và lớp kích hoạt có thể tạ o được LED tia cực tím. Tuy nhiên cách này vẫn
chưa có được hiệu suấ t cũng như độ chín m uồi của công nghệ InG aN /G aN
(LED xanh lá, xanh da trời).
N ếu dùng G aN làm lớp kích hoạt quantum w ell layers thì có thể sẽ tạo
được LED p h á t ra ánh sáng gần khu vực tia cực tím, đỉnh cực đại nằm gần
365 nm. LED xanh lá làm từ InG aN /G aN có độ sáng, hiệu suấ t bỏ xa so với
làm từ cá c ch ấ t không phải hợp chất của Nitơ nhưng hiệu suấ t vẫn còn quá
thấ p so với yêu cầu thực tế cho 1 hệ thống chiếu sáng công suất lỏn.
Với hợp c h ấ t nitrit có chứa nhôm , thường là AIGaN và A IG alnN , có thể
ph át ra bước són g ngắn hơn tia cực tím. C ác LED cực tím đang trở nên
phổ biến trê n thị trường. LED có bước sóng gần tia cực tím bước sóng từ
3 7 5 -3 9 5 nm giá rẻ đã có trên thị trường như các đèn soi chống tiền giả, công
văn giả. C ác điốt có bước sóng ngắn hơn vẫn còn m ắc nhưng cũng đã có trên
trị trường với bước sóng nhỏ hơn 247 nm. Vì độ nhạy sáng của vi sinh vậ t gần
bằng với phổ hấp thụ c ủ a ADN , đỉnh ở gần 260 nm, các LED cực tím từ 2 5 0 -
270 nm sẽ trở thà nh th iế t bị khử trùng trong tương lai.
C ác ng hiên cứu gần đây cho thấy LED cực tím kiểu A (365 nm) đã trở
thành th iế t bị khử trù n g hiệu quả. Bước sóng ngắn hơn tia cực tím đã đạt được
trong phòn g thí nghiệm dùng alum inium nitride (210 nm), boron nitride
(215 nm )và kim cương (235 nm). Năm 2011, Z hong Lin W ang của Viện công
nghệ G eo rg ia đã ph át hiện ra dùng dây kẽm ôxít siêu nhỏ có thể tăng hiệu
suất của LED áp điện phát tia cực tim lên 4 lần, từ 2% lên 8%.
Tính ch ất
T ù y theo mức năng lượng giải phóng cao hay thấp mà bước sóng ánh
sáng ph át ra khác nhau (tức m àu sắc của LED sẽ khác nhau). Mức nãng
lượng (và m àu sắc của LED) hoàn toàn phụ thuộc vào cấu trúc năng lượng
của các nguyên tử chấ t bán dẫn.

81
CHƯƠNG ỉ : PHÂN CƯNG V À r a i l M Ẽ M A I DO 1*0 A 1 1 IIM 1 » a * M il T| IK

LED thường có điện thế phân cực thuận cao hon diođe T .:'.g •.’ìưòng.
trong khoảng 1,5 đến 3 V. Nhưng điện thế phân cực nghịch ỏ LED :ni Không
cao. Do đó, LED rất dễ bị hư hòng do điện thế ngược gãy ra
MÀU SẮC VÀ VẬT LIỆU
LED truyền thống được làm từ 1 s ố chất bán dẵn v ô CO - B à -g duói dãy
trinh bày các loại màu sắc cùng với bước sóng, và điện áp vật liẽb

Màu sắc Bước sóng [nm ] Điện áp [#V]

Hồng ngoại # > 760 # v < 1.63

Đỏ 610 < # < 760 1.63 < # v < 2 03

Cam 590 < # < 610 2,03 < # v < 2.10

Vàng 570 < # < 590 2.10 < #v < 2.1B

Xanh lá 500 < # < 570 1.9 < #v< 4.0

Xanh da trời 450 < # < 500 2.48 < # v < 3 7

Tím 400 < u < 450 2.76 < ttv< 4.0

Đỏ tía multiple types 2,48 < #v < 3.7

Tia cực tím #<400 3.1 < # v < 4.4

Hồng multiple types ttv~ 3.3

Trắng Broad spectrum # v = 3.5

Loại LED Điện th ế phân cực thuận

ĐỎ 1,4 - 1 , 8 V

Vàng 2 - 2,5 V

Xanh lá cây 2 - 2,8 V

82
ABDU1W0 I * H ỉ CHO Neưúl T ự nọc CHƯƠNG 2: PHẤN CỨNG VA PHÁN M ÉM AKDUINO

BÁI Ĩ Ậ P 2: ĐIỂU KHIỂN 3 LED RGB


T rong bà i tập trước bạn điều khiển 1 LED, bài tập sau hướng dẫn bạn
điều khiển 3 LED với 3 m àu khác nhau RGB. Nếu b iế t lập trinh cùng với khả
năng phối m àu, các bạn sẽ tổ hợp ra nhiều màu khác nhau từ 3 màu cũ bản
này. Bạn có thể dùng LED RGB được tích hợp trong m ột vỏ để dễ thấy hiệu
quả của hiệu ứng hơn. Trước khi thực hành, chúng ta hãy tim hiểu về lý thu yết
để dễ dàng lập trinh hon sau này. Bài tập sử dụng 3 LED là loại diode ph át
sáng m àu đỏ -xan h lá, xanh dương, hoặc đơn giản hơn m ột LED RGB. Các
LED RGB về lý thu yết m àu có cùng nguyên tắc tương tự như TV và m àn hình
m áy tính Bằng cách sử dụng ba màu ánh sáng cơ bản chúng ta có thể tạo ra
m ột loạt các m àu sắc thông qua m ộ l màu phụ - quá trinh trộn.

Đ ã y là hình thức pha trộn m àu


sắc được thể hiện trong bánh xe màu
RGB trong hình 2-1. Bạn sẽ thấy
bằng cách kết hợp hai màu cơ bản,
chúng ta có kế t quả là m ột m àu thứ
cấp. Ví dụ, kết hợp m àu đỏ và màu
xanh dương ta có m àu m agenta hay KA&KIA
m àu đỏ và m àu xanh lá cây, chú ng ta
sẽ có được m àu vàn g. N ếu chú ng ta
trộn tất cả ba m àu cơ bản với nhau BED
chúng ta sẽ có nàu ánh sáng trắng. Hình 2 _! Bánh xe m àu RGB

C ác LED đặc b iệ t được sử dụng ở đây thực sự là ba đèn LED cơ bản


ba m àu riêng b iệ t đỏ, xanh lá cây, và m àu xanh tích hợp trong m ột vỏ. N goài
ra, đèn LED này là loại cathode thường, có nghĩa rằng ba LED có chân
cathode chung và được nối với đất. C hân (Pin) này là cũng là chân dài nhất
trong số bốn chá n củ a LED. C húng ta sẽ kết nối ba chân còn lại tới bo m ạch
Arduino thông qua điện trở hạn dòng. Các thành phần này được lắp ráp trên
test board. T hay vì dùng 3 điện trỏ 330 ohm , ở đây ta sử dụng m ột điện trỏ
330 ohm nối nối tiếp vdi đèn LED m àu đỏ, hoặc chân 1 của LED RGB, và 2
điện trở 220 ohm nối nối tiếp với 2 LED xanh dương và xanh lá đến hai chân 3
và 4 (xem hình trang bên). Nếu không có các điện trở này, bạn có thể sử
dụng điệ n trỏ với giá trị 100 và 150 ohm hoặc những giá trị gần với giá trị này
nằm trong khoảng 100 ohm s và 1 kilohm . Nếu bạn sử dụng cùn a m ột giá trị
tuy dẻ khi th iế t kế, nhưng độ sáng của m ỗi m àu sắc có thể không đều.
L ư u ý: Các đèn LED RGB có sụt áp trên m ỗi đèn khác nhau tùy theo
hãng c h ế tạo. c ắ n tham kháo s ổ tay tra cứu của hảng sàn xuất. H ãy tham
khảo các sơ đồ đấu nguyên lý và sơ đồ đấu dãy điều khiển LED RGB đ ể lắp
ráp m ạch này.
CHUƠH6 2 : PBẮRC Ỉ K VÀ n il HẼH U IH N U I I M Ị U i a i M t i 1 MC

D ề tìm hiều thêm thông tin về mạch thiết kế. cách đoc sơ ứó va cac
chân cho các thành phần khác nhau có thề tham khảo ở phần phu luc trinh bày
ở cuối sách này.

81 338 -£■ UB1R


t* 9 ĨZD-----Wv-----w ũ
«2220 LEW G

nMIOỈ D----------W v ---------D +


S3 229 LEB3B

» n [ 3 ----------- W v -----------w ---------


t-« D
2 -o n v n
5-s.ue
im p a t ) 4 - e ft E B i

Hình 2-2. Sơ đổ nguyên lý mạch điều khiển LED RGB


GRQUMD P » E 9 ,tO ,1 1 Ể ầ . W »UD

Tải (Uploading) mã nguồn (Source Code) lên bo mạch Arduino.


Để hiểu rõ việc lập trinh với Arduino và giúp bạn đọc hiểu rõ phấn mã
nguồn, chúng ta sẽ bắt đầu với một thiết kế đơn giản để thay đổi rnàu cùa
LED RGB từ màu đỏ sang màu xanh lá cây sau đó sang màu xanh, liên tục
mỗi giây. Nếu để ý, bạn thấy mã nguồn trong bài tập này giống vói ví dụ
Blink từ file mẫu.
Về cơ bản, chúng ta đang chuyển từ việc lập trinh điếu khiển mót đèn
LED thành điều khiển 3 đèn LED. Lần lượt cho tùng LED sáng-tẩ: r.e o mót
thứ tự cụ thể, ở đây ta sử dụng ba biến. Mỗi khi chúng ta hiểu rõ 7 du nảy,
chúng tõi sẽ lập trinh được các yêu cầu phức tạp hờn.

84
ABDĐtKO DA N I CHO NEƯỪI ĩự BỌC CBƯƠNC£ PIẨI t ( K VÃ P lí l MÉM ẪllBBH

Mã N g u ổ n
B ài 2: Đ iểu khiển LED RGB
/* Bài 2: Đ iểu khiển LED RGB
Lần lượt cho các LED RGB LED sáng theo chu kỳ với 3 m àu khác nhau.
*/
void setupO (
pinM ode(9, O UTPUT); // T h iế t đặt chân số là ngõ ra
pinM o de(1 0, O UTPUT);
pinM o de(1 1, O UTPUT);

void loop() {
digita lW rite (9, H IG H ); // Led đò sáng
d ig ita lW rite (1 1, LOW ); // Led xanh dương tắt
delay(IOOO); // đợi 1 second
digitalW rite( 10, H IG H ); // Led xanh lá sáng
digitalW rite(9, LOW ); // Led đỏ tắt
delay(IOOO); // đợi 1 second
d ig ita lW rite (1 1, H IG H ); // Led xanh dương sáng
digitalW rite(10, LO W ); // Led xanh lá tắt
delay(IOOO); / / đợi 1 second

}
Lư u ý : Da s ố cá c dóng lệnh trong chương trình này là dạng chú thích.
Chú thích không là p h ầ n chính của chương trình nhưng nó g iả i thich cá c lệnh
trong chương trình cho người đọ c chương trình. Các chú thích có th ề là m ột
dòng lệnh đơn bà ng r và tiếp tục cho đến cuối dòng, hoặc nó có th ề là chú
thích nhiều dòng b ắ t đầu vói m ột r và chấm dứt các dòng sau đó vài m ộ t 7.
Nếu tất cả những chú thích trong m ột đoạn chương trình b ị lo ạ i bỏ, nó vẫn làm
việc đ ú ng như vậy, nhưng chúng ta dùng chú thích cho người đọc chương trình
hiểu nó đang là m gì.
Trước khi b ắ t đẩu, m ột từ được dùng sketch thay vì pro gra m ; đô i khi
dùng code. C ode là cách nói của người lập trình dùng cho m ột đoạn chương
trinh hoặc m ột th u ậ t ngữ có thuộc tinh cho những gi được viế t khi tạo ra m ột
chương trinh. Có thể nói "TÔI dã viế t m ột chương trinh" hoặc “T ô i đã viế t m ột
đoạn code".
CHƯƠNG 2 : PHÁN CƯNG VÁ PHÁN M É M A ID U H O U IIM IA U m W II TỊ MC

BÀI TẬP 3: ĐIỂU KHIỂN ĐÈN GIAO THÕNG


Bài tập hướng dẫn lập trinh điều khiển đèn giao thông t ẳ '5 càcn thay
đổi các đèn LED x a n h s a n g v à n g v à đ ỏ ( v à n g ư ợ c lạ i) . Sau đ ó C ' l i . ' i g sẽ tự
lặp lại theo chu kỳ với các thiết lập như một đèn giao thông thực :nu. Bài tãp
này có thể sử dụng để làm đèn giao thông cho mô hình đèn giao -.'õng duòng
sắt hoặc sử dụng cho các mô hình đèn giao thông trong thị trấn cno irè em
Bây giờ chúng ta cùng bắt đầu thực hiện chương trinh này!
Phần cứng
• Test board.
• 3 đèn LED.

Đèn LED đỏ Đèn LED vàng Đèn LED xanh lá cây


• 3 điện trở 150 ohm
• Dây nối
Kết nối phần cứng
Kết nối mạch điện của bạn như hình dưới. Trong bài tập này. bạn kết
nối 3 chân dương (anode) của 3 đèn LED lẩn lượt với các chân sõ' 5- 9 và 10
cũa bo mạch Arduino. Hãy nối một dây nối từ GND của bo mạch Arduino VÓI
một hàng phía trên của test board. Kết nối dây từ cực âm của mỗi đèn LED
với đất chung thông qua điện trở 150 ohm (hoặc bạn có thể sử dung các giá
trị điện trở phù hợp khác) cho mỗi đèn LED.
AHPOmO I A M c a t NGƯ0I ĩự BỌC CItflfK t n i l C iK V* PHÀM MẾM M U M

P h ấn mém
H ã y thêm mã lệnh dưới vào trinh biên dịch để kiểm tra, biên dịch và
tải nó xu ố n g bo m ạch của bạn. Những đèn LED sẽ sáng theo chu kỳ cù a hệ
đèn giao thông. Nếu bạn đã thực hành và hiểu rõ mã lệnh và phần cứng
trong bà i tập 1 và bài tập 2, thi bạn sẽ hiểu bài tập 3 m ột cách dễ dàng.
Chương trình điểu khiển 3 đèn giao thông:
// B à i 3 - Dẻn giao thông
int ledD elay = 10000; // Thời gian đợ i m ỗ i lần thay đổ i trạng thái đèn
int red P in = 10;
int yellow P in = 9;
int gre en P in = 8;
void setupO {
p in M o de(re dP in, O UTPUT);
pin M o d e (ye llo w P in , O UTPUT);
pin M o d e (g re e n P in , O UTPUT);

)
void loopO {
digita lW rite (red P in, HIG H); // Sáng LED đỏ
de la y(led D elay); // Đ ợi 5 giây
dig ita lW rite (ye llo w P in ,H IG H ); // Sáng LED vảng
de la y(200 0); // Đ ợ i 2 g iây
dig ita lW rite (g re e n P in , H IG H ); // Sáng LED xanh
digitalW rite(redP ir), LO W ); // Tắt LED đỏ
d ig ita lW rite (ye llo w P in , LO W ); // Tắt LED vàng
d e la y(led D elay); II đợ i 1 khoảng thời gian được đ ặ t trong biến ledDelay
// theo m iligiây
d ig ita lW rite (ye llo w P in , H IG H ); // Sáng LED vàng
d ig ita lW rite (g re e n P in , LO W ); // Tất LED xanh
d e la y(2 0 0 0 ); // Đợi 2 giây
d ig ita lW rite (ye llo w P in , LOW ); // Tắt LED vàng
II B ây giờ chương trình sẽ lặp lạ i

}
Hình trang bên là 4 trạng th á i sáng của các đèn khi chú ng ta thực hiện
chương trình. Và cách sáng củ a LED như đã lập trình thì có thể dùng cho m ôt
trụ giao thông đơn giản ở V iệ t Nam.

17
CHƯƠNG I: PHẤN CƯNG VA n i l M Ế M M M M A 1 IIM l « n M i w * Tf M t

Thứ tự sáng.
1. Đèn đô sáng
2. Đèn vàng sáng
3. Đèn vàng sáng
4. Đèn vàng sáng
1 2 3 4
Bạn đã thực hiện xong bài tập 3, một vấn đề đặt ra là nếu các đèn đò
vàng xanh không phải là LED mà là đèn có công suất lớn thi sao?
Giải pháp đưa ra là phải dùng mạch giao tiếp.
Có 2 cách hay được sử dụng là:
• Ngõ ra bo mạch Arduino giao tiếp với rũ-le, các đèn sẽ nối tiếp với các
tiếp điểm của rơ-le.
• Ngõ ra bo mạch Arduino kích các transistor hay Mosfet, các đèn sẽ
nối tiếp với các linh kiện này. cầ n lưu ý mỗi ngõ ra cùa bo mạch
Arduino chỉ cung cấp được dòng tối đa 20 mA và tổng các dòng ngõ ra
không quá 200 mA.
Các bạn hãy tham khảo bài tập sau để có ý tưởng thiết kế

BÀI TẬP 4: ĐIỂU KHIỂN CÁC CUỘN DÂY VÀ CÁC RƠ-LE


Bạn muốn kích hoạt một công tắc điện từ hoặc một rơ-le để điều
khiển các thiết bị khác? Solenoid là nam châm điện chuyển đổi nãng lượng
điện thành năng lượng từ dùng để hút tiếp điểm. Một rơ-le điện từ là một công
tắc được kích hoạt bởi một cuộn dây điện từ (Solenoid).

Phần cứng

Đa phần các cuộn hút yêu cầu nguồn lớn hơn nguồn Arduino có thể
cung cấp. Do đó, sử dụng một transistor (bóng bán dẫn) để cung cấp dóng
điện cần thiết cho việc kích hoạt cuộn điện từ. Kích hoạt cuộn điện tử có thể
thực hiện bằng cách sử dụng hàm digitalWrite để thiết lập ngõ ra số ỏ mức
CAO. Lựa chọn transistor thì phụ thuộc vào chỉ số dòng điện cần ci^ng cấp
cho các cuộn điện từ hay rơ-le. Những lài liệu kỹ thuật có thể nói đến hay
chúng ta có thể đo trở kháng cùa cuộn. Để tìm được dòng điện cần thiết cung
cấp cho cuộn cảm hay rơ-le, chúng ta có thể dùng cõng thức V=IR. Ví du mót
rơ-le 12 V với một cuộn cảm có trỏ kháng là 185 ohm thi cấn 65 mA

12 V/185 (ohm) =0,065 ampe, có nghĩa là 65 mA.

Chỉ cần dùng transistor như 2N2222 là đù cho yéu cấu của n i : cuôn
điện từ (solenoid) là khoảng cỡ vài trăm mili Ampe.

88
Am w oiAw Cll NCƯÚI Tự19c CMC t PIẤI tow V* HÁM MỀM AIMHH

C á c cuộn S olenoid lớn hơn sẽ đòi hỏi m ột transistor có thể dẫn dòng
điệ n cao hơn, giống như T IP 1 02 /T IP 120 hoặc tương tự. Có rất nhiều lựa chọn
thay th ế tra n sisto r phù hợp.

Hình dưới là sơ đổ m ạch điện nguyên lý dùng bo m ạch A rduino hút


cu ộ n dây điện từ (Solenoid). C húng ta sẽ lập trình cho m ột cuộn điện từ hút
trong vò n g 1 giây và 1 giờ sau lại tiếp tục hút m ột giây và cứ tiếp diễn theo
chu kỳ như vậy.

T rong m ạch điệ n ta thấy có sử dụng diode 1N 4001 bắt song song với
cuộn dây solenoid. M ục đích của các diode là để ngăn chặn dòng điệ n ngược
phát sinh từ cuộ n dây khi đóng ngắt làm hư hại các T ra n sisto r (Á p ngược là
m ột điện áp sinh ra khi dòng điện qua m ột cuộn d â y bị ngừng cung cấp), Nhờ
sự phân cực ngược của diode mà ta có thể chặn được dòng điện ngược này.

Những rơ-le dạng điện từ được kích hoạt giống như những cuộn điện
từ. Đ iều đặc b iệ t là: H iện nay, tại là các cửa hàng điện tử có bán m ộ t dạng
rơ-le được gọ i là Solid State Relay (SSR). Đ áy là m ột linh kiện điện tử có thể
được điều kh iể n trực tiế p bằng chân số cùa bo m ạch A rdu in o m à không cần
dùng tra n sisto r M osfet kích. H ãy tìm tài liệu liên quan về loại rơ-le SSR cùa
bạn sử d ụ ng để b iế t được điện áp và dòng điện mà nó cần để tác động. Nếu
các th ô n g tin vể dò ng và áp vượt quá 5 V olt hoặc 40 mA thì hãy sử dụng
m ạch trê n để điểu khiển.

19
CHƯƠNG 2: PHÁN CỨNG VA PBẤN M Ế M A8DUIN0 U I I M I U I O M O IIT fN t

Phần mềm

Kết nối mạch như hình và sử'dụng chương trình sau để điếu khiển
cuộn dây điện từ bằng bo mạch Arduino. Chương trinh của chúng :a sẽ cho
một cuộn điện từ hút trong vòng 1 giây và cứ 1 giờ sau lại hút n õ : giây. Qua
trinh cứ tiếp diễn theo chu kỳ như vậy.

Chương trìn h diều khiển các cuộn dây và các rơ-le

// Bài 4 - Điều khiển các cuộn dây và các rơ-le


int solenoidPin = 2;
void setupO
{
pinMode(solenoidPin, OUTPUT);
}
void loopO
(
long interval = 1000 ’ 60 * 60 ; / / Thời gian đếm là 60 phút
digitalWrite(solenoidPin, HIGH); / / Tác động cuộn hút
delay(1000); // Đợi 1 giây
digitalWrite(solenoidPin, LOW); //N gưng tác động cuộn hút
delay(interval); / / Dợi 60 phút theo interval
)
Các lệnh sử dụng Irong bài tập này không có gì mới nên khỏng có giải
thích chi tiết.

BÀI TẬP 5: ĐIỂU KHIỂN LED 3 MÀU (RGB)


Bài tập 2 các bạn đã thực hiện điểu khiển 3 LED R, G. B riêng biét
nhưng các bạn chưa biết cách điều khiển độ sáng của LED. Ban có thể khai
thác các chân số sử dụng bô điều xung của bo mạch Arduin đề điẽL kniển đó
sáng. Ngoài ra bạn còn biết cách dùng lệnh random để phối 3 màu đò. xanh
lá và xanh dương ngẫu nhiên tạo thành một màu mà chúng ta n t ố n phối
Phần cứng
Chúng ta sử dụng 3 LED gồm các màu: Màu đỏ, màu xa',-, á Ja màu
xanh dương.
Các linh kiện mà bạn cần có:
• Test board.

90
AKDUIWO B A M CHO NGƯƠI ỉự HOC CHƯƠNG 2: PHÁN C ÍN t VA PHÁN M ÉM ARDUINQ

• Đ èn LED 3 m àu.
Những đèn LED ph át sáng m àu khác nhau gốm 3 m àu đỏ, xanh lục và
xanh dưong. T rong những m àn hình m áy tính cũng sử dụng LED 3 m àu như
ng uyê n lý mà chú ng ta sử dụng, chú ng gốm m ột tấm nền chứa nhiều LED 3
m àu tích hợp trong từng điểm và để tạo ra các m àu sắc khác nhau chúng ta
ch ỉ v iệ c thay đổi độ sáng củ a 3 m àu đỏ, xanh lục và xanh dương.
Trong bài tập này, bạn cũng có thể sử dụng 1 LED RGB. LED RGB là
m ột loại LED có đường kính 5m m và chúng có 4 chân. M ột chân có thể là
anode (dương) chung hay cathode (âm) chung, 3 chân còn lại là những chân để
điều khiển m àu đỏ, xanh lục và xanh dương.
LED RGB đơn giản chỉ là m ột LED tích hợp 3 LED màu đỏ, xanh lục và
xanh dương. C húng giúp chúng ta thuận tiện hơn và dễ phối màu hơn nhưng lại
đắt hơn khi chúng ta sử dụng 3 LED riêng biệt.
Hình dưới là LED 3 màu và sơ đổ chân của nó.

• N ếu chú ng ta cấp cho đèn LED các a',á trị R, G, B lần lượt các giá trị
255, 0, 0 thì chú ng ta sẽ có màu đỏ thuần khiết.
• G iá trị là 0, 255, 0 sẽ nhận được mài.' yanh lục thuần k h iế t và 0, 0, 255
sẽ là m àu xanh dương thuần khiết. T ùy vào LED của bạn có màu
chinh xác hay không mà có thể tạo được bất cứ màu gì bạn m uốn.
C h ún g ta có th ể dễ dàng tạo ra các m àu m ong m uốn bằng cách điều
khiển độ sáng của 3 m àu cơ bản. Bảng trang bên mô tả m ột số màu
thường gặp bằng các phối độ sáng của LED.

91
CHƯƠNG 2 : PHẤN CỨNG VÀ P IẮ N M Ể M A tD U m g U l l l l l« u c a K*ếl Tf l|C

Đỏ Xanh lục Xanh dưdng Máu phối được

255 0 0 Đỏ

0 255 0 Xanh luc

0 0 255 Xanh dưong

255 255 0 Vàng

0 255 255 Màu lục lam

255 0 255 Màu hồng

255 255 255 Trắng

Phối màu với mẫu giấy hình trụ sẽ tạo nên những màu sắc khá đẹp.
Ngoài cách trên chúng ta còn có thể đặt 3 LED trong trái bỏng bàn màu trắng
đục. Với cách này, màu trộn nhìn cũng khá bắt mắt. Bạn có thể phối máu cho
LED bằng mọi cách, cốt yếu là 3 màu LED có thể trộn với nhau thành một
màu mà chúng ta mong muốn.

Bằng cách thay đổi độ sáng sử dụng bộ điều chế độ rộng xung, bạn
có thể tạo được những màu sắc mong muốn của minh. Khi chúng !a sừ dụng
các giá trị của bộ điểu chế độ rộng xung chúng ta sẽ khoảng giá trị từ 0 đến
255. Khi điều khiển độ sáng của 3 màu LED cơ bản thì bạn có thể tạo ra
1 6 . 7 7 7 .2 1 6 m à u ( 2 5 6 X 2 5 6 X 2 5 6 ).

• 3 điện trở 100 ohm.


• Dây nối.

Kết nố i phần cứng

ở đây ta dùng LED RGB cathode chung cho nên:


Kết nối lần lượt 3 chân đèn LED (LED đò, xanh lá và xanh dương) qua
3 điện trỏ hạn dòng 220 ohm với 3 chân 11, 10, 9 trên bo mạch Arduino.
Chân cathode chung nối với nguồn âm.
Phần mềm

Chúng ta sẽ lập trình phối màu 3 màu LED bằng cách sử dung bo
mạch Arduino.

Chương trinh điều khiển LED 3 màu RGB trong 1 vổ:

// Bài 5: Điều khiển LED 3 màu RGB trong 1 vỏ


float RGB1 [3];
M D O M I A M C l l MƯ 0I I f IQC CBtftfNG 2: PHAN C Ỉ K VA PHẤN M Ể M ARDUINO

floa t R G B 2[3];

floa t INC[3);
int red, green, blue;

int R edP in = 1 1 ;
int G reen P in = 10;
int B lueP in = 9;

void setupO

{
ra n do m S eed (an alo gR ead (0));

R G B 1Ị0] = 0;
RGB1 [1 ] = 0;
R G B 1[2] = 0;

R G B 2[0] = random (256);


R G B 2[1] = ran do m (256 );
R G B2[2] = random (256);

void loopO

{
ran do m S eed (an alo gR ead (0));

for (int x=0; x<3; X++) {


INC[x] = (RGB1 [X ] - R G B 2[x]) / 256; }

for (int x= 0; x< 256; X++) {


red = int(R G B1 [0]);
green = int(R G B1 [1]);
blue = int(R G B1 [2]);

analogW rite (R edP in, red);

93
CHƯƠNG 2 : PHÁN CỨNG V À PHÁN M É M A I D I M t Ấ llim IA U d M O IIT IM C

analogWrite (GreenPin, green);


analogWrite (BluePin, blue);
delay(100);
RGB1 [0] -= INC[0];
RGB1[1] -= INC[1 ];
RGB1 [2] -= INC[2];
}
for (int x=0; x<3; X++) {
RGB2[x] = random(556)-300;
RGB2[x] = constrain(RGB2[x], 0, 255);
delay(1000);
}
}
Khi chạy chương trình này, bạn sẽ thấy màu thay đổi chậm.

Bạn đã tự làm cho minh một nguổn sáng có màu thay đổi

Trong mã lệnh của bạn khai báo một mảng kiểu float và mô: số biến
kiểu integer để lưu các giá trị R (đỏ), G (xanh lục), B (xanh dương) như sau:

float RGB1 [3];


float RGB2[3];
float INC[3];
int red, green, blue;

Trong chưong trinh khởi tạo bạn có hàng lệnh như sau:

randomSeed(analogRead(0));
Lệnh ramdomSeed tạo ra những giá trị số ngẫu nhiên, vi điêu Khiển
của Arduino thực tế không thể tạo được một số ngẫu nhiên. Để tạo sô' ngẵu
nhiên chúng sẽ tim dữ liệu trong bộ nhớ của chúng hay tim trong rnõĩ bảng
g ồ m c á c g iá t r ị k h á c nhau v à s ử d ụ n g c h ú n g n h ư t h u ậ t toán t a o S 3 n g ẵ u
nhiên giả (pseudo-ramdom) để tạo ra một số ngẫu nhiên cho chúng :a Báng
cách cung cấp cho vi điều khiển nơi có thể cung cấp đưọc số ngẫu nmén tru
chúng bắt đầu tạo sô ngẫu nhiên 0 nơi bạn cung cấp.

Trong b à i tập này, giá trị cung cấp cho hàm ramdomSeed la giá trị
của ngõ vào Analog 0 của bo mạch Arduino. B ởi vi chúng ta khô ng két nó i
g i ở chân Analog 0, nên nhiễu sẽ tác dộng lên chán nay va Ardum o sẽ đọc
các giá trị nhiễu này như /a những s ố ngẫu nhién.

84
ABDUIM IA Mi CIO NCtftfl Tự 19c C H IlD N i 2 : n íu C l M V A N Ấ N M E M A M U IW O

B ạn chỉ cần cung cấp nơi có thể tạo ra số ngẫu nhiên m ộ t lần
trong chương trinh khỏi động. Sau đó có thể sử dụng hàm ram dom () để lấy
giá trị ngẫu nhiên. C húng ta sẽ th iế t lập 2 giá trị RGB được lưu trong 1 m ảng 3
phần tử. RGB1 chứa giá trị m àu RGB bạn m uốn đèn trần trang trí cùa m inh
sẽ b ắ t đầu (trong bài tập này là trường hợp khi bắt đầu đèn sẽ tắt), chú ng ta
khai báo như sau
RGB1 [0] = 0;
RGB1 [1] = 0;
RGB1 [2] = 0;
M ảng RG B2 để tạo các giá trị m àu mà bạn m uốn tạo ra để đèn minh
thay đổi theo:
R G B 2Ị0] = random (256);
RGB2J1] = random (256);
R G B2[2] = random (256);
T rong trường hợp này bạn thiế t lập chúng là m ột số ngẫu nhiên bằng
hàm random (256). Có nghĩa rằng, bo m ạch Arduino sẽ tự động tạo ra m ột số
ngẫu nh iê n từ 0 đến 255.
Nếu bạn sử dụng hàm randomQ mà không có khai báo thông số giới
hạn thì nó sẽ tạo ra các giá trị ngẫu nhiên từ 0 đến 1. Vì vậy chú ng ta nên
khai báo giới hạn cho hàm random . Vi dụ: C húng ta khai báo random (1000)
nó sẽ cấp cho ta m ột số ngẫu nhiên từ 0 đến 999. Nếu bạn cung cấp 2 thông
số giới hạn cho hàm random thì nó sẽ cung cấp cho chú ng ta m ột số ngẫu
nhiên trong khoảng từ số nhỏ đến số lớn. Ví dụ: random (10,100) thì nó sẽ cấp
cho bạn m ột số ngẫu nhiên từ 10 đến 99.
Trong chương trình chính, đầu tiên chú ng ta sẽ tìm bước tăn g cho mỗi
màu bằng cách lấy giá trị đầu trừ giá trị cuối và chia cho 256 bậc (bộ PW M có
giá trị từ 0 đến 255). C h ún g ta sử dụng vòng lặp for như sau:
for (int x=0; x<3; X++) {
IN C [x] = (RGB1 [x] - RG B2[x]) /2 5 6 ; }
Sau đó ch ú n g ta có vòng lặp sau:
for (int x=0; x<256; X++) {

red = int(RGB1 [0]);


green = int(R G B 1[1 ]);
blue = ìnt(RGB1 [2]);

analogW rite (R edPin, red);


analogW rite (G reenP in, green);

S5
GHtftfNG 2: PHẴN C Í M V Á N Á I M É U A I I I M Ẳ I1 M H I M m H I T| HC

analogWrite (BluePin. blue);


delay(IOO);

RGB1 [0] -= INCỊO];


RGB1 [1] -= INC[1];
RGB1[2] -= INC[2];
)
Nhiệm vụ của vòng lặp này là thay đổi màu cho đèn cùa chúng ta
Chúng sẽ tẹo xung PWM ỏ các chân 9, 10 và 11. Các giá trị màu trong mảng
RGB1 sẽ bị thay đổi phụ thuộc vào các bước thay đổi chúng ta đã tim trong
vòng lặp đầu tiên. Việc thay đổi màu trong vòng lặp này sẽ thực niên 256 lán
và chậm rãi giữa các màu từ tối cho tới màu chúng ta tạo ngẫu nhiên. Mỗi
bước thay dổi là 100 ms để các màu thay đổi nhẹ nhàng và đep hơn. Tất
nhiên có thể tăng tốc độ thay đổi màu nếu bạn muốn. Hoặc bạn có thể thêm
biến trò để chỉnh thời gian thay đổi màu.
Sau khi đã hoàn tất 256 lần thay đổi màu thi chúng ta cắn phải tạo
ra một màu ngẫu nhiên nữa cho đèn. Mảng RGB1 sẽ có giá trị gần giống
như mảng RGB2, và chúng ta tạo một màu ngẫu nhiên cho đèn bằng vòng
lặp sau:
f o r ( in t x = 0 ; x < 3 ; X + + ) {

RGB2[x] = random(556)-300;
RGB2[x] = constrain(RGB2[xj, 0, 255);
delay(1000);
}
Số ngẫu nhiên sẽ sẽ được lấy từ 0 đến 556 (256+300) và sau đó trừ đi
300. Chúng ta sử dụng cách này bởi vì bạn ép màu của đèn không phải là tông
màu trắng. Cách này có thể tạo ra số âm vì vậy chúng ta sử dụng thêm hám
constrain() để giá trị gửi cho bộ điều chê độ rộng xung không phải là sò’ ám.
Hàm constraint) bao gồm 3 thông số là X, a và b. Với X lá số bạn
muốn ràng buộc chúng theo các giá trị a và b, a là sô’ thấp cùa phạm vi ràng
buộc và b là số cao của phạm vi ràng buộc. Hàm constain() g itp chúng ta
r à n g buộc s ố X t r o n g p h ạ m vi t ừ s ố a đ ế n s ố b . Nếu X n h ỏ h ờ n a thi g á n X
bằng a còn nếu X cao hơn b thì gán X bằng b. Trong bài tập này chúng ta phải
r à n g b u ộ c X là m ộ t s ố t r o n g k h o ả n g từ 0 đ ế n 2 5 5 đ ể g ử i g iá t r ị đ õ r ô n g x u n g
cho bộ PWM. Trong bài tập này bạn sử dụng random(556)-300 C-ÌO giá trị
màu của bạn sẽ có những giá trị thấp hòn 0 và nhờ hàm constrain " lú n g ta
sẽ đảm bảo giá trị trẽn sẽ không vượt quá phạm vi từ 0 đến 255 để cấp
cho bộ PWM.

96
* A8DDIM lAWOII K W lT M ft____________________________________ cmrtfwc Z: HÁI tỉm Ù n *» IIẺM M U M

BÀI TẬP 6: ĐIEU KHtỂN s ú c SẮC SÁNG NGẪU NHIÊN

Bạn đã thực hiện 5 bài tập trong chương 2, trong bài tập 3 bạn đã thực
hiện điều khiển đèn giao thô ng nhưng trong thực tế nhiều hệ thống đèn giao
thông có yêu cấu phức tạp hơn khác với yêu cầu ở bài tập 3.
N hiểu đường cao tốc xe chỉ Ưu tiên xe đi theo 1 hướng dọc, đèn xanh
hướng này luôn luôn sáng. C hỉ khi có khách qua đường (ỏ đường ngang)
m uốn qua sẽ ra lệnh cho hướng này tạm dừng. Khi khách qua đường, đèn sẽ
chuyển trạ n g thá i Ưu tiên cho đường cao tốc. Người thiế t kế phải th iế t kế 1 nút
nhấn ưu tiên cho khách qua đường.
Tương tự như vậy, giả sử bạn m uốn thiế t kế cho m ột trò chói đánh bạc
điện tử có yêu cầu sau:

Có 7 đèn bố trí kiểu hình súc sắc, khi bật m áy thi lần lược các đèn sẽ
sáng theo số từ 1 đến 6. C á ch thể hiện bạn tự chọn, yêu cầu này lập trình rất
dễ dà ng . Nhưng chỉ cần thay đổi m ột ít yêu cầu như dùng 1 nút nhấn ra lệnh,
:các số sẽ chớp ngẫu nh iê n và dừng tại m ột số bát kỳ nào đó. N ếu ai đặt số
'trùng với số hiển thị sẽ thắ ng thi việ c lập trình sẽ khó hơn nhiều.

• o • o
o 0 0

o 0 0

o o o o • o

o • o •
• •
• 0 •

• o •
• •

• •

o o o
o

• •

M ộ t ví dụ khác: Bạn có 12 LED và tạo các hiệu ứng như yêu cầu ỏ
; :hương 5.
G iả sử bạn thiế t kế 3 hiệu ứng và nếu cho chạ y đoạn mã lập trinh nào
":hì chương trinh chạ y theo đúng yêu cầu đó. Nay bạn m uốn tạo hiệu ứng phức
ạp hon như:

S7
CHƯƠNG 2 : PHẤN C ÍN S V À n i l M Ể M U D IH Q U IIM 1*0 m M i l Tự l ậ t

Có nhiều nút nhấn, khi nhấn nút nào chương trình sẽ cnay đoan mà
tạo hiệu ứng đó. Để có thể thực hiện bài tập này bạn có thể là~i bãi táp 7
Điều khiển đèn giao thông và Ưu tiên cho người đi bõ để có ỷ tuông làm bai
tập theo yêu cầu trên. Bạn hãy tự mình thiết kế mạch điểu khiển súc sắc sáng
ngẫu nhiên mà không có hướng dẫn chi tiết để đánh giá khả nâng. Nếu chua
làm được, hãy làm các bài tập còn lại trong sách sau đó quay vé giải quyét
yêu cầu bài tập này.
Lưu ý: Bài tập 7 là bài tập khó, đã trình bày trong chuyén đế "Lập trình
điều khiển với Arduino" nay trình bày lại trong chuyển dề này để những ai chưa
xem qua sách “Lập trình diều khiển với Arduino" vẫn có thề vận ơung những ỷ
tưởng trong bài tập này đề lập trình các yêu cầu phức tạp hơn trong dãn dụng
củng như trong công nghiệp.

BÀI TẬP 7: ĐIỂU KHIỂN ĐÈN GIAO THÔNG VÀ Ưu TIÊN CIO N6Ư0I ĐI Bộ
Chúng ta cùng mở rộng bài tập 3 bằng cách thêm đèn cho người đi bò
và nút nhấn dành cho người đi bộ để yêu cầu cho phép qua đưàng.
Bo mạch Arduino sẽ phản ứng lại khi có nút nhấn được nhấn bằng
cách phát hiện trạng thái của nút nhấn. Tác dụng của nút nhấn này là yẻu
cẩu xe cơ giới dừng lại và cho phép người đi bộ qua đường an toàn. Đây là lán
đầu tiên chúng ta sử dụng nút nhấn để lương tác với bo mạch Arduino vá yẽu
cầu bo mạch Arduino làm một điều gì đó khi phát hiện có nút nhấn. Trong bai
tập này, bạn sẽ được tìm hiểu cách tạo ra một hàm của riêng minh trong
chương trình của mình.

Phần cứng

• Test board
• 2 Đèn LED đỏ, 1 Đèn LED vàng, 2 đèn LED xanh lá cây

• 5 điện trở 150 ohm, 1 điện trở 10K ohm


• Nút nhấn fjjS R
• Dây nối

Bạn có thể chọn các giá trị điện trỏ xấp xỉ cho đèn LED ồ bài táp nảy
Chúng ta có sử dụng các điện trở cho nút nhấn. Điện trở cho LED đưoc gọi la
điện trở hạn dòng, còn điện trở 10 K cho nút nhấn kết nối với đấ; (GND) dúnc
tro n g b à i tậ p n à y g ọ i là đ i ệ n trở k é o x u ố n g ( c h ú n g ta s ẽ t im h iể u < ỹ ỏ CUỐI
chương). Nút nhấn là các thiết bị chuyển mạch và bán rất nhiêu ò các cho
điện tử, bạn có thể tim và mua một cách dễ dàng. Chú ý: Ban rẻ-, "ìua loa
nút nhấn dễ cắm vào test board để thuận tiện cho việc sử dung,

Kết nối phần cứng như hinh trang bên.

98
A U I H DAM C ll HCtfdl Tự 19c C lM K I: m I CÍNS n MAN MỀM AIBPĨHO

H ãy thê m m ã lệnh dưới vào trình biên dịch để kiểm tra, biên dịch và
tải nó xuống bo m ạch của bạn. Khi bạn chạy chương trinh, nó sẽ bắt dầu với
đèn xanh cho p h ép xe cơ giới ch ạ y qua và đèn cho người đi bộ là đỏ.
Khi bạn n h ấn nút, chương trình sẽ cho phép kiểm tra nút nhấn và nếu
kể từ ƯU tiên lần gần nhất là 5 giây thì chương trinh sẽ thực hiện m ột hàm do
bạn tạo ra tên là c h a n g e L ig h ts (). Trong hàm này, đèn cho xe qua lại chu yển
từ m àu xanh th à n h m àu đỏ và sau đó đèn cho người đi bộ chu yển sang màu
xanh. Sau khoảng thời gian đã dược th iế t lập trong biến c ro s s T im e (thời gian
đủ để người đi bộ đi qua đưòng) thì đèn xanh dành cho người đi bô sẽ chớp
tắt để cảnh báo người đi bộ hãy qua đường nhanh bởi vì đèn cù a người đi bộ
ch u ẩ n bị chu yển trạng th á i sang đỏ. Sau đó thi đèn cho ngưòi đi bộ sẽ
ch u yể n thà nh m àu dỏ. Đ èn cho xe cơ giới từ màu đỏ lại chu yển thà nh m àu
xanh. Và chương trinh đèn giao thông lại chạ y theo yêu cầu.

99
CHƯƠNG 2: p i An C ứ ng V Ằ n Ấ I H Ế U U I I M U IIM u n a M O 1 HC

Chướng trình điều khiển đèn giao thông và ưu tiẽn cho ngưòi đi bộ:

// Bài 7 - Đèn giao thông và ưu tiên người đi bộ

int carRed = 12; // Đèn giao thông cho xe cơ giới


int carYellow = 11;
int carGreen = 10;
int pedRed = 9; // Đèn giao thông của người đi bộ
int pedGreen = 8;
int button = 2; // Nút nhấn cho người đi bộ
int crossTime = 5000; // Thời gian cho phép qua đường
unsigned long changeTime; // Thời gian khi nút được nhấn

void setupO {
pinMode(carRed, OUTPUT);
pinMode(carYellow, OUTPUT);
pinMode(carGreen, OUTPUT);
pinMode(pedRed, OUTPUT);
pinMode(pedGreen, OUTPUT);
pinMode(button, INPUT); // Nút nhấn ở chân 2
II Bật đèn xanh cho xe cơ giới và đèn đỏ người đi bọ
digitalWrite(carGreen, HIGH);
digitalWrite(pedRed, HIGH);
}
void loopO (
int State = digitalRead(button);
/* Kiểm tra nút nhấn và kể từ lần Ưu tiên gần nhất là 5 giây thì thưc hiện
khối lệnh của cấu trúc if ’/
if (state == HIGH && (millisO ■ changeTime) > 5000) {
// Gọi hàm thay đổi đèn cho người đi bộ
changeLights();
)
}
void changeLightsQ {
digitalWrite(carGreen, LOW); // Tát đèn xanh

100
ARDOWOIAMI CIO NGtftfl Tự 19c HtftfNC 1: P IẤ I c f K VÀ PIẤN MẾM AKDMM

d ig ita lW rite (carY e llo w , H IG H ); II Sáng đèn vàng


de la y(200 0); // Đợi 2 giây
d ig ita lW rite (ca rY e llo w , LOW ); // Tắt đèn vàng

d ig ita lW rite (carR ed, H IG H ); // Sáng đèn đỏ


delay(IOOO); // Đ ợi 1 g iâ y đ ể bảo đảm an toàn cho người đi bộ

dig ita lW rite (p e d R e d , LO W ); // Tắt đèn đỏ của người d i bộ


d ig ita lW rite (pe dG ree n, H IG H ); // Sáng đèn xanh của người đ i bộ

d e la y(cro ssT im e); // D ợ i thời gian mà chúng ta thiết lập


// Nhấp nháy đèn xanh của người đi bộ
for (int x=0; x<10; X++) {
d ig ita lW rite fp e d G re e n , HIG H);
d e la y(250 );
d ig ita lW rite (p e d G re e n , LOW );
d e la y(250 );

)
// Sáng đèn đỏ của người đ i bộ
d ig ita lW rite (p e d R e d , HIG H);
delay(500);

dig ita lW rite (ca rY e llo w , H IG H ); // Sáng đèn vàng


d ig ita lW rite (ca rR e d , LOW ); // Tất đèn đỏ
delay(IOOO);
d ig ita lW rite (ca rG re e n , HIG H);

d ig ita lW rite (ca rY e llo w , LO W ); // Tắt đèn vàng

// G hi lạ i thời gian cu ố i cùng vừa ưu tiên người đ i bộ


ch a n g e T im e = m illis();

// Sau đó trở về chương trình chính

}
Tìm h iểu mã lệnh bài tập 7 - Đ iều khiển đèn giao th ô n g và ưu tiên
cho người đi bộ

Bạn đã hiểu hầu hết mã lệnh trong chương trinh này nếu bạn đã thực
hành cá c bài tập trước. B ây giờ chú ng ta tập trung và o những từ khóa và
những khái niệm mới:
CHƯ0NC 2: ra Á N C0NC VÀ n Ắ I M Ế U U I I M U 1 IM U M CM B U 1 HC

Đầu tiên là từ khóa unsigned và kiểu trong khai báo biến ‘rang tẽ n
unsigned long changeTime;
Có một kiểu dữ liệu mới trong biến này. Trước đây chúng ta đã SỪ
dụng qua kiểu integer, trong biến Integer chúng ta có thể chứa mót số trong
khoảng -32.768 đến 32.767.
Bây giờ chúng đã tạo ra một kiểu dữ liệu mới tên là long. Và VÓI kiểu
long bạn có thể chứa được một số từ -2.147.483.648 đến 2.147.483 647 Tuy
nhiên chúng ta có thêm từ khóa unsigned trong khai báo long. Điếu này có
nghĩa, biến mà chúng ta sử dụng không chứa số âm. Vì vặy biến cnangeTime
trong chương trinh này có thể chứa một sô' trong khoảng từ 0 đến
4.294.967.295. Nếu bạn sử dụng kiểu integer để lưu độ dài của thời gian cùa
lần cuối ưu tiên thì bạn chỉ có thể có một khoảng thời gian tối đa lá 32 giãy,
bởi vì kiểu integer không thể chứa một số lớn hơn nữa.
Và người đi bộ qua đường thì không bao giờ lúc nào cũng qL3 cứ mỗi
32 giây hoặc nhỏ hơn nên chúng ta phải đề phòng trường hợp chưong trình
chúng ta có thể chạy sai bởi vì biến của chúng ta bị tràn khi lưu môt số lòn
hơn số mà nó có thể chứa. Vi vậy, chúng ta phải khải báo kiểu dữ liêu
unsigned long cho biến của chúng ta để có thể chứa được số lớn (giá trị thời
gian giữa mỗi lần nhấn nút ưu tiên).
Chúng ta cùng làm phép tinh để tính thời gian mà biến changeTime có
thể lưu được như sau:
4294967295* 1 ms = 4294967 giây
4294967 giây = 71582 phút
71582 phút = 1193 giờ
1193 giờ = 49 ngày
Và biến chúng ta tạo ra khá hợp lý vì nút nhấn người đi bộ phải đưọc
nhấn trong vòng 49 ngày. Vì vậy chương trình của chúng ta sẽ không xày ra
lỗi tràn.
Vậy tại sao chúng ta không sử dụng một kiểu dữ liệu có thể chứa mót
số vô cùng lớn? Đơn giản bởi vì biến của chúng ta chiếm quá nhiếu bõ nhớ
RAM cho việc không cần thiết, vi chúng ta còn cần RAM cho các muc dich
khác. Một số lớn hơn đồng nghĩa với việc sẽ có nhiều bộ nhó bị tiêu tốn non.
Trong máy tính hay Laptop của bạn thì có thể không quan tám vé Vấ-I đé nay
nhưng đối với một vi điều khiển nhỏ bé như vi điều khiển Atmega32 bè-, trong
bo mạch Arduino thì bạn phải cản đối sử dụng RAM cho các vỉẽc c à ' tniết
thay vì lạm dụng vào các mục đích vô nghĩa.
Bảng trang bên giới thiệu về kiểu dữ liêu và số bô nhớ RAM :ẽ _ tốn
và phạm vi có thể lưu số mà không bị tràn:

10?
ABDUIWO D A M cao N Ctldl Tự HQC [M l 2: PHÁN CIÍN6 VÀ HẮNM ỂM M BU M O

K iể u dữ liệ u RAM P hạ m v i s ố có th ể chứ a

bo olean 1 byte 0 đến 1

byte 1 byte 0 đến 255

char 1 byte -128 đến 127

unsigned cha r 1 byte 0 đến 255

int 2 byte -32.768 đến 32.767

unsigned int 2 byte 0 đến 65.535

word 2 byte 0 đến 65.535

long 4 byte -2.147.483.648 đến 2.1 47.483.647

unsigned long 4 byte 0 đến 4,294,967,295

float 4 byte -3.4028235E + 38 đến 3.4 028 23 5E + 38

double 4 byte -3.40 28 23 5E + 38 đến 3.4 028 23 5E + 38

string 1 byte + X Phụ thu ộc vào số ký tự trong chuỗi

array 1 byte + X Phụ thuộc vào các biến trong m ảng

M ỗi kiểu dữ liệu đều sử dụng m ột lượng bộ nhớ: M ột số biến chỉ sử


dụng m ột byte của bộ nhớ và có những biến dùng đến 4 byte hoặc hơn (bây
giờ bạn đừng quá lo lắng về 1 byte là gì, ch ú n g ta sẽ tìm hiểu về nó sau).
Chú ý rằng bạn không thể sao ché p dữ liệu từ m ộ t kiều này sang m ột
kiểu khác được. N ói m ột cá c khác, nếu X có kiểu là int và y có kiểu string, nếu
bạn gán X = y thì X sẽ có kế t quả không đúng bởi vì chú ng khác kiểu với nhau
nên bạn không thể gán như vậ y được.
Vi điều khiển A tm eg a16 8 có RAM dung lượng 1Kb (1000 bytes)
và A tm eg a32 8 có S R AM dung lượng là 2Kb (2000 bytes). Như bạn thấy, bộ
nhớ củ a ch ú n g khá nhỏ khi so với m áy tính hoặc Laptop (1G b = 1024 Mb và
1Mb = 1024 Kb). T rong những chương trình lớn với nhiều biến, bạn có thể dễ
dàng bị tràn bộ nhớ nếu bạn không cân đố i sử dụng RAM bằng việ c khai báo
biến. V i dụ: Bạn sử dụng biến có kiểu int (chúng chiếm tới 2 byte và có thể
lưu trữ m ột số là 32.767) để lưu sổ chân của bo m ạch A rduino, đối với
bo m ạch A rdu in o UNO chân có số cao nhất là 13 (và 54 trong bo m ạch
A rdu in o M ega).

103
CHƯƠNG 2: PHẤN C t M VÀ P IẮ N M Ế II A l i m U IIM I U M K W lT fH t

Như bạn thấy, chúng ta đã sừ dụng quá nhiều bỗ nhó cno viẽc khõnẹ
cần thiết. Bạn có thể giảm thiểu sử dụng bố nhó báng cách báo kill,
byte cho những số nhỏ. Và nó cũng đã đù để lưu số chân cùa bo mactì
Arduino vì khoảng số có thể lưu được là từ 0 đến 255
Tiếp theo bạn có dòng lệnh như sau:
pinMode(button, INPUT);
Lệnh này khi biên dịch, chương trình biên dịch sẽ hiểu răng bạn muõn
sử dụng chân số 2 như một ngõ vào. Bạn sẽ sừ dụng chân số 2 này để theo
dõi trạng thái của nút nhấn nên bạn cần phải thiết lập nó như ngõ vào.
Trong chương trình, kiểm tra trạng thái cùa chân 2 với dòng lênh sau
int State = digitalRead(button);
Cách khởi tạo này là một số integer (sau khi bạn đã xem cách phán
bổ RAM thì bạn thấy nó gây tốn RAM quá nhiều, chúng ta chi nên SỪ dụng
kiểu boolean) gọi là State và sau đó thiết lập giá trị của biến này theo giả tri
đọc vào từ chân số 2. Lệnh digitalRead đọc trạng thái của một cnãn và trà vé
dữ liệu trạng thái cho chúng ta. Bạn có thể kiểm tra giá trị trong biến trạng
thái để xem nút nhấn có nhấn hay không.
if (state == HIGH && (millis() - changeTime) > 5000) (
// Call the function to change the lights
changeLights();
}
Cấu trúc if được giới thiệu trong bài tập này là một cấu trúc dùng de
điều khiển và nó có mục đích là kiểm tra điều kiện có đúng hay khõng. Nếu
đúng thì nó sẽ thực hiện lệnh trong khối lệnh của nó (bao bài dấu ngoác
nhọn). Ví dụ: Nếu bạn muốn bật LED sáng khi một biến X tăng trên giá trị 500
thì bạn viết như sau:
if (x>500) {dĩgitalW rite(ledPin, HIGH);
Khi bạn đọc một chân sử dụng lệnh digitalRead, thì giá trị trà vé cùa
nó chỉ là CAO hoặc THÃP. Vì vậy cấu trúc if trong chương trinh như sau:
if (state == HIGH && (millis() - changeTime) > 5000)
Và câu iệnh này dùng kiểm tra cùng lúc 2 điểu kiên có đúng hay
không. Đầu tiên là biến State so sánh với mức CAO. Nếu nú: nhấn dược
nhấn thì trạng thái cùa nút nhấn sẽ là mức CAO, chúng ta đọc :rang thái
này từ chân số 2. Sau đó bạn cũng kiểm tra giá trị cùa millisO-cha^geTime có
lớn hơn 5000 hay không (sử dụng phép toán logic AND và thể 3 toán tử
&&). Hàm m illis() là một hàm được xây dựng sẵn trong ngôn Arduino
và nó trả về giá trị là số miligiây kể từ khi bo mạch Arduino bấ: í ắ t chạy
chưdng trinh.

104
ABDOIWO D A M CHO N etfdl Tự ll)C CHƯÚN6 2: PHẤN CỪNG VA PHÁN M ÉM ARDUINO

Biến c h a n g e T im e sẽ lưu lại giá trị này tại thời điểm cuối cùng khi kết
thú c hàm cha ng eL igh ts ưu tiên cho người đi bộ. Bằng cách lấy giá trị thoi gian
m ilig iâ y hiện tại trừ cho giá trị thời gian cuối cùng được ưu tiên gần nhất, và
đem giá trị trừ này so sánh với 5 giây. Nếu thài gian trừ này lớn hơn 5 giây thi
sẽ thực hiện khối lệnh bên trong cấu trú c if. Chúng ta đặt phép toán trừ trong
dấu ngoặc đơn để đảm bảo rằng phép toán logic A N D (& & ) sẽ thực hiện giữa
trạng th á i nút nhấn và phép so sánh của phép toán trừ vói 5000.
Biểu tượng && ở giữa và các tính toán dựa trên đại số Boolean.
State == H IG H T
T rong trường hợp này là And. M ột số toán tử logic thực hiện trong
ngôn ngữ A rdu in o như sau:
• Phép toán logic AND.
• “ II” : P hép toán logic OR.
• P hép toán logic NOT.
Đ â y là các toán tử logic và có thể sử dụng để kiểm tra điều kiên trong
cấu trú c if.
& & có nghĩa là đúng khi 2 toán hạng của phép AND là đúng. Vì vậy
cấu trú c if sau sẽ thực hiện khối lệnh bên trong cấu trúc chỉ khi x=5 và y=10,
nếu 1 trong 2 cái không đúng thi cấu trúc if sẽ không thực hiện:
if (x==5 && y= =1 0) { mã lệnh
II có nghĩa là đúng nếu m ột trong các toán hạng của phép OR là đúng
Vì vậ y cấu trú c if dưới đây sẽ thực hiện khi x=5 hoặc y=10:
if (x==5 II y==IO) { mã lệnh
! có nghĩa là đú ng nếu toán hạng của nó là sai. Vì vậy cấu trú c if dưới
đây sẽ thực hiện khi x=0 (có thể hiểu là X sai):
if (!x) { mã lệnh
Bạn cũn g có thể kết nối nhiều điều kiện với dấu ngoặc đón, ví d ụ :
if (x==5 && (y==10 II z= = 2 5)) { mã lệnh
Trong trường họp của câu lệnh phía trên thì điều kiện trong dấu ngoặc
đơn sẽ được thực hiện riêng !ẻ và sau đó lấy rstít quả đó AND voi điểu kiện
x==5. Đê’ đơn giản và dễ hiểu chúng ta cùng xem bàng sự thậ t để b iế t nó
ho ạt động như thế nào:
Khối lệ nh để thực hiện trong cấu trúc if là: changeLights(V.
V à đây là cách bạn sử dụng để gọi m ột hàm.
M ột hàm hiểu đơn giản chỉ là m ột khối lênh được tách riêng ra và
được đặt tên. Tuy nhiên, hàm có thể bao gồm các thông số và cũng có thể trả
lại giá trị nào đó.
CHƯƠNG 2: PHẪN CỨNG VẤ r a Á « M É M A 1 I I M M J IM !» ■ « K S IV r im

X Y z Đ úng hay Sai?

4 9 25 Sai

5 10 24 Đúng

7 10 25 Sai

5 10 25 Đúng

Trong bài tập này, hàm mà chúng ta không yêu cầu thông số nào và
nó cũng không trả lại giá trị nào cho chúng ta. Chúng ta sẽ tìm hiểu chi tiết
sau về hàm yêu cẩu thông số và trả lại giá trị dữ liệu nào đó. Khi hàm
changeLights được gọi thì chương trình sẽ nhảy đến dòng đầu tiên của hàm
để thực hiện tiếp chương trinh bên trong hàm và sau đó trỏ về thực hiên tiếp
chương trinh đang thực hiện (thực hiện lệnh tiếp theo tại nơi vừa gọi hàm).
Trong bài tập này, cấu trúc if khi hội đủ điều kiện thi chương trinh thực
hiện chương trinh trong hàm được gọi và trở về thực hiện tiếp dòng lènh sau
changeLights() trong cấu trúc if.
Mã lệnh bên trong hàm đơn giản chỉ thay đổi đèn cho xe cơ giói từ vàng
sang màu đỏ, rồi sau đó bật đèn xanh cho người đi bộ. Sau một thòi gian được
thiết lập trong biến crossTime, đèn sẽ sáng trong vòng vài giây để thông báo
người đi bộ rằng họ phải qua đường nhanh. Sau đó trạng thái đèn cùa người đi
bộ sẽ trở về màu đò và đèn cho xe cơ giới chạy tiếp tục màu xanh.
Chương trình chính đơn giản chỉ kiểm tra liên tục nút nhấn có nhấn
hay không. Và nếu có thi nó phải kiểm tra xem, từ lúc ưu tiên gần nhất đến
lúc nút được nhấn có phải là 5 giây hay không. Nếu đúng thì nó sẽ gọi hàm
changeLights().
Trong hàm changeLights nhìn rất đơn giản và bạn dễ dàng hiểu được
cách hoạt động của các lệnh trong hàm.
Trong những bài tập sau chúng ta sẽ tạo ra những hàm có thể trả vé
giá trị và có cấu trúc phức tạp hơn hàm chúng ta tạo trong bài này.
Tìm hiểu phần cứng bài tập 7 - Đèn giao th ô n g và Ưu tiên cho
người di bộ
Có một phần mói trong phẩn cứng ở bài tặp này là nút nhấn hay
chuyển mạch. Như bạn thấy trong mạch điện, nút nhấn không trực tiếp kết
nối giữa nguồn với ngõ vào mà có thêm một điện trở giữa nút nhấn va đất.
Điện trở này được gọi là điện trà kéo xuống và nó giúp nút nhấn hoa: đông ồn
định hơn. Ch Ong ta cùng tìm hiểu một số khái niệm để hiểu vế điên trà kéo
lên và điện t r j kéo xuống.
1
' ARĐOmO IIA W n o NGƠƠI Tự HỌC CHỬ0NG 2: PHÁN C(NC VÁ P IẤ N M É M AM BW Q

T rạn g th á i Logic
M ột m ạch logic là m ột m ạch có ngõ ra c h ỉ có mức logic C AO hoặc
_ logic T H Ấ P (cũng có thể hiểu là mức CAO là 1, mức TH Ấ P là 0). T rạng thái ỏ
mức T H Ấ P là điện áp gấn bằng o v , và trạng thái ở mức CAO có điện áp gần
' bằng điện áp nguồn cung cấp. M ạch logic đơn giản nhất là m ột chuyên m ạch
công tắc như hình dưới.

---------0 ^ 0 ---------

Khi côn g tắc hỏ, không có dòng điện qua nó và chúng ta không thể đo
điện áp ngõ ra của nó. Khi công tắc đóng lại thì dòng điện có thể qua nó. Vì
vậy, ch ú n g ta có thể đo điện áp củ a ngõ ra. Trạng thái mở có thể được đọc là
0 và đ ó ng m ạch được đọc như là 1.
T rong m ột m ạch logic, sẽ có m ột mức điện áp đại diện cho mức CAO
hay mức 1, thường thi mức điện áp của mức cao trong bo m ạch A rduino là
gần b ằ n g +5 V. Nếu mức điện áp của mức 1 là +5 V thi càng tốt. Tương tự
" như vậy, cũn g sẽ có m ột mức điện áp đại diện cho mưc TH ẤP hay mức 0,
thường trong bo m ạch A rduino thì điện áp đại diện cho mức 0 là gần 0 V (0 V
■ càng tốt). Nếu bạn không chắc chắn trạng thái của m ột m ạch logic là mức
nào thì bạn nên nối ngõ ra của nó với m ột điện áp nào đó để xác định nó là
mức nào. Vì khi bạn không không nối ngõ ra của nó với bất kỳ điện áp nào thi
: nó có thể là mức cao hoặc cũng có thể là mức thấp. Nếu bạn không nối ngõ
ra như vậ y thì trong điện tử gọi là ngõ ra thả nổi, nó có thể bị nhiễu và lúc này
nó ở mức 1, lúc khác nó lại ở mức 0. H iện tượng này có thể làm m ạch bạn sai
lệch hoặc hoạt động không ổn định. Vì vậy chúng ta nên thêm điện trở kéo
.. lẽn để chắ c chắn trạng thá i ngõ ra là CAO hay T H A P . Chúng ta không nên
thả nổi ngõ ra của m ột m ạch logic.

Đ iện trồ kéo xuống


Hình bên thể hiện sơ đổ của m ột ngõ
ra của m ột m ạch logic đơn giản có sử dụng

..
điện trỏ kéo xuống. N ếu nút nhấn được
nhấn, dòng điện sẽ chảy từ nguồn qua điện
E\
trở R2 và điện áp rơi trên điện trở là 5V, vì
vậy ngõ và o của bo m ạch A rduino sẽ đọc R1
vvv »
được m ột mức cao. T uy nhiên khi chúng ta
1CK) ohm
không nhấn nút thì điệ n áp cùa điện trở R2
gần bằ ng 0 nên chú ng ta sẽ đọc được trạng
thái có mức T H Ấ P .

GND

107
CHƯƠNG 2 : PHÁN C ÍN E VẢ P I Á I H Ế U A ID 1 M 0 A IIIM U M W J S M IT fJ K

Điện trở kéo lẽn


Trong mạch này, bạn có thể thấy
trạng thái ngõ ra đảo ngược với mạch điện
dùng điện trở kéo xuống. Khi nút nhấn
không nhấn, thì ngõ vào của bo mạch
Arduino đọc được giá trị mức CAO. Khi nút RI
nhấn được nhấn thì ngõ vào của bo mạch Input "VvW —
Arduino sẽ đọc được mức THẤP. Trong các 1G0 ohm
ÍNÍ
mạch điện tử thì đa phần điện trỏ kéo lên
được dùng nhiều hơn điện trở kéo xuống.

ìGRD

Bằng cách sử dụng điện trỏ kéo lên hoặc điện trởkéo xuống bạn có
thể chắc chắn được trạng thái ngõ vào là CAO hay THẤP, phụ thuộc vào
chương trình của bạn. Trong bài tập này chúng ta sử dụng một điên trò kéo
xuống để trạng thái ngõ ra của nút nhấn không bị thả nổi. Bạn hãy nhìn lại
điện trỏ kéo xuống kết với nút nhấn trong bài tập này ở hình trang bên. Trong
mạch này bao gồm một nút nhấn, một chân của nút nhất được nối Irực tiếp
với nguồn 5 V và chân còn lại kết nối trực tiếp với chân số 2 cùa bo mạch
Arduino. Ngoài ra chân kết nối với chân số 2 của bo mạch Arduino còn kết
nối với đất thông qua một điện trở 10 K. Nó là một điện trở kéo xuống.

Điều này có nghĩa: Khi nút


nhấn không nhấn thì bo mạch Arduino
sẽ đọc được giá trị là mức 0. Và khi nút
nhấn được nhấn thi bo mạch Arduino
sẽ đọc được giá trị là mức 1. Nếu ngõ
ra chúng ta không kết nối với điện trỏ
kéo lên hoặc kéo xuống thi bo mạch
Arduino có thể đọc ngõ ra của nút
nhấn có lúc là mức 0, có lúc lại là mức
1. Điện trở kéo lên thường được sử
dụng trong mạch điện tử để chắc chắn
ngõ ra luôn ỏ mức cao.
Ví dụ: IC 75HC595 là một thanh
ghi dịch có chán Master Reset (bạn
sẽ sử dụng nó trong những chương
sau). Chân này reset lại chip khi nó ở
mức thấp.

108
1 ARDUIW O 8 A M I c m N 6Ư Ơ I ĩ ự i g c CHƯỚNG 2: PHẤN c if l i t VẢ PHÁN M É M ARDUINO

Vi v ậ y chúng ta phải giữ nó trong toàn bộ thời gian hoạt động binh
thường, trừ khi bạn muốn reset chip. Bạn có thể giữ chân của chip ò mức cao
bằng các kết nối thêm điện trở kéo lên. Khi muốn reset nó, bạn chi việc xuất
giá trị mức 0 cho nó sử dụng ngõ ra số. Nhiều 1C cũng có các chân tương tự
như 1C 75H C 595 nên chúng ta sẽ thường xuyên gặp chúng trong m ạch điện tử.
Đ iện trở kéo lên bên trong của bo m ạch Arduino
T rong bo m ạch A rdu in o có bao gồm điện trở kéo lên 0 m ột số chân
(những ch â n anaglog cũn g có điện trở kéo lẽn). Có các điện trỏ 20 K kéo lẽn
bên trong bo m ạch và để chúng hoạt động chúng ta phải th iế t lập bằng phần
m ềm . Đ ể thiế t lập điện trở kéo lên bên trong cho m ột chân, đầu tiên bạn phải
thay đổi pinM ode cùa m ột chân thành ngõ vào và sau đó viế t m ột giá trị mức
cao vào chân đó sử dụng lệnh digitalW rite:
pinM o de(p in , INPUT);
d ig ita lW rite (p in , HIG H);
N ếu bạn thay đổi pinM ode từ INPUT thành OUTPUT sau khi đã thiế t
lập điệ n trỏ kéo lên bên trong, thì chân đó sẽ ở mức CAO. C húng ta cũng có
thể làm ngược lại: M ột chân ngõ ra có mức cao và sau đó chú ng ta chuyển nó
thành chân ngõ và o và nó sẽ tự động có m ột điện trở kéo vào bên trong.

TÓM TẮT
T rong chương 2, bạn đã thực hiện 7 bài tập điều khiển LED bằng
những lệnh cơ bản trong A rduino làm nền tản cơ bản cho việc thực hành điều
khiển LED phức tạp hơn (các hiệu ứng) cũng như các đối tượng phức tạp hơn.

C ác bạn đã tìm hiểu cá c đối tượng và khái niệm trình bày sau:

• Tầm quan trọng củ a lời bình (chú giải) trong đoạn mã lập trình.

• C ác biến (V ariab les) và các loại (types) trong lập trình.

• Ý nghĩa và m ục đích của các hàm setupO và loop().

• K hái niệm về hàm và làm thế nào để tạo ra chúng.

• T h iế t lập cá c pinM ode của m ột chân số trên bo m ạch Arduino.

• Thiết lập (Viết) một giá trị cao (HIGH ) hay thấp (LOW) cho một chân (pin).

• Làm thế nào để tạo ra m ột thời gian trễ tại m ột châ n (pin) trên bo
m ạch A rdu in o với đơn vị thời gian là m iligiây.

• Bo thử m ạch (T est board) và làm thế nào để sử dụng chúng.

• Đ iện trở là gi, và làm thế nào để sử dụng nó để hạn chế dòng điên.

• Làm thế nào để chọn giá trị điện trở cần thiế t cho m ột LED.

109
CHƯƠNG 2: PHÁN CỨNG VÀ n Ấ I M Í M M N M u s a * U M c» Itiln f i*

• Làm thế nào đọc các giá trị cũng như sai số cùa d iẽ i t'ò tứ các vòng
màu in trên nó.
• LED là gì và nó hoạt động như thế nào.
• Làm thế nào để tạo mã lặp sử dụng cho vòng láp for.
• Các toán tử toán học đơn giản trong mã lập trinh.
• Sự khác biệt giữa biến nội và biến toàn cục.
• Điện trở kéo lên, kéo xuống và cách sử dụng chúng.
• Làm thế não để đọc tín hiệu từ một nút nhấn.
• Khi nào quyết định sử dụng câu lệnh if.
• Thay đổi một chế độ (mode) chân giữa đầu vào (INPUT) và đẩu ra
(OUTPUT).
• Hàm millis ( ) và cách sử dụng nó.
• Các toán tử logic và làm thế nào để sửdụng chúng để đưara quyết
định hợp lý.
Bạn đã biết cách khai báo, đọc các tín hiệu ngõ vào và lãp trinh diéu
khiển cho đèn LED sáng và tắt. Bạn bắt đầu áp dụng những kiến thức điện tù
đã học của bạn để hiểu rõ đèn LED và điện trỏ làm việc ra sao, làm thế náo
điện trỏ có thể được sử dụng để hạn chế dòng điện, và làm thế nào chúng có
thể được sử dụng để tạo một một đầu vào ở mức cao (High) hay thấp (Low|
theo nhu cầu của bạn. Bạn cũng được ôn tập về lý thuyết cách dọc giá trị điện
trở cũng như sai số điện trở qua màu sắc in trên nó. Do sách in trắng đen nến
bạn không thấy rõ ra giá trị của nó tinh bằng ohms qua các vòng màu. Bạn có
thể tải về file thực hành (mã nguồn cho các bài tập trong sách) theo đường
dẫn trình bày trong phần giới thiệu hay trong trang web của tủ sách (Phẩn giói
thiệu sách lương ứng) để có file word với hình màu giúp bạn hiểu rõ hon cách
đọc giá trị và sai số điện trở. Bạn cũng hiểu rõ hơn về ngôn ngữ lập trinh
Arduino (phần cơ bản) qua một số lệnh và khái niệm.
Những kỹ năng mà bạn học được ở Chương 2 sẽ là nén tảng cho
những dự án Arduino phức tạp hơn. Trong chương tiếp theo bạn sẽ lâp trinh
Arduino để điều khiển đèn LED với yêu cầu ohức tạp hơn. Một khi đã làm
quen với việc lập trình trong Arduino bạn có thể hiểu việc lặp trinh và diéu
khiển các đối tượng vói yêu cầu cao hơn trong cấc chương tiếp theo. Lúc này
nếu cần phải sắm thêm các linh kiện thực hành bạn sẽ không ngai vi bạn có
thể điều khiển được chúng, khai thác có hiệu quả chúng trong cống viéc.

110
M I I M IÀ M d i NCƯ0I ĩặ 19c CHƯƠNG 3: BIẾ1 n ẩ l V* TẠO HI£U ƯN6 v đ l 6 LED

CHUÔNG 3

ĐIỂU KHIỂN VÀ TẠO HIỆU ỨNG V016 LED


■ ■

T rong cu ộ c sống, m ột lĩnh vực luôn tổn tại và chú ng ta thường tiếp xúc
đó là tĩnh vực quảng cáo. Q uả ng cáo ở đây không chỉ bao gồm cá c quảng cáo
ở tru yề n hình, băng rôn mà còn có các bảng hiệu. M ục tiêu quan trọng nhất
trong quản g cá o là làm người khác chú ý, làm sao cho họ phải nhớ đến sản
phẩm cần quảng cáo. Đ ể làm được điều này, người th iế t kế phải làm nổi bặt
sản phẩm m ình m uốn quản g cáo. Bạn có thể làm nổi bật bảng hiệu hay băng
rôn quảng cáo bằng nhiều cách, m ột trong những cách hiệu quả là ph ối hợp
ánh sáng cho chúng.
Đ è n LED là m ộ t loại đèn phát sáng đài mới tiêu hao năng lượng rất
thấp, có nhiều m àu sắc để chọ n lựa, LED có nhiều ứng dụng trong cuộ c sống
hiện tại và tương lai. H iện nay đèn LED đã bắt đầu thay thế dần cá c loại đèn
chiếu sáng th ô n g d ụ ng trước đây m ặc dầu giá thành còn khá cao, nhưng về
lâu dài thì rất tiế t kiệm về m ặt năng lượng, cụ thể trong chiếu sáng công cộng,
đèn đường, đèn ch iế u sán g vỉa hè...

Thay vì chiếu sáng quảng cáo bằng đèn neon, LED thay cho đèn
neonsign tiế t kiệm 50% điện năng và ít bị hư hỏng hơn so với neonsign, các
bảng quản g cá o LED rất sinh động và tiế t kiệm năng lượng. Bảng điện tử có
thông tin thay đổi được còn gọi là bảng quang báo hay m àn hình điện tử LED
có nhiều m àu sắc, nhiều cách hiển thị sinh động, dễ dàng thu h ú t sự chú ý
của m ọi người. Do dễ d à ng thay đổi thông tin trên bảng điện tử, nên đâ y được
xem như là phương tiệ n để truyền đạt thô ng tin hiện đại, nhanh chóng.
Đê’ tạo thà nh các bảng hiệu có thông tin cố định người ta thường dùng
các loại LED đơn với nhiều màu sắc để tạo cá c ký tự và hình ảnh, dùng m ạch
điện tử điều khiển sự chớp tắ t và tạo hiệu ứng ánh sáng m ong m uốn. Đê’ phối
hợp ánh sáng m ộ t cách tốt nh ất thì bạn cũn g có nhiều cách . Có thể sử dụng
bo m ạch A rd u in o để ph ố i ánh sáng cho cá c bảng quảng cáo, tuy khô ng phải
là cách tố t và đơn giản nhất so với việ c dùng các bo m ạch chu yên dùng
nhưng m ột khi b iế t cách lập trình với bo m ạch A rduino bạn có thể lập trình cho
nhiều yêu cầu khác nữa m à các bo m ạch chu yên dùng điều khiển LED rất
khó hay khô ng thể điều khiển được.

111
CHƯƠNG 3: BIỂU KHIỂN VẢ TẠO HIỆU ỉ m v ẩ l ( I E I AIHIMI M B M K H I T| MC

Vói bo mạch Arduino, bạn có thể tự tạo cho mình những tấ n bãng
LED quảng cáo đơn giản cho riêng mình mà không cần phải có các ""lach
điều khiển phức tạp. Chí vói một sợi cáp USB bạn cỏ thể láp trinh vá sứa đồi
hiệu ứng chiếu sáng một cách dễ dàng.

Có 3 loại bảng hiệu quảng cáo thuòng thấy:

112
ASCIIDM IA H i CIS NCtfdl Tự HỌC CHƯƠNG J: BIÉB K IẾ N VA TẠ8IIẾIIỬ N 6 wứl 6 LED

• B ảng In d o o r: Sử d ụ ng tố t trong nhà, không sử dụng được ngoài trời vi


khô ng đủ độ sáng và không chịu được mưa, nắng.

• B ả n g O u td o o r: Có độ sáng cao (khoảno 5000 m cd/m 2) kết cấu chắ c


chắ n chịu được mưa, nắng.

• B ảng S e m i-o u td o o r: Có độ sáng cao sử dụng tố t ngoài trời, chịu


mưa n ắ ng kém , sử dụng thích hợp làm bảng hiệu quản g cáo dưới m ái
h iê n nhà...

• L e d s ig n : Là cá c bảng hiệu, bảng báo hiệu có sử dụng LED để trang


trí và gây sự chú ý cao trong cảnh báo và trong kinh doanh để thu hút
sự chú ý của khách hàng.

C h ún g ta sẽ b ắ t đầu với chương này bằng các m ạch điện đơn giản và
các cách điều khiển cơ bản. Bạn có thể dễ dàng điều khiển LED theo ý m inh
m à khô ng cần ph ả i kham khảo thêm bất kỳ sách nào. M ột khi đã điều khiển
thà nh th ạ o LED đơn bạn sẽ có cơ sở để thành lập các m ạch đèn khác như
LED 7 đoạn, LC D, LED m a trận cũng như các m ạch điện tử ứng dụng trong
công ng hiệp cũn g như dân dụng khác như:

Đ o và khố ng c h ế n h iệ t độ, độ ẩm, đo cường độ ánh sáng, đo khoảng


cách, dẫn đưàng cho Robot, điều khiển động cơ DC, động cơ servo, động cơ
bước v.v.

BÀI TẬP 1: CHỨP TẮT XEN KẼ 3 LED


B ạn đã hiểu về cá c ngõ ra/ngõ vào củ a bo m ạch A rduino, và bạn đã
biết: T rong lĩnh vực điều khiển có thể phân ra ba loại điều khiển sau:

1. Đ iều kh iể n đố i tượng tự động hoàn toàn.

2. Đ iều khiển đố i tượng bán tự động.

3. Đ iều khiển đố i tượng hoạt động theo qu yết định của chú ng ta

Với c á c bà i tập ở chương này ch ú n g ta sẽ thực hiện điều khiển LED


chạy hoàn toà n tự độ ng nên không dùng các ngõ vào. Vì các ngõ và o giúp
chúng ta có thể đọc được các tác động từ bên ngoài, các hoạt động bẽn ngoài
là khô ng cẩn th iế t trong chương này. ở đây, chú ng ta sẽ tập trung chương
trình g iả i th u ậ t các hiệu ứng LED mà không quan tâm đến các vấn đề về các
hoạt đ ộ ng tác động từ bên ngoài.

C á c bài tập của chương này chỉ tập trung vào các ng õ\vào ra khá đơn
giản củ a bo m ạch A rduino. Những đâ y là các phần cứng cơ bản của bo m ạch
A rdu in o nên bạn phải sử dụng chú ng m ột cách nhuần nhuyễn trước khi lặp
trình với các yêu cầu điều khiển khó hơn.

113
cHƯƠN6 2: 6IÉ U KHIẾN VA T Ạ I B É I Ì N t v i l I L E t U H IM ! * ■ CH W H IT lH t

Phần cứng
Phần cứng bài tập này khá đơn giản, chúng ta chỉ sử di-^.g các LED
và các điện trở để hạn dòng bảo vệ LED. Các bạn có thể sử dung các đèn
LED siêu sáng để làm nổi bật các bảng quảng cáo dùng LED.
• Bạn có thể dùng 6 LED siêu sáng để việc chiếu sáng nổi b ã i hon.

• Điện trở hạn dòng (6 điện trở 220 ohm).

Kết nố i phần cứng


Hãy ngắt nguồn và cáp USB của bo mạch Arduino sau đó kết nối
mạch như bảng hình dưới và hình trang bên.
Bạn phân biệt cực của LED bằng cách nhin vào các chân LED (đối với
các LED mới mua), chân dài là chân dương của LED, còn chân âm cùa LED
là chân ngắn. Các LED không thể phân biệt dược chân thì bạn hãy nhìn vào
khói LED, chân âm là chân bên phía mặt bị mài phẳng của đèn LED, chân
còn lại là chân dương.
Bạn nối mạch như sau: Các chân âm của LED bạn nối với GND cùa
bo mạch Arduino thông qua điện trở 220 ohm. Các chân dương của LED bạn
nối lần lượt với các chân 0 đến chân 5 của bo mạch Arduino.

Bảng kết nối chân của LED với bo mạch Arduino:

BO M Ạ C H A R D U IN O LE D

C h â n số 0 LED 0

C hân số 1 LED 1

C h â n số 2 LED 2

C h ân số 3 LE D 3

C h â n số 4 LED 4

C h â n số 5 LED 5

Hình trang bên là kết nối mạch trẽn lest board.

114
A H O M I IAMCIO NGƯƠI Tự HỌC CHƯƠNG J: ĐIÉa HIỂU VA TẠO B tậu ƯM6 v đ l 6 l£Đ

Hình trang bên là ảnh kết nối m ạch trên chương trình Proteus (bạn hãy
tham khảo phần hưóng dẫn "Mô p h ỏ n g A rd u in o trê n P rote us")

115
CHƯƠNG 3: ĐIẾU KHIỂN VÁ TẠO D Ẽ O ỈN C vứ l c LED A U U M IIA M w w im w

Hoạt động của chương trình

N. LED

T rạ n g V LED 5 LED 4 LED 3 LED 2 LED 1 LED 0

th ái

1 X X X

2 X X X

3 X X X

116
ARDUtNO BAND H O NGtftfl Tự HỌC CHƯƠNG ỉ : B IẾ II KB1ỂN VÁ T Ạ I BIÊU ƯH6 «016 LED

P h ầ n m ém
Chương trình cho bà i tập này được viế t có nhiệm vụ điều khiển 3 LED
chớp tắt xen kẽ nhau. Chương trinh sử dụng các lệnh đơn giản gồm các hàm
sử d ụ n g xu yê n su ố t cho toàn chương. Bạn hãy kham khảo chương trình này
th ậ t cẩ n thận vi các bài tập sau đều sử dụng các hàm cơ bản của bài này.
C hươ ng trìn h ch ớ p tắ t xen kẽ 3 LED
// Chương trình chớp tắt xen kẽ 3 LED
// Khai báo các chân kế t n ố i LED với bo m ạch Arduino
#define LEDO 0
#define LED1 1
#define LED 2 2
#define LED 3 3
#define LED 4 4
#define LED 5 5
// Biến trạng th á i LED
unsigned cha r S ta te L E D = 0 B 0 0 0 0 0 1 11;
// Chương trinh khở i tạo
void setupO

{
// Khởi tạo ngõ ra cho các chân n ố i LED
pinM ode(LE D O ,O UTPUT);
pin M o d e (L E D 1 ,O U TPU T);
p in M o d e (L E D 2 ,O UTPUT);
p in M o d e (L E D 3 ,O UTPUT);
pin M o d e (L E D 4 ,O U TPU T);
pin M o d e (L E D 5 ,O U TPU T);

}
// H àm rú t các b it riêng lẻ trong m ộ t biến
boolean B itS ta te (ch a r pos)

{
boolean xbit;
unsig ned cha r xchar;
if (pos<8) xchar=Ox1 & S ta te L E D » p o s ;
xbit= xcha r;

117
CHƯƠN6 2: BIẾU KHIẾH VA IA 8 H1É0 Ứ N t v i l I L E I U H I H ! * ■ C M m i l T Ị lệ t

return xbit;
}
// Hàm thay đổi LED theo biến trạng thái LED
void LEDChangeO
{
digitalWrite(LEDO,BitState(O));// LED 0 sẽ ứng vói bit 0 trong biến StateLED
digitalW rite(LED1,B itstate(1)); // LED 1 sẽ ứng với bit 0 trong biến SiateLED
digitalWrite(LED2,BitState(2));
digitalWrite(LED3,BitSlate(3));
digitalWrite(LED4,BitState(4));
digitalWrite(LED5,BitState(5));
}
// Chương trình chính
void loopO
{
// Dảo giá trị trạng thái LED
StateLED=~StateLED;
LEDChangeO; // Gọi hàm thay đổi LED
delay(500); // Dợi 0.5 giây
}
Hãy viết chương trình, biên dịch và tải xuống bo mạch Ardúno. Nếu
kết nối mạch đúng và mạch hoạt động chính xác thi bạn sẽ thấy 3 LED đáu
sáng và 3 LED cuối tắt. Sau 0.5 giây thi 3 LED đẩu tắt và 3 LED cuối sáng.
Sau 0.5 giây chương trình sẽ lập lại như ban đầu.
Tìm hiểu mã lệnh
Trong chương trình này, bạn sẽ sử dụng các hàm cơ bản của Arduino
Bắt đầu chương t r ì n h , bạn sẽ khai báo tên LED ứng với các sỏ chằn tuong
ứng trên bo mạch Arđuino.
#define LEDO 0
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5

118
ABDUIWO 8A W CIO N6ƯỈI Tự UỌC CHƯƠNG ỉ: QIỂU KHIỂN VÀ TẠO HIỆU tfH6 V Ứ I6 L Ĩ1

T rong bài tập sử dụng 6 LED nên bạn khai báo các LED có số thứ tự
tử 0 đến 5. B ạn dùng từ khóa # d e fin e để gán giá trị các chân trên bo m ạch
A rd u in o và o các tên LED(LEDO, LED 1,..). Từ khóa #define có rất nhiều tác
dụng, ngoài v iệ c sử dụ ng gán m ột giá trị cho các tên riêng nào đó. Bạn còn
thể sử dụng nó để thay tên cho m ột kiểu ví dụ:
#define sothuc float
soth uc k e tq u a l ,ketqua2;
thay vì
float k e tq u a l ,ketqua2;
H oặc sử dụng nó như m ột macro:
#define tinh do ng die n (u,r) u/r
Bạn sẽ sử dụng bằng cách:
floa t d o ng die n= tinh do ngd ie n(12,100);
B ạn có thể sử dụng từ khóa #define cho chương trình vì nó rất tiệ n lợi.
Bạn có thể lưu các hằng số tính toán, các nốt nhạc, cá c macro... và m ột tên
riêng nào đó để bạn dễ dàng ghi nhớ hơn. Trở lại với chương trình, bạn khai
báo m ột biến S tateL E D để chứa các trạng thái các LED trong biến. Và khi
biến S tateL E D thay đổ i thì chú ng ta sẽ cho LED thay đổi theo các bit cùa
State LED . V à c h ú n g ta đã gán giá trị khởi đầu để 3 LED cuối sáng để khi bắt
đầu chương trình đảo giá trị thì 3 LED đẩu sẽ sáng đầu tiên:
unsig ned cha r S tate L E D = 0 B 0 0 0 0 0 1 11;
T iế p theo là chương trình khởi tạo của Arduino, trong chương trinh khởi
tạo bạn sẽ thiế t lập cá c châ n nối với LED là các chân ngõ ra:
void setupO
{
pinM ode(LE D O ,O UTPUT);
p in M o d e (L E D 1 ,OUTPUT);
p in M o d e (L E D 2 ,OUTPUT);
p in M o d e (L E D 3 ,O UTPUT);
p in M o d e (L E D 4 ,O UTPUT);
p in M o d e (L E D 5 ,O UTPUT);
}
H àm tiế p theo là hàm rút cá c bít từ biến trạng thái StateLE D , bạn có
thể điều chỉnh hàm này để rút các bit từ cá c biến khác hoặc cho m ục đích
riêng củ a bạn:
b oolean B its ta te (c h a r pos)
{

119
CHƯƠHS 3: eiẼ U KHIẾN VÁ T Ạ I n t l I m v t l t L E I UNIM ! * ■ CM ■ » « ! T Ị Hĩ

Đầu tiên, bạn khai báo các biến sử dụng trong hàm. biến xbit sẽ có
nhiệm vụ chứa bit được rút theo vị trí tại biến pos và chúng ta sẽ trả giá trị xbit
cho hàm Bitstate. Còn biến xchar sẽ chứa kết quả tính toán kiểu unsigned char-
boolean xbit;
unsigned char xchar;
Vi hàm này có mục đích là rút các bit của một byte nên giá trị pos phải
là một số từ 0 đến 7 tương ứng từ bit 0 đến bit 7 trong biến StateLED Nếu pos
nhỏ hơn 8 thi chúng ta sẽ thực hiện phép toán dịch bit sang phải biến
StateLED với số bit dịch là giá trị pos, sau đó thực hiện toán tử AND với két
quả từ phép tính trên. Cuối cùng chúng ta sẽ có giá trị bit muốn rút nằm ỏ bit
cuối cùng của biến xchar:
if (pos<8) xchar=0x1 & StateLED>>pos;
Phép toán dịch bit trong bài này chúng ta sử dụng toán tử đây lá
toán tử dịch phải và tiếp theo là giá trị sô' bit bạn muốn dịch. Ngoài ra. còn có
toán tử dịch trái. Hai toán lử này như tên gọi của chúng, sẽ giúp ban dịch các
bit theo hướng bạn mong muốn.
Vi dụ, bạn có biến A = 0B00011011, khi bạn thực hiện các pnép toán
sau đây: B = A « 1 ; C = A » 3 ; thi bạn sẽ có giá trị các biến B=0B0Ũ110110, biến
C=0B00000011. Và toán tử logic AND kí hiệu toán tử này giúp ban thực
hiện phép tính logic AND trẽn toàn biến.
Toán tử AND trên bit của 2 giá trị A và B sẽ có bảng sự thát nnư sau:

A B A AN D B

0 0 0

0 1 0

1 0 0

1 1 1

Nếu bạn thực hiện phép tính AND với toán tử trong ngón ngữ
Arduino bạn sẽ thực hiện các phép tính AND trẽn từng bit của biến ban thực
hiện phép toán. Ví dụ bạn có biến A=0B01101001 và phép tính trong ngón
ngữ Arduino là B=A&0B11001011 thi Arduino sẽ thực hiện như sau:
01101001
AND 11001011
= 01 00 1 0 0 1
Và B sẽ có giá trị là 0B01001001.

120
ARDUINO DANH cao N C tfll ĩự HỌC CHƯƠNG 3: ĐIẾU KHIỂN VẢ TẠO HIỆU ƯM6 vứl 6 LED

Sau khi tính toán xong ch ú n g ta gán giá trị xbit là giá trị vừa tính được.
Sở đĩ c h ú n g ta thực hiện gán giá trị xcha r cho biến xbit bởi vì chú ng ta m uốn
lấy bit cu ố i cù n g củ a giá trị xcha r và trả giá trị lại cho hàm:
xbit= xchar;
return xbit;

}
T iế p theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến S tateLE D :
void LED C hangeO

{
d ig ita lW rite (L E D 0 ,B itS ta te (0 ));// LED 0 sẽ ứng với bit 0 trong
biến StateLED
digitalW rite(LE D 1 ,B itS ta te(1)); // LED 1 sẽ ứng với bit 0 trong
biến S tateLE D
d igita lW rite (LE D 2,B itS ta te(2));
d igita lW rite (LE D 3,B itS ta te(3));
dig ita lW rite (L E D 4 ,B itS ta te (4 ));
dig ita lW rite (L E D 5 ,B itS ta te (5 ));

}
C u ối cùn g ch ú n g ta sẽ thực hiện chương trình chinh để LED hoạt động
theo ý m uốn củ a mình. Chương trinh bắt đầu bằng cách cho đảo biến
S tateLED :

void loopQ

{
S tateL E D = ~ S tateL E D ;

T oán tử sẽ giúp bạn đảo các giá trị bit củ a m ộ t biế n nào đó. Ví dụ
bạn có biế n A = 1 011 thi khi bạn thực hiện phép toán B =~A bạn sẽ có giá trị
B=0100. C h ún g ta thực hiện biến đảo trong bài tập này để thực hiện đảo các
trạng thái 3 LED đầu và cuối.

T iếp đến là ch ú n g ta gọi hàm LE D C hange để yêu cẩu cá c đèn LED


sáng theo các bit của biến S tateLE D và gọi hàm delay để chương trình đợi 0.5
giây trước khi thực hiện đổi trạng thái tiếp theo:

LE D C h ang e(); // G ọi hàm thay đổ i LED


dela y(500 ); // Đợi 0.5 g iâ y
)

1?1
CHƯONG 3: BIẾU KHIỂN VÀ TẠI D Ệ I iK C V iliL E I AUI1MMM a» «**' Tf lệt

BÀI TẬP 2: HIỆU ỨNG LED XEN KẼ ĐUỔI SANG PHẢI


Chúng ta đã thực hiện bài tập 1 và bạn đã làm quen vói các hàm đã
sử dụng trong chương trình. Bây giờ chúng ta sẽ thay đổi hoat dõng cùa LED
để thực hiện một hiện ứng lạ mắt thường thấy trong các bảng quàng cáo. Bài
tập này yêu cầu bạn lập trình các LED sáng xen kẽ đuổi nhau về bẽn phải và
bạn có thể sử dụng nhiều LED để tạo viền cho các bảng hiệu.
Trong bài tập này, đa phần bạn sẽ sữ dụng lại các câu lênh và hàm
của bài trước. Chúng ta chí thay đổi biến StateLED để thực hiên hiệu ứng.
Ngoài ra phần cứng bạn sẽ sử dụng như bài tập trước.

Phần cứng
Phần cứng cho bài tập này khá đơn giản, chúng ta chỉ SỪ dụng các
đèn LED và các điện trở để hạn dòng bảo vệ LED. Các bạn có thể sử dụng
các đèn LED siêu sáng để làm nổi bật các bảng quàng cáo của bạn.

• 6 LED cá c m àu. • 6 điện trở hạn d ò ng 220


ohm .

Kết nối phần cứng


Hãy ngắt nguồn và cáp USB của bo mạch Arduino, sau đó kết nối
mạch như bảng dưới và hình trang bên.
Bạn nối mạch như sau, các chân âm của LED nối với GND của bo
mạch Arduino thông qua điện trở 220 ohm. Các chân dương cùa LED bạn nối
lần lượt với các chân 0 đến chân 5 cũa bo mạch Arduino.
Bảng kết nối chân của LED với bo mạch Arduino:

BO M Ạ C H A R D U IN O LE D

C h ân số 0 LED 0

C h â n số 1 LED 1

C h â n số 2 LED 2

C h ân số 3 LED 3

C h â n số 4 LED 4

C h ân sổ 5 L^D 5

122
ARDUIWO DAW) CKO NEƯ0I ĩự HOC CHƯƠNG 3: ĐIẾU KHIỂN VÀ ĨẠO HIỆU ỨMC llđ l 6 LED

Hình dưới là kết nối m ạch trên test board.


CHƯUN6 3: AIẼƯ KHIẾN VÀ TẠB n Ệ I f w vđl » l i l U 1 IIM I M i c n KHÓI Tặ lệ t

Hình dưới là kết nối mạch trẽn Proteus (bạn hãy xe^i p^án nuong dán
"Mô phỏng A rdu in o trẽ n P ro te u s”).

Ịậ ;
LEt-REb
•' 04 ■ ểL
LED P.EO
03 02 ỉ õ ĩ
LED R E J ^ F L E Ọ - R E ^ ^ L E D - P .E ^ »
ềầ _Eú-F.Et'
ị L . ' ĩ t . ó Ị ........ - . • r s x í ' < r s / . ĩ ; ịĩịx ỉ* í 7£

1 Rũ: R5 R4 1 R3 ỊR2 RI
220 220 220 220 220 220
Ự KT(r;<ĩ> r ;<Ĩ£XT*.....; <rnxr> |J-:TnXT' X <Hi.Hĩ* ụ

iiìtH ti"
DUIW01
A3C-W.0 UNO«3

' 'i I ị " / " ''I t , ■'


■: « < • p«
v , < DIGITAt {-iW M) y
■■ « ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ;
Wm$Mm w i
l l l l l l 'I na P " * " * J ’

ANALOGw

%I ĨỆ 0Ỉ;? ' y !É<! ' ' ' " % '


/// / M Ế is/■' $Ê È M " Ỵ w sỷ.'/?s
ị 'ý /, /ý',, ỵỊ0ỵị ỳ ' Ấ í'' / ỵ s''"%/ s i, J

Phần mềm

Chương trinh cho bài tập này được viết như trang bên

Chương trình có nhiệm vụ điều khiển LED sáng xen kẽ vá à rrang thái
tiếp theo thi các LED trước đã sáng sẽ tắt, các LED còn lại sẽ sána . a lãp lai
liên tục. Do hiện tượng lưu ảnh cùa mắt nên chúng ta thấy hiéu ứno ỉ ắ r g xen
kẽ đuổi nhau thường thấy trong các bàng quảng cáo.

124
A H P IIIM BAWW CHO H6ƯƠI T ỊlỌ C _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CHƯđNt i: 8IỀ8 MIẾH VÀ ÌẠO Mlậg tM t v ứ l i IE I

Hoạt động của chướng trình

Chương trình hiệu ứng LED xen kẽ đuổi sang phải:


// Chương trinh hiệu ứng LED xen kẽ đuổi sang ph ả i

II Khai báo các chân kế t nố i LED với bo mạch Arduino

#define LEDO 0
#define LED1 1
#define LED 2 2
#define LED 3 3
#define LED 4 4
#define LED 5 5

// Biến trạng th á i LED

unsigned char S tateL E D = 0B 0 001 01 01;

// Chương trình khỏ i tạo


void setupO

// Khởi tạo ngõ ra cho các chân n ố i LED

pinM ode(LE D O ,O UTPUT);


p in M o d e (L E D 1 ,O UTPUT);
pin M o d e (L E D 2 .O UTPUT);
pin M o d e (L E D 3 ,O UTPUT);

125
CHƯƠNG a: ĐIẾU KHIỂN VÀ TẠO BIÉn CfW6 V Õ m E I M H IM i m C W K W IT lH t

pinMode(LED4,OUTPUT);
pinMode(LED5, OUTPUT);

// Hàm rút các bit riêng lẻ trong một biến

boolean BitState(char pos)

{
boolean xbit;
unsigned char xchar=-1;
if (pos<8) xchar=0x1 & StateLED>>pos;
xbit=xchar;
return xbit;
}

// Hàm thay đổi LED theo biến trạng thái LED

void LEDChangeO
{
digitalWrite(LED0,BitState(0));
digitalWrite(LED1 ,BitState(1));
digitalWrite(LED2,BitState(2));
digitalWrite(LED3,BitState(3));
digitalWrite(LED4,BitState(4));
digitaiw rite(LE D 5,BitState (5));
}

// Chương trình chinh

void loopO
{

// Dảo giá trị trạng thái LED

StateLED=~StateLED;

LEDChangeO; // Gọi hàm thay đổi LED

delay(500); // Dợi 0.5 giây


)

126
AB0U1N0 HAM c a o NGtftfl T ự 19c CHƯƠNG a: ĐIẼ D K H IỂ N V À T Ạ I I t p i w v l u m

H ã y viế t chương trình, biên dịch và tải xuống bo m ạch A rduino. Nếu
bạn kết nối m ạch đúng và lập trinh chính xác thi bạn sẽ thấy các LED lẻ sáng
trước. Sau đó là các LED chẵn sán g trong vòng 0.5 giây. Nếu các LED ghép
thành m ộ t vò n g khép kín, do hiện tượng lưu ảnh của m ắt bạn bạn thấ y các
LED xen kẽ đang sáng đu ổi nhau thành m ột vòng.
T ìm h iể u m ã lệ n h
Trong chương trình bài tập này chú ng ta sẽ sử dụng các hàm củ a bài
tập trước. Do các hàm này sử dụng xuyên suốt trong chương nên bạn cần đọc
cẩn thận và hiểu rõ các hàm này trước khi bắt đầu các bài tập khác.
B ắt đẩu chương trình, bạn sẽ khai báo tên LED ứng với các số chân
tương ứng trên bo m ạch Arduino.
#define LEDO 0
#define LED1 1
#define LED 2 2
#define LE D 3 3
#define LED 4 4
#define LED 5 5
B ạn khai báo m ộ t biến StateLED để chứa các trạng thái các LED
trong biến. B ài tập này khác bài tập trước ở giá trị khởi đầu cho LED sáng.
Bạn có thể thấ y ch ú n g ta đã khai báo các LED xen kẽ. Do chì sử dụng 6 LED
nên bạn ch ỉ dùng 6 bit cu ố i cu ố i của biến S tateLED :
unsig ned ch a r S ta te L E D = 0 B 0 0 0 1 0101;
T iếp theo là chương trình khỏi tạo củ a A rduino, trong chương trinh khỏi
tạo bạn sẽ th iế t lập các chân nối với LED là các chân ngõ ra:
void setupO

{
pinM ode(LE D O ,O UTPUT);
p in M o d e (L E D 1 ,O UTPUT);
p in M o d e (L E D 2 ,O UTPUT);
p in M o d e (L E D 3 ,O UTPUT);

p in M o d e (L E D 4 ,O UTPUT);
p in M o d e (L E D 5 ,O UTPUT);

}
H àm tiếp theo là hàm rút các bit từ biến trạng thái S tateLED :

127
C H Ư đm 3 : e iẼ U KHIẾN VÀ T Ạ I H É I I m w đ l I LED UHIM !*■ CMWWI TỊ IK

boolean BitState(char pos)


{
boolean xbit;
unsigned char xchar=-1;
if (pos<8) xchar=Ox1 & StateLED>>pos;
xbit=xchar;
return xbit;
}
Tiếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLED:
void LEDChangeO
{
digitalWrite(LEDO.BitState(O)):// LED 0 sẽ ứng với bit 0 trong biến
StateLED
digitalWrite(LED1 ,BitState(1)); // LED 1 sẽ ứng với bit 0 trong
biến StateLED
digitalWrite(LED2,BitState(2));
digitalWrite(LED3,BitState(3));
digitalWrite(LED4,BitState(4));
digitalWrite(LED5,BitState(5));
}
Cuối cùng, chúng ta sẽ thực hiện chương trình chính để LED hoạt
động theo ý muốn cũa mình. Chương trình bắt đầu bằng cách cho dào biến
StateLED để tắt các LED đang sáng và sáng các LED khác. Tạo cảm giác
đuổi xen kẽ cho các LED:

void loopO
{
StateLED=-StateLED;

Tiếp đến, chúng ta gọi hàm LEDChange để yêu cầu các đèn LED
sáng theo các bit của biến StateLED và gọi hàm delay để chương trn n đoi 0.5
giây trước khi thực hiện đổi trạng thái tiếp theo:

LEDChangeO; // Gọi hàm thay đổi LED


delay(500); // Dại 0.5 giãy
ì

128
ARDOINO IA W CIO NCIftfl Tự HQC CHƯƠNG 3: ĐIẾU KHIỂN VÃ TẠO HIỆU ƯNG VÓI 6 I f í

BÀ I ĨẬ P 3: HIỆU ỨNG ĐUỔI LED SANG TRÁI


Các bài trước chỉ sử dụng các toán tử đảo để tạo ra các hiệu ứng đơn
giản cho LED . Trong bài tập này chúng ta sẽ thực hiện đuổi LED thực hiện toán
tử dịch LED và sử dụng các cấu trúc cơ bản để làm cho LED dịch theo vòng.
Bài tập này chúng ta thực hiện LED đuổi bằng cách: Cho phép m ột LED sáng
và trạng thái tiếp theo bạn sẽ cho LED trước tắt và LED kề bên trái của LED
hiện tại sẽ sáng, tiếp tục như vậy bạn sẽ tạo được hiệu ứng đuổi LED. Nếu bạn
xếp LED thành m ột vòng khép kín thì bạn sẽ tạo ra hiệu ứng khá lạ mắt.
Phần cứng
Phần cứng bà i tập này khá đơn giản, chú ng ta c h ỉ sử dụng các LED
và cá c điện trở để hạn dòng bảo vệ LED. C ác bạn có thể sử dụng các đèn
LED siêu sáng để làm nổi bật các bảng quảng cáo của bạn.
• LED cá c m àu, bạn có thể dùng 6 LED siêu sáng để nổi bật hơn.

• D ùng 6 điện trở hạn dòng 220 ohm.

Kết nối phần cứng


Hãy ngắt nguồn và cáp USB của bo mạch Arduino sau đó kết nối
mạch như bảng dưới và hình trang bên. Bạn nối m ạch như sau, các chân
âm của LED nối với G N D của bo m ạch Arduino thõng qua điện trở 220 ohm.
Các chân dương của LED nối lần lượt với các chân 0 đến chân 5 của bo
mạch Arduino.

Bảng kế t nối châ n củ a LED với bo m ạch Arduino.

BO MẠCH ARDUINO LED

C h â n số 0 LED 0

C hân số 1 LED 1

C hân số 2 LED 2

C h â n số 3 LED 3

C h â n số 4 LE D 4

C h â n số 5 LED 5

129
CHƯƯME 3: ĐIEU KHIẾU n TẠO HIỆU ƯH6 v đ l 6 IED U M iM H U c t i w m iT fH t

Hinh dưói là ảnh kết nối mạch trên test board

130
AHDUWO BANS CM MEtftfl ĩự HỌC CHƯƠNG 3: ĐIỄU HIỂN VÃ TẠO HIỆU ỪN6 v đ l 6 LED

Hình dưới là ảnh kết nối m ạch trên Proteus (bạn hãy xem phần hướng
dẫn “ M ô p h ỏ n g A r d u in o tr ê n P ro te u s ” ).

P hầ n m ềm

Chương trình cho bài tập này được viế t trình bày ở trang bên.

Chương trình có nhiệm vụ gán giá trị sáng ban đầu cho LED cuối cùng
bên ph ả i và sau đó dịch về bên trái.

M ỗ i lần dịch, chương trình kiểm tra xem giá trị đã tràn ra khỏi LED hiển
thị hay không. Nếu bị tràn, chúng ta sẽ gán giá trị ban đầu lại và chương trinh
sẽ thực hiện lại từ đầu.

131
CHƯƠH6 3: BIỂU H IẾ U VÀ TẠP B Ệ » ( H í v g l I l f l u n iu IAM CM H I Tf lệt

Hoạt dộng của chưđng trình

Chương trình hiệu ứng đuổi LED sang trái:


// Hiệu ứng đuổi LED sang trái

II Khai báo các chân kết nối LED vói bo mạch Arduino
#define LEDO 0
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5

// Biến trạng thái LED


unsigned char StateLED=C)B00000001'

// Chương trình khởi tạo


void setupO
{

132
ARDOINO DANH CHO N6Ư0I Tự BQC CHƯƠNG 3: ĐIẾU KHIỂN V * ÌẠO BIỆa VỚI i IĨD

// K hởi tạo ngõ ra cho các chân n ố i LED


pinM ode(LE D O ,O UTPUT);
p in M o d e (L E D 1 ,O UTPUT);
p in M o d e (L E D 2 ,O UTPUT);
p in M o d e (L E D 3 ,O UTPUT);
pin M o d e (L E D 4 ,O UTPUT);
p in M o d e (L E D 5 ,O UTPUT);

// Sáng LED bên p h ả i đẩu chương trình


LE D C hangeO ;

// Hàm rú t các bit riêng lẻ trong m ộ t biến


boolean B itS ta te (ch a r pos)

(
boolean xbit;
unsigned ch a r x c h a r= -1 ;
if (pos<8) xchar=0x1 & S ta te L E D » p o s ;
xbit=xchar;
return xbit;

// Hàm thay đ ổ i LED theo biến trạng thái LED


void LED C hangeO

{
digitalW rỉte(LED O , BitState(O));
d ig ita iw rite(LED 1 ,B itS ta te (1 ));
dig ita lW rite (L E D 2 ,B itS ta te (2 ));
dig ita lW rite (L E D 3 ,B itS ta te (3 ));
d ig ila lW rite (L E D 4 ,B itS ta te (4 ));
dig ita lW rite (L E D 5 ,B itS ta te (5 ));

// Chương trình chinh


CHƯƠH6 3: ĐIỂU KHIẾN VÁ TẠB HIẼH ÍH C VƠI 6 I Ĩ D UHIM !*■ t * Will it m

void loopO
{
delay(500);

StateLED=StateLED<<1;// Dịch LED sang trái 1 LED


if (StatelED==0B01 OOOOOO) StateLED=1; // Kiểm tra trán cho LED
LEDChangeO;
}
Hãy viết chương trinh, biên dịch và tải xuống bo mạch Arduino. Nếu
kết nối mạch đúng và mạch hoạt động chính xác thì bạn sẽ thấy một LED
ngoài cùng bên phải sáng và sau đó sẽ di chuyển về bên trái. Sau khi LED
cuối cùng bên trái sáng thì trạng thái tiếp theo chương trình sẽ cho LED ngoái
cùng bên phải sáng lại từ đầu.

Tìm hiểu mã lệnh

Phần iập trinh cho bài tập này sẽ có một số điểm khác vói các bài tập
trước. Với những phần khác chúng tôi sẽ chỉ ra và bạn có thể tim hiểu rồ hơn
những phần khác này. Các phần còn lại tương đối giống với các bài tãp trước.

Bắt đầu chương trình, bạn sẽ khai báo tên LED ứng với các Sũ chân
tương ứng trên bo mạch Arduino.

#define LEDO 0
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5

Bạn khai báo một biến StateLED để chứa các trạng thái các LED
trong biến.

Bài tập này khác bài tâp trước ở giá trị khởi đầu cho LED sáng. Đảy lá
điểm khác đầu tiên của bài tập này, chúng ta sẽ khởi tạo giá trị biến
StateLED để LED ngoài cùng bên phải sáng trước:

unsigned char StateLED=0B000C)0001;

Tiếp theo là chưong trình khởi tạo của Arduino.

Trong chương trinh khởi tạo bạn sẽ thiết lập các chân nối -,t LED là
các chân ngò ra.

134
ARDUINŨ DANH CHO NGƯƠI Tự HỌC CHƯƠNG 3 : D IÊU K H IỂ N V A TẠ O HIỆ U ƯN6 «01 6 LED

Đ ả y là đ iể m k h á c th ứ ha i củ a bà i tậ p này so vói các bài tâp trước.


Bạn sẽ th iế t lập cho LED ngoài cùng bên phải sáng khi bắt đầu chương trinh.
C ác bà i tập trước thì chú ng ta không thực hiện việ c này.
void setupO

{
// K hở i tạo ngõ ra cho các chân n ố i LED
pinM ode(LE D O ,O UTPUT);
p in M o d e (L E D 1 .OUTPUT);
pin M o d e (L E D 2 ,OUTPUT);
pin M o d e (L E D 3 ,O UTPUT);
pin M o d e (L E D 4 ,O UTPUT);
p in M o d e (L E D 5 ,O UTPUT);

// Sáng LED bên ph ả i từ đầu chương trình


LED C hangeQ ;

}
Hàm tiếp theo là hàm rú t các bit từ biến trạng thái StateLED:
bo olean B itS tate(ch ar pos)

{
boolean xbit;
unsigned cha r xch a r= -1 ;
if (pos<8) xchar=Ox1 & S tateLE D >>pos;
xbit= xcha r;
return xbit;

}
T iế p theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLE D :
void LED C hangeO
{
d igita lW rite (LE D O ,B itS tate(ũ ));// LED 0 sẽ ứng với bit 0 trong biến
StateLED
d ig ita iw rite (L E D 1 .B itS ta te(1)); // LED 1 sẽ ứng với b-ỉ 0 trcr.a
biến StateLED
d igita lW rite (L E D 2 ,B itS ta te (2 ));
CHƯƠHS i : BIẼn IH IẾ N « * T Ạ I f l ( w van 11 £ | U H IM ! * ■ C H * W l ĩllệ t

digitalWrite(LED3,BitState(3));
digitalWrite(LED4,BitState(4));
digitalWrite(LED5,BitState(5));
}
Cuối cùng, chúng ta sẽ thực hiện chương trình chinh để LED hoạt
động theo ý muốn cùa minh. Đây là điểm khác thứ ba, chưong trinh bắt đáu
bằng hàm đợi 0.5 giây:

void loopO
{
delay(500);
Chúng ta cho chương trình chính đợi 0.5 giây để sáng LED ngoài cùng
bèn phải sáng 0.5 giây trước khi thực hiện dịch LED, điểm này khác so vói
các chương trinh bài tập trước. Nếu chúng ta thực hiện dịch LED trước và cho
đợi sau như các chương trình trước thì LED sáng đầu tiên không phải là LED
ngoài cùng bên phải. Vì bắt đầu chương trình chúng ta gán giá trị sáng LED
ngoài cùng bên phải. Khi vào chương trình chính chúng ta dịch 1 LED thì LED
sáng sẽ là LED kề vỏi LED ngoài cùng bên phải. Chúng ta sẽ không mong
muốn điều này xảy ra nên chúng ta thực hiện chương trinh chính ngược với
các chương trinh khác.

Tiếp theo, bạn thực hiện di chuyển LED sáng sang bên trái:

S tateL E D = S ta te LE D «1;// Dịch LED sang trái 1 LED

Đê’ thực hiện di chuyển LED, bạn thực hiện toán tử dịch bit cho biến
StateLED. Vì chúng ta muốn LED di chuyển sang LED kề bên nên bạn sẽ
dịch một bit cho biến StateLED. Nếu muốn dịch LED đi xa hơn bạn có thể thay
đổi số bit muốn dịch theo ý muốn của mình. Sau mỗi lần dịch LED chúng ta
sẽ kiểm tra LED có bị tràn hay không, nếu tràn thì chúng ta sẽ gán giá trị ban
đầu cho biến StateLED để thực hiện chương trinh lại từ đầu:

if (StateLED==0B01000000) StateLED=1; II Kiềm tra trân cho


LED

LEDChangeQ;

}
Vì chúng ta sử dụng 6 LED và 6 LED sẽ ứng vói 6 bit :ử 0 dến 5 khi
dịch đến bit thứ 6 thì giá trị này đã tràn so voi sổ LED ban sứ dung
(0B01000000) và bạn sẽ gán lại giá trị ban đầu cho biến để trán- :'U 3 ng hop
bị trán giá trị hiển thị trẽn LED.

136
MDOMO IÀH cao NGƯƠI Tự BỌC CHƯđNG ỉ : ĐIẼO H IỂN VÁ TẠ I H Ệ IỬ H t v ẩ n I E I

BÀ I TẬ P 4: HIỆU ỨNG ĐUỔI LED SANG PHẢI


B ài tập thực hiện hiệ ú ứng đuổi LED sang phải. C h ún g ta tiếp tụ c sử
dụng các lệnh và phẩn cứng cơ bản để tạo hiệu ứng cho LED . C á c toán tử
quen thu ộc m à bạn đã sử dụng sẽ tiếp tục sử dụng trong bài tập này. C h ún g
ta thựo hiện LED đuổi bằng cách cho phép m ột LED sáng và trạng thái tiếp
theo bạn sẽ cho LED trước tắt và LED kề bên phải của LED hiệ n tại sẽ sáng,
tiế p tục như vậ y bạn sẽ tạo được hiệu ứng đu ổi LED. Nếu xếp LED thà nh m ột
vòng khép kín thì bạn sẽ tạo ra hiệu ứng khá lạ mắt.
Phần cứng
P hần cứng bà i tập này khá đơn giản chú ng ta chỉ sử dụng các đèn
LED và cá c điện trở để hạn dòng bảo vệ LED. C ác bạn có thể sử dụng cấc
đèn LED siêu sáng để làm nổi bật bảng quảng cáa.
• LED các m àu, bạn có thể dùng 6 LED siêu sáng.

• D ùng 6 điện trỏ hạn dòng 220 ohm.

Kết nối phần cứng


H ãy ngắt ng uồ n và cáp USB của bo m ạch A rduino sau đó kết nối
m ạch như bảng dưới và hình trang bên.
Bạn nối m ạch như sau, các chân âm của LED nối vo i G ND cùa bo
m ạch A rdu in o th ô n g qua điện trỏ 220 ohm . C ác chán dương của LED bạn nối
lần lượt với các châ n 0 đến chân 5 củ a bo m ạch Arduino.
Bảng k ế t nối chân của LED với bo m ạch Arduino.

BO MẠCH ARDUINO LED

Chân số 0 LED 0

Chân số 1 LED 1

Chân số 2 LED 2

Chân số 3 LED 3

C hân số 4 LED 4
C hàn số 5 LED 5

1J7
CHƯƠM6 3: 8IỀ U kH lẾ N VA T Ạ I I U Ẽ I I IIKC VƠI I LED A ID U IM IẰ J U U I W lir f lf t

Hinh dưới là ảnh kết nối mạch trên test board

138
ABDUINO PAW CHO NBƯđl Tự HỌC CHƯƠNG 3: BIẾU KHIỂN VÀ TẠ8 BIẼn ƯW6 y g l B LED

Hình dưới là ảnh kết nối m ạch trên Proteus (bạn hãy xem phần hướng
dẫn "M ô p h ỏ n g A r d u in o tr ê n P r o te u s ”).

ị ậ i : t ị ^ : : ũ £ ị : t j ^ : D Ị í : i M : ũ Ệ : ĩ : ^ M ị z M Dữ: : : :
Rỉ E D ^ ^ LED
LED B LEÍ) ReH ^ LEC> REO^F LE6'RED
a i s a ỵ ... : íĩlĩxr ĩ.ị/ X . K ..... ụ ị:Xĩ>.............................ị:XT*.-.............. ...<Tị:xr*.

R Q ị. L R5 ị m R4 n R3J M R2 TỊ R í
220 ị-' 220 I 220 ; 220 220 220
ị LJ U <•?£>;;(> M >:Vu/.V> M •?: v.ii:

.rỊrí -|SỊa>Ị<*Ị r-Ị«1*> T o <NT


DUINOt :
AROUINỘ UNO «3
fc;<r> ' <

«• OKiiĩAL (~PWM)

II i a t « « « « RSI I I

P hầ n m ềm

Chương trình cho bài tập này được v iế t ở trang bên.

Chương trình có nhiệm vụ gán giá trị sáng ban đầu cho LED cuối cùng
bên trái và sau đó dịch về bên phải. M ỗi lần dịch, chương trình kiểm tra xem
giá trị đã tràn ra khỏi LED hiển thị hay không.

N ếu bị tràn, chú ng ta sẽ gán giá trị ban đầu lại và chương trinh sẽ thực
hiện lại từ đầu.

139
CHƯ đm i: BIÉB KB1ỀH VÀTẠI fwc vẩl I l ĩ l u m !*■ CMKMiTjfc

Chương trình hiệu ứng đuổi LED sang phải

// Hiệu ứng đuổi LED sang phải

// Khai báo các chân kết nổi LED với bo mạch Arduino

#define LEDO 0

#define LED1 1

#define LED2 2

#define LED3 3

#define LED4 4

#define LED5 5

// Biến trạng thái LED

unsigned char StateLED=0B00100000;

140
ABDUINO BAW« CHO Meưữl ĩự B ỊC CHƯƠNG 3: BIẾa KHIỂN VÁ ĨẠO mậu ƯW6 VƠI 8 IED

// Chương trình khởi tạo

void setupO

// K hởi tạo ngõ ra cho các chân n ố i LED

pinM ode(LE D O ,O UTPUT);

p in M o d e (L E D 1 ,O UTPUT);

p in M o d e (L E D 2 ,O UTPUT);

p in M o d e (L E D 3 ,O UTPUT);

p in M o d e (L E D 4 ,O UTPUT);

p in M o d e (L E D 5 ,O UTPUT);

// Sáng LED bẽn trá i đ ầ u chương trinh

LED C hangeO ;

// Hàm rú t các bit riêng lẻ trong m ộ t biến

boolean B itS ta te (ch a r pos)

boolean xbit;

unsigned cha r x c h a r= -1 ;

if (pos<8) xchar=Ox1 & S ta te L E D » p o s ;

xbit=xchar;

return xbit;

// Hàm thay đổ i LED theo biến trạng thái LED

void LE D C hangeO

141
CHƯƯH6 3: BIẼƯ KHIẾH VA TẠI MỆB f w »01 t IE I U N M IU iC M K M I T f l*

digitalWrite(LE DO. BitState(O));


digitalW rite(LED1,BitState(1));

digitalWrite(LED2,BitState(2));

digitalWrite(LED3,BitState(3));

digitalWrite(LED4,BitState(4));

digitalWrite(LED5,BitState(5));

// Chương trình chinh

void loopO

delay(500);

StateLED=StateLED>>1;// Dịch LED sang phải 1 LED

if (StateLED==OBOOOOOOOO) StateLED=ŨB00000001; // Kiềm tra tràn cho


LED

LEDChangeQ;

Bạn hãy viết chương trinh, biên dịch và tải xuống bo mạch Arduino.

Nếu kết nối mạch đúng và mạch hoạt động chínhxác thi bạn sẽ thấy
một LED ngoài cùng bên tráisáng và sau đó sẽ di chuyển về bên pnải. Sau
khi LED cuối cùng bên phải sáng thì trạng thái tiếp theo chương trĩnh sẽ cho
LED ngoài cùng bẽn trái sáng lại từ đầu.

Tìm hiểu mã lệnh

Bắt đầu chương trinh, bạn sẽ khai báo tên LED ứng với các sổ chán
tưdng ứng trên bo mạch Arduino.

#define LEDO 0

#define LED1 1

#define LED2 2

#define LED3 3

14Z
ABDUINO DÀNH CHO NGƯƠI ĩự HỌC CHƯƠNG ĩ: ĐIỂU KHIỂN VÃ TẠO HIỆII ỨNG vứl 6 LED

#define LED 4 4

#define LED 5 5

Bạn khai báo m ột biến S tateLE D để chứa các trạng thái các LED
trong biến.

Bài tập này khác bài tập trước ỏ giá trị khởi đầu cho LED sáng. C h ún g
ta sẽ khởi tạ o giá trị cho S tateLE D để LED ngoài cùng bên trái sáng trước:

unsig ned cha r StateLE D =0B 001 OOOOO;

T iế p theo là chương trình khởi tạo của Arduino.

T rong chương trình khởi tạo, th iế t lập các chân nối với LED là các
chân ngõ ra. B ạn sẽ th iế t lập cho LED ngoài cùng bẽn trái sáng khi bắt đầu
chương trình:

void setupO

// K hở i tạo ngõ ra cho các chân n ố i LED

pinM ode(LE D O ,O UTPUT);

p in M o d e (L E D 1 ,OUTPUT);

p in M o d e (L E D 2 ,O UTPUT);

p in M o d e (L E D 3 ,O UTPUT);

p in M o d e (L E D 4 ,O UTPUT);

p inM o de(L E D 5 , O UTPUT);

// S áng LED bên p h ả i đầu chương trình


LE D C hangeQ ;

}
Hàm tiếp theo là hàm rút các bít từ biế n trạng thái S tateLED :

bo olean B its ta te (c h a r pos)

{
boolean xbit;

unsigned char x c h a r= -1 ;

if (pos<8) xchar=0x1 & S tateLE D >>pos;

143
CHƯƯN6 3: 8IỂI H Ế U VÀ TẠI < 1 I m v il I L t l UHIMIẮM cm KHI TỊ IU

xbit=xchar;

return xbit;

}
Tiếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chúa trong
biến StateLED:

void LEDChangeO

(
digitalW rite(LED0,BitState(0));// LED 0 sẽ ứng với bit 0 trong biến
StateLED

digitalWrite(LED1 ,BitState(1)); // LED 1 sẽ ứng với bit 0 trong


biến StateLED

digitalWrite(LED2,BitState(2));

digitalWrite(LED3,BitState(3));

digitalWrite(LED4,BitState(4));

digitalWrite(LED5,BitState(5));

Cuối cùng chúng ta sẽ thực hiện chương trinh chính để LED noạt động
theo ý muốn của minh. Điểm khác của hiệu ứng này so với hiệu ứng dịch trái
là phần dịch LED và phần kiểm tra tràn cho LED.

void loopO

delay(500);

StateLED=StateLED>>1;// Dịch LED sang phải 1 LED

if (StateLED==OB 0 0 0 0 0 0 0 0 ) StateLED=OB00000001: Kiềm tra


tràn cho LED

LEDChangeO;

144
ARDUINO CAM CUD NGtfdl Ttf HỌC CHƯ0NE 3: ĐIỂU KHIỂNII* TẠO HIỆU ƠN6 y g l BIED

BÀI TẬP 5: KẾT Htfp HIỆU ỬNG SÁNG OUŨI BÊN TRÁI VÀ SÁN8 ĐUGI
BÉN PHẢI
Bài tập này ch ú n g ta sẽ kết hợp hai hiệu ứng dịch trá i và dịch phải
thành m ột chương trình tổn g hợp. Khi m ột LED dịch đến ngoài cùn g củ a đoạn
LED thì nó sẽ di ch u yể n ngược lại. V iệ c này sẽ diễn lặp đi lặp lại, và hiệu ứng
dịch trái và dịch phải cũ n g luân ph iê n thay đổi với nhau.

Khi chú ng ta kế t hợp hai hiệu ứng dịch LED kết hợp với nhau, khi
nhìn vào sẽ có cảm g iác như m ộ t trái banh bay lên chạm trần và bật xuống
đất và khi chạm đất lại b ậ t lên trần. Bạn hãy giảm thời gian đợi để tăng tốc độ
dịch LED.

T rong cá c b ả ng quảng cáo người ta cũng thường hay sử dụng


hiệu ứng này sau đó kết hợp với các hiệu ứng khác để tạo nên m ột bảng
quảng cáo lung linh và nổi bật. Trong bài tập này chú ng ta đã thực hiện kết
hợp hai hiệu ứng, trong các bài tập kế tiế p các bạn sẽ được hướng dẫn lập
trình tạo nhiều hiệu ứng hơn.

P h ầ n cứ n g
Phần cứng bài tập này khá đơn giản chú ng ta chỉ sử dụng cá c LED và
các điện trở để hạn dòng bảo vệ LED. Các bạn có thể sử dụng các đèn LED
siêu sáng để làm nổi bật bả ng quảng cáo.
• LED cá c m àu, bạn dùng 6 LED siêu sáng.

• D ùng 6 điện trở hạn dòng 220 ohm.

K ết n ố i p h ầ n cứ n g

H ãy ngắt ng uồ n và cáp USB của bo m ạch A rdu in o sau đó kết nối


m ạch như hình dưới.
B ạn nố i m ạch như sau, các chân âm của LED nối với G ND củ a bo
m ạch A rdu in o thô ng qua điệ n trở 220 ohm.
C á c ch â n dương của LED nối lần lượt với cá c chân 0 đến châ n 5 của
bo m ạch A rduino.
B ảng trang bên là kết nối chân của LED với bo m ạch A rduino:

145
CHƯ đlie t: B IẼ n KHIẾH VÁ T Ạ I H Ệ y t w v ứ l ( LE« U N IM I M c « K W IT IW C

BO M Ạ C H A R D U IN O LE D

C hân số 0 LED 0

C h â n số 1 LED 1

C h â n số 2 LED 2

C h â n số 3 LED 3

C h â n số 4 LED 4

C h â n số 5 LED 5

Hình dưới là kết nối mạch trén Proteus (bạn hãy xem phẩn hướng dẫn
“Mô phỏng A rdu in o trê n Proteus”).

ỉ fflSPSS
& ểế
ị 7 . k ú - K i * . ị : W $ Ị > : J .....
A
D3
* P2 A : d t:
I—
u e d -re B B F ie o - r e J ^ F
□o:
L E tr

R6
lũ ' n R6 : n te r M R 3; I R2 R1
30
220 Ị ị 220 ; 220 220 : 220 : 22Ữ
rê ị1* V •*f > V . V *.f£ẶÍ> 1 < "Ẹ Ạ Ĩ> XTE/.T*

DƯN01
AP.*n>mO
;

‘ 2 Ĩ
> DIGITAL (-PWM)

T r f
ANALOG 1«

-L L J -T

148
*IDUMO IẤNI cm H6ƯƠI ĩự HỌC CHƯƠNG 3 : Đ IẾU K H IỂ N V A T Ạ P H IỆ U ƯW6 V O I 6 LED

H inh dưới là ảnh kết nối m ạch trên test board.

m t T A L t P w i V ’* £ «;

147
CHƯƯNE 8 : ĐIỂƯ KHIẾN VÀ T Ạ I P Ê n IN C VỜI 6 LED

Hoạt động của chường trình

Chương trinh cho bài tập này được viết bên dưới. Chưong trình có
nhiệm vụ thực hiện hiệu ứng dịch trái sau đó thực hiện dịch phải khi dịch trái
đã tràn. Chương trình sẽ luân phiên dịch các LED qua lại.
Chưcỉng trình kết hợp hai hiệu ứng đuổi trái và đuổi phải
// Kết hợp hai hiệu ứng đuổi sang trái và đuổi sang phải
II Khai báo các chân kết nối LED với bo mạch Arduino
#define LEDO 0
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#define LED5 5

148
ABDUIHO 8AW MO m ười Tự BỘC CHƯƠNG ỉ : ĐIẾU IBIỂN VA TẠO BIÊU ỬNE VI?! t LED

// Biến trạng th á i LED


unsigned cha r S ta te L E D = 0 B 0 0 0 0 0 0 0 1 ;

// Biến thay d ổ i giữa ha i hiệu ứng, đầu tiên chúng ta sẽ dịch trái
boolean C h an geE ffect= fa lse;
// Chương trình khởi tạo
void setupO
{
pinM ode(LED O .O U TPU T);
pinM o de(L E D 1 , O UTPUT);
p in M o d e (L E D 2 ,O UTPUT);
p in M o d e (L E D 3 ,O UTPUT);
pin M o d e (L E D 4 ,O UTPUT);
pin M o d e (L E D 5 ,O UTPUT);
// Sáng LED bên p h ả i dầu chương trình
LED ChangeO ;
}
// Hàm rú t các bit riêng lẻ trong m ột biến
boolean B itS ta te (ch a r pos)
{
boolean xbit;
unsigned cha r x c h a r= -1 ;
if (pos<8) xchar=Ox1 & S tateLE D > >pos;
xbit=xchar;
return xbit;
}
// Hàm thay đổ i LED theo biến trạng thái LED
void LED C hangeO
{
dìgitalW rite(LEDO , BitState(O));
digitalW rite(LE D 1 ,B itS ta te (1 ));
dig ita lW rite (L E D 2 ,B itS ta te (2 ));
d ig ita iw rite(LE D 3, B itState (3));
d ig ita lW rite (L E D 4 ,B itS ta te (4 ))'
dig ita lW rite (L E D 5 ,B itS ta te (5 ));
}

145
CHƯƠMG 3: ĐIẾU KHIỂN VA TẠO HIỆU ƯNE VƠI 6 LED UNIM l i l Cll nadir* *

// Chương trinh chinh


void loopO
{
delay(200); // Đợi 0.2 giây giữa các trạng thái
II Hiệu ứng dịch trái trước
if (ChangeEffect==faỉse)

(
StateLED=StateLED<<1;
II Kiểm tra đã hết hiệu ứng dịch trái thi chuyển thành dịch phải
if (StateLED==OB001 OŨOOO) ChangeEffect=!ChangeEffect;
}
// Sau đó dịch phải
else
{
StateLED=StateLED>>1;
// Kiểm tra đâ hết hiệu ứng dịch phải thi chuyển thành dịch trái
if (StatelED==0B00000001) ChangeEffect=!ChangeEffect;
}
LEDChangeQ;
}
Hãy viết chương trinh, biên dịch và tải xuống bo mạch Arduino. Nếu
bạn kết nối đúng và mạch hoạt động chính xác thi bạn sẽ thấy m ôt LED ngoài
cùng bên trái sáng và sau đó sẽ di chuyển về bên phải. Sau khi LED cuối
cùng bên phải sáng thi trạng thái tiếp theo chường trinh sẽ cho LED ngoái
cùng bên trái sáng lại tử đầu.
Tìm hiểu mã lệnh
Bắt đầu chương trình, bạn sẽ khai báo tên LED ứng vói các số chán
tưong ứng trên bo mạch Arduino.
#define LEDO 0
#define LED1 1
#define LED2 2
#define LED3 3
#define LED4 4
#deíine LED5 5
ABDPWQ DAW M B H6ƯỪI Tự BỌC CHƯƠNG 3: BIỂII KHIỂN VÀ ĨẠ B HIÊDƯN6 v đ l 6 LED

Bạn khai báo m ột biến StateLE D . C húng ta sẽ cho ph ép LED ngoài


cùng bên ph ả i sáng trước:
unsig ned cha r S ta te L E D = 0 B 0 0 0 0 0 0 0 1 ;
T iếp tụ c là khai báo biến đổi hiệu ứng. Trong bài tập này, ban đầu
chúng ta m uốn dịch trái và th iế t lập giá trị của biến C h an geE ffect là false để
thực hiện dịch trái trước:
bo olean C h an geE ffect= fa lse;
T iếp theo là chương trinh khởi tạo củ a Arduino, trong chương trình khởi
tạo bạn sẽ th iế t lập cá c chân nối với LED là các châ n ngõ ra. Bạn sẽ th iế t lập
cho LED ngoài cù n g bên ph ải sáng khi bắt đầu chương trình:
void setupO

(
II K hở i tạo ngõ ra cho các chân nố i LED
pinM ode(LE D O ,O UTPUT);
pin M o d e (L E D 1 ,OUTPUT);
p in M o d e (L E D 2 ,O UTPUT);
p in M o d e (L E D 3 ,OUTPUT);
p in M o d e (L E D 4 ,OUTPUT);
p in M o d e (L E D 5 ,OUTPUT);
// S áng LED bên p h ả i đầu chương trình
LED C hangeQ ;

}
H àm tiếp theo là hàm rú t các bit từ biến trạng thái S tateLED :
boolean B itS ta te (ch a r pos)

{
bo olean xbit;
unsigned char xch a r= -1 ;
if (pos<8) xchar=0x1 & S tateLE D > >pos;
xbit= xchar;
return xbit;

}
T iếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLE D :
void LED C hangeO
{

151
CHƯƠM6 3: CIỂU KHIẾN VA T A I B E a Ỉ N ( v ỉ l E L E I U H 1M I f C H »a>«i T i n

digital Write) LEDO.BitState(O));// LED 0 sẽ ứng vđi ũ ĩ 0 trong bién


StateLED
digitalWrite(LED1,BitState(1)); // LED 1 sẽ ùng vô. bit 0 trong
biến StateLED
digitalWrite(LED2,BitState(2));
digitalW rile(LED3,BitSlate(3));
digitalWrite(LED4,BitState(4));
digitalWrite(LED5,BitState(5));
}
Cuối cùng chúng ta sẽ thực hiện chương trình chính để LED hoạt động
theo ý muốn của mình. Ban đầu chúng ta cho LED ngoài cùng bên phải sáng
0.2 giây và bạn có thể thay đổi giá trị này để thay đổi tốc độ đuổi cùa LED.
void loopO
{
delay(200); // Đợi 0.2 giây giữa các trạng thái
Ban đầu thi biến ChangeEffect sẽ là có giá trị là false (chúng ta đã
đảm bảo rằng là giá trị false đã khai báo đầu chương trình) nên chúng ta sẽ
thực hiện chương trình dịch trái:
if (ChangeEffect==false)
{
StateLED=StateLED<<1;
Chúng ta kiểm tra đã hết hiệu ứng dịch trái hay không. Nếu hết chúng
ta đảo trạng thái biến ChangeEffect để thực hiện hiệu ứng dịch phải. Chúng ta
sẽ không khỏi tạo lại giá trị ban đầu cho biến StateLED vì tiếp theo chúng ta
sẽ thực hiện dịch phải.
if (StateLED==0B00100000) ChangeEffect=!ChangeEffect;
}
// Sau đó dịch phải
else
{
S tateLE D =S tateLE D »1;
// Kiềm tra đã hết hiệu ứng dịch phải thi chuyền thành dich trái
if (StateLED==0BC)0000001) ChangeEffect=!ChangeE“ e c f
}
LEDChangeQ;
}

152
ỈAI80IH0 DAW CIONGƯƠI TVngc CHƯƠNG 4: BIỂU KHIỂN VÀ TẠO HIỆU ỨW6 tớ l w LED

CHƯƠNG 4

DIỀU KHIỂN VÀ TẠO HIỆU tfNG vứl 12 LED


■ ■

T rong cá c bài tập trưóc, các bạn đã làm quen v iệ c lập trình với
A rduino tạo cá c hiệu ứng đơn giản tới LED với số lượng không lớn (6 LED ).
Trong các bài tập sau, chú ng ta sẽ tạo các hiệu ứng phức tạp hơn các bài tập
trước cũng như tăng số lượng LED lên và tạo nhiều hiệu ứng (ở đ â y ta dùng
12 LED sử dụ ng hết châ n (Pin) ngõ ra của bo m ạch A rdu in o UNO) và thực
hiện hiệu ứng với sự kết hợp của nhiều biến.
Bạn lập trình tạo hiệu ứng như sau: Cho hai đèn LED ngoài cù n g sáng
sau đó là 2 LED ng oà i cùn g kế tiế p sáng để tạo hiệu ứng sáng đần vào
bên trong. C húng ta sẽ thực hiện dịch m ột lần hai LED theo hai hướng khác
nhau. Khi các đèn LED gặp nhau tại trung tâm thì chú ng sẽ trở về trạng thái
ban đầu. B ài tập này vẫn giữ nguyên các hàm mà chú ng ta đã thực hiện trong
bài trưđc nhưng sẽ có m ột số thay đổ i để mở rộng số LED , ch ú n g tôi sẽ
hướng dẫn các bạn rút ngắn m ã lệnh tuy số lượng LED sử dụ ng nhiều hơn. ở
đây chúng ta sử d ụ ng các chân I/O có sẵn củ a bo m ạch A rduino.

BÀI TẬP 1: H IỆU ỬNG SÁNG DẦN 12 LED VÀO TRUNG TÂM
Phần cứ ng

Bài tập này chú ng ta tiếp tụ c sử dụng cá c LED và các điện trở để hạn
dòng bảo vệ LED . C á c bạn có thể sử dụng cá c đèn LED siêu sáng để làm nổi
bật các bảng quản g cá o của bạn.

• D ùng 12 LED (có thể dùng các LED với màu


khác nhau).

• Dùng 12 điện trở hạn dòng 220 ohm.

Kết nối phần cứng

H ãy ng ắt nguồ n và cáp USB của bo m ạch A rdu in o sau đó kết nối


m ạch như hình trang bên.
Bạn nối m ạch như sau:
C ác châ n âm của LED nối với G ND của bo m ạch A rdu in o th ô n g qua
điện trỏ 220 ohm . C ác châ n dương của LED nối lần lượt với cá c châ n 0 đến
chân 11 của bo m ạch Arduino.

153
CHƯ0N6 4: BIẾU KHtẾN VA T Ạ I l ặ l i w llẩ l 12 l i l U H IM i m a i K H i n m

icspg
GX+)(UNỞ)
Hinh kết nối mạch điện trên test board
Hình dưới là kết nối mạch trẽn Proteus.

1S4
U i a i M M M CHO MGIfifl Tự I f c CHƯƠHS 4: ĐIẾO KBDỂN V * Ĩ Ạ Q I Í B i « V Ỉ1 12 l £ l

B ảng dưới là kế t nối chân của LED với bo m ạch Arduino.

BO M ẠC H A R D U IN O LED

C h ân số 0 LED 0

C hân số 1 LED 1

C h ân số 2 LED 2

C h ân số 3 LED 3

C hân số 4 LED 4

C hân số 5 LED 5

C h ân số 6 LED 6

C hán số 7 LED 7

C h ân số 8 LED 8

C h â n số 9 LED 9

C hân số 10 LED 10

C hân số 11 LED 11

«5
C H IM E 4: ĐIẼ P « H Ế H VÁ T Ạ I I t l ( K » l l t t L E I U M I M IJ U i C M J t f llT f J K

Phần mềm
Chương trinh cho bài tập này được trình bày bên dưói- Cnuong trinh
điều khiển hai LED ngoài cùng sáng, sau từng trạng thái sẽ thực niên dịch các
LED theo các hướng ngược nhau. Và khi hai LED hai bẽn đã d Ị C h cnuyển đ ế n
trung tâm thì cho các LED trà lại trạng thái ban đầu là hai LED Mgoài cùng
sáng và tiếp tục thực hiện chương trinh một lần nữa. Chưdng trim sẽ chạy lẳp
lại tiến trinh trẽn đến khi bạn ngắt nguồn vào bo mạch Arduino.
Chương trìn h tạo hiệu ứng LED sáng dần vào tru n g tảm
// Hiệu ứng LED sáng dần vào trung tàm
II Biến trạng thái LED
unsigned int StateLED=OBOOOOOOOOOOOOOOOO;
// Các biến tạm giúp tạo hiệu ứng
unsigned char Cal1=0B1 ,Cal2=0B00100000;
// Chương trinh khởi tạo
void setupO
{
// Khởi tạo ngõ ra cho các chân nối LED
for(int i=0;i<12;i++)
{
pinMode(i,OUTPUT);
}
// Sáng hai LED ngoài cùng
StateLED =C al1IC al2«6;
LEDChangeQ;
)
// Hàm rút các bit riêng lẻ trong một biến
boolean Bitstate(char pos)
{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & S tateL E D »p os;
xbit=xchar;
return xbit;

156
M U M IAN CHS Ktfdl TựI'C CHƯƠNG4: BIẾI BUỂN VÁTẠI BIỆBINC vỉ112 Lỉl

II Hàm thay d ổ i LED theo biến trạng thái LED


void LE D C h a n g e f)

(
for(in t i= 0;i< 12 ;i++ )

(
d ig ita lW rite (i,B itS ta te (i));

)
}
// Chương trình chính

void loopO

{
de la y(100 );// Đ ợ i 100 m iligiây

C a ll =Cal1 « 1 ; // Dịch vào trong cho biến hiệu ứng 1

if (C a ll ==0B01 OOOOOO) C al1= 0B 1; // Kiểm tra d ể trở lạ i trạng thái đầu

C a l2 = C a l2 » 1 ; // Dịch vào trong cho biến hiệu ứng 2

if (C a l2= = 0B 0 000 00 00) C a l2 = 0 B 0 0 1 00000; // Kiểm tra đ ể trở lạ i trạng thái


đầu

StateLED =C al1 IC a l2 « 6 ; // K ết hợp hai hiệu ứng vừa tạo thành m ột

LED ChangeO ;

}
H ãy v iế t chương trinh, biên dịch và tải xuống bo m ạch A rduino. Nếu
kết nối m ạch đúng và m ạch hoạt động chính xác thì bạn sẽ thấ y hai LED
ngoài cùn g sán g sau đó sáng dồn vào trong. Khi gặp nhau ò điểm giữa thì
chúng sẽ quay lại trạng thái ban đầu và tiếp tục thực hiện lại tiến trinh trên.

Tìm h iể u m ã lệ n h

ỏ chương trình này chú ng ta sẽ thực hiện hiệu ứng dịch ngược hướng
cùng lúc. Vì vậ y trên m ột biến chúng ta không thể nào thực hiện dược việc
này. Vì thế chú ng ta cần sử dụng đến hai biến hiệu ứng cho chương trinh. Sau
đó ch ú n g ta sẽ kết hợp hai biến hiệu ứng này m ột biến chứa các trạng tháĩ
LED và cho p h ép LED hiển thị theo biến trạng thái.

157
CHƯƠHt 4 : 8 IẼ 0 I M ẩ l l VÃ T Ạ I | Ị | i f w 111 t t L £ l UH1M ! ! ■ a i « **! TỊ m

Trong bài tập này chúng ta sẽ không khai báo tên LED đấu chưong
trình vì số LED chúng ta đã tăng lên, sử dụng khai báo tên LED là Khõng có
lợi cho bộ nhớ mã lệnh của chúng ta. Vì vậy chúng ta bò qua phán khai báo
tên LED và tiến đến phần khai báo biến cho chưong trinh.
Bạn khai báo một biến StateLED để chứa các trạng thái các LED
trong biến. Chúng ta sẽ khỏi tạo giá trị cho StateLED ở giá trị là 0. Và bạn chú
ý rằng biến StateLED của chúng ta có kiểu unsigned int. Bạn sử dụng kiểu
unsigned int vì trong bài tập này bạn đã sử dụng số lượng LED lớn hon. Vì vây
chúng ta cần sử dụng một biến có phạm vi số lớn. Và kiểu unsigned int có 16
bit, nên phù hợp với số lượng LED là 12 của chúng ta (bạn có tnể mỏ rộng
đến 16 LED):
unsigned int StateLED=OBOOOOOOOOOOOOOOOO;
Và chúng ta sẽ khai báo thêm hai biến hiệu ứng cho bài tập, các biến
này sẽ có giá trị khởi tạo ban đầu:
unsigned char C all =0B1 ,Cal2=0B00100000;
Vì một lần dịch tới hai LED ngược hướng nhau nên bạn sẽ SỪ dụng hai
biến hiệu ứng tạm này để thực hiện điều đó. Bạn sẽ thực hiện dịch trái cho
biến C all và dịch phải cho biến Cal2 và kết hợp chúng lại thành môt thì bạn
có được kết quả mong muốn là dịch hai LED ngược hướng. Khi kết hợp chúng
ta cần phải sử dụng giải thuật để chèn hai biến hiệu ứng mà không làm chúng
bị đè lên nhau. Trong phần trinh bày tiếp theo bạn sẽ tim hiểu giải thuãt này.
Chương trình khởi tạo của Arduino: Trong chường trinh khâi tạo bạn sẽ
thiết lập các chân nối vđi LED là các chân ngõ ra. Chương trinh khởi tạo cùa
bài tập này hoàn toàn khác so với các chương trình trước. Chúng ta đã rút gọn
mã lệnh để thiết lập 12 chân nối với LED là các chân ngõ ra. Nếu các bạn
dùng phương pháp cũ thì mã lệnh bạn sẽ dài và nếu sử dụng nhiều LED hơn
thi bộ nhớ mã lệnh dành cho các chương trình cần thiết sẽ không đù. Trong
chương trinh khởi tạo bạn sẽ sử dụng vòng lặp for để thực hiện thiết láp ngõ
ra cho các chân nối với LED:
void setupO
■ {
for(int i=0;i<12;i++)

{
pinMode(i, OUTPUT);

}
Sau đó chúng ta sẽ thực hiện kết hợp hai biến hiệu ứng thành n õ ; trong
giải thuật tiếp theo và gán nó vào biến StateLED và yẽu cấu LED hiển

158
AI1DHIIÃM CIS Neơđl ĩự BỌC C M C 4: BIẾU KHIỂN VÀ T Ạ I I IỆ I I m v i l « l ĩ l

S ta te L E D = C a l1 IC a l2 « 6 ;

LE D C hange();

}
T rong lệnh trên chú ng ta có ký tự 1 ” . Đ ây là ký tự để thực hiện phép
tính logic OR cho hai giá trị.

Phép tính OR này sẽ thực hiện trên toàn biến. V à đối với các bit khi
OR với nhau sẽ có b ả ng sự thật như sau:

A B A OR B

0 0 0

0 1 1

1 0 1

1 1 1

V à khi thực hiện ph ép tính OR trên ngôn ngữ A rduino thì bạn sẽ
thực hiệrì phép OR trê n từng bit trong biến. Ví dụ bạn có A = 0 B 0 1 010110,
B= 0B 10111100 và C =A IB thì ta có:

01010110

OR 10111100

11111110

Bạn có thể thấ y ch ú n g ta thực hiện phép tính C a l1 IC a l2 « 6 để tránh


các biến hiệu ứng đè lên nhau. Bạn sử dụng 12 LED và khi dịch đến LED thứ
6 là đã đến lú c giữ, vì v ậ y ch ú n g ta sẽ lấy 6 bit của biến C a ll để làm 6 bit
thấp và 6 bit của Cal2 làm 6 bit cao cho 12 LED.

M ục đích của ch ú n g ta là c h ỉ quan tâm đến 6 bit cuố i củ a cá c biến


C a ll, Cal2. G iả sử, bạn có C a l1 = 0 B 0 1 0 1 10 và biến C a l2 = 0 B 1 0 1 1 10 thì khi
thực hiện phép tính trê n chú ng ta sẽ có:

0 B 1 0 1 110<<6 = 101110 000000

OR 000000 010110

S tateL E D = 101110 010110

H àm tiếp theo là hàm rút các bit từ biến trạng thá i StateLE D , hàm này
giống vá i các bài tập trước nhưng chúng ta sẽ tăng giỏi hạn giá trị pos lẽn 16
vi trong bài này biến S tateLE D chúng ta đã là m ột biến 16 bit:

159
CHƯỨHS 4 : BIỂU H IẾ U VA TẠI H I t í m llđ l B l £ l U M M u n c u w H iT fi*

boolean BitState(char pos)


{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & StateLED>>pos;
xbit=xchar;
return xbit;
}
Tiếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLED, hàm này sẽ hoàn toàn khác với các chương trinh trước. Thay
vì chúng ta phải thiết lập từng bít cho từng chân thì chúng ta sẽ tnưc hiên vòng
lập để thực hiện việc này. Điều này sẽ giảm độ dài lệnh nhưng chưong trinh
tương đối khó hiểu hơn. Bạn sẽ cho lặp qua các chân của bo mạch Arduino và
gán giá trị cho các chân với các giá trị trong biến StateLED:
void LEDChangeO
{
for(int i=0;i<12;i++)
{
digitalWrite(i,BitState(i));
}
}
Cuối cùng chúng ta sẽ thực hiện chương trinh chính để LED hoạt động
theo ý muốn của mình. Đầu chương trình chúng ta sẽ cho đợi 100 miligiây đế
cho phép chương trinh sáng trạng thái ban đầu là 2 LED ngoài cùng
void loopO
{
delay(100);// Dợi 100 miligiãy
Tiếp theo là giải thuật dịch LED trong hai biến hiệu ứng. Co bản chúng
ta chỉ cần dịch hai biến C a ll sang trái và dịch biến Cal2 sang bên phải. Sau
mỗi lần dịch chúng ta kiểm tra xem giá trị có bị tràn khỏi 6 bit cuối hay không
Nếu tràn chúng ta thiết lập giá trị ban đầu cho các biến hiệu ứng:
C a ll =Cal1 <<1; // Dịch vào trong cho biến hiệu ứng ĩ
if (C all ==0B01000000) Cal1=0B1: // Kiểm tra để r à ai trang
thái đầu
Cal2=Cal2>>1; // Dịch vào trong cho biến hiệu ứng 2
ABDUIWO D Á M CHO mcưđl Tự HỌC CHƯƠNG 4: AIẾD (H Ể N VÀ TẠO B lỊllỨ N Ẽ V Ứ IU I iD

if (C a l2= = 0B 0 000 00 00) Cal2=0B001 OOOOO; // Kiểm tra đ ể trở lạ i


trạng th á i đâu
C u ối cùn g là bạn kết hợp hai biến hiệu ứng với nhau, gán giá trị vào
biến trạng thái LED và yêu cầu LED sáng theo biến trạng thái:
S tateLE D =C al1 ICal2<<6; II K ết hợp ha i hiệu ứng vừa tạo thành
m ột
LE D C h ang e();

BÀI TẬP Z: HIỆU ỨNG SÁNG DẦN LED Từ TRUNG TÂM RA BÊN NGOÀI
Trong bài tập này bạn sẽ thực hiện hiệu ứng dịch LED theo hai hướng
ngược nhau và bạn sẽ sử dụ ng hai biến hiệu ứng để thực hiện như bài tập
trước. Tuy nhiên hiệu ứng sẽ ngược VỚI bài trước.
Bài tập này sẽ cho hai LED chính giữa sáng ở đầu chương trình sau đó
chúng ta sẽ cho ch ú n g dịch ra hai bên từ trung tâm . Sau khi LED giữa đã dịch
ra ngoài bìa thì LED sẽ trở lại trạng thái ban đầu là hai LED trung tâm sáng và
tiếp tục dịch ra ngoài. T iế n trình trên sẽ diễn ra lặp đi lặp lại.
P hần cứ ng
Bài tập này chú ng ta tiế p tục sử dụng các LED và các điện trở để hạn
dòng bảo vệ LED . C á c bạn có thể sử dụng các đèn LED siêu sáng để làm nổi
bật các bảng quản g cá o của bạn.
• LED cá c m àu, bạn có thể dùng 12 LED siêu sáng.

• D ùng 12 điện trở hạn dòng 220 ohm.

K ết n ố i p h ầ n cứ n g
H ãy ngắt nguồ n và cáp USB của bo m ạch Arduino. Và kết nối m ạch
như hình trang bên.
B ạn nối m ạch như sau, các chân âm của LED nối với G ND cù a bo
m ạch A rdu in o thô ng qua điện trở 220 ohm. C ác chân dương củ a LED nối lần
lượt với các chân 0 đến chân 11 của bo m ạch Arduino.
Hình trang bên là bảng kết nối chân của LED với bo m ạch A rduino:

161
CHƯƠNG4: BIỂU KHIẾNVÀ TẠI BIÊD ỈNC vđl 12 LEI AINIM u n CH UtMMfJH

BO MẠCH ARDUINO LED

Chân số 0 LED ũ

Chân số 1 LED 1

Chân số 2 LED 2

Chán số 3 LED 3

Chân số 4 LED 4

Chân số 5 LED 5

Chân số 6 LED 6

Chân số 7 LED 7

Chân số 8 LED 8

Chân số 9 LED 9

Chân số 10 LED 10

Chân số 11 LED 11

Hình dưới là ảnh kết nối mạch trên test board.


1 m m M iA M c iim a a iT fM c CHƯƠNG 4: ĐIẾU H IỂ N VA TẠO aiỆU ÍTH6 v đ l 12 LED

Hình dưỏi là ảnh kết nối m ạch trên Proteus (Bạn hãy xem phần hướng
dẫn “Mô phỏng A rduino trẽn Proteus”).

J i l i - i -
DOIN'1
vts&;»ra.u«0(0

Hoạt dộng của chương trình

1 ^ LED LED LED LED LED LED LED LED LED LED LEO LED
/7""- 11 10 9 8 7 6 5 4 3 z 1 0

1 X X

2 X X

3 X X

4 X X

5 X X

6 X X

7 X X

"

163
CHKếNt 4:8IẾIỊBỊẾI »Á TẠI BÉI fw vll c t a

Phần mém
Chương trình cho bài tập này được trình bày bên dưói để điéu khiến
cho hai LED chính giữa sáng sau từng trạng thái sẽ thực hiên dịch các LED
theo các hướng ngược nhau. Và khi hai LED trung tâm đã dịch chuyển dén
các LED bìa thì cho các LED trở lại trạng thái ban đầu là hai LED chính giũa
sáng và tiếp tục thực hiện chương trình một lần nữa. Chương trinh sẽ chạy lâp
lại tiến trình trẽn đến khi bạn ngắt nguồn vào bo mạch Arduino.

Chương trình hiệu ứng sáng dẩn LED từ trung tâm ra bên ngoài:
// Hiệu ứng sáng dẩn LED từ trung tâm ra bên ngoài
II Biến trạng thái LED
unsigned int StateLED=0B0000000000000000;
// Các biến tạm giúp tạo hiệu ứng
unsigned char Cal1=OB1,Cal2=OB00100000;
// Chương trình khởi tạo
void setupO
{
// Khởi tạo ngô ra cho các chân nối LED
for(int i=0;i<12;ị++)
(
pinMode(i,OUTPUT);
}
// Sáng hai LED trung tãm
StateLE D =C al2IC al1«6;
LEDChangeO;
)
// Hàm rút các bit riêng lẻ trong một biến
boolean B itstate(char pos)
* ' * '{
boolean xbit;
unsigned char xchar=-1;
if (pos<16) xchar=0x1 & S ta te L E D » p o s;
xbit=xchar;
return xbit;
}

114
MIIOWIAM n i Mtftfl TựMC CHƯƠNG 4 : 6 I Ể IU U Ể I VÀ TẠIIắl i m v i l t t LE I

II Hàm thay đ ổ i LED theo biến trạng thái LED


void L E D C h a n g e f)

{
for(int i= 0;i< 12 ;i+ + )

{
dig ita lW rile (i,B itS ta te (i));

II Chương trình chinh


void loopO

{
delay(10 0 );// Đợi 100 m iligiây

C a l1 = C a l1 « 1 ; // Dịch vào trong cho biến hiệu ứng 1


if (C a ll = = 0 B 0 1 000000) C a l1 = 0 B 1 ; // Kiểm tra đ ể trở lạ i trạng thái đầu

C a l2 = C a l2 » 1 ; // Dịch vào trong cho biến hiệu ứng 2


if (C a l2= = 0B 0 000 00 00) C a l2 = 0 B 0 0 1 00000; // Kiểm tra đ ề trở lạ i trạng thái
đầu
S ta te L E D = C a l2 IC a l1 « 6 ; // K ết hợp ha i hiệu ứng vừa tạo thành m ộ t
LED ChangeQ ;

)
H ãy v iế t chương trình, biên dịch và tải xuống bo m ạch A rduino. Nếu
kết nối m ạch đú ng và m ạch ho ạt động chính xác thì bạn sẽ thấ y hai LED
chính giữa sẽ sán g dịch ra hai bên. Khi hai LED dịch đến rìa thi ch ú n g sẽ trở
lại trạng thá i ban đẩu là sán g hai LED chinh giữa và thực hiện lại tiến trình
m ột lần nữa.

Tìm h iể u m ã lệ n h

ở chương trình này ch ú n g tp sẽ thực hiện hiệu ứng dịch ngược hướng
cùng lúc. Do trẽ n m ột biến chú ng tà không thể nào thực hiện được v iệ c này, vì
thế chú ng ta cầ n sử d ụ ng đến hai biến hiệu ứng cho chương trình. Sau đó
chúng ta sẽ kết hợp hai biế n hiệu ứng này vào m ột biến chứa cá c trạng thái
LED và cho p h ép LED hiển thị theo biến trạng thái.
CKƯƯH6 4: ĐIÊU KHIẾM VA TẠO I I Ệ I ẩ n t Irô l t t t ĩ l U M I I M I C H M I lĩtặ

Bạn khai báo một biến StateLED đẽ’ chứa các tra^g H ả i các LEC
trong biến. Chúng ta sẽ khỏi tạo giá trị cho StateLED ở giá tri la G
unsigned int StateLED=OBOOOOOOOOOOOOOOOO:
Và chúng ta sẽ khai báo thêm hai biến hiêu ứng chc bài. các bién nay
sẽ có giá trị khởi tạo ban đầu:
unsigned char C all =0B1 ,Cal2=0B00100000;
Vi trong bài tập này mỗi lần dịch hai LED ngược hưóng nnau nên ban
sẽ sử dụng hai biến hiệu ứng tạm này để thực hiện điều đó. Ban sẽ thực hién
dịch trái cho biến CaM và dịch phải cho biến Cal2 và kết hơp chúng lại thánh
một thi bạn sẽ có được kết quả mong muốn là dịch hai LED ngưoc hưóng
Tiếp theo là chương trinh khởi tạo cùa Arduino, trong chưong trinh khòi
tạo bạn sẽ thiết lập các chân nối với LED là các chân ngõ ra:
void setupO
{
for(int i=0;i<12;i++)
(
pinMode(i,OUTPUT);
}
Sau đó chúng ta sẽ thực hiện kết họp hai biến hiệu ứng thành
một trong giải thuật tiếp theo và gán nó vào biến StateLED và yêu cáu LED
hiển thị:
StateLED =C al2IC al1«6;
LEDChangeO;
}
Phần mã lệnh này sẽ khác với bài tập trước. Thay vi chúng ta SỪ dụng
6 bit của biến C all làm 6 bit cuối của LED và 6 bit cùa bit Cal2 là 6 bit cao của
LED thì trong bài tập này chúng ta sẽ thực hiện ngược lại. Bạn sẽ lấy 6 bit cùa
biến Cal2 làm 6 bit cuối của LED và 6 bit của C all làm 6 bit đầu cùa LED Va
từ đó chúng ta sẽ tạo được hiệu ứng ngược lại so với bài trước.
Hàm tiếp theo là hàm rút các bit từ biến trạng thái StateLED:
boolean Bitstate(char pos)
{
boolean xbit;
unsigned char xchar=-1;
if (pose 16) xchar=0x1 & StateLED>>pos;
xbit=xchar;

1G6
ABDOINO DAM cao NGƯỮI Tự HỌC C M C 4: BIÉU KHIỂN VÁ TẠO BIỆU ỨMS MƠ112 LED

return xbit;

}
T iếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLE D :
void LED C hangeO

{
for(in t i= 0;i< 12;i++ )

{
d igita lW rite (i,B itS tate(i));

}
}
C uối cùng ch ú n g ta sẽ thực hiện chương trình chính để LED hoạt động
theo ý m uốn củ a mình. Đ ẩu chương trình chú ng ta sẽ cho đợi 100 m iligiãy để
cho phép chương trinh sáng trạng thái ban đầu là 2 LED ngoài cùng.
void loopO

{
d e la y (1 0 0 );// D ợ i 100 m ilígiây
T iế p theo là giải th u ậ t dịch LED trong hai biến hiệu ứng. Cơ bản chúng
ta chỉ cần dịch hai biến C a ll sang trái và dịch biến Cal2 sang bẽn phải. Sau
m ỗi lần dịch chú ng ta kiểm tra xem giá trị có bị tràn khòi 6 bít cuối hay không.
Nếu tràn ch ú n g ta th iế t lập giá trị ban đẩu cho các biến hiệu ứng:

C a ll =Cal1 < < 1 ; // Dịch vào trong cho biến hiệu ứng 1

if (C a l1 = = 0 B 0 1 000000) C al1=0B 1; // Kiểm tra đ ể trở lạ i trạng


th á i đầu

C a !2 = C a l2 > > 1 ; // Dịch vào trong cho biến hiệu ứng 2

if (C a l2= = 0B 0 000 00 00) C a l2 = 0 B 0 0 1 00000; // Kiểm tra đ ể trở lại


trạng thái đầu
C uối cùng, kết hợp hai biến hiệu ứng với nhau, nhưng trong bà i tập
này chú ng ta sẽ sử dụng Cal2 làm 6 bit thấp và C ah làm 6 bit cao. Sau đó,
gán giá trị và o biế n trạ n g thái LED và yêu cầu LED sáng theo biến trạng thái.

S ta te L E D = C a l2 IC a l1 « 6 ; // K ết hợp hai hiệu ứng vừa tạo thành


m ột
LE D C hangeQ ;
CM C 4: ĐIẼO KHIỂN n TẠI IÊ I lw nil g L£l UHH iằm a n jM iT fjii

BÀI TẬP 3: K Ế Ĩ Hựp HAI HIỆU ỨNG SÁNG VÀO VÀ SÁNG RA


Trong bài tập này chúng ta sẽ tổng hợp hai bài tãp trẽn !hành mốt,
nhờ đó bạn sẽ tạo ra một hiệu ứng lý thú hơn. Trong hai bài tâp truóc mõi khi
hiệu ứng kết thúc thì LED sẽ nhảy về vị trí sáng ban đầu làm cho hiệu ứng có
vẻ không được suôn sè.
Chúng ta sẽ kết hợp cả hai hiệu ứng thành một để tạo nên một hiẽu
ứng sáng vào sau đó sáng ra rồi lại lặp lại. Từ đó hiệu ứng cùa chúng ta sẽ
không có trạng thái nhảy vể vị trí ban đầu. Chúng ta sẽ kết họp hai hiệu ứng
và cho hiệu ứng sáng vào trong thực hiện trước, sau đó thực hiên hiệu ứng
sáng ra bên ngoài. Vì vậy, ban đầu hai LED ngoài cùng sẽ sáng rồi sẽ dịch
vào trong, đến khi hai LED đụng nhau thi chúng sẽ bật lại ra bên ngoài. Vá
quá trình trên sẽ thực hiện lại một lần nữa.

Phần cứng
Bài tập này chúng ta tiếp tục sử dụng các đèn LED và các điện Irở dể
hạn dòng bảo vệ LED. Các bạn có thể sử dụng các đèn LED siêu sáng để
làm nổi bật các bảng quảng cáo của bạn.

• LED các màu, bạn có thể dùng 12 LED siêu sáng để nổi bật hơn.

• Dùng 12 điện trở hạn dòng 220 ohm.

Kết nố i phần cứng


Hình dưới là bảng kết nối chân của LED với bo mạch Arduino.

BO MẠCH ARDUINO LED

Chân số 0 LED 0

Chân số 1 LED 1

Chân số 2 LED 2

Chân số 3 LED 3

Chân số 4 LED 4

Chân số 5 LED 5

168
HUM IAN m NCtftl TựBOC CHƯƠNG4: ĐIỂU KIẾN VÃÌẬI »Ệ« im vểl 12 l ĩ l

C h ân số 6 LED 6

C hân số 7 LED 7

C hân số 8 LED 8

C h ân số 9 LED 9

C hân số 10 LED 10

C hân số 11 LED 11

H inh dưới là ảnh kết nối m ạch trên test board.

B ạn hãy ngắt nguồn và cáp USB của bo m ạch A rdu in o và kết nối
mạch như hinh dưới.

• * » « * * • * « » • «• «• * * * * « * * * • * ■* «■ *■ • * « » * *

B ạn nối m ạch như sau, các chân âm của LED nối với G ND củ a bo
m ạch A rdu in o thô ng qua diện trở 220 ohm. C ác chân dương củ a LED nối lần
lượt với cá c chân 0 đến chân 11 cùa bo m ạch Arduino.
Hình trang bê n là ảnh kết nối m ạch trên Proteus.
CHƯƠNG 4 : ĐIỂU KHIẾN V * T Ạ I I E U UNG v ỉ l ư L E I u m iM ijjiC H t a im a I

Hoạt động của chương trình

LED LED LED LED LED LED LED LED LED LED LEO LED
11 10 9 8 7 6 5 4 3 I 1 0

1 X X
2 X X
3 X X
4 X X
5 X X
6 X X
7 X X
8 X X
9 X X
10 X X
11 X X
12 X X

lĩ ĩ

170
m m D A W cu o H6ƯƠI Tự HỌC_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CHƯƠNG 4: ỊỊỊỂ ỊỊ KHIỂN VA TẠO m ậ n ƯN6 VƠI 1Z LED

Phẩn m ểm
Chương trình cho bài tập này được viế t bên dưới điều khiển cho hai
LED chính giữa sáng, sau từng trạng thá i sẽ thực hiện dịch các LED theo các
hướng ngược nhau. Và khi hai LED trung tâm đã dịch ch u yể n đến các LED bia
thi cho các LED ng oà i bìa dịch ngược lại vào trung tâm , khi các LED chạ y đến
chính giữa thi lại thực hiện lại quá trình trên. Chương trình sẽ ch ạ y lặp lại tiến
trinh trên đến khi bạn ngắt nguồn bo m ạch Arduino.

Chương trình kết hợp hiệu ứng sáng vào và sáng ra.

// Kết hợp ha i hiệu ứng sáng vào và sáng ra

II Biến trạng th á i LED

unsigned int S tateL E D = 0B 0 000 00 000 00 00 000 ;

// Các biến tạm giú p tạo hiệu ứng

unsigned cha r Cal1=OB1 ,C al2=0B 00100000;

// Biến đ ổ i hiệu ứng


boolean C h angeE ffect;

// Chương trình khở i tạo


void setupO

// Khởi tạo ngõ ra cho các chân n ố i LED

for(int i= 0;i< 12 ;i++ )

{
pin M o d e (i,O UTPUT);
}

// Sáng hai LED trung tâm


S ta te L E D = C a l1 IC a l2 « 6 ;
LED ChangeQ ;
}

// Hàm rú t các bit riêng lẻ trong m ột biến

171
CHƯƠNG 4 : aiỂU H IẾ N VA T Ạ I I t l l l r t v đ l g L E I AIMIM I M t H B W lllK

boolean Bitstate(char pos)

{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & S tateL E D »p os;
xbit=xchar;
return xbit;
}

// Hàm thay đổi LED theo biến trạng thái LED


void LEDChangeO
{
for(int i= 0 ;i< 1 2 ;i+ + )

{
digitalWrite(i,BitState(i));
}

// Chương trình chinh


void loopO
{
delay(IOO);// Dợi 100 miligiảy

C a l1 = C a l1 « 1 ; // Dịch vào trong cho biến hiệu ứng 1


if (C all ==0B01000000) Cal1=0B1; // Kiểm tra đề trở lại trạng thái đẳu

Cal2=Cal2>>1; // Dịch vào trong cho biến hiệu ứng 2


if (Cal2==0B00000000){ // Kiềm tra để trở lạ i trạng thái đầu và đổi hiệu ứng
Cal2=0B001 OOOOO;
ChangeEffect=!Change Effect;
)

if(ChangeEffect==false){

172
U I I M IAN Cll NCtfOI Tự HQC CBƯƠH6 4:0 IẼ IỊỊỊÍỊỊ n TẬQIIỆI iw well 1? IE»

S ta te L E D = C a l1 IC a l2 « 6 ;

}
else{
S ta te L E D = C a l2 IC a l1 « 6 ;

LED C hangeO ;

}
H ãy v iế t chương trình, biên dịch và tải xuống bo m ạch A rduino. Nếu
kết nối m ạch đúng và m ạch hoạt động chính xác thì bạn sẽ th ấ y hai LED
chính giữa sẽ sáng dịch ra hai bên. Khi hai LED dịch đến bìa thì ch ú n g sẽ
dịch ngược trở lại và o trung tâm và quá trinh sẽ diễn ra lặp đi lặp lại.
Tim hiểu mã lệnh
Với chương trình này chú ng ta sẽ thực hiện hiệu ứng dịch ngược
hướng cùng lúc. Vì vậy, trê n m ột biến chú ng ta không thể nào thực hiện được
việc này. Vì thế chú ng ta cần sử dụng đến hai biến hiệu ứng cho chương trình.
Sau đó chúng ta sẽ kế t hợp hai biến hiệu ứng này, m ột biến chứa cá c trạng
thái LED và cho phép LED hiển thị theo biến trạng thái.
Bạn khai báo m ột biến StateLED để chứa các trạng thái các LED
trong biến. C húng ta sẽ khỏi tạo giá trị cho S tateLED ở giá trị là 0:
u n sig ned in t S tateLE D = 0B 0 000 00 000 00 00 000 ;
V à chú ng ta sẽ khai báo thêm hai biến hiệu ứng cho bài, các biến này
sẽ có giá trị khởi tạo ban đầu:
unsig ned char C a ll =0B1 ,C al2= 0B 0 0100000;
Do m ỗi lẩn dịch hai LED ngược hướng nhau nên bạn sẽ sử dụng hai
biến hiệu ứng tạm này để thực hiện điều đó. Bạn sẽ thực hiện dịch trái cho
biến C a ll và dịch ph ả i cho biến Cal2 và kết hợp chúng lại thà nh m ột thi bạn
sẽ có được kế t quả m ong m uốn là dịch hai LED ngược hướng.
Sau đó bạn sẽ thực hiện khởi tạo biến đổi hiệu ứng cho LED . Ban đầu
chúng ta sẽ cho dịch từ trong ra ngoài, khi dịch ra bìa thì chú ng ta cho hai LED
ngoài bia dịch từ ng oà i và o trong và khi hai LED đến trung tâm thì thực hiện lại
tử đầu là dịch từ trong ra ngoài:
boolean C h angeE ffect;
T iếp theo là chương trình khởi tạo củ a Arduino, trong chương trình khòi
tạo bạn sẽ thiế t lập cá c châ n nối với LED là các chân ngõ ra:
void setupO

17J
CHKOHC 4 : BIẾ U KHIẾH V Á TẠI IẺI Im v ể l B t£ »

for(int i=0;i<12;i++)
{
pinMode(i,OUTPUT);
}
Sau đó chúng ta sẽ thực hiện kết hợp hai biến hiệu ứng thành mót
để sáng hai LED trung tâm và gán nó vào biến StateLED và yêu cáu LED
hiển thị:
S tateLE D =C al1IC al2«6;
LEDChangeO;
}
Hàm tiếp theo là hàm rút các bit từ biến trạng thái StateLED:
boolean BitState(char pos)
{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & S ta te L E D » p o s;
xbit=xchar;
return xbit;
}
Tiếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLED:
void LEDChangeO
{
for(int i=0;i<12;i++)
{
digitalWrite(i,BitState(i));
)
)
Cuối cùng chúng ta sẽ thực hiện chương trinh chính để LED hoạt
động theo ý muốn của minh. Ngay đầu chương trinh chúng ta sẽ cho đọí
100 miligiáy để cho phép chương trinh sáng trạng thái ban đầu là 2 LED
trung tâm.
void loopO
{
delay(100);// Đợi 100 miligiảy

174
ARDUINO DÀNH CHO N6ƯỈI ĩự HOC CHƯƠNG 4: BIẾU KHIỂN VÀ TẠO HIỆU ỬH6 Mđl 1ZIEĐ

Bạn cũn g thực hiện dịch trái cho biến C a ll và dịch phải cho biến Cal2,
nhưng ở cấu trú c if kiểm tra trạng thái củ a biến Cal2 thì chú ng ta sẽ đổ i hiệu
ứng khi kết thú c hiệu ứng trước bằng cách đảo biến C hangeE ffect:
C a ll =Cal1 « 1 ; // Dịch vào trong cho biến hiệu ứng 1
if (C al1==0B01 OOOOOO) C al1=0B1; II Kiểm tra đ ể trở lạ i trạng
th á i đầu
C a l2 = C a l2 > > 1 ; // Dịch vào trong cho biến hiệu ứng 2
if (C a l2= = 0B 0 000 00 00){ // Kiểm tra đ ể trở lạ i trạng th á i đầu và
đ ổ i hiệu ứng
C a l2 = 0 B 0 0 100000;
Change E ffect= !C hangeE ffect;

}
T iếp theo ch ú n g ta sẽ dùng cấu trúc if để q u yế t định hiệu ứng sáng ra
ngoài hay sáng vào trong cho LED . Ban đầu chúng ta m uốn sáng ra ngoài
nên bạn sẽ cho thực hiện hiệu ứng sáng ra ngoài khi giá trị trong biến
ChangeEffect là false:
if(C h an geE ffect= = false){
S ta te L E D = C a l1 IC a l2 « 6 ;

}
else{
S ta te L E D = C a l2 IC a l1 « 6 ;

}
LED C hangeQ ;

BÀI TẬP 4: HIỆU ỨN9 SÁNG DỒN LED


T rong bài tập này chú ng ta sẽ thực hiện sáng dồn LED sang phải.
Sáng dồn là hiệu ứng bạn thưởng thấ y trong các bảng quảng cáo. Hiệu ứng
này sẽ thực hiện như sau:
C húng ta sẽ cho dịch 1 LED ngoài cùng bên trái sang bẽn phài. Khi
LED này dịch đến ngoài cùng bên phải thì LED này sẽ sáng và dừng ở vị trí
này. Sau đó lại cho dịch m ột LED từ ngoài cùng bên trái sang bẽn phải. Đ ến
khi LED này dịch đến vị trí kề bên LED đang sáng thì chú ng sẽ sáng và dừng
lại. Sau đó lại cho m ột LED khác dịch từ bên trái sang bên phải và dừng 0 kê
LED đang sáng. Và ch ú n g ta sẽ dịch LED đến khi 12 LED của chú ng ta đều
sáng thi bạn sẽ tắt hết LED và tiếp tục quá trình sáng dổn.

175
CHƯƠNG4: 6IỂIIBIỂH VÀTẠI IẼI im vấl tt lĩl > w u « w m in

Phần cứng
Bài tập này chúng ta tiếp tục sử dụng các LED và các diên trở để hạn
dòng bảo vệ LED. Các bạn có thể sử dụng các đèn LED siẽu sáng đẽ làm nil
bật các bảng quảng cáo của bạn.
• LED các màu, bạn có th ể dùng 12 LED siêu sáng.

• Dùng 12 điện trở hạn dòng 220 ohm.

Kết nối phần cứng


Hãy ngắt nguồn và cáp USB của bo mạch Arduino và kết nối mạch
như hình dưới. Bạn nối mạch như sau, các chân âm của LED nối vói GND cùa
bo mạch Arduino thông qua điện trở 220 ohm. Các chân dương cùa LED nối
lần lượt với các chân 0 đến chân 11 của bo mạch Arduino.
Bảng kết nối chân của LED với bo mạch Arduino.

BO MẠCH ARDUINO LED

Chân số 0 LED 0

Chân số 1 LED 1

Chân số 2 LED 2

Chân số 3 LED 3

Chân số 4 LED 4

Chân số 5 LED 5

Chân số 6 LED 6

Chân số 7 LED 7

Chân số 8 LED 8

Chân số 9 LED 9

Chân số 10 LED 10

Chân số 11 LED 11

176
M D H 8 IA W MO NSƯỪI Tự HQC CHUONG 4: BIẾB KHIỂN VẢ T Ạ IH IỆ B i N t V iM Z L E D

Hình dưới là ảnh kết nối m ạch trẽn test board.

Hình dưới là ảnh kế t nối m ạch trên Proteus.

177
CBƯđM 4: BIẾIBỊẾI VA TẠI |Ẹ| m »|l t ig __________
A lu m I AW CII Mtftfl Tự IfC CHƯỜNG 4: ÕIẾ0II Ế I VÀ TAI IỂ I iK V llt Z L E i

eat MI M M X Mí X X X K X K
ã

tHO
X X X
LU

•si
m X
IU
mtd

m
ea *
5

ca X
LU
IE D E
LEO 6
LED 7

X
LEBS

M
LED 9

ea X X
LLI

*Mé
X
Ui
Uii

5 / U) CO r> .
V**
09 CO
¥•*
o
CM Ĩ nJ ẽsĩ
Ci
CNI t\J
II*
6>J

/ «H
/ * ia

179
CHƯƯHC4: MỂI HIẾII VÁ TẠI l Ị l ếw Dll B Ltl UWIM IM tM W H H |ặ

Phần mềm
Chương trinh cho bài này được trinh bày bén dưới Nhiém vụ cùa
chương trinh là tạo ra hai biến hiệu ứng, sau đó sẽ cho mõĩ biến dịch và mô!
biến nền tăng lên sau mỗi lần dịch LED đến kề LED đang sáng. Viẽc chúng ta
kết hợp hai biến sẽ tạo hiệu ứng sáng dồn.
Chương trìn h hiệu ứng sáng dồn LED.
II Hiệu ứng sáng dồn LED

II Biến trạng thái LED


unsigned int StateLED=OBOOOOOOOOOOOOOOOO;

// Các biến tạm giúp tạo hiệu ứng


unsigned int C a ll ,Cal2;

// Chương trình khởi tạo


void setupO
{
// Khởi tạo ngõ ra cho các chân nối LED
for(int i=0;i<12;i++)
{
pinMode(i,OUTPUT);
)

// Hàm rút các bit riêng lẻ trong một biến


boolean Bitstate(char pos)
(
boolean xbit;
unsigned char xchar=-1;
ìf(pos<16) xchar=0x1 & StateLED>>pos;
xbit=xchar;
return xbit;
)

uo
1 MDiMO IAM no Klídl TựBỌC CHƯƠNG 4: BIẾU IMỂN VÀ TẠI IỆ I ífw y đ l 1? LEH

// Hàm thay đ ổ i LED theo biến trạng thái LED


void LE D C hangeO

{
for(int i= 0;i< 12 ;i++ )

{
d ig ita lW rite (i,B itS tate(i));

II Chương trình chính


void loop()

// Khởi tạo các giá trị ban đầu cho các biến hiệu ứng

Cal2=0;
C al1=0x1000;
for(int i= 1 2 ;i> 0 ;i-) // Vòng lặp đ ể tăng biến Cal2

{
for(int j= 0 ;j< i;j+ + ) // Vòng lặp dịch biến C a ll

{
delay(IO O );
C a l1 = C a l1 » 1 ; // Dịch biến C a ll sang p h ả i

StateLED =C al1 ICal2; // K ết hợp hai biến


LE D C hangeO ;

}
C al1=0x1000;
C a l2 = C a l2 « 1 l1 ; // Tăng biến Cal2

)
delay(IOO);
}
H ã y viế t chương trình, biên dịch và tải xuống bo m ạch A rduino. Nếu
kết nối m ạch đúng và m ạch hoạt động chính xác thì bạn sẽ thấ y hai LED
ngoài cùn g bên trái sán g và dịch sang bên phải.

181
CHITONS4: BIẾÍ HBIỂMu TẠI HỆI lilt nil B l a

Khi đến bìa bên phải LED sẽ sáng và dừng lại. Sau đó mót LED khac
từ bên trái dịch sang bên phải và sẽ sáng sau đó dửng lại <é bén LED đà
sáng trước đỏ. Cứ thế đến khi tất cả các LED sáng hết thì hiẽb úng sẽ thực
hiện lại ban đầu.

Tìm hiểu mã lệnh


Trong chương trình này bạn sẽ tạo hai biến hiệu ứng. M õi biến sẽ giúp
bạn dịch LED, còn biến còn lại sẽ là biến nền sẽ tăng lên sau mỗi lẩn dich
Giải thuật sử dụng trong chương trinh này như sau:

1. Dịch bit 1 trong biến C a ll, đây là biến tạm hiệu ứng
2. Kết hợp hai biến thành 1 để tạo hiệu ứng sáng dón sau mồi
lần dịch.
3. Sau khi bit 1 dịch đến vị trí định trước thi bạn sẽ cho táng biến
Cal2. Chúng ta thực hiện tăng biến Cal2 theo quy luãt là chèn
thêm bit 1 bằng phép tính dịch bit và thực hiện phép tinh OR VỚ11.
Trong bài tập này chúng ta sử dụng phép tính tăng biến Cal2 la
Cal2=Cal2<<1l1.

Ví dụ: Khi bạn dịch phải biến C a ll từ 0B1000 thành 0B0001 thì phép
tính Cal2 sẽ thực hiện như sau. Giả sử biến Cal2=0B00 thì khi dịch trái thi biến
Cal2=0B00 và OR với 1 thi Cal2=0B01.

Ở trạng thái tiếp theo chúng ta sẽ gán giá trị 0B1000 cho biến Call va
dịch thành OBOOIO là đã kết thúc quá trình dịch. Và biến Cal2 đang có giá trj
là 0B01nên khi dịch thì Cal2=ŨB10 và thực hiện phép OR vói 1 thi
Cal2=0B11.

Sau mỗi lần dịch thi bạn sẽ thực hiện kết hợp hai biến để tao hiệu ứng
sáng dồn.

Để hiểu hơn về giải thuật chúng ta sẽ tiếp tục phân tích mã lênh cùa
bài tập này.

Bạn khai báo một biến StateLED để chứa các trạng thái các LED
trong biến. Chúng ta sẽ khởi tạo giá trị cho StateLED ở giá trị là 0:

unsigned int StateLED=OBOOOOOOOOOOOOOOOO;

Và chúng ta sẽ khai báo thêm hai biến hiệu ửng, các biến này sẽ có
giá trị khỏi tạo ban đầu, nhưng chú ý rằng: Hai biến tạo hiệu ứna cnúng ta sú
dụng khai báo unsigned int bởi vi chúng ta sử dụng 12 LED:

unsigned int C a ll ,Cal2;

Tiếp theo là chưong trinh khỏi tạo cùa Arduino, trong chương trr.n khòi
tạo bạn sẽ thiết lập các chân nối với LED là các chân ngõ ra.

18?
A l u m I km C M MtWi Tựlạc (M K 4: BIẾI DỂI VÀTẠI IỆ I im vểl tt IH

v oid setupO

{
fo r(in t i= 0;i< 12 ;i++ )

{
p in M o d e (i,O UTPUT);

}
}
Hàm tiế p theo là hàm rú t các bit từ biến trạng th á i StateLE D .

Hàm này giốn g với các bài tập trước nhưng ch ú n g ta sẽ tăng giới hạn
giá trị pos lên 16 vì trong bà i này biến StateLED chú ng ta đã là m ộ t biến
16 bit-

bo olean B itS ta te (ch a r pos)

{
bo olean xbit;
unsigned cha r xchar=-1;
if ( p o s d 6) xchar=Ox1 & S ta te L E D » p o s ;
xbit= xcha r;
return xbit;

}
T iế p theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến S tateLED :
void LE D C hangeO

{
fo r(in t i= 0;i< 12 ;i+ + )

{
d ig ita lW rite (i,B itS ta te (i));

}
}
C uối cùn g ch ú n g ta sẽ thực hiện chương trình chính để LED hoạt động
theo ý m uốn cùa m inh:
void loopO

{
CHƯƯHB4:8IẼI Hển VÀ TẠI 1*1 tfH6 vđl tt l ĩ l u w iM if C H K W H f«

Đầu tiên, bạn khởi tạo các giá trị ban dắu cho các biến mẽu úng. Ban
đầu biến hiệu ứng nền Cal2 là 0 và biến hiệu ứng dich có giá trị làm sáng
LED ngoài cùng bên trái.
Cal2=0;
C a ll =0x1000;
Giá trị của C a ll trong bài tập này chúng ta sẽ sử dụng khai báo s6
thập lục phân thay vì số nhị phân như trong các chương trinh knác. Số đếm
mà bạn sử dụng trong đời sống là số thập phân. Máy tính chúng la không sù
dụng số thập phân mà chúng sử dụng hệ số đếm nhị phân. Tnay vi bạn sù
dụng số nhị phân để biểu diễn thì rất dài dòng nên trong lâp trình ngưòi ta
thưởng sử dụng số thập lục phân.
Trong hệ số đếm thập phân mà chúng ta dùng thi các cnữ số sẽ là 0
đến 9, số nhị phân là 0 hoặc 1, số thập lục phân là 0 đến F.

NHỊ PHÂN THẬP LỤC PHÂN

0000 0

0001 1

0010 2

0011 3

0100 4

0101 5

0110 6

0111 7

1000 8

1001 9

1010 A

1011 B

1100 c
1101 D

1110 E

1111 F

IM
Allow »ÁWa i Mtưỉíl TựIft CHƯƠNG 4: B IẾ I IB Ể N VÀ Ĩ Ạ I l Ị l ÍN t V ế M ỈL E I

Bạn có thể chu yển đổ i qua lại giữa cá c hệ số đếm với nhau. Trong
bài tập này c h ú n g ta c h ỉ tập trung vào v iệ c chu yển đổ i số thậ p lục phân và sô
nhị phân.

Bạn có bảng số nhị phân và số thập lục phân như sau (bạn nên thu ộc
bảng này vì nó rất có lợi cho bạn trong công việc lập trinh): B ảng trang trước
thể hiện cá c số nhị phân tương ứng với các số thập lục phân từ giá trị 0 đến F
(trong hệ thập phân là từ 0 đến 15). N ếu bạn sử dụng m ột số lớn hơn F (15
trong hệ thập phân hoặc số nhị phân nhiều hơn 4 bit) thì bạn tách số nhị phân
thành các đoạn 4 bit từ phải sang trá i và dùng bảng trên để tìm số thập lục
phân. G iả sử chú ng ta có:

0B 1001010100011

Bạn tách số trê n thành các đoạn số 4 bit và dùng bảng trên để đánh
số cho các đoạn 4 bit:

1 0010 1010 0011

1 2 A 3

V ậy số O B1001010100011 (hệ nhị ph ân )= 0 X 12 A 3 (hệ thập lục phân).

Trở lại với chương trình, bạn m uốn LED cuối cùn g bẽn trái sáng nên
chúng ta sẽ có giá trị C a ll là 0X1000.

T iế p theo, bạn tạo m ột vòng lặp để tăng biến Cal2 khi hoàn tấ t việ c
địch biến C a ll như giải thuật. C húng ta sẽ thực hiện vòng lặp for như sau:

fo r(in t i= 1 2 ;i> 0 ;i~ ) II Vòng lặp đ ể tăng biến Cal2

T rong vòn g lặp này thi giá trị khởi tạo là 12 (chúng ta có 12 LED ) và
giá trị số đếm j sẽ giảm m ỗi vòng lặp. T iế p theo là vòng lập dịch biế n C a ll.
Vòng lặp này sẽ giảm số lần dịch dựa trên biến j của vòng lặp trước. Sau m ỗi
lần dịch thì thay đổi LED theo hai biến hiệu ứng bằng cách OR lại vôi nhau:

for(in t j= 0 ;j< i;j+ + ) // Vòng lặp dịch biến C a ll

dela y(100 );

C a ll =Cal1 » 1 ; // Dịch biến C a ll sang ph ả i

S tateL E D = C al1IC a l2; // K ế t hợp hai biến

LE D C hangeO ;

185
C fflfflm 4: B IÉ I I I Ế « HÁ T Ạ I r t i t u y t i B l ĩ i U W lU M C M K H tĩT *

Sau mỗi lẩn dịch xong thl khởi tạo giá trị ban đấu cho biến C all vá
tăng biến Cal2 như giải thuật.
Cal1=0x1000;

C a l2 = C a l2 « 1 11; // Tăng biến Cal2

)
delay(100);

BÀI TẬP 5: HIỆU ỨNG KẾT Htfp SÁNG DỒN VÀ TẮT DỒN
Trong bài tập này bạn sẽ kết hợp hai hiệu ứng sáng dón và tắt dón để
hiệu ứng diễn ra được suôn sẻ hơn. Trong bài tập trước, khi bạn thực hiện
sáng dồn hoàn tất thl đột ngột các LED sẽ bị tắt dẫn đến hiệu ứng có phán
không suôn sẻ.
Trong bài tập này, khi sáng dồn hoàn tất thl 12 LED sẽ sáng và chúng
ta thực hiện tắt dổn các LED theo hướng dịch LED ngược lại. Khi các LED đã
thực hiện tắt dổn xong thì 12 LED sẽ tắt và chúng ta lại thực hiện sáng dón
Quá trinh lặp lại tạo hiệu ứng rất bắt mắt khi bạn dùng nhiều LED hơn cho
một ngõ ra.

Phần cứng
Bài tập này chúng ta tiếp tục sử dụng các LED và các điện trà để hạn
dòng bảo vệ LED.
• Sử dụng 12 LED các màu, bạn có thể dùng LED siêu sáng.

• Sử dụng 12 điện trỏ hạn dòng 220 ohm.

Kết nố i phẩn cứng

Hãy ngắt nguồn và cáp USB của bo mạch Arduino sau đố kết nối
mạch như hình trang bên.

Bạn nối mạch như sau, các chân âm cùa LED nối vói GND của bo
mạch Arduino thông qua điện trở 220 ohm. Các chân dương cùa LED nối lán
lượt với các chân 0 đến chân 11 cùa bo mạch Arduino.
Bảng trang bẽn là kết nối chân cùa LED với bo mạch ArdLHo
M U M 1 A M C IS N C M l I f I f c CHtftfNC 4: B IÉ I MUỂN VÀ Ì Ạ I I Ệ I I w v i l 12 LĨB

B O M Ạ C H A R D U IN O LED

Chân số 0 LED 0

Chân sô' 1 LED 1

Chân số 2 LED 2

C h ân số 3 LED 3

Chân số 4 LED 4

Chân số 5 LED 5

Chân số 6 LED 6

Chân số 7 LED 7

Chân số 8 LED 8

Chân sô' 9 LED 9

Chân số 10 LED 10

C hân số 11 LED 11

Hình dưới là ảnh kết nối m ạch trẽ n test board.


I sty*:', sK&x >fgg«v I

187
CHƯƠNG 4 : BIỂ U KHIẾN VÀ T Ạ I l i l I w v ể l t t l i l U N M U « C M K * ir ặ «

Hình dưới là ảnh kết nối mạch trên Proteus.

Hoạt đ ộ ng của chương trình

N. LEO
LED LED LED IE0 LED LED LED LED LED LEI IEI LEI
T rạ n g \ 11 to s 1 7 c s 4 Ỉ 2 1 1
thái

1 X

2 X

10 X

11 X

12 X

13 X X

14 X X

188
A 1 I I M I A M C ll K t t í l lự BỌC CHƯQNC 4: ĐIỂU I H Ể I VÀ T Ạ I H Ê l l K V ẩ l t t l i »

X . LED
LED LED LED LEO LED LED LED LED LED LED LED LED
T rạ n g V 11 10 9 8 7 6 5 4 3 2 1 0
thai

X X
21

22 X X

23 X X

24 X X X

25 X X X

N X X X X X X X X X X X X

N +1 X X X X X X X X X X X

N+2 X X X X X X X X X X X

X X X X X X X X X X X

K X X X X X X X X X X X

K+1 X X X X X X X X X X

K+2 X X X X X X X X X X

J+1 X

J+ 2 X

T X X X X X X X X X X X X

Phần mềm

Chương trình cho bài tập này được viế t như trang bẽn. Chương trinh
sẽ tạo ra hai biế n hiệu ứng sau đó thực hiện sáng dồn trước và thực hiện tắt
dồn sau.

1 ỈỈ
CBƯƠH6 4:6IẼI HIỂM »* TẠI BÉI I k vil BIEI u w I M a » K ề n Tf m

Sau mãi hiệu ứng sẽ cho phép đợi 100 miligiây trưỏc kni chuyển qua
hiệu ứng kia.
Chường trình kết hợp sáng dón và tắt dổn
// Hiệu ứng sáng dồn và tắt dồn LED

// Biến trạng thái LED


unsigned int StateLED=OBOOOOOOOOOOOOOOOO;

// Các biến tạm giúp tạo hiệu ứng


unsigned int C a ll ,Cal2;

// Chương trình khởi tạo


void setupO
{
// Khởi tạo ngõ rạ cho các chân nối LED
for(int i=0;i<12;i++)
{
pinMode(i,OUTPUT);
)

// Hàm rút các bit riêng lẻ trong một biến


boolean Bitstate(char pos)
{
boolean xbit;
unsigned char xchar=-1;
if (p o s <16) xchar=0x1 & S ta te L E D » p o s;
xbit=xchar;
return xbit;
)

// Hàm thay đổi LED theo biến trạng thái LED

void LEDChangeO
{
A IllllA H a iW r tlT flfC CBƯỂNC 4: B IẾ IIIÉ IV * ĨẠ IH É I r w v i n n t l

for(int i=0;i<12;i++)

{
digitalWrite(i,BitState(i));

// Chương trình chinh


void loopO

(
// Khởi tạo các giá trị ban đẩu cho các biến hiệu ứng
Cal2=0;
C all =0x1 OOO;
for(int i= 12 ;i> 0 ;i--) // Vòng lặp đ ể tăng biến Cal2

{
for(in t j= 0 ;j< i;j+ + ) // Vòng lặp dịch biến C a ll

{
delay(100);
C a l1 = C a l1 » 1 ; // Dịch biến C a ll sang p h ả i

StateLED =C al1ÍCal2; // K ế t bợp h a i biế n


LEDChangeO;

}
C a ll =0x1000;
C a l2 = C a l2 « 1 l1 ; // Tăng biến Cal2

delay(100);

// Khởi tạo cá c giá trị ban dầu cho các biến hiệu ứng đ ể tạo hiệu ứng 2
Cal2=0;
C a ll =0x1;
for(in t i= 1 1 ;i> 0 ;i- ) // Vòng lặp đ ể tăng biến Cal2

191
CHƯỜNt 4 : 8 I Ế I n ể » V Ã T Ạ I r t l i n tfl B III u n m » a i« W im t

for(int j=0;j<i;j++)
{
delay(100);
C a l1 = C a l1 « 1 ; Dịch biến C a ll sang trái

StateLED=-(Cal1 ICal2); // Kết hợp hai biến và đảo giá trị để thưc hiện tấl
dồn
LEDChangeO;
}
C a ll =0x1;
C a l2 = C a l2 » 110X800; // Tăng biến Cal2
}
delay(100);
}
Hãy viết chương trình, biên dịch và tải xuống bo mạch Arduino. Nếu
kết nối mạch đúng và mạch hoạt động chinh xác thì bạn sẽ thấy các LED
sáng dồn trước. Sau khi sáng dồn thl sẽ tắt dồn và tiến trình lặp đi lặp lại.
Tìm hiểu mã lệnh
Bạn khai báo một biến StateLED để chứa các trạng thái các LED
trong biến. Chúng ta sẽ khởi tạo giá trị cho StateLED ở giá trị là 0:
unsigned int StateLED=OBOOOOOOOOOOOOOOOO;
Và chúng ta sẽ khai báo thêm hai biến hiệu ứng, các biến này sẽ có
giá trị khỏi tạo ban đầu, nhưng chú ý rằng: Hai biến tạo hiệu ứng chúng ta sừ
dụng khai báo unsigned int bởi vì chúng ta sử dụng 12 LED:
unsigned int Cal1,Cal2;
Tiếp theo là chương trinh khởi tạo cũa Arduino, trong chương trinh khỏi
tạo bạn sẽ thiết lập các chân nối với LED là các chân ngõ ra:
void setupO
{
for(int i=0;i<12;i++)
{
pinMode(i,OUTPUT);
}
}

192
AUMNMNCII K ltl Tựlệt CKtftfNC4: BIẾIUNẾI ú T Ậ IIẩ liK vim a

H àm tiếp theo là hàm rút cá c bit từ biến trạng thái StateLE D , hàm này
giống với các bài trước nhưng ch ú n g ta sẽ tăng giới hạn giá trị pos lên 16 vì
trong bà i này biến S tateLE D chúng ta đã là m ộ t biến 16 bit:
bo olean B itS tate(ch ar pos)

{
bo olean xbit;
unsigned char xchar=-1;
if (pos< 16) xchar=0x1 & S tateLE D >>pos;
xbit=xchar;
return xbit;

}
T iế p theo, sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLE D :
void LE D C hangeO

{
fo r(in t i= 0;i< 12 ;i++ )

{
d ig ita lW rite (i,B itS ta te (i));

}
}
C uối cùng ch ú n g ta sẽ thực hiện chương trinh chính để LED hoạt động
theo ý m uốn của mình:
void loopO

{
Đ ău tiên chú ng ta Ihực hiện hiệu ứng sáng dồn từ trái sang phải như
bài trước:
C al2=0;
C a ll = 0x1000;
fo r(in t i= 1 2 ;i> 0 ;i~ ) // Vòng lặp đ ể tăng biến Cal2

{
for(in t j= 0 ;j< i;j+ + ) // Vòng lặp dịch biến C a ll

{
d e la y (1 00);
C a h =Cal1 » 1 ; // Dịch biến C a ll sang ph ả i

193
cwflfwt 4: BIẾI MẾ» ù TẠI B É IÍK vll tt i a <i— i A « a iK iT H t

StateLED=Cal1 ICal2; // Kết hợp hai biến


LEDChangeO;
}
C a ll =0x1000;
C a l2 = C a l2 « 1 11; II Tăng biến Cal2
)
Cuối hiệu ứng sáng dổn chúng ta cho đợi 100 ms giây:
delay(100);
Tiếp tục là chúng ta sẽ lập trinh hiệu ứng thứ hai cho chưong trinh,
chúng ta sẽ khởi tạo biến Cah tại giá trị LED ngoài cùng bên phải để chúng
ta thực hiện dịch trái:
Cal2=0;
C a ll =0x1;
Tiếp theo là các vòng lặp tạo hiệu ứng như trong phần sáng dổn LED,
nhưng phần dịch LED, phẩn tăng biến Cal2 và phần kết hợp giá trị cho LED
sẽ hoàn toàn khác. Vì bạn muốn tắt dần nên chúng ta sẽ kết hợp hai biến
hiệu ứng vào đảo giá trị này thì sẽ thực hiện dược việc tắt dồn:
for(int i=11;i>0;i~)// Vòng lặp để tăng biến Cal2
{
for(int j=0;j<i;j++)
{
delay(100);
C a l1 = C a l1 « 1 ; Dịch biến C a ll sang trái

StateLED=-(Cal1 ICal2); // Kết hợp hai biến và đảo giá trị để


thực hiện tắt dồn
LEDChangeO;
)
Cal1=0x1;
C a l2 = C a l2 » 1 10X800; // Tăng biến Cal2
}
delay(100);
)

194
A IM I M l À l g C H W t W lT f i q t CHƯdNCS: Đ Ó M IẾU ù TẠI ■ Ẽ l i m t t L£» T IE I HÁM

CHUONG9

ĐIỀU KHIỂIII VÀ TẠO HIỆU ỬNG12 LED ■ ■

THEO MẢNG
T rong các bà i tập trước, chúng ta đã tạo hiệu ứng cho LED theo những
giải thu ật tính toán dựa vào các toán tử dịch hay các phép toán logic. Những
hiệu ứng này có m ột quy luật nhất định nào dó. V ậy còn đố i với cá c hiệu ứng
không có m ột quy lu ật hay chu kỳ nhất định nào thì chú ng ta sẽ xử lý ra sao?

Câu trả lời là:

C húng ta sẽ xử lý chú ng bằng cách sử dụng LED sáng theo m ột m ảng


định trước. Và m ảng này là những phần tử giá trị mà bạn m uốn LED sáng.

Trong bài tập này, chúng ta sẽ thực hiện m ột bài tập m ẫu về cách sử
dụng m ảng để điều khiển hiệu ứng sáng cho LED. Đ ối với cách này sẽ có các
ưu điểm và nhược điểm so với cách điểu khiển LED theo quy luật và phép tính:

ưu điểm :
• Đơn giản.
• Làm được tất cả cá c hiệu ứng cho LED quảng cáo.
• Không m ất thời gian để suy nghĩ phép tính cho hiệu ứng.
Nhược đ iể m :
• T ốn dung lượng bộ nhớ.
• T ốn thời gian sắp xếp tính toán giá trị hiệu ứng.
T rong thực tế việ c thực hiện các hiệu ứng để quảng cáo LED thì
thường kết hợp hai cách tạo hiệu ứng để kết hợp cả ưu điểm và nhược điểm
của hai cách.

BÀI TẬP 1: TẠO HIỆU ỨNG SÁNG LED THEO MẢNG


Phần cứng
Bài tập này chú ng ta tiếp tục sử dụng 12 đèn LED và 12 điện trỏ để
hạn dòng bảo vệ LED . C á c bạn có thể sử dụng các đèn LED với nhiều màu
khác nhau để làm nổi bật các bảng quảng cáo củ a bạn.

• LED các m àu, bạn có thể dùng 12 LED siêu sáng.


• D ùng 12 điện trở hạn dòng 220 ohm.

195
CBIitfWS: BỂI HỂN VÀĨẠI I t I I k 12 LEI TCI HẮK

Kết nố i phẩn cứng LED


BO M Ạ C H A R D U IN O
Bạn hãy ngắt nguổn và
cáp USB của bo mạch Arduino C h ân số 0 LED 0
và kết nối mạch như hình dưới.
C h â n sỏ 1 LED 1
Bạn nối mạch như sau,
các chân âm của LED nối với C h ân số 2 LED 2
GND của bo mạch Arduino thông C h â n số 3 LED 3
qua điện trở 220 ohm. Các chán
dương của LED nối lần lượt với Chân sô 4 LED 4
các chân 0 đến chân 11 của bo
C h â n số 5 LED 5
mạch Arduino.
C h â n số 6 LED 6
Hình bên là bảng kết nối
chân của LED với bo mạch C h ân số 7 LED 7
Arduino.
C h ân số 8 LED 8
Hình dưới là ảnh kết nối
mạch trên test board: Chân số 9 LED 9

C h â n số 10 LED 10

C h â n s ố 11 LED 11

196
ẦIMIMIÁM CM K6tftíl Tự BỌC CHỬđNG S: ĐIỂB H IẾN VA TẠ I 1 Ệ I i f * tt I E ! T I E I M Ả K

Hình dưới là ảnh kết nối m ạch trên Proteus (bạn xem phần hướng dẫn
"Mô phỏng A rdu in o trên P roteus” .

Hoạt động cùa chương trình

197
CIƯƯNC 5 : ĐtỀO KHIẾM VÀ TẠI I I Ệ I r w 1 2 I E I T E IM Á K m w w w iif*

Phần mềm

Chương trình cho bàí tập này được viết bên dưới. Chưong trình sẽ co
một mảng chứa các giá trị hiệu ứng.

Trong bài tập này chúng ta sẽ tạo hiệu ứng có 5 trạng thái sáng LED
trong mảng. Sau khi chạy hết mảng thì LED sẽ bắt đầu trạng thái ban đấu

Chương trình sáng LED theo mảng:

// Sáng LED theo mảng

II Biến trạng thái LED

unsigned int StateLED=OBOOOOOOOOOOOOOOOO;

II Mảng chứa hiệu ứng LED

unsigned int Cal[]={0x861,0x492,0x300,0x492,0x861);

// Chương trình khởi tạo

void setupO

{
// Khởi tạo ngõ ra cho các chân nối LED

for(int i=0;i<12;i++)

pinMode(i,OUTPUT);

// Hàm rút các bit riêng lẻ trong một biến

boolean Bitstate(char pos)

{
boolean xbit;

unsigned char xchar=-1;

if ( p o s d 6) xchar=0x1 & StateLED>>pos;

xbit=xchar;

return xbit;

198
AIHIM l Ấ H H K m n m UMK i: MẾIIMẾI VÀTẠI 1ỆI tì* g lĩ l Ĩ I E I HẢK

// Hàm thay đổ i LED theo biến trạng thái LED


void LED C hangeO

{
for(in t i=0;i< 12;i++ )

{
digita lW rite (i,B itS tate(i));

// Chương trình chính

void loopO

{
for(int i= 0 ;i< = size o f(C a l)/2 ;i+ + ) II Vòng lặp cho m ảng hiệu ứng

{
delay(500);

S tateL E D = C al[i]; // Thay đ ổ i trạng thái LED theo m ảng


LED C hangeQ ;

Hãy viế t chương trinh, biên dịch và tải xuống bo m ạch A rduino. Nếu
kết nối m ạch đ ú ng và m ạch hoạt động chinh xác thì bạn sẽ thấy các LED
sáng theo bảng hoạt động như đã trinh bày. Sau khi đến trạng thái cuố i thì
LED sẽ sáng lại trạng thái ban đầu củ a m àng.

Tìm h iể u m ã lệ n h

Bạn khai báo m ộ t biến S tateLE D để chứa các trạng thá i các LED
trong biến. C húng ta sẽ khởi tạo giá trị cho StateLED ở giá trị là 0:

unsigned int S tateL E D = 0B 0 000 00 000 00 00 000 ;


Và chú ng ta sẽ khai báo thêm m ảng chứa hiệu ứng của LED theo
cách hoạt động m à bạn đã định trước:

unsigned int C a l[]= {0 x8 6 1 ,0x492,0 x3 0 C ,0x492,0x861);


M ảng này là m ảng khai báo hiệu ứng định trước củ a bạn.

Bạn có thể tha y đổ i các hiệu ứng cho LED theo ý m uốn cù a m inh, và
có thể tạo ra b ấ t kỳ hiệu ứng nào theo ý thích của m inh mà khô ng cẩn quan
tâm đến các p h é p tinh sừ dụng trong các bài tập đó.

119
CHtftfw5: aiỂB »aế» ú TẠI I t l lw tt It l ĨKIMẨK U U M I f cw K tn T> »

Cần chú ý rằng, khai báo mảng như trên là khai báo mảng vào RAM
của bo mạch Arduino. Trong các bài tập sau chúng ta sẽ tao màng chứa trong
ROM. Vì RAM của bo mạch Arduino là có hạn, chúng ta chí nên sử dung RAM
để chứa giá trị các biến, còn các giá trị không đổi thi không nên chứa trong
RAM mà bạn nên chứa trong ROM.
ROM là bộ nhớ mă lệnh của bo mạch Arduino. Đối vói bo mạch
Arduino UNO bạn có 32KB ROM. RAM là bộ nhớ truy cập ngẫu nhiẽn cùa
bo mạch Arduino, đối với bo mạch Arduino UNO bạn có 2KB RAM Đối VÓI
các hiệu ứng gồm nhiều giá trị trạng thái với số LED điều khiển lớn thi RAM
của bo mạch là không đủ đáp ứng. Nên chúng ta sẽ chứa các hiêu ứng trong
mảng ỏ bộ nhớ ROM.
Bài tập này là ví dụ cơ bản của việc sáng LED theo màng và số trạng
thái hiệu ứng của LED sẽ ít nên chúng ta sẽ dùng RAM để chứa nàng,
Tiếp theo là chương trình khởi tạo của Arduino, trong chương trinh khói
tạo bạn sẽ thiết lập các chân nối với LED là các chân ngõ ra.
void setupO

(
for(int i=0;i<12;i++)

{
pinModefi,OUTPUT);

}
)
Hàm tiếp theo là hàm rút các bit từ biến trạng thái StateLED:
boolean Bitstate(char pos)

{
boolean xbit;
unsigned char xchar=-1;

if(pos<16) xchar=0x1 & StateLED>>pos;


xbit=xchar;
return xbit;

}
Tiếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLED:

200
AIDUINO BAHĨ CHO H6ƯƠI Tự HOC CHƯƠNG í : BIẾU (HIỂN VÀ TẠO MỆB tfwc ư LED THEO MẨNS

void LED C hangeO

{
fo r(in t i= 0;i< 12;i++ )

{
d igita lW rite (i,B itS tate(i));

)
C uối cù n g chú ng ta sẽ thực hiện chương trình chính để LED hoạt động
theo ý m uốn củ a mình.
void loopO

(
T rong chương trinh chính chúng ta sẽ tạo m ột vòn g lặp cho p h ép lặp
qua từng trạng th á i củ a m ảng hiệu ứng Cal và yêu cầu LED sáng theo các
hiệu ứng bên trong m ảng.

fo r(in t i= 0;i< = sizeo f(C al)/2;i+ + ) // Vòng lặp cho m ảng hiệu ứng

{
dela y(500 );

S tateL E D = C al[i]; // Thay đổ i trạng thái LED theo m ảng


LE D C hangeQ ;

}
Trong vòn g lặp trê n bạn thấy có hàm mới là hàm sizeof. Hàm này có
chức năng là lấy độ dài c ủ a m ảng theo byte. Già sử bạn khai báo m ột m ảng
unsigned cha r t[2 ]= {0 xf,0 xff} thì khi lấy sizeof của m ảng bạn sẽ có giá trị là 2.
Trong bà i tập này chúng ta khai báo m ảng Cal là kiểu unsigned int
nên số lượng byte trả về khi sử dụng hàm size of là gấp đôi. Bởi vì kiểu
unsigned cha r có độ dài là 8-bit và kiểu unsigned int có độ dài là 16-bit. Mà
giá trị sizeof trả về là số byte (8-bit) của m ột m ảng. Nên trong vòng lặp bạn sẽ
thấy chúng ta dùng hàm size of(C a l)/2 để ti'.', m ảng ch ú n g ta có bao nhiêu
phần tử.

Vòng lặp trên đơn giản chỉ cho chạ y tì' phần tử đầu tiên của m ảng đến
phần tử cuối cùng. Sau đó gán và o thanh ghi trạng thá i của LED và yêu cầu
LED sáng theo trạ n g thá i đó. Sau m ỗi trạng thái thl ch ú n g ta đợi 500 m iligiây
để thực hiện tiế p trạng th á i tiếp theo.

201
CHƯƯN6 5: eiẼỮ KHIẾH VÃ TẠO i t l int 12 IE B T E I H Ắ M u w 1« M K O m

BÀ I T Ậ P 2 : TẠ O NHIỀU H IỆU ỨNG SÁN G LED TH EO MẢNG CHỬA ti ROM


Trong bài tập trước bạn đã làm quen với cách tạo mảng hiệu ứng cho
LED. Bạn đã thực hiện một hiệu ứng đơn giản dựa vào màng trong RAM
Trong bài tập này chúng ta sẽ tạo thêm nhiều mảng hiệu ứng chứa trong
ROM thay vi chứa trong RAM như bài tập trước. Chúng ta sẽ tạo ra ba hiệu
ứng không có quy luật rõ ràng và sử dụng mảng để tạo ra các hiêu ứng này
Với từng hiệu ứng, chúng ta sẽ tách ra thành từng mảng riêng biệt. Khi thực
hiện hết một hiệu ứng thì sẽ thực hiện hiệu ứng tiếp theo. Đến khi thực hiện
hết hiệu ứng cuối bạn sẽ thực hiện lại hiệu ứng ban đầu.
Phẩn cứng
Bài tập này chúng ta tiếp tục sử dụng các đèn LED và các điện trỏ để
hạn dòng bảo vệ LED. Các bạn có thể sử dụng các đèn LED siêu sáng dể
làm nổi bật các bảng quảng cáo của bạn.
• LED các màu, bạn có thể dùng 12 LED siêu sáng.

Dùng 12 điện trở hạn dòng


BO M Ạ C H A R D U IN O LED
220 ohm.
Chân số 0 LED 0

C h â n số 1 LED 1

Kết nối phần cứng C h â n số 2 LED 2

Bạn hãy ngắt nguồn và C h ân số 3 LED 3


cáp USB của bo mạch Arduino sau
đó kết nối mạch như hình trang C h â n số 4 LED 4
bên. Bạn nối mạch như sau, các
C h â n số 5 LED 5
chân âm của LED nối với GND
cùa bo mạch Arduino thông qua C h â n số 6 LED 6
điện trở 220 ohm. Các chân dương
của LED nối lần lượt với các chân C hân số 7 LED 7
0 đến chân 11 của bo mạch
C hân số 8 LED 8
Arduino. Bảng kết nối chân cùa
LED với bo mạch Arduino trinh bày C h á n số 9 LED 9
ở hình bên.
C h â n s ố 10 LED 10
Hình trang bên là ảnh kết
nối mạch trân test board: C h àn sô' 11 led 11

202
IH IM I Ầ i C U W W l TQ ỌC CHƯƠNG ỉ : ĐIỂU KHIẾN VÁ ĨẠ 9 BỆU (Im g l ĩ l THEO M Ả K

m ask

203
CHƯƠNG 5 : ĐIỂU KHIỂN VÁ T ị t DIỆU Í I K 12 IE » THEO M À K U I * " ! '■ * * * ! Tf » t

Hoạt động cùa chương trình

1 LED u

LED LED LED LED LED LED LED LED LED th*p
LED LED LED
8 7 6 5 4 3 z 1 t l«c
Tpạng A 11 10 9
P h il
thái '

1 X X X X 861

2 X X X 492
*

3 X X X X 30C

4 X X X X 492

5 X X X X 861

6 0

7 X X X X X X E07

8 X X X X X * 70E

9 X X X X X X 39C

10 X X X X X X 1F8

11 X X X X OFO

12 X X 060

13 0

14 X X 060

15 X X X X 0F0

16 X X X X X X 1F8

17 X X X X X X 39C

18 X X X X X X 70E

19 X X X X X I E07

20 0

204
Ầ lM im DAW CIO W6tftfIT ỊỈIỌ C CBtftfNS S: ĐỂU KHIỂN ù TẠ I B Ệ I ifw tt Lĩ» TIEO HAW

Phấn m ềm

Chương trình cho bài tập này được viế t bên dưới. Chương trình sẽ thực
hiện sáng LED theo cá c hiệu ứng chứa trong m ảng định trước. C húng ta sẽ
tạo nhiều hiệu ứng tách biệt trong những m àng riêng b iệ t và các m ảng này sẽ
chứa trong ROM thay vì trong RAM như bài trước. Với ROM, chú ng ta có thể
chứa nhiều hiệu ứng hơn và bạn có thể thoải m ái tạo các hiệu ứng của riêng
minh bằng cách sử dụng nhiều m ảng hoặc m ột m ảng. Nhưng bạn nên tách
từng hiệu ứng thà nh các m ảng riêng b iệ t để dễ quản lý và sử dụng.

Chương trìn h nhiều hiệu ứng theo m ảng trong ROM:

// Nhiều hiệu úng theo m ảng trong ROM

// Khai báo thư viện cho p h ép tạo m ảng trong ROM

#include < avr/pgm sp ace .h >

// Biến trạng thái LED

unsigned int S tateL E D = 0B 0 000 00 000 00 00 000 ;

// M ảng chứa hiệu ứng LED trong ROM

PRO G M EM p ro g _ u in t1 6 _ t C a h []= {0 x8 6 1 ,0x492,0 x3 0 C ,0x492,0x861,0};

PRO G M EM p ro g _ u in t1 6 _ t
C al2[]={0xE 07 ,0x70 E ,0x39 C , 0x1 F8,0x0F0,0x060,0};

PROGM EM pro g _ u in t1 6 _ t
C al3[]={0x060,0x0F0,0x1 F 8,0x3 9C ,0x7 0E ,0xE 0 7,0};

// Chương trình khởi tạo

void setupQ

// Khởi tạo ngõ ra cho các chân nổ i LED

for(int i= 0;i< 12 ;i++ )

pinMode(i,OUTPUT);

// Hàm rú t các bit riê ng lẻ trong m ột biến

205
CHƯdNE 5: B1ẾD KHIẾU VÁ T Ạ I IIỆ a H N C 1? L t l T B E t M A X UIIW IfC M K W lT fy

boolean Bitstate(char pos)

boolean xbit;

unsigned char xchar=-1;

if (pos< 16) xchar=Ox1 & StateLED>>pos;

xbil=xchar;

return xbit;

// Hàm thay đổi LED theo biến trạng thái LED

void LEDChangeO

for(int i=0;i<12;i++)

digital Write(i,BitState(i));

// Chương trình chinh

void loopO

for(int i=0;i<=6;i++) // Cho LED sáng theo hiệu ứng 1

delay(500);

StateLED=pgm_read_word_near(Cal1+i); // Dọc giá trị mảng trong ROM


LEDChangeQ;

for(int i-0;i<=sizeof(Cal2)/2;i++)// Cho LED sáng theo hiệu ứng 2

206
AIHIMIAW CM XWl T>ỊệC CHƯÚNC ỉ : BiỂO KHIỂN n Ĩ Ạ I i Ệ I t u t t t LEI THEO MÀM8

delay(300);

S ta te L E D = pgm _ rea d_ w ord _ne ar(C al2 + i); // D ọc giá trị m ảng trong ROM

LE D C hange();

for(int i= 0 ;i< = size o f(C a l3 )/2 ;i+ + ) // Cho LED sáng theo hiệu ứng 3

delay(300);

S tateL E D = pgm _ rea d_ w ord _ne ar(C al3 + i); // Dọc giá trị m ảng trong ROM

LED ChangeO ;

Hãy viế t chương trình, biên dịch và tải xuống bo m ạch A rduino. Nếu
kết nối m ạch đúng và m ạch hoạt động chính xác thì bạn sẽ thấy các LED
sáng theo bảng hoạt động như yêu cầu. Sau khi đến hiệu ứng cu ố i thì chương
trình sẽ lặp lại hiệu ứng ban đầu.

Tìm h iể u mã lệ n h

Trong bài tập này bạn sẽ khai báo thêm thư viện ỏ đầu chương trinh,
chúng ta sẽ khai báo thê m các thư viện cho m ột chương trinh nếu trong
chương trinh có sử dụng thêm các thư viện mở rộng.

Đ ối với ngôn ngữ A rdu in o thì thư viện chính là m ột phần quan trọng
bậc nhất. Nhở cá c thư việ n m à bạn có thể giảm khối lượng công việ c và bạn
sẽ xử lý, tập trung nhiều hơn vào giải thu ật cho chương trình. Và các thư viên
của ngôn ngữ A rdu in o thì được hỗ trợ khá nhiều từ cộng đổng. T rong bài tâp
này chúng ta sử dụng thêm thư viện pgm space của vi điều khiển AVR.

Thư viện này là m ột thư việ n giúp bạn đưa giá trị nào đó vào vùn g nhớ
trên ROM. Và thư việ n sẽ hỗ trợ hàm để bạn lấy các giá trị đă chứa
trong ROM và sử dụ ng . C húng ta khai báo thêm thư viện pgm space như cú
pháp dưới:

#include < avr/pgm space.h>

Bạn khai báo m ôt biến S tateLE D để chứa các trạng thái các LED
trong biến. C húng ta sẽ khỏi tạo giá trị cho S tateLE D ỏ giá trị là 0:

Ỉ0 7
CHƯƠNG 5 : 6IẾU KHIẾH VA TẠO 8 IỆH Ứ M » LED T U ta H Ả K Ấ m n m g iH iT H t

unsigned int StateLED=OBOOOOOOOOOOOOOOOO;

Và chúng ta sẽ khai báo thêm 3 mảng chứa hiệu ứng của LED lẩn lượt
có tên là C a ll, Cal2 và Cal3:

PROGMEM prog_uint16_t

C all []={0x861,0x492,0x300,0x492,0x861,0};

PROGMEM prog_uint16_l

Cal2[]={0xE07,0x70E,0x39C,0x1 F8,0x0F0,0x060.0):

PROGMEM prog_uint16_t

Cal3[]={Ox060,OxOFO,Ox1F8,Ox39C,Ox70E,OxE07,0}:

Trong thư viện pgmspace thì các kiểu biến sẽ được đổi thành các tên
khác thay vì các tên unsigned char, unsigned int, int, float,...

Bảng dưới liệt kê các kiểu biến dùng cho khai báo thư viện:

K h a i b á o k h i sử d ụ n g đ ể tạ o
P hạm v i của kha i báo
g iá t r ị tr o n g ROM (d a ta ty p e )
'
p ro g _ ch a r c h a r (1 byte) -127 to 128

p ro g _ u ch a r u n sig ned c h a r (1 byte) 0 to 255

p ro g _ in t1 6 _ t in t (2 byte s) -3 2 ,7 6 7 to 32,768

p ro g _ u in t1 6 _ t u n sig n e d int (2 bytes) 0 to 65,535

long (4 byte s) -2 ,1 4 7 ,4 8 3 ,6 4 8 to
p ro g _ in t3 2 _ t
2 ,1 4 7 ,4 8 3 ,6 4 7 .

u n sig n e d long (4 byte s) 0 to


p ro g _ u in t3 2 _ t
4 ,2 9 4 ,9 6 7 ,2 9 5

Cú pháp bạn khai báo một giá trị lưu trong ROM như sau:

dataType variableName[] PROGMEM = {};

hoăc:

PROGMEM dataType variableNameỊ] = {);


A IW IM DANH H O H6ƠƠI ĩ f MỌC CHƯƠNG 5: BIỂU KHIỂN VÀ TẠI UÊI if w t t L ĩ l T Ĩ Ĩ I H ẢH t

C h ún g ta sẽ có khai báo các m ảng hiệu ứng tương tự như với bài trước
tuy nhiên bạn sẽ sử dụng cú pháp khác và kiểu dữ liệu khác (datatype).

Sau đó, thư viện sẽ thực hiện công việ c đưa các giá trị này vào ROM,
để sử dụng các giá trị này bạn sẽ dùng hàm các hàm đọc do thư việ n
cung cấp.

Bạn có thể kham khảo thêm về thư viện tại trang web:

http://arduino.ee/en/Relenence/PRDGIVIEIVI

http://www.nongnu.opg/avp-libc/usep-manual/gpoup avp pgmspace.html

T iế p theo là chương trình khởi tạo của Arduino, trong chương trình khỏi
tạo bạn sẽ th iế t lập các chân nối với LED là các chân ngõ ra:

void setupO

fo r(in t i=0;i< 12;i++ )

p in M o d e (i,O UTPUT);

Hàm tiếp theo là hàm rút các bit từ biến trạng thái StateLE D :

boolean B its ta te (c h a r pos)

boolean xbit;

unsigned cha r x c h a r= -1 ;

if (pose 16) xchar=0x1 & S tateLE D > >pos;

xbit= xchar;

return xbit;

209
CBựưHS 5:6IẼB IBẾII VÀ TẠI 1(1 tut 12lf l Ĩ I I lẵẮK

Tiếp theo sẽ là hàm thay đổi giá trị cho LED theo các bit chứa trong
biến StateLED:

void LEDChangeQ

for(int i=0;i<12;i++)

digitalWrite(i,BitState(i));

Cuối cùng chúng ta sẽ thực hiện chương trình chính để LED hoạt động
theo ý muốn của minh:

void loopO

Trong chương trình chính, chúng ta sẽ tạo một vòng lặp cho phép lâp
qua từng trạng thái của mảng hiệu ứng C all để biểu diễn hiệu ứng thứ nhất.

Trong vòng lặp hiệu ứng, bạn có thể sử dụng số phần từ cùa mảng
(số trạng thái LED của hiệu ứng) thay vi sử dụng hàm sizeof như trong chương
trình trước.

Và trong bài tập này cũng có thêm hàm pgm_read_word_near để dọc


giá trị của mảng nào đó đã chứa trong ROM:

for(int i=0;i<=6;i++) // Cho LED sáng Iheo hiệu ứng 1

delay(500);

StateLED=pgm_read_word_near(Cal1+i); // Dọc giả trị mảng


trong ROM

LEDChangeQ;

210
CHƯƠNG S: ĐIẾU IHIẾN VÀ TẠI 1ÊI I m t t l £ l TIEO H Ả m

T rong vòng lặp trê n chú ng ta đọc giá trị các m ảng chứa trong ROM
bằng hàm p g m _ re ad_ w o rd_n ea r(add ress) được cung cấp bởi thư viện.

Hàm này sẽ giú p bạn đọc các giá trị có độ dài 16-bit từ m ộ t địa chỉ
trong ROM. Đ ịa ch ỉ này là số 16-bit. N goài ra bạn có các hàm đọc giá trị m ảng
từ rom như sau:

• p g m _re ad_ byte_ ne ar(ad dre ss_sho rt)

• p g m _re ad_ w o rd_n ea r(add ress_ short)

• pg m _re ad_ dw ord_ ne ar(ad dre ss_sho rt)

• p g m _re ad_ floa t_ ne ar(ad dre ss_sho rt)

• p g m _ re a d _ b yte _ fa r(a d d re ssJo n g )

• p g m _re ad_ w o rd_fa r(a dd ress_lon g)

• p g m _re ad_ dw ord_ far(ad dress_ lo ng)

• p g m _ re a d _ flo a t_ fa r(a d d re ssJo n g )

• pg m _re ad_ byte(a dd ress_sh ort)

• p g m _re ad_ w o rd(ad dre ss_sho rt)

• p g m _ re ad_ dw ord(a dd ress_sh ort)

• pg m _re ad_ floa t(a dd ress_sh ort)

Với: ad d ress_sh ort là s ố 16-bit

ad dress_long là số 32-bit

C ác hàm trê n sẽ đọ c các kiểu dữ liệu tương ứng. G iả sử bạn m uốn


đọc m ột giá trị kiểu int thì bạn có thể dùng pg m _re ad_ w o rd
pg m _read_w ord_near hoặc pg m _read_w ord_far. V à địa ch ỉ này là tên biến
cộng với phần tử bạn m uốn lấy.

G iả sử bạn m uốn lấ y phần tử thứ 2 của m ảng A kiểu cha r thì bạn sẽ
viết câu lệnh như sau:

pg m _re ad_ byte(A + 2);

T iế p theo là thực hiện các hiệu ứng còn lại trong các m ảng hiệu ứng
tiếp theo:

211
CatftfNG5: EẼq mếll VÀ TẠI 1*1 ếw » lĩ» Ĩ E I n in iw w ia i« iH ặ

for(int i=0;i<=sizeof(Cal2)/2;i++)// Cho LED sáng theo hiệu ứng 2

delay (300);

StateLED=pgm_reacLword_near(Cal2+i); // Dọc giá trị màng


trong ROM

LEDChangeQ;

for(int i=0;i<=sizeof(Cal3)/2;i++) // Cho LED sáng theo hiệu ứng 3

delay(300);

StateLED=pgm_read_word_near(Cal3+i); // Dọc giá trị màng


trong ROM

LEDChangeO;

Sau khi đã lập trình xong bài này, bạn đã có một kiến thức cán thiết
để tự minh tạo ra một bảng quảng cáo LED đơn giản hoặc điều khiển LED
một cách tự do theo ý muốn riêng của bạn bằng bo mạch Arduino.

Chúng ta sẽ kết thúc phần điểu khiển LED đơn bằng một bài tổng hợp
các hiệu ứng mà bạn đã học. Các hiệu ứng của bài này sẽ hoạt động liên lục
Khi có nút nhấn đổi hiệu ứng thì lập tức cho chương trình thay đổi hiẽu ứng
của LED đơn.

Các hiệu ứng cũa bài này là tổng hợp các hiệu ứng của các bài trước
Nhưng trong bài trưâc, bạn thực hiện chuyển đổi các hiệu ứng một cách
tự động.

Còn trong bài này, chúng ta sẽ thực hiện thay đổi hiêu ủng theo SƯ

điều khiển của người dùng.

212
UMIMIAM CH K í í l Tặ IOC HtfdNCS: SẾIIIỂI VÀTẬIBỆItKBinĩlĩlMẢK

BÀI TẬP 3: CHUYỂN HIỆU ỪNG SÁNG LED BẰNG NÚT NHÂN
Phán cứng
C h ún g ta tiế p tụ c sử dụng các đèn LED (12 LED ) và các điện trở (12
điện trà) để hạn dòng bảo vệ LED , điểm mới ở đây làm ạch điện cỏ thêm m ột
nút nhấn để ch u yể n hiệu ứng cho m ạch. C ác bạn có thể sửdụng các đèn
LED siêu sáng để làm nổi bật các bảng quảng cáo.

• LED các m àu, bạn có thể dùng 12 LED.

• D ùng 12 điện trỏ hạn dòng 220 ohm.

• Đ iện trở kéo xuố ng 10K ohm

• N út nhấn

Kết nối phần cứng

H ãy ng ắt ng uồ n và cá p USB của bo m ạch A rduino sau đó kế t nối


mạch như hình dưđi. Bạn nối m ạch như sau, các chân âm củ a LED nối với
GND của bo m ạch A rd u in o thô ng qua điện trở 220 ohm.

C ác châ n dương của LED nối lần lượt với các chân 0 đến chân 11 của
bo m ạch A rduino.

Trong bà i tập nà y bạn dùng thêm m ột điện trở 10K ohm để làm điện
trở kéo xuống cho nút nhấn. Đ iện trở này có nhiệm vụ giúp cho ngõ vào nút
nhấn không ở trạng thái lơ lửng, nếu ở trạng thái này m ạch sẽ bị nhiễu và ngõ
vào chú ng ta dọc được sẽ có lúc là mức tháp hoặc có lúc là mức cao dẫn đến
chương trinh ch ú n g ta ho ạt động sai.

211
CHƯƠNG 5 : BIẾO KHIẾU V Ả T Ạ I I I Ệ I Ĩ H t 12 L ĩ l TMEO HẢIK M W IM C W IH H l

Vì vậy bạn sẽ nối một đầu cùa nút nhấn với điện áp 5V cùa bo mạch
Arduino và một đầu nối vđi điện trỏ nối xuống GND bo mạch.

Điểm kết nối của điện trở và nút nhấn sẽ nối với chân sỗ 12 cùa bo
mạch Arduino.

Bảng dưới là kết nối chân của LED với bo mạch Arduino.

BO M Ạ C H A R D U IN O LE D

C h ân số 0 LED 0

C h ân số 1 LED 1

C h ân số 2 LED 2

C h ân số 3 LED 3

C h ân số 4 LED 4

C h ân số 5 LED 5

C h ân số 6 LED 6

C h ân số 7 LED 7

C h ân số 8 LED 8

Chân số 9 LED 9

C h â n số 10 LED 10

C h â n số 11 LED 11

C h ân số 12 N ú t nhấn

Hinh trang bẽn là kết nối mạch trên test board và trên Protets

214
ỈNỴN H U 131 a INI m OVI ụ %ỹii opis :s SN0J1HJ 9 ỈI m I0H9M i n M V IM IN IV
CHƯƠHC5: BIẼB iHIẾH VÃ TẠI I f I l u 1?LEDTBI MẢI* H U W IU M 3 I * W l I f »

216
A IM IW I m t i l u ttftfl T f BỌC CHƯƠNG S: BIỂD KHIỂN VÀ Ĩ Ạ I 1ỂI I w t t LEI TBEB M Ả M

SB
>» JZ
M» tSL

«7 £
i
G3
ÈS
E u
K
r^.
UJ
a
32 a
•JOB

CD
tx
§
LED!

N
M! M X
UJ
Ml


m X X M
a

Vca
*«r
a IK w Ml h"
UJ •Wc
**«J h» ỳmm H"
-23 ẵ
M ’e y
10
H*
=5 X M XJ *5 -«* s
BO as as c
§ SE ae
Ck.
*t=5 uu SC
GO fitC MS
X M M
l*J
ae
LED 8 LED 7

w « ĨX

M X X
LED 9

M *X!

a
LU *2
_ M S''*'
LED
11

***•

§
•M
£+1

LO
9+1

_ - +
M +
fttf + *4*fl
/
/ m
tv M
/ a- s
CHtftfNG 5 : B IẼ P IH IỂ K VÀ TẠO I Ệ I ẩ m K LEB H I H Ả I * lẮ M H M I t f »

Phần mềm
Chương trình cho bài tập này được viết bẽn dưới có nhiém vụ thực
hiện chức năng tạo nhiều hiệu ứng cho LED theo sự điều khiển lừ nút nhán
Bài tập này tổng hợp 5 hiệu ứng từ các bài trước và kết hợp giữa cách điéu
khiển LED có quy luật và điều khiển LED theo mảng được chứa trong ROM
Chương trìn h chuyển hiệu ứng LED bằng nút nhấn
// Chuyển hiệu ứng led bàng nút nhấn

II Khai báo thư viện cho phép tạo mảng trong ROM
#include <avr/pgmspace.h>

// Khai báo nút nhấn sử dụng ở chân 12 của bo mạch Arduino


#define Button 12

// Số hiệu ứng sử dụng


#define MaxEffect 5

// Biến trạng thái LED


unsigned int StateLED=OBOOOOOOOOOOOOOOOO;

// Mảng chứa hiệu ứng LED trong ROM


PROGMEM prog_uint16_t C a ll[]={0x861,0x492,0x30C,0x492,0x861.0);
PROGMEM prog_uint16_t
Cal2[]={0xE07, Ox7C>E,Ox39C, 0x1 F8,OxOFO, 0x060,0);
PROGMEM prog_uint16_t
Cal3[]={0x060,0x0F0,0x1F8,0x39C,0x70E,0xE07,0);
// Biến tạm tạo hiệu ứng theo quy luật
unsigned int Cal4,Cal5;

// Biến điều khiển hiệu ứng


unsigned char EffectNum;

// Chương trình khởi tạo


void setupO
(

// Khởi tạo ngõ ra cho các chân nối LED


for(int i=0;i<12;i++)
{
pinMode(i,OUTPUT);

218
MUM l Ầ i t n K M iĩặ H t C«fK S: lế l Mẩl VẰTẠI BỆI i t ư Itl TKI HẨNt

// Khai báo cá c chân ngõ vào


pinM ode (Button, IN PUT);

}
// Hàm rú t các bit riêng lẻ trong m ột biến
boolean B itS ta te (ch a r pos)

{
boolean xbit;
unsigned cha r xchar=-1;
if (po s<16) xchar=0x1 & S tateLE D > >pos;
xbit=xchar;
return xbit;

// Hàm kiềm tra n ú t nhấn


void C h angeE ffect()

í
if (digita lR e ad(B u tto n)= = 1 ) // K hi nhấn nút

[
w h ile (digitalR ea d(B u tton )); // Sẽ trong vòng lập vô tận nếu chưa thả nút

II Sau khi thả n ú t thực hiện các lệnh dưới


StateLED=OxO;
E ffectN um ++;
if (E ffe ctN um = = M a xE ffe ct) EffectN um =0;

// Hàm tạo thời gian đợ i và kiểm tra phim cùng lúc


void D e la yC he ckK ey(u nsig ne d int tim e)
{
for(int t=0; t< tim e ;t+ + )

{
delay(1);
C h a n g e E ffe ct(); // Kiểm tra nút nhấn

21!
CHƯƠNC S: BIỂO KH1ẾH u TẠO l Ẹ l ỬH6 ự l i l T H E I M Ấ «

// Hàm thay đổi LED theo biến trạng thái LED


void LEDChangeO
{
for(int i=0;i<12;i++)
{
digitalWrite(i,BitState(i));
}

// Chương trình chinh


void loopO
{
switch(EffectNum)
{
case 0: // Hiệu ứng 1
for(int i=0;i<=6;i++)
{
DelayCheckKey(500);
StateLED=pgm_read_word_near(Cal1+i);
LEDChangeO;
ChangeEffect();
if(EffectNum!=0) break; // Kiểm tra nếu nút có nhấn
// thì thoát hiệu ứng đề thực
// hiện hiệu ứng khác
}
break;

case 1: // Hiệu ứng 2


for(int i=0;i<=sizeof(Cal2)/2;i++)
{
DelayC neckKey(300);
StateLĩD =pgm _read_word_near(Cal2+i);

220
AIHUHIAM CH KrtlTf mc CHƯƠNG 5: BIỂU KHIỂN VÀ TẠB BIÊU ĨÍHC ư l£B THEO MÀN6

LE D C hangeO ;
C han geE ffect();
if(E ffe ctN um != 1 ) break;

}
break;

case 2: // Hiệu ứng 3


for(in t i= 0;i< = sizeo f(C al3 )/2 ;i+ + )

{
D elayC he ckK ey(3 00);
S tateL E D = pgm _ rea d_ w ord _ne ar(C al3 + i);
LED C hangeO ;
C hangeE ffect();
if(E ffe ctN um !=2 ) break;

}
break;
case 3: // H iệu ứng 4
D elayC he ckK ey(2 00);
S tateL E D = ~ S tateL E D ;
LE D C hange();
if(E ffe ctN um != 3 ) break;
break;

case 4: // H iệu ứng 5


Cal5=0;
C al4=0x1000;
for(int i= 12 ;i> 0 ;i--)

{
for(int j= 0 ;j< i;j+ + )

{
D elayC heckK ey(IO O );
C a l4 = C a l4 » 1 ;
S tateL E D = C al4IC a l5;

221
CHƯƠHB 5: CIẼD laẾN VÃ TẠI l f l fw 1? Lĩl IIIH Ầ M u iw iiu ia i« W ĩ(ặ

LEDChangeO;
if(EffectNum!=4) break;
}
if(EffectNum!=4) break;
Cal4=0x1000;
C a l5 = C a l5 « 1 11;
}
if(EffectNum!=4) break;
DelayCheckKey(IOO);
Cal5=0;
Cal4=0x1;
for(int i=11 ;i>0;i~)
{
for(int j=0;j<i;j++)
{
DelayCheckKey(IOO);
Cal4=Cal4<<1;

StateLED=-(Cal4ICal5);
LEDChangeQ;
if(EffectNum!=4) break;
}
if(EffectNum!=4) break;
Cal4=0x1;
C a l5 = C a l5 » 1 10X800;
}
DelayCheckKey(100);
)
)
Hãy viết chương trình, biên dịch và tải xuống bo mạch A rd L .n o . Nếu
kết nối mạch đúng và mạch hoạt động chính xác thì đầu tiên chưong trinh sẽ
cho thực hiện hiệu ứng không quy luật. Sau khi bạn nhấn nút thi cnưong trinh
cho phép đổi hiệu ứng và khi đổi hết 5 hiệu ứng thi chương trinh sẽ t-iưc hién
lại hiệu ứng đầu.

222
! AIHimiẤM Cll M ĩtừ l TỊ( l(ỊC CHƠ0N6 5: BIẾU KHIẾN VÀ TẠI B Ệ I IÍNC K IE B THEO M Ầ M

Tim hiểu mã lệnh


Khai báo thư v iệ n mở rộng pgm space để thực hiện chu yển m ảng vào
bộ nhớ ROM cho chương trình:
#include <avr/pgm space.h>
Khai báo châ n c ủ a bo m ạch A rduino nối với nút nhấn và số hiệu ứng
bạn m uốn thực hiện, s ố hiệu ứng này phải chính xác theo số lượng hiệu ứng
tạo ra trong chương trình chính nếu không sẽ có những giá trị điều khiển hiệu
ứng bị dư, dẫn đến LED tắt hoàn toàn và bạn sẽ không thấy hiệu ứng nào:
#define Button 12
#define M axE ffect 5
Bạn khai báo m ột biến S tateLE D để chứa các trạng thái các LED
trong biến. C h ún g ta sẽ khỏi tạo giá trị cho StateLED ở giá trị là 0:
unsigned int S tateLE D = 0B 0 000 00 000 00 00 000 ;
Và ch ú n g ta sẽ khai báo thêm 3 m ảng chứa hiệu ứng không có quy
luật của LED lần lượt có tên là C a ll, Cal2 và Cal3:

P R O G M E M prog_uint16_t
C a ll []= {0 x8 6 1 ,0 x4 9 2 ,0 x3 0 C ,0 x4 9 2 ,0 x8 6 1 ,0);

P R O G M E M pro g_ uin t1 6_ t
C a l2[]= {0xE 07 ,0x70 E ,0x39 C , 0x1 F 8,0x0F 0,0x060,0};

P R O G M E M prog_uint16_t
CaiatHOxOeO.OxOFO.Ox-IFS.OxSgC.OxTOE.OxEOr.O};

Sau đó bạn tạo các biế n để thực hiện các hiệu ứng có quy lu ật với tên
là Cal4 và Cal5:
unsigned int C al4,C al5;
T iếp theo là chương trình khởi tạo cùa Arduino, trong chương trình khởi
tạo bạn sẽ th iế t lập các châ n nối với LED là các chân ngõ ra và chân ngõ vào
cho nút nhấn:
void setupO

(
fo r(in t i= 0;i< 12 ;i++ )

{
pinM o defi,O U T P U T );

}
pinM o de(B u tto n,IN P U T );

223
CHƯƠNG 5 : BIẾU M IẾ N ú T Ạ I I I Ệ I Ư N C 12 l£ B T H E I M Ẩ M

Hàm tiếp theo là hàm rút các bit từ biến trạng thái StateLED:
boolean Bitstate(char pos)

{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=Ox1 & S ta te L E D » p o s;
xbit=xchar;
return xbit;
}
Trong bài tập này bạn sẽ có thêm hai hàm mói. Đó là nàm Kiểm tra
nút nhấn ChangeEffect và hàm tạo thời gian đợi và kiểm tra nút nnấn cung luc
DelayCheckKey. Chúng ta bắt đầu với hàm kiểm tra nút nhấn trước:
void ChangeEffectQ
t
if (digitalRead(Button)==1) // Khi nhấn nút
{
Cấu trúc if kiểm tra xem nút nhấn có được nhấn hay khõng nếu có
thực hiện khối lệnh:
while(digitalRead(Button)); // Sẽ trong vòng lập võ tận nếu chưa
thả nút
// Sau khi thả nút thực hiện các lệnh dưới
StateLED=OxO;
EffectNum++;
if (EffectNum==MaxEffect) EffectNum=0;
Vòng lặp while có nhiệm vụ sẽ không cho thực hiện chương trinh gi khi
nút nhấn đang được giữ lại mà chưa được nhả ra. Khi nhả ra thi sẽ Khòi tạo lai
biến StateLED, đổi hiệu ứng và kiểm tra xem đã đến hiệu ứng cuối chưa. Nếu
đã đến hiệu ứng cuối thì thay đổi biến EffectNum để trở lại hiệu ứng ban đáu
Tiếp theo là hàm tạo thời gian đợi và kiểm tra nút nhấn. Nguyên lý lam
việc hàm này khá đơn giản, chúng ta tạo một vòng lặp để tạo thòi gian lâp
tương ứng với hàm delay nhưng cùng lúc đó chúng ta vẫn kiểm tra nó: nhấn
có được nhấn hay không. Hàm này có nhiệm vụ là liên tục kiểm tra nhấn
giúp chương trình không bị bỏ sót một lần nhấn nút nào. Nếu ban :-ưc hién
hàm delay như binh thường thì chương trinh của bạn có thể bị bò sót ~1Ó‘ vãi
lần nhấn nút từ người dùng. Hàm DelayCheckKey như sau:
void DelayCheckKey(unsigned int time)

224
MDUINO PAWH eng H6ƯƠI Tự HOC CHƯƠNG 5: ĐIẾU KHIỂN VA TẠO BIÊU ƯW6 ư IE I HEO MẤN6

{
for(int t=0; t<tim e;t+ +)

(
delay( 1);
C han geE ffect(); // Kiểm tra nút nhấn
}
}
T iếp theo sẽ là hàm thay đổi giá trị cho LED theo cá c bit chứa trong
biến StateLED :
void LED C hangeO

{
fo r(in t i= 0;i< 12;i++ )

(
d ig ita lW rite (i,B itS ta te (i));

}
}
C uối cùn g chú ng ta sẽ thực hiện chương trình chính để LED hoạt động
theo ý m uốn củ a mình:
void loop()

{
Trong chương trình chính chú ng ta sẽ thực hiện cấu trúc switch...case
để chọn hiệu ứng điều khiển theo biến E ffectN um . Và giá trị của EffectN um
sẽ ứng với từng hiệu ứng riêng biệt, c ấ u trúc switch...case trong ngôn ngữ
Arduino như sau:
sw itch (b iế n _ so _ sá n h )

{
case g iá _ trị_ s o _ s á n h _ 1 :
// M ã lệnh
break;

case giá _ trị_ so _ sá n h _ 2 :

// Mã lệnh
break;

case g iá _ trị_so_ sán h_ N :

225
CMƯƯHG 5 : 6 IẼ 8 IH 1 Ế N VẦ T Ạ I I t l m 1? L H T E I M km

// Mã lệnh
break;
}
Và cấu trúc này có nhiệm vụ so sánh các giá trị so sánh vói biến Sũ
sánh để rẽ nhánh cho chương trình. Và mỗi giá trị so sánh ban có thể thực
hiện cùng một khối mã lệnh. Nhưng chú ý rằng, khi kết thúc môt khối mã lệnh
th) bạn phải thêm lệnh break để thoát khỏi cấu trúc. Nếu không có lênh break
thl chương trình sẽ rẽ nhánh vào khối lệnh có giá trị so sánh bang vói biến vá
sau đó thực hiện các khối lệnh còn lại đến khi hết cấu trúc swi:ch_case Vi
vậy bạn hãy chú ý điều này.
Trở lại với chương trình, bạn có thể thấy, chúng ta thực hiện rẽ nhánh
cho hiệu ứng 1 khi biến EffectNum có giá trị là 0:
switch(EffectNum)
{
case 0: // Hiệu ứng 1
for(int i=0;i<=6;i++)
{
DelayCheckKey(500);
StateLED=pgm_read_word_near(Cal1+i);
LEDChangeO;
ChangeEffect();
if(EffectNum!=0) break; // Kiểm tra nếu nút có nhấn
// thì thoát hiệu ứng đề thực
II hiện hiệu ứng khác
}
break;

ở đây chúng ta sẽ thực hiện hiệu ứng 1 với hàm delay quen thuòc cùa
bo mạch Arduino đã chuyển thành DelayCheckKey để chúng ta thưc hiên viéc
đợi nhưng vẫn kiểm tra nút nhấn song song. Và trong khối lệnh này có thém
dòng lệnh:

if(EffectNum!=0) break;

Chúng ta thực hiện dòng lệnh này để đảm bảo rằng khi nhấn nút thi
lập tức sẽ đổi hiệu ứng. Nếu không có dòng lệnh này thi chương trinh sẽ chay
hết hiệu ứng hiện tại rồi mới tiến hành đổi hiệu ứng.

Tiếp theo là các cấu trúc rẽ nhánh cho các hiệu ứng:

226
I AimiM 8AM CM WWl If ipc CHƯƠNG 5: ĐtẺO IHIẾH VẢ ÌẠ » 1 Ệ Ì t u t t t IE I TBEa MẢNC

case 1: // Hiệu ứng 2


fo r(in t i= 0;i< = sizeo f(C al2 )/2 ;i+ + )

{
D e layC he ckK ey(3 00);
S ta te L E D = pgm _ rea d_ w ord _ne ar(C al2 + i);
LE D C h ang e();
C h an geE ffect();
if(E ffe ctN um != 1 ) break;

)
break;
case 2: // H iệu ứng 3
fo r(in t i= 0;i< = sizeo f(C al3 )/2 ;i+ + )
{
D elayC he ckK ey(3 00);
S ta teL E D = pgm _ rea d_ w ord _ne ar(C al3 + i);
LE D C h ang e();
C h an geE ffect();
if(E ffe ctN um != 2 ) break;

}
break;
case 3: // H iệu ứng 4
D e layC he ckK ey(2 00);
S tateL E D = ~ S tateL E D ;
L E D C hange();
if(E ffe ctN um != 3 ) break;
break;

case 4: // H iệu úng 5


C al5=0;
C a l4= 0x1000;
fo r(in t i= 12 ;i>0 ;i--)

{
for(in t j= 0;j< i;j+ + )

227
CHƯữNG 5 : ĐIẾU IHIỂNV Ả TẠI j g j t u t 12 LED T E I I I A w

DelayCheckKey(100);
C a l4 = C a l4 » l:
StateLED=Cal4ICal5;
LEDChangeO;
if(EffectNum!=4) break;

)
if(EffectNum!=4) break;
Cal4=0x1000;
C a l5 = C a l5 « 1 l1 ;
)
if(EffectNum!=4) break;
DelayCheckKey(100);
Cal5=0;
Cal4=0x1;
for(int i=11 ;i> 0;i-)
{
for(int j=0;j<i;j++)
{
DelayCheckKey(IOO);
C a l4 = C a l4 « 1 ;
StateLED=-(Cal4ICal5);
LEDChangeQ;
if(EffectNum!=4) break;
}
if(EffectNum!=4) break;
Cal4=0x1;
C a l5 = C a l5 » 1 10X800;
)
DelayCheckKey(100);
)
Các hiệu ứng này là các hiệu ứng quen thuộc bạn đã từng thực hiér'
hiện ở các bài trước. Bạn kham khảo lại ỏ các bài tập trước và trong từng khỉ
lệnh cũng có một số thay đổi về kiểm tra nút nhấn và thoát hiéL ứng đề phL
hợp với chương trình của chúng ta.

228
I ABŨBIHO BAMB cao NCƯỨI Tự BỌC CHƯƠNG 6: QOẢNG CAO v đ l LED H A TBẶN

CH M G 6

QUẢNG GÂO VOl LED MA TRẬN


Sau khi bạn đã hoàn tấ t xong phần tạo các bảng hiệu bằng các LED
đơn thì chú ng ta sẽ tiếp tục thực hành m ột chủ đề khác cũn g được sử dụng
khá nhiều trong đời sống củ a ch ú n g ta. Đó là LED ma trận (Dot M atrix LED ) là
tập hợp nhiều đèn LED được bố trí thành dạng “m a trậ n ” hình chữ nhật hoặc
vuông với số hàng là a và số cộ t là b. Đ ể giảm số lượng các đường điểu
khiển, trong các ma trận LED các LED được nối chung với nhau theo hàng và
cột. Số lượng LED trên ma trậ n LED là axb trong khi số lượng ngõ ra bằng
tổng số hàng và cột: a + b. V iệ c điều khiển 1 ma trận LED kích thước lớn đòi
hỏi thiết kế m ột m ạch driver và diều khiển rất phức tạp. Phần trinh bà y sau
giới thiệu ma trận LED có kích thước 7x5 (7 hàng, 5 cột). M a trận LED 7x5
thường được dùng để hiển thị cá c ký tự trong bảng mã A SC II thay cho T ext
LCD Tuy nhiên, bạn có thể g h ép các ma trận LED này lại để hiển thị cá c loại
hlnh ảnh bất kỳ có độ phân giải thấp.

Hình bên mô tả
một cấu trúc của m ột ma
trận 7x5 với 12 ngõ ra
được đặt tên từ C1...C5
và D1...D7 (C đại diện
cho Control line và D là
Data line). Bên trong các
ô của ma trận LED là các
LED phát sáng. Trong
mô hình, cathode (cực
âm) của các LED trên
mỗi cột được nối chung
với nhau và ngõ ra chung
là các ngõ D (Data).

C ác Anod của cá c LED trên m ỗi hàng được nối chung tạo thành các
đường D (Data). T hôn g thường, các đường D và c được chọn sao số số lượng
đường D nhiều hơn đường c hoặc sao cho số lương các đường D gần nh ất với
số 8, 16, 3 2 ..(lũy thừa của 2). Lý do củ a v iệ c chọn này nhằm giảm kích thước
bộ font chứa các ký tự hoặc hình ảnh hiển thị lên ma trận LED, bạn sẽ hiểu rõ
hơn khi t)m hiểu các điều khiển ma trận LED 7x5 bên dưới.
Hình trang bên m ô tả cách m a trận LED 7x5 được dùng để hiển thị
số 4.

229
CEtftfNGI: QBẢNC CÁI vfl LEI HAĨIẬI

Trước hết chúng ta sẽ khảo sa!


cách sáng các LED 'nà không cán
quan tâm đến bảng font. Quan sát CÍ1
thứ nhất (cột CO) trong hình 2a, trong
cột này chì có 2 LED 0 nàng D2 và D3
là sáng, các LED còn lai tắt. Điéu náy
được thực hiện bằng cách kich chỉn
CO (anod) lên mức cao. kéo các chỉn
D2, D3 xuống mức 0 trong khi các chân
Data khác được giữ ở mức cao.

Các cột khác được thực hiện tương tự, nhưng làm sao hiển thị các CÕI
VỚI các đèn LED sáng khác nhau trong khi các ngõ Cathode cùa chúng đéu
được nối chung (thành các chân D). Ví dụ, khi kéo tất cả 5 chân C0_C4 lên
mức cao và xuất tín hiệu ra các chân D, khi đó tất cả các LED trẽn dùng môt
hàng sẽ sáng hoặc tắt như nhau. “Bí quyết” ở đây chính là kỹ thuật "quét'
chúng ta sẽ hiển thị tuần tự các cột với các giá trị tương ứng của chúng chứ
không hiển thị đồng thời. Trong ví dụ hiển thị số ‘4’, trước hết hãy kích chân
CO lên cao trong khi các chân C1 ...C4 ở mức thấp, xuất tín hiẽu ra các chân D
để hiển thị lên cột c o . Tiếp theo kéo chân C1 lên cao và các chân Control
khác ỏ mức thấp, xuất dữ liệu ra các chân D để hiển thị cột C1-CỨ như thế
cho đến khi hiển thị hết các cột thì quay lại cột c o . Quá trình này gọi là "qué!
LED” . Do tốc độ “quét” rất cao nên chúng ta sẽ không có cảm giác “nháp
nháy” , các cột của ma trận như được hiển thị đổng thời. Chú ý là độ sáng cùa
LED phụ thuộc vào số cột LED, nếu bạn “quét” quá nhiều cột LED, tl lệ thời
gian “ON" của mỗi cột sẽ rất nhò so với thời gian “OFF" vì phải chò quét các
cột khác. Vi thế nếu ma trận LED có nhiều cột hoặc khi ghép nhiếu ma trân
các mạch driver cần được sử dụng để đảm bảo độ sáng của LED.
Già sử mỗi LED đại diện cho 1 bit và các LED sáng đại diện cho giá tri
nhị phân 1 trong khi các LED tắt là số 0. Hlnh 2b thể hiện mô hình số nhị phỉn
cho trường hợp hiển thị số 4 trên ma trận LED 7x5. Nếu xem mỗi cột cùa ma
trận là 1 con số 7 bit thi 5 giá trị cần thiết để hiển thị số ‘4’ là: OxOC, 0x14
0x24, 0x7F, 0x04. Bộ 5 giá trị này tạo thành mã font cho ký tự '4'. chúng sẽ
được định nghĩa trước và lưu trong bộ nhớ của chip điều khiển (AVR). m6i lán
một ký tự được yêu cầu hiển thị, bộ font tương ứng của ký tự đó sẽ được
“load” ra và xuất lần lượt trên các đường Data, đây chinh là lý do tai sao chúng
ta gọi các đường D là các đường Data. Cách “quét” LED vừa trinh bày là cácf'
“quét ngang”, bạn có thể thực hiện “quét dọc” nếu ứng dụng yêu cáu. Trong
phương pháp quét dọc, các chân hàng chung sẽ dược dùng để cnọn hàng
cần hiển thi, dữ liệu sẽ xuất ra theo từng hàng trên 5 cột và lán lượt thay ái'
hàng (hàng 0 trước, đốn 1 ...và cuối cùng là 6).

230
I A IM IM I Ấ M t M K i l l T f IQC CHƯƠNG l : QOẢNC C A l ygl LED MA TKẬH

S o sánh 2 cách q u é t cho trường hợp m a trận LED 7x5, rõ ràng trong
cách quét ngang ch ú n g ta ch ỉ cần qu ét 5 cộ t cho m ỗi lần LED nên tỉ lệ thời
gian ON sẽ cao hơn (1/5 so với 1/8 của cách quét dọc). M ặt khác, nếu thực
hiện quét dọ c ch ú n g ta cẩ n 8 số để tạo thà nh 1 bộ font cho m ột ký tự và vl th ế
tốn nhiếu bộ nhớ hơn cho v iệ c lưu trữ bảng font. T ùy theo bạn sử dụng cách
quét nào mà xâ y dựng bảng font cũng được xây dựng tương ứng cho cách
quét này. C ác m a trận LED được sản xu ấ t thành các m odule. Ví dụ loại LED
đơn sắc P10, m ỗi m odul có 16 hàng và 32 cột. K hoảng cách điểm ảnh củ a
m odule P10 là 10m m . Do vậ y m odule P10 có kích thước là 16x32cm . Khi
muốn làm m ột biển quản g cá o LED ma trận, bạn phải tính toán dựa trên
những kích thước có sẵn này. Bạn cần tính toán để chọ n nguồn, điện trở hạn
dòng..., m ói có thể th iế t kế bảng LED hoàn chỉnh. Phần tính toán th iế t kê
không phải trọng tâm c ủ a ch u yê n đề này!
Cấu tạo m odule LED P10 và cách kết nối

N goài thị trường có nhiều m odule LED ma


trận bán sẵn, ở đây giới thiệu với các bạn m ột
module LED P10 làm ví dụ vì nó có đầy đủ cá c bộ
phận và đơn giản để tìm h iể u . M ặt trước của m odule
LED P10 như hình bên. Như cá c bạn đã biết, m odule
P10 có nghĩa là khoảng cách điểm ảnh, ỏ đây là hai
bóng LED liên tiế p nhau là 10 mm. M ỗi điểm ảnh là
một bóng LED vì vậy đây là loại P10 đơn sắc đỏ.

M odule LED P10 này có 32 cột và 16 hàng tương đương với kích thước
160 X 320 mm. Đ â y là loại chịu nước nên khuôn nhựa được đúc rất khít với bóng
LED để tránh nước. C h iều dà y của khuôn nhựa cũng dày hơnloại sem i outdoor.
Mặt sau của m odule là m ạch điện tử có các vị trí để cắm jăc tín hiệu và cấp
nguồn nuôi. T rên thà nh của khuôn nhựa ở m ặt sau cũng có các vị trí để bắt vít
và rãnh để lắp gioăng chống nước. Ngoài ra, bạn phải chọn loại m odule thích
hợp với kích thước và tầm quan sát của bảng. Nếu bảng ỏ gần, bạn phải chọn
loại module có phân giải cao như P10, P16. C òn ở xa, bạn ch i cần loại cỏ độ
phân giải thấp như P20 chẳng hạn, hiện nay có nhiều loại m odule có kích thước
khác nhau, ở đây liệ t kê m ộ t vài loại để cá c bạn tham khảo.

Loại m odule Kích thưđc Khoảng cách pixel

P10 16 cm X 32 cm 10 mm

P20 16 cm X 32 cm 20 mm

P16 12,8 cm X 25,6 cm 16 mm

P7.62 24 ,4 cm X 12,2 cm 7,62 mm

231
CHtftfNG 6: QUẢN6 CÁO V Ỉ I L E I H A H A W w w iM n n W m c Ị

Việc sử dụng module ngoài trời hay trong nhà cần phài qLan tâm Nén lá
trong nhà bạn không cần phải để ý đến việc chống nước, chí gnép lam sao cho
khít là được. Nếu là loại ngoài trời, module sẽ có một gioăng cao su phia sau.
Chúng ta phải làm viền để ép sát được gioăng này mới đàm bảo kin nước. Néu
không ta sẽ phải làm hộp chắn nước tốt. Các bạn lưu ý nên ghép các module sao
cho dễ tháo lắp nếu có trục trăc. Nếu không, mỗi lần xử lý lại phài dõ các biển ra
thì rất mệt. Khi mua module, chúng ta sẽ được cung cấp đù cáp tín hiêu và cáp
nguồn kết nối tất cả các module với nhau. Sau khi ghép hoàn thiên các module
chúng ta tiến hành nối cáp nguồn và cáp tin hiệu. Trong chương này chúng ta sê
tập trung vào phần điều khiển LED ma trận đơn giản 8x8. Các loai LED ma trân
thực tế có số LED lớn nhưng chúng hoạt động với nguyên lỷ co bàn như các LED
ma trận nhò. Các bạn sẽ học cơ bàn vể các LED ma trận trước khi ban muốn thực
hiện một LED ma trận lớn. Vi một LED ma trận lớn ngoài cần số lưong chán điếu
khiển rất lớn mà còn cần một mạch nguồn đủ công suất để cung cấp cho chúng
hoạt động. VI vậy, để thực hiện một LED ma trận hàng ngàn LED knông hé đon
giản. Nhưng cũng không khó đến mức mà chúng ta không thể thực hiên.
Lưu ý : Nếu để làm quảng cáo, có nhiều bo mạch chuyên dùng ơung sử dụng
các loại CPU khác nhau phù hợp cho mỗi loại bảng và kich thước của bạn.
Giá cả có thể từ khoảng 250 ngàn đến vài triệu có cả phần mém chuyển dùng
rất dễ sủ dụng thay vì dùng bo mạch Arduino. Ở dây ta dùng bo mach Ardumo
vì Arduino còn có thề làm nhiều chuyện khác nữa mà các bo mach chuyên
dùng cho điếu khiển LED quảng cáo này khó thực hiện. Bạn nên chon CPU có
tinh năng diều khiển được số lượng điểm ảnh cao hơn số lượng điềm ảnh trên
bảng của bạn. Như vậy khi chạy, hình ảnh hoặc chữ mới không bị giật. Nếu bảng
ít hàng thì CPU khõng cần bộ chia kênh (adapter). Bạn nên mua cáp tin hiệu w
CPU ra module dài một chút để dễ thao tác và đặt CPU ở vị tri mà bạn muốn.
Mỗi hàng module trên bảng ta cần có một cáp tin hiệu nối với CPU. CPU ơược
kêt nôi với máy tinh bàng cổng com. Nếu bạn muốn dùng cổng USB thi phải mua
thêm một cấp chuyển dổi USB to Com. Nên mua loại tốt dề đảm bào mua vé là
dùng được vì thị trường nhiều loại có chất lượng thấp. Khi mua CPU ban cũng sẽ
được nơi bán cung cấp phần mềm điều khiển, nạp chữ hoặc hình ảnh Mỗi phán
mềm có cách dùng khác nhau, các bạn có thề tham khảo cách dùng các chương
trình này ở phụ lục cuối sách.

Hình bên và trang bên


là các LED ma trận bạn
thường thấy:

Z3Z
<ABCUINO PASH CHO N6ƯOI Tự HỌC CHƯƠNG 8: QUẢNG CÁO y ứ l LED MA TRẬN

Bài tập đầu tiê n trong chương này bạn sẽ làm quen với LED ma trận
bằng loại LED ma trận 8x8 đóng gói sẵn

ĐIỂU KHIỂN LED MA TRẬN 8X8


LED ma trận sẽ giúp chú ng ta điều khiển các LED với số lượng lớn
nhưng sử dụng số chân tương đối ít. Để điều khiển m ột LED ma trận 8x8
gồm 64 LED bạn c h ỉ cần 16 chân nếu kết nối trực tiếp. Nếu thô ng qua chip
điều khiển hay các IC ghi dịch thi số lượng chân để điều khiển LED ma trận
8x8 sẽ rất ít. G iả sử nếu dùng thanh ghi dịch bạn chỉ cần 3 chân để điều khiển
64 LED. Thực là hết sức kinh ngạc đúng không bạn. N goài cách tự tạo ra
các LED ma trận bạn hoàn toàn có thể m ua m ột LED ma trận đã được đóng
thành m ột khối và các loại LED này nhìn khá đẹp và dễ dàng sử dụng nếu
bạn có tài liệu kỹ th u ậ t củ a chúng. C ác LED m a trận 8x8 đóng gó i sẵn bạn
thường thấy:

Đ ể điều khiển các LED ma trận thì chú ng ta sẽ không thể dùng cách
thông thường là cấp điệ n áp cho các LED rồi ghim điện áp thi LED sẽ sáng.
Điều này là không thể khi bạn sử dụng LED ma trận. Bởi vl nếu dùng cách
ghim điện áp cho LED sẽ làm chú ng ta tốn rất nhiều chân điều khiển. Mà để
điều khiển LED m a trậ n ch ú n g ta dùng phương pháp quét LED.

233
CHƯƠNG 6 : QUẢNG CÀO V 0 I LEB H A THẬN U M M U a C M K M lT f*

Phán dưói sẽ trình bà)


phương pháp quét LED, bạn
hãy đọc cẩn tnãn và tlm hiểu
quy tắc này dể chúng ta bấ'
đầu điều khiển môt LED ma
trận 8x8 đon giàn. Chưong
trinh sử dụng giài thuật quét 1
cột trong 1 khoảng thời gian
Nhờ sự chuyển mach giữa các
c á c c ộ t t ạ o n ê n h iê n ứ n g sáng
LED ma trận mà mắt nguoi
không thể nhãn biết được.

Vì thời gian quét quá nhanh nên mắt người lầm tưỏng rằng những
điểm sáng trên LED matrận sáng liên tục.Nhưng thực tế thi chúng sáng va
tắt liên tục. Chúng taxem bài giảithích đểhiểu rô về quy tắc hoat động :
Quét LED theo từng bước
Ban đầu cột 1 được kích hoạt để nối kín mạch cột 1 cùa LED ma trận,
và chúng ta cũng xuất dữ liệu cho hàng để làm sáng LED trên cót đó. Chúng
ta cho những LED ở cột đó sáng trong một thài gian ngắn rồi lại chuyển sang
cột 2 và cũng xuất dữ liệu ỏ các chân là hàng của LED. Rồi lại cho sáng mót
thời gian ngắn và lại tiếp đến cột thứ n.

Bạn có thể coi hình để hình dung rõ


hơn. Ở đây chúng ta muốn tạo một ký tự A
% m • • « #
bằng LED ma trận.
» # • • # ©
Theo giải thuật cùa chúng ta thi bạn
i n HI’ ^ ® m 'ắ
có thể thấy rõ trong hình quét qua từng cột
và cứ thế đến cột cuối cùng sau đó quay C' c *&'■
Mị, ỹtỷ/. /s?ỷ ■/ , //ỷ
lại. Như thế mắt chúng ta sẽ thấy LED hiển w W } W-' '■
thị chữ A,

<£]

234
AIDIINO DÀNH CHO NGƯƠI ĩ f RỌC CHƯƠNG 6: QUẢNG CÁO v d l LED MA TRẬN

Hoạt dộng của chương trình


Trong chương trình này, đơn giản
chúng ta chỉ tạo m ột ký tự A trên LED ma
trận 8x8 bằng phương pháp quét. Và các
LED sẽ sáng m ột cách không liên tục
nhưng m ắt thường chú ng ta không thể
phân biệt được dẫn đến ch ú n g ta thấy m ột
ký tự A như mô phỏng trong Proteus:

Phần cứng

Sau khi bạn đã làm quen với cá c LED ma trận và tìm hiểu các nguyên
lý hoạt động của chú ng thì chú ng ta sẽ bắt đầu phần lắp m ạch cho bài tập
này để chúng ta tiến hành lập trinh và điều khiển LED theo nguyên tắc hoạt
động ưên. Trong bà i tập này, chú ng ta sứ dụng m ột bộ LED ma trận 8x8 (64
LED) và các điện trở để hạn dòng cho LED ma trận. N goài ra các bạn cũng
có thể dùng thêm cá c tra n sisto r để kéo dóng cho LED ma trận.
• LED ma trận 8x8.
• 8 điện trở hạn dòng 220 ohm.
Kết nối phần cứng
K ết nối m ạch như hlnh trang bên với các điện trở hạn dòng cho LED
ma trận và chúng ta sử dụng thêm hai chân tương tự cù a board m ạch A rduino
là A4 và A5 để kết nốl với các ngõ và o của các hàng LED.

ỈỈS
CHƯƠNG E: QUẢNG CÁO vứ l LED H A TgẬH A ID I M IẰ M C II K H H f ĩ

Chú ý: Có thề LED ma trận các bạn sử dụng khác VÓI LED n a trận trinh
bày trong sách, vì vậy bạn nên tim tài liệu kỹ thuật cùa chúng đẽ két nõi mạch
một cách chính xác.
Bạn kết nối với bo mạch Arduino theo bảng sau:

BO MẠCH ARDUINO LED MA TRẬN

Chân số 0 Qua điện trở đến Cõt 0

Chân số 1 Qua điện trở đến Còt 1

Chân số 2 Qua điện trở đến Côt 2

Chân số 3 Qua điện trở đến CÔ1 3

Chân số 4 Qua điện trở đến Côt 4

Chân số 5 Qua điện trò đến Cót 5

Chân số 6 Qua điện trở đến Côt 6

Chân số 7 Qua điện trỏ đến Côt 7

Chân số 8 Hàng 0

Chân số 9 Hàng 1

Chân số 10 Hàng 2

Chân sô' 11 Hàng 3

Chân số 12 Hàng 4

Chân số 13 Hàng 5

AN 5 (Chân tương tự 5) Hàng 6

AN 4 (Chân tương tự 4) Hàng 7

Hình trang bên là ảnh kết nối mạch trên Proteus:

Phần mềm

Chương trình được viết 0 trang bên có nhiệm vụ thực hiên quét LED
ma trận. Và chúng ta khởi tạo các giá trị LED hiển thị để thực hién hiển thi
chữ A trẽn LED ma trận. Trong bài tập này sẽ thực hiện cách q iié: LED đon
giản và các hàm ở bài tâp này được sử dụng ở các bài tập sau nên ban cắn
phải tham khảo hỷ.

236
ARDOINO DANB CHO N6ƯƠI Tự HOC CHƯƠNG 6: qOẦNB CẢO VƠI lED MA TRẬN

2 2 ĩr <::

ATOJIHC ỤNC S3 ; : < rt1


} ịễ te ĩ ...... 1 ĩ. . . X I I I ;... . :» << Ỷ. * 'ứ'Ỳ
£ %■í' 'ị
& ử í* V. %#■'tỳ.Ịí
■i ?ế í; V 'ớiỉ>v;
\4 ịị V:'Á k
á% ặ
■ỉ- <ỷ <ị %4 íí * ■'/
•/,- Ỳỹ■>; ■jỊt 4. >s%

Chương trinh qu ét LED m a trận 8x8 cơ bản:


// Quét LED ma trận 8x8 cơ bản
II Biến dùng đ ể chúng ta qu ét cột
unsigned int LE D C ol=O B 1;
// Mảng chứa giá trị chữ A khi hiển thị
unsigned char L E D D a ta [8 ]= {0 ,0 X 7F ,0 X F F ,0X 8 C ,0X 8 C ,0X F F ,0X 7 F ,0 );
// Chương trình khởi tạo
void setupO
{
// Thiết lập ngõ ra cho các chân n ố i với LED ma trận
for(int i=0;i<14;i++)
{
pinM ode(i,O UTPUT);
}
pinM ode(A4, O UTPUT);
pinM ode(A 5, O UTPUT);
}
// Hàm rút các bít riêng lẻ từ m ột biến
CHUjfWE 6 : qUẦNG C À I w tfl l i l H A n Ả I A lim I4 J I C M K H I I ( K

boolean Bitstate(char val, char pos)


(
boolean xbit;
unsigned char xchar=-1;
if (pos<16) xchar=0x1 & val>>pos;
xbit=xchar;
return xbit;
}
// Hàm thay đổi LED cột
void ChangeCol 0
{
for(int i=0;i<8;i++)
{
digitalWrite(i,BitState(LEDCol,i));
}
)
II Hàm thay đổi LED dòng
void ChangeData(char index)
{
for(int i=0;i<6;i++)
{
digitalWrile(i+8,!BitState(LEDData[index],i));
}
digitalWrite(A5, !BitStale(LEDData[index],6));
digitalWrite(A4, !BitState(LEDData[index],7));
}
// Hàm quét LED
void LEDMatrixQ
{
for(int i=0;i<8;i++)
{
ChangeCol 0; // Thay đổi cột
ChangeData(i); II Thay ơổi dòng
delay(5);
LEDCol=LEDCol<<1; // Dịch bit của các cột đề thực hiện pp quét
if (LEDCol==0x100) LEDCol=0B1;
}

238
ỉ A tM IK O DÀNH CHO NGƯƠI Tự HỌC CHƯƠNG 6 : QUÀNG CÁO V O I LED M A H Ậ N

// Chương trình chính


void loop()
í
LED M atrix(); II Hiển thị k í tự A
)
Hãy viế t chương trình, biên dịch và tải xuống bo m ạch Arduino.
Nếu bạn kết nối m ạch đúng và m ạch lập trình chính xác thi bạn sẽ
thấy LED ma trận xuấ t hiện m ột ký tự A duy nhất. Chương trình này ch ỉ là
chương trình cơ bản nên ch ú n g ta không tạo hiệu ứng tránh sự khó hiểu và
ảnh hưởng đến quá trình tim hiểu của bạn.

Tìm hiể u p h ầ n m ềm

Chương trình trong bài này có m ột số hàm ch ú n g ta sẽ kế thừa các bài


tập LED đơn nhưng cải tiến đáng kể để sử dụng cho LED ma trận. M ột khi
bạn đã tìm hiểu kỹ về LED đơn thì bạn có thể dễ dàng phân tích cá c hàm đã
cải tiến. Ngay đầu chương trình, chú ng ta thực hiện khai báo các biến chứa
trạng thái của các hàng và các cộ t của LED ma trận. T rong bài tập này chú ng
ta dùng phương ph áp q u é t cột. Nhưng sau khi thực hiện bài tập này, bạn có
thể thấy rằng việ c quét LED m a trận có thể thực hiện bằng cách quét cột
hoặc quét hàng đều cho ra m ột kết quả giống nhau. Trong bài tập chúng ta
khai báo biến LE D C ol để thực hiện qu ét cộ t và m ột m ảng LED D ata[8] để
chúng ta chứa các giá trị điều khiển LED. Vì là quét cột nên bạn cần khởi tạo
giá trị ban đầu cho biến LE D C ol là 1 và dữ liệu của ký tự sẽ nằm trong các
phần tử của m ảng LE D R ow :
unsigned int LEDCol=O B1;
unsigned char
LE D D ata[8]= {O ,O X 7F,0X F F ,0X 8C ,0X 8C IO XFF,0X7F10};
Sau khi khởi tạo cá c biế n và m ảng xong chúng ta sẽ đến với chương
trình khởi tạo:
void setupO

{
for(in t i= 0;i< 14 ;i+ + )

{
p in M o d e (i,O U TPU T);

)
p in M o d e (A 4 ,O UTPUT);
p in M o d e (A 5 ,O UTPUT);

239
CHHHN6 6: QUÀN6 CAO VỜI l i l MA TKÃN m i H i t i CM m i l T Ị K

Chương trinh khải tạo trong bài táp nay để thiết lãp c=.c ngõ ra cho cac
chân nối với LED ma trận từ chân số 0 đến chăn số 13 va nã C"ẳn ‘ uong tự A4
và A5. Hai chán tưong tự này bạn vẫn có thể điều khiển nnư c ic cnán khác
Tiếp theo là hàm rút bit từ biến:
boolean BitState(char val, char pos)
{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & val>>pos;
xbit=xchar;
return xbit;
)
Trong các bài tập LED đơn bạn chỉ thực hiện rút bit cùa mót biến có
định, nhưng trong bài tập này chúng ta sẽ cải tiến hàm rút t : nay để nó có
thể rút bit từ một biến bất kỳ nào đó. Chúng ta thực hiện thay đổi hàm này
nhằm mục đích phục vụ cho việc rút bit của nhiều biến va giá trị khác nhau
trong chưdng trình. Tiếp theo là hàm điều khiển các côt của LED 'na trân:
void ChangeCol 0
{
for(int i=0;i<8;i++)
(
digitalWrite(i,BitState(LEDCol,i));
}
}
Hàm này là chính là hàm ChangeLED trong các bài táp LED đon
Nhiệm vụ của hàm này là thực hiện quét cột cho LED ma trận.
Sau đó chúng ta sẽ tạo hàm để thực hiện việc xuất dữ liêu cho LED
ma trận khi quét từng cột:
void ChangeDatafchar index)
{
for(int i=0;i<6;i++)
{
digitalWrite(i+8,!BitState(LEDData[index],i));
}
digitalW rite(A5. 'BitState(LEDData[index].6)):
digitalWrite(A4, !BitState(LEDData[index],7)):

240
I AliMW DANHCHONGƯỨIĩự HỌC CHƯƠNG 6: QQẢNC GÁOvđl IEP MA TKẬN

Hàm này có m ục đích tương tự như hàm ChangeLED nhưng trong bài
tập này chúng ta không có các chân số trải dài từ 0 đến 15 nên bạn đã phải sử
dụng thêm hai chân tương tự. Và các LED dữ liệu sẽ là các hàng của LED ma
trận. Chúng ta nối với các hàng LED ma trận bắt đầu từ chân số 8 nên trong
vòng lập chúng ta cộng thêm 8. Sau khi thiết lập các bit cho các chân từ 8 đến
13 thì chúng ta rút bit điều khiển các chân tương tự theo giá trị của dữ liệu.
T iếp theo là hàm quan trọng nhất của chúng ta. Hàm qu ét LED:
void LED M atrixQ

{
Trong hàm này bạn sử dụng m ột vòng lặp để quét hết 8 cộ t của LED
ma trận:
for(int i= 0;i< 8;i+ + )

Sau đó chú ng ta sẽ thực hiện quét cột bằng phương pháp dịch phải.
Mỗi lần quét cộ t ch ú n g ta sẽ thay đổi dữ liệu cho hàng tương ứng với cộ t đó
để hiển thị chính xác các dữ liệu có trong m ảng của chú ng ta, khi đã qu ét đến
cột cuối cùng thi thực hiện qu ét lại từ đầu:

C h an geC ol (); // Thay đổ i cột


C h an geD ata(i); II Thay đ ổ i dòng
d elay(5);
L E D C o l= L E D C o l< < 1 ; // Dịch bit của các LED cột đ ể thực hiện
p p quét
if (LE D C ol= = 0x1 00 ) LE D C ol=0B 1;

}
}

Chương trình chính ch ú n g ta chỉ có nhiệm vụ là liên tục qu ét LED để


hiển thị ký tự trên LED ma trận:

void loopO

{
LED M atrixO ; // H iển thị k í tự A

Bạn đã thực hiện xong bài tập, trước khi thực hành các bài tập điều
khiển LED ma trận phức tạp hơn các bạn hãy thực hành mô phòng 1 LED ma
trận được điều khiển bởi A rdu in o Proteus (chương trinh hiển thị kí tự “A ” trên
LED ma trận đã trinh bày).

241
CMƯƯNt 8: m iẢ H t C ÁI n i l LEI H A T IẬ « m « 1 lẰ liM I K H in ^ l

Mô PHỎNG MẠCH DIỀU KHIỂN LED MA TRẬN ■ ■

V0IARDUINO BẰNG PROTEUS


Phần trình bày sau hướng dẫn các bạn mô phỏng LED rna trân bàng
Proteus và viết chương trình hiển thị kí tự “A" trẽn LED ma trân Ban cán chú ý
phần này vi nó giúp bạn dễ dàng thực hiện một mạch Arduino đề thừ nghiệm
thay vì phải lắp mạch thực tế. Tuy nhiên các hiệu ứng thực hiện bằng mi
phỏng sẽ không hoàn toàn giống thực tế. Vi vậy bạn hãy coi đây là môi
phương pháp bổ trợ cho minh mà không phải là phương pháp chinh thống.
Những phần mềm bạn cần phải có:
• Proteus 7 Professional.
• Thư viện Arduino cho Proteus.
(Bạn có thể tìm dọc sách về cách sử dụng Proteus cũng do lủ sách
STK biên soạn.)
Đối VỚI thư viện để sử dụng mô phỏng với Arduino, bạn sử dụng trang
web sau để truy cập và tải về: http://www.zer07even.com /download/125-
ard uino-libra ry-prote us-un tu k-sim u lasi.

Sau khi tru y cậ p vào


trang w eb bạn tìm phần
Dow nload của trang như
hình bên.
_ J -- ---- T—---- --------
iá con to h code
' ÍĨQ U IN O U B ,
#AVR 2.rar
I f) contoh _isis .DSN
.J i Down I d
Q b a c a .tx t
SaVR2.DLL
0ardulibsJib.JPG
0ARDUINO.LI8
0ARDUINO.IDX

Sau khi bạn tải thư viện từ trang web về thì chúng ta sẽ cố môt thư
mục bao gồm các thư mục như hình: Bây giờ bạn đã có thư viên của Arduino
cho Proteus. Để sử dụng thư viện này, trong Proteus bạn cần phải cài đát nó
vào thư mục “Library" của Proteus:
MDOIM) DAMi CHO NGƯUI Tự UQC CHƯƠNG E: QUẢNG GÁO »ứl LED MA H Ậ U

Bạn truy cậ p và o đường dẫn “CAProgram F ile s\L ab cente r


Electronics\Proteus 7 P ro fe ssio n a l\L IB R A R Y ” và sao chép hai file có tên như
sau vào thư m ục:
. A R D U IN O .LIB

. A R D U IN O .ID X

Nếu hoàn tất quá trình trên thì ỊU Adobe Uể ^ S c ĩ,n ISỈS.EXE
chúng ta có thể sử dụng bo m ạch A rduino 3» Adobe £» Defragger
trong Proteus. C òn nếu cỏ vấn đề với 4 * Adobe £» OpenWiih...
đường dẫn củ a bo m ạch A rdu in o thì bạn ■ ă ProtausV Send To
hãy sử dụng cách sau để tìm đường dẫn Ể j| Virtual Ne — --------------------
đúng của Proteus. Xz Cut
;Q Vrtual us ~ r "
—1 Copy
Chọn Start > All P rogram s-> I I ARES7F1— -----------------------
Proteus 7 Professional và nhấp ch u ộ t ARES tìnịị & i,e S h o rto jt
phải vào “ISIS 7 Professional" sau đó ẵ AVft studs
" Rename
chọn Properties như hình: H ộp tho ại như IJrg EasyHDl 1------------------------
hlnh dưới xuất hiện, bạn chọn Find T arg et
Gertatfor S ò r tb » N » «
để tim đường dẫn của chương trình
05: ISIS 7 Pr
Proteus trong m áy tinh bạn.

------- n -

ISÌS 7 Professional

Target type: ippScafon

Target location: BIN

Tajget: |ledronics\Proteus 7 Professional\BIN\ISIS.EXE''

S a tin : |”C:\Program RlesXLabcenter E)ectronics\Proteus

Shcítaâ key: I None

Run: I NormaUvindow •*'1

Comment

Fin^ a rg e t . I Change Icon... I Advanced... I

243
CHƯƠNG 6: QUÀNG C Á I v l l LE I MA TRẬN O M IU M C H K M I ĩ H c

Tìm đến thư mục gốc của


chương trinh Proteus và sau đó tim đến
thư mục “LIBRARY” để dán các thư
viện Arduino cho Proteus:

Sau đó, bạn khởi động chương


trình Proteus. Giao diện làm việc
chương trình Proteus 7.0 xuất hiện như
hình dưới.

Trong bài tập này chúng ta sẽ mô phòng mạch gồm 1 LED ma trặn, B
điện trở và một bo mạch Arduino Uno. Vì vậy, chúng ta cần phải lấy 3 linh
kiện là LED ma trận, điện trở và Arduino từ thư viện. Sau đó sẽ lần lưọt đưa
chúng vào bản vẽ Proteus để mô phỏng.

Bạn lấy các linh kiện bằng cách lấy chúng từ thư
viện. Để mở thư viện linh kiện, bạn hãy chọn biểu tượng
sau trên thanh trình đơn ngoài cùng bẽn trái cùa Proteus:

244
M M IIO i à m cho ngươi tự bqc CHƯƠNG I : QUẢNC C Ả IV ứ l LED MA THẬN

Sau đó bạn nhấp chu ột pị . . .

phải vào cửa sổ “D E V IC E S ” và


chọn menu "Pick from L ib ra ries’’
i
như hlnh bên. V 1 k from Libraries
Library Manager
Cửa sổ thư việ n xuấ t Tidy :::
hiện. Tại cửa sổ này chú ng ta sẽ
:::
lấy các linh kiện gồm LED m a Create
trận, điện trở và bo m ạch Edit
Arduino Uno. Update
Delete
•••
Tag -nsỉsrsces
Padaee Afoasií0í»

Auto tide

1F 7 !

Ị ........ S&LĨ*...
►Wrh&TnfeWwd?? r
ittí* (ri, *,*)<*? r
frwr.
ỊUrapeoAedl
Analog iCi
l Capaãlois
(NpthnBĩetecíedlapofvie«M)
' CMOS 4000 m in
ị Cinrwclcnx
; Dalí Converted
: Debugong I oolỉ
V Diode*
• ECí. 10000 Senet
ị: Electi0ín«char»caỉ
• EmUatoi
'ị Indudus
V Laolace Primỉiveỉ NotMich CÍMIÍ.
; Mechanicỉ Please artel one 0»mo»e keywords ỏnđ/oI
>: MemoiylCj select â Category. Sub-Càtegoiy 01Man«lactue»
• Miaoprocesscr ICt
Ị Mi*c*laneous
: Modeling Pnmrtivet
'í opaduivil Ampu«3ỉ
M

"3

Để tim bo m ạch A rduino bạn có thể đánh từ khóa "A rd u in o " và o ô


Keywords. N goài ra, bạn có thể tlm m ục “ E m u la to r" từ cừa sổ thư việ n như
hlnh trang bên.

Z4S
CHƯƠNG 8: QUẢNG CÁO v ứ l LED HA TBẶN UIBM l u m i n m

Đối với thư viện mà chúng ta đã tải về i


thi sẽ có 3 bo mạch Arduino đó là Arduino Uno Keyword:
như hình:
I z
Match Whoie V ơ ds? í
Show only p^rs modeís? [7
!Qaỉegory-
(All Categories) A
Analog ICs
Capacitors
CMOS 400C senes
Connector:
Data C o n v e rt:
Debugging Toois
Diodes
Electromech.y*còl
Emulator 31
1Inductors -J 1

Arduino Mega2560:
I Ltoav I DgictipJkirt VSM DJ . Mcdol ỊAVR2 DLL)
IaRDUINOMEGA1280 ARDUINO AiduinoMEGA|ATmegd1280)
ARDUINŨMESA2560R3 ARDUINO AidũnoMEGA2560Rev3

Và Arduino Mega1280:
I Device ị Libary Ị Dflstiiption: I VSM D !_ u->5d |A*m2 [>ILỊ
lARDUINOMEGA128Ũ ARDUINO AfduinoMEGA|ATmegal 280) !j-
AROUINOMEGA2560R3 ARDUINO AfduinoMEGA2560Rev3
ARDUINOUNOR3 ARDUINO A/duinoUnoR3

Bạn sẽ thêm Arduino Uno vào list linh kiện sử dụng báng cách nhấr'
đúp vào Arduino Uno. Tiếp đến chúng ta sẽ thêm điện trở vào list ỉmh kiện SỪ
dụng cho mạch mô phỏng bằng cách đánh "res" vào ỏ keyw ords và nháp
đúp vào điện trở để thêm vào list linh kiện như hình trang bên

246
A1D0IM0 DÀNH n o NCtftfl Tự HQC CHƯƠNG I : QĐẢN6 CÁO vđl IED MA TBẬN

Part tJ«ne ncs


Ịj— '" Oak Lttay : DEVICE.Ue
Cieaied On . Monday. Noverr>beí 10.2008 Ma 13:21 AM
Andog 1C: Ddegoiy Re*istCK
Ceọsãictt Su&cslegoty : ũencK
CMOS 4UUOtenet Dmct&tor, : Genericrửtttlatyrrbd
Data Coo.ettw:
Dndei
Indudaií
L«Uc* PiimitMM
Miitnwy lCs
Miaociscetisr 1C*
Mi«c«lđnoout
Modeling Pimlivet

T iếp đến, để lấy LED m a trậ n thì bạn hãy gõ từ "le d 8 x8 ’’ vào ô
keywords để thêm linh kiện LED m a trậ n cho m ạch:
Ẽ2ES32523H ✓i.WMế,
famajt ■ Ị4'f
Ị Led ÊX0 ■i Ặị 'ý
ikCihjsJwVoHfc? r MAÌF.l*8<3eiUE DISPLAY 8x8 Blue LEO Oo« Mo nx 0 Sftev
I V5M DLL Modd |LEDMfĩ<l

SKợwonfc,Mđi*.«tí\okxWs? !✓ MMF.IX«OGREEN OISPLAY 8x8 Gieen LEO Oa M aí* Citoĩa/


MATRIX«<8-CRAIIGE OISPLÙY 8x8 Oiđrge
Oiy-qe Ltữ
LED Del M^iioc 0 splay.
£#«30* EÉImkE
Oc«xiec«io*»ct

Bây giờ ch ú n g ta đã thêm đủ linh kiện vào


list thì chúng ta b ắ t đầu kế t nối cho m ạch mô
phỏng. Bạn hãy th o á t cửa sổ linh kiện và trở về với
cửa sổ chính. Sau đó bạn chọ n A rdu in o Uno R3 từ
cửa sổ DEVICES để đặt và o m ạch như hình dưới:
Sau khi chọn xong thi bạn rê ch u ộ t vào m àn hình
để vẽ mạch, bạn sẽ thấ y hình ảnh ảo của linh kiện
đó trước

: /..v.^-vtnnn.n.nrvi,

. SÃ<%
Ã^f\A/VÃÃÁ~Ậr, .

íI t

247
C M S i : q i)Ầ m H I » i l LEI HẤ H A H A IM H Ắ M CM H l ĩ H t 1

Để đặt linh kiện lẽn bản vẽ, bạn hãy rê linh kiên đến vi tri thich hợp vá
nhấn chuột trái như hình dưới.
Sau khi bạn đã đặt bo mạch Arduino chúng ta tiếp tục đật LED ma
trận vào bản vẽ và chỉnh chúng sao cho họp lý với bản vẽ. CnCng ta đặt thêm
điện trở và xoay điện trở trong bàn vẽ mô phỏng.

MJILLLI

ITT I I I II
Sau đó bạn Chĩnh điện trở thành thành 220 ohm để phù họp với mạch
mô phỏng của chúng ta bằng cách: Nhấn đúp vào điện Irở và :nay đổi thông
số Resistance thành 220 như hình dưới:
Edit Component

Component Reíeience: |R9 Hidderc f or,


Resistance: |22C( Hidden: r~
Help

Model Type: ANALOG " 3 l Hlde All ~zi Cancel


PC8 Package: IRES40 r ■71 Hide All ~3

f~ ExcJude from Simulation r Aitâch híeiãrchii module


[~ Exdude from PCB Layout ị H:de Jirrirfion pinj
I Edit all properties as text

Chúng ta sẽ đặt và sắp xếp các điện trở, LED ma trân và bo mach
Arduino cho hợp lý. Tiếp đến, chúng ta sẽ nối dây cho LED ma trân và bo
mạch Arduino như hlnh trang bên để hoàn thành mạch mỗ phỏng

24 8
AIDOIWO IAWI C M NGƯƠI T ự HỌC CHƯƠNG 6: QUẢNG CAO v đ l LED MA TBẬN

249
CHƯƠNG 6: qOÀNE CẦO wđl LEB MA H Ậ N u in n iu iC im w iT U t

Sau khi chúng ta đã hoàn thành Ffc Eớt Skcth Toóí


mạch phần cứng chúng ta sẽ đổ code New
lừ chương trình Arduino IDE vào Open.*. Cs1*0
Proteus để mạch hoạt động. Đầu tiên, £3i£tdt>ook ►

chúng ta hãy chỉnh chương t r ì n h Examples ►


Close C7I+W
Arduino IDE để hiển thị đường dẫn cùa
Save -Zti+5
mã lệnh biên dịch bằng cách: Chọn tùy
Save As... Ctf+SWl+5
chinh cho chương trinh Arduino IDE
l^áoađ CỉrlH í
bằng cách: Chọn menu File >
Ưpioad Ifcang Programmer C H ♦Ỡ 104U
Preferences như hlnh dưới. lũũl
Page Setup Ctt+Shít+P
Cửa sổ tùy chính sẽ hiện lẽn.
Prót c tì *p
Bạn hãy để ý kỹ phần Show verbose
output during và đánh dấu kiểm vào Preferences

com pilation để hiện lên các đường dẫn Quít C-1-K5


biên dịch:
0E> P re fe re n c e s

Sketchbook location:
|c:’(Documents and SettíngsiMv LifeV'-ly Documents'Arduino

Editor language: ịsystern Default {requires restart o f Aiduno)

Editor font size: 12 (requires restart o f Afduaio)

Show verbose output d u in q : [ 7 compilation : (~ upload

Ị7 Verify cade after upload

r~ Use external editor


p ' Check for updates on startup

Ỉ7 update sketch files to new extension on save (,pde -> .mo)

p AutomatjcaSy associate .BIO files with Ardiino

More prcfcrer-oss C5?“- bs -wCtid "'i fi:*


Ci'ftoajnrents and S e ttin g s '^ Life\App)ication Data'yArduino’preference! ■yt

OK

250
A1B8IN0 DÀNB CBO NGƯỪI Tự HỌC CHƯƠNG S: QUÀNG CÁO vđt IEĐ MA TBẬH

Sau đó bạn hay ché p m ã lệnh bài tập sau vào chương trình A rdu in o
IDE để thử nghiệm hiệu ứng trê n Proteus:
// Quét LED ma trận 8x8 cơ bản
II Biến dùng đ ể chúng ta q u é t cộ t
unsigned int LE D C ol=0B 1;
// Mảng chứa giá trị chữ A kh i hiển thị
unsigned char LE D D a ta [8 ]= {0 ,0 X 7F ,0 X F F ,0X 8 C ,0X 8 C ,0X F F ,0X 7 F ,0 };
// Chương trình khởi tạo
void setupO

{
// Thiết lập ngõ ra cho các chân n ố i với LED ma trận
tor(int i=0;i<14;i++)

{
pinMode(i,O UTPUT);

)
pinM ode(A4,O UTPUT);
pinM ode(A5,O UTPUT);

)
// Hàm rút các b it riê ng lẻ từ m ộ t biến
boolean B its ta te (c h a r val, ch a r pos)

(
boolean xbit;
unsigned char xchar=-1 ;
if(po s<1 6) xchar=0x1 & val>> pos;
xbit=xchar;
return xbit;

)
// Hàm thay đ ổ i LED cột
void C hangeC ol 0

{
for(int i= 0;i< 8;i+ + )

(
d igita lW rite (i,B ìtS tate(L E D C ol,i));

ZS1
CHƯƠNG 6: qUÀNE CÁO v d l LED MA TIẶN Ắ l H M im a ilK H lT H t

}
// Hàm thay đổi LED dóng
void ChangeData(char index)
{
for(int i=0;i<6;i++)
{
digitalWrite(i+8,!BilState(LEDData[index],i));

}
digitalWrite(A5, !BitState(LEDData[index],6));
digitalWrite(A4, !BitState(LEDData[index],7));

)
// Hàm quét LED
void LEDMatrixO
{
for(int i=0;i<8;i++)
{
ChangeCol 0; // Thay đổi cột
ChangeData(i); // Thay đổi dòng
delay(5);
LEDCol=LEDCol<<1; // Dịch bit của các cột đề thực hiện pp quét
if (LEDCol==0x100) LEDCol=0B1;
}
}
// Chương trình chinh
v o id loopO

{
LEDMatrixQ; // Hiển thị kí tự A
ì
Và chọn nút V erify như hình dưới:

Sau đó chương trình Arduino IDE sẽ biên dịch chưong trinn CiO chúng
ta, những thônc số biên dịch sẽ nằm ỏ phía dưới cùa chương trim Arduino
IDE như hlnh tr: ng bên.

2S2
AIBOINO DÀNH CHO NGtftfl Tự HQC CHƯƠNG 6: QUAKE CÁP v đ l IED MA TBẬH

u Hèa: o u éc LED
v o id L E D H atrixO
<
tor. ( i r . u i = 0 ; i < 8 ; i + + )
<
ChangeCol ( ) ; / / T hay đói. c:ộu
C h a n g e D a ta ( i) ; ! ! T hey 001 dòng
de la ? ( 5 ) ;
L ED C ol=L EI)C ol«l; / / ' D ịch ã i t , cù a các c ộ t (lể . th ự c h i ệ n pp q u é t
iE (LEDCũl==OxlOO) LEDCol=OBl;
}

/ / ChiiciiỢ tìiirử i c h in h
v o id lo o ii ()
(
LEDĨĨatrix ( ) ; li H iển t h ị ! : í r.ự A
}

Bây giờ chú ng ta sẽ copy ph ần đường dẫn của chương trình vừa biên
dịch để đưa vào A rdu in o Uno trong Proteus bằng cách tô xanh phần đường
dẫn có đuôi cuối là .hex và nhấn Ctrl + C:

c7\ŨOCU>Ẽ-lVKỸLlÌ:E~lMaCALS~l\IeaiD\build620Ũ90093779ó3Ễ919S.Cmrs\OtIE
C :\B C O iffi-l\K Y L I ĩ £ “ l\IXKAIS~l\Ien?5\buildỄ2Ọ09Ọũạ3779ó369195.GBp\QỢE 6
I_LE3 «&. TRAU CO B M i.c p p .h e x ■■ - . : ‘ - - ‘
S in a re ^ ft g t c h ay y * 362 b yté ạ (eg a 32,256 te sa sia u siỉ :> "

57 m ilia ÉÉ11 Aiduina Ufi 0<m COM3

253
CHƯđHE 6: qUÃHE C Ả I ư I l£ l H A T IÃ II U M H Ằ M C M K M ltm

Sau đó bạn vào Proteus và chọn


A rduino Uno và nhấn chuột phải vào
mục Edit Properties như hình bên.

Cửa sổ E dit C om ponent xuất


hiện như hình dưới.

1Edit C o m po nent
b e t : ' J jx |

Component Reference: la m Hidden . - OK


Component Value: Ịa RDUINO UNO R3 Hidden
Hidden Pirn

BLOG ( Direitos Aulorais ] ị rriac-cGrtrdòndo:. blogspot r cm 1Hide All


u Cared
Program File: 1 .............................. 1 ^ 1 Hide All 3

RSTDISBL (Disable reset] 1(1) Unprogrammed 1Hide All d

WDTON (Enable watchdog) |(1] Uriprogrammed 1Hide All


3
BOOTRST (Selecl Reset Vector) I (1) Unprogrammed zj 1Hide All "3
CKSEL Fuses: [(0000) Ext Clock 1Hide All

Boot Loader Size: 1(00) 1024 words Staffs at 0x1 C (^ J 1Hide All -i

SUT Fuses: |(10) zl 1Hide All 3


Clock Frequence: fl6M H z [i-iide All

NAME: [a RDUIHO UNO REV3 1Hide All

CLKDIV8 (Divide clock by 8) |(1) Unprogrammed jU Ị Hide All 3

CK0UĨ (Clock output) |(1) Unprogrammed . r j 1Hide All 3

Advanced Properties:
I Disassemble Binary Code z ] | no zi 1Hide All 3

Other Properties:

í E xclude from Simulation Attach hierarchy module


Ị Exclude from PCB Layout " Hide .row ncr p:rc
[ ~ Edit all properties as text

254
AIDBINO DANH CHO N C V ifl Tự BỌC CHƯƠNG 6: QUÁNG CÀO veil LED MA ĨBẬH

Bạn chú ý phần Program F ile và hãy chọn biểu


tượng có hình sau để đổ chương trinh vào bo m ạch Arduino
trong Proteus.
Cửa sổ Select File Nam e như hình dưới xuấ t hiện.

HT7” - c i i i f /V

I i
4 /2 6 /2 0 1 * 9 :4 2 PM
6 /2 4 /2 0 H -4:42 PM
5 /2 /2 Q H 5 :43 PM
5 /5/2 0 H 7:39 PM
4/2B/201-4 1:15 PM
7/19 /20 14 11:15 AM
7 /1 5 /2 0 1 4 1:06 PM
6 /2 5 /2 0 H 2:25 PM
7/1 4 /2 0 1 4 10:54 AN
5 /2 3 /2 0 1 4 11:04 AM
4 /1 8 /2 0 1 4 3:09 PM
3 /1 9 /2 0 1 2 10:33 PM
5 /2 1 /2 0 H 3 :2 3 PM
8 /1 9 /2 0 1 2 10:37 PM
5/2 6 '2 0 1 4 1:20 PM
7 /1 9 /20 14 10:35 PM
■4/26/20 14 9 :4 2 PM
4 / 1 9 / 2 0 4 : 1 2 PM

Bạn hãy paste đường dẫn củ a chương trình A rduino vào phần F ile
name của cửa sổ này bằ ng cách chọn Ctrl + V tại ô File name.

Fte nane: |v\Terrp'ixjild6200SCfô37?ĩS36S1S5.lnp QUE.t T e D_MA_TBAN_CO_BAI4 cpp h e x ljJ

fitesoftype: ỊHEX. U6ROR COFF. ELF or OBJ Files j j

Sau đó nhấp Open và chú ng ta đã đổ thành công chương trình được


biên dịch từ A rduino IDE sang cho cho chương trình m ô phỏng:

BLOG ( Diretos Autofeis) |f»ia'Qc ci’ihctafidcc .bladsf at com ị Hide All V

Piograrn File: _MA_TRAN_CO_BAN cpp he<i j Hide Ail d


RSTDISBL (Disable reset) (1) Unprograrnmed T Hide All d
---------------- t r - —— -
r r r r r —---------— ■ t
Bây giò bạn hãy nhấn nút P lay để mô phỏng chương trình A rduino
trên Proteus như hình trang bên.

255
CHƯÚNẼ E: QUẢNG CÁ3 v í l l ỉ l M A TIẶN U In u lu a M iK N iT f K

_ Play
ỉ ► I !► I II

Khi mô phàng, bạn thấy ký lự "A”


3 t£ i S y s te m
bị đôi lần sáng tắt đó là do chúng ta đã
* > 0 S ystem ln f ò ..
sử dụng phương pháp quét LED mà
— Check ky updates...
Proteus lại không thể mô phỏng chính
xác theo thực tế nên chúng ta sẽ thấy - ^ex-er
hiệu ứng như vậy. Việc mô phỏng LED S et BOM s ơ p ỉs . . .
ma trận trên Proteus rất khó khăn. Bạn
S et Qispta y O p tio n s ..
chỉ có thể thực hiện mô phỏng hiển thị
S et E h v ra ra n e rĩt-..
chính xác được vài cột của LED ma trận
S e t K e y b o a rd M a s p n g ...
trên Proteus. Bình thường thì bạn sẽ
không mô phỏng được 1 LED ma trận, S e t P a th s ...

nhưng bạn có thể chỉnh như sau để có Set Property D€fir»3ons..


thể mô phỏng được LED ma trận trên Q S et S he e t S ize s...

Proteus: Hãy vào menu System -> Set Set Text Editor...
Anim ation O p tio n s - để chỉnh lại thời
gian giữa các khung hình và số khung Set ^ n a tio n Options..

hình trên giây để thực hiện mô phỏng S e t Sim ulator O p tio n s ,..

tương đối giống thực tế hơn:


R e store D e fa u lt S e ttin g s

j i i i r i i f || J jx j

Simulation speed" ------------- Animation Options---------------- :


Frames per Second: 1 Show Voltage & Current on Prcibe;? ỹ :
Timestep per Frame: 1ClOrn Show Logic State of Pirn? y ;
Single Step Time: 5ũrn Show Wire Voltage by Colou:’-1
Max. SPICE Tirnestep: 125m show Wire Current with Arro \
Step Animation Rate:
h

---------Voltage/Cutrerit Ranges'
Maximum Voltage: [s S PỊC Ĩ Dption;

Current Threshold: ỊĨŨ


OK I -j-.re i

258
A I N I M I À H n o N G tfjfl I f HỌC CHƯƠNG I: KẢM CÁI vtfl LEI MATIẬM

Khi cửa sổ mới hiển thị, bạn hãy chỉnh thông số của số khung hình
trên giây(Frames per Second) là 5 và thời gian hiển thị cùa mỗi khung hình
(Timestep per Frame) là 100 như hình dưới và nhấn OK.
Sau đó bạn lại nhấn Play để mô phỏng. Và lần này việ c mô phỏng sẽ
chính xác hơn so với khi bạn không chỉnh. Tuy nhiên, v ớ i LE D m a trậ n b ạ n
nên lắp mạch thực tế đ ể đảm báo độ chính xác

■ 10
H9

o R1
«7
*6
£ ............ I ....... ■5
■4
^5=
■3
■2
■1 B
■0 ■
221EXT>'
<TEXT>-

Trong bài tập trước, cá c bạn đã làm quen với phương pháp điều khiển
LED ma trận để sáng m ộ t ký tự trong bảng m ã A S C II với các thô ng số chú ng
ta phải tự tìm từ bả ng và thê m và o cho m àng trong chương trình ch ú n g ta.
Ngoài ra bạn đọc cũng biết m ô phỏn g m ạch th iế t kế từ A rdu in o với
chương trình Proteus.
Trong các bà i tập sau chú ng ta sẽ lập trình cho LED ma trận với mức
độ phức tạp hơn, thực hiện điều khiển các LED đơn trên LED ma trận.

257
CHƯƠH61: ệlẢM CÀI i l l LEI HA TlAW l— m ic w w ilin

Đ IEU KH IỂN LED Đ 0N TR ÊN LED M A ĨR Ậ N


Có thể dùng các hàm do chúng ta tạo ra để tao ra C 3 C niêu ứng tưon;
tự như với các LED đơn. Nhưng trong bài tập này thay vi cnúng ta tạo ra cac
hiệu ứng đã thực hiện trong bài tập trước thi chúng ta sẽ tnực nién tạo ra cac
hiệu ứng hoạt họa di chuyển trên LED ma trận.

Hoạt dộng của chương trình

Trong chương trình này,


Bạn sẽ cho sáng viền bao xung
quanh LED ma trận sau đó bạn
sẽ cho một pixel (một điểm trên
LED ma trận) di chuyển theo một
hình vuông nhò bên trong vùng
viền mà chúng ta tạo ra. Và pixel
sẽ di chuyển theo dấu mũi tên như
hình bẽn.
Phần cứng
Sau khi đã làm quen với
các LED ma trận và tìm hiểu
nguyên lý hoạt động cùa chúng.

Trong bài tập này chúng ta sử dụng một bộ LED ma trặn 8x8 (64
LED) và các điện trở để hạn dòng cho LED ma trận. Ngoài ra các bạn cũng
có thể dùng thêm các transistor để kéo dòng cho LED ma trận.
• LED ma trận 8x8.
• 8 điện trỏ hạn dòng 220 ohm.
Kết nối phẩn cứng

Bạn hãy kết nối mạch như hình trang bên với các điên trỏ hạn dõng
cho LED ma trận và chúng ta sử dụng thêm hai chân tương tự cùa bo mach
Arduino là A4 và A5 để kết nối với các ngô vào của các hàng LED.

Bạn kết nối với bo mạch Arduino như bảng trang bên

Hình trang bên là ảnh kết nối mạch trên Proteus.

Phần mém
Chương trinh được viết ở Irang bên cỏ nhiệm vụ thực hién quét LED ma
trận liên tục. Và chúng ta sẽ tạo các hám có thể điều khiển các đ iể "i LED riẻng
lẻ. Từ đó thiết lập các hiệu ứng mà bạn muốn hoăc tạo thêm các nam có thể
điều khiển đơn giản hon dựa và các hàm cơ bàn trong chưang T i " ',a y .

258
U M IM IẰ M c n n r t ấ i T í iq c CHƯƠNG l : QQẢNC CẢI v đ l LĨD HA TEẬM

BO M ẠC H A R D U IN O LED M A T R Ậ N

C hân số 0 Q ua điện trở đến C ộ t 0

C hân số 1 Q ua điệ n trồ đến C ộ t 1

C hân số 2 Q ua điện trỏ đến C ộ t 2

C hân số 3 Q ua điện trở đến C ộ t 3

C hân số 4 Q ua điện trở đến C ộ t 4

C hân số 5 Q ua điện trò đến C ộ t 5

C hân số 6 Q ua điên trỏ đế n C ôt 6

C hân số 7 Q ua điện trở đế n C ộ t 7

C hân số 8 H àng 0

C hân số 9 H àng 1

C hân số 10 H àng 2

C hân số 11 H àng 3

C hân số 12 H àng 4

C hân số 13 H àng 5

AN 5 (C hân tương tự 5) H àng 6

AN 4 (C hân tương tự 4) H àng 7

253
CHưưm6: gnaw CÁI »11 IfIMẪ TiẠi U W W it W M Im

Chương trình diều khiển LED dơn trẽn LED ma trận:


// Diều khiển LED đơn trên LED ma trận

// Biến dùng đề chúng ta quét cột

unsigned int LEDCol=0B1;

// Mảng chứa dữ liệu hiền thị

unsigned char LEDData[8];

// Hàm rút các bit riêng lẻ từ một biến

boolean Bitstate(char val, char pos)


{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & val>>pos;
xbit=xchar;
return xbit;
)
// Diều khiển LED đơn sáng

void SetBit(char x.char y)


{
LE D D ata[x]=LED D ata[x]l1«y;
}
// Tắt LED dơn

void ClearBit(char x.char y)


{
int xchar;
xchar=-(1 « y ) ;
LEDData[x]=LEDData[x] & xchar;
}
// Hàm thay đổi/ cột

void ChangeColỊ)
{
for(int i=0;i<8;i++)
{
digitalWrite(i, BitState(LEDCol.i)):
}
AINIM l«M CIO kCưđl rặ RỌC CHƯƠNG (: SUÁKE CÁI v ỉl LED MA TRẬN

)
// Hàm thay đ ổ i dòng
void C hangeR ow (char index)
{
for(int i=0;i<6;i++)
(
digitalW rite(i+ 8,!B itS tate(LE D D ata[index],i));
)
digitalW rite(A5, !B itS ta te(LE D D ata [inde x],6 ));
digitalW rite(A4, !B itS ta te(LE D D ata [inde x],7 ));
}

// Tắt hết các cột


void ClearCol()
(
for(int i=0;i<8;i++)
{
digitalW rite(i,0);
)
}

// Tất hết các dòng


void ClearR ow ()
{
for(int i=0;i<6;i++)
í
digitalW rite(i+8,1);
)
digitalW rite(A5, 1);
digitalW rite(A4, 1);
}

// Quét LED ma trận


void LED M atrix()
{
for(int i= 0;i<8;i++)
(
C learC ol();
C learR ow ();

261
CHƯếlK i (D À H t C ÁI » l l l i l IM TBẬH i n f 1 1 1 C lt K H I T Ị K

ChangeColO;
ChangeRow(i);
delay(5);
LE D C ol=LE D C ol«1;
if (LEDCol==0x100) LEDCol=OB1;
}

// Delay hiển thị


void DelayDislay(int xtime)
{
for(int t=0;t<xtime;t++){
LEDMatrixO;
}
}
// Chương trinh khởi tạo
void setupO
{

// Thiết lập ngõ ra cho các chân nối với LED ma trận
for(int i=0;i<14;i++)
{
pinMode(i,OUTPUT);
}
pinMode(A4,OUTPUT);
pinMode(A5 OUTPUT);
// Tạo viền cho LED ma trận
for (char i=0;i<8;i++)
(
SetBit(O.i);
SetBit(i.O);
SetBit(7,i);
SetBit(i,7);
}

// Vòng lặp chính


void loopO
{
in t p ;

»s?
U I W I A W C H P K tftfl T ự MỌC CHƯƠNG l : QUẢNG C Â B M đ l l£ P M A T 8 Ậ «

// Hiệu ứng chạy ngang


for(p=2;p<6;p++)
{
SetBit(p,2);
DelayD islay(IO );
ClearBit(p,2);
}
// Hiệu ứng chạy dọc
for(p=2;p<6;p++)
{
SetBit(5,p);
DelayD islay(IO );
ClearBit(5,p);
]

// Hiệu ứng chạy ngang


for(p= 5;p >1 ;p -)
{
SetBit(p,5);
DelayD islay(IO );
ClearBit(p,5);
)

// Hiệu ứng chạy dọc


for(p=5;p>1;p~)
(
SetBit(2,p);
D elayD islay(IO );
C learBit(2,p);
}
}
Hãy viế t chương trình, biên dịch và tải xuố ng bo m ạch A rduino. Nếu
mạch hoạt động chính xác và kết nối m ạch đúng thì bạn sẽ thấy LED ma trận
xuất hiên m ột vòn g viề n và m ột hiệu ứng dịch chu yển LED của LED m a trận.
Tìm hiểu phần mềm
Ngay đầu chương trình, ch ú n g ta thực hiện khai báo cá c biến chứa
trạng thái của các hàng cá c cột cũa LED ma trận. Vi là quét cộ t nên bạn cần
khởi tạo giá trị ban đầu cho biế n LE D C ol là 1 và dữ liệu củ a ký tự sẽ nằm
trong các phần tử của m ảng LED Row:
Ctttfdw»; ẹgẢHCCÀI nil L£l HAĨIẦM UMHUMCtlKHlTfK

unsigned int LEDCol=0B1;


unsigned char LEDData[8];
Tiếp theo là hàm rút bit từ biến:
boolean BitState(char val, char pos)
{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & val>>pos;
xbit=xchar;
return xbit;
}
Tiếp theo, chúng ta sẽ đến với hàm thiết lập sáng cho các LED đon.
nhiệm vụ của hàm này là làm điểm LED có tọa độ X, y sáng:
void SetBit(char x.char y)
{
LEDData[x]=LEDData[x]l1 <<y;
}
Trong hàm
trên bạn có thể thấy
chúng ta sẽ thiết lặp
sáng các LED đơn lẻ
bằng cách thay đổi dữ
liệu của mảng
LEDData. Trong LED
ma trận chúng ta sử
dụng tọa độ Oxy
ngược với tọa độ Oxy
thường thấy trong toán
học. Hình bẽn thể hiện
hệ trục tọa độ Oxy của
LED ma trận nói
chung và các màn
hình nói riêng.

Bạn có thể thấy điểm o là LED đang sáng. Có toa đó y . ỉ 0.0 Va


hướng từ trái sang phải là chiều tăng của trục X và chiều táng cũ ĩ z y la tư
trẽn xuống dưới. Để thực hiện thiết lặp sáng cho môt điểm tr,I 'a sẽ
phải thiết lập mức cao cho dữ liệu ứng với tọa đò cùa LED đó

264
U M M DANH CHO NGƯƠI Tự HỌC CHƯƠNG (: qOẦNt CÁO v j l IE D MA TKẬH

Để thực hiện điểu này chú ng ta sẽ dùng toán tử OR “ I” . Và dùng toán


tử dịch trái bit 1 để tạo m ặt nạ bít cho phép tính như trên. Đ ể hình dung rõ
hơn, bạn hãy xem ví dụ sau.
Giả sử, bạn m uốn LED tại tọa độ 3,4 sáng. Thi chú ng ta chọn biến dữ
liệu(LEDData[3]) ở cột 3 ứng với trụ c X và thiế t lập mức cao cho bit 4 của dữ
liêu này. Để th iế t lập mức cao cho bit 4 thi chúng ta thực hiện phép OR dữ liệu
với mặt nạ bit 0B 00001000.
Phép tính mà chương trình sẽ thực hiện như sau:
1 « 4 = 0b00001000(đây là m ặt nạ bit)
O bxxxxxxxxx(dây là dữ liệu cộ t 3 và X là dữ liệu ban đầu của cộ t 3)
0b xxxx1xxx(d ây là dữ liệu mới sẽ giúp chú ng ta thiế t lập sán g cho
LED đơn)
Sau đó chúng ta tiếp tục tạo hàm tắt LED cho chương trình:
void C learB it(ch ar x.cha r y)

{
int xchar;
x c h a r = ~ ( 1 « y );

LE D D a ta [x]= LE D D ata[x] & xchar;

)
Hàm này cũng tương tự như hàm sáng LED chỉ khác là chú ng ta dùng
toán tử AND với đảo củ a m ặ t nạ bit dùng trong hàm sáng LED.
Tiếp theo là hàm điều khiển các cột của LED ma trận:
void C hangeC ol 0

{
for(int i= 0;i< 8;i+ + )

{
d ig ita lW rite (i,B itS tate(LE D C o l,i));

)
}
Sau đó chú ng ta sẽ tạo hàm để thực hiện việ c xuất dữ liệu cho LED
ma trận khi qu ét từng cột:

void C h an geD ata(ch ar index)


{
for(in t i= 0;i< 6;i+ + )

265
ChJUNt t : BQÁH6 C ẦI n i l I f I H A T IẬ I U M M U B C n K N lT fW

(
digitalWrite(i+8,!BitState(LEDData[index],i)):
}
digitalWrite(A5, !BitState(LEDData[index].6)):
digitalWrite(A4, !BitState(LEDData[index],7)):

}
Và trong bài này chúng ta sẽ tạo thêm hai hàm để tắt các dòng và các
cột cho LED ma trận tránh hiện tượng bị nhiễu khi tạo hoại họa:
void ClearCol()

{
for(int i=0;i<8;i++)
{
digitalWrite(i,0);
}
}
void ClearRowQ
(
for(int i=0;i<6;i++)
{
digitalWríte(i+8,1);
)
digitalWrite(A5, 1);
digitalWrite(A4, 1);

}
Tiếp theo là hàm quét LED, hàm bài này chúng ta sẽ tnêm các phán
chống nhiễu cho LED:
void LEDMatrixQ
{
for(int i=0;i<8;i++)

{
ClearColO;
ClearRow();
ChangeColQ;

2E6
A im H I Ằ B CIG IGỨđl Tự BỌC CHƯƠNG 6: QUẢNG CÁO v íl LED MẲ THAN

C han geR ow (i);


delay(5);
L E D C o l= L E D C o l« 1 ;
if (LE D C ol== 0x1 00 ) LED C ol=O B1;

}
)
Cuối cùng chú ng ta sẽ lập trình hàm tạo thời gian đợi và thực hiện
quét LED trong lúc đợi. Nếu bạn dùng hàm delay bình thường thì LED m a trận
sẽ tắt khi chương trình chạ y đến hàm delay. Vì vậy chú ng ta sử dụng hàm này
dể giải quyết sự khó khăn đó:
void D elayD isla y(in t xtim e)
{
for(int t= 0 ;t< xtim e;t+ + ){
LEDMatrixO;
}
}
Sau khi khai báo các biế n và hàm chú ng ta sẽ đến với chương trinh
khởi tạo, ngoài những khởi tạo các chân ngõ ra như bà i tập trước thi trong bài
này chúng ta sẽ tạo m ột khung v iề n cho LED ma trận bằng các hàm SetB it:
void setupO
{
for(int i= 0;i< 14 ;i+ + )
{
pin M o d e (i,O U TPU T);
}
p in M o d e (A 4 ,O UTPUT);
p in M o d e (A 5 ,O UTPUT);
for (char i= 0;i< 8;i+ + )
{
SetBit(O.i);
S etB it(i,0);
S etB it(7,i);
S etB it(i,7);
}
}
Chương trình chinh chú ng ta có nhiệm vụ sẽ qu ét LED và tạo hiệu ứng
ho LED ma trận.

?67
C ỊỊƯ ỊỊK 6 : ỊỊU Ả N 6 C Ấ I w f l l f l H A H Ậ N u M n m c im W ir m

Hiệu ứng đầu tiên là làm một pixel cùa LED ma trán chạy từ trai
sang phải:
void loopO
{
int p;
for(p=2;p<6;p++)
{
SetBit(p,2);
DelayDislay(IO);
ClearBit(p,2);
)
Trong bài tập này chúng ta dùng vòng lặp for để thực hiện việc di
chuyển từng pixel dựa và hàm SetBit. Mỗi lần di chuyển pixel chúng ta cho
chương trình đợi một khoảng thời gian ngắn và xóa pixel đã hiển thị rối lại di
chuyển đến pixel tiếp theo.
Và các hiệu ứng sau để tạo thành một hinh vuông kin:
for(p=2;p<6;p++)
{
SetBit(5,p);
DelayDislay(IO);
ClearBit(5,p);
}
for(p=5;p>1;p~)
{
SetBit(p,5);
DelayDislay(IO);
ClearBit(p,5);
)
for(p=5;p>1 ;p--)
{
SetBit(2,p);
DelayDislay(IO);
ClearBit(2,p);
}
a i h im iằ m i a o Nttfjfl Tự HỌC CHƯỬNS S: QUẦNG CÁO v íl LED MA ĨIẬN

BIỂN THỊ Kí ĩ ự TR ÊN M A ĨR Ậ N 16X8 ( C ộ ĩ CATHODE)


Trong các bài trước bạn đã thực hiện hiển thị hay điều khiển trê n m ột
module LED ma trận 8x8. V iệ c hiển thị trên m ột LED ma trận 8x8 là khá hạn
hẹp và bạn sẽ cảm thấy chú ng quá nhỏ để hiển thị m ột chu ỗi kí tự nào đó.
Trong bài này chúng ta sẽ thực hiện mở rộng số lượng LED m a trậ n để hiển
thị các kí tự.
Trong bài tập này bạn sẽ hiển thị các kí tự “S T K ” trên m ột LED ma
trận 16x8. Các chân của bo m ạch A rduino không đủ đáp ứng cho LED ma
trận 16x8 nên chú ng ta sẽ sử dụng thêm IC ghi dịch để mở rộng số châ n của
board mạch A rduino và chủ yếu là ph ục vụ việ c qu ét LED m a trận.
M ột LED ma trận 16x8 có thể ghép từ hai LED m a trận 8x8 và sử
dụng thêm hai thanh ghi dịch 74H C 595. ở các bà i trước, để qu ét LED thì bạn
sử dụng đến 8 chân từ bo m ạch A rduino. Nhưng trong bài tập này bạn chỉ sử
dụng 2 chân để qu ét LED và 8 chân để cấp dữ liệu cho LED ma trận ứng với
tửng cột.

Tìm hiểu thanh ghi djch

Thanh ghi dịch cho ph ép các: giá trị vào nối tiếp và xuấ t những giá trị
đó thành ngõ ra song song.
Thông thưởng, chú ng được sử dụng để kiểm soát số lượng lớn các
đèn LED, chẳng hạn như được sử diụng để điều khiển LED 7 đoạn hoặc LED
ma trận.

Trước khi bạn sử dụng thanh


ghi dịch cho chương trình bạn, hãy
xem sơ đổ trong hình bên, trong đó
cho thấy các yếu tố đẩu và o và đầu
ra cho m ột bộ ghi dịch và o nối tiếp
ra song song. C ác xung đầu vào sẽ
quyết định trạng thá i c ủ a các giá trị
ngõ ra.

Tám vòng tròn đạ i diện cho 8 đèn LED kết nối với đẩu ra của bộ ghi
dịch. Ba yếu tố đầu là dữ liệu nối tiếp (Data), xung (Clock) và m ột chân cho
phép xuất dữ liệu (Latch).

269
cnưưNi >: l i m CÁI »ẩi t a MATIẬI U M C W H IH »

Gửi dữ liệu song song và nối tiếp


Có hai cách cơ bản để gửi nhiểu bit dữ liệu Nhd lai rằng bo mạcr.
Arduino, giống như tất cả các vi điều khiển khác, các chân số chì có the nhỉr
giá trị rời rạc là 0 và 1. Vì vậy, nếu bạn muốn đù dữ liệu dể kiểm soát tán
chân kỹ thuật số (mức 0 hoặc 1), bạn cần phải tim một cách để truyển tã
tổng cộng 8 bit thông tin. Trong chương trước, bạn đã làm điếu này bằng cách
cách sử dụng các hàm digitalWrite 0 và analogWrite ( ) để khống ché' nhiéu
chân I/O. Một ví dụ về truyền tải thông tin song song, giả SỪ ràng bạn đã bàt
tám đèn LED với 8 chân đầu ra số, tất cả các bit sẽ được truyến trên các
chân I/O độc lập tại một khoảng thời gian tương tự. Trong khi học truyén thông
nổi tiếp bạn đã học về truyền nối tiếp, truyền 1 bit dữ liêu theo thời gian
Thanh ghi dịch cho phép bạn dễ dàng xuất dữ liệu từ đầu vào nối tiếp thành
những đầu ra song song. Chương này tập trung vào thanh ghi dịch nổi tiép
sang song song. Với những IC hiện nay, bạn có thể "chuyển" nhiéu byte dữ
liệu nối tiếp, rồi xuất chúng từ các thanh ghi dịch trong một thời gian như
nhau. Bạn cũng thể dùng chúng để nối ghép với nhau thành một hệ thống
gồm hàng trăm chân I/O mà chỉ cần tốn 3 chân trên bo mạch Arduino cùa bạn
mà không cần sử dụng bất kl vi điều khiển nào khác.
Tìm hiểu IC 74HC595A
Mô tả chung
IC 74HC595A được sản xuất bãi công ty “ON semiconductor" vào tháng 3
năm 2000 theo công nghệ LLC (SCILLC). IC 74HC595A là IC ghi dịch 8 bit kết hợp
chốt dữ liệu, đầu vào nối tiếp, đầu ra song song. Chấp nhận tín hiệu ghi thay dổi nói
tiếp và cung cấp một đầu ra nối tiếp. Ngoài ra thay đổi ghi cũng cung cáp dữ liêu
song song với chốt 8 bit. Ghi thay đổi và chốt có đầu vào xung nhịp độc lập, điếu
này thiết lập lại không đống bộ cho chuyển đổi cách ghi. 74HC595A giao diện trực
tiếp với SPI chuỗi dữ liệu trên cổng CMOS, MPUs và MCUs.
■ Đấu ra trực tiếp cho giao diện CMOS, NMOS và TTL.
• Phạm vi hoạt động điện áp: 2.0 đến 6.0V.
■ Đầu vào hiện tại thấp: 1.0 A.
■ Khả năng chống tiếng ổn cao cùa thiết bị CMOS.
■ Phù họp với các yêu cầu xác định tiêu chuẩn.
• Chip có cấu tạo phức tạp.
Cải tiến HC595
■ Cải tiến sự truyềri chậm .
• 50% tĩnh điện thấp.
• Cải thiện truyền tín hiệu đầu vào.

270
u m m i à m c m k Mi i ự i ị c C H lK I: H Ả K CÁI vtl IE» MA TIẬN

Chức năng: D ùng trong các


08 [ 1 *
mạch quét LED 7 đoạn, LED m atrix...
Get ĩ
Sđ dó ch ân cùa 1C
G ot ỉ ụ ]A
ŨỊ [ 5 13 ] OUTPOT E?4A3U
ũệf 5 n H A T C H ClOCK
16 Oa [ 6 11 ]S H ỈF T CLOCK

CH [ 7 10 ] BESET
1
C-ívD [ s <5 ] 5Qh

Giải thích m ột s ố chân quan trọng

C h ân 14: D ãy dữ liệu vào. Dữ liệu trên chân thay đổi thành 8 bit thay
đổi theo thứ tự ghi. Đ ẩu và o dữ liệu nối tiếp. T ại m ột thời điểm xung clock chỉ
dựa vào 1 bit.

C hân 11: T hay đổi ghi xung C lock vào. Q uá trình chuyển đổi từ thấp
đến cao đầu vào dữ liệu và đầu và o nối tiếp để chuyển tới 8 bit thay đổi.

C hân 10 (T h iế t lậ p lạ i ): H oạt động thấp, thay đổi cách ghi không


đồng bộ thiết lập đầu vào. T rên chân này th iế t lập lại sự thay đổ i ghi tỉ lệ củ a
thiết bị này thấp. C h ố t 8 bit là không bị ảnh hưởng. Khi chân này ở mức thấp
(mức 0) thì dữ liệu sẽ bị xỏa trên chip.

C h ố t C lo c k (c h â n 12): C h ốt và o xung nhịp lưu trữ. C huyển tiế p vào


đầu vào nhỏ, chố t dữ liệu ghi thay đổi. Khi có xung clock tích cực à sườn
dương thì cho p h ép xu ấ t dữ liệu trên các chân.

C hân 13: C ho phép đầu ra hoạt động ỏ mức thấp. Đầu vào ở mức tháp
cho phép các dữ liệu ở các chố t được đưa ra tại các đầu ra, mức cao nhất trên
đầu vào ảnh hưởng đến kết quả đầu ra (Q A-Q H ). 0 tình trạng trở kháng cao,
đầu ra nối tiếp không bị bộ phận này điều khiển. Khi à mức cao, tất cả các đầu
ra trò về trạng thái cao trở kháng, không có đầu ra nào được cho phép.

Đ ầu ra: Q A - QH (C h â n 15,1,2,3,4,5,6,7)
X uất dữ liệu khi chân 13 tích cực ở mức thấ p và có m ột xung tích cực
ra sườn âm.

Chân 9 (SQ H)
Không liên quan, dãy dữ liệu đầu ra. Đ â y là đầu ra củ a giai đoạn thứ
8 của sự thay đổi ghi 8 bit. Đ ầu này không có khả năng ở 3 trạng thá i. Chân
dữ liệu nối tiế p nhau thì chân này đưa đầu và o củ a con tiếp theo khi đã dịch
đủ 8

271
CBƯđHt l: ABÁHt CẮI I I I t a BA TIẬI

Nguyên lý hoạt động

“ l_ LATCH- —o
—*0
DATA
—*0
—Ộ
CLOCK —o

h -0
LATC H — • eJ 1 — 0
t? 0 —0
DATA.— - *
*5
tỉ * —Ộ
C£ 0 —o
Ẽ 0
—Ọ
CLOCK — • ề • —0
0
V -........ J
—0
------ ^
6
k.
LATCH— • ỈD 1 LATCH---- > 01
V? 0 «1
§? *
DATA— ♦ cS 0 DATA— * 1 —0
J —o
£ c *--*
CLOCK— - jE
5 * CLOCK— UÌ

r—o
uw L ATC H -
—Ọ
DATA-
—o

—* 0
_n< 1CLO CK- —0
—*o

L A TC H *
—o
—* o
DATA-
— 0
JZ —►0
CLOLK- V)
—*9
I— o
1C 74HC595A hoạt động theo nguyên tắc của bộ ghi dịch nối tiếp phả
có lối ra song song và nổi tiếp. Coi hình trên để hiểu thêm về cách hoạt động
của 1C: Khi cho một xung cạnh âm tác động vào lối vào xóa các lối ra Q cùi
cả 8 FF trong 1C đểu ở trạng thái 0.

Ỉ7 Z
A1N IM IẦ M can W6ƯƠI Tự HỌC CHƯƠNG 6: QUẢNG CÁO vdl LED MA THẬN

M uốn ghi ta phải dưa cá c bit thông tin nối tiế p vế thời gian tru yề n lần
lượt vào lối vào nói tiếp theo sự điểu khiển đồng bộ của cá c xung nhịp. Cứ
sau mỗi xung nhịp, trạng thái củ a các FF lại được xác lập theo thô ng tin ở lối
vào D của nó. Sau khi kết thú c quá trinh ghi muốn đưa dữ liệu ra ở các lối ra
song song ta đặt mức 1 ở lối điều khiển ra, lối ra của cá c cửa A N D ở lối ra
song song sẽ được xác lập theo trạng thái Q1, Q2, Q3, Q 4, Q5, Q 6, Q7, Qs
cùa các FF trong IC. T rong cách điểu khiển dữ liệu ra song song này thông tin
trong bộ ghi vẫn được duy trì. Để điều khiển dữ liệu ra nối tiếp, ta tác động
một nhóm 8 xung nhịp cũn g ở lối vào điều khiển ghi. Sau 8 xung nhịp tác
dộng 8 bit dữ liệu lần lượt được đưa ra khỏi IC.
Hoạt động của chương trình
Trong chương trinh này, bạn sẽ tiếp tục tạo ra cá c ký tự trên m ột LED
ma trận lớn hơn. C húng ta sẽ mở rộng số lượng cộ t cho LED ma trận để thực
hiện việc hiển thị nhiều kl tự hơn. Trong bài tập này bạn sẽ dùng thanh ghi
dịch 74HC595 để tăng số lượng LED ma trận. Như bạn có thể thấy ở hình
dưới chúng ta có thể hiện thị gần hết 3 kí tự “S T K ” :

Phần cứng
Sau khi bạn đã làm quen với các LED ma trận và tìm hiểu các
nguyên lý hoạt động của chú ng thì chúng ta sẽ bắt đầu phần lắp m ạch cho
bài tập này để chúng ta tiế n hành lập trình và điều khiển LED theo nguyên tắc
hoạt động trên. Trong bài tập này chú ng ta sử dụng hai bộ LED ma trận 8x8
(128 LED) và các điện trở để hạn dòng cho LED ma trận. N goài ra các bạn
cũng có thể dùng thêm các transisto r để kéo dòng cho LED ma trận. Bạn hãy
kết nối m ạch như hình dưới. Với các điện trỏ hạn dòng cho LED ma trận,
chúng ta sử dụng thêm hai chân tương tự của bo m ạch A rduino là A4 và A5
để kết nối với các ngõ và o của các hàng LED. Bạn kết nối với bo m ạch
Arduino như bảng ở trang bên.

Z73
CHIÍƠNE 6: QQÁHG C Á I » 1 1 LEO H A TlẠM I I I * c tl K K I7 K

LED ma trận 8x8 (x2) . Điên trở hạn dòng 220 0hm(x8)
M V
- J U J -
. Chip 74HC595(x2)

BO MẠCH ARDUINO IC X LED MA TRẬN X


15 Cột 0
1 Cột 1
2 Cột 2
3 Cột 3
4 Cột 4
5 Cột 5
6 Cột 6
7 Cột 7
11
Chân số 0
12

Chân số 1 14

Chân số 8 Qua điện trở đến hàng ũ

Chân số 9 Qua điện trỏ đến hàng 1

Chân số 10 Qua điện trà đến hàng 2

Chân sổ 11 Qua điện trờ đến hàng 3

Chân số 12 Qua điên trò đến hàng 4

Chân số 13 Qua điện trà đến háng 5

AN 5 (Chân tương tự 5) Hàng 6

AN 4 (Chân lương tự 4) Hảng 7

274
I AimWMM CMKếếlTựiẹC CHƯỨNẼI: qaẢNG CÁS VỂI LED MA TRẬN

C hú ý : Nếu bạn sử dụng các LED đóng g ó i sẫn thì bạn nên dọc tà i liệu
kỹ thuật của chúng đ ể b iế t cách sấp xếp chân của LED ma trận. Có th ể LED
ma trận các bạn sử dụng khác với LED ma trận trình bày trong sách, vì vậy
bạn nẽrì tìm tài liệu kỹ thuật của chúng đ ể kết n ố i m ạch m ột cách chính xác.
Dể ghép tầng cho 1C 74HC595 thì bạn p h ả i n ố i chân 9 của 1C trước với chân
số 14 của 1C sau. Có nghĩa là : N ếu bạn muốn mở rộng từ 8 chân trở lên bạn
phải sử dụng đến chân dữ liệu ngõ ra n ố i tiếp cùa 1C trước nố i với chân dữ liệu
vào nối tiếp của 1C sau.
Hình kết nối m ạch trên Proteus:

UI
DUIN01
ầầ

* 1

' I ' »■
IX : Ị
ỹ ì" ĩ 5■
M ử ỉ
ARDUINO UNO R3

7P8
f2Q20
T

Phần mềm
Chương trinh được viế t ở trang bên. Chương trình này có nhiệm vụ
thực hiện quét LED m a trận liên tục. T hay vì qu ét LED 8x8 như các bài tập
trước chúng ta sẽ thực hiện quét LED 16x8 trong bài này. Đ ố i với LED 8x8
chúng ta sẽ qu ét 8 cột, cò n LED 16x8 cìiú n g ta sẽ phải quét 16 côt.

Z75
CHƯƠNG G: QUÀNG C ÁI v ỉ l LED MA TVẠM M H M a im im ặ

Chương trinh hiển thị kí tự trên LED ma trận 16x8:


II Hiển thị kí tự trên LED ma trận 16x8
#include <avr/pgmspace.h>

// Các chân điều khiển 1C


#define Data 1
#define CLK 0

// Mảng chứa dữ liệu quét


unsigned char LEDData[16];

// Chuỗi hiển thị để chúng ta cuộn, bạn có thể thêm nội dung bát kì
unsigned char Text[]="STK” ;

// Dữ liệu font chữ 5x7


static uint8_t System5x7[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00,// (space)
0x00, 0x00, 0x5F, 0x00, 0x00,//!
0x00, 0x07, 0x00, 0x07, 0x00,//"
0x14, 0x7F, 0x14, 0x7F, 0x14,// #
0x24, 0x2A, 0x7F, 0x2A, 0x12,//$
0x23, 0x13, 0x08, 0x64, 0x62,// %
0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x05, 0x03, 0x00, 0x0 0,//'
0x00, 0x1 c , 0x22, 0x41, 0x00,// (
0x00, 0x41, 0x22, 0x1 c , 0x00,//)
0x08, 0x2A, 0x1 c , 0x2A, 0 x 0 8 ,//’
0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x50, 0x30, 0x00, 0x00,// ,
0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x60, 0x60, 0x00, 0x00,//.
0x20, 0x10, 0x08, 0x04, 0 x0 2 ,///
0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x42, 0x7F, 0x40, 0x00,//1
0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x21, 0x41, 0x45, 0x4B, 0x31,// 3

276
u m m i Ằ i a CIO ncưai Tự ngc CUƯƠNSI: QUÀNG CẤQ VƠI LED MA THẬN

0x18, 0x14, 0x12, 0x7F, 0x10,//4


0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x3C, 0x4A, 0x49 , 0x49, 0x30,//6
0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x06, 0x49, 0x49, 0x29, 0x1 E ,//9
0x00, 0x36, 0x36, 0x00, 0 x0 0 ,//:
0x00, 0x56, 0x36, 0x00, 0 x0 0 ,//;
0x00, 0x08, 0x14, 0x22, 0x41,//<
0x14, 0x14, 0x14, 0x14, 0x14,// =
0x41, 0x22, 0x14, 0x08, 0x00,// >
0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x32, 0x49, 0x79, 0x41, 0x3E,// @
0x7E, 0x11, 0x11, 0x11, 0x7 E ,//A
0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x3E, 0x41, 0x41, 0x41, 0 x 2 2 ,//c
Ox7F, 0x41, 0x41, 0x22, Ox1C,//D
0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x7F, 0x09, 0x09, 0x01, 0x01,// F
0x3E, 0x41, 0x41, 0x51, 0x32,// G
0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x41, 0x7F, 0x41, 0 x 0 0 ,//1
0x20, 0x40, 0x41, 0x3F, 0x01 ,//J
Ox7F, 0x08, 0x14, 0x22, 0x41 ,//K
0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x7F, 0x02, 0x04, 0x02, 0x7F,// M
0x7F, 0x04, 0x08, 0x10, 0x7 F,// N
0x3E, 0x41, 0x41, 0x41, 0X3E.//O
0x7F, 0x09, 0x09, 0x09, 0x06,// p
0x3E, 0x41, 0x51, 0x21, 0X5E.//Q
0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x46, 0x49, 0x49, 0x49, 0 x 3 1 ,//s
0x01, 0x01, 0x7F, 0x01, 0 x 0 1 ,//T
0x3F, 0x40, 0x40, 0x40, 0x3F,// u
0x1 F, 0x20, 0x40, 0x20, 0x1 F,// V
0x7F, 0x20, 0x18, 0x20, 0x7F ,//W

277
CHƯ0N61: ỊIẢIK CÁI nil LH IU T»ẠH u M C H M W iĩf»

0x63, 0x14, 0x08, 0x14, 0 x 6 3 ,//X


0x03, 0x04, 0x78, 0x04, 0x03,// Y
0x61, 0x51, 0x49, 0x45, 0 x4 3 ,//z
0x00, 0x00, 0x7F, 0x41, 0x41,// [
0x02, 0x04, 0x08, 0x10, 0x20,// "V
0x41, 0x41, 0x7F, 0x00, 0x00,// ]
0x04, 0x02,0x01, 0x02, 0 x0 4 ,//A
0x40, 0x40, 0x40, 0x40, 0x4 0 ,//_
0x00, 0x01, 0x02, 0x04, 0 x0 0 ,//'
0x20, 0x54, 0x54, 0x54, 0x78,// a
0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x38, 0x44, 0x44, 0x44, 0x20,// c
0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x38, 0x54. 0x54, 0x54, 0 x 1 8 ,//e
0x08, 0x7E, 0x09. 0x01, 0 x0 2 ,//f
0x08, 0x14, 0x54, 0x54, Ox3C,//g
0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x44, 0x7D, 0x40, 0 x 0 0 ,//i
0x20, 0x40, 0x44, 0x3D, 0x0 0,//j
0x00, 0x7F, 0x10, 0x28, 0x44,// k
0x00, 0x41, 0x7F, 0x40, 0x00,// I
0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x38, 0x44, 0x44, 0x44, 0x38,// o
0x7C, 0x14, 0x14 0x14, 0 x 0 8 ,//p
0x08, 0x14, 0x14, 0x18, 0x7C,// q
0x7C, 0x08, 0x04 , 0x04, 0 x 0 8 ,//r
0x48, 0x54, 0x54, 0x54, 0x20,// s
0x04, 0x3F, 0x44, 0x40, 0 x 2 0 ,//1
0x3C, 0x40, 0x40 0x20, 0x7C,// u
0X1C, 0x20, 0x40 , 0x20, 0x1 C.//V
0x3C, 0x40, 0x30 , 0x40, 0x3C,// w
0x44, 0x28, 0x10, 0x28, 0x44,// X
OxOC, 0x50, 0x50 , 0x50, 0x3C ,//y
0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x00, 0x08, 0x36. 0x41, 0x00,// {

Í7 8
UNIDO IẦM CIO NCƯƠI Tự HỌC C M C I : QUẢNC CAO wưl LED MA TBÃN

OxOO, 0x00, 0x7F, 0x00, 0x0 0,// I


0x00, 0x41, 0x36, 0x08, 0 x 0 0 ,//}
0x08, 0x08, 0x2A , 0x1 c, 0 x 0 8 ,//->
0x08, 0x1 c, 0x2A, 0x08, 0x08 // <-

};

// Hàm rút các bit riêng lẻ tử m ột biến


boolean B itsta te (ch a r val, char pos)

(
boolean xbit;
unsigned char xch a r= -1 ;
if (pos<16) xchar=0x1 & v a l» p o s ;
xbit=xchar;
return xbit;
}

II Hàm chuyền k í tự thành d ữ liệu quét


void TextToDataQ
(
int j;
for(int i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
LE D D ataO + i*5+ i]=pgm _read_byte(S ystem 5x7 + (T e xt[i]-32 )*5+ j);
}
LE D D ata[j+i*5+i+1)=0;
)

// Hàm thay đổ i dòng


void C h angeD ata(char index)
t
for(int i= 0;i<6;i++)
(
d igita lW rite (i+ 8,B itS tate(L E D D a ta [ind ex],i));

?78
CHƯƯN6 8 : (ỊUẦH6 C A I » i l l ĩ l M A T»ẬH u w iw a iim iim

}
digitalWrite(A5, BitState(LEDData[index],6)):
digitalWrite(A4, BitState(LEDData[index],7));
}

// Tắt hết các dóng


void ClearData 0
{
for(int i=0;i<6;i++)
{
digitalWrite(i+8,0);
}
digitalWrite(A5, 0);
digitalWrite(A4, 0);
}

II Hàm quét LED


void LEDMatrixO
{
digitalWrite(CLK.LOW); // Đưa chân xung xuống mức thấp
digitalWrite(Data,LOW); // Dưa chân dữ liệu xuống mức thấp
for(int i=-1 ;i<16;i++)
{
ClearDataO;
digitalWrite(CLK.HIGH);// Dịch bit 1 dề quét LED
ChangeData(i);

delay(1);
digitalWrite(CLK,LOW); // Dưa chãn xung X'jống mức thấp
digitalWrite(Data.HIGH); // Dưa chẩn dữ liệu lên mức cao
}

// Chưưng trinh khởi tao


void setupO

280
U N IM IẰ M C H O NGƯƠI Tự iq c CHƯƠNG I: QUẢNG CÀO vđl LED MA HẬN

{
for(int i=0;i<14;i++)

{
pinM ode(i,O UTPUT);

}
pinMode(A4 .OUTPUT);
pinM ode(A5,OUTPUT);
// Chuyển dữ liệu k í tự thành dữ liệu quét
TextToDataO;

// Chương trình chinh


void loopO
{
LEDMatrixO;

}
Bạn hãy viế t chương trình, biên dịch và tải xuống bo m ạch Arduino.
Nếu bạn kết nối m ạch đú ng và m ạch hoạt động chinh xác thi bạn sẽ thấy
LED ma trận xuất hiện ba kí tự “ S T K ” .
Tìm hiểu phần mềm
Trong bài tập này chú ng ta sử dụng thư viện để đưa m ảng vào ROM:
#include < avr/pgm sp ace .h >
Tiếp tục chú ng ta sẽ khai báo thêm cá c chân để điều khiển cho IC
thanh ghi dịch 74H C 595 và m ảng dữ liệu cho từng cộ t khi quét. Vì cỏ 16 cột
nên bạn cần phải khai báo biế n LE D D ata có 16 phần tử:
#define Data 1
#define C LK 0
unsigned char LE D D ata[16];
Chúng ta sẽ nối chu ng các châ n Latch với các chân CLK để phục vụ
mục đlch quét LED. Nếu khô ng dùng với m ục đlch quét LED th) bạn sẽ không
nổi chung các chân xung và chân chố t của IC với nhau. G iả sử, nếu bạn
muốn mở rộng các I/O không phải sử dụng cho m ục đlch qu ét LED thl bạn sẽ
không nối chung. Nếu có m ục dlch quét LED nhưng không nổi chung hai chân
này thl nó sẽ làm giảm tốc độ qu ét LED của bạn. Và chú ng ta không m uốn
điểu này xảy ra.
T iếp tục, bạn sẽ khai báo thêm m ột chu ỗi sử dụng để hiển thị cho
chương trinh. C h uỗ i này bạn có thể thay đổi theo ý minh:

Z81
CHƯƠH6 »: HẦM CÃI nil lĩIIIA ĨIẬH_____________________________ a H M a i m i ĩ ( ặ

unsigned char Text[]='STK";


Ngoài ra chúng ta còn lạo một mảng font chứa trong ROW:
static uint8_t System5x7[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00,// (Khoảng trống)
0x00, 0x00, 0x5F, 0x00, 0x00,// /
0x00, 0x07, 0x00, 0x07, 0x00,// ”
0x14, 0x7F, 0x14, 0x7F, 0x14,// #
0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
0x23, 0x13, 0x08, 0x64, 0x62,// %

Tiếp theo là hàm rút bit từ biến:


boolean BitState(char val, char pos)
{
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & val>>pos;
xbit=xchar;
return xbit;
)

Trong bài tập này chúng ta sẽ có một hàm được sử dụng để chuyển
các ký tự tử chuỗi thành các dữ liệu cho việc quét cột, hàm này sẽ thực hiện
đọc các ký tự từ chuỗi sau đó sẽ đưa từng kí tự vào biến LEDData và mỗi ki tự
cách nhau một cột:
void TextToDataQ
{
int j;
for(int i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
LEDData[j+i*5+i]=pgm_read_byte(System5x7 +(Text[í]-32)'5+j):
)
LEDData[j+i*5+i+1 ]=0;
}
}

282
UMM1AM CIO H íiíl J f 19c CBtftfW (: QOẢNC CÁI vdl LEC MA TBẬH

Sau đó chú ng ta sẽ tạo hàm để thực hiện việc xuấ t dữ liệu cho LED
ma trận khi quét từng cột:
void C han geD ata(ch ar index)
{
for(int i=0;i<6;i++)
{
digita lW rite (i+ 8,B itS tate(L E D D a ta [ind ex],i));

}
digitalW rite(A 5, B itS tate(L E D D a ta [ind ex],6));
digitalW rite(A 4, B itS tate(L E D D a ta [ind ex],7));
}
■Và các hàm xóa dữ liệu qu ét cho LED ma trận:
void ClearDataO
{
for(int i= 0;i< 6;i+ + )
(
digita lW rite (i+ 8,0);
}
digítalW rite(A 5, 0);
digitalW rite(A 4, 0);
}
Tiếp theo là hàm q u é t LED , trong hàm quét LED chú ng ta sẽ điều
khiển dịch bit cho cá c 1C 74 H C 5 95 . V iệ c dịch bit của các 1C này sẽ khác với
các dịch bít so v á i các bà i trước:
void LED M atrixO
{
digita lW rite (C L K .L O W ); // Dưa chản xung xuống mức thấp
digita lW rite (D a ta .L O W ); // Dưa chân dữ liệu xuống mức thấp
Trong bài này bạn sẽ xuấ t dữ liệu cho 1C là mức th ấ p và đưa chân
xung xuống mức thấp để trong vòng lặp bạn sẽ thực hiện thay đổi châ n xung
đề dịch bit cho 1C.
for(in t i= -1;i< 16 ;i+ + )
{
ClearD ataO ;
d ig ita lW rite (C L K ,H IG H );// Dịch bit 1 đ ể qu ét LED
C h an geD ata(i);

2S3
CHƯƠNG 6: QUẢNG CÁI v l l LEB HA TIIẬI1 U H M I > « t llW » m »

B ạ n s ẽ t h ự c h i ệ n x ó a d ữ li ệ u s a u đ ố b a n d ỊC h m ứ c tháp t ừ c h â n dữ
liệu ra các chân ngõ ra 1C bằng cách tạo xung canh lẽn à c^ián xung và cà
chân chốt của 1C. Sau đó bạn đợi 1 miligiây và đưa chân XL^g cùa IC xuíng
mức thấp để chuẩn bị cho lần dịch sau của IC.
Ngoài ra khi quét LED bạn muốn dịch bit 0 trên các cnân ngõ ra của
IC nên chúng ta sẽ đưa chân dữ liệu lên mức cao cho các lán lap khác. Chú ý
Bạn phải nối chân số 9 (dữ liệu ngõ ra nối tiếp) của IC1 vói cnãn số 14 (Dữ
liệu ngõ vào) cùa IC2 để chúng ta có thể sử dụng 16 chân cùa 2 IC cho việc
quét LED:
delay(1);
digitalWrite(CLK,LOW); // Dưa chân xung xuống mức thấp
digitalWrite(Data,HIGH); // Dưa chân dữ liệu lên mức cao

}
}
Sau khi khai báo các biến và hàm xong chúng ta sẽ đến với chưong
trinh khởi tạo, trong chương trình này bạn sẽ sử dụng hàm TextToData dể
chuyển các kí tự từ biến Text thành dữ liệu quét cho LED ma trân:
void setupO
{
for(int i=0;i<14;i++)

{
pinModefi,OUTPUT);

)
pinMode(A4,OUTPUT);
pinM ode(A5,OUTPUT);
TextToDataO;

}
Chương trinh chinh chúng ta chỉ có nhiệm vụ quét LED n a trân:
void loopQ
{
LEDMatrixO;
}

284
UNIN9IẢ M CHI NGƯƠI Tự HỌC CHƯƠNG I : QUẢNG CÁO v đ l LED MA TRẬN

HIỂN THỊ Ki Tự ĨR ÊN MA TRẬN 24X8 (CỘT CATHODE)


Trong bài tập này chúng ta sẽ mở rộng thêm 1 LED 8x8 và sử dụng
thêm một IC 74H C 595 để nâng cao LED m a trận thà nh 24x8 và chú ng ta sẽ
xuất được hoàn toàn ba chữ STK trên LED ma trận này. Trong bài tập này
chúng tôi m uốn hướng dẫn các bạn nâng cao diện tích cùa LED m a trận. Bạn
không chỉ mò rộng 24x8 m à bạn có thể mở rộng lên thành 32x8, 40x8,...
Hoạt động của chương trình
Trong chương trinh này, bẹn sẽ tiếp tục tạo ra các ký tự trê n m ột LED
ma trận lớn hơn 24x2. C húng ta sẽ mỡ rộng số lượng CỘI cho LED ma trận để
thực hiện việc hiển thị nhiều kí tự hơn. Trong bài tập này bạn sẽ dùng thêm
một thanh ghi dịch 74H C 595 để tăng số lượng LED ma trận. Như bạn có thể
thấy ỏ hlnh dưới, chú ng ta có thể hiện thị hết 3 k( tự "S T K ” :

ẹ m m ị # # # # # # # #
ẹ # # * to ệ # « p #
• m m # #
Phần cứng
Sau khi bạn đã làm quen với các LED ma trận và tìm hiểu các nguyên
lý hoạt động của chúng, ch ú n g ta sẽ bắt đầu phần lắp m ạch cho bài tập này
để chúng ta tiến hành lập trình và điều khiển LED theo nguyên tắc hoạt động
trên. Chúng ta sử dụng ba bộ LED ma trận 8x8 (192 LED) và các điện trở để
hạn dòng cho LED m a trận. N goài ra các bạn cũng có thể dùng thêm các
transistor để kéo dò ng cho LED ma trận.

LED ma trận 8x8 (x3) Đ iện trở hạn dòng 220 ohm (x8)
a X

C hip 74H C 595 (x3)

Kết nối phẩn cứng


Bạn hãy kết nối m ạch như hình kết nối trên Proteus.

285
CBƯếH I: MẦIỊ6 CẤ» nil IH m T1ẢI tA M C W K W lT H c

Với các điện trở hạn dòng cho LED ma trân vá cnúng ta sử dụng thèm
hai chân tương tự của bo mạch Arduino là A4 và A5 để xét nối vòi các ngõ
vào của các hàng LED.
Bạn kết nối với bo mạch Arduino như bảng sau:

BO MẠCH ARDUINO 1C X LED MA TRẬN X


15 Cột 0
1 Cột 1
2 Cột 2
3 Cột 3
4 Cột 4
5 Cột 5
6 Cột 6
7 Cột 7
11
Chân số 0
12

Chân sô 1 14

Chân số 8 Qua điện trở đến hàng 0

Chân số 9 Qua điện trở đến hàng 1

Chân số 10 Qua điện trỏ đến hàng 2

Chân số 11 Qua điện trở đến hàng 3

Chân số 12 Qua điện trở đến hàng 4

Chân số 13 Qua điện trà đến hàng 5

AN 5 (Chân tương tự 5) Hàng 6

AN 4 (Chân tương tự 4) Hàng 7

Chú ý : D ể ghép tâng cho 1C 74HC595 thì bạn phải nổi chãn 9 của 1C trước VÓI
chăn số 14 của 1C sau. Có nghĩa là nếu bạn muốn mở rộng từ 8 chân Irở lén
bạn phải sử dụng đến chân dữ liệu ngõ ra nối tiếp của 1C trước nõ. vài chán dủ
liệu vào nối tiẽp của 1C sau.

281
CIMIK I: (IẮ B CẨI m lei MẪ TIẤI

U3
OE 07'
MR 07
00
05
Q4
>ST_CP 03
02
08 01
►8H_CP oo

' i-r

U2
ÕẼ 07-
MR 07
Q6
05
04

ST cp 03
02
DS Q1

LJ
U1

DUIN01
AFDUINO UNO R3

DIGITAL W V M j

52« ; '

Phần mềm

Chương trình cho bài tập này tương tự như chương trình bài tập trước
chỉ có m ột số thay đổi trong chương trình. C húng ta sẽ tăng số lương phần tử
của m ảng dữ liệu và trong hàm qu ét LED ma trận thì chúng ta sẽ tăng số cộ t
quét từ 16 thành 24.

217
CHƯƠNG 6 : OOANC t Ấ I n i l l ĩ l M A T lẠ ll U M M U M C H K m r lK

Chương trình hiển thị kí tự trên LED ma trận 24x8:


// Hiển thị ki tự trẽn LED ma trận 24x8
#include <avr/pgmspace.h>

// Các chân điều khiển 1C


#define Data 1
#define CLK ũ

// Mảng chứa dữ liệu quét


unsigned char LEDData[24]; // Tãng số p hắn tử của mảng dữ liệu

II Chuỗi hiền thị đề chúng ta cuộn, bạn có thể thêm nội dung bất ki
unsigned char Text[]="STK";

// Dữ liệu font chữ 5x7


static uint8_t System5x7[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00,// (space)
0x00, 0x00, 0x5F, 0x00, 0x00,//!
0x00, 0x07, 0x00, 0x07, 0x0 0,//"
0x14, 0x7F, 0x14, 0x7F, 0x14,//#
0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
0x23, 0x13, 0x08, 0x64, 0x62,// %
0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x05, 0x03, 0x00, 0 x0 0 ,//'
0x00, 0x1 c , 0x22, 0x41, 0x0 0,//(
0x00, 0x41, 0x22, 0x1 c , 0x00,//)
0x08, 0x2A, 0x1 c, 0x2A, 0x08,//*
0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x50, 0x30, 0x00. 0x00,//,
0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x60, 0x60, 0x00, 0x00,//.
0x20, 0x10, 0x08, 0x04, 0 x0 2 ,///

288
M H M IÀ H a i w t f t f l j r l« c CHƯ0HCI : <mẨM CẢI Kẩl LEI MA TBẬH

0x3E, 0x51, 0x49. 0x45, 0 x 3 E ,//0


0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x42, 0x61, 0x51, 0x49, 0x4 6,// 2
0x21, 0x41, 0x45, 0x4B, 0x3 1,// 3
0x18, 0x14, 0x12, 0x7F, 0 x 1 0 ,//4

0x27, 0x45, 0x45, 0x45, 0x39,// 5


0x3C, 0x4A, 0x49, 0x49, 0x3 0,// 6

0x01, 0x71, 0x09, 0x05, 0x0 3,// 7


0x36, 0x49, 0x49, 0x49, 0x3 6,// 8
0x06, 0x49, 0x49, 0x29, 0x1 E ,// 9
0x00, 0x36, 0x36, 0x00, 0 x0 0 ,// :

0x00, 0x56, 0x36, 0x00, 0 x 0 0 ,//;


0x00, 0x08, 0x14, 0x22, 0 x 4 1 ,11 <
0x14, 0x14, 0x14, 0x14, 0x1 4,// =
0x41, 0x22, 0x14, 0x08, 0 x 0 0 ,//>
0x02, 0x01, 0x51, 0x09, 0x0 6,// ?
0x32, 0x49, 0x79, 0x41, 0 x3 E ,// @
0x7E, 0x11, 0x11, 0x11, 0 x 7 E ,// A
0x7F, 0x49, 0x49, 0x49, 0x3 6,// B
0x3E, 0x41, 0x41, 0x41, 0x2 2,// c

0x7F, 0x41, 0x41, 0x22, 0 x 1 C ,//D


0x7F, 0x49, 0x49, 0x49, 0x4 1,// E
0x7F, 0x09, 0x09, 0x01, 0x0 1,// F
0x3E, 0x41, 0x41, 0x51, 0x3 2,// G
0x7F, 0x08, 0x08, 0x08, 0 x7 F ,// H
0x00, 0x41, 0x7F, 0x41, 0 x0 0 ,// I

0x20, 0x40, 0x41, 0x3F, 0x01 ,//J


0x7F, 0x08, 0x14, 0x22, 0 x4 1 ,// K
0x7F, 0x40, 0x40, 0x40, 0 x4 0 ,// L
0x7F, 0x02, 0x04, 0x02, 0 x 7 F ,// M
0x7F, 0x04, 0x08, 0x10, 0 x7 F ,// N
0x3E, 0x41, 0x41, 0x41, 0x3E ,// o

289
tlM N t I : I l i K CAI t i l IH m UAH w c w O ifg

0x7F, 0x09, 0x09, 0x09, 0x06,// p


0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x46, 0x49, 0x49, 0x49, 0x31.// s
0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x3F, 0x40, 0x40, 0x40, 0x3F,// u
0x1 F, 0x20, 0x40, 0x20, 0x1 F,// V
0x7F, 0x20, 0x18, 0x20, 0x7F,// w
0x63, 0x14, 0x08, 0x14, 0x63,// X
0x03, 0x04, 0x78, 0x04, 0x03,// Y
0x61, 0x51, 0x49, 0x45, 0x43,// z
0x00, 0x00, 0x7F, 0x41, 0x41,// [
0x02, 0x04, 0x08, 0x10, 0x20,// T
0x41, 0x41, 0x7F, 0x00, 0x00,// ]
0x04, 0x02, 0x01, 0x02, 0 x 0 4 ,//A
0x40, 0x40, 0x40, 0x40, 0x4 0,//_
0x00, 0x01, 0x02, 0x04, 0 x0 0 ,//'
0x20, 0x54, 0x54, 0x54, 0x78,// a
0x7F, 0x48, 0x44. 0x44, 0x38,// b
0x38, 0x44, 0x44, 0x44, 0x20,// c
0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x38, 0x54, 0x54, 0x54, 0x18,// e
0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x08, 0x14, 0x54, 0x54, 0x3C ,//g
0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x20, 0x40, 0x44, 0x3D, 0x0 0,//j
0x00, 0x7F, 0x10, 0x28, 0x44,// k
0x00, 0x41, 0x7F, 0x40, 0x00,// I
0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x38, 0x44, 0x44, 0x44, 0x38,// o
I M M M Ù M C IIK ếìllĩtM C tBtfilK I: H Ẳ K CÁOv il LEIHA TIẬI

0x7C, 0x14, 0x14, 0x14, 0 x 0 8 ,//p


0x08, 0x14, 0x14, 0x18, 0 x 7 C ,//q
0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x48, 0x54, 0x54, 0x54, 0 x 2 0 ,//s

0x04, 0x3F, 0x44, 0x40, Ox2 0 , // t


0x3C, 0x40, 0x40, 0x20, 0 x 7 C ,// u
0x1 c , 0x20, 0x40, 0x20, O x1 C ,//v
0x3C, 0x40, 0x30, 0x40, 0x3 C ,// w
0x44, 0x28, 0x10, 0x28, 0x44,// X

OxOC, 0x50, 0x50, 0x50, 0 x 3 C ,//y


0x44, 0x64, 0x54, 0x4C, 0 x 4 4 ,//z

0x00, 0x08, 0x36, 0x41, 0x0 0,// {


0x00, 0x00, 0x7F, 0x00, 0x0 0,// I
0x00, 0x41, 0x36, 0x08, 0 x 0 0 ,//)
0x08, 0x08, 0x2A , 0x1 c, 0 x 0 8 ,//->

0x08, 0x1 c, 0x2A , 0x08, 0x08 // <-

);

// Hàm rút các bit riêng lẻ từ m ột biến


boolean B itS tate(char val, cha r pos)

(
boolean xbit;
unsigned char xchar=-1;
if(pos<16) xchar=0x1 & val>> pos;
xbit=xchar;
return xbit;

// Hàm chuyển k i tự thành dữ liệu quét


void TextToDataQ

(
int j;
for(int i= 0;i<3;i++)
C H IM E t : ậBẢMC C À I M il l E I M A T IẢ II IM tH K tlim i

{
for(j=0;j<5;j++)
{
LEDData[j+i*5+i]=pgm_read_byte(System5x7 +(Text[i]-32)'5+j):
}
LEDData[j+i*5+i+1 ]=0;
}

// Hàm thay đổi dòng


void ChangeData(char index)
{
for(int i=0;i<6;i++)
{
digitalWrite(i+8,BitSlate(LEDData[index],i));
}
digitalWrite(A5, BitState(LEDData[index],6));
digitalWrite(A4, BitState(LEDData[index],7));
)

// Tắt hết các dòng


void ClearData 0
{
for(int i=0;i<6;i++)
{
digitalWrite(i+8,0);
}
digitalWrite(A5, 0);
digitalWrite(A4, 0);
}

// Hàm quét LED


void LEDMatrixO
{
m u m IA K H CHO HGƯƠI T ự BỌC CHƯƠNG 6 : QUÀNG CÁO v ỉl LED M A T R Ậ N

d ig ita lW r ite ( C L K .L O W ) ; / / Dưa chân xung xuống mức thấp


d ig ita lW r ite ( D a ta .L O W ) ; / / Dưa chăn dữ liệu xuống mức thấp
for(int i=-1 ;i< 2 4 ;i+ + ) / / Tăng số cột quét lên 24

{
C le a r D a ta ( );

d ig ita lW r ite ( C L K .H IG H ) ;// Dịch bit 1 để quét LED


C h a n g e D a ta (i);

d e la y (1 );

d ig ita lW r ite ( C L K .L O W ) ; / / Dưa chân xung xuống mức thấp


d ig ita lW r ite ( D a ta ,H IG H ) ; / / Dưa chân dữ liệu lên mức cao
}

// Chương trình khởi tạo


vo id s e tu p O

{
fo r(in t i= 0 ;i< 1 4 ;i+ + )

p in M o d e (i,O U T P U T ) ;

p in M o d e (A 4 ,O U T P U T ) ;

p in M o d e ( A 5 ,O U T P U T ) ;

// Chuyển dữ liệu kí tự thành dữ liệu quét


T e x tT o D a ta Q ;

// Chương trinh chinh


vo id lo o p O

L E D M a trix Q ;

?93
C H U U K t: n * w CAI nil t ĩ l H A HẮM UMCMHWlUt

ĐIỂU KHIỂN LED ĐƠN TRÊN LED MA TRẬN 1GX8 (GỘT CA ĨIO D E)
S au k h i b ạ n đã là m q u e n vớ i c á c h th ự c h iệ n h iể n t h i c á c ki tự Irẽ n LED
m a trậ n 1 6 x 8 th i c h ú n g ta s ẽ h ọ c c á c h đ iề u k h iể n c á c L E D đ o n trẽ n LED ma
trậ n 1 6 x 8 . B à i n à y tư ơng đ ố i đơ n g iả n b à i vì b ạ n đ ã t i m h i ể u q u a p h á n điếu
k h iể n L E D đơn trẽ n L E D m a trậ n 8 x 8 v à b iế t c á c h sử d ụ n g q u é I c ộ t ch o LED
m a trậ n 1 6 x8 . T ro n g b à i tậ p n à y c h ú n g ta k ế t hợ p đơ n giản c á c h đié u khiển
L E D đơn v à c á c h h iể n th ị L E D m a trậ n b ằ n g th a n h g h i d ị c h 7 4 H C 5 9 5 .

Hoạt động của chương trình


T ro n g chư ơ ng trình n à y , c h ú n g ta sẽ tạ o h iệ u ú n g L E D đo n tương tự như
b à i tậ p tạ o h iệ u ứng L E D đơn với L E D m a trậ n 8x8. Đ ầ u tiê n c h ú n g ta tạo mốt
đường v iề n c h o L E D m a trậ n s a u đ ó c h ú n g ta sẽ tạ o h iệ u ứng d ịc h c h u y ể n pixel
tro n g đường v iề n nà y. H iệ u ứng sẽ h o ạ t đ ộ n g th e o m ũ i tê n như n in h dưới:

# ệ # # # # ® # ệ ® •
• ! # • • • • > # # m m ệ # •

# # • # # # m m # # # # # # #

Phần cứng
S au k h i b ạ n đ ã là m q u e n v à tìm h iể u n g u y ê n lý h o ạ t đ ộ n g LE D ma
trậ n , c h ú n g ta b ắ t đ ầ u p h ầ n lắ p m ạ c h v à lậ p trìn h v à đ iế u k h iể n LE D theo
n g u y ê n tắ c h o ạ t đ ộ n g trê n . B à i tậ p n à y sử d ụ n g b a bộ L E D m a trậ n 8 x8 (192
L E D ) và c á c đ iệ n trở đ ể h ạ n d ò n g c h o L E D m a trậ n . N g o à i ra c á c b ạ n cũng
có th ể d ù n g th ê m c á c tra n s is to r đ ể k é o d ò n g c h o L E D m a trậ n .

• Đ iệ n trở h ạ n d ò n g 2 2 0 o n m (x 8 )

C h ip 7 4 H C 5 9 5 (x3 )

294
u m M Ấ M C M K r tlĩự lệ C CtftfNC I : t l Ả K t Ả I n i l I t l HA T IẬ I

Kết nối phẩn cứng


H ã y k ế t n ố i m ạ c h n h ư h ìn h dư ớ i v ớ i c á c đ iệ n trở h ạ n d ò n g c h o L E D
ma trậ n v à c h ú n g ta s ử d ụ n g th ê m h a i c h â n tư ơ n g tự c ủ a b o m ạ c h A r d u in o là
A4 v à A 5 đ ể k ế t n ố i v ớ i c á c n g õ v à o c ủ a c á c h à n g L E D . B ạ n k ế t n ố i v ớ i b o
m ạ ch A rd u in o n h ư b ả n g s a u :

B O M Ạ C H A R D U IN O IC X LED M A TR Ậ N X

15 C ộ to

1 Cột 1

2 C ột 2

3 C ột 3

4 C ột 4

5 C ột 5

6 Cột 6

7 Cột 7

11
C hân số 0
12

Chân số 1 14

C hân số 8 Q u a đ iệ n trở đ ế n h à n g 0

C hân số 9 Q u a đ iệ n trở đ ế n h à n g 1

C h â n số 1 0 Q u a đ iệ n trở đ ế n h à n g 2

C h â n s ố 11 Q u a đ iệ n trở đ ế n h à n g 3

C h â n số 1 2 Q u a đ iệ n trỏ đ ế n h à n g 4

C h â n s ố 13 Q u a đ iệ n trở đ ế n h à n g 5

A N 5 (C h â n tư ơ n g tự 5 ) Hàng 6

A N 4 (C h â n tư ơ n g tự 4 ) Hàng 7

Chú ý: Cần đ ọ c tà i liệ u kỹ thuật để b iế t c á c h s ắ p x ế p c h â n c ù a L E D


m a trậ n đ ể k ế t n ổ i m ạ c h m ộ t c á c h c h ín h x á c . Đ ể g h é p tầ n g c h o 1C 7 4 H C 5 9 5
th l b ạ n p h ả i n ố i c h â n 9 c ủ a 1C trư ớ c v ớ i c h â n sô' 1 4 c ủ a IC s a u . C ó n g h ĩa là
n ế u b ạ n m u ố n m ở rộ n g từ 8 c h â n trở lê n b ạ n p h ả i s ử d ụ n g đ ế n c h â n d ữ liệ u
n g õ ra n ố i t iế p c ù a IC trư ớ c n ố i v ớ i c h â n d ữ liệ u v à o n ô i t iế p c ù a IC s a u .
CHƯƠH61; HẢK CÀI v«l LEI IU TtẬM t— UIBCW«CWHf»

H ình k ế t n ố i m ạ c h trê n P ro te u s :

C hư ơ n g trìn h đư ợ c v iế t b ê n dưới c ó n h iệ m vụ là th ự c h iệ n q u é t LED


m a trậ n liê n tụ c v à tạ o m ộ t k h u n g v iề n hìn h c h ữ n h ậ t c h o L E D m a trậ n sau đó
tạ o h iệ u ứng d ịc h c h u y ể n p ix e l trẽ n L E D m a trậ n b ằ n g c á c h à m do ch ú n g ta
x â y dự ng.

Chương trình điều khiển LED đơn trên LED ma trận 16x8:
// Diều khiển LED đơn trẽn LED ma trận 16x8
II Các chân điều khiển 1C
# d e fin e D a ta 1
# d e fin e C L K 0

// Mảng chứa dữ liệu quét


u n s ig n e d c h a r L E D D a ta [1 6 ];

298
MHBI1AM CTQwtftfi i f Ifc ____________________________ HMW I: m m CAO»11 t a m nkầ

// Hàm rút các bit riêng lẻ từ một biến


b o o le a n B itS t a te ( c h a r v a l, c h a r p o s )

(
b o o le a n x b it;

u n s ig n e d c h a r x c h a r = - 1 ;

if (p o s < 16 ) x c h a r= 0 x 1 & v a l> > p o s ;

x b it= x c h a r;

re tu rn x b it;

// Diều khiển LED đơn sáng


void S e tB it(c h a r x .c h a r y )

(
L E D D a ta [x ]= L E D D a ta [x ]l1 < < y ;

// Tắt LED đơn


vo id C le a r B it( c h a r x .c h a r y )

{
in t x c h a r;

x c h a r= ~ (1 « y );

L E D D a ta [x ]= L E D D a ta [x ] & x c h a r;

// Hàm thay đổi dữ liệu quét


void C h a n g e D a ta ( c h a r in d e x )

t
fo r(in t i= 0 ;i< 6 ;i+ + )

(
d ig ita lW r jte ( i+ 8 ,B itS ta te ( L E D D a ta [ in d e x ] ,i) ) ;

)
d ig ita lW r ite (A 5 , B itS t a te ( L E D D a ta [in d e x ],6 ) ) ;

d ig ita lW r ite (A 4 , B itS t a te ( L E D D a ta [in d e x ],7 ) ) ;

// Xóa dữ liệu quét


vo id C le a r D a ta 0

(
fo r (in t i= 0 ;i< 6 ;i+ + )

?97
cbKKw t; ệiẢ K CẨI r t i t a m TiẮ i la w K im i

{
d ig ita lW rite (i+ 8 .0 );

}
d ig ita lW rite (A 5 , 0);
d ig ita l'.V rite (A 4 , 0);

// Hàm quét LED


v o id L E D M a trix O

{
d ig ita lW rite (C L K ,L O W );

d ig ita lW rite (D a ta .L O W );
fo r(in t i= -1 ;i< 1 6 ;i+ + )

{
C le a rD a ta O ;
d ig ita lW rite (C L K .H IG H );
C h a n g e D a ta (i);
d e la y (1);
d ig ita lW rite (C L K ,L O W );
d ig ita lW rite (D a ta .H IG H );

)
}

// Chương trình khởi tạo


v o id se tu p O

{
fo r(in t i= 0 ;i< 1 4 ;i+ + )

{
p in M o d e (i,O U T P U T );

}
p in M o d e (A 4 ,O U T P U T );
p in M o d e (A 5 ,O U T P U T );
// Tạo viền cho LED ma trặn
fo r (c h a r i= 0 ;i< 1 6 ;i+ + )

{
S etB it(O .i);
S etB it(i.O );

ỈM
I À « a i K Ể lt n f f t c*rtt I: (IẢM CÁI Dil LE1MArụ i

S e tB ít(1 5 ,i);

S e tB it(i,7 );

// Delay hiển thị


void D e la y D is la y ( in t x tim e )

{
fo r(in t t= 0 ;t < x t im e ;t+ + ) {

L E D M a trix O ;

// Chương trình chính


void loopQ

(
in tp ;

fo r(p = 2 ;p < 1 4 ;p + + )

{
S e tB it(p ,2 );

D e la y D is la y ( IO ) ;
C le a r B it( p ,2 ) ;

fo r (p = 2 ;p < 6 ;p + + )

{
S e tB it(1 3 ,p );

D e la y D is la y ( IO ) ;

C le a r B it( 1 3 ,p ) ;

fo r ( p = 1 3 ;p > 1 ;p ~ )

(
SetBit(p,5);
D e la y D is la y ( IO ) ;

H!
CHƯƠNG (: OUÁNE CẤI » il IEI MA T l ị l

C le a rB it(p ,5 );

fo r(p = 5 ;p > 1 ;p —)

{
S e tB it(2 ,p );
D e la y D is la y (IO );
C le a rB it(2 ,p );

}
}
H ã y v iế t chư ơ ng trìn h , b iê n d ịc h v à tả i x u ố n g b o m a c h A rd u in o . Néu
k ế t n ố i m ạ c h đ ú n g v à m ạ c h h o ạ t đ ộ n g c h ín h x á c thì b ạ n sẽ th ấ y LE D ma tràn
tạ o m ộ t h iệ u ứ ng p ix e l d ịc h c h u y ể n h ìn h c h ữ n h ậ t và L E D m a trâ n h iể n thị mỗt
v iề n b a o x u n g q u a n h .
T im h iể u p h ầ n m ề m
T ro n g b à i tậ p n à y c h ú n g ta sử d ụ n g thư v iệ n đ ể đưa rn à n g v à o ROM
# in c lu d e < a v r/p g m s p a c e .h >
T iế p tụ c c h ú n g ta sẽ k h a i b á o th ê m c á c c h â n để đ iề u k h iể n cho 1C
th a n h g h i d ịc h 7 4 H C 5 9 5 v à m ả n g dữ liệ u c h o từ n g c ộ t k h i q u é t:
# d e fin e D a ta 1
# d e fin e C L K 0
u n s ig n e d c h a r L E D D a ta [1 6 ];
T iế p th e o là h à m rú t b it từ b iế n :
b o o le a n B itS ta te (c h a r v a l, c h a r p o s )

{
b o o le a n xb it;
u n s ig n e d c h a r x c h a r= -1 ;
if( p o s < 1 6 ) x c h a r= 0 x 1 & v a l> > p o s ;
x b it= x c h a r;
re tu rn xb it;

)
T ro n g b à i tậ p n à y c h ú n g ta sẽ sử d ụ n g lạ i ha i h à m để đ iế u k h iể n LED
đơn như b à i tậ p đ iề u k h iể n L E D đơ n sừ d ụ n g L E D m a trâ n 8 x 8 B a n có thể
kh a m k h ả o lạ i b à i tậ p đ ó đ ể tim h iể u v ề c á c h h o ạ t đ ộ n g c ủ a ha i '-làm này:
v o id S e tB it(c h a r x .c h a r y)

{
L E D D a ta F x ]= L E D D a ta [x ]l1 « y :

300
U M M M M CM w t t l T f l f c [ M E S: QUÀNG CÁO HOI LED MẢ TBẬH

}
v o id C le a r 8 it ( c h a r x .c h a r y )

{
in t x c h a r;

x c h a r= ~ (1 « y );

L E D D a ta [ x ]= L E D D a ta [x ] & x c h a r;

}
S a u đ ó c h ú n g ta s ẽ tạ o h à m đ ể th ự c h iệ n v iệ c x u ấ t d ữ liệ u c h o L E D
ma trậ n k h i q u é t từ n g c ộ t:

v o id C h a n g e D a ta ( c h a r in d e x )

{
fo r ( in t i= 0 ;i< 6 ;i+ + )

(
d ig it a lW r ite ( i+ 8 ,B itS ta te ( L E D D a ta [ in d e x ] ,i) ) ;

}
d ig ita lW r ite ( A 5 , B itS t a te ( L E D D a ta [in d e x ],6 ) ) ;

d ig ita lW r ite ( A 4 , B itS t a t? ( L E D D a ta [in d e x ],7 ) ) ;

}
V à c á c h à m x ó a d ữ liệ u q u é t c h o L E D m a trậ n :

v o id C le a r D a ta O

{
fo r ( in t i= 0 ;i< 6 ;i+ + )

{
d ig ita lW r ite ( i+ 8 ,0 ) ;

digitalW rite(A 5, 0);


d ig italW rite(A 4, 0);
}

T iế p th e o là h à m q u é t L E D , tr o n g h à m q u é t L E D c h ú n g ta s ẽ đ iề u
khiển d ịc h b it c h o c á c IC 7 4 H C 5 9 5 . C h ú n g ta s ẽ th ự c h iệ n q u é t L E D m a tr ậ n
sử d ụ n g 2 IC 7 4 H C 5 9 5 :

v o id L E D M a t r ix ( )

{
d ig ita lW r ite ( C L K .L O W ) ;

digital W rite(D ata.LO W );

SOI
c m * I: IIA K u i r t l i a u T l* l

fo r(in t i= -1 ;i< 1 6 ;i+ + )

{
C le a rD a ta O ;
d ig ita lW rite (C L K ,H IG H );
C h a n g e D a ta (i);
delayfl);
d ig ita lW rite (C L K ,L O W );
d ig ita lW rite (D a ta ,H IG H );

}
}
T ro n g b à i tậ p n à y c h ú n g ta c ẩ n tạ o h à m D e la y h iể n th ị đ ể h iể n th ị LED
m a trậ n tro n g thở i g ia n đợ i:
v o id D e la y D is la y (in t x tim e )

{
fo r(in t t= 0 ;t< x tim e ;t+ + ){

L E D M a trix O ;

)
)
S au k h i k h a i b á o c á c b iế n v à h à m x o n g c h ú n g ta s ẽ đ ế n v đ i chương
trin h k h ỏ i tạ o , tro n g chư ơ ng trin h n à y b ạ n s ẽ tạ o v iể n c h o L E D m a trậ n :
v o id se tu p O

{
fo r(in t i= 0 ;i< 2 ;i+ + )

{
p in M o d e (i,O U T P U T );

}
p in M o d e (A 4 ,O U T P U T );
p in M o d e (A 5 ,O U T P U T );
fo r (c h a r i= 0 ;i< 1 6 ;i+ + )

{
S e tB it(0 ,i);
S e tB it(i.O );
S e tB it(1 5 ,i);
S e tB it(i,7 );

IU
« * ■ » * ■ W B W lT f I f t C T N K tn Ẩ K C Ẩ ir tiia m ĩiẦ i

)
Chương trinh chinh chúng ta chỉ có nhiệm vụ quét LED ma trận và tạo
hiệu ứng dịch chuyển pixel:
void loop()

{
int p;

for(p=2;p<14;p++)

{
SetBit(p,2);
DelayDislay(IO);
ClearBit(p,2);

for(p=2;p<6;p++)
{
SetBit(13,p);
DelayDislay(IO);
ClearBit(13,p);
)

for(p=13;p>1;p--)
{
SetBit(p,5);
DelayDislay(IO );
ClearBit(p,5);

fo r(p =5;p>1;p -)
{
SetBit(2,p);
DelayDislay(IO );
ClearBit(2,p);
}
CHựơNE8; HÁW CẢI vểl l£i MA HAM u a c M K H ir f *

TẠO HIỆU ỨNG SÁNG DẦN VÀ TẮT DẨN CÁC c ộ ĩ Ĩ I É N LED MA TRẬN
16X8 (CỘT CATHODE)
T ro n g b à i tậ p n à y c h ú n g ta sẽ b ắ t đ ầ u tạ o h iệ u ú n g c n o L E D m a trặn.
P h ầ n c ứ ng b ạ n v ẫ n s ẽ g i ữ n g u y ê n như tro n g c á c b à i trư ó c và c h ì th a y đ ổ i vé
p h ầ n m ề m . C h ú n g ta sẽ c ó th ể tạ o c á c h iệ u ứ ng rấ t đ ẹ p m á : v ó i L E D m a trận
và đ ố i vớ i c á c h iệ u ứ ng L E D m a trậ n th i n h in đ ẹ p m á t h o n s o c á c hiệu ứng
LE D đơn. Vì v ậ y v iệ c tạ o ra c á c h iệ u ứ ng trê n L E D m a trâ n n h ìn sẽ b ắ t mắt
hơn c h o v iệ c q u ả n g c á o .

H o ạ t đ ộ n g c ủ a c h ư ơ n g tr ì n h
Đ ầ u tiê n c hư ơ ng trìn h sẽ là m s á n g c ộ t đ ầ u tiê n c ù a L E D m a trậ n sau
đó sẽ s á n g d ầ n c á c c ộ t tiế p th e o c ủ a L E D m a trậ n :

Đ ế n k hi to à n b ộ L E D m a trậ n s á n g thì chư ơ ng trin h sẽ c h o thự c hiện


tắ t d ầ n từ ng c ộ t từ b ê n p h ả i s a n g b ẽ n trá i:

304
S a u k h i L E D m a tr ậ n tắ t h ế t th ì s ẽ th ự c h iệ n h iệ u ứ n g lạ i b a n đ ầ u :

P hần m ề m
P h ầ n m ề m b à i tậ p n à y k h á đ ơ n g iả n , b ạ n s ử d ụ n g c á c h à m S e tB it v à
C le a rB it đ ã tạ o tr o n g c h ư ơ n g trìn h trư ớ c đ ể tạ o h iệ u ứ n g c h o b à i n à y .
Chương trình tạo hiệu ứng sáng dần và tắt dần các cột trẽn Led
ma trận:
II Tạo hiệu ứng sáng dần và tắt dần các cột trên led ma trận
// Các chàn điều khiển 1C
# d efine D a ta 1
# d efine C L K 0
// Mảng chứa dữ liệu quét

305
CHƯƠHE t: qUÀm CÁI vil LEI MẢ TIẢI U W I 1 I CH K i l l n w

u n s ig n e d c h a r L E D D a ta [1 6 ];
// Hàm rút các bit riêng lẻ từ một biến
b o o le a n B itS ta te fc h a r v a l, c h a r p o s )
{
b o o le a n xb it;
u n s ig n e d c h a r x c h a r= -1 ;
if (p o s < 16) xcha r= O x1 & v a l » p o s ;
x b it= x c h a r;
re tu rn xb it;
}
// Điều khiển LED dơn sáng
v o id S e tB it(c h a r x .c h a r y )
{
L E D D a ta [x ]= L E D D a ta [x ]l1 < < y ;
}
// Tắt LED dơn
v o id C le a rB it(c h a r x .c h a r y)
{
in t x c h a r;
x c h a r= -(1 « y );
L E D D a ta [x ]= L E D D a ta [x ] & x c h a r;
}
// Hàm thay đổi dữ liệu quét
v o id C h a n g e D a ta (c h a r in d e x )
{
fo r(in t i= 0 ;i< 6 ;i+ + )
{
d ig ita lW rite (i+ 8 ,B itS ta te (L E D D a ta [in d e x ],i));
)
d ig ita lW rite (A 5 , B itS ta te (L E D D a ta [in d e x ],6 ));
d ig ita lW rite (A 4 . B itS ta te (L E D D a ta [in d e x ],7 ));
}
II Xóa dữ liệu quét
v o id C le a rD a ta 0
{
fo r(in t i= 0 ;i< 6 ;i+ + )
(
d ig ita lW rite (i+ 8 ,0 );
}
d ig ita lW rite (A 5 , 0);
d ig ita lW rite (A 4 . 0);

306
U M M I A I B C H MƯỜI TM PC CBtftfNG I : ỊỊĐ Á K CAO wđl LEO MA Ĩ1ẬN

}
// Hàm quét LED
void L E D M a trix O

{
d ig ita lW r ite (C L K .L O W ) ;
d ig ita lW r ite (D a ta .L O W );
fo r(in t i=-1 ;i< 1 6 ;i+ + )

{
C le a rD a ta O ;
d ig ita lW r ite ( C L K ,H IG H ) ;
C h a n g e D a ta (i);
d e la y (1 );
d ig ita lW r ite (C L K .L O W ) ;
d ig ita lW r ite (D a ta ,H IG H );

)
)
// Chương trình khởi tạo
void se tu p O
(
fo r(in t i= 0 ;i< 1 4 ;i+ + )

{
p in M o d e (i,O U T P U T ) ;
}
p in M o d e (A 4 ,O U T P U T ) ;
p in M o d e (A 5 ,O U T P U T ) ;
)
// Delay hiển thị
void D e la y D is la y fin t x tim e )
{
fo rfin t t= 0 ;t < x t im e ;t+ + ) {
L E D M a trix O ;
)
)
// Chương trình chinh
void lo o p ()
{
int p;
// Tạo hiệu úng sáng dần
for (p = 0 ;p < 1 6 ;p + + )
(
fo r(in t i= 0 ;i< 8 ;i+ + ) S e tB it( p , i) ;

»7
CHƯƠNGMOẨKCẮI vll LE1 IU Ĩ1ẬN UW M UM CH IKWI TỊ^t

D e la y D is la y ( 10);
}
II Tạo hiệu ứng tắt dần
fo r (p = 1 5 ;p > = 0 ;p ~ )
{
fo r(in t i= 0 ;i< 8 ;i+ + ) C le a rB it(p .i);
D e la y D is la y (IO );
)

1 B ạ n h ã y b iê n d ịc h v à tả i c hư ơ ng trìn h x u ố n g b o a rd n ạ c h A rd u in o . Nếu
lắ p m ạ c h ch ín h x á c thì L E D m a trậ n sẽ s á n g th e o h iệ u ứ ng m ô tà tro n g phán
“ H o ạ t đ ộ n g c ủ a chư ơ ng trìn h ” .
P h ầ n m ề m b à i n à y tư ơ ng đ ố i đơ n g iả n n ê n b ạ n h o à n to à n có thể ta
g iả i th ích đƯỢc.

TẠO NIỆU ƯNG SÁNG DẦN VÀ TẮT DẦN CÁC CỘT TRẼN LED MA TRẬN
16X8- H I Ệ U CHỈNH (CỘT CATHODE)
C h ú n g ta c ó th ể tă n g g iả m tố c đ ộ s á n g d ầ n v à tắ t d ấ n c ù a hiệu ứng
dự a v à o n h ữ n g th a y đ ổ i n h ỏ c ủ a m ã lệ n h . P h ầ n c ứ n g v ẫ n k h ô n g đ ổ i nhưng
c h ú n g ta sẽ th a y đ ổ i p h ầ n m ề m . P h ầ n tô đ ậ m tro n g m ã lê n h là nhữ ng phán
c h ú n g ta th a y đ ổ i đ ể tă n g g iả m tố c đ ộ c h o h iệ u ứng.

Phần mềm

P h ầ n m ề m b à i n à y k h á đơ n g iả n , b ạ n sử d ụ n g c á c h à m S etB it va
C le a rB it đã tạ o tro n g c hư ơ ng trìn h trư ớ c đ ể tạ o h iệ u ứ ng c h o b à i n à y.

ChƯdng trình tạo hiệu ứng sáng dần và tắt dẩn các cột trên led ma trận:

// Tạo hiệu ứng sáng dần và tắt dần các cột trên led ma trận

II Các chân điều khiển 1C


# d e fin e D a ta 1

# d e fin e C L K 0

// Mảng chứa dữ liệu quét


u n s ig n e d c h a r L E D D a ta Ị1 6 ];

// Hàm rút các bit riêng lẻ từ một biến


fllf f i— | Ậ g f if l N ttfll lự I Ị C CbơơNG I : QOẢNG CÁO v ỉ l LED MA TBẬN

b o o le a n B itS t a te ( c h a r v a l, c h a r p o s )

i
b o o le a n x b it;

u n s ig n e d c h a r x c h a r = - 1 ;

if ( p o s d 6 ) x c h a r= O x 1 & v a l » p o s ;

x b it= x c h a r;

re tu rn x b it;

// Diều khiển LED đơn sáng


void S e tB it(c h a r x .c h a r y )

(
L E D D a t a [ x ] = L E D D a t a [ x ] l1 « y ;

// Tất LED đơn


void C le a r B it( c h a r x .c h a r y )

(
in t x c h a r;

x c h a r= -(1 « y );

L E D D a ta [x ]= L E D D a ta [x ] & x c h a r ;

// Hàm thay đổi dữ liệu quét


void C h a n g e D a ta ( c h a r in d e x )

fo r(in t i= 0 ;i< 6 ;i+ + )

d ig ita lW r ite ( i+ 8 ,B itS ta te ( L E D D a ta [ in d e x ] ,i) ) ;

d ig ita lW r ite (A 5 , B itS t a te ( L E D D a ta [in d e x ],6 ) ) ;

d ig ita lW r ite (A 4 , B itS t a te ( L E D D a ta [in d e x ],7 ) ) ;

109
CHƯđmI: ỌBẢMC CAI >ll LE» HA nẠll U W I M t l l KW ITHC

// Xóa dữ liệu quét


vo id C le a rD a ta 0

{
fo r(in t i= 0 ;i< 6 ;i+ + )

{
d ig ita lW rite (i+ 8 ,0 );

}
d ig ita lW rite (A 5 , 0);
d ig ita lW rite (A 4 , 0 );

// Hàm quét LED


v o id L E D M a trix Q

{
digitalWrite(CLK,LOW);

d ig ita lW rite (D a ta ,L O W );
fo r(in t i=-1 ;i< 1 6 ;i+ + )

{
C le a rD a ta O ;

d ig ita lW rite (C L K ,H IG H );

C h a n g e D a ta (i);
d e la y (1 );

d ig ita lW rite (C L K ,L O W );

d ig ita lW rite (D a ta ,H IG H );

}
}

// Chương trình khởi tạo


v o id setu pO

{
fo r(in t i= 0 ;i< 1 4 ;i+ + )

{
p in M ũ d e (i,O U T P U T );

310
UBOINO DANH CHO Netftfl Tự HỌC CHƯƠNG ( : QUẢNG CÀO »01 LED MA TBẬM

p in M o d e ( A 4 ,O U T P U T ) ;

p in M o d e ( A 5 ,O U T P U T ) ;

// Delay hiển thị


void D e la y D is la y ( in t x tim e )

fo r(in t t= 0 ;t < x t im e ;t+ + ) {

L E D M a trix O ;

II Chương trình chinh


void loop O

int p;

// Tạo hiệu ứng sáng dần


fo r ( p = 0 ;p < 1 6 ;p + + )

fo r(in t i= 0 ;i< 8 ;i+ + ) S e tB it( p . i) ;

DelayDislay(5); // Tăng tốc độ sáng dần


)

// Tạo hiệu úng tắt dấn


fo r ( p = 1 5 ;p > = 0 ;p ~ )

fo r (in t i= 0 ;i< 8 ;i+ + ) C le a r B it( p ,i) ;

DelayD islay(15); // G iảm tốc độ tắt dần

an
CHƯƯH6 6 : Q U Ấ H t C Á I > ể l L £ l M A T IẬ » U M M i a C H I K M lT H t

TẠO HIỆU ỮNG SÁNG DẦN TƯNG CỘT VÀ SÁNG DẦN CIO LED MA ĨIẶN
16X8 (CỌT CATHODE)
T ro n g b à i tậ p n à y c h ú n g ta sẽ tạ o ra h iê u ứ ng s á n g d á n từ ng cột tú
trê n x u ố n g dưới. S a u sẽ s á n g d ầ n c ộ t tiế p th e o . C á c c ỗ : sẽ s á n g d ầ n đế n khi
LE D m a trậ n s á n g h ế t.

P h ầ n c ứ n g c ù a b à i n à y g iố n g v ớ i c á c b à i tậ p trư ó c sừ d ụ n g LE D ma
trậ n 1 6 x8 vớ i 2 L E D m a trậ n 8 x 8 v à c á c IC g h i d ịc h đ ể q u é t LE D m a trận
P h ầ n m ề m sẽ đ ô i c h ú t k h á c b iệ t.

H o ạ t đ ộ n g c ủ a c h ư ơ n g tr ì n h

Đ ầ u tiê n c h ú n g ta c h o s á n g d ầ n c ộ t đ ầ u tiê n từ trê n x u ố n g dưới:

I I # 1 1 l i ® © II

S au k hi c ộ t đ ầ u tiê n s á n g h ế t thì th ự c h iệ n s á n g d ầ n c n o c ộ t thứ hai:

: t ị 2 1 1 .1
HR
•@
UJVxxxl
••••••••
•m
• ề # m m m m #1• • • • • • • •
•i•#mmmm
••
uu
C ô t thứ hai se s á n g tương tự như c ô t 1.

31»
AIMIMS danhcho ngươi Tự age CHƯƠNG 6: QUÀNG CAO uđl LED HA TRẬN

m\m m m m m m m m
é m % % # # • # #
# 1 # # # # # # # #

Đ ế n k h i c ộ t th ứ h a i s á n g h ế t th ì c á c c ộ t tiế p th e o s ẽ s á n g v ớ i h iệ u ứ n g
tương tự đ ế n k h i L E D m a tr ậ n s á n g h o à n to à n .

Đ ế n k h i L E D m a tr ậ n s á n g h o à n to à n th ì tắ t L E D m a trậ n .
CHƯƯN6 8: QUẢN6 CẢI vẩl If 1 m ĨIA« ẲH— IẰM H I w W T f t

S au đ ó c h ú n g ta đ iề u k h iể n L E D m a trâ n tắ t h ế t và th ụ c h iệ n h iệ u ớng
lại b a n đ ầ u :

Phấn mềm

T ro n g b à i tậ p n à y b ạ n tiế p tụ c sử d ụ n g c á c h à m S e tB it v à C le a rB it đã
giớ i th iệ u tro n g b à i tậ p trư ớ c đ ể tạ o h iệ u ứ ng. N g o à i ra tro n g chươ ng trình
ch ín h c ó m ộ t v ò n g lặ p d ù n g đ ể tắ t tấ t c ả c á c L E D .

ChƯdng trình tạo hiệu ứng sáng dần từng cột và sáng dấn với LED
ma trận:

// Tạo hiệu ứng sáng dần sáng dần từng cột và sáng dần LED ma trận
II Các chân điều khiển 1C
# d e fin e D a ta 1

# d e fin e C L K 0

// Mảng chứa dữ liệu quét


u n s ig n e d c h a r L E D D a ta [1 6 ];

// Hàm rút các bit riêng lẻ từ một biến


b o o le a n B its ta te ( c h a r v a l, c h a r p o s )

{
b o o le a n xb it;

u n s ig n e d c h a r x c h a r= -1 ;

if(p o s < 1 6 ) x c h a r= 0 x 1 & v a l> > p o s ;


x b it= x c h a r;

314
H IH im Ầ M c » t W « I T ự lộ C _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CHƯtfH6 «: HOẢMt CÀO VƠI LED MA TBẬH

re tu rn x b it;

II Diếu khiển LED đơn sáng


void S e tB it( c h a r x .c h a r y )

{
L E D D a ta [x ]= L E D D a ta [x ]l1 « y ;

II Tắt LED đơn


void C le a r B it( c h a r x .c h a r y )

(
in t x c h a r;

x c h a r= -(1 « y );

L E D D a ta [x ]= L E D D a ta [x ] & x c h a r ;

// Hàm thay đổi dữ liệu quét


void C h a n g e D a ta ( c h a r in d e x )

fo r(in t i= 0 ;i< 6 ;i+ + )

d ig ita lW r ite ( i+ 8 ,B itS ta te ( L E D D a ta [ in d e x ] ,i) ) ;

d ig ita lW r ite (A 5 , B itS t a te ( L E D D a ta [in d e x ],6 ) ) ;

d ig ita lW r ite (A 4 , B itS t a te ( L E D D a ta [in d e x ],7 ) ) ;

II Xóa dữ liệu quét


void C le a r D a ta 0

fo r(in t i= 0 ;i< 6 ;i+ + )

d ig ita lW r ite ( i+ 8 ,0 ) ;

115
CHƯƠNE 6 : QUẢN6 C Ả I w i l L ĩ l H A H Ạ * a i m C IIK W IT H C

d ig ita lW rite (A 5 , 0);

d ig ita lW rite (A 4 , 0);

// Hàm quét LED


v o id L E D M a trix O

{
d ig ita lW rite (C L K ,L O W );

d ig ita lW rite (D a ta .L O W );

fo r(in t i=-1 ;i< 1 6 ;i+ + )

{
C le a rD a ta O ;

d ig ita lW rite (C L K .H IG H );

C h a n g e D a ta (i);

d e la y (1 );

d ig ita lW rile (C L K ,L O W );

d ig ita lW rite (D a ta .H IG H );

// Chương trinh khởi tạo


v o id setu pO

{
fo r(in t i= 0 ;i< 1 4 ;i+ + )

{
p in M o d e (i,O U T P U T );

}
p in M o d e (A 4 , O U T P U T );

p in M o d e (A 5 ,O U T P U T );

// Delay hiển thị


v o id D e la y D is la y (in t x lim e )

316
UNIM M M CKOHCtíđl Tự 19c CHƯƠNG I : QOẢNC CÁO V ỈI LED MA TRẬN

fo r(in t t= 0 ;t < x t im e ;t+ + ) {

L E D M a trix O ;

// Chương trình chinh


void loop O

in t p;

// Tắt hết LED ma trận


fo r ( p = 0 ;p < 1 6 ;p + + )

L E D D a ta [p ]= 0 ;

II Dợi một thời gian trước khi thực hiện hiệu ứng
D e la y D is la y ( 1 0 );

// Vòng lặp tạo hiệu ứng


fo r (p = 0 ;p < 1 6 ;p + + )

ío r(in t i= 0 ;i< 8 ;i+ + )

S e tB it(p .i);

D e la y D is la y ( 1 0 );

B ạ n h ã y b iê n d ịc h v à tả i c h ư ơ n g trìn h x u ố n g b o a r d m ạ c h A r d u in o . N ế u
lắp m ạ c h c h ín h x á c th i L E D m a tr ậ n s ẽ s á n g th e o h iệ u ứ n g m ô tả tr o n g p h ầ n
“H o ạ t đ ộ n g c ù a c h ư ơ n g tr ì n h ” . V iệ c lậ p trìn h c h o b à i tậ p n à y đ ơ n g iả n d o tư o n g
tự vớ i b à i tậ p H iề n th ị k ý tự tr ê n m a tr ậ n 1 6 x 8 ( c ộ t c a th o d e ) , Đ iề u k h iể n L E D
đơn trê n L E D m a t r ậ n 1 6 x 8 ( c ộ t c a th o d e ) , T ạ o h iệ u ứ n g s á n g d ầ n v à tắ t d ầ n
c á c c ộ t tr ê n L E D m a trậ n 1 6 x 8 (c ộ t c a th o d e ) đ ã trìn h b à y n é n b ạ n h o à n to à n
có thể tự giải thích được.

517
CHƯONE 6 ; QDÀH6 C Ả I v ẩ l l ĩ l H A H Ẩ N U M M l u a C M W N IT |I|(

TẠO HIỆU ỨNG SÁNG DẦN TƯNG c ộ ĩ VÀ SÁNG DẦN VÒI LED MA ĨIẬN
16X8 - HIỆU CHỈNH (CỘT CATHODE)
T ro n g b à i tậ p n à y , b ạ n sẽ th ự c h iệ n h iệ u ứ ng à b à ' trướ c nh ư ng chúng
ta th a y đ ổ i tố c đ ộ chờ đ ể th ự c h iệ n h iệ u ứ ng v à tâ n g tõ c đô CHO h iê u ứng phu
hợ p vớ i b ạ n .
Phần mềm
C hư ơ n g trin h b à i tậ p n à y h o à n to à n tư ơng tự vớ i b à i trư ớ c như ng bạn
sẽ th a y đ ổ i tố c thờ i g ia n đợ i. N h ữ n g p h ầ n tô đ ậ m v à in h o a tro n g m ã lệ n h dưới
là nh ữ ng th a y đ ổ i s o vớ i chư ơ ng trìn h k h á c .
Chường trình tạo hiệu ứng sáng dần từng cột và sáng dẩn với LED
ma trận:
// Tạo hiệu ứng sáng dần sáng dẳrt từng cột và sáng dần LED ma trận
II Các chân điều khiển 1C
# d e fin e D a ta 1
# d e fin e C L K 0
// Mảng chứa dữ liệu quét
u n s ig n e d c h a r L E D D a ta [1 6];
// Hàm rút các bit riêng lẻ từ một biến
b o o le a n B itS ta te (c h a r v a l, c h a r p o s )
{
b o o le a n xb it;
u n s ig n e d c h a r x c h a r= -1 ;
if(p o s < 1 6 ) x c h a r= 0 x 1 & v a l> > p o s ;
x b it= x c h a r;
re tu rn xb it;

}
// Diều khiển LED dơn sáng
v o id S e tB it(c h a r x .c h a r y)

{
L E D D a ta [x ]= L E D D a ta [x ]l1 « y ;
}
// Tắt LED đơn
v o id C le a rB it(c h a r x .c h a r y)

{
in t x c h a r;
x c h a r= -(1 < < y ):
L E D D a ta [x ]= L E D D a ta [x ] & x c h a r:

318
 IM IH IA H CHO M6ƯỨI Ty age CHƯƠM6 6: QUÀH6 CAP HOI LED MA TRAN

// Hàm thay đổi dữ liệu quét


void C h a n g e D a ta ( c h a r in d e x )

(
fo r(in t i= 0 ;i< 6 ;i+ + )

(
d ig ita lW r ite ( i+ 8 ,B itS ta te ( L E D D a ta [ in d e x ] ,i) ) ;

}
d ig ita lW rite (A 5 , B itS t a te ( L E D D a ta [in d e x ],6 ) ) ;
d ig ita lW rite (A 4 , B itS ta te ( L E D D a ta [in d e x ],7 ) ) ;

)
II Xóa dữ liệu quét
void C le a r D a ta 0

(
fo r(in t i= 0 ;i< 6 ;i+ + )

(
d ig ita lW r ite (i+ 8 ,0 );

)
d ig ita lW rite (A 5 , 0 );
d ig ita lW rite (A 4 , 0 );

)
// Hàm quét LED
void L E D M a trix O

{
d ig ita lW r ite (C L K ,L O W ) ;
d ig ita lW r ite (D a ta ,L O W );
fo r(in t i= - 1 ; j< l6 ; i+ + )

{
C le a rD a ta ();
d ig ita lW r ite ( C L K ,H IG H ) ;
C h a n g e D a ta (i):
d e la y (1 );

d ig ita lW r ite ( C L K .L O W ) ;
d ig ita lW r ite ( D a ta .H IG H ) ;
)
)
// Chương trình khởi tạo

319
CHƯƠNG 6: qUÀNe CAO v t l LED MA TRẬN u n m nm c iiK M ir f « (

v o id setupO

{
fo r(in t i= 0 :i< 1 4 ;i+ + )

{
p in M o d e fi,O U T P U T );

}
p in M o d e (A 4 , O U T P U T );
p in M o d e (A 5 ,O U T P U T );

}
// Delay hiền thị
v o id D e la y D is la y (in t x tim e )

{
fo r(in t t= 0 ;t< x tim e ;l+ + ){
L E D M a trix O ;

}
)
// Chương trình chinh
vo id loopO

{
int p;
// Tất hết LED ma trận
fo r (p = 0 ;p < 1 6 :p + + )
{
L E D D a ta [p ]= 0 ;

)
// Đợi một thời gian trước khi thực hiện hiệu ứng
THA Y D ổl THỜI GIAN CHO PHÉP THựC HIỆN HIỆU ỨNG
D e la y D is la y ( 5 ); / /
// Vòng lặp tạo hiệu ứng
fo r (p = 0 ;p < 1 6 ;p + + )
{
fo r(in t i= 0 :i< 8 ;i+ + )
{
S e tB it(p ,i);
D e la y D is la y ( 5 ); II TỐC DỘ THựC HIỆN Hiệu ỨNG
)

320
M B O IN O DANK CHO NEƯƠI T ự HỌC CHƯƠNG 6 : Q UẢN6 CÁO VƠ I LED M A TR Ậ N

ĨẠ O HIỆU ỨNG SÁNG DẨN XEN KẼ LED MA TRẬN 1GX8 (CỘT CATHODE)
T r o n g b à i tậ p n à y c h ú n g ta s ẽ tạ o ra h iệ u ứ n g s á n g d ầ n x e n k ẽ từ h a i
hướng từ tr á i s a n g p h ả i v à từ p h ả i s a n g trá i. Đ ế n k h i L E D m a tr ậ n s á n g h ê t th ì
c h ú n g ta lặ p lạ i h iệ u ứ n g .

Hoạt động của chương trình

Sau khi
cột đầu tiê n s á n g
hết thì th ự c h iệ n
sáng d ầ n c h o c ộ t
ngoài cùng bên
phải (hình b ê n ).

C ột ng o à i
cùng bên phải sẽ
sáng giốn g cột 1
(hình b ê n ).

Đ ế n k h i c ộ t n g o à i c ù n g b ê n p h ả i s á n g h ế t th ì c á c c ộ t th ứ 3 n g o à i c ù n g
bê n trá i s ẽ s á n g th e o h iê u ứ n g g iố n g c á c c ộ t trư ớ c (h ìn h tra n g b ê n ).

321
K hi L E D rna trậ n s á n g h ố t th i tắ t h ế t L E D :
um M Ẳ « CH U tM l TfM C CUƯONC t: qUẢNC CÁI v ỉl LED MA TBẬH

S a u đ ó c h ú n g ta đ iề u k h iể n L E D m a tr ậ n tắ t h ế t v à th ự c h iệ n h iệ u ứ n g
lại b a n đ ầ u :

•••#####
• mmm m m m m m
•••••• • ••••••••
• • • m.m m mm
IMIII ii m ề •
ềmm ề mm •

Phần mềm

T r o n g b à i tậ p n à y b ạ n t iế p tụ c s ử d ụ n g c á c h à m S e tB it v à C le a r B it đ ã
tạo đ ể tạ o h iệ u ứ n g . M ã lệ n h b à i n à y s ử d ụ n g c á c v ò n g lặ p fo r x e n k ẽ v à m ộ t
biến C h a n g e E ffe c t đ ể tạ o h iệ u ứ n g .

Chường trình tạ o hiệu ứng sáng dần xen kẻ LED ma trận:

// Tạo hiệu ứng sáng dần xen kẻ led ma trận


II Các chân điều khiển 1C
# d e fin e D a ta 1

# d e fin e C L K 0

121
CHƯƠNG t : m Ầ H C C Á I v i l l i l H Ắ T I Ẳ I u tm n m c iiw w iT f jt

// Biến cho phép thay đổi hiệu ứng


b o o le a n C h a n g e E ffe c t;

// Mảng chứa dữ liệu quét


u n s ig n e d c h a r L E D D a ta [1 6 ];

// Hàm rút các bit riêng lẻ từ một biến


b o o le a n B itS ta te (c h a r v a l, c h a r p o s )

{
b o o le a n x b it;
u n s ig n e d c h a r x c h a r= -1 ;
if(p o s < 1 6 ) x c h a r= 0 x 1 & v a l> > p o s ;
x b it= x c h a r;
re tu rn xb it;

}
// Diều khiển LED đan sáng
v o id S e tB it(c h a r x .c h a r y)

{
L E D D a ta [x ]= L E D D a ta [x ]l1 « y ;

}
// Tắt LED đơn
v o id C le a rB it(c h a r x .c h a r y)

{
in t x c h a r;
x c h a r= ~ (1 « y );
L E D D a ta [x ]= L E D D a ta [x ] & x c h a r;

// Hàm thay đổi dữ liệu quét


v o id C h a n g e D a ta (c h a r in d e x )

{
fo r(in t i= 0 ;i< 6 ;i+ + )

{
d ig ita lW rite (i+ 8 ,B itS ta te (L E D D a ta [in d e x ],i));

}
d ig ita lW rite (A 5 . B itS ta te (L E D D a ta [in d e x ],6 ));
d ig ita lW rite (A 4 . B ìtS ta te (L E D D a ta [in d e x ],7 ));

324
U N 1M !*■ Cll NCtftfI n r 19c CnMNC I: H A K CÁ0 vẩl LEB HA T1ẮI

)
II Xóa dữ liệu quét
void C le a r D a ta 0

(
fo r(in t i= 0 ;i< 6 ;i+ + )

{
d ig ita lW r ite (i+ 8 ,0 );

)
d ig ita lW rite (A 5 , 0 );
d ig ita lW rite (A 4 , 0 );

// Hàm quét LED


void L E D M a trix O

(
d ig ita lW r ite (C L K .L O W ) ;

d ig ita lW r ite (D a ta .L O W );
fo r(in t i=-1 ;i< 1 6 ;i+ + )

{
C le a rD a ta O ;

d ig ita lW r ite ( C L K ,H IG H ) ;

C h a n g e D a ta (ì);
d e la y (1 );

d ig ita lW r ite ( C L K .L O W ) ;

d ig ita lW r ite ( D a ta ,H IG H ) ;

}
)

'/ Chương trình khởi tạo


/o id s e tu p O

fo r(in t i= 0 ;i< 1 4 ;i+ + )

(
p in M o d e fi,O U T P U T ) ;

)
p in M o d e ( A 4 , O U T P U T ) ;
p in M o d e ( A 5 ,O U T P U T ) ;

1ZS
I
IM CH K H lT fH '
CHƯƠNE 6: m Ả K C Ấ I n i l LE1 M A T IA *

)
II Delay hiển thị
vo id D e la y D is la y (in t x tim e )

{
fo r(in t t= 0 ;t< x tim e ;t+ + ){
L E D M a trix ();

}
}
// Chương trình chính
v o id loopO

{
in t p;
II Tắt hết LED ma trận
fo r (p = 0 ;p < 1 6 ;p + + )

{
L E D D a ta [p ]= 0 ;

}
D e la y D is la y (1 0); / / Đợi một thời gian trước khi thực hiện hiệu ứng
II Vòng lặp tạo hiệu ứng
fo r (p = 0 ;p < 1 6 ;p + + )
{
fo r(in t i= 0 ;i< 8 ;i+ + )

{
if(C h a n g e E ffe c t= = fa ls e ) S e tB ĩt(p .i);
e ls e S e tB it(1 6 -p ,i);
D e la y D is la y (IO );

)
C h a n g e E ffe c t= !C h a n g e E ffe c t;

}
)
B ạ n h ã y b iê n d ịc h v à tả i chư ơ ng trin h x u ố n g b o a rd m a c n A rd u in o . Nếu
lắ p m ạ c h c h in h x á c thì L E D m a trậ n sẽ s á n g th e o h iệ u ứ ng rn ô tả tro n g phấn
“ H o ạ t đ ộ n g c ù a chư ơ ng trin h ” . P h ầ n m ề m b à i tậ p n à y tương tự m ư c á c b à i tập
trướ c n ê n b ạ n h o à n to à n c ỏ th ể tự g iả i th ích được.

326
AUIMO bans cho n g ư ơ i Tự HQC CHƯƠNG 7 : Đ IẾU K H IỂ N LED 7 Đ O Ạ N

CHUÔNG 7

ĐIỂU KHIỂN LED 7 ĐOẠN


T a c ó th ể s ử d ụ n g L E D d d n v à L E D m a trậ n tr o n g q u ả n g c á o , c á c n h à
th iế t k ế c ũ n g th ư ờ n g s ử d ụ n g L E D 7 đ o ạ n đ ể d ù n g tr o n g q u ả n g c á o c ũ n g n h ư
hiển th ị c á c th ô n g s ố tr o n g đ iề u k h iể n n h ư n h iệ t đ ộ , đ ộ ẩ m , k h o ả n g c á c h , đ iệ n
áp d ò n g đ iệ n ... H iệ n L E D 7 đ o ạ n s ử d ụ n g k h á p h ổ b iế n đ ể h iể n th ị th ờ i g ia n
(giờ, p h ú t, g iâ y ) , h o ặ c g iá v à n g , g iá n g o ạ i tệ .

C á c th ô n g s ố c ầ n th iế t đ ể u đ ư ợ c h iể n th ị tr ê n L E D 7 đ o ạ n đ ể n g ư ờ i
d ù n g c ó th ể b iế t đ ư ợ c . N g o à i v iệ c q u ả n g c á o , b ạ n c ũ n g th ư ờ n g x u y ê n tiế p
xú c L E D 7 đ o ạ n tr o n g n h à c ủ a m ìn h . V í d ụ n h ư c á c m á y g iặ t đ iệ n tử , lịc h v ạ n
niên , c á c đ ổ n g h ồ s ố v à b ạ n th ư ờ n g g ặ p n h iề u n h ấ t L E D 7 đ o ạ n là tr o n g c á c
m á y ở n h à b ế p n h ư b ế p từ , n ồ i c ơ m đ iệ n , b ế p h ổ n g n g o ạ i,...

T r o n g c h ư ơ n g n à y c h ú n g ta s ẽ là m q u e n v ớ i L E D 7 đ o ạ n v à đ i s â u v à o
cá c c á c h đ iề u k h iể n c ủ a L E D 7 đ o ạ n . B ạ n c ó th ể c h o h iể n th ị m ọ i th ô n g s ố
cần th iế t v ớ i L E D 7 đ o ạ n vì v ậ y tr o n g q u ả n g c á o b ạ n c ũ n g th ư ờ n g th ấ y c h ú n g
x u ấ t h iệ n b ê n c ạ n h c á c lo ạ i L E D k h á c .

H ìn h d ư ớ i v à tr a n g b ê n là ả n h c ủ a L E D 7 đ o ạ n d ù n g tr o n g q u ả n g c á o
và b ả n g b á o g ia o th ô n g :

327
CHƯƠNG 7 : ĐIẾU KHIỂN L£0 7 s o AN illlM liu CHO N C IItl T i n e

GIỚ I T H IỆ U L E D 7 Đ O Ạ N

C ó m ộ t thờ i g ia n trước đ â y , v iệ c x e m L E D như là n õ : xu th ế để hiển


th ị. N h ữ n g thứ đ e o trê n người như đ ồ n g hổ đ e o tay c ó th ể n h ấ n n ú t để coi gio.
p h ú t, g iâ y đư ợ c h iể n th ị trê n n h ữ ng L E D 7 đ o ạ n n h ỏ . Đ ế n b ã y g iò co n ngưoi
đã tạ o ra n h ữ n g m à n hìn h L C D rấ t tiệ n d ụ n g và h iể n thị đ ư o c n h iề u m àu nén
n h ữ ng đ ồ n g hồ đ e o ta y d ạ n g LE D 7 đ o ạ n c ũ n g d ầ n bị q b ẽ n lã n g . Nhung
n h ữ ng v ậ t d ụ n g x u n g q u a n h c h ú n g ta v ẫ n c ò n sử d ụ n g L E D 7 đ o ạ n vì sự đon
g iả n và dễ sử d ụ n g c ủ a c h ú n g . T ro n g b à i n à y c h ú n g ta sẽ là n q u e n với LED
7 đ o ạ n v à c á c h sử d ụ n g c h ú n g .

L E D 7 đ o ạ n (hình dưới) là m ộ t d ạ n g L E D c ó n ế n m à u đ á m và trẽ n nén


đó c ó 7 đ o ạ n L E D đư ợ c x ấ p x ế p th à n h co n s ố 8 vá m ộ t d ấ L c h ấ m , ch ú n g ta
có th ể là m c h o n h ữ n g đ o ạ n L E D n à y s á n g và tạ o Ih à n h n h ữ ^ g co n sò' để hiển
th ị c h o người sử d ụ n g .

T ro n g th ự c tế , ta hay sử d ụ n g 2 h o ặ c n h iề u h o n L E D 7 3 ề có thể
hiể :. mịn h i í u k ý tự hũ n và c á c c o n s ố c ũ n g ít khi n à o ch ì TZ Z ' s n g đ o n VI
(từ cá , trườngh o p n g o a i lê ' n à roi và S3 c h t c h o ã c t r á n đ ẽ " ' ỉ - - - — IH

3' s
M i m i Ầ M I CHO NGƯƠI Tự HỌC CHƯƠNG 7: BIẾU KHIỂN LED 7 ĐOẠN

P h ầ n lớ n c h ú n g ta th ư ờ n g s ử d ụ n g p h ư ơ n g p h á p q u é t L E D đ ể h iể n th ị
led 7 đ o ạ n (x e m h ìn h d ư ớ i).

Digital Pin

C á c đ o ạ n L E D t r ê n L E D 7 đ o ạ n lầ n lư ợ t đ ư ợ c g ọ i tê n th e o c h ữ c á i
A -B -C -D -E -F -G , v à d ấ u c h ấ m (d o t). N h ư v ậ y , n ế u m u ố n h iể n th ị k ý tự n à o th i
ta c h ỉ c ầ n c ấ p n g u ồ n v à o c h â n đ ó là L E D s ẽ s á n g n h ư m o n g m u ố n .

T h ông s ố LED 7 đo ạn

L E D 7 th a n h d ù c ó n h iề u b iế n th ể n h ư n g tự u c h u n g th ì c ũ n g c h ỉ v ẫ n c ó
2 lo ạ i đ ó là :

• C h â n A n o d e c h u n g ( c h â n + c á c L E D m ắ c c h u n g lạ i v ớ i n h a u .)

• C h â n C a th o d e c h u n g (C h â n - c á c L e d đ ư ợ c m ắ c c h u n g v ớ i n h a u .)

Đối với loại Anode chung:

C h â n 3 v à 8 là 2 c h â n V c c (n ố i n g ắ n m ạ c h lạ i VỚI n h a u , s a u đ ó n ố i
ch u n g v ớ i c h â n a n o d e c ù a 8 L E D đ ơ n ), v ậ y m u ố n L E D n à o đ ó s á n g th ì c h ỉ
việc n ố i c h â n c a th o d e x u ố n g m a s s . Đ iệ n á p g iữ a V c c v à m a s s p h ả i lớ n hơ n
1.3 V m ớ i c u n g c ấ p đ ủ L E D s á n g , tu y n h iê n k h ô n g đ ư ợ c c a o q u á 3 V .

329
CHƯƠNG 7 : Õ IẾ I m Ể N L Ỉ I 7 M Ạ I ẤU— u n CH m n m i

B ả n g c á c g iá t r ị đ iề u k h iể n từ A - G c h o L E D 7 đ o ạ n

B ả n g m ã h iể n th ị L E D 7 đ o ạ n d à n h c h o le d 7 đ o a n c ó a n o d e chung
(c á c L E D đơ n s á n g ở m ứ c 0):

SÔ' HIỂN THỊ MÃ HIỂN THỊ LED MÃ HIỂN THỊ LED


TRÊN LED 7 ĐOẠN DẠNG 7 ĐOẠN DẠNG
7 ĐOẠN NHỊ PHÂN THẬP LỤC PHÂN
h g f e d c b a

0 110 0 0 0 0 0 CO
1 111110 0 1 F9

2 10 10 0 10 0 A4

3 10 1 1 0 0 0 0 B0
4 10 0 1 1 0 0 1 99

5 10 0 10 0 10 92

6 1 1 0 0 0 0 10 82

7 111110 0 0 F8
8 1000000 0 80

9 10 0 10 0 0 0 90

A 10 0 0 10 0 0 88

B 1 0 0 0 0 0 11 S3

390
MJIMIAM CIO NCWlTfMC CHƯƠNG 7: ĐIẾU KHIỂN LED 7 ĐOẠN

c 1 1 0 0 0 1 1 0 C6

D 10 10 0 0 0 1 A1

E 10 0 0 0 1 1 0 86

F 1 0 0 0 1 1 1 0 8E

- 10 1 1 1 1 1 1 BF

B ả n g m ã h iể n th ị L E D 7 đ o ạ n d à n h c h o L E D 7 đ o ạ n c ó c a th o d e c h u n g
(các L E D đ ơ n s á n g ở m ứ c 1).

SỔ HIỂN THỊ MÃ HIỂN THỊ LED MÃ HIỂN THỊ LED


TRÊN LED 7 ĐOẠN DẠNG 7 ĐOẠN DẠNG
17 ĐOẠN NHỊ PHAN THẠP LỤC PHAN
0 0 0 111111 3F

1 0 0 0 0 0 1 10 06

2 0 10 1 1 0 11 5B

3 0 10 0 1 1 1 1 4F

4 0 110 0 110 66

5 0 110 110 1 6D

6 0 111110 1 7D

7 0 00 0 0 1 11 07

8 0 1111111 7F

9 0 110 1111 6F

A 0 1 1 1 0 111 77

B 0 111110 0 7C

c 0 0 1110 0 1 39

D 0 10 1 1 1 1 0 5E
E 0 11110 0 1 79

F 0 1110 0 0 1 71

- 0 10 0 0 0 0 0 40

131
CHƯdNG 7: eiẼU KHIỂN L£D 7 60AN U M q m r tliim

LE D 7 đ o ạ n sử d ụ n g tro n g chư ờ ng
T ro n g c hư ơ ng n à y c h ú n g ta sẽ sử d ụ n g c á c L E D 7 đ o a n c ó b á n ở các
ch ợ đ iệ n tử h a y c á c cử a h iệ u đ iệ n từ.

C á c L E D 7 đ o ạ n lo ạ i n à y đư ợc đ ó n g g ó i
kh á đ ẹ p . M ộ t s ố hìn h à n h v ề L E D 7 đ o ạ n b ạ n
c ó th ể m u a ở V iệ t N a m

Sơ đồ ch ân

Sơ đ ồ c h â n c h o h a i lo ạ i a n o d e v à c a th o d e tư ơng tự n h a u . T u y nhién
p h ầ n c o m m o n là c ự c tín h dư ơ ng n ế u là L E D 7 đ o ạ n a n o d e v à cự c tin h âm nếu
là L E D 7 đ o ạ n c a th o d e .

ĐÊM TU 0 ĐẾN 9 vứl LED 7 ĐOẠN (CATHODE CHUNG)


B à i tậ p n à y c h ú n g ta sẽ là m q u e n vớ i L E D 7 đ o ạ n lo ạ i c a th o d e chung.
Đ â y là lo ạ i c ó c h â n c h u n g là cự c tín h â m . C hư ơ n g trin h c h o b à i tậ p nà y khá
đơn g iả n , g iú p h iể n th ị c á c s ố từ 0 đ ế n 9 trê n L E D 7 đ o ạ n .

P h ầ n c ứ n g b à i n à y c ũ n g k h á đơ n g iả n . B ạ n d ù n g c á c đ ié n trỏ để hạn
d ò n g c h o L E D 7 đ o ạ n lo ạ i c a th o d e c h u n g . B ạ n c ó th ể x e m s o đ ố c h â n để kết
n ố i v ớ i b o m ạ c h A rd u in o .

P hần cứng

B ạ n có th ể d ù n g c á c đ iệ n trở đ ể h ạ n d ò n g c h o từ ng đ o a n c ù a LE D 7
đ o ạ n h o ặ c h ạ n d ò n g như trìn h b à y sau đ ể tiế t k iệ m đ iê n trà C 'i3 L E D 7 đoan
ở đ â y c h ú n g ta i sử d ụ n g c á c h h ạ n d ò n g b ằ n g 1 đ iệ n trờ à c -.ẳ n c h u n g như
hình k ế t n ố i m ạ c h ò tra n g b ê n . B ả n g tra n g b ẽ n là c á c h x ế : -IÕ'| b o m ach
A rd u in o v ớ i L E D 7 đ o ạ n .

332
A t ll M O OANH CHO NGƯƠI T ự HOC CHƯƠNG 7 : Đ IỂ U K H IỂ N LED 7 Đ O ẠN

BO M ẠCH ARDUINO LE D 7 ĐO ẠN

Chân số 0 Đ oạn A

Chân số 1 Đ oạn B

Chán số 2 Đ oạn c

Chân số 3 Đ oạn D

Chân số 4 Đoạn E

Chân số 5 Đoạn F

Chân số 6 Đoạn G

H ìn h ả n h k ế t n ố i n h ư h ìn h d ư ớ i. C h ú n g tô i đ ã đ á n h d ấ u c á c c h â n k ế t
nối với L E D 7 đ o ạ n b ằ n g c á c L a b e l đ ể r ú t g ọ n h ìn h ả n h :

DUIN01

333
CHƯƠNG 7: SIẾ1 H Ể I l£l 7 M Ạ I _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ U I— w Cim tW l K EC

Hoạt dộng của chưửng trình

B à i íậ p n à y sẽ đ ế m từ 0 đ ế n 9, s a u m ỗ i g iâ y thì sẽ tá n g b iế n đếm 1

C i o q
lần v à L E D 7 đ o ạ n sẽ s á n g th e o c á c s ố đ ế m n à y :

n 1 3 1 u 1
c
:
u I C : 50 iu J
J 1 Phần mềm
V iệ c lậ p trìn h c h o b à i tậ p n à y tư ơng đ ố i đơn g iả n . B ạ n sẽ sử dụ ng lại
c á c h à m d ù n g đ ể x u ấ t dữ liệ u từ b iế n tạ m ra c á c c h â n n g õ ra c ù a bo mạch
A rd u in o như b à i đ iề u k h iể n LE D đơn.

Chương trình đếm từ 0 đến 9 với LED 7 đoạn (Cathode Chung):

// Chương trình đếm từ 0 đến 9 với LED 7 đoạn cathode chung


II Màng chứa các giá trị điều khiển LED 7 đoạn
// cathode chung (các giá trị này được liệt kê
II trong bàng giới thiệu LED 7 đoan

334
M W W IlA W C M W r t l T f l f C CHtftfNG 7 : A IẾ O K H IỂ N LEO 7 ĐO ẠN

u n s ig n e d c h a r
L E D S E G []= { 0 x 3 F ,0 x 0 6 ,0 x 5 B ,0 x 4 F , 0 x 6 6 ,0 x 6 D , 0 x 7 D ,0 x 0 7 ,0 x 7 F ,0 x 6 F , 0 x 7 7 ,0 x 7
C .0 x 3 9 ,0 x 5 E ,0 x 7 9 ,0 x 7 1 ,0 x 4 0 ) ;

// Biến tạm
u n s ig n e d c h a r L E D O U T P U T ;

// Hàm lấy các bit riêng lẻ


b o o le a n B it s t a t e ( c h a r v a l, c h a r p o s )

b o o le a n x b it;

u n s ig n e d c h a r x c h a r = - 1 ;

if ( p o s < 1 6) x c h a r= 0 x 1 & v a l » p o s ;

x b it= x c h a r;

re tu rn x b it;

// Hàm xuất ra các chân ngõ ra


void C h a n g e O u tp u tO

fo r(in t i= 0 ;i< 8 ;i+ + )

d ig ita lW r ite ( i,B itS ta te ( L E D O U T P U T ,i) ) ;

// Hàm giải mã số đếm thành các giá trị mã xuất cho LED 7 đoạn
u n s ig n e d c h a r D e c o d e N u m b e r ( c h a r n u m )

re tu rn L E D S E G [ n u m ] ;

// Chương trình khởi tạo


vo id s e tu p O

{
CHƯƠNE 7: 6 IÉ U KHIẾM LED 7 BOẠIỈ U I« M u m CH I K H I ĩ > »

fo r(in t i= 0 :i< 7 ;i+ + )

p in M o d e (i,O U T P U T );

// Chương trình chính


v o id loopO

// Vòng lặp cho biến đếm


fo r (in t i =0 ; i< 1 0; i+ + )

L E D O U T P U T = D e c o d e N u m b e r(i);

C h a n g e O u tp u t();

d e la y (1 0 0 0 ); // Đợi 1 giây

H ã y b iê n d ịc h và tả i chư ơ ng trin h x u ố n g b o m ạ c h A rd u in o b ạ n sẽ thấy


L E D 7 đ o ạ n đ ế m từ 0 đ ế n 9 m ỗ i g iâ y . K h i đ ế m đ ế n 9 thì L E D 7 đ o ạ n sẽ đếm
lạ i từ đ ầ u .

T im h iể u p h ầ n m ề m

C hư ơ n g trìn h c h o b à i tậ p n à y b ắ t đ ầ u b ằ n g v iệ c k h a i b á o m ộ t mảng
ch ứ a c á c giá trị đ ể đ iể u k h iể n L E D 7 đ o ạ n tư ơng ứ ng v ó i c á c đ o ạ n A đến G
B ạ n k h a i b á o m ả n g n à y th e o L E D 7 đ o ạ n m ìn h đ a n g d ù n g . B á i n à y ch ú n g ta
d ù n g L E D 7 đ o ạ n c a th o d e c h u n g n ê n c h ú n g ta k h a i b á o m ả n g nnư sau:

u n s ig n e d c h a r
L E D S E G []= (0 x 3 F .0 x 0 6 ,0 x 5 B ,0 x 4 F ,0 x 6 6 ,0 x 6 D ,0 x 7 D ,0 x 0 7 ,0 x 7 F 0 x 6 F .0x77,0x7
c , 0 x 3 9 ,0 x 5 E ,0 x 7 9 .0 x 7 1 ,0 x 4 0 );

T iế p th e o là k h a i b á o b iế n đ ể c h ủ n g ta c h ứ a c á c g iá • ' z ải rriâ va xuất


giá trị n à y ra c á c c h â n c ủ a b o m ạ c h A rd u in o :

u n s ig n e d c h a r L E D O U T P U T ;

C á c h à m q u e n th u ộ c b a n đã b iế t:

336
UIIHIIAM Ntứơl TựBỊC CHƯƠH6 7 : Điếu KHIẾM LED 7 S O Ạ N

b o o le a n B it s t a t e ( c h a r v a l, c h a r p o s )

b o o le a n x b it;

u n s ig n e d c h a r x c h a r = - 1 ;

if ( p o s < 1 6 ) x c h a r= O x 1 & v a l » p o s ;

x b it= x c h a r ;

re tu rn x b it;

v o id C h a n g e O u tp u t( )

fo r ( in t i= 0 ;i< 8 ;i+ + )

d ig ita lW r ite ( i,B itS ta te ( L E D O U T P U T ,i) ) ;

H à m m ớ i tr o n g b à i tậ p n à y là h à m D e c o d e N u m b e r , h à m n à y d ù n g đ ể
ch u yể n đ ổ i c á c s ố đ ế m th à n h c á c g iá trị đ iề u k h iể n L E D 7 đ o ạ n . N ế u k h ô n g
có h à m n à y m à c h ú n g ta s ử d ụ n g trự c t iế p g iá trị c ủ a s ố đ ế m th ì k h i h iể n th ị
LED 7 đ o ạ n s ẽ b ị s a i.

u n s ig n e d c h a r D e c o d e N u m b e r ( c h a r n u m )

r e tu r n L E D S E G [ n u m ] ;

H à m n à y k h á đ ơ n g iả n . N ó c ó n h iệ m v ụ là lấ y s ố tr o n g th ô n g s ố n u m
đê’ lấy c á c g iá tr ị đ iề u k h iể n từ m ả n g L E D S E G . T iế p th e o là c h ư ơ n g trìn h k h ở i
tạo đã q u á q u e n th u ộ c v à c h ư ơ n g trìn h c h ín h n h ư s a u :

v o id lo o p Q

fo r ( in t i = 0 ; i< 1 0 ; i+ + )

3 37
CHƯƠNG 7: BIẾU (HIỂN LED 7 ĐOẠN UM— UM CIIIKếllTH C

L E D O U T P U T = D e c o d e N ijm b e r(i);

C h a n g e O u tp u t();

de la y (1 OOO); // Dợi 1 giãy


}

}
B ạ n đơn g iả n c h ì d ù n g v ò n g lặ p fo r đ ể đ ế m từ 0 đ ế n 9 m ỗ i giây.
T ro n g m ỗ i lầ n tă n g b iế n đ ế m th i g iả i m ã và đ iề u k h iể n L E D 7 đ o ạ n sá n g theo
số đếm .

ĐẾM ĩ ií 0 ĐẾN 9 VỚI LED 7 ĐOẠN (ANODE CHUNG)


B à i tậ p trư ớ c c h ú n g ta đã đ iề u k h iể n m ộ t L E D 7 đ o ạ n C a lh o d e chung
T ro n g b à i tậ p n à y c h ú n g ta c ũ n g sẽ đ ế m từ 0 đ ế n 9 nh ư n g sử d ụ n g LED 7
đ o ạ n A n o d e c h u n g . V iệ c n à y sẽ g iú p b ạ n h iể u th ê m về cả L E D 7 đ o ạ n Anode
c h u n g c ũ n g như C a th o d e c h u n g .

P hẩn cứ ng

P h ầ n c ứ n g b à i n à y k h á đơn g iả n .
C h ú n g ta sẽ d ù n g L E D 7 đ o ạ n lo ạ i A n o d e c h u n g đ ể h iể n th ị cho bài
tậ p nà y.

C á c k ế t n ố i từ b o m ạ c h A rd u in o đ ế n L E D 7 đ o ạ n nhơ b à n g sau:

BO MẠCH ARDUINO LED 7 ĐOẠN

C hân số 0 Đ oạn A

C hân số 1 Đ oạn B

C hân số 2 Đ oạn c
C hân số 3 Đ oạn D

C hân số 4 Đ oạn E

C hân sổ 5 Đ oạn F

C h â n sô 6 Đ oạn G

H ìn h ảnh kết nối như hìn h tra n g bên, th a y vì đi. .'ói LE D ma


trậ n c a th o d e c h u n g c h ú n g ta nố i c h â n c h u n g q u a đ iê n trò G N D th i đối
vớ i LE D m a trà n A n o d e c h u n g c h ú n g ta sẽ n ố i c h â n c h u ig đ iẻ n trò lén
nguồn Vcc.

338
W H i l IA W C H H6ƯỜI Tặ IỌC CHUtfWG 7: ĐIẾU KHIẾN LED 7 ĐĐẠH

ARDUỈNO UNO R3

R2
100

LED1 A
LED1 B
LED1
LED1
c
D M
LED1 E
LED1 F
• LED1 G I
33 S
CHƯƠNG 7: ĐIỂM I B Ế H I E I 7 BtẠM IẲ H c h w « m T Ị m

Phẩn mểm
C hư ơ n g trìn h c h o b à i tậ p n à y tương tự như b à i tru ó c tu y n h iê n c á c giá
trị đ iề u k h iể n b ạ n c ầ n th a y đ ổ i.

M ả n g c h ứ a m ã đ iề u k h iể n c h o L E D 7 đ o ạ n a n o d e c h u n g h o à n toàn
k h á c vớ i L E D 7 đ o ạ n c a th o d e c h u n g .

Chương trình đếm từ 0 đến 9 với LED 7 đoạn (Anode chung):

// Chương trình đếm từ 0 đến 9 với LED 7 đoạn anode chung

II Mảng chứa các giá trị điều khiển LED 7 đoạn anode chung
u n s ig n e d c h a r
LE D S E G []= {O xC O ,O xF 9,O xA 4,O xB O ,O x99,0 x 9 2 ,0 x 8 2 ,0 x F 8 ,0 x 8 0 .0 x 9 0 , 0 x 88 ,0x 8
3 ,0 x C 6 ,0 x A 1 ,O x86,O x8E ,O xB F);

// Biến tạm
u n s ig n e d c h a r L E D O U T P U T ;

// Hàm lấy các bit riêng lẻ


b o o le a n B its ta te ( c h a r va l, c h a r p o s )

{
b o o le a n xb it;

u n s ig n e d c h a r x c h a r= -1 ;

if (p o s < 16) x c h a r= 0 x 1 & v a l> > p o s ;


x b it= x c h a r;

re tu rn xb it;

// Hàm xuất ra các chân ngõ ra


v o id C h a n g e O u tp u tO

{
fo r(in t i= 0 ;i< 8 ;i+ + )

{
d ig ita l W rite (i.B itS ta te (L E D O U T P U T ,!));

340
CBƠƠM6 7: etếp IHIẼH L£p 7 S O Ạ H

// Hàm giải mã số đếm thành các giá trị mã xuất cho LED 7 đoạn
unsigned char D e cod eN um ber(ch ar num)

(
re tu rn L E D S E G [n u m ];

// Chương trình khởi tạo


void setup O

(
fo r(in t i= 0 ;i< 7 ;i+ + )

{
p in M o d e (i, O U T P U T );

II Chương trình chính


void loop Q

// Vòng lặp cho biến đếm


fo r (in t i = 0 ; i< 1 0 ; i+ + )

L E D O U T P U T = D e c o d e N u m b e r ( i) ;

C h a n g e O u tp u tQ ;

d e la y (IO O O ); / / Đợi 1 giày


)

H ã y b iê n d ịc h v à tả i c h ư ơ n g tr in h x u ố n g b o m ạ c h A r d u in o .

B ạ n s ẽ th ấ y L E D 7 đ o ạ n đ ế m từ 0 đ ế n 9 m ỗ i g iâ y .

K h i đ ế m đ ế n 9 th) L E D 7 đ o ạ n s ẽ đ ế m lạ i từ đ ẩ u .

N h ư b ạ n c ó th ể th ấ y , c h ư ơ n g tr in h b à i n à y tư ơ n g tự n h ư b à i trư ớ c tu y
n h iê n m ả n g c h ứ a g iá trị đ iề u k h iể n c h o L E D 7 đ o ạ n h o à n to à n k h á c .

141
CHƯƠN6 7 : O IẾ n IM Ế » l£ D 7 6 0 Ạ H JJJVM UMCBO WtOOl Tf Mt

ĐẾM Ttf 0 ĐẾN 99 sử DỤNG 2 LED 7 ĐOẠN (ANODE CHUNG)


T ro n g b à i tậ p n à y c h ú n g ta sẽ sừ d u n g 2 L E D ~ í : õ " đẽ tu 00
đ ế n 99. Đ â y là ph ư ơ ng p h á p h iể n th ị L E D 7 đ o a n trự c :'iễp N g n ĩa là c h ú n g ta
sẽ đ iề u k h iể n trự c tiế p c á c L E D 7 đ o ạ n b ằ n g c á c c h â n CŨ3 b o m a c h A rduino
C hư ơ ng trìn h n à y n h ằ m m ụ c đích g iú p b ạ n tìm h iể u c á C i '.ácn só đ ê m 0 dang
h à n g c h ụ c đ ể h iể n th ị trẽ n L E D 7 đ o ạ n .

P hần cứ ng

T ro n g c á c b à i tậ p trư ớ c b ạ n c h ỉ sử d ụ n g 1 L E D 7 đ o a n . T ro n g bà i táp
n à y c h ú n g ta s ẽ sử d ụ n g 2 L E D 7 đ o ạ n đ ể h iể n th ị đư o c n ô t số h à n g chuc
N ế u b ạ n sử d ụ n g bo m ạ c h A rd u in o U N O c h ú n g ta c h ỉ có th ể đ iề u k h iể n 2 LED
7 đ o ạ n b ằ n g ph ư ơ ng p h á p trự c tiế p . B ạ n h ã y k ế t n ố i c á c L E D 7 đ o ạ n như
b ả n g sau:

BO MẠCH ARDUINO LED 7 ĐOẠN 1 - ■ LED 7 ĐOẠN 2 I

C hân số 0 Đoạn A

C hân số 1 Đoạn B

Chân số 2 Đoạn c

C hân số 3 Đ oạn D

Chân số 4 Đ oạn E

Chân số 5 Đ oạn F

Chân số 6 Đ oạn G

C hân số 8 Đ oan A
C hân số 9 Đ oạn B

Chân số 10 Đ oạn c
Chân sô' 11 Đ oan D

C h â n s ổ 12 Đ oạn E

C h â n số 13 Đoan -

C h â n tư ơ n g tự A N 5 I Đoan G

"n h ả n h k ế : n ố i 2 LE D 7 đ o a n như hình 'ra n g b è "

342
u i i a i >ẰWI CBO N6ƠỞI Tự ạqc CHƯđNC 7: AIỂƯ KHIẾN LED 7 ĐOẠN

DUJNQ1

ỆẾMMÊmỂÊỄề
f i l l i p l l
m ÊÊm m &ế
Wmmm fấ€Wấ
mỆÊÊÊÊễỆÊầ
lijlliii mÈÊIÊmÊÊmầ
'' . ' '• ' / / " / '■ . / '/ " t ỳ

mÊÊẫÊầ m &Ếm
Cw
H I

/ ; ■.: .
ARDUÌNO ƯNÕ R 3

343
CHƯƠNB 7 : 8 I Ế I m ế n LE» 7 eaẠH UW CNKHlTffl

Hoạt động của chương trình


B à i tậ p n à y s ẽ lậ p trìn h đ ế m từ 0 đ ế n 9 9 , sau m ỗ i g iâ y th i sẽ tă n g bién
đ ế m 1 lầ n v à 2 L E D 7 đ o ạ n sẽ s á n g th e o c á c s ố đ ế m n à y .

Phần mềm
C hư ơ n g trìn h b à i tậ p n à y k ế th ừ a chư ơ ng trin h c ù a b à i tâ p trư dc. Tuy
n h iê n , b ạ n c ũ n g c ầ n p h ả i tìm h iể u m ã lệ n h chư ơ ng trin h vì b à i tậ p n à y chúng
ta sẽ th ê m p h ầ n th ự c h iệ n tá c h s ố đ ế m h à n g c h ụ c th à n n na i s ố riê n g lè hiển
th ị trê n L E D 7 đ o ạ n .

Chương trình đếm từ 0 đến 99 với 2 LED 7 đoạn (anode chung):


// Chương trình đếm từ 0 đến 99 với 2 LED 7 đoạn anode chung

II Mảng chứa các giá trị điều khiển LED 7 đoạn anode chung
u n s ig n e d c h a r
L E D S E G []= {0 x C 0 ,0 x F 9 ,0 x A 4 ,0 x B 0 ,0 x 9 9 ,0 x 9 2 ,0 x 8 2 ,0 x F 8 ,0 x 8 0 ,0 x 9 0 ,0 x 8 8 ,0 x 8
3 ,0 x C 6 ,0 x A 1 ,0 x 8 6 ,0 x 8 E ,0 x B F };

// Biến tạm
u n s ig n e d c h a r L E D O U T P U T ;

// Hàm lấy các bit riêng lẻ


b o o le a n 8 its ta te ( c h a r v a l, c h a r p o s )

{
b o o le a n xb it;

u n s ig n e d c h a r x c h a r= -1 ;

if( p o s < 1 6 ) x c h a r= 0 x 1 & v a l> > p o s ;


x b it= x c h a r;

re tu rn x b it;

// Hàm xuất ra LED1


v o id C h a n g e L E D 1 ()

{
fo r (in t i= 0 ;i< 7 ;i+ + )

{
d ig ita lW rite (i,B itS ta te (L E D O U T P U T ,i));

!4 «
M ini IAN* CH0H6ƯỪI TựBỌC CHƯỬN6 7: BIỂU KHIẾN LED 7 ĐOẠN

// Hàm xuất ra LED2


void C h a n g e L E D 2 ()

I
fo r(in t i= 0 ;i< 6 ;i+ + )

(
d ig ita !W r ite ( i+ 8 ,B itS ta te ( L E D O U T P U T ,i) ) ;

}
d ig ita lW rite (A 5 , B itS t a te ( L E D O U T P U T ,6 ) ) ;

// Hàm giải mã số đếm thành các giá trị mã xuất cho LED 7 đoạn
u n s ig n e d c h a r D e c o d e N u m b e r ( c h a r n u m )

{
re tu rn L E D S E G [n u m ];

// Chương trinh khởi tạo


void s e tu p O

í
fo r(in t i= 0 ;i< 1 4 ;i+ + )

p in M ũ d e (i,O U T P U T ) ;

p in M o d e (A 3 , O U T P U T )

p in M o d e (A 4 , O U T P U T )

p in M ũ d e ( A 5 ,O U T P U T )

// Chương trình chinh


vo id lo o p ()

345
CHƯƠNG 7: 8IẼIIHIẾM L£l 7 BOẠH u»— iA M C M I t W l I f W

// Vòng lặp cho biến đếm


fo r (in t i = 0 ; i< 9 9 ; i+ + )

{
L E D O U T P U T = D e c o d e N u m b e r(i/1 0 );
C h a n g e L E D I ();
L E D O U T P U T = D e c o d e N u m b e r(i% 1 0 );
C h a n g e L E D 2 ();

d e la y (1 0 0 ); / / Dợi 1 giây
)
}
H ã y b iê n d ịc h v à tả i chư ơ ng trin h x u ố n g b o m ạ c h A rd u in o . B ạ n sẽ thấy
2 L E D 7 đ o ạ n đ ế m từ 0 đ ế n 99 m ỗ i g iâ y . K h i đ ế m đ ế n 9 9 th i 2 L E D 7 đ o ạ n sẽ
đ ế m lạ i từ 00.

T ìm h iể u p h ầ n m ề m

N hư b ạ n đã b iế t, chư ơ ng trìn h b à i tậ p n à y k ế th ừ a c ủ a chư ơ ng trình bài


tậ p trư ớ c. T u y n h iê n , tro n g b à i tậ p n à y đ ể q u é t 2 L E D 7 đ o a n c h ú n g ta cấn
p h ả i đ iề u k h iể n 14 c h â n c ủ a 2 L E D 7 đ o ạ n . V ì v ậ y c h ú n g ta sẽ có hai hàm
đ iề u k h iể n 14 n g õ ra n à y , m ỗ i h à m sẽ đ iể u k h iể n 7 n g õ ra c ù a b o mạch
A rd u in o . H à m đ iể u k h iể n 7 c h â n n g õ ra c ũ a L E D 1:

v o id C h a n g e L E D 1 ()

{
fo r(in t i= 0 ;i< 7 ;i+ + )

{
d ig ita lW rite (i.B itS ta te (L E D O U T P U T ,i));

}
}
V à h à m đ iề u k h iể n 7 n g õ ra c ủ a L E D 2:

v o id C h a n g e L E D 2 ()

{
fo r (in t i= 0 ;i< 6 ;i+ + )

{
d ig ita l W rite (i+ 8 ,B itS ta te ( L E D O U T P U T , i));

}
d ig ita lW rite (A 5 , B itS ta te (L E D O U T P U T ,6 ));
U l l i l BAND CHO W6ựơlTựHqC CHƯƠNG 7: fllẾU KHIẾN LED 7 ĐOẠN

C h ú n g ta tiế p tụ c đ ế n v ớ i c h ư ơ n g trìn h c h ín h đ ể tìm h iể u c á c h tá c h s ố


và g iả i m ã h iể n th ị c h o L E D 7 đ o ạ n :

v o id lo o p O

fo r (in t i = 0 ; i< 9 9 ; i+ + )

L E D O U T P U T = D e c o d e N u m b e r ( i/1 0 ) ;

C h a n g e L E D 1 ();

L E D O U T P U T = D e c o d e N u m b e r ( i% 1 0 );

C h a n g e L E D 2 ();

d e la y ( 1 0 0 ) ; / / Đợi 1 giây

N h ư b ạ n c ó th ể th ấ y , c h ú n g ta c ũ n g th ự c h iệ n h iể n th ị c h o từ n g L E D 7
đoạn v à th ự c h iệ n tá c h s ố đ ế m b ằ n g p h ư ơ n g p h á p d ù n g c á c lũ á n tử c h ia V
và lấ y p h ầ n d ư " % ” .

Đ ể lấ y đ ư ợ c h à n g c h ụ c b ạ n th ự c h iệ n lấ y s ố đ ế m c h ia c h o 10. V à đ ể
thực h iệ n lấ y h à n g đ ơ n v ị lấ y p h ẩ n d ư c ủ a p h é p c h ia c h o 1 0 . V í d ụ b ạ n c ó s ố
78, để lấ y p h ầ n c h ụ c b ạ n c h ia c h o 10:

7 8 /1 0 = 7

V à đ ể lấ y p h ầ n đ ơ n v ị b ạ n lấ y p h ầ n d ư c ủ a p h é p tín h :

78% 7=8

Đ ể lấ y c á c s ố h à n g tr ă m , h à n g n g à n c h ú n g ta c ũ n g sử d ụ n g p h ư ơ n g
pháp n à y .

Đ ể lấ y h à n g tr ă m c h ú n g ta s ẽ th ự c h iệ n n h ư s a u :

H à n g tră m = s ố đ ế m /1 0 0

H à n g c h ụ c = ( s ố đ ế m /1 0 ) % 1 0

H à n g đ ơ n v ị = s ố đ ế m % 10

P h ư ơ n g p h á p n à y b ạ n c ò n g ặ p r ấ t n h iề u đ ể th ự c h iệ n h iể n th ị s ố trê n
các lo ạ i m à n h ìn h h iể n th ị n h ư L E D 7 đ o ạ n , L E D m a tr ậ n , L C D .

347
CHƯƠNG 7: ĐIỂU KHIỂN LED 7 60ẠN U t lM D BAiyH CHD MCưm ĩ ặ * t

ĐÉM ĩữ 0 ĐẾN 999 sử DỤNG 3 LED 7 ĐOẠN (PP QUEĨ LED)


N hư c h ú n g ta đã b iế t A rd u in o U no k h ố n g thể n à s CD 3Ũ c á c n g õ ra d í
b ạ n th ự c h iệ n đ iể u k h iể n n h iề u hán 2 L E D 7 đ o a n N iu '” 3 v ấ n dẽ đ ầ t ra là:
T ro n g th ự c tế c h ú n g ta m u ố n SỪ d ụ n g n h ié u h o n 3 L E D 7 á o a n th i c h ú n g ta
p h ả i là m thê n à o ?
C â u trà lời là: B ạ n h o à n có th ể đ iề u k h iể n nhiếu n o n 3 L E D 7 đ o ạ n đ i
th ự c h iể n th ị c á c s ố lớn. V à đ ể thự c h iệ n v iệ c n à y c h ú n g ta s ẽ thự c hiộn
phư ơ ng p h á p q u é t L E D như L E D m a trậ n . T u y n h iê n , tro n g tru ờ n g hợ p này là
q u é t LED 7 đoạn.

Q uét LED 7 đoạn


P hư ơ ng p h á p q u é t L E D 7 đ o ạ n là ph ư ơ ng p h á p th ự c h iệ n s á n g từng
L E D 7 đ o ạ n tro n g m ộ t k h o ả n g thờ i g ia n n g ắ n . V à lừ n g L E D 7 đ o ạ n sẽ sáng
lầ n lượt đ ế n L E D 7 đ o ạ n c u ố i c ù n g .

P hư ơ ng p h á p được d iễ n tả b ằ n g h in h ả n h nh ư s a u . C h ú n g ta giả sử
m u ố n h iể n th ị số 0 1 2 3 trê n 4 L E D 7 đ o ạ n :

B an đ ầ u c h ú n g ta c h o s á n g L E D 1 s á n g s ố 0 tro n g m ộ t k h o ả n g thời
g ia n n g ắ n :

S au đó tắ t L E D 1 và s á n g LE D 2 tro n g k h o ả n g thờ i g ia n n g ắ n :

348
CHƯ0N6 7: ĐIẾU KHIỂN LED 7 ĐOẠN
U B IW I DAUB CHO H6ƠƠI Tự HỌC

S ỉ - - á

C u ố i c ù n g là L E D 4:

V à v ớ i tố c đ ộ s á n g tắ t (h a y q u é t) liê n tụ c c ủ a từ n g L E D th ì m ắ t th ư ờ n g
của c h ú n g ta s ẽ th ấ y L E D h iể n th ị s ô 0 1 2 3 tr ê n 4 L E D 7 đ o ạ n :

P hấn cứ ng

B à i tậ p n à y c h ú n g ta s ẽ s ử d ụ n g 3 L E D 7 đ o ạ n đ ể th ự c h iệ n c ô n g v iệ c
hiển đ ế m từ 0 đ ế n 9 9 9 . B ạ n c ó th ể k ế t n ố i c á c c h â n n g õ ra c ù a b o m ạ c h
A rd u in o v ớ i L E D 7 đ o ạ n h o ặ c n ô i th ô n g q u a t r a n s is to r đ ể g iú p tă n g d ò n g c h o
LE D 7 đ o ạ n . B ạ n k ế t n ố i b o m ạ c h A r d u in o v ớ i L E D 7 đ o ạ n n h ư b à n g s a u :

34 9
CHƯƠM67: ĐIỂB IIIẾIÍ LEI 7 eOẠN U H M CẦWB CHOW(W ĩ f n t

BO MẠCH LED 7 ĐOẠN 3


LED 7 ĐOẠN 1 LED 7 ĐOẠN 2
AROUINO
C hân số 0 Đ oạn A Đ oạn A Đoạn A

C hân số 1 Đ oạn B Đoạn B Đoạn B

C hân số 2 Đoạn c Đoạn c Đoạn c

C hân số 3 Đ oạn D Đoạn D Đoạn D

C hân số 4 Đoạn E Đoạn E Đoạn E

Chân số 5 Đoạn F Đoạn F Đoạn F

C hân số 6 Đoạn G Đoạn G Đoạn G

Chân số 8 C hân chung


h o ặ c th ô n g q u a
tr a n s is t o r

Chân số 9 C hân chung


h o ặ c th ô n g q u a
t r a n s is t o r

C h â n s ố 10 C hân chung
h o ặ c th ô n g qua
tr a n s is t o r

H in h dưới là k ế t n ố i b o m ạ c h A rd u in o d ù n g tra n s is to r.

350
M G 7: ĐIẾII KHIỂN LED 7 Đ0ẠN
OHM lAMCIimWlTfHC

Hlnh dưới là kết nối bo mạch Arduino không dùng transistor.

DUIN01

13

j : ' p f i4 ,* s c y - “ -
I H ^ W l O LED3
2 ' /'
i r9' ......rLẺb
F B a s f r O c ie j g b2
4 , f___ PB1w iftr -ị5 —
8 ll^(=I dij
3 1 Ẽ Ể É F y S m — 2— ^

1 7
ÍT G
1 5 F •
ấ 4 E •
1 3 D*
PD?1l c*
í 2
1 1 b:
1 0 A■
Ig D q /R jiD te
- i r a v . . ;
ARDUINO UNO R3

N ố i c á c L E D 7 đ o ạ n v ớ i b o m ạ c h A r d u in o n h ư h ìn h d ư ớ i.

Ũ l l l l l l
I I I I I I I I
ABCDEFG OP 1234
ũ ũ ũ
LLỊ LLỊ

351
CHƯỨN6 7: 61Éu KHIẾMl ĩ l 7 60AH U W I I I I CIO W M I K « t

N ế u k h ô n g sử d ụ n g tra n s is to r b ạ n c ó th ể nổ i tru e '.lép c á c c h â n từ 8


đ ế n 10 vớ i c á c c h â n c h u n g c ù a 3 L E D 7 đ o ạ n . N ế u sử d o n g tra n s is to r b ạ n nối
c á c c h â n c ự c E tương ứng vớ i c á c c h â n c h u n g c ủ a L E D 7 đ o a n :

H o ạ t đ ộ n g c ủ a c h ư ơ n g tr ì n h
B à i tậ p n à y sẽ đ ế m từ 0 đ ế n 9 9 9 , sau m ỗ i g iâ y th i sẽ lã n g b iế n đếm 1
lầ n v à 3 L E D 7 đ o ạ n sẽ s á n g th e o c á c s ố đ ế m n à y.

Phần m ềm
C hư ơ n g trin h b à i n à y h o à n to à n k h á c vớ i c á c c hư ờ ng trin h c h ú n g . Bởi
vi tro n g b à i n à y c h ú n g la th ự c h iệ n q u é t L E D th a y vì đ iề b k h iể n trự c tiế p Vi
v ậ y sẽ cỏ m ộ t s ố n h ữ n g h à m m ớ i v à c á c k h á c b iệ t v đ i h à m d e la y so với các
chư ơ ng trìn h trư ớ c

Chương trình đếm từ 0 đến 999 với 3 LED 7 đoạn bằng phương
p h á p q u é t (a n o d e c h u n g ):

// Chương trình đếm từ 0 đến 999 với 3 LED 7 đoạn


// bàng phương pháp quét (anode chung)

II Khai báo các tên LED ứng với các LED 7 đoạn
# d e fin e LE D 1 8
# d e fin e L E D 2 9
# d e fin e L E D 3 10

// Mảng chứa các giá trị điều khiển LED 7 đoạn anode chung
u n s ig n e d c h a r
L E D S E G []= {0 x C 0 ,0 x F 9 ,0 x A 4 ,0 x B 0 ,0 x 9 9 ,0 x 9 2 .0 x 8 2 ,0 x F 8 ,0 x 8 0 .0 x 9 0 ,0 x 8 8 ,0 x 8
3 ,O x C 6 ,O x A 1 ,0 x 8 6 ,0 x 8 E ,0 x B F };

// Biến tạm
u n s ig n e d c h a r L E D O U T P U T ;
cha r n u m lE D I; // Biến chứa chữ số hàng trảm
cha r nu m LE D 2; // Biến chứa chữ sô' hàng chục
cha r nu m L E D 3 ; // Biến chứa chữ sô hàng đơn vị

II Hàm lấy các bít riêng lẻ


b o o le a n B its ta te ( c h a r va l, c h a r p o s )
{
b o o le a n xb it;
unsigned char xchar=-1;
if(p o s < 1 6 ) xchar=0x1 & v a l> > p o s :
x b it= x c h a r:

352
m m n u a CHO N 6ưifi ĩự HỌC CHƯƠNG 7 : 8IẼD KHIẾN LED 7 ĐOẠH

re tu rn x b it;

II Hàm xuất ra các chân ngõ ra


void C h a n g e O u tp u t()

(
for(int i= 0 ;i< 8 ;i+ + )

(
d ig ita lW r ite (i,B itS ta te ( L E D O U T P U T ,i)) ;

II Hàm quét LED


void D is p la y L E D O

{
//Sáng LED 1 trong một thời gian ngắn
L E D O U T P U T = D e c o d e N u m b e r ( n u m L E D 1 );

C han g e O u tp u tQ ;

d ig ita lW rite (L E D 1 ,H IG H ); / / Cấp diện áp cao cho chân chung LED 1


d e la y (3 );

d ig ita lW r ite (L E D 1 ,L O W );

// Sáng LED 2 trong một thời gian ngán


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 2 );

C h a n g e O u tp u tO ;

d ig ita lW r ite ( L E D 2 ,H IG H ) ; / / Cấp điện áp cao cho chân chung LED 2


d e la y (3 );

d ig ita lW r ite ( L E D 2 ,L O W ) ;

// Sáng LED 3 trong một thời gian ngắn


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 3 );

C h a n g e O u tp u t();

d ig ita lW r ite ( L E D 3 ,H IG H ) ; / / Cấp điện áp cao cho chân chung LED 3


d e la y (3 );

d ig ita lW r ite ( L E D 3 ,L O W ) ;
CHƯỨNC 7 : e i Ế I m ill LEI 7 MẠH u r n |> W CIO M tư li T Ịặ í

// Tạo thời gian delay cùng lúc hiền thị


Delay 10MS má ẳn goi
v o id D e la y D is p la y l 0 M S (c h a r t im e ) //
{
fo r(in t i = 0 ;i< tim e ;i+ + ) D is p la y L E D O ;

// Hàm giải mã số đếm thành các giá trị mã xuất cho LED 7 đoan
u n s ig n e d c h a r D e c o d e N u m b e r(c h a r nu m )

{
re tu rn L E D S E G Ịn u m ];
}

// Chương trình khởi tạo


v o id se tu p O
í
fo r(in t i= 0 ;i< 1 4 ;i+ + )
{
p in M o d e (i,O U T P U T );
}
p in M o d e (A 3 , O U T P U T );
p in M o d e (A 4 ,O U T P U T );
p in M o d e (A 5 ,O U T P U T );
}

// Chương trinh chính


v o id loopO
{
// Vòng lặp cho biến đếm
fo r (in t I = 0 ; i< 1 0 0 0 ; i+ + )
{
n u m L E D 1 = i/1 0 0 ;
n u m L E D 2 = (i/1 0 )% 1 0 ;
n u m L E D 3 = i% 1 0;
D e ía y D is p la y 1 0 M S (1 0 0 ); // Đợi 1 giây
}
}
H ã y b iê n d ịc h và tả i chư ơ ng trin h x u ố n g b o m ạ c h A rd L ' 0 B a n sẽ tháy
3 L E D 7 đ o ạ n đ ế m từ 0 0 0 đ ế n 99 9 m ỗ i g iâ y . K hi đ ế m đ ế ' •II 3 LE D 7
đ o ạ n sẽ đ ế m lại từ 0 0 0 .

354
IrlP W t 1*1* CIO Mtlfifl nr n c CHƯƠNG 7: ĐIỂU KHIỂN LED 7 60ẠN

B à i tậ p n à y là b à i tậ p đầu tiê n s ử d ụ n g p h ư ơ n g p h á p q u é t c h o L E D 7
đo ạn n ê n b ạ n c ầ n p h ả i tìm h iể u v ề m ã lệ n h m ộ t c á c h c ẩ n th ậ n .

Tim hiểu phẩn mém


T r o n g b à i n à y vì đ iể u k h iể n 3 L E D 7 đ o ạ n n ê n c h ú n g ta s ẽ k h a i b á o
các c h â n c ủ a b o m ạ c h A r d u in o ứ n g v ớ i c á c L E D 7 đ o ạ n :

# d e fin e L E D 1 8

# d e fin e L E D 2 9

# d e fin e L E D 3 1 0

N g o à i ra c h ú n g ta k h a i b á o th ê m c á c b iế n đ ể c h ứ a c á c c h ữ s ố c ủ a s ố
đếm lẩ n lư ợ t là n u m L E D I , n u m L E D 2 , n u m L E D 3 ứ n g v ớ i c á c L E D 7 đ o ạ n 1
đế n 3:

cha r n u m L E D I ; II Biến chứa chữ số hàng trăm


cha r n u m L E D 2 ; / / Biến chứa chữ số hàng chục
ch a r n u m L E D 3 ; / / Biến chứa chữ số hàng đơn vị
H à m m ớ i đ ầ u t iê n là h à m q u é t L E D . H à m n à y c ó n h iệ m v ụ c h o s á n g
LED tro n g từ n g k h o ả n g th ờ i g ia n n g ắ n b ằ n g h à m d e la y . Đ ể s á n g L E D 1 tro n g
thời g ia n n g ắ n c h ú n g ta th ự c h iệ n đ iề u k h iể n c á c c h â n A - G s a u đ ó đ iề u
k h iể n m ử c c a o c h o c h â n c h u n g c ủ a L E D 1 n h ư s a u :

v o id D is p la y L E D O
{
L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 1 );
C h a n g e O u tp u t( ) ;
d ig it a iw r it e ( L E D 1 , H I G H ) ;
d e la y ( 3 ) ;
d ig ita lW r ite ( L E D 1 , L O W ) ;

N h ư b ạ n c ó th ể th ấ y tro n g p h ầ n m ã lệ n h tr ê n th ì c h ú n g ta s ẽ g iả i m ã
h iể n th ị đ ể đ iề u k h iể n c á c c h â n n g õ ra s a u đ ó c ấ p m ứ c c a o c h o c h â n c h u n g
LE D 1 tro n g k h o ả n g 3 m ilig iâ y s a u đ ó tắ t L E D 1

T iế p th e o c ũ n g th ự c h iệ n tư ơ n g tự v ớ i c á c L E D 2 v à L E D 3:

L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 2 );

C h a n g e O u tp u t( ) ;
d ig ita lW r ite ( L E D 2 , H I G H ) ;
d e la y ( 3 ) ;
d ig itá lW r ite ( L E D 2 , L O W ) ;

L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 3 );

C h a n g e O u tp u tQ ;

4CC
CHtftflW 7: C I Ẽ I H Ế I l £ l 7 M Ạ I U M CIO MUOI T | MC

d ig ita lW rite (L E D 3 ,H IG H );

d e la y (3 );
d ig ita l W rite ( LE D 3 .L O W );

}
T i ế p th e o là h à m D e la y D is p la y lO M S đ ể tạ o thờ i g ia n đợ i c ù n g lú c VỚI
v iệ c q u é t LE D :
v o id D e la y D is p la y l O M S (c h a r tim e )
{
fo r(in t i = 0 ;i< tim e ;i+ + ) D is p la y L E D O ;
)
N h ư b ạ n đ ã b iế t rằ n g , m ỗ i lầ n q u é t L E D c h ú n g ta tố n h o n 9 m ilig iâ y dể
q u é t q u a 3 L E D (m ỗ i L E D 3 m ilig iâ y ).
V à tổ n g thờ i g ia n đ ể th ự c h iệ n h ế t m ộ t lầ n q u é ! là k h o ả n g g ấ n 10
m ilig iâ y (c á c lệ n h khác) vì v ậ y chúng ta thự c h iệ n m ót lầ n gọi hàm
D is p la y L E D là tố n 10 m ilig iâ y . V à c h ú n g ta sẽ lạ o m ộ t h à n tạ o d e la y có thời
g ia n đợi n h ỏ n h ấ t là 10 m iiig iã y . Đ ể tạ o thờ i g ia n r1 lay 1 0 0 m ilig iâ y thì chúng
ta g ọ i h à m D e la y D is p la y 1 0 M S (1 0 ).

H à m D e c o d e N u m b e r v à c hư ơ ng trin h khở i tạ o b ạ n đã q u á q u e n thuôc


n ê n c h ú n g ta sẽ v à o chư ơ ng trin h ch ín h :

v o id lo o p ()

{
fo r (in t i = 0 ; i< 1 0 0 0 ; i+ + )

{
n u m L E D 1 = i/1 0 0 ;
n u m L E D 2 = (i/1 0 )% 1 0;
n u m L E D 3 = i% 1 0 ;
D e la y D is p la y 1 0 M S (1 0 0 ); II Dợi 1 giây
)
}

N hư b ạ n c ó th ể th ấ y c h ú n g ta sẽ tạ o m ộ t v ò n g lá p c n a y 1 0 0 0 lán
v à rú t từ ng ký tự c ủ a s ố đ ế m đ ể h iể n th ị v à o c á c b iế n n u m L E D I. n u m L E D 2
và num LED 3 sau đó tạ o th ò i g ia n đợ i 1 g iâ y bằng cách gọi hàm
D e la y D is p la y 1 0 M S (1 0 0 ) như trê n .

V ậ y là b ạ n đ ã thự c h iệ n phư ơ ng p h á p q u é t L E D 7 đ o a ' đ ể th ư c hién


đ iề u k h iể n n h iể u L E D 7 đ o ạ n c ù n g lúc.

B ạ n c ó th ể m o rộ n g lẽ n đ ế n 13 L E D 7 đ o ạ n trê n b o m a c -, A rd u in o

356
H N IM lAn tig wetftfl Tựwe___________ CHƯƠM6 8: HIỂNTHỊ «ẾĨ QUẢeo ĩil CÁMBIẾN NHIỆT Bệ VÀ flệ ẨM

CHƯƠNG 8

HIỂN THỊ KẾT QUẢ ĐOTÌÍCẢM BIÊN


Dộ VA Độ ẨM ■ ■

T ro n g b à i tậ p trư ớ c c h ú n g ta đ ã là m q u e n v ớ i L E D 7 đ o ạ n v à đ ã lậ p
trình đ iề u k h iể n c h o L E D 7 đ o ạ n đ ế m từ 0 đ ế n 9, đ ế m từ 0 đ ế n 9 9 sử d ụ n g 2
L E D 7 đ o ạ n c ũ n g n h ư đ ế m từ đ ế m từ 0 đ ế n 9 9 9 s ử d ụ n g 3 L E D 7 đ o ạ n . T ừ ý
tưởng c á c b à i tậ p n à y b ạ n c ó th ể h iể n th ị n h iề u s ố c ầ n th iế t v ớ i n h iề u L E D 7
đ o ạ n a n o d e c h u n g c ũ n g n h ư c a th o d e c h u n g . B ạ n c ó th ể tiế n h à n h d ù n g L E D
7 đ o ạ n đ ể tiế n h à n h q u ả n g c á o là m b ả n g đ ồ n g h ồ b á o g iờ v ớ i k íc h th ư ớ c lớ n
th a y v) d ù n g L C D h a y L E D m a tr ậ n đ ể h iể n th ị.

T ro n g b à i tậ p nà > c h ú n g ta s ẽ s ử d ụ n g b o m ạ c h A r d u in o đ ể h iể n th ị
kế t q u ả đ o từ c ả m b iế n b ằ n g L E D 7 đ o ạ n . Đ â y là v iệ c là m k h ô n g th ể th iế u
được trong điều khiển. Các cảm biến ỏ đây có thể là những đại lượng điện
như đ iệ n á p , d ò n g đ iệ n , đ iệ n trở... h a y k h ô n g đ iệ n n h ư n h iệ t đ ộ , á p s u ấ t, đ ộ
ẩ m , k h o ả n g c á c h , á n h s á n g , tố c đ ộ v.v...

T h ự c c h ấ t c ủ a v ấ n đ ề n à y là d ù n g b o m ạ c h A r d u in o đ ọ c g iá t r ị tư ơ n g
tự từ th ế g iớ i th ự c b ê n n g o à i v à o . T rư ớ c k h i th ự c h à n h b à i tậ p c h ín h là h iể n th ị
k ế t q u ả đ o từ c ả m b iế n n h iệ t đ ộ v à đ ộ ẩ m c h ú n g ta c ầ n c ó m ộ t k iế n th ứ c n ề n
về c á c h đ ọ c g iá tr ị a n a lo g v ớ i b o m ạ c h A r d u in o v à h iể n th ị tr ê n L E D 7 đ o ạ n .
V iệ c b iế t c á c h đ ọ c c á c g iá trị a n a lo g r ấ t c ó lợ i tr o n g tro n g q u ả n g c á o n ó i riê n g
và tro n g v iệ c h iể n th ị c á c g iá tr ị c ả m b iế n đ o đ ư ợ c tr ê n m à n h ìn h . V ớ i c á c g iá
trị h iê n th ị rõ r à n g s ẽ g iú p n g ư ờ i d ù n g c ó th ể th e o d õ i c á c g iá trị n h iệ t đ ộ . đ ộ
ẩ m , á p s u ấ t..., từ đ ó c ó th ể đ ư a ra c á c g iả i p h á p th íc h ứ n g .

ĐQC GIÁ TRỊ ANALOG ĩ í í BIÊN TRỞ VÀ HIỂN ĨH Ị TRÊN LED 7 ĐOẠN
P hần cứ ng

T r o n g b à i tậ p n à y c h ú n g ta s ẽ th ự c h iệ n h iể n th ị g iá trị b ộ c h u y ể n đ ổ i
tư ơng tự s a n g s ố tr ê n L E D 7 đ o ạ n d ự a v à o b iế n trở . V ì v ậ y c h ú n g ta s ẽ n ố i
th ê m b iế n trở v à o b o m ạ c h A r d u in o . H a i c h â n ngoài của b iế n trở nối vớ i
n g u ồ n + 5 V v à G N D v à chân g iữ a n ố i v ớ i b o m ạ c h A r d u in o th ô n g q u a c h â n
tương tự AO. C á c L E D 7 đ o ạ n n ố i v ớ i b o m ạ c h A r u in o q u a c á c c h â n (p in ) n h ư
b ả n g tr a n g b ê n , m ộ t k h i th a y đ ổ i b iê n trỏ c ó n g h ĩa ta th a y đ ổ i đ iệ n á p a n a lo g
đ ư a v à o b o m ạ c h A r d u in o đ ể xử lý.
CHƠƠNCI: lấn Tll IẾTỊIẨ M T<CẨMlếl MUỆĨ M »Ầlệ ẨM IM CHKMlTfJK

BO MẠCH LED 7 ĐOẠN LED 7 ĐOẠN LED 7 ĐOẠN BIẼN


ARDUINO 1 2 3 TRỞ
C hân số 0 Đ oạn A Đ oạn A Đoạn A

C hân số 1 Đ oạn B Đ oạn B Đ oạn 8

C hân số 2 Đ oạn c Đ oạn c Đ oạn c

C hân số 3 Đ oạn D Đ oạn D Đ oạn D

C hân số 4 Đ oạn E Đ oạn E Đ oạn E

C hân số 5 Đ oạn F Đ oạn F Đ oạn F

C hân số 6 Đ oạn G Đ oạn G Đ oạn G

C hân số 8 C hân chung


h o ặ c th ô n g qu a
tra n s is to r

C hân số 9 C hân chung


ho ặc thô ng
qu a tra n s is to r

C h â n s ố 10 C h â n ch u n g
ho ặc th ô n g qua
tra n sisto r

C hân tương Chân


tự AO giữa

H in h kết
nối 3 LED 7
đ o ạ n v à b iế n trở
như hình b ê n và
tra n g b ê n : I I _ ! I I I I
ĩ
I I I I I I I I
ASCDEFC DP 1234
TTTTTTTl

358
MHIM » ■ C lljO ilTjH C CHƯƠH6 8: HIẾN THỊ KẾT qUÁ 00 TÍÍ CẦM BIẾN NHIỆT BỘ VÂ flộ ẨM

Hoạt động của chương trình

B à i tậ p h ư ớ n g d ẫ n c á c b ạ n b iế t c á c h đ ọ c g iá trị đ iệ n á p từ b iế n trở v à
c h u y ể n th à n h g iá tr ị s ố th ô n g q u a b ộ c h u y ể n đ ổ i tư ơ n g tự th à n h s ố . S a u đ ỏ
c h ú n g ta s ẽ s ử d ụ n g g iá trị s ố đ ọ c đ ư ợ c v à h iể n th ị từ 0 - 1 0 2 4 . C h ú n g ta c h ỉ
sử d ụ n g 3 L E D 7 đ o ạ n n ê n c h ú n g ta s ẽ th ấ y x u ấ t h iệ n g iá trị c h ữ A tạ i L E D 1
khi c h ú n g ta c ó g iá trị đ iệ n á p đ ọ c v à o lổ n h ơ n 10 00. C hữ A ứng vớ i số 10
tro n g h ệ th ậ p lụ c p h â n . V à c h ỉ c ó L E D 1 h iệ n c h ữ “ A ” n ế u g iá trị v ư ợ t q u á
1000. B ạ n h ã y c h ú ý đ iể m n à y .

Phần mềm

Đ ể lậ p trìn h c h o b à i tậ p n à y b ạ n c ũ n g th ự c h iệ n q u é t L E D v à g iả i
q u y ế t m ộ t v ấ n đ ề s a u : C h ú n g ta s ẽ đ ọ c c á c g iá trị từ b iế n trở th ô n g q u a c á c
h à m x â y d ự n g s ẵ n c ù a A r d u in o ID E .

Chương trình đọc biến trở và hiển thị trên LED 7 đoạn:

// Chương trình đọc biến trở và hiển thị trên LED 7 đoạn

II Khai báo các tên LED ứng với các LED 7 đoạn

359
CHƯđNt l : l ế u T»l IẾ T U Ẩ w T l CẨM I Ế I M Ệ T l ệ VA t ệ ÍM im w ic t w w m t> w t

# d e fin e LE D 1 8

# d e fin e L E D 2 9

# d e fin e L E D 3 10

// Mảng chứa các giá trị điều khiển LED 7 đoạn Anode chw'g
u n s ig n e d c h a r
L E D S E G []= {0 x C 0 ,0 x F 9 ,0 x A 4 ,0 x B 0 ,0 x 9 9 ,0 x 9 2 ,0 x 8 2 ,0 x F 8 .0 x 5 0 .0 x 9 0 .0 x 8 8 .0 x 8
3 ,0 x C 6 ,0 x A 1 0 x 8 6 0 x 8 E O xBF};

// Biến tạm
u n s ig n e d c h a r L E D O U T P U T ;

char n u m L E D I; // Biến chứa chữ số hàng trăm


char num LE D 2; // Biến chứa chữ số hàng chục
cha r nu m LE D 3; // Biến chứa chữ sổ hàng đơn vị

II Hàm lấy các bit riêng lẻ


b o o le a n B itS ta te (c h a r va l, c h a r p o s )

{
b o o le a n xb it;

u n s ig n e d c h a r x c h a r= -1 ;

if (p o s < 1 6 ) x c h a r= 0 x 1 & v a l> > p o s ;


x b it= x c h a r;
re tu rn xb it;

// Hàm xuất ra các chân ngõ ra


v o id C h a n g e O u tp u t()

{
fo r (in t i= 0 ;i< 8 ;i+ + )

í
d ig ita lW rite (i, B its tate (L E D O U T P U T ,!));

}
// Hàm quét LED

360
I MHIWIAIM CION6IÍỜI TMPC CHƯƠMG 8: HIẾN THỊ KẾT qUẢ BO Tư CẦM BIÊU NHIỆT eộ VÀ flệ ẨM

void D is p la y L E D O

{
// Sáng LED 1 trong một thời gian ngán
L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 1 );

C h a n g e O u tp u tQ ;

d íg ita lW rite (L E D 1 ,H IG H ); / / Cấp điện áp cao cho chân chung LED 1


d e la y (3 );

d ig ita lW rite (L E D 1 ,L O W );

// Sáng LED 2 trong một thời gian ngấn


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 2 );

C h a n g e O u tp u tQ ;

d ig ita lW r ite ( L E D 2 ,H IG H ) ; / / Cấp điện áp cao cho chân chung LED 2


d e la y (3 );

d ig ita lW r ite (L E D 2 ,L O W );

// Sáng LED 3 trong một thời gian ngắn


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 3 );

C h a n g e O u tp u t();

d ig ita lW r ite ( L E D 3 ,H IG H ) ; / / Cấp điện áp cao cho chân chung LED 3


d e la y (3 );

d ig ita lW rite (L E D 3 , L O W ) ;

// Tạo thời giart delay cùng lúc hiển thị


void D e la y D is p la y 1 0 M S ( c h a r tim e ) / / Delay 10MS mỗi lần gọi
{
fo r(in t i = 0 ;i< tim e ;i+ + ) D is p la y L E D ( ) ;

// Hàm giải mã số đếm thành các giá trị mã xuất cho LED 7 đoạn
u n s ig n e d c h a r D e c o d e N u m b e r ( c h a r n u m )

861
CHƯƠNG 8: HIẾN m KẾT Ị I Ắ i t Tir CẮM l ẩ l M É T l ệ »A l ệ ẨM IMS CH K im lặ Mĩ

re tu rn L E D S E G Ịn u m ];

// Chương trình khởi tạo


v o id se tu p O

{
fo r(in t i= 0 ;i< 1 1 ;i+ + )

{
p in M o d e (i,O U T P U T );

}
// Thiết lập chân analog 0 là chán ngõ vào
p in M o d e (A 0 , IN P U T );

// Chương trình chính


v o id loopO

{
in t a n a lo g ; // Biến tạm chứa giá trị đọc
a n a lo g = a n a lo g R e a d (A O );// Dọc dữ liệu từ biến trở
n u m L E D 1 = a n a lo g /1 0 0 ;
n u m L E D 2 = ( a n a lo g /1 0 )% 1 0 ;
n u m L E D 3 = a n a lo g % 10;

D e la y D is p la y 1 0 M S (1 0 ); // Dợi 100 miligiây


}
H ã y b iê n d ịc h v à tả i chư ơ ng trìn h x u ố n g b o m ạ c h A rd u in o .

B ạ n sẽ th ấ y 3 L E D 7 đ o ạ n th a y đ ổ i g iá trị h iể n th ị khi b ạ n x o a y núm


v ặ n c ủ a b iế n trỏ . K h i b ạ n v ặ n g iá trị lớn hơn 1 0 0 0 th ì b ạ n sẽ th ấ y giá trị xuất
h iệ n L E D 1 là c h ữ A . V í dụ g iá trị s ố đ ọ c đư ợc là 1 0 1 2 thì L E D h iể n th ị là:

A12
T im h iể u p h ầ n m ề m

P h ầ n lậ p trìn h c h o b à i tậ p n à y ở p h ầ n q u é t L E D tư an g :u n h ư b ạ n đã
tìm h iể u ở b à i tậ p trư ớ c. T u y n h iê n tro n g b à i lậ p n à y c h ú n g ta sẽ có thèm
p h ầ n đ ọ c g i á trị b i ế n trở t h ô n g q u a b ộ c h u y ể n đ ồ i tư ơ n g tư s a n g s ố c ù a bo
m ạ c h A rd u in o .

C húng ta sẽ th a y đ ổ i p h ầ n th iế t lã p tro n g c h ư a io :rn h k h ò i tao


như sau:

362
Ị WHIM I A » CIO MỜI T jfm CHƯƠNG 8: HIẾN THỊ KẾT QUẢ BO TỪ CẦM BIẾN NHIỆT Đô VÀ cộ ẨM

v o id s e tu p O

{
fo r ( in t i= 0 ;i< 1 1 ;i+ + )

{
p in M o d e ( i,O U T P U T );

}
p in M o d e (A O , IN P U T );

)
N h ư b ạ n th ấ y , tro n g c h ư ơ n g trìn h k h ở i tạ o c h ú n g ta s ẽ k h a i b á o th ê m
phần n g õ v à o c h o c h â n A n a lo g 0 . B ạ n c ó th ể t h iế t lậ p c á c c h â n n g õ v à o h o ặ c
không c ầ n p h ả i k h ở i tạ o b ở i vì th e o m ặ c đ ịn h , c á c c h â n A n a lo g là c á c c h â n
ngõ v à o . T iế p đ ế n , tr o n g c h ư ơ n g trìn h c h ín h c h ú n g ta s ẽ tạ o b iế n tạ m c h ứ a g iá
trị đ ọ c từ b iế n trỏ . C h ú n g ta s ẽ d ù n g h à m a n a lo g R e a d đ ể đ ọ c g iá trị tư ơ n g tự
từ c á c c h â n tư ơ n g tự . C h ư ơ n g trìn h c h ín h n h ư s a u :

v o id lo o p O

in t a n a lo g ; / / Biến tạm chứa giá trị đọc


a n a lo g = a n a lo g R e a d ( A O ) ;// Dọc dữ liệu từ biến trở
n u m L E D 1 = a n a lo g /1 0 0 ;

n u m L E D 2 = ( a n a lo g /1 0 ) % 1 0 ;

n u m L E D 3 = a n a lo g % 1 0 ;

D e la y D is p la y 1 0 M S ( 1 0 ) ; / / Đợi 100 miligiãy


)
N hư bạn th ấ y , tr o n g chư ơ ng trìn h c h ín h chúng ta dùng hàm
a n a lo g R e a d (A O ) đ ể đ ọ c g iá trị tư ơ n g tự ở c h â n AO. Đ ể đ ọ c c á c c h â n A n a lo g
khác c h ú n g ta s ẽ d ù n g c á c kí tự A1 - A 5 (đ ố i v ớ i b o m ạ c h A r d u in o U n o )

ĐỌC N HIỆT Độ VÀ ĐỘ ẨM s ử DỤNG CÂM BIẾN DHT-11


M ộ t th ô n g s ố k h ô n g th ể tá c h rờ i đ ố i v ớ i c u ộ c s ố n g c o n n g ư ờ i c h ín h là
nhiệt đ ộ . C á c t h iế t b ị c ủ a c h ú n g ta đ a p h ầ n đ ể u c ó c ả m b iế n n h iệ t đ ộ n h ư
m áy s ấ y , m á y lạ n h , q u ạ t th ô n g m in h ... V ì v ậ y , v iệ c đ o v à h iể n th ị c á c th ô n g s ố
nh iệ t đ ộ r ấ t q u a n tr ọ n g . C h ú n g ta c ó th ể d ù n g b o m ạ c h A r d u in o k ế t h ọ p v ớ i
m o d u le đ o n h iệ t đ ộ v à đ ộ ẩ m đ ể h iể n th ị c ũ n g n h ư k h ố n g c h ế n h iệ t đ ô v à đ ô
am . T r o n g b à i tậ p n à y c h ú n g ta s ẽ s ử d ụ n g m ộ t b ộ c ả m b iế n tíc h h ọ p s ẵ n c ó
thê đ o đ ư ợ c n h iệ t đ ộ lầ n đ ộ ẩ m , s a u đ ó d ù n g b ộ c h u y ể n đ ổ i tư ơ n g tự s a n g s ố
cùa b o m ạ c h A r d u in o đ ể đ ọ c g iá trị c ả m b iế n n à y .

363
CHƯƠNG t : BIỂN T IỊIẾ T QUẢ ĐO Tứ CẢM HẾK NIIỆT B í V * Bệ iu U N M UM C im tM lT H C

G iớ i th iệ u v ề m o d u le đ ọ c n h iệ t độ và đ ộ ấ m D H T 1 1
B o c ả m b iế n n h iệ t độ v à đ ộ ẩm đư o c tích h o p tr o 'ig " l ó ; m o d u le dõng
g ó i s ẵ n có 3 c h â n g ồ m c á c c h â n n g u ồ n và m ó t c h á n đẽ c ^ C n g ta co th é đọc
được c á c g iá trị c ả m b iế n (G ía D H T 1 1 v à o th ó i đ iể n tn á n g 1 -2 0 1 5 khoảng
4 5 .0 0 0 đ ). M ộ t s ố hìn h ả n h c ủ a m o d u le D H T 11:

C ả m b iế n c h ín h c ủ a m o d u le :

i
I___ ị\
364
UHIMIAWICHO H6ƠƠI Tự HỌC CHƯƠNG 8: HIẾN THỊ KẾT QUẢ 80 Tií CÁM 8IẾN NHIỆT BỘ VÀ Đõ ẨM

N h ư b ạ n th ấ y , b ộ c ả m b iế n là b o m ạ c h n ằ m tr o n g lớ p v ỏ x a n h c ủ a
hinh tra n g trư ớ c . N ế u b ạ n m u a m ộ t m o d u le tn ì b ạ n s ẽ c ó 3 c h â n g ồ m các
châ n n g u ổ n v à c h â n tín h iệ u . N ế u k h ô n g m u a m o d u le m à m u a 1C r iê n g lẻ th i
bạn h ã y k ế t n ố i m ạ c h v ớ i c á c c h â n n h ư h ìn h dư ớ i.

Đ ể là m q u e n v ớ i b ộ c ả m b iế n n à y , b ạ n s ẽ k ế t n ố i m ạ c h n h ư h ìn h dư ớ i
và v iế t m ộ t c h ư ơ n g trìn h đ ơ n g iả n . S a u đ ó d ù n g c h ư ơ n g trìn h th e o d õ i c ổ n g n ố i
tiếp đ ể th e o d õ i c á c g iá trị c ả m b iế n . T rư ớ c tiê n , đ ể đ ọ c đ ư ợ c g iá trị c ả m b iế n
chú ng ta s ẽ sử d ụ n g th ê m m ộ t th ư v iệ n đ ư ợ c x â y d ự n g s ẵ n đ ể d ễ d à n g c h o
việc sữ d ụ n g c ả m b iế n .

B ạ n h ã y th e o đ ư ờ n g d ẫ n s a u đ ể tả i v ề th ư v iệ n :

h ttps://co d eload.g ith u b.co m /m arkruys/ardu ino -D H T/zip/m aster


v à tìm h iể u v ề th ư v iệ n tạ i tr a n g w e b :

h ttp://p laygrou nd .ardu ino .cc/M ain /D H T Lib


B ạ n k ế t n ố i m ạ c h A r d u in o v ớ i c ả m b iế n n h ư h ìn h d ư ớ i.

DHT-111

«w * số * r -:' ■';•
n X i -»»'<«>♦ ♦ •<*,>♦

1 :0 ■ *.» .3

- - ữ**í n p J ự

3G5
CHƯONE 8: I I Ĩ N T I! IẾ T ạOẢ 8» T l tẢ H » ấ » M Ệ T 81 DÀ l ệ ẨM nm CM K M iT f f t

P h ầ n m ề m cơ b ả n đ ể đ ọ c giá trị c ả m b iế n D H T -1 1

# in c lu d e "D H T .h " / / Khai báo thư viện DHT

D H T dht; / / Tạo đối tượng cho thư viện

II Chương trình khởi tạo


v o id se tu p O

{
S e ria l.b e g in (9 6 0 0 ); / / Khởi tạo tốc độ truyền nổi tiếp
S e ria l.p rin tln Q ; // Bỏ 1 dòng đầu
// Xuất giá trị hệ thống sắp xếp của việc hiển thị
S e ria l.p rin tln (“ S ta tu s \tH u m id ity (% )\tT e m p e ra tu re (C )\t(F )"):

d h t.s e tu p (A O ); / / Chân 0 đọc giá trị cảm biến


)

v o id loopO

{
d e la y (d h t.g e tM in im u m S a m p lin g P e rio d ()); / / Tạo thời gian trễ cho
II việc đọc dữ liệu

flo a t h u m id ity = d h t.g e tH u m id ity O ; / / Dọc độ ẩm


flo a t te m p e ra tu re = d h t.g e tT e m p e ra tu re (); / / Dọc nhiệt độ

II Hiển thị nhiệt độ đọc được


S e ria l.p rin t(d h t.g e tS ta tu s S trin g O );

S e ria l.p r in t(“\ t “ );


S e ria l. p rin t(h u m id ity , 1);

S e ria l.p rin t("\t\t");

S e ria l. p r in t(te m p e ra tu re , 1);


S e ria l.p r in t("\t\t");
S e ria l. p rin tln (d h t.to F a h re n h e it(te m p e ra tu re ), 1);

366
AINIM1AM CIONGƠỮIT(f IOC CHƯƠNG 8: HIẾN THỊ KẾT qUÂ BO TƯ CẤM IIẾN MHIỆT BQ DÀ ĐỘ ẨM

S a u k h i b iê n d ịc h v à tả i c h ư ơ n g trìn h x u ố n g b o m ạ c h A r d u in o b ạ n h ã y
mở ch ư ơ n g trin h th e o d õ i c ổ n g n ố i t iế p c ủ a b o m ạ c h A r d u in o b ằ n g c á c h c h ọ n
m enu T o o ls > S e r ia l M o n it o r đ ể x e m g iá trị c ả m b iế n đ ọ c đ ư ợ c .
l i i l l i i - |p | x j
f e e COM3 *■ 1 1 1 1 1 1

if 6 Send 1

ị S ta tu s H u m id ity (% 5 T e m p e ra tu re (C ) (F )
OK 6 9 .0 2 9 .0 3 4 .2
J
OK 6 9 .Q 2 9 .0 3 4 .2
OK 5 9 .Q 2 9 .G 2 4 .2
OK 6 9 .0 2 9 .0 8 4 .2
OK 6 3 .0 2 3 .0 8 4 .2
OK Õ 9 .0 2 9 .0 3 4 .2
OK 6 9 ,0 2 9 ,0 3 4 .2
OK 6 3 .0 2 9 .0 8 4 .2
OK 5 9 .0 2 9 .0 8 4 .2
OK 6 9 .0 3 0 .0 8 6 .0
OK 6 3 .0 2 9 .0 8 4 .2
■ OR 7 0 .0 3Q .Ũ S € .0
' OK € 9 .0 3 0 .Q 3 Ó .0
OK 6 9 .0 3 0 .0 8 € .0
OK 6 9 .0 3 0 .0 8 6 .0
z l
Í 7 AutosaoS I No line ending jr j Ị9600 baud jJ

Tìm hiểu phần mềm


B à i tậ p n à y là b à i tậ p cơ b ả n g iú p b ạ n d ễ d à n g là m q u e n v ớ i v iệ c sử
dụng c ả m b iế n D H T - 1 1. N g a y đ ầ u c h ư ơ n g trin h , c h ú n g ta s ẽ k h a i b á o sử d ụ n g
t h ư v iệ n D H T :

# in c lu d e " D H T .h "

T iế p th e o là tạ o đ ố i tư ợ n g c h o th ư v iệ n :

D H T d h t;

V à c h ú n g ta s ẽ k h ở i tạ o c á c p h ầ n c ứ n g s ẽ s ử d ụ n g n h ư b ộ tr u y ề n dữ
liệu n ố i tiế p ( s e ria l), b ộ c ả m b iế n đ ư ợ c k ế t n ố i v à o c h â n tư ơ n g tự AO:

v o id s e tu p O

S e r ia l.b e g in ( 9 6 0 0 ) ; / / Khởi tạo tốc độ truyền nối tiếp


S e r ia l.p r in tln Q ; / / Bỏ 1 dòng đầu
S e r ia l.p r ìn tln ( " S t a tu s \t H u m id ity (7 o ) \tT e m p e r a tu r e ( C ) \ t( F ) " ) -

3E7
CHƯƠNG«: B Ó ny IÍT qOẢ 81 T< CẢM l í » MIỆT Bệ V* Bề ẨM IW U W C H null ỈH I

d h t.s e tu p (A O ); / / Chân 0 đọc giá trị cầm ùién


}
T ro n g chư ơ ng trình khởi tạ o , b ạ n c h ú ý v iệ c khở i ta o c n ã n d ọ c c ả m biến:

d h t.s e tu p (A O );
C h ú n g ta sẽ lựa c h ọ n c h â n đ ọ c giá trị c ù a c ả m b iế n là AO vì c ả m biến
c h ú n g ta c h â n n g õ ra n ố i vớ i c h â n tương tự 0 c ù a b o m ạ c n A rd u in o .
T iế p đ ế n c h ú n g ta sẽ ch ú ý đ ế n chư ơ ng trin h c h ín h vì v iệ c đ ọ c giá tri
c ả m b iế n đ ề u n ằ m ỏ chư ơ ng trìn h n à y . B ạ n h ã y c h ú ý c á c d ò n g lệ n h này
tro n g chư ơ ng trin h c h ín h :

d e la y (d h t.g e tM in im u n n S a m p lin g P e rio d ()); // Tao thỡi gian trẻ cho


việc dọc ơữ liệu
flo a t h u m id ity = d h t.g e tH u m id ity O ; // Dọc độ ầm
flo a t te m p e ra tu re = d h t.g e tT e m p e ra tu re O ; / / Đọc nhiệt độ
T ạ o th à i g ia n trễ th ấ p n h ấ t đ ể đ ọ c g iá trị c ả m b iế n b ằ n g c á c h lấy giá
trị thờ i g ia n lấ y m ẫ u th ấ p n h ấ t b ằ n g h à m d h t.g e tM in im u m S a m p lin g P e rio d ().
S au đ ó là đ ọ c g iá trị đ ộ ẩm b ằ n g h à m d h t.g e lH u m id ity O :

flo a t h u m id ity = d h t.g e tH u m id ity O ; / / Dọc độ ẩm


v à n h iệ t độ :

flo a t te m p e ra tu re = d h t.g e tT e m p e ra tu re O ; / / Dọc nhiệt độ


Đ ể c h u y ể n th à n h g iá trị đ ộ F từ n h iệ t đ ộ đ ã đ ọ c từ c à m b iế n c h ú n g ta
có th ể d ù n g d ò n g lệ n h sau:

flo a t F te m p a ra tu re = d h t.to F a h re n h e ít(te m p e ra tu re )


B â y g ià b ạ n đ ã h iể u c á c h à m cơ b ả n c ủ a thư v iệ n n à y đ ể th ự c hiện
đ ọ c giá trị c ả m b iế n . T iế p th e o , c h ú n g ta s ẽ sử d ụ n g c á c k iế n th ứ c n à y để đọc
n h iệ t đ ộ v à h iể n th ị trê n L E D 7 đ o ạ n .

ĐỌC NHIỆT Độ HIỂN THỊ ĨR Ẽ N LED 7 ĐOẠN


T ro n g b à i tậ p n à y c h ú n g ta sẽ tiế p tụ c sử d ụ n g c ả m b iế n D H T -1 1 và
s ù d ụ n g thư v iệ n D H T đ ể đ ọ c n h iệ t đ ộ c ủ a m ô i trư ờ ng v à h iể n th ị trự c tiế p trén
L E D 7 đ o ạ n . B ạ n có th ể sử d ụ n g chư ơ ng trin h n à y đ ể đ o n h iê t đô m ô i trưòng
g ắ n ở tro n g n h à h o ặ c ỏ b ê n n g o à i h o ặ c b ạ n c ó th ể c ả i tiế n đ ể đ o được đó ẩm
c ủ a m ô i trư ờ ng.

P h ầ n cứ ng

B ài tậ p n à y sẽ thự c h iệ n h iể n th ị g iá trị n h iệ t độ trê n LE D 7 đ o ạ n vi vãy


c h ú n g ta n ố i c ả m b iế n D H T -1 1 v à o bo m ạ c h A rd u in o . C h ú n g ta c . à i c ấ p nguón
5V để m o d u le n à y h o ạ t đ ộ n g và lấy giá trị n h iệ t độ và độ ẩm đ u 3 . ao c h á n OUT
củ a m o d u le h o ặ c c h â n D A T A c ù a c ả m b iế n D H T -1 1.

368
UNIMIANH CHO H6ƯƠI Tự Hge CHƯƠNG 8: HIỂN THỊ KẾT QUÁ DO TƯ CẨM BIẾN NHIỆT eệ VA flộ ẨM

BO MẠCH LED 7 LED 7 LED 7


DHT-11
ARDUINO ĐOẠN 1 ĐOẠN 2 ĐOẠN 3

Chân số 0 Đoạn A Đ oạn A Đ oạn A

C h â n sô' 1 Đoạn B Đ oạn B Đ oạn B

C hân số 2 Đoạn c Đoạn c Đoạn c

C hân số 3 Đoạn D Đoạn D Đoạn D

Chân số 4 Đoạn E Đoạn E Đoạn E

Chân số 5 Đoạn F Đoạn F Đoạn F

Chân số 6 Đoạn G Đoạn G Đoạn G

Chân số 8 C hân chung


h o ặ c th ô n g
qua
t r a n s is to r

Chân số 9 C hân chung


h o ặ c th ô n g
qua
tr a n s is to r

C h â n s ố 10 C hân chung
h o ặ c th ô n g
qua
tr a n s is to r

Chân tư ơ n g tự DATA
AO hoặc
OUT

H ìn h tra n g b ê n lá ả n h k ế t n ố i 3 L E D 7 đ o ạ n v à b iế n trỏ .

369
CHƯỜM»: lẩ n TI! IÍT »Ẩ 80 Tĩr CẢM IẾII MHÊĨ Bệ V* M ẤM O tU H BANK CHO NtHl lặ lật

DUIN01

H o ạ t đ ộ n g c ủ a c h ư ơ n g tr ì n h

B à i tậ p n à y c h ú n g ta sẽ đ ọ c g iá trị n h iệ t đô c ù a c ả n t i ế n D H T -1 1 và
g iả i m ã c á c giá trị đ ọ c đư ợc từ c ả m b iế n v à h iể n th ị trê n L E D 7 đ o a n N h ié t đõ
đ ọ c được tro n g b à i tậ p n à y sẽ là ° c . B ạ n c ũ n g c ó th ể đ o c g.3 ' r đó ầ m vá giá
trị n h iệ t độ là °F đ ể h iể n th ị trê n LE D 7 đ o ạ n .

370
M— I I À ẵ i C i m ế Ì I H H Ệ C CM m e »: t i t I I I I Ế Ĩ W Ầ 8 1 T l CÁM HẾH HHỆT Bệ VÁ Bệ ẦM

Phán mém
Đ ể lậ p trìn h c h o b à i tậ p n à y b ạ n c ũ n g th ự c h iệ n q u é t L E D v à đ ọ c g iá
trị c ả m b iế n D H T - 1 1 d ự a v à o thư v iệ n D H T . N ế u b ạ n k h ô n g c ó s ầ n thư v iệ n ,
có th ể tả i v ề h a y n h ậ p th e o p h ầ n s o u r c e c o d e trìn h b à y tr o n g s á c h .

Chường trình đọc cảm biến và hiển thị trẽn LED 7 đoạn:

// Chương trình đọc cảm biến và hiển th ị trên LED 7 đoạn

#inclu de "D H T .h " // Khai báo thư viện D H T

DHT dht; // Tạo đối tượng cho thư viện

II Khai báo các tên LED ứng với các LED 7 đoạn
#define LE D 1 8

#define L E D 2 9

#define L E D 3 10

// Mảng chứa các giá trị điều khiển LED 7 đoạn anode chung
unsigned c h a r
L E D S E G []= (0 x C 0 ,0 x F 9 ,0 x A 4 ,0 x B 0 ,0 x 9 9 ,0 x 9 2 ,0 x 8 2 ,0 x F 8 ,0 x 8 0 ,0 x 9 0 ,0 x 8 8 ,0 x 8
3 ,0 x C 6 ,0 x A 1 ,0 x 8 6 ,0 x 8 E ,0 x B F ) ;

II Biến tạm
unsig ned c h a r L E D O U T P U T ;

char n u m L E D I ; / / Biến chứa chữ số hàng trăm


char n u m L E D 2 ; / / Biến chứa chữ sổ hàng chục
char n u m L E D 3 ; / / Biến chứa chữ sô hàng đơn vị

II Hàm lấy các bit riêng lẻ


boolean B itS ta te ( c h a r v a l, c h a r p o s )

bo olean x b it;

u n s ig n e d c h a r x c h a r = - 1 ;

if (p o s < 1 6 ) x c h a r= 0 x 1 & v a l » p o s '

x b it= x c h a r;

re tu rn x b it;

// Hàm xuất ra các chân ngõ ra

371
CaTOM I: l t » Tlj IÍT ỊIẦ w T« CÁMIỊẾ Ị M tT r t n M ẮM u a CM K i l l u ME

v o id C h a n g e O u tp u tQ

{
fo r(in t i= 0 ;i< 8 ;i+ + )

{
d ig ita lW rite (i,B itS ta te (L E D O U T P U T ,i));

// Hàm quét LED


v o id D is p la y L E D Q

{
// Sáng LED 1 trong một thời gian ngán
L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 1 );

C h a n g e O u tp u tQ ;

d ig ita lW rite (L E D 1 ,H IG H ); / / Cấp điện áp cao cho chân chung LED 1


d e la y (3 );

d ig ita lW rite (L E D 1 ,LO W );

// Sáng LED 2 trong một thời gian ngắn


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 2 );

C h a n g e O u tp u tO ;

d ig ita lW rite (L E D 2 ,H IG H ); / / c ấ p điện áp cao cho chân chung LED 2


d e la y (3 );

d ig ita lW rite (L E D 2 ,L O W );

// Sáng LED 3 trong một thời gian ngấn


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 3 );

C h a n g e O u tp u tQ ;

d ig ita lW rite (L E D 3 ,H IG H ); / / cấp điện áp cao cho chân chung LED 3


d e la y (3 );

d ig ita lW rite (L E D 3 ,L O W );

372
UNIMIÀM CHWrtllMfC CBƯđNC1: HIẾHHI IÍT ỊỊBẨ ca CÁMBIẾMMMÊT Bệ VÀ BỘẦM

// Tạo thời gian delay cùng lúc hiền thị


vo id D e la y D is p la y 1 0 M S ( c h a r tim e ) II Delay 10MS mỗi lần g ọ i

(
fo r(in t i = 0 ;i< tim e ;i+ + ) D is p la y L E D Q ;

// Hàm giải mã số đếm thành các giá trị mã xuất cho LED 7 đoạn
u n s ig n e d c h a r D e c o d e N u m b e r ( c h a r n u m )

re tu rn L E D S E G [n u m ];

// Chương trình khởi tạo


void s e tu p Q

fo r(in t i= 0 ;i< 1 1 ;i+ + )

pinMode(i,OUTPUT);

pinMode(11,INPUT);
d h t.s e tu p (A O );

// Chương trình chinh


void lo o p Q

int te m p ; / / Biến tạm nhiệt độ

te m p = d h t.g e tT e m p e r a tu r e ( ) ; // Dọc n h iệ t độ

// Giải mã hiển thị


numLED 1= te m p /l 00 ;

873
cacm »: IIẾI TỊỊ »ẾT ỆIẨ M Tl CẲHIẾM r t T lệ HÀ lệ ẨM !>■ CM KM I TfWC

n u m L E D 2 = (te m p /1 0 )% 1 0 ;

n u m L E D 3 = te m p % 1 0;

D e la y D is p la y 1 0 M S (d h t.g e tM in im u m S a m p lin g P e rio d ()' 1 0 ): Dũi hoàn


II thành việc dọc

H ã y b iê n d ịc h v à tả i chư ơ ng trin h x u ố n g bo m ạ c h A rd u in o .

B ạ n sẽ th ấ y 3 L E D 7 h iể n th ị g iá trị n h iệ t đ ộ m ô i trư ò n g x u n g quanh


c ủ a c ả m b iế n . B ạ n có th ể tạ o sự th a y đ ổ i n h iệ t đ ộ x u n g q u a n h c ả m b iế n dể
x e m x é t sự th a y đ ổ i c ù a n h iệ t đ ộ h iể n th ị.

T im h iể u p h ẩ n m ề m

Đ o ạ n m ã lậ p trìn h c ủ a b à i tậ p n à y b ạ n h o à n to à n c ó thê’ g iả i thích


được n ế u đ ã là m v à h iể u c á c đ o ạ n m ã lậ p trin h trin h b à y tro n g c á c b à i tâp
trư ớ c đ ó , c ầ n c h ú ý m ộ t s ổ đ iể m sa u :

• C ầ n c h ú ý m ộ t s ố p h ầ n m ã lệ n h tro n g b à i tậ p n à y nh ư v iệ c b ạ n vừa
p h ả i đ ọ c g iá trị n h iệ t đ ộ , đợ i v à h iể n th ị trê n L E D 7 đ o a n .

• B ạ n sẽ sử d ụ n g c á c h à m c ủ a thư v iệ n D H T tro n g c h ư õ n g trìn h chinh


G ồ m v iệ c đ ọ c n h iệ t đ ộ , g iả i m ã v à tạ o thờ i g ia n đợ i h iể n th ị:

v o id loopO

in t te m p ; / / Biến tạm nhiệt độ


te m p = d h t.g e tT e m p e ra tu re (); / / Dọc nhiệt độ
n u m L E D 1 = te m p /1 0 0 ;

n u m L E D 2 = (te m p /1 0 )% 1 0;

n u m L E D 3 = te m p % 1 0 ;

D e la y D is p la y l 0 M S ( d h t.g e tM in im u m S a m p lin g P e rio d ()/1 0 );

• C húng ta tạ o m ột thờ i g ia n trễ là t h à i g ia n th ấ p nhất cm a C HO 1 0 b ò i VI

giá trị c ủ a h à m d h t.g e tM in im u m S a m p lin g P e rio d sẽ trà .'é g iá trị th ò i


g ia n ở đơn vị m ilig iá y . Đê’ á p d ụ n g v à o h à m D e la y D is p ia , 10 M S c h ú n g
ta p h ả i c h ia c h o 10 để đ ả m b ả o đ ộ c h ín h x á c .

374
U IIM IA H C 1 0 m W l Tf IỌC CHƯƠNG 9: ARDUINO VÀ MODULE CẨM B Ế H A H ĩm m

CHUÔNG 9

ARDUINO VÀ MODULE CẢM BIẾN ÂM THANH


T ro n g c á c ứ n g d ụ n g th ự c tế , b ạ n th ư ờ n g m u ố n đ iề u k h iể n m ộ t đ ố i
tượng n à o đ ó b ằ n g c á c c ô n g tắ c , n ú t n h ấ n c h ẳ n g h ạ n . T r o n g b à i tậ p n à y
chúng ta sẽ c ù n g tìm h iể u v ề m o d u le c ả m b iế n ả m th a n h đ ể ứ n g d ụ n g c h ú n g
cho c õ n g v iệ c đ iề u k h iể n m ộ t đ ố i tư ợ n g n à o đ ó . H o ặ c c ó th ể d ù n g m o d u le đ ể
phát h iệ n â m th a n h c h o m ộ t m ụ c đ íc h đ iề u k h iể n n à o đ ó .

V í d ụ : B ạ n c ó th ể d ù n g m o d u le c ả m b iế n â m th a n h d ù n g đ ể đ ó n g m ở
cửa p h ò n g tr o n g n h à h o ặ c m ở đ è n . C h ỉ v ớ i h a i h o ặ c 3 tiế n g v ỗ ta y th ì h ệ
thống đ è n h o ặ c h ệ th ố n g r è m c ử a s ẽ tự đ ộ n g m ỏ v à đ ó n g v à o . V iệ c n à y s ẽ
giúp b ạ n d ễ d à n g đ iề u k h iể n c á c đ ố i tư ợ n g v à tư ơ n g tá c v ớ i đ ố i tư ợ n g t ố t h ơ n
lầ v iệ c d ù n g c á c c h u y ể n m ạ c h cơ k h í n h ư c ô n g tắ c h a y n ú t n h ấ n .

MODULE CẢM BIÊN ÂM THANH


Giới thiệu module electret cho bo m ạch Arduino
T ro n g m o d u le n à y c h ú n g ta s ẽ c ó d ù n g m ộ t lo a e le c t r e t v ì v ậ y c h ú n g
ta g ọ i là m o d u le e le c tre t. T r o n g m o d u le n à y s ẽ c ó m ộ t m ạ c h O p - A m p d ù n g đ ể
so s á n h m ứ c đ ầ u v à o , n ế u đ ạ t n g ư ỡ n g s ẽ đ iề u k h iể n n g õ ra lê n m ứ c c a o .
Ngược lại, n ế u k h ô n g đ ạ t m ứ c n g ư ỡ n g th i n g õ ra s ẽ ở m ứ c th ấ p .

H ìn h dư ớ i v à tra n g b ê n là ả n h c ủ a m o d u le e le c tr e t.

375
CHƯƠNG 9: M U M VA M O D ILE CÁM IIẾ N Ầ M H A U utn» BAWB CMO ncưai T» MC

T rê n m o d u le có m ộ t b iế n trở d ù n g để
c h ỉn h m ứ c ng ư ỡ n g đ ể p h á t h iệ n â m th a n h . B ạ n
có th ể c h ỉn h đ ộ n h ạ y th e o ý m u ố n đ ể đ ả m b ả o
chươ ng trìn h k h ô n g bị n h iễ u bởi tạ p ã m .

H ình dưới v à hìn h bên là c ả m b iế n


ch ín h c ù a m o d u le .

N h ư hìn h trê n ta th ấ y , lo a e le c tre t c h ín h là trá i tim c ủ a m o d u le . Nó la


m ộ t b ộ th u âm vớ i c ấ u tạ o đơ n g iả n v à tíc h h ợ p tro n g m ộ t b ô vỏ s ắ t n h ò gon
N h iệ m vụ c ủ a nó tro n g m o d u le là c h u y ể n c á c â m th a n h ở b ẽ n n g o à i th à n h tin
h iệ u đ iệ n . Đ ể tạ o sự s o s á n h ngư ỡ ng c h ú n g ta c ầ n p h ả i th ẻ rn c á c th à n h phán
nh ư đ iệ n trở, b iế n trở , O p .A m p , tụ đ ể p h á n cự c c h o m ic e le c tre t va c ũ n g như
v iệ c tạ o ng ư ỡ ng s o s á n h c h o O p .A m p h o ạ t đ ộ n g . C h ú n g ta sẽ sừ d u n g dấu
O u t c ủ a sơ đ ồ m ạ c h để p h á t h iệ n c ó â m th a n h h a y k h ô n g

Lưu ý: Các bạn có thề dùng nhiều module bán sẩn Uorg tư để thưc
hành. Ở đây giới thiệu module electret đo module này có bár -at nhiéu tai các
cửa hàng điện tử cũng như trên mang với giá không mác (khcă' 5 45.000 đ vào
thời điểm tháng 1-2015) nếu mua mạch rời vế lắp ráp sẽ rrẫ: i~ơ gian, khóng
đẹp và có giá còn cao hơn mua module bán sẩn.

376
CHƯƠNG 9 : ARDUINQ V À M O DULE C Ả M B IÊ N Â M THANH
U IIM DANH CHO H6ƯƠI Tự BỌC

C h ú n g ta c ầ n m ộ l m o d u le e le c tr e t, đ iệ n trỏ v à m ộ t đ è n L E D đ ể th ự c
hiện v iệ c n à y . B ạ n k ế t n ố i b o m ạ c h A r d u in o v ớ i c ả m b iế n n h ư h ìn h d ư ớ i.

Đ o ạ n m ã lậ p trìn h đ ể đ iề u k h iể n L E D 7 đ o ạ n s ử d ụ n g m o d u le E le c tr e t
trinh b à y ỏ c á c tr a n g s a u .

Ỉ7 7
m m m a cm Htưm Tf MC
CBƯ0NG9: AIDINt VAMODULI CÁMn i l ẲMriAH

// Chương trình cơ bản dề điều khiền LED sử dung module e ecĩret

b o o le a n S tate; / / B iế n trạ n g th á i

II Chương trinh khởi tạo


vo id se tu p O

{
p in M o d e (0 ,O U T P U T );

p in M o d e (A 0 , IN P U T );

// Chương trinh chinh


v o id loopO

{
if(d ig ita lR e a d (A 0 )= = 1 ) II Kiểm tra xem có âm thanh hay khõng
{
d e la y (1 0 0 ); / / Dảm bảo ảm thanh có đủ độ dài
if(d ig ita lR e a d (A 0 )= = 1 ) // Dảm bảo không phải tạp âm
(
w h ile (d ig ita lR e a d (A 0 )= = 1 ); / / Đợi âm thanh kết thúc
s ta te = !s ta te ; // Đảo trạng thái LED
d ig ita lW rite (0 ,S ta te );

d e la y (1 0 0 0 ); / / Tạo thời gian trễ đảm bảo không liên tục tất mở LED
}

}
B ạ n b iê n d ịc h và tà i c hư ơ ng trin h x u ố n g bo m ạ c h A rd u in o . H ã y cán
c h ỉn h b iế n trở đ ể c ó đ ô n h ạ y th ậ t hợ p lý đ ể k hi b ạ n đ ứ n g từ xa vỗ la y sẽ thay
đ ổ i được trạ n g th á i L E D . B ạ n sẽ th ấ y rấ t thú vị k h i tắ t mở L E D b á n g c á c h vỗ
ta y th a y v i sử d ụ n g c á c c ô n g tắ c hay n ú t n h ấ n .
N g o à i ra b ạ n có th ể đ iề u k h iể n c ả hệ th ố n g đ è n c ủ a õ t p h ò n g bã ng
cá ch k ế t n ố i t h ê o m ộ t tra n s is to r để đ iề u k h iể n m ô t rơ -le th a y . JÓI m ô t LED
đơn như t r o n g b ồ i n à y . B ạ n có th ể k ế t n ố i c h â n số 0 c ủ a b o '- ■ 5 Z - A rd u in o vói
đầ u “ A rd u in o diQ ’tal p in " c ủ a m ạ c h tra n g b ê n đẽ’ đ iề u k h iể n ' i g . i - á ié n 2 2 0 V

378
CHƯƠNG 9 : ARDUINO V À MO DULE C Ả M B IẾ U Ẩ M THANH
O IIM M H C B 8 N 6 Ư Ư I ĩự BỘC

Lưu ý: Sử dụng rơ-le cho phép


nguổn điện 220 V và điện áp điều khiển
là 12 V hoặc 5 V, transistor có thể dùng
các loại NPN phổ biến đều được.

R ơ -le 5 V đ iề u k h iể n cho phép


nguồn điện 220 V c ó d ạ n g n h ư h ìn h b ê n .

M ạ c h đ iệ n th a y th ế c h o L E D d ù n g đ ể đ iể u
như hình dưới.

Tim hiểu phần mềm

Đ o ạ n m ã lậ p trin h c h o b à i tậ p n à y k h á đ ơ n g iả n n h ư n g b ạ n c ẩ n c h ú ý
chương tr in h c h ỉn h :

379
CHƯƠNG 3: A l i g n ) VA MODCLE CẢM IIẾN iM TIẲ H U n M IẤ M C H N t ế l l Tự H C

v o id loopO

{
if(d ig ita lR e a d (A O )= = 1 ) // Kiềm tra xem có àm thanh hay không
{
d e la y (1 0 0 ); / / Dảm bảo âm thanh có đủ ớó ca
if(d ig ita lR e a d (A O )= = 1 ) // Dàm bào không phải lap âm
{
w h ile (d ig ita lR e a d (A 0 )= = 1 ); // DƠI âm thanh két thúc

s ta te = !s ta te ; // Dào trạng thái LED


d ig ita lW rile fO ,S tate);
d e la y (1 0 0 0 ); // Tạo thời gian trễ ơảm bảo không liên tục làt mở
LED
)
}

N hư p h ầ n c h ú th íc h c ủ a chư ơ ng trìn h c ó d ẫ n x u ấ t. C h ú n g tô i ch ì bàn


th ê m m ộ t ít v é trư ờ ng hợ p th ự c tế có th ể b ạ n sẽ g ặ p . T ro n g th ự c tế , c ó th ể bộ
c ả m b iế n sẽ b ị n h iễ u v à n h ữ n g tạ p â m sẽ ả n h hư ở ng đ ế n m ạ c h đ iệ n cùa
c h ú n g ta. Vì v ậ y , c h ú n g ta p h ả i đ ả m b ả o âm th a n h tá c đ ô n g đù đ ộ d à i và khi
vừ a đ ả o trạ n g th á i c h ú n g ta p h ả i đợ i 1 g iâ y tiế p th e o đ ể đ ả o trạ n g th á i. Vì rơ-le
có k ế t c ấ u cơ k h i, n ế u là m v iệ c ở tầ n s u ấ t c a o sẽ rấ t h ạ n c h ế . Vì v ậ y b ạ n nên
lưu ý đ ế n c á c trư ờ n g hợ p n à y.

ĐIỂU KHIỂN 0 0 NHIỆT {lộ BẰNG MODULE CẢM BIẾN ÂM THANH


T ro n g b à i tậ p n à y c h ú n g ta sẽ đ iể u k h iể n đo n h iệ t đố b ằ n g m odule
c ả m b iế n D H T -1 1 k ế t hợ p m o d u le c ả m b iế n â m th a n h . C h ú n g ta sẽ lá p trinh
đ ể k h i có â m th a n h (n hư tiế n g v ỗ ta y ) sẽ đ iề u k h iể n v iệ c đo n h ié t đ ố b ằ n g °c
h a y °F. M ỗ i lầ n v ỗ ta y, b ạ n sẽ th a y đ ổ i đớ n v ị ° c th à n h °F h o á c c h u y ể n từ °F
th à n h ° c .

P h ầ n c ứ n g c h o b à i tậ p n à y b ạ n là: 1 b o m ạ c h A rd u in o U N O 2 m odule
c ả m b iế n D H T -1 1 và 1 m o d u le c ả m b iế n â m th a n h . N g o a i ra c h ú n g ta sẽ sừ
d ụ n g 3 LE D 7 đ o ạ n đ ể h iể n thị n h iệ t độ.

P hần cứ ng

Đ ể t' ực h iê n chư ơ ng trin h c h o b à i tậ p n à y c h ú n g ta c á n p h ả i k ế t nối


th ê m hai m c 'J 'jIe c ả m b iế n và 3 đ è n LE D 7 d o ạ n như b ả n g tra n g b ê n .
CHƯƠNG 9: ARDUINO V Á M O DULE C Ẩ M B IẼ N A M THANH
U N M K M CHO NGIftfl Tjf IỢC

1 BO MẠCH LED 7 LED 7 LED 7 DH T- CBÂM


1 ARDUINO ĐOẠN 1 ĐOẠN 2 ĐOẠN 3 11 TH AN H

C hân s ố 0 Đ oạn A Đoạn A Đoạn A

C hân số 1 Đ oạn B Đoạn B Đ oạn B

C hân số 2 Đoạn c Đoạn c Đoạn c

C hân số 3 Đoạn D Đoạn D Đoạn D

Chân số 4 Đoạn E Đ oạn E Đoạn E

C hân s ố 5 Đoạn F Đoạn F Đoạn F

C hân s ố 6 Đoạn G Đoạn G Đoạn G

C hân số 8 Chân
chu ng
hoặc
th ô n g q u a
tr a n s is to r

C hân s ố 9 Chân
chung
h o ặ c th ô n g
qua
tr a n s is to r

C h â n s ố 10 Chân
chung
h o ặ c th ô n g
qua
tr a n s is to r

C h â n s ố 11
OUT

C hần tư ơ n g OUT
tự AO hay
DATA

H ìn h k ế t n ố i 3 L E D 7 đ o ạ n v à c á c c ả m b iế n n h ư h ìn h tr a n g b ê n .
CHƯONe 9: AIDOMt VAIMIIIE CẢMIIẼN ỈMT1AM u m a UM CM w « l TỊ HC

Bạn phải cấp nguốn cho các cảm b iế n vả lấ y c á c chán ngõ ra vào
c h â n s ô 11 đ ố i v ớ i c ả m b iế n â m th a n h và ngõ ra v à o c n á n a n a l o g 0 d o i VOI

c ả m b iế n n h iệ t độ.

DUIN01

ARDUtaOUNOR3
<ĩ&x>
CHƯƠNG 9 : ABDUINO V À M O D U L f C Ả M B IÊ N Â M THANH
U IIM IA M C II m i l n r M C

Hoạt động của chương trình


C h ú n g ta sẽ đ o n h iệ t đ ộ c ủ a m ô i trư ờ n g d ự a v à o m o d u le c ả m b iế n
D H T -1 1 v à sử d ụ n g m o d u le c ả m b iế n â m th a n h đ ể đ iề u k h iể n đ ơ n v ị đ o c h o
chương trìn h . L E D 7 đ o ạ n s ẽ h iể n th ị n h iệ t đ ộ c ủ a m ô i trư ờ n g v ó i L E D 3 s ẽ
hiển th ị là c h ữ c h o ặ c c h ữ F. N ế u c h ữ c là c h ú n g ta đ a n g th ự c h iệ n đ o °c và
chữ F là th ự c h iệ n đ o °F .

Phần mềm

V iệ c lậ p trìn h c h o b à i tậ p n à y tư ơ n g đ ố i p h ứ c tạ p b ở i v ì: C h ú n g ta v ừ a
phải q u é t L E D 7 đ o ạ n , đ ọ c n h iệ t đ ộ từ c ả m b iế n v à s o n g s o n g đ ó là k iể m tra
xem c ó p h á t h iệ n â m th a n h h a y k h ô n g .

Chương trình điểu khiển đo n hiệt độ bằng m odule cảm biến âm


thanh:

// Chương trình điều khiển đo nhiệt độ bàng module cảm biến âm thanh

# in clu d e < D H T .h > / / Khai báo thư viện DHT

II Khai báo các tên LED ứng với các LED 7 đoạn
#define L E D 1 8

Itd e fin e LED2 9

#d efine L E D 3 10

// Mảng chứa các giá trị điều khiển LED 7 đoạn anods chung
u n s ig n e d c h a r

LEDSEG[]={0 xC 0 ,0 xF 9 ,0 xA 4 ,0xB 0 ,0x9 9,0x9 2,0x8 2, 0 xF8 ,0x80 0 x 90 0x88 0x8


3,0xC6,0xA1,0x86,0x8E,0xBF};

D H T d h t; / / Tạo đôi tượng cho thư viện

b o o le a n v a l; / / Biến kiều đo

II Biến tạm

unsigned char L ED O U TPU T

char n u m L E D l; // Biến chứa chữ số hàng trăm

383
CHƯƠNG J: A M M O V * MIDDLE CÁM BIẾN i H ĨI A M U H IM [ÍN * CHO K IM I T f MC '

cha r nu m LE D 2; // Biến chứa chữ số háng chuc


char nu m LE D 3; // Biến chứa chữ số hàng đơn VI

II Hàm lấy các bit riêng lẻ


b o o le a n B itS ta te (c h a r va l, c h a r po s)

{
b o o le a n xb it;

u n s ig n e d c h a r x c h a r= -1 ;

if (p o s < 1 6 ) x c h a r= 0 x 1 & v a l> > p o s ;

x b it= x c h a r;

re tu rn xb it;

// Hàm xuất ra các chân ngõ ra


v o id C h a n g e O u tp u tO

fo r(in t i= 0 ;i< 8 ;i+ + )

d ig ita lW rite (i,B itS ta le (L E D O U T P U T ,i));

// Hàm quét LED


v o id D is p la y L E D Q

// Sáng LED 1 trcng một Ihời gian ngán


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 1 ):

C h a n g e O u tp u tO :

d ig ita lW r ite (L E D 1 H IG H ): 1căp điện áp cao cho chán ch^-~ _EZ '

d e la y M ic ro s e c o n d s (3 0 ):

d ig ita lW r ite (L E D l .LO W ):

384
GHƠđNG 9: ABDUINO VÀ MODULE CÂM BIẾM ÂM THANH
mmn i Ả « q i H ế t f i n f M {

// Sáng LED 2 trong một thời gian ngắn


L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 2 );

C h a n g e O u tp u tO ;

d ig ita lW rite (L E D 2 ,H IG H ); / / Cấp điện áp cao cho chân chung LED 2


d e la y M ic ro s e c o n d s (3 0 );

d ig ita lW rite (L E D 2 ,L O W );

II Sáng LED 3 trong một thời gian ngắn


L E D O U T P U T = D e c o d e N u m b e r (n u m L E D 3 );

C h a n g e O u tp u tQ ;

d ig ita lW rite (L E D 3 ,H IG H ); / / Cấp điện áp cao cho chân chung LED 3


d e la y M ic ro s e c o n d s (3 0 );

d ig ita lW rite (L E D 3 ,L O W );

II Tạo thời gian delay cùng lúc hiển thị và kiểm tra cảm biến âm thanh
void D e la y D is p la y 1 M S (c h a r tim e ) / / Delay 1MS mỗi lần gọi
{
for(int i = 0 ;i< tim e ;i+ + )

D isp la yL E D O ;

if (d ig ita lR e a d (1 1 )= = 0 ){

w h ile ( d ig ita lR e a d (1 1 )= = 0 ) ;

va l= !va l;

II Hàm g iả i mã s ổ dếm thành các giá trị mã xuấ t cho LED 7 đoạn

u n sig n e d c h a r D e c o d e N u m b e r ( c h a r n u m )

re tu rn L E D S E G [n u m ];
c iM m 1 U I I M VẢ M H U E CẢM I i f i *M T I U I K W C W M W lT f W t

// Chương trình khởi tạo


v o id se tu p O

fo r(in t i= 0 ;i< 1 1 ;i+ + )

p in M o d e (i,O U T P U T );

p in M o d e (1 1 ,IN P U T );

d h t.s e tu p (A O );

// Chương trình chinh


v o id loopO

in t te m p ;

// Kiềm tra biến val để chọn nhiệt độ hiển thị


if (va l)

te m p = d h t.g e tT e m p e ra tu re ();

num LED 3=12;

e lse

te m p = d h t.to F a h re n h e it(d h t.g e tT e m p e ra tu re ());

num LE D 3=15;

// Giải mã, hiển thị. kiểm tra cảm biến àm thanh


n u m L E D 1 = (te m p /1 0 )°c 1 0 :

386
U n m H m c n m M lĩỊ H t CHtftfNC 9: AROOINO VA MODULE CÀM BẾM ẲM H A W

n u m L E D 2 = te m p % 1 0 ;

D e la y D is p la y 1 M S ( d h t.g e tM in im u m S a m p lin g P e r io d ( ) ) ;

)
L ậ p trin h c h o b à i tậ p n à y tư ơ n g đ ố i p h ứ c tạ p v ì c h ú n g ta c ầ n c ó th ê m
p h ấ n k iể m tra c ả m b iế n â m th a n h v à đ ọ c c ả m b iế n n h iệ t đ ộ . B ạ n cần xem lạ i
p h ấ n lậ p trìn h (g iả i th íc h ) tro n g b à i lậ p trư ớ c đ ể h iể u rõ p h ầ n lậ p trìn h tr o n g
bài tậ p n à y .

H ã y b iê n d ịc h v à tả i c h ư ơ n g trìn h trê n x u ố n g b o m ạ c h A r d u in o v à tin h


chỉnh n g ư ỡ n g c ủ a c ả m b iế n đ ể h iể n th ị c h ín h x á c n h iệ t đ ộ đ o .

Tim hiểu phần mềm

C á c p h ầ n k h a i b á o tư ơ ng đ ố i g iố n g v ớ i c á c c h ư ơ n g trìn h trư ớ c . T u y
nhiên tro n g b à i tậ p n à y b ạ n p h ả i c h ú ý c á c th a y đ ổ i v ề th ờ i g ia n q u é t L E D v à
hàm D e la y D is p la y lM S .

T ro n g p h ẩ n q u é t L E D c h ú n g ta g iả m th ờ i g ia n s á n g c ủ a 1 L E D 7 đ o ạ n
từ 3 m ilig iâ y xuống còn 30 m ic ro g iâ y . Và th a y hàm d e la y bằng hàm
d e la y M ic ro s e c o n d s . C h ú n g ta lấ y tư ợ n g trư n g v iệ c đ iề u k h iể n L E D 1:

L E D O U T P U T = D e c o d e N u m b e r (n u m L E D 1 );

C h a n g e O u tp u t();

d ig ita lW r ite (L E D 1 ,H IG H );

d e la y M ic ro s e c o n d s (3 0 );

d ig ita lW r ite ( L E D l ,L O W );

N hư bạn th ấ y , chúng ta đã th a y th ế hàm d e la y th à n h


d e la y M ic ro s e c o n d s .

C h ú n g ta th ự c h iệ n v iệ c n à y là đ ể đ ả m b ả o liê n tụ c k iể m tr a đ ư ợ c c ả m
biến âm th a n h ở h à m D e la y D is p la y lM S .

v o id D e la y D is p la y l M S (c h a r tim e ) / / Delay 1MS mỗi lần gọi


{
fo r ( in t i = 0 ;i< tim e ;i+ + )

D is p la y L E D O ;

if ( d ig ita lR e a d ( 1 1 )= = 0 ) {

while(digitalRead(11)==())•
v a l= !v a l;

217
CHƯƠNG 9: ARDUINO V* MODULE CẮM IIẾN ẦM THAHB . . . i n »»<1 TV n c

H à m n à y b â y giờ đ ả m n h ậ n 3 c ó n g v iệ c c ù n g lú c đ ó là D u y tri quet


L E D , k iể m tra c ả m b iế n ã m th a n h và tạ o thờ i g ia n trễ . V à c h ú n a :a đã th a y đồi
thời gian quét LED nên việc làm trễ bây giờ chỉ là 1 MS thay VI 10 MS như các
b à i trước.

V iệ c c ó th ê m m ộ t c ả m b iế n và liê n tụ c k iể m tra sẽ l à n chư o ng trinh


c h ú n g ta sẽ v ư ớ n g p h ả i n h ữ ng trở n g ạ i. N ế u b ạ n d ù n g rấ t n h ié u cả m biến
tro n g khi v ẫ n p h ả i d u y trì v iệ c q u é t L E D thì vi đ iề u k h iể n sẽ p h ả i xù lý rát
n h iề u v iệ c c ù n g m ộ t lú c . Vì v ậ y , b ạ n k h ô n g n ê n sử d ụ n g nhiều c á c cả m biến
v à là m d ụ n g ph ư ơ ng p h á p q u é t.

Lưu ỷ:
• Phương pháp quét cũng có mặt trái của nó. Ban đáu chúng tôi chua
bàn đến vấn đề độ sáng của LED 7 đoạn. Thế nhưng một Khi đã hiếu
khá sãu về phương pháp quét LED, các bạn cấn hiều rõ những hạn chế
‘ của LED 7 đoạn khi dùng phương pháp quét.
• Khi bạn dùng phương pháp quét, nếu thời g i a n duy tri thời g i a n sáng
của một LED nhỏ thì đ ộ sáng của LED sẽ mờ. Ngược lai. nếu ban duy
trì thơi gian sáng LED lớn thì độ sáng của LED sẽ rõ hơn Vi vậy, trong
bài tập này khi bạn giảm thời gian sáng của 1 LED xuống chi con 30
micro giây bạn sẽ thấy LED sáng mờ hơn các bài trước. Chúng la
không có cách nào khác phục ngoại trừ sử dụng phương pháp điéu
khiển khác.

388
A I H M I I * M i C M H6ƯỚI T f BQC CHƯƠNG 10: AKDUINO V * I M t l l E CAM IẾN AND SANG

CHƯƠNG 10

ARDUINO UA MODULE CẢM BIẾN ÁNH SÁHIG


C h ư ơ n g 1 0 g iớ i th iệ u đ ế n c á c b ạ n m ộ t m o d u le đ ư ợ c ứ n g d ụ n g r ộ n g rã i
tro n g th ự c tế . Đ ó là m o d u le c ả m b iế n á n h s á n g s ử d ụ n g q u a n g trở .

C h ú n g ta c ó th ể d ù n g q u a n g trở c h o rấ t n h iề u ứ n g d ụ n g v à tạ o ra m ô t
mạch điện để phát hiện ngưỡng củ a quang trở để phục vụ cho m ục đích điếu
k h iể n n à o đ ó . N g o à i c á c h s ử d ụ n g p h ầ n c ứ n g đ ể p h á t h iệ n m ứ c n g ư ỡ n g c ủ a
q u a n g tr ỏ c h ú n g ta c ò n c ó th ể s ử d ụ n g q u a n g trỏ đ ể p h á t h iệ n c á c m ứ c
n g ư ỡ n g c ủ a q u a n g trở .

Giới th iệu m odule cảm biến ánh sáng kết nối với bo mạch Arduino

M o d u le n à y ( c ó g iá k h o ả n g 3 5 .0 0 0 đ v à o th ờ i đ iể m th á n g 1 - 2 0 1 5 ) g ố m
4 c h â n n g õ ra g ồ m 2 c h â n đ ể b ạ n c ấ p n g u ồ n v à 2 c h â n k h á c g ồ m :

• M ộ t c h â n c u n g c ấ p đ iệ n á p rơ i tr ê n q u a n g trở (A 0 ), v à đ iệ n trở n à y
p h ụ th u ộ c v à o c ư ờ n g đ ộ á n h s á n g c h iế u v à o q u a n g trở , n ế u k h ô n g c ó
á n h s á n g n à o lọ t v à o q u a n g trở th i đ iệ n á p rơi tr ê n q u a n g trở là x ấ p xì
5 V . V à k h i c ư ờ n g đ ộ á n h s á n g c à n g tă n g th ì đ iệ n á p n à y c à n g g iả m .

• C h â n c ò n lạ i là c h â n b á o k h i
quang trở đạt mức ngưỡng
(D O ). K h i á n h s á n g c h iế u v à o
quang trở đạt mức ngưỡng
n à o đ ó th i c h â n n à y s ẽ ở m ú c
cao. K hi ánh sang k h ô n g đủ
th ì c h â n n à y ở m ứ c th ấ p . Đ ể
c h ỉn h m ứ c n g ư õ n g b ạ n c ó th ể
c h ỉn h b iế n trở tr ê n m o d u le .

M ộ t s ố h ìn h ả n h c ủ a m o d u le
c ả m b iế n á n h s á n g :

113
CBIÍÍNt M: A1IIMI VÀINIILE CẦMI Ế I ÁMIXK IẰHC1I K W IT f H (

T rẽ n m o d u le có
m õ: b iế n trò để ban
c h in h m ú c ng ư ỡ ng ph át
hiẽn ánh sáng.

Ban có thể
chinh đò nhay theo ỷ
m u ô n m in h đ ể th a y đổi
trạ n g th á i chân DO
phục vụ cho mục đích
của bạn.

H ìn h dư ỏ i la
Q uang trở. cảm biến
chinn cùa module
Quang trò tương tự như
một biến trở vì điện trà
c ủ a c h ú n g c ó th ể thay
đ ổ i db'Oc.

Khi ánh sáng


chiếu càng nhiéu váo
quang trò th i đ iệ n trò
cùa quang trờ càng
giảm. Khi không có ánh
sáng chiếu vào quang
trở th i đ iệ n trò c ủ a quan
trở đat múc cao nhất.
CHIitfNG IQ: MDU1N0 VÀ MODULE CẢM BIẾN ÁNH SÁNG
M U M IAHC1S Hílíđl ỉặ lịc

M ạch so sánh
d ù n g O p .A m p đ ể p h á t
hiệ n n g ư ỡ n g á n h s á n g
như h ln h b ê n .

M ạch gồm các


linh k iệ n đ iệ n trở ,
O p .A m p , b iế n trỏ và
quang trở .

Đo cường dộ ánh sáng sử dụng chân AO


C h ú n g ta s ẽ là m q u e n v ớ i m o d u le c ả m b iế n á n h s á n g b ằ n g c á c h đ ọ c
cường đ ộ á n h s á n g c ủ a m ô i trư ờ n g x u n g q u a n h b ạ n v à h iể n th ị c ư ờ n g đ ộ á n h
sáng th e o đ ơ n v ị p h ầ n tră m lê n m á y tín h th ô n g q u a c h ư ơ n g trìn h th e o d õ i c ổ n g
nối tiế p . B ạ n k ế t n ố i m ạ c h A r d u in o v ớ i c ả m b iế n n h ư h ìn h d ư ớ i. C h â n A O c ủ a
cảm b iế n n ố i v ớ i c h â n AO c ủ a b o m ạ c h A r d u in o v à n ố i n g u ồ n 5 V c h o m o d u le
cảm b iế n á n h s á n g .

'-rexTs

Phần mềm đọc cường độ sáng từ cảm biến:


II Dọc cường độ sáng từ cảm biến
II Chương trình khởi tạo

391
CHƯƠNGH: MDIM 1« MODULECẦMIẾI ÁMSÀK IIAM C H K M lT fH t

v o id setu pO

{
p in M o d e (A O .IN P U T );

S e ria l.b e g in (9 6 0 0 );

)
// Chương trình chính
v o id loopO

{
S e r ia l.p r in tfC u o n g do a n h s a n g : ");
S e ria l. p r in t(1 0 0 -m a p (a n a lo g R e a d (A 0 ),0 ,1 0 2 4 ,0 ,1 0 0 ));

S e ria l.p rin tln ("% ");

d e la y (1 0 0 0 );

}
H ã y b iê n d ịc h v à tả i chư ơ ng trìn h x u ố n g b o m a c h A rd u in o và mò
chư ơ ng trìn h th e o d õ i c ổ n g n ố i tiế p c ủ a A rd u in o ID E đ ể ỉấ y dữ liệ u từ m odule
c ả m b iế n á n h s á n g . Đ ể mở chư ơ ng trin h th e o d õ i c ổ n g n ố i tiế p , c h ọ n menu
T o o ls > S e ria l M o n ito r . T ro n g c ử a s ổ tru y ề n ta th ấ y c ư ờ n g đ ộ á n h s á n g đo tại
m ô i trư ờ ng tố i v à ít á n h s á n g .

<30 COM3 ! _ _ ____


Send

Cucng do anh
san g : 11%
Cucng dc anh
3-ang: 8%
Cucxig do enh
3 a n g : 3%
Cu ong dc anh
aang: 8%
Cucng do enh
s s n g : IC'%
Cu eng do anh
sa n g : 13%
Cucng do sn h
s s n g : 6%
Cuong dc anh
sa n g : 1%
Cucng do anh
3 a n g : 81
Cuong do anh
3.ang : 10%
Cuong dc anh
3 ang : 9%
Cucng dc anh
san g : 10%
Cucng dc anh
sa n g : 51
Cucng úc &nh 3 ang: 6%
Cuong đc anh san g : 11%

p ' Ajioscrdi Ịr io line ending

39?
U I I N I BANH CIO K ilftfl Tự IOC CHƯƠNG 10: AROUINO VÀ MODULE CẢM BIẾN ÁNH SANE

Tắt/mở LED theo cường độ ánh sáng từ module cảm biến ánh sáng
B ạ n c ó th ể sử d ụ n g m ứ c n g ư ỡ n g đ ư ợ c h iệ u c h ỉn h tr o n g m o d u le c ả m
biế n á n h s á n g đ ể tắ t m ở L E D th e o c ư ờ n g đ ộ á n h s á n g . N ế u m ô i trư ờ n g t ố i th ì
LED sẽ b ậ t v à k h i m ô i trư ờ n g s á n g th i L E D s ẽ tắ t.

P h ẩ n c ứ n g d ù n g tro n g b à i tậ p n à y b ạ n s ử d ụ n g th ê m đ iệ n trở h ạ n
dò ng và đ è n L E D đ ể sử d ụ n g m o d u le c ả m b iế n á n h s á n g . B ạ n h ã y k ế t n ố i
m ạ ch đ iệ n n h ư h ìn h dư ớ i:

Phần mềm cho chương trình tắt/m ỏ LED theo cường độ án h sáng:

// Chương trình tát mở LED theo cường độ ánh sáng

II Chương trình khởi tạo


void se tu p O

pinMode(0,INPUT);
pinMode(13 ,OUTPUT)'
S erial. b e g in (9 6 0 0 )-

II Chương trình chinh


CHtftfKH: UIWIV* MOtOLE CÁMIẾI *■ :«■ UM CHOtwill If MC

v o id loopO

{
d ig ita lW rite (1 3 ,!d ig ita lR e a d (0 ));
if (d ig ita lR e a d (O )) S e ria l.p rin tln ("O ff");
e lse S e ria l.p rin tln C 'O n 1');

d e la y (1 0 0 0 ); / / Tạo thời gian trễ đảm bảo không Hên tục tất mở LED
}
H ã y b iê n d ịc h v à tả i c hư ơ ng trin h x u ố n g b o m ạ c h A rd u in o . B ạ n có thể
m ở chư ơ ng trin h th e o d õ i c ổ n g n ố i tiế p đ ể th e o d õ i sự p h á t h iệ n c ù a m odule
c ả m b iế n á n h s á n g . K h i m ô i trư ờ ng x u n g q u a n h c ả m b iế n ít á n h s á n g hay tối
th i L E D sẽ b ậ t (s á n g ). N ế u m ô i trư ờ ng x u n g q u a n h c ả m b iế n s á n g m ạ n h thi
L E D sẽ tắ t.
B ạ n c ũ n g c ó th ể sử d ụ n g rơ -le th a y vì sử d ụ n g L E D đ ể đ iề u k h iể n các
m ứ c đ iệ n á p lớ n hơ n. G iả sử b ạ n c ó th ể đ iể u k h iể n h ệ th ố n g đ è n th e o ánh
s á n g c ủ a m ô i trư ờ n g x u n g q u a n h c ủ a c ả m b iế n đ ể c h iế u s á n g tro n g vườn
hoặc sâ n nhà.

TẮT M ã LED 7 ĐOẠN DựA VÀO MÔI TRƯỜNG XUNG QUANH


T ro n g th ự c tế th ì c á c b ả n g q u ả n g c á o c ù a b ạ n k h ô n g c ẩ n p h ả i sáng
b a n n g à y . Vì á n h s á n g b a n n g à y c ủ a m ặ t trờ i c ó cư ờ n g đ ộ s á n g rấ t ló n và
L E D 7 đ o ạ n n ó i riê n g v à b ả n g q u ả n g c á o n ó i c h u n g sẽ k h ô n g th ể n à o thể
h iệ n được c á c h iệ u ứ ng . V ì v ậ y , v iệ c c h ú n g ta c u n g c ấ p n g u ồ n đ iệ n đ ể phát
s á n g là v ô c ù n g lã n g p h i v à k h ô n g h iệ u q u ả .

T ro n g b à i tậ p n à y c h ú n g ta ứ ng d ụ n g m o d u le c ả m b iế n á n h s á n g dể tự
đ ộ n g b ậ t n h ữ n g b ả n g q u ả n g c á o k hi th ò i g ia n đ ã n h á n h e m tố i h o ă c buổi
c h i ề u tà đ ể đ ả m b ả o v i ệ c q u ả n g c á o là h i ệ u q u ả v à k h ô n g g ã y lã n g phi.

C h ú n g ta sẽ th ự c h iệ n p h é p đ ế m th ờ i g ia n trê n L E D 7 đ o ạ n và khi
b u ổ i s á n g th ì L E D 7 đ o ạ n h o à n to à n tắ t v à k h i trờ i tố i th i L E D 7 đ o ạ n sẽ sáng
trỏ lại.

Lưu ý: Cảm biến của bạn phải đật ngoài trời vá có những phương
pháp bảo vệ module.
P hần cứ ng

Đ ể lậ p trin h c h o b à i tậ p nà y c h ú n g ta cầ n p h ả i k ế t n ố i tr.ẽ m m o d u le cảm


b iế n á n h s á n g v à 3 đ è n LE D 7 đ o ạ n . V iệ c p h á t hiện á n h S 3 " ; sẽ rjo c ả m biến
á n h s á n g p h á t h iệ n , v à c h ú n g ta sẽ sử d ụ n g c h â n AO c ủ a c ẽ ' đ ổ dễ dang
c h o v iệ c c h ỉn h ngư ỡng s á n g phù hợp vớ i m o d u le c ả m b iế n Bã' c ũ r,g ró th ể sứ
d ụ n g c h â n DO c ủ a c ả m b iế n th a y v i c h â n AO như tro n g bà i táp na y

394
UHW lAW CM wttftfl TỰIfc ___________________ CHtftfHC M: ABDU1W0 VẦ MODULE CÂM8IÊK ÁHHSAjjS

LED 7 LED 7 LED 7 C B ÁN H


1 BO MẠCH
ĐOẠN 1 ĐOẠN 2 ĐOẠN 3 SÁN G
1 ARDUINO

Đoạn A Đoạn A Đoạn A


C hân s ố 0

C hân s ố 1 Đoạn B Đoạn B Đoạn B

C hân s ố 2 Đoạn c Đoạn c Đoạn c

C hân s ố 3 Đ oạn D Đoạn D Đ oạn D

C hân s ố 4 Đoạn E Đoạn E Đoạn E

C hân số 5 Đoạn F Đoạn F Đoạn F

C hân s ố 6 Đoạn G Đoạn G Đoạn G

C hân s ố 8 C hân chung


hoặc th ô n g
q u a tra n s is to r

C hân s ố 9 C hân chung


hoặc th ô n g
q u a tra n s is to r

C hân s ố 10 C hân chung


hoặc th ô n g
q u a tra n s is to r

C hân tư ơ ng
AO
tự AO

H ìn h dư ớ i là ả n h k ế t n ố i 3 L E D 7 đ o ạ n v à m o d u le c ả m b iế n á n h s á n g .

á h ó Bạn ph^ cấp n 9 u ổ n c h o c á c c ả m b iế n v à n ố i c h â n AO c ủ a c ả m b iế n


ánh s á n g v ớ i c h â n AO c ủ a b o m ạ c h A rd u in o
CHƯƠNG 10: AIDOMO VẢ MODULE CẦM IỂR ÁM tÁNC U N I H I BANH CHG NCựmT Ị l|c

H o ạ t đ ộ n g c ủ a c h ư ơ n g tr ìn h

C hư ơ n g trĩnh c h o b à i tậ p n à y g iú p n h ằ m đ iề u k h iể n 3 đ e '. L E D 7 đoan


tù y th e o cư ờ ng độ á n h s á n g n h ậ n được từ m o d u le c ả m b i ẽ ' 5 ' sáng B a n có
th ể g ã n c ả m b iế n trê n b ả n g q u ả n g c á o h o ă c â m ô i trư o n a - y.z. -ÌỈ- p h á ’ hién
cư ờ ng đ ộ á n h s á n g m ă t trò i N ế u á n h s á n g c ó c u ò n g đỏ = in SẺ la m tắt
b ả n g q u à n g c á o v à khi tro i đã b ắ t đ ấ u tố i thì sẽ tư đ ố n g b à : tả ' 7 ă n g Cg 0
U N M lA W CKO NGI/fll ĩự BflC CHƯƠNG 10: A M IIIM VÀ MODULE CẨM BIÊN Á M ISAW6

T h ự c tế th i c á c đ è n đ ư ờ n g c ủ a c h ú n g ta đ ề u h o ạ t đ ộ n g th e o n g u y ê n lý
náy để tiế t k iệ m tố i đ a n ă n g lư ợ ng đ iệ n . B u ổ i s á n g th ì đ è n h o à n to à n t ă t v à
buổi ch iề u tà s ẽ tự đ ộ n g m ở .

Phẩn mềm
C hư ơng trìn h c h o b à i tậ p n à y th ự c h iệ n p h ư ơ n g p h á p q u é t c h o L E D 7
doạn và thự c h iệ n k iể m tra c ả m b iế n đ ể tắ t m ở q u é t L E D 7 đ o ạ n . B ạ n c ó th ể
thay đổi m ứ c n g ư ỡ n g đ ể c h o p h é p s á n g LED 7 đoạn tạ i b iế n th r e s h o ld
(ngưỡng) ỏ đ ầ u ch ư ơ n g trìn h .

Chương trình tắt/mở led 7 đoạn dựa vào môi trường xung quanh:
II Chương trình tắt mở led 7 đoạn dựa vào m ôi trường xung quanh
II Khai báo các tên LED ứng với các LED 7 đoạn
#define LE D 1 8
#define L E D 2 9

((define L E D 3 10

II Mảng chứa các giá trị diều khiển LED 7 ơoạn Anoơe cnung
unsigned c h a r

LEDSEG[]={OxCO,OxF9,OxA4,OxBO,0 x 9 9 ,0 x 9 2 ,0 x 8 2 ,0 x F 8 ,0 x 8 0 ,0 x 9 0 0 x 8 8 0 x 8
3,O xC 6 ,O x A 1 ,0 x 8 6 ,0 x 8 E ,0 x B F };

II Biến tạm
unsigned c h a r L E D O U T P U T ’

char num LED I, numLED2, numLED3'

Biến ngưỡng ánh sáng để tất mở LED


in tth re s h o ld = 6 0 0 ; / /
II Hàm lấy các bit riêng lẻ
boolean B its ta te ( c h a r v a l, c h a r p o s )
(
boolean xb it;

unsigned c h a r x c h a r =-1 •

if (pos< 16) x c h ar= 0x1 & v a l> > p o s '


xbit=xchar;
return xb it;

II Hàm xuảt ra các chân ngõ ra


void C h a n g e O u tp u tO
(

for(int i= 0 ;i< 8 ;i+ + )


(

397
CHƯƠNG to : ARDUINO VÀ MODULE CẨM BIỂN ÁNH SÁ N . im trtiiT y n t

d íg ita lW rite (i,B itS ta te (L E D O U T P U T ,i) );

}
)
// Hàm quét LED
v o id D is p la y L E D O

{
if (a n a lo g R e a d (A O )> th re s h o ld ) / / Đọc chân AO của cảm biến
// và so sánh mức ngưỡng
{
// Sáng LED 1 trong một thời gian ngắn
L E D O U T P U T = D e c o d e N u m b e r (n u m L E D 1 );

C h a n g e O u tp u t();
d ig ita lW rite (L E D 1 ,H IG H ); / / Cấp điện áp cao cho chân chung LED 1
d e la y (3 );
d ig ita lW r ite (L E D 1 ,L O W );

// Sáng LED 2 trong một thời gian ngắn


L E D O U T P U T = D e c o d e N u m b e r (n u m L E D 2 );
C h a n g e O u tp u tQ ;

d ig ita lW r ite (L E D 2 ,H IG H ); / / C ấ p điện áp cao cho chân chung LED 2


d e la y (3 );
d ig ita lW r ite (L E D 2 ,L O W );

// Sáng LED 3 trong một thời gian ngắn


L E D O U T P U T = D e c o d e N u m b e r (n u m L E D 3 );
C h a n g e O u tp u tO ;

d ig ita lW r ite (L E D 3 ,H IG H ); / / Cấp điện áp cao cho chân chung LED 3


d e la y (3 );
d ig ita lW r ite (L E D 3 ,L O W );

}
e ls e d e la y (1 0 );

)
// Tạo thời gian delay cùng lúc hiển thị
v o id D e la y D is p la y 1 0 M S ( c h a r tim e ) {
fo r (in t i = 0 ;i< tim e ;i+ + ) D is p la y L E D O ;

}
AJUfM lAH Cfll NCƯŨI TựHỌC tr ttt II: U IIM VẦMODULE c

// Hàm giải mã số đếm thành các giá trị mã xuất cho LED 7 ổoạn
u n s ig n e d c h a r D e c o d e N u m b e r ( c h a r n u m )

{
r e tu r n L E D S E G [ n u m ] ;

}
// Chương trình khởi tạo
v o id s e tu p O

{
fo r ( in t i= 0 ;i< 1 4 ;i+ + )

{
p in M o d e ( i, O U T P U T ) ;

}
p in M o d e ( A 0 , IN P U T );

}
// Chương trình chính
v o id lo o p O

{
// Vòng lặp cho biến dếm
fo r ( in t i = 0 ; i< 1 0 0 0 ; i+ + )

{
n u m L E D 1 = i/1 0 0 ;

n u m L E D 2 = ( i/1 0 ) % 1 0 ;
n u m L E D 3 = i% 1 0 ;

D e la y D is p la y 1 0 M S ( 1 0 0 ) ; / / Dợi 1 giây
)
}
Đ o ạ n m ã lậ p trìn h tr o n g b à i tậ p n à y c h o p h é p b ạ n đ ế m từ c
v à h iể n th ị tr ẽ n L E D 7 đ o ạ n k h i m o d u le c ả m b iế n á n h s á n g p h
trư ờ n g x u n g q u a n h là ít á n h s á n g v à tắ t k h i m o d u le c ả m b iế n á n l
h iệ n m ô i trư ờ n g x u n g q u a n h là c ó á n h s á n g m ạ n h .

B ạ n h ã y đ iề u c h ỉn h m ứ c n g ư ỡ n g đ ể p h ù hợp vớ i m ô i t
q u a n h c ủ a nơ i đ ặ t b ả n g q u ả n g c á o .

Tìm hiểu phần mềm


Đ o ạ n m ã lậ p tr in h c h o b à i tậ p n à y c ó th ê m p h ầ n đ ọ c c ả m
đ ịn h á n h s á n g c ó đ ạ t m ứ c n g ư ỡ n g h a y k h ô n g . N ế u á n h s á n g c ó CL
h ơ n m ứ c n g ư ỡ n g th ì s ẽ tắ t L E D 7 đ o ạ n .
in n a w ia iir tH i
CMNC N: U II M u mmi CAMI d AM U K

K h i á n h s á n g cò c ư ò n g đõ lởn h o n m ức n g u õ n g m , sẽ - . à L E D 7 đ o a n
V à v iệ c so s á n h n a y đư oc lâ p trin h ta i ha m q u e t L E D 7 d o a n
v o id D is p ia y L E D O

{ : A.
if (a n a lo g R e a d (A O )> th re s h o ld ) // Doc chân AO của cam bién
II vá so sánh mức ngưỡng
(
L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 1 ):

C h a n g e O u tp u tO ;
d ig ita lW rite (L E D 1 .H IG H );
đ e la y (3 );
d ig ita lW rite (L E D 1 .LO W ):

L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 2 );
C h a n g e O u tp u t();
d ig ita lW rite (L E D 2 .H IG H );
d e la y (3);
d ig ita l W rite (L E D 2 .L O W );

L E D O U T P U T = D e c o d e N u m b e r(n u m L E D 3 );
C h a n g e O u tp u tO ;
d ig ita lW rite (L E D 3 ,H IG H );
d e la y (3 );
d ig ita lW rite (L E D 3 .L O W );

)
els e d e la y ( 10):

}
Lưu ý: Trong chương trinn trẽn, chúng la dung cấu trúc if đề so sánh
giá trị dọc từ cảm biến VỚI biến threshold đ ể quyết đinh có O ùéí LED hay
không. Chúng ta dùng phép so sánh analogRead(AO)>lhreshoỉơ bà
K h i k h ô n g có án h s á n g th i giá trị đ ọ c văo của cảm ũ ié n 3 ;ón hơn m ứ c
ngưỡng và chúng ta sẽ cho sáng LED 7 đoan ùắng cách thjz - én phương
pháp quét trong khối lệnh của cấu trúc if. Nếu giá tri doc '.'30 ~~ò hơn mức
ngưởng t h ì c ó nghĩa: M ô i t r ư ũ n g x u n g quanh c á m b i ể n đ u a ' “ s á n g V I v ậ y
chúng ta tạo ơelay(10ị ơể đàm bào ham DelayDisplaylOMS t h j c - é ' đúng

400
AINIM lA M C H M fllT fllC PHỤ lụ c A : GIỚI TH IỆU SẤCH T IẾ N 6 V IỆ T HỌC ARDUIMO VÁ B A S P B E B B ì

PHỤ LỤC I

G líl THIỆU SÁCH TIÊNG VIỆT HỌC ARDUINO


■ ■ *

VÀ RASPBERRY
Đ ể c ó th ể h ọ c k h a i th á c , s ử d ụ n g A r d u in o v à R a s p b e r r y n ộ i d u n g s á c h
h ọ c c ầ n p h ả i trìn h b à y n h iề u c h ủ đ ề cơ b ả n n h ấ t m à n g ư ờ i n à o lậ p tr in h ứ nc
dụng tr o n g c ô n g n g h iệ p c ầ n p h ả i b iế t n h ư :

• C à i đ ặ t, lậ p trìn h c ă n b ả n v ớ i A r d u in o v à R a s p b e rr y .

• Đ iề u k h iể n L E D đ ơ n , L E D 7 đ o ạ n , L C D , L E D m a tr ậ n .

• H iể n th ị ra m à n h ìn h L E D 7 đ o ạ n , L C D 1 6 x 2 , L E D m a tr ậ n từ c á c cảm
b iế n n h iệ t đ ộ , đ ộ ẩ m , á n h s á n g , h ồ n g n g o ạ i, s iê u â m , c h u y ể n đ ộ n g v.v
q u a c á c g ia o t iế p S P I, I2 C .

• Đ iề u k h iể n đ ộ n g cơ D C , đ ộ n g cơ s e r v o , đ ộ n g cơ b ư ớ c q u a c h â n P W M
G P IO .

• K ế t n ố i v à đ iề u k h iể n trự c t iế p q u a 2 b o m ạ c h A r d u in o , A r d u in o vớ i
R a s p b e rry .

• Đ iề u k h iể n b ậ t t ắ t n g u ồ n v à c á c th iế t b ị k h á c q u a in te r n e t.

• Đ iề u k h iể n n h à th ô n g m in h .

• K ế t n ố i m ạ n g v à x ử lý ả n h

C á c b ạ n đ ã đ ư ợ c h ư ớ n g d ẫ n h ọ c lậ p tr in h A r d u in o q u a 2 c h u y ê n đ ề :

1. LẬ P T R ÌN H Đ IỂ U K H IỂ N V Ó I A R D U IN O .

2. VI Đ IỂ U K H IỂ N V À ỨNG D Ụ N G - A R D U IN O D À N H C H O NGƯỜI T ự H Ọ C

N ộ i d u n g c h ín h c h o h a i c h u y ê n đ ề n à y là g iớ i th iệ u n h ữ n g p h ầ n cơ b ả n
đ ể k h a i th á c v à s ử d ụ n g A r d u in o n h ư : T ìm h iể u p h ầ n c ứ n g v à p h ầ n m ề m
A rd u in o , lậ p trìn h đ iề u k h iể n v à tạ o h iệ u ứ n g c h o L e d đ ơ n , L e d 7 đ o ạ n , L e d
m a trậ n . B iế t c á c h m ô p h ỏ n g m ạ c h đ iề u k h iể n A r d u in o tr ê n P r o te u s c ũ n g n h u
lậ p trìn h đ iể u k h iể n h iể n th ị c h o 3 lo ạ i c ả m b iế n d ù n g k h á p h ổ b iế n đ ó là : c ả m
b iế n n h iệ t đ ộ v à đ ộ ẩ m , c ả m b iế n â m th a n h v à c ả m b iế n á n h s á n g là m c ơ sở
c h o lậ p trìn h n h ữ n g v ấ n đ ề p h ứ c tạ p h ơ n tr o n g d â n d ụ n g c ũ n g n h ư tr o n g c ô n g
n g h iệ p .

C ò n n h iề u v ấ n đ ề p h ả i tìm h iể u v à h ọ c v ó i A rc iu in o v à R a s p b e rry .
T ro n g n ă m 2 0 1 5 tủ s á c h S T K s ẽ b iê n s o ạ n v à p h á t h à n h 2 tà i liệ u s a u th u ộ c
họ sá c h H ư ớ n g d ẫ n s ử d ụ n g A r d u in o v à R a s p b e r r y ” .

401
m lie A: tm Tilt I » a l ế u ntT wc A IIIW in i m t t u T u iia ir t » '1 » c

• A R D U I N O D A N H C H O NGƯỞI B Ắ T Đ Á U .

. ĐIÉU KHIỂN LÁP TRÌNH - RASPBERRY PI DANH CHO NGƯOI TỰ HOC


. Tự HỌC LẠP TRINH ĐIỂU KHlỂN v ớ i r a s p b e r r y p i.

Cấn lưu ỷ: Một số nội dung trong sách khi biên soar xong có the hơi
khác so VỚI phán trinh bày dưới đây. Rất m ong sự tham gia. công tác cùa các
bạn đọc có kinh nghiệm về lập trình Arduino nhất là các tháy, cà giảng dạy liên
quan về chù dế này củng với tủ sách STK biên soạn nhiéu ta hẻu hơn nữa vê
điều khiền và lập trình cho bo mạch Arduino sao cho dễ hiểu, cễ sử dụng, các
mạch điện trình bày sát với thực tế, người học có thề mua linh kiện dễ dàng
đáp ứng việc đồi mói việc dạy và học tại các trường.

ARDUINO DÀNH CHO NGƯỜI B Ắ T ĐẦU


T ro n g c h u y ê n để n à y c á c b ạ n h ọ c v à thự c h à n h q u a c á c c h ủ đề
hư ỏ ng tới ứng d ụ n g n h iề u tro n g đ iề u k h iể n c ô n g n g h iệ p . C á c c h ủ đề trìn h b à y
tro n g s á c h g ầ n như b a o g ồ m c á c n ộ i d u n g cơ b ả n n h ấ t m à m ộ t k ỹ sư Đ iệ n
c ầ n làm được.
N ộ i d u n g s á c h gố m c á c ch ủ đề sau:

• Tìm h iể u c á c cà m b iế n th ô n g d ụ n g tro n g c ô n g n g h iệ p (c ả m b iế n n h iệ t
độ, đô ẩ m , âm th a n h , á n h s á n g , áp lực, h ổ n g n g o ạ i, s iê u â m .

• L ậ p trin h đ iề u kh iể n đ ộ n g CO D C , đ ộ n g cơ s e rv o , đ ộ n g cơ bướ c.
• Đ iế u k h iể n R obot.

• M ờ r ộ n g n g õ ra A r d u i n o v ó i t h a n h g h i d ịc h .

• L ậ p trin h điề u k h iể n LE D đơn n â n g c a o c h o n h iề u k iể u c h ạ y v à h iệ u


ứng khác nhau.
• L ậ p trin h đíé u k h iể n trư c tiế p c h o 1 và 2 LE D 7 đ o a n , tó i n h iề u L E D 7
đoạn SỪ dụng phưong pháp quét..
• T h iế t kế d ồ n g h ố số h iể n th ị G iờ -P h ú -G iâ y tro n g ngà/

• L â p trìn h đ iề u k h iể n L E D m a trâ n c h o n h iề u k iể u c h a y và h iệ u ứ ng
k h á c n h a u c h o LE D m a trâ n 8x8. LE D m a trâ n 1 6 x8 q u é t th e o h a n g
c ũ n g như q u é t th e o côt.

• L ậ p trin h đ iề u k h iể n LC D h iể n th ị c á c k ế t q u à đo -à -n b iế n ' h
sáng, n hiét đõ. đỏ ẩm.
• M õ p h ỏ n g lâp tr in h đ iều k h i ế n bo m a c h A r d u in o VÓI Pr--C s
• Đ iề u k h iể n d ô n g có s e rv o h iể n th ị trẽ n LC D
• T ạ o m à n hìn h L o a d in g và v u m e te r h iể n th ị trẽ n LC D

• Sử d u n g R e a ltim e h iể n tn ị trể n LC D

402
A ỈM IM IA N CH K t t l ĩự l|C PHỤ LỤC A : t lỡ l THIẼO iA C H T IẾH B V IỆ T HỌC ABDUIW0 « A K A S P B EB B Y

• M à n h ln h v à b à n p h ím c ả m ứ n g .

• C ô n g n g h ệ n h ậ n d ạ n g b ằ n g s ó n g v ô tu y ế n R F ID v à đ iề u k h iể n lậ p
trìn h A r d u in o sử dụng bộ đọc th ẻ R F ID (R A D IO FR EQ U EN CY
ID E N T IF IC A T IO N ).

P h ẩ n n ộ i d u n g trìn h b à y tr o n g c h u y ê n đ ề “T ự H Ọ C LẬ P T R ÌN H Đ IỂ U
K H IỂ N VỚI R A S P B E R R Y P I" c ó lẽ là lý tư ỏ n g n h ấ t k h i b iê n s o ạ n c á c tà i liệ u h ọ c
v i x ử lý , v i đ iề u k h iể n , tấ t n h iê n A r d u in o c ũ n g k h ô n g nằm tr o n g n g o ạ i lệ .
N h ư n g đ ể lậ p trìn h R A S P B E R R Y PI, b ạ n c ầ n p h ả i h ọ c lậ p trìn h P y th o n c ò n
tư ơ n g đ ố i lạ v ớ i n h iề u n g ư ờ i.

RASPBERRY PI DÀNH CHO NGƯỜI Tự HỌC


B o m ạ c h R A S P B E R R Y P I B V 2 tu y m ắ t t iề n n h ư n g đ á n g đ ể c á c b ạ n
n g h iê n c ứ u d o s ứ c m ạ n h c ủ a n ó (p h ầ n c ứ n g c ù a b o m ạ c h đ ã tíc h h ợ p n h iề u
th à n h p h ầ n ) . N ộ i d u n g s á c h g ồ m cá c chủ để sa o ch o người b ắ t đ ầ u học
R a s p b e rr y c ó th ể ứ n g d ụ n g b o m ạ c h tr o n g đ iề u k h iể n n h ữ n g v ấ n đ ề c ơ b ả n
n h ấ t tr o n g d â n d ụ n g v à c ô n g n g h iệ p .

• G iớ i th iệ u b o m ạ c h R a s p b e r r y P i.

• R a s p b e rry P i và c á c ứ ng d ụ n g .

• C hư ơng 1 - P h ầ n cứ ng và p h ầ n m ề m .

> G iớ i th iệ u b o m ạ c h R a s p b e r r y P i v à c á c lin h k iệ n đ i k è m .

> C à i đ ặ t h ệ đ iề u h à n h R a s p b e r r y P i.

• C h ư ơ n g 2 - Đ iề u k h iể n v à tạ o h iệ u ứ n g c h o L E D đ ơ n .

• C h ư ơ n g 3 - C à i đ ặ t p h ầ n m ề m s ử d ụ n g c á c c h â n G P IO .

• C h ư ơ n g 4 - L ậ p tr in h P y th o n c h o R a s p b e r r y P i.

• C h ư ơ n g 6 - T r u n g tâ m tr u y ề n th ô n g v ớ i R a s p b e r r y P i.

• C h ư ơ n g 7 - L à m v iệ c v ớ i c o m m a n d lin e (d ò n g lệ n h ) .

• C h ư ơ n g 8 - L à m v iệ c v ớ i S o u n d v à V id e o .

• C hương 9 - Sử d ụ n g W e b ca m .

• C h ư ơ n g 1 0 - L ậ p trìn h G a m e s v ớ i S r a tc h .

• C h ư ơ n g 11 - M ạ n g tr o n g R a s p b e r r y P i.

• Chương 12 - ứng dụng R a s p e rry tr o n g đ iề u k h iể n dân dụng và


c ô n g n g h iệ p .

• C h ư ơ n g 1 3 - H iể n th ị m à n h ìn h L e d 7 đ o ạ n v à L C D .

• C h ư ơ n g 1 4 - K ế t n ố i v à đ iề u k h iể n A r d u in o v à R a s p b e r r y P i.

403
PHU LHC *: (101 T llíl i>g lẾK l f ĩ HC A IIIW 1» l « m u i U M UM CM wvot TV HC

ĩự HỌC LẬP TRÌNH DIẾU KHIỂN vứl RASPBERRY PI


Dự k iế n tà i lié u g ồ m 22 chư ờ ng:

• C á c k h á i n iê m cơ bả n.

• C hư ơng 1 - C à i đ ặ t R a s p b e rry Pi và c h u ẩ n bị lin h k iẽ n

• C hư o ng 2 - L â p trìn h P y th o n c á n b ả n vớ i R a s p b e rry p

• C hư ơng 3 - Đ ọ c n ú t n h ấ n v à đ iể u k h iể n đ è n L E D .

• C hư ơng 4 - Đ iế u k h iể n trự c tiế p đ è n L E D 7 đ o ạ n .

• C hư ơ ng 5 - Đ iề u k h iể n trự c tiế p đ è n L E D m a trix .

• C hư ơ ng 6 - H iể n th ị ra m à n hình L C D 16x2.

• C hư ơ ng 7 - Đ iề u k h iể n đ è n L E D m a trix q u a g ia o tiế p S PI-

• C hư ơng 8 - Đ ọ c c ả m b iế n n h iệ t đ ộ q u a g ia o tiế p I2C .

• C hư ơ ng 9 - Đ ọ c c ả m b iế n n h iệ t đ ộ a n a lo g q u a IC A D C .

• C hư ơ ng 10 - Đ ọ c hình ả n h từ w e b c a m .

• C hư ơ ng 11 - Đ ọ c c ả m b iế n từ đ ể p h á t h iệ n v ậ t th ể .

• C hư ơng 12 - Đ ọ c c ả m b iế n h ổ n g n g o ạ i đ ể p h á t h iệ n ng ư ờ i d a n g đi.

• C hư ơng 13 - Đ ọ c c ả m b iế n độ ẩm .

• C hư o ng 14 - Đ iể u k h iể n đ ộ n g ca DC qua ch â n P W M .

• C hư o ng 15 - Đ iề u k h iể n đ ộ n g cơ D C s e rv o q u a c h â n P W M .

• C hư o ng 16 - Đ iế u k h iể n đ ộ n g c o bư ớc D C q u a c h â n G P IO th ư ờ n g .

• C hương 17 - G ừ i th ô n g tin lê n tra n g w e b T w itte r.

• C hư o ng 1 8 - C h e c k e m a il v à b á o h iệ u q u a đ è n L E D .

• C hư o ng 19 - D ù n g R a s p b e rry Pi để n g h e in te rn e t ra d io

• C hư ờ ng 1 8 - C h e c k e m a il và b á o hiẽ u q u a đ è n L E D .

• C h ư o n g 1 9 - D u n g R a s p b e r r y Pi đ ể n g h e i n t e r n e t r a d i -

• C h ư ơ n g 2 0 - Đ i ế u k h i ể n b ã ! t á t n g u ồ n t h i ế t bị q u a i n > r - f

• C hư ơng 21 - R a s p b e rry Pi k ế t n ố i và đ ié u k h iể n trư c '.'ị' ln

• C h ư o n g 2 2 - K ế t n ối R a s p b e r r y Pi v ả A r d u in o q u a C1 3 - • í.r .
^ 'OI tié p v à
lậ p trin h nai phia.

X i n t r â n t r o n g g i ó i t h i ê u t r ư ó c :ỎI t a n 3 o c

404
A U IM IÂ U CM K i l l ĩỊlỊC PBỊ LỊCI: tlểl TBỆB EBOOK VA PHIH gạc lAtFIEIE

PHỤ LỤC I

GI0I THIỆU EBOOKS VÀ PHIM HỌC RASPBERRY


■ ■

EBOOK HỌC R A SPBERR Y PI

■ B e g in n in g P y th o n V is u a liz a tio n 2 0 1 4 2 n d ( Shai V ingast).

• B e g in n in g S e n s o r N e tw o r k s w ith A r d u in o a n d R a s p b e r r y P i (C h a rle s
B e ll)

■ D a s R a s p b e r r y P i K o m p e n d iu m ( R u d ig e r F o llm a n n ).

■ G e ttin g S ta r te d w ith R a s p b e rry Pi ( M a tt R ic h a r d s o n & Shaw r


W a lla c e ) .

■ H a c k in g R a s p b e r r y P i 2 0 1 3 - S te p - b y - S te p In s tr u c tio n s a re S tu n n in g lv
C le a r a n d E a s y ( T im o th y L . W a r n e r ) .

■ L e a r n R a s p b e r r y P i P r o g r a m m in g w ith p y th o n ( W o lfr a m D o n a t).

■ L e a rn R a s p b e r r y P i w ith L in u x ( P e te r M e m b r e y - D a v id H o w s ) .

■ P y th o n D a ta V is u a liz a tio n C o o k b o o k ( ig o r M ilo v a n o v ic ) .

• P r a c tic a l R a s p b e r r y P i (B r e n d a n H o r a n ) .

■ P r a g m a tic R a s p b e r r y P I - A Q u ic k s t a r t G u id e ( M a ik S c h m id t ) .

■ R a s p b e r r y P i 21 B r illia n t P r o je c ts - 2 0 1 4 ( G a r e th H a lfa c r e e ) .

■ R a s p b e rry P i A Q u ic k s t a r t G u id e ( M a ik S c h m id t) .

■ R a s p b e rry P i C o o k b o o k fo r P y th o n P r o g r a m m e r s (T im C o x ).

■ R a s p b e rry P i fo r b e g in n e r s (Im a g in P u b lis h in g ) .

■ Raspberry Pi for Secret Agents (Stefan Sjogelid).

■ R a s p b e rry P i H a c k s (R u th S u e h le & T o m C a lla w a y ) .

• R a s p b e rry P i H o m e A u to m a tio n w ith A r d u in o ( A n d r e w K . D e n n is ) .

■ R a s p b e r r y P i P ro je c ts (D r. A n d r e w R o b in s o n - M ik e C o o k - J o n a th a n
E va n s - S e a n M c M a n u s ).

■ R a s p b e r r y P i P r o je c ts fo r th e E v il G e n iu s 2 0 1 4 ( D o n a ld N o r r is ) .

■ R a s p b e rry P i S e r v e r E s s e n tia ls ( P io tr J . K u la ).

• Raspberry Pi Super Cluster (Andrew K. Dennis).

«5
■ Raspberry Pi The Complete Manual (Imagin Ptb lis" ig i

• Raspberry Pi User Guide (Eben Upton. Gareth Hal'aoree).


I (Steven
■ Smart Home Automation with Linux and RaspDerry p
G o o d w in ).

■ T ạ p c h í M A G P I từ s ố 1 đ ế n s ố 27.

• T e a c h Y o u rs e lf V IS U A L L Y R a s p b e rry Pi (R ic h a rd W e n ik ).

■ U ltim a te G u id e to R a s p b e rry Pi (K e v in P a rtn e r).

P H IM H Ọ C R A S P B E R R Y PI

• M y F irs t R a s p b e rry Pi G a m e (1 ,4 2 G B )

■ P lu ra ls ig h t - R a s p b e rry Pi fo r D e v e lo p e rs T u to ria l (361 MB)

■ Up a n d R u n n in g w ith R a s p b e rry Pi (1 4 9 M B ).

1. O b ta in in g a R a s p b e rry Pi a n d A c c e s s o rie s .

2. B o o tin g Up.

3. J u s t E n o u g h L in u x .

4. S e ttin g Up V N C .

5. W o rk in g w ith S o u n d .

6. B u ild in g a W e b c a m W e b s ite w ith P y th o n .

7. U s in g G P IO .
MỤC LỤC
■ ■

ARDUINO DÀNH CHO N G Ư 0 I Tự HỌC


PHẠM QUANG HUY - NGUYỄN TRỌNG HIẾU

NỘI DUNG TRANG

CHƯƠNG 1: GIỚI T H IỆ U 3

CHƯƠNG 2: P H Ẩ N C Ứ N G VÀ P H Ấ N M Ể M A R D U IN O 41

CHƯƠNG 3: Đ IẾ U K H lỂ N v à t ạ o h i ệ u ứ n g v ớ i 6 LE D 111

CHƯƠNG 4: Đ lỂ U K H IỂ N v à t ạ o h i ệ u ứ n g VỔ I 12 LED 153

CHƯƠNG 5: Đ lỂ U K H IỂ N v à t ạ o h i ệ u ứ n g v ớ i 12 LE D T H E O M Ả N G 195

CHƯƠNG 6: Q U Ả N G C Á O VỚI LED MA T R Ậ N 229

CHƯỜNG 7: Đ IỂ U K H IỂ N LE D 7 Đ O Ạ N 327

CHƯƠNG 8: H lỂ N T H Ị K Ế T Q U Ả Đ O N H IỆ T Đ Ộ VÀ Đ Ộ Ẩ m b ằ n g l e d 357
7 ĐOẠN

CHƯƠNG 9: A R D U IN O V À M O D U LE C Ả M B IẾ N Â M T H A N H 375

CHƯƠNG 10: A R D U IN O V À M O D U LE C Ả M B IẾ N Á N H S Á N G 389

PHỤ LỤ C A: GIỚI T H IỆ U S Á C H T IẾ N G V IỆ T H Ọ C A R D U IN O V À 401


RASPBERRY

PH Ụ LỤC B: G IỔ I T H IỆ U EBO OKS VÀ P H IM H Ọ C A R D U IN O V À 405


RASPBERRY

MỤC LỰC 407


ARDUINO DÀNH CHO NGƯỜI Tự HỌC
PH ẠM QUANG HUY - N G U YỄN ĨR Ọ N G H IẾU

C H ỊU T R Á C H N H IỆ M X U Ấ T B Ả N

T S. P H Ù N G LAN HƯƠNG

B IỂ N T Ậ P

PH Ạ M Q UAN G HUY

S Ử A B Ả N IN

N G U Y Ề N T R Ọ N G H IẾ U

T H I Ế T K Ể B ÌA

C Ô N G TY T N H H THƯ Ơ NG M ẠI STK

NHÀ XUẤT BẢN BÁCH KHOA HÀ NỘI

L IÊ N K Ế T X U Ấ T B Ả N

C Ô N G TY T N H H THƯ Ơ NG MẠI STK


7 4 2 Đ iê n B iê n P h ủ , P h ư ờ n g 1 0 , Q u ậ n 1 0 , T p . H ổ C h í M in h

Đ iê n th o ạ i: (0 8 ) 3 8 3 3 4 1 6 8 - 0 9 0 3 7 2 8 3 4 4

Fax: 08 3 8 3 3 4 1 6 8

W e b s it e w w w .n h a s a c h s tk .c o m ; w w w .s tk b o o k com

M a il: n h a s a c h s t k © y a h o o . c o m . v n - s tk b o o k © y a h o o com V

In 800 cuốn, khổ 16 X 24cm tai C õng ty c ổ phán in V ié t Nan--* 1 C 4 0 '


ph ư ờ n g B ìn h H ư n g H ò a B Q u à n B in h T â n T P .H C M . s ỗ đắr.g < y t h 0n^ S 0 ỷ

bàn cùa C ục xuất bàn 2 0 9 -2 0 1 5 /C X B /0 6 -0 6 /B K H N Q u y ế t dinh , Ị °5 xuf t


_ _ “ ’ “ an so O4 /OFI-
Đ H B K -B K H N ngay 2 m áng 2 năm 2015 M ã sỏ IS B N “7
xong và nộp lưu chiểu qúy 1 năm 2015. ln

You might also like