Mục lục bài viết

Bài này hướng dẫn mô phỏng buzzer Arduino trên Proteus và viết code cho nó kêu. Nếu mô phỏng mà không nghe tiếng, thủ phạm thường là chọn nhầm loại buzzer hoặc đặt Operating Voltage cao hơn 5V. Đọc xong, bạn sẽ tự làm được còi báo cho các project như báo cháy, báo nhiệt độ hay báo khi bấm nút.

Mục tiêu bài học:

  • Phân biệt được buzzer chủ động và buzzer thụ động.
  • Thiết kế được mạch buzzer trên Proteus.
  • Viết được chương trình bật, tắt và tạo tiếng bíp cho buzzer.
  • Xử lý được lỗi chạy mô phỏng mà không nghe tiếng.

1. Buzzer là gì?

Buzzer (còi chip) là linh kiện phát ra âm thanh khi có dòng điện đi qua. Nó thường dùng để báo hiệu một sự kiện. Ví dụ: báo động khi có cháy, kêu bíp khi nhấn nút, hay cảnh báo khi cảm biến phát hiện chuyển động.

Linh kiện buzzer dùng với Arduino
Buzzer

Có 2 loại buzzer phổ biến:

LoạiCách hoạt độngCách điều khiển
Chủ động (active)Có sẵn mạch dao động bên trongChỉ cần cấp HIGH là kêu
Thụ động (passive)Không có mạch dao độngCần cấp xung (dùng hàm tone())

Buzzer chủ động chỉ kêu một tần số cố định. Buzzer thụ động đổi được tần số, nên phát được nhiều nốt nhạc khác nhau.

2. Thiết kế mạch buzzer Arduino trên Proteus

Phần này gồm 3 bước: chọn đúng linh kiện, nối dây và chỉnh thông số. Làm sai bước 1 hoặc bước 3 là mô phỏng im re.

Chọn linh kiện buzzer

Trong cửa sổ Pick Devices, gõ từ khóa buzzer. Proteus trả về 2 kết quả. Chúng ta chọn dòng BUZZER – ACTIVE với mô tả DC Operated Buzzer – Outputs Via Sound Card.

Chọn BUZZER ACTIVE trong cửa sổ Pick Devices của Proteus
Chọn linh kiện buzzer Arduino trong Proteus

Dòng còn lại (BUZZER – DEVICE) chỉ là ký hiệu vẽ sơ đồ. Nó không phát ra âm thanh khi mô phỏng.

Sơ đồ nối buzzer Arduino

Mạch rất gọn, chỉ có 2 dây:

Chân buzzerNối với
Chân dương (+)Chân số 8 của Arduino Uno
Chân âm (−)GND
Sơ đồ nối buzzer Arduino Uno chân 8 trên Proteus
Sơ đồ mạch buzzer Arduino trên Proteus

Chỉnh thông số buzzer

Nhấp đúp vào buzzer để mở hộp thoại Edit Component. Sửa 2 thông số sau:

  • Operating Voltage: 5V, khớp với mức HIGH của Arduino.
  • Load Resistance: 100 (đơn vị Ω). Đây là điện trở tải của buzzer, Proteus dùng nó để tính dòng chạy qua buzzer.
Chỉnh Operating Voltage 5V và Load Resistance 100 cho buzzer trong Proteus
Chỉnh thông số buzzer trong Proteus

Mục Frequency (mặc định 500Hz) là tần số tiếng kêu. Bạn có thể đổi để nghe tiếng cao hoặc trầm hơn.

Lưu ý: Với 5V và 100Ω, dòng qua buzzer khoảng 50mA. Mức này vượt giới hạn tối đa 40mA của mỗi chân ATmega328P. Proteus vẫn mô phỏng bình thường. Khi làm mạch thật, hãy xem dòng của buzzer trong datasheet. Nếu lớn hơn 20mA thì điều khiển qua transistor.

3. Chương trình điều khiển buzzer Arduino

Bật tắt buzzer mỗi giây

Buzzer chủ động điều khiển y hệt LED. Cấp HIGH thì kêu, cấp LOW thì im. Nếu đã học bài điều khiển LED đơn thì code này quá dễ luôn.

int buzzerPin = 8; // Chân nối với buzzer

void setup() {
  pinMode(buzzerPin, OUTPUT); // Cấu hình chân 8 là OUTPUT
}

void loop() {
  digitalWrite(buzzerPin, HIGH); // Bật buzzer
  delay(1000);                   // Kêu trong 1 giây
  digitalWrite(buzzerPin, LOW);  // Tắt buzzer
  delay(1000);                   // Im lặng 1 giây
}

Hàm loop() lặp liên tục. Kết quả là buzzer kêu 1 giây, nghỉ 1 giây, rồi lặp lại.

Để chạy trên Proteus, trong Arduino IDE chọn Sketch > Export Compiled Binary để xuất file .hex. Sau đó nhấp đúp vào Arduino trong Proteus, chọn file .hex ở mục Program File rồi bấm Run.

Kêu 3 tiếng bíp như còi báo

Còi báo thực tế thường kêu vài tiếng ngắn liên tiếp. Chỉ cần thêm vòng lặp for và rút ngắn thời gian delay():

int buzzerPin = 8; // Chân nối với buzzer

void setup() {
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  // Kêu 3 tiếng bíp ngắn
  for (int i = 0; i < 3; i++) {
    digitalWrite(buzzerPin, HIGH);
    delay(150);
    digitalWrite(buzzerPin, LOW);
    delay(150);
  }
  delay(2000); // Nghỉ 2 giây rồi lặp lại
}

Phát tiếng bằng hàm tone()

Buzzer thụ động cần sóng vuông mới kêu. Hàm tone(chân, tần số) tạo sóng vuông với tần số (Hz) cho trước trên chân đó, thấp nhất 31Hz. Hàm noTone(chân) dùng để tắt.

int buzzerPin = 8; // Chân nối với buzzer

void setup() {
  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  tone(buzzerPin, 1000); // Phát sóng vuông 1000 Hz
  delay(500);
  noTone(buzzerPin);     // Ngừng phát
  delay(500);
}

Lưu ý: Trên Uno, tone() làm nhiễu PWM ở chân 3 và 11. Khi mô phỏng, BUZZER – ACTIVE chỉ kêu theo tần số ở mục Frequency. Muốn nghe đúng tần số của tone(), hãy thay bằng linh kiện SPEAKER.

4. Mô phỏng buzzer Arduino không nghe tiếng?

Mạch chạy, code đúng mà vẫn im re? Kiểm tra lần lượt các lỗi sau:

  • Chọn nhầm BUZZER – DEVICE: loại này chỉ là ký hiệu, không có âm thanh. Xóa đi và chọn lại loại ACTIVE.
  • Chưa sửa Operating Voltage: nếu giá trị này cao hơn 5V thì mức HIGH của Arduino không đủ kích, buzzer sẽ im. Đặt lại Operating Voltage ≤ 5V.
  • Máy tính không có loa hoặc đang tắt tiếng: buzzer phát âm thanh qua sound card. Hãy cắm tai nghe và kiểm tra âm lượng.
  • Nạp sai file .hex: Arduino trong Proteus vẫn chạy file của bài khác. Biên dịch lại và chọn đúng đường dẫn ở mục Program File.
  • Nối sai chân: code dùng chân 8 nhưng dây lại nối chân 9. Đối chiếu với bảng nối ở mục 2.

5. Bài tập

  1. Thêm một nút bấm. Bấm nút thì buzzer kêu 1 tiếng bíp. Gợi ý: xem bài điều khiển LED bằng nút bấm.
  2. Làm còi báo nhiệt độ: buzzer kêu liên tục khi cảm biến LM35 đo được trên 40°C.
  3. Dùng hàm tone() phát giai điệu “Đô Rê Mi Fa Sol La Si”. Tần số tham khảo: 262, 294, 330, 349, 392, 440, 494 Hz. Nhớ dùng SPEAKER trong Proteus nhé.

Tóm lại, buzzer chủ động chỉ cần digitalWrite(), còn buzzer thụ động thì dùng tone(). Trên Proteus, nhớ chọn đúng loại ACTIVE và đặt Operating Voltage 5V là nghe được tiếng. Muốn thử tone() thì đổi sang SPEAKER.

Tác giả

HV Lee

500+ bài viết về lập trình, phần cứng, mạng máy tính và công nghệ. Chia sẻ kiến thức từ những gì đã học, đã dạy và đã trải nghiệm — để người học CNTT hiểu sâu hơn và làm được nhiều hơn.

Gợi ý tiếp theo

Cài đặt Python và môi trường lập trình với Visual Studio Code

Học tiếp