Tương tự như module đèn LED, còi báo (buzzer) được tích hợp trên board xController cũng là một module thuộc loại output, có chức năng phát ra âm thanh. Trong bài học này, chúng ta sẽ học cách dùng thư viện xController để buzzer phát ra các nốt nhạc và ghép thành một bài nhạc hoàn chỉnh.
Chúng ta cũng sẽ tìm hiểu về khái niệm Hàm để rút ngắn chương trình trong lập trình.
Buzzer là một thiết bị phát âm thanh khá phổ biến, được sử dụng nhiều trong các máy tính, máy in, xe đồ chơi, điện thoại và nhiều thiết bị điện tử khác. Buzzer có 2 loại chính là: passive và active.
Buzzer cũng như cái trống hay các vật có thể phát âm thanh khác, cần có sự rung động ở bề mặt loa thì mới phát ra âm thanh được. Buzzer active có sẵn bộ tạo rung động này (gọi là bộ tạo dao động, oscillator) nên chỉ cần cấp tín hiệu điện là có âm thanh nhưng sẽ không thay đổi được âm thanh. Còn buzzer loại passive cần cấp tín hiệu dạng sóng để tạo dao động thì mới phát âm thanh được. Bù lại, chúng ta có thể thay đổi âm thanh bằng cách thay đổi tín hiệu sóng truyền vào.
Buzzer được tích hợp trên board xController là loại passive. Chúng ta có thể lập trình để cho phát ra các nốt nhạc theo ý muốn.
Trong lập trình máy tính, hàm (function) là tập hợp các lệnh để giải quyết một vấn đề nào đó. Hàm được viết ra để có thể sử dụng gọi lại ở nhiều nơi trong chương trình mà không cần phải viết lại các lệnh đó, giúp chương trình được rút ngắn và dễ đọc hơn.
Từ nhiều bài học trước, chúng ta cũng đã dùng nhiều hàm sẵn có của MicroPython như print() hay sleep(). Chúng ta cũng có thể tự viết các hàm của riêng mình để sử dụng trong chương trình.
Trong MicroPython, chúng ta sử dụng từ khóa “def” để khai báo hàm. Cú pháp như sau:
def function_name (parameter1, parameter2): function_body
Khi khai báo một hàm, chúng ta bắt đầu bằng “def”, theo sau là tên hàm và dấu () với danh sách các tham số có thể truyền vào. Các lệnh bắt đầu từ sau dấu “:” là thân hàm (function body) và sẽ được chạy khi hàm được gọi ở nơi khác trong chương trình.
Chúng ta xem thử một ví dụ về hàm như sau:
def hello(): print('Hello World') hello()
Khi chương trình trên được chạy, một dòng chữ Hello World sẽ được in ra. Trong chương trình trên, chúng ta khai báo một hàm tên là hello(), hàm này có câu lệnh in ra “Hello World” và sẽ được chạy khi hàm được gọi.
Bên trong dấu “()” ở sau tên hàm, chúng ta có thể khai báo các tham số (gọi là parameters) có thể truyền vào để hàm sử dụng. Ví dụ:
def max(a, b): if a > b: return a else: return b print(max(5, 4))
Trong chương trình trên, hàm max() được khai báo sử dụng 2 tham số đầu vào là a và b. Bên trong thân hàm, câu lệnh if so sánh 2 số và trả về số lớn hơn. Câu lệnh “return [expression]” sẽ kết thúc hàm và trả về giá trị cho nơi nào gọi hàm này. Hàm max được gọi lồng bên trong câu lệnh print() nên số lớn hơn trong 2 số truyền vào sẽ được trả về cho hàm print(), và hàm print() sẽ in ra số 5.
# Phát bài nhạc Twinkle twinkle little stars # Câu 1: Đồ, Đồ, Son, Son, La, La, Son def song_1(): speaker.play(['C4:1'], wait=True) speaker.play(['C4:1'], wait=True) speaker.play(['G4:1'], wait=True) speaker.play(['G4:1'], wait=True) speaker.play(['A4:1'], wait=True) speaker.play(['A4:1'], wait=True) speaker.play(['G4:1'], wait=True) # Câu 2: Fa, Fa, Mi, Mi, Rê, Rê, Đồ def song_2(): speaker.play(['F4:1'], wait=True) speaker.play(['F4:1'], wait=True) speaker.play(['E4:1'], wait=True) speaker.play(['E4:1'], wait=True) speaker.play(['D4:1'], wait=True) speaker.play(['D4:1'], wait=True) speaker.play(['C4:1'], wait=True) while True: song_1() time.sleep(0.5) song_2() time.sleep(1)
Chương trình trên phát ra loa 2 câu đầu của bài nhạc Twinkle twinkle little star:
Vì thế chúng ta sẽ tạo hai hàm song_1() và song_2():
# Câu 1: Đồ, Đồ, Son, Son, La, La, Son def song_1(): speaker.play(['C4:1'], wait=True) speaker.play(['C4:1'], wait=True) speaker.play(['G4:1'], wait=True) speaker.play(['G4:1'], wait=True) speaker.play(['A4:1'], wait=True) speaker.play(['A4:1'], wait=True) speaker.play(['G4:1'], wait=True) def song_2(): speaker.play(['F4:1'], wait=True) speaker.play(['F4:1'], wait=True) speaker.play(['E4:1'], wait=True) speaker.play(['E4:1'], wait=True) speaker.play(['D4:1'], wait=True) speaker.play(['D4:1'], wait=True) speaker.play(['C4:1'], wait=True)
Trong các hàm song_1() và song_2() của chương trình, hàm speaker.play() được sử dụng để phát ra nhạc. Hàm này có cú pháp như sau:
speaker.play(tune, wait=False, loop=False)
Ý nghĩa các tham số:
Mỗi nốt nhạc cần phát gồm 2 phần, tên nốt nhạc (ví dụ C4, D4…) và độ dài cần phát. Độ dài nốt nhạc có các giá trị sau:
Trong bài hát trên, chúng ta đều sử dụng nốt đen cho các nốt nhạc (ví dụ C4:1). Chúng ta cần nhìn vào sheet nhạc để biết nốt nhạc trong bài hát.
Ngoài ra, để dừng play nhạc, bạn có thể dùng thêm hàm sau:
speaker.stop()
Sau khi chạy chương trình, còi báo tích hợp trên board xController sẽ liên tục phát ra các nốt nhạc của bài hát quen thuộc “Twinkle Twinkle Little Stars”.