- Vật liệu thiết yếu:
- Sơ đồ mạch:
- Sơ đồ và giải thích:
- Hiểu
- Chơi các âm piano trên Arduino:
- Lập trình Arduino:
- Chơi, ghi, phát lại và lặp lại! :
Arduino đã là một lợi ích cho những người không có nền tảng về điện tử có thể dễ dàng xây dựng công cụ. Nó là một công cụ tạo mẫu tuyệt vời hoặc để thử một thứ gì đó hay ho, trong dự án này, chúng tôi sẽ chế tạo một chiếc Piano nhỏ nhưng thú vị bằng cách sử dụng Arduino. Cây đàn piano này khá đơn giản với chỉ 8 nút nhấn và còi. Nó sử dụng chức năng tone () của Arduino để tạo ra nhiều loại nốt piano khác nhau trên loa. Để thêm gia vị một chút, chúng tôi đã thêm tính năng ghi âm trong dự án, điều này cho phép chúng tôi phát bản ghi giai điệu và phát lại nhiều lần khi được yêu cầu. Nghe thú vị đúng không !! Vì vậy, chúng ta hãy 'xây dựng…
Vật liệu thiết yếu:
- Arduino Uno
- Màn hình LCD 16 * 2
- Buzzer
- Tông đơ 10k
- Công tắc SPDT
- Nút ấn (8 Nos)
- Điện trở (10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k, 10k)
- Breadboard
- Kết nối dây
Sơ đồ mạch:
Dự án Arduino Piano hoàn chỉnh có thể được xây dựng trên đầu bảng mạch với một số dây kết nối. Sơ đồ mạch được thực hiện bằng cách sử dụng fritzing thể hiện chế độ xem breadboard của dự án được hiển thị bên dưới
Chỉ cần làm theo sơ đồ mạch và kết nối dây cho phù hợp, các nút nhấn và còi như được sử dụng với mô-đun PCB nhưng trong phần cứng thực tế chúng tôi chỉ sử dụng công tắc và còi, bạn sẽ không nhầm lẫn nhiều vì chúng có cùng loại chân cắm. Bạn cũng có thể tham khảo hình ảnh phần cứng bên dưới để thực hiện kết nối của mình.
Giá trị của các điện trở từ bên trái theo thứ tự sau, 10k, 560R, 1.5k, 2.6k, 3.9, 5.6k, 6.8k, 8.2k và 10k. Nếu bạn không có công tắc DPST tương tự, bạn có thể sử dụng công tắc chuyển đổi bình thường như công tắc hiển thị trong sơ đồ mạch ở trên. Bây giờ chúng ta hãy xem xét các sơ đồ của dự án để hiểu lý do tại sao chúng tôi đã thực hiện các kết nối sau.
Sơ đồ và giải thích:
Các sơ đồ cho sơ đồ mạch được hiển thị ở trên được đưa ra dưới đây, nó cũng được thực hiện bằng cách sử dụng Fritzing.
Một kết nối chính mà chúng ta phải hiểu là cách chúng ta đã kết nối 8 nút nhấn với Arduino thông qua chân Analog A0. Về cơ bản chúng ta cần 8 chân đầu vào có thể kết nối với 8 nút nhấn đầu vào, nhưng đối với các dự án như thế này, chúng tôi không thể sử dụng 8 chân của bộ vi điều khiển chỉ cho các nút nhấn vì chúng tôi có thể cần chúng để sử dụng sau này. Trong trường hợp của chúng tôi, chúng tôi có màn hình LCD được giao tiếp.
Vì vậy, chúng tôi sử dụng chân tương tự của Arduino và tạo thành một bộ chia tiềm năng với các giá trị điện trở khác nhau để hoàn thành mạch. Bằng cách này, khi mỗi nút được nhấn, một điện áp tương tự khác nhau sẽ được cung cấp cho chân Analog. Một đoạn mạch mẫu chỉ có hai điện trở và hai nút ấn như hình dưới đây.
Trong trường hợp này, chân ADC sẽ nhận + 5V khi không nhấn các nút nhấn, nếu nút đầu tiên được nhấn thì bộ chia tiềm năng được hoàn thành thông qua điện trở 560R và nếu nhấn nút thứ hai thì bộ chia tiềm năng sẽ được cạnh tranh bằng cách sử dụng 1,5 k điện trở. Bằng cách này, điện áp nhận được bởi chân ADC sẽ thay đổi dựa trên các công thức của bộ chia điện thế. Nếu bạn muốn biết thêm về cách hoạt động của bộ chia điện thế và cách tính giá trị của điện áp nhận được bởi chân ADC thì bạn có thể sử dụng trang tính toán bộ chia điện thế này.
Khác với điều này, tất cả các kết nối đều thẳng về phía trước, màn hình LCD được kết nối với chân 8, 9, 10, 11 và 12. Bộ rung được kết nối với chân 7 và công tắc SPDT được kết nối với chân 6 của Arduino. Dự án hoàn chỉnh được cấp nguồn thông qua cổng USB của máy tính xách tay. Bạn cũng có thể kết nối Arduino với nguồn điện 9V hoặc 12V thông qua giắc cắm DC và dự án sẽ vẫn hoạt động như cũ.
Hiểu
Arduino có chức năng tone () tiện dụng có thể được sử dụng để tạo ra các tín hiệu tần số khác nhau có thể được sử dụng để tạo ra các âm thanh khác nhau bằng cách sử dụng bộ rung. Vì vậy, chúng ta hãy hiểu cách hoạt động của hàm và cách nó có thể được sử dụng với Arduino.
Trước đó, chúng ta nên biết cách hoạt động của bộ rung Piezo. Chúng ta có thể đã học về tinh thể Piezo trong trường học của mình, nó không là gì khác ngoài một tinh thể chuyển đổi dao động cơ học thành điện năng hoặc ngược lại. Ở đây chúng tôi áp dụng một dòng điện (tần số) thay đổi mà tinh thể dao động để tạo ra âm thanh. Do đó, để làm cho chuông Piezo tạo ra một số tiếng ồn, chúng ta phải làm cho tinh thể điện Piezo rung động, cao độ và âm sắc của tiếng ồn phụ thuộc vào tốc độ rung của tinh thể. Do đó, âm và cao độ có thể được kiểm soát bằng cách thay đổi tần số của dòng điện.
Được rồi, vậy làm cách nào để lấy một tần số thay đổi từ Arduino? Đây là nơi xuất hiện của hàm tone (). Âm báo () có thể tạo ra một tần số cụ thể trên một chân cụ thể. Khoảng thời gian cũng có thể được đề cập nếu cần thiết. Cú pháp cho tone () là
Giai điệu cú pháp (pin, tần số) giai điệu (pin, tần số, thời lượng) Pin tham số: pin để tạo tần số âm: tần số của âm tính bằng hertz - thời lượng int không dấu: thời lượng của âm tính bằng mili giây (tùy chọn1) - dài không dấu
Các giá trị của mã pin có thể là bất kỳ mã pin kỹ thuật số nào của bạn. Tôi đã sử dụng pin số 8 ở đây. Tần số có thể được tạo ra phụ thuộc vào kích thước của bộ đếm thời gian trong bảng Arduino của bạn. Đối với UNO và hầu hết các bo mạch thông thường khác, tần số tối thiểu có thể được tạo ra là 31Hz và tần số tối đa có thể được tạo ra là 65535Hz. Tuy nhiên, con người chúng ta chỉ có thể nghe được tần số từ 2000Hz đến 5000 Hz.
Chơi các âm piano trên Arduino:
Được rồi, trước khi tôi bắt đầu chủ đề này, hãy nói rõ rằng tôi là người mới làm quen với nốt nhạc hoặc piano, vì vậy xin hãy tha thứ cho tôi nếu bất cứ điều gì được đề cập dưới tiêu đề này là vô nghĩa.
Bây giờ chúng ta biết rằng chúng ta có thể sử dụng chức năng âm sắc trong Arduino để tạo ra một số âm thanh, nhưng làm thế nào chúng ta có thể phát âm sắc của một nốt cụ thể bằng cách sử dụng giống nhau. Thật may mắn cho chúng tôi có một thư viện tên là “pitch.h” do Brett Hagman viết. Thư viện này chứa tất cả thông tin về tần số nào tương đương với nốt nào trên đàn piano. Tôi đã rất ngạc nhiên bởi thư viện này thực sự có thể hoạt động và chơi hầu hết mọi nốt trên đàn piano tốt như thế nào, tôi đã sử dụng chính nó để chơi các nốt piano của Pirates of Caribbean, Crazy Frog, Mario và thậm chí cả titanic và chúng nghe rất tuyệt. Giáo sư! Chúng tôi đang nói hơi lạc đề ở đây, vì vậy nếu bạn quan tâm đến điều đó, hãy thử chơi các giai điệu bằng cách sử dụng dự án Arduino. Bạn cũng sẽ tìm thấy giải thích thêm về thư viện pitchhes.h trong dự án đó.
Dự án của chúng tôi chỉ có 8 nút nhấn nên mỗi nút chỉ có thể chơi một nốt nhạc cụ thể và do đó hoàn toàn chúng tôi chỉ có thể chơi 8 nốt. Tôi đã chọn các nốt được sử dụng nhiều nhất trên đàn piano, nhưng bạn có thể chọn 8 nốt bất kỳ hoặc thậm chí mở rộng dự án với nhiều nút nhấn hơn và thêm nhiều nốt hơn.
Các nốt được chọn trong dự án này là các nốt C4, D4, E4, F4, G4, A4, B4 và C5 có thể được chơi bằng cách sử dụng các nút tương ứng từ 1 đến 8.
Lập trình Arduino:
Lý thuyết là đủ để chúng ta đến với phần thú vị của việc lập trình Arduino. Các chương trình Arduino hoàn chỉnh được đưa ra vào cuối trang này bạn có thể nhảy xuống nếu bạn háo hức hoặc đọc thêm để hiểu cách thức hoạt động mã.
Trong chương trình Arduino của chúng tôi, chúng tôi phải đọc điện áp tương tự từ chân A0, sau đó dự đoán nút nào đã được nhấn và phát âm báo tương ứng cho nút đó. Trong khi thực hiện việc này, chúng ta cũng nên ghi lại người dùng đã nhấn nút nào và họ đã nhấn trong bao lâu, để chúng ta có thể tạo lại giai điệu mà người dùng đã phát sau này.
Trước khi đến phần logic, chúng ta phải khai báo 8 nốt nào chúng ta sẽ chơi. Sau đó, tần số tương ứng cho các nốt được lấy từ thư viện pitch.h và sau đó một mảng được hình thành như hình dưới đây. Ở đây tần suất chơi nốt C4 là 262, v.v.
int ghi chú = {262, 294, 330, 349, 392, 440, 494, 523}; // Đặt tần số cho C4, D4, E4, F4, G4, A4, B4,
Tiếp theo chúng ta phải đề cập đến việc kết nối màn hình LCD với chân nào. Nếu bạn đang làm theo cùng một sơ đồ được đưa ra ở trên thì bạn không cần phải thay đổi bất cứ điều gì ở đây.
const int rs = 8, en = 9, d4 = 10, d5 = 11, d6 = 12, d7 = 13; // Các chân mà LCD được kết nối LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Tiếp theo, bên trong chức năng cài đặt của chúng tôi, chúng tôi chỉ khởi tạo mô-đun LCD và màn hình nối tiếp để gỡ lỗi. Chúng tôi cũng hiển thị thông báo giới thiệu chỉ để đảm bảo mọi thứ đang hoạt động theo kế hoạch. Tiếp theo , bên trong hàm vòng lặp chính, chúng ta có hai vòng lặp while.
Một vòng lặp while sẽ được thực hiện miễn là công tắc SPDT được đặt trong quá trình ghi nhiều hơn. Trong chế độ ghi âm, người dùng có thể trả các âm cần thiết và đồng thời âm đang được phát cũng sẽ được lưu. Vì vậy, vòng lặp while trông giống như bên dưới
while (digitalRead (6) == 0) // Nếu công tắc bật tắt được đặt ở chế độ ghi {lcd.setCursor (0, 0); lcd.print ("Đang ghi.."); lcd.setCursor (0, 1); Detect_button (); Play_tone (); }
Như bạn có thể nhận thấy, chúng ta có hai hàm bên trong vòng lặp while. Hàm đầu tiên Detect_button () được sử dụng để tìm nút mà người dùng đã nhấn và hàm thứ hai Play_tone () được sử dụng để phát âm báo tương ứng. Ngoài chức năng này, hàm Detect_button () cũng ghi lại nút nào đang được nhấn và hàm Play_tone () ghi lại thời gian nút đã được nhấn.
Bên trong Detect_button () chức năng chúng ta đọc điện áp tương tự từ pin A0 và so sánh nó với một số giá trị được xác định trước để tìm hiểu nút đã được nhấn. Giá trị có thể được xác định bằng cách sử dụng máy tính chia điện áp ở trên hoặc bằng cách sử dụng màn hình nối tiếp để kiểm tra giá trị tương tự nào được đọc cho mỗi nút.
void Detect_button () { analogVal = analogRead (A0); // đọc vôn tương tự trên chân A0 pev_button = button; // ghi nhớ nút trước đó do người dùng nhấn if (analogVal <550) button = 8; nút if (analogVal <500) = 7; nút if (analogVal <450) = 6; nút if (analogVal <400) = 5; nút if (analogVal <300) = 4; nút if (analogVal <250) = 3; if (analogVal <150) button = 2; if (analogVal <100) button = 1; nút if (analogVal> 1000) = 0; / **** Sắp xếp các nút đã nhấn trong một mảng *** / if (button! = pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; ghi_mạch = 0; button_index ++; } / ** Kết thúc chương trình ghi ** / }
Như đã nói, bên trong chức năng này, chúng tôi cũng ghi lại trình tự các nút được nhấn. Các giá trị đã ghi được lưu trữ trong một mảng có tên là record_button. Đầu tiên chúng ta kiểm tra xem có nút nào mới được ấn không, nếu đã ấn thì chúng ta cũng kiểm tra xem có phải là nút 0. Trường hợp nút 0 không có gì là không có nút nào được ấn. Bên trong vòng lặp if, chúng tôi lưu trữ giá trị trên vị trí chỉ mục do biến button_index cung cấp và sau đó chúng tôi cũng tăng giá trị chỉ mục này để chúng tôi không ghi quá nhiều trên cùng một vị trí.
/ **** Sắp xếp lại các nút đã nhấn trong một mảng *** / if (button! = Pev_button && pev_button! = 0) { record_button = pev_button; button_index ++; ghi_mạch = 0; button_index ++; } / ** Kết thúc chương trình ghi ** /
Bên trong Play_tone () chức năng chúng tôi sẽ chơi những giai điệu tương ứng cho các nút bấm bằng cách sử dụng nhiều nếu điều kiện. Ngoài ra, chúng tôi sẽ sử dụng một mảng có tên là record_time bên trong đó chúng tôi sẽ lưu khoảng thời gian mà nút được nhấn. Thao tác này tương tự như ghi lại chuỗi nút bằng cách chúng tôi sử dụng hàm millis () để xác định thời lượng mỗi nút được nhấn, còn để giảm kích thước của biến, chúng tôi chia giá trị cho 10. Đối với nút 0, có nghĩa là người dùng không nhấn bất cứ thứ gì chúng tôi không phát âm thanh nào trong cùng một khoảng thời gian. Mã hoàn chỉnh bên trong hàm được hiển thị bên dưới.
void Play_tone () { / **** Ghi lại thời gian trễ giữa mỗi lần nhấn nút trong một mảng *** / if (button! = pev_button) { lcd.clear (); // Sau đó làm sạch nó note_time = (millis () - start_time) / 10; record_time = note_time; time_index ++; start_time = millis (); } / ** Kết thúc chương trình Ghi ** / if (button == 0) { noTone (7); lcd.print ("0 -> Tạm dừng.."); } if (button == 1) { tone (7, note); lcd.print ("1 -> NOTE_C4"); } if (button == 2) { tone (7, note); lcd.print ("2 -> NOTE_D4"); } if (nút == 3) { tone (7, nốt); lcd.print ("3 -> NOTE_E4"); } if (button == 4) { tone (7, note); lcd.print ("4 -> NOTE_F4"); } if (nút == 5) { tone (7, nốt nhạc); lcd.print ("5 -> NOTE_G4"); } if (button == 6) { tone (7, note); lcd.print ("6 -> NOTE_A4"); } if (nút == 7) { tone (7, nốt nhạc); lcd.print ("7 -> NOTE_B4"); } if (button == 8) { tone (7, note); lcd.print ("8 -> NOTE_C5"); } }
Cuối cùng sau khi ghi, người dùng phải chuyển DPST sang hướng khác để phát âm đã ghi. Khi điều này được thực hiện phá vỡ chương trình ra khỏi trước khi vòng lặp và đi vào thứ hai vòng lặp while nơi chúng tôi chơi các ghi chú trong trình tự của các nút nhấn cho một thời hạn đã được ghi nhận trước đây. Mã để làm điều tương tự được hiển thị bên dưới.
while (digitalRead (6) == 1) // Nếu công tắc bật tắt được đặt ở chế độ Đang phát { lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Đang phát.."); for (int i = 0; i <sizeof (record_button) / 2; i ++) { delay ((ghi_thời gian) * 10); // Chờ trước khi thanh toán giai điệu tiếp theo if ( record_button == 0) noTone (7); // người dùng không chạm vào bất kỳ nút nào khác tone (7, ghi chú - 1)]); // phát âm thanh tương ứng với nút mà người dùng chạm vào } } }
Chơi, ghi, phát lại và lặp lại!:
Tạo phần cứng theo sơ đồ mạch được hiển thị và tải mã lên bảng Arduino và thời gian hiển thị của nó. Định vị SPDT ở chế độ ghi và bắt đầu phát các âm bạn chọn, nhấn mỗi nút sẽ tạo ra một âm khác nhau. Trong chế độ này, màn hình LCD sẽ hiển thị "Đang ghi…" và trên dòng thứ hai, bạn sẽ thấy tên của ghi chú hiện đang được nhấn như hình dưới đây
Khi bạn đã phát âm báo của mình, hãy chuyển công tắc SPDT sang phía bên kia và màn hình LCD sẽ hiển thị “ Đang phát..” và sau đó bắt đầu phát giai điệu bạn vừa phát. Cùng một giai điệu sẽ được phát đi phát lại miễn là công tắc bật tắt được giữ ở vị trí như trong hình dưới đây.
Hoạt động hoàn chỉnh của dự án có thể được tìm thấy trong video dưới đây. Hy vọng bạn hiểu dự án và thích xây dựng nó. Nếu bạn gặp bất kỳ vấn đề nào trong việc xây dựng bài viết này, hãy đăng chúng trong phần bình luận hoặc sử dụng diễn đàn để được trợ giúp kỹ thuật cho dự án của bạn. Cũng đừng quên kiểm tra video trình diễn dưới đây.