Site icon TAPIT

Điều khiển thiết bị thông qua vỗ tay bằng cảm biến âm thanh

Thời đại công nghệ hiện nay có rất nhiều cách để điểu khiển thiết bị, ví dụ như điều khiển qua app điện thoại, qua điều khiển không dây RF, qua remote hồng ngoại, qua xử lý giọng nói của Google Home, Siri hay Amazon Alexa… Tuy nhiên với sự sáng tạo, chúng ta càng có thể làm ra 1 số sản phẩm có tính khác lạ, đặc biệt hơn. Cụ thể ở đây là điều khiển thông qua tiếng vỗ tay, khá hay đúng không. Bài dưới đây mình sẽ chia sẽ về sản phẩm này.

 1.Cảm biến âm thanh LM393

   Cảm biến được sử dụng để phát hiện âm thanh, tiếng động xung quanh. Nó xuất tín hiệu digital ở chân OUT. Điện áp hoạt động 4-6v (Nhưng hiện tại mình sử dụng nguồn 5v từ Kit arduino). Biến trở màu xanh dùng để điều khiển độ nhạy của âm thanh. Chân OUT của cảm biến mình kết nối với chân 5 của arduino để đọc giá trị cảm biến.

 2.Module relay 5v

   Do hiện mình đang dư module 2 relay 5v như hình trên, nên tận dụng nó cho project này luôn, tuy chỉ điều khiển có 1 bóng đèn  😆 

Sơ đồ chân của module:

Với Input, nguồn 5v được nối với 2 chân DC+ (dương) và DC- (GND). Do mình điều khiển 1 relay nên dung chân IN1 nối với chân 13 của arduino.

Với Output, được nối với 2 chân COM1 và NO1 để khi relay được kích thì COM1 được thông với NO1.

 3.Arduino UNO R3

Arduino uno thì chắc mình không cần giới thiệu về nó nữa. Nếu ai chưa biết xin vui lòng nhờ bác Google nhé  😀 

 4.Nguyên lý hoạt động

Relay chỉ hoạt động khi vỗ tay 2 lần liên tiếp nhau, khoảng cách 2 lần liên tiếp đó không quá 1s, nếu vỗ tay 1 lần thì không xảy ra hiện tượng gì cả nhé. Mỗi lần vỗ 2 lần tiếp tiếp thì sẽ đảo trạng thái đèn.

 5.Lập trình

const long interval = 300;
const long timeout = 1000;
unsigned long premillis = 0;
void setup()
{
pinMode(5, INPUT_PULLUP); //Khai bao chan doc cam bien am thanh
pinMode(13, OUTPUT); //Khai bao chan relay
digitalWrite(13, LOW); //Mac dinh ban dau tat relay
}

void loop() {
unsigned long currentmillis;
if(digitalRead(5) == LOW) //Kiem tra co tin hieu am thanh khong? – Neu co am thanh thi chan 5 o muc LOW
{
premillis = millis(); //doc gia tri time lan dau co tieng vo tay
delay(300);
currentmillis = millis();
unsigned long tmp = currentmillis – premillis; //tinh gia tri khoang thoi gian sau moi lan xet
while(( tmp >= interval) && (tmp <= timeout)) //Kiem tra neu trong khoang thoi gian xet co vo tay lan thu 2 lien tiep
{
if(digitalRead(5) == LOW) //Neu vo tay lan 2 lien tiep sau lan 1
{
if(digitalRead(13) == HIGH)
digitalWrite(13, LOW);
else digitalWrite(13, HIGH); //dao trang thai relay
break;
}
currentmillis = millis(); //doc gia tri time o lan xet hien tai
tmp = currentmillis – premillis; //Tinh khoang thoi gian
}
}

}

 

Giải thích sơ lược về code: 

   – Ở chương trình trên, mình sử dụng timeout là 1s nhằm kiểm tra số lần vỗ tay liên tiếp có trong vòng 1s không, nếu bạn muốn dài hơn thì có thể thay đổi giá trị này. Chương trình sẽ luôn kiểm tra ở lệnh if(digitalRead(5)==LOW) để xác nhận có tiếng vỗ tay chưa, nếu có vỗ tay thì sẽ thực thi các lệnh bên trong. Ở lệnh bên trong sẽ kiểm tra tiếp tục có vô thêm lần nữa không với 1 lượng timeout cố định trước. Chỉ khi có vô tay thêm lần 2 thì chương trình mới thực hiện lệnh đảo trạng thái đèn, không thì sẽ thoát.

   – Việc sử dụng 2 biến premilliscurrentmillis để nhận giá trị thời gian hiện tại theo mili giây, kiểm tra từ lần vỗ 1 với lần vỗ 2 có quá 1s hay không. Và 2 biến này đều lấy giá trị từ hàm millis() có sẵn trong thư viện của arduino.

 6.Kết luận

   Như vậy, chúng ta đã tìm hiểu cơ bản về một số module được sử dụng và code arduino cho project này. Tuy ứng dụng của nó không cao, nhưng cũng thỏa mãn được sự tò mò, thích thú của bạn khi hoàn thành sản phẩm thú vị này.
Vấn đề mình nói đầu bài là tiếng vỗ tay, nhưng thực ra cảm biến âm thanh này nó nhận diện cường độ âm thanh, âm thanh gì nó cũng nhận miễn sao đủ cường độ để cảm biến xác nhận là có âm thanh là được. Nên không chỉ vỗ tay 2 lần, mà đôi khi chúng ta dùng tay gõ vào bàn 2 lần liên tiếp thì đèn cũng sáng.

Video thử nghiệm:

 

– Wiki <Tấn Lĩnh>