Hướng dẫn sử dụng cảm biến âm thanh (Sound Sensor) với Arduino

Hướng dẫn sử dụng cảm biến âm thanh (Sound Sensor) với Arduino

Cảm biến âm thanh có độ nhạy cao, kích thước nhỏ gọn và giá thành thấp, là một cảm biến được sử dụng phổ biến cho nhiều ứng dụng như bật/tắt đèn bằng tiếng vỗ tay, giám sát thú cưng khi bạn vắng nhà…

Bên trong cảm biến âm thanh arduino là một micrô điện cực, micro này dựa trên hiện tượng điện cực nhiễu (electret), mà trong đó điện cực nhiễu được tạo thành bởi một lớp màng điện cực đặc biệt.

Tổng quan về phần cứng

Module cảm biến âm thanh là một board mạch được trang bị một microphone (50Hz – 100kHz), để thu nhận âm thanh từ môi trường xung quanh. Microphone này chuyển đổi âm thanh thành tín hiệu điện.

Tín hiệu điện này được đưa đến bộ so sánh LM393 trên bo mạch, IC so sánh này sẽ số hóa và truyền tín hiệu ở chân OUT.

Module được trang bị một biến trở để điều chỉnh độ nhạy của tín hiệu OUT.

Các bạn có thể sử dụng nó để đặt ngưỡng sao cho khi biên độ của âm thanh vượt quá ngưỡng, module sẽ ở mức thấp (LOW), và ngược lại.

Với việc thiết lập như thế này các bạn có thể ứng dụng vào một số dự án cụ thể. Ví dụ: khi biên độ giao động của âm thanh vượt quá ngưỡng, bạn có thể kích hoạt Relay để điều khiển bóng đèn.

Module bao gồm hai đèn LED. Đèn LED dùng để báo nguồn và đèn LED còn lại dùng để báo trạng thái sáng khi mức âm thanh vượt quá giá trị ngưỡng.

Sơ đồ chân cảm biến âm thanh

Cảm biến âm thanh arduino có ba chân:

VCC: Cấp nguồn cho cảm biến. Khuyến cáo nguồn cấp cho cảm biến từ 3,3V đến 5V.

GND: Là chân nối đất.

OUT: Đầu ra mức ở CAO trong điều kiện yên tĩnh và mức THẤP khi phát hiện âm thanh. Các bạn có thể kết nối với các chân Digital trên Arduino hoặc nối trực tiếp với Relay.

Các linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Cảm biến âm thanh 1 Shopee | Cytron
Dây cắm 1 Shopee | Cytron
Breadboard 1 Shopee | Cytron
Relay 5V DC 1 Shopee | Cytron

Sơ đồ đấu nối cảm biến âm thanh với Arduino

Dưới đây là sơ đồ đấu nối cảm biến âm thanh với Arduino, việc đấu nối khá đơn giản như sau:

Chân VCC của cảm biến sẽ được nối với chân 5V của board Arduino và chân GND sẽ nối với GND, chân nhận tín hiệu OUT sẽ được nối vào chân Digital (8) của bo Arduino Uno R3.

Thiết lập ngưỡng

Trên module có một biến trở (chiết áp) được tích hợp sẵn để đặt ngưỡng mức âm thanh, khi trạng thái ở mức THẤP (có âm thanh) thì đèn LED sẽ được sáng lên.

Tiếp theo, để cài đặt ngưỡng, hãy vỗ tay gần với micro và điều chỉnh biến trở cho đến khi đèn LED sáng lên.

Code: Cảm biến âm thanh

Dưới đây sẽ là một đoạn Code cơ bản về cảm biến âm thanh arduino, khi vỗ tay hoặc nhận được các âm thanh từ bên ngoài, dữ liệu sẽ được in ra serial monitor.

#define sensorPin 8

// Variable to store the time when last event happened
unsigned long lastEvent = 0;

void setup() {
	pinMode(sensorPin, INPUT);	// Set sensor pin as an INPUT
	Serial.begin(9600);
}

void loop() {
	// Read Sound sensor
	int sensorData = digitalRead(sensorPin);

	// If pin goes LOW, sound is detected
	if (sensorData == LOW) {
		
		// If 25ms have passed since last LOW state, it means that
		// the clap is detected and not due to any spurious sounds
		if (millis() - lastEvent > 25) {
			Serial.println("Clap detected!");
		}
		
		// Remember when last event happened
		lastEvent = millis();
	}
}

Như vậy, là cảm biến đã nhận được âm thanh và in ra màn hình dòng chữ “Clap detected!”

Giải thích Code

#define sensorPin 8

Khai báo chân để đọc dữ liệu và được kết nối với chân 8 (sensorPin) của Arduino.

void setup() {
	pinMode(sensorPin, INPUT);	// Set sensor pin as an INPUT
	Serial.begin(9600);
}

Trong hàm setup(), khai báo chân sensorPin là INPUT bằng cách sử dụng hàm pinMode(). Ngoài ra, cũng khai báo tốc độ truyền thông Serial là 9600 bps thông qua lệnh Serial.begin(9600).

void loop() {
	// Read Sound sensor
	int sensorData = digitalRead(sensorPin);

	// If pin goes LOW, sound is detected
	if (sensorData == LOW) {
		
		// If 25ms have passed since last LOW state, it means that
		// the clap is detected and not due to any spurious sounds
		if (millis() - lastEvent > 25) {
			Serial.println("Clap detected!");
		}
		
		// Remember when last event happened
		lastEvent = millis();
	}
}

Trong hàm loop(), đọc giá trị từ mạch cảm biến âm thanh bằng cách sử dụng hàm digitalRead() và lưu giá trị vào biến sensorData. Nếu giá trị đọc được là LOW, điều đó có nghĩa là âm thanh được phát hiện.

// If 25ms have passed since last LOW state, it means that
		// the clap is detected and not due to any spurious sounds
		if (millis() - lastEvent > 25) {
			Serial.println("Clap detected!");
		}

Sau đó, kiểm tra sau mỗi 25ms kể từ lần gần nhất mà giá trị LOW xuất hiện. Nếu điều kiện này được thỏa mãn, sẽ in ra thông báo “Clap detected!” thông qua lệnh Serial.println().

// Remember when last event happened
		lastEvent = millis();

Ghi nhớ thời điểm mà sự kiện cuối cùng xảy ra bằng cách lưu giá trị millis() vào biến lastEvent. Điều này đảm bảo rằng chỉ phát hiện âm thanh nếu có sự tách biệt đủ lâu giữa các lần nhấn.

Code Arduino: Dự án bật tắt đèn bằng tiếng vỗ tay (Cập nhật)

Đối với dự án mình sẽ sử dụng mạch cảm biến âm thanh để BẬT/TẮT bằng một cái vỗ tay.

Lưu ý, dự án sử dụng nguồn AC, nên có thể gây nguy hiểm cho những ai mới bắt đầu sử dụng, nếu bạn chưa có kinh nghiệm hãy cân nhắc khi triển khai dự án này.

Đọc ngay: Bật tắt đèn bằng tiếng vỗ tay (Cảm biến âm thanh) sử dụng Arduino (Phần 1)

Sơ đồ đấu nối: Mạch cảm biến âm thanh vỗ tay đèn sáng

Các bạn có thể nhìn sơ đồ bên dưới để đấu nối, vì chúng khá đơn giản nên mình sẽ không giải thích và hướng dẫn chi tiết.

Đọc ngay: Điều khiển Đèn 220V bằng Rơ le (Relay) sử dụng Arduino

Code

Đây là một đoạn Code dùng để BẬT/TẮT khi có tiếng vỗ tay, sau khi đấu nối xong các bạn nạp Code bên dưới để trải nghiệm dự án thú vị này nhé.

#define sensorPin 7
#define relayPin 8

// Variable to store the time when last event happened
unsigned long lastEvent = 0;
boolean relayState = false;    // Variable to store the state of relay

void setup() {
	pinMode(relayPin, OUTPUT);  // Set relay pin as an OUTPUT pin
	pinMode(sensorPin, INPUT);  // Set sensor pin as an INPUT
}

void loop() {
	// Read Sound sensor
	int sensorData = digitalRead(sensorPin);

	// If pin goes LOW, sound is detected
	if (sensorData == LOW) {

	// If 25ms have passed since last LOW state, it means that
	// the clap is detected and not due to any spurious sounds
	if (millis() - lastEvent > 25) {
		//toggle relay and set the output
		relayState = !relayState;
		digitalWrite(relayPin, relayState ? HIGH : LOW);
	}

	// Remember when last event happened
	lastEvent = millis();
	}
}

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments