Xin chào các bạn, trong vài tuần qua, tôi đã cố gắng kết nối lại tình yêu của mình với cây đàn guitar. Chơi guitar hộp là cách tôi thư giãn vài năm trước khi saxophone lên ngôi. Quay trở lại với cây đàn guitar, sau 3 năm hiếm khi gảy được hợp âm, tôi phát hiện ra trong số những điều khác mà tôi không còn biết từng dây sẽ phát ra âm thanh như thế nào, tôi đã nói như vậy trong lời nói của bạn tôi, “Tôi không nghe được nữa” và do đó, tôi không thể điều chỉnh guitar mà không có sự hỗ trợ của bàn phím hoặc ứng dụng di động mà tôi đã tải xuống sau đó. Nhiều tuần trôi qua cho đến vài ngày trước, khi người sản xuất trong tôi trở nên có động lực và tôi quyết định chế tạo một bộ chỉnh Guitar dựa trên Arduino. Trong hướng dẫn hôm nay, tôi sẽ chia sẻ cách xây dựng Bộ chỉnh guitar Arduino DIY của riêng bạn.
Cách hoạt động của bộ chỉnh guitar
Trước khi chúng ta chuyển sang thiết bị điện tử, điều quan trọng là phải hiểu nguyên tắc đằng sau việc xây dựng. Có 7 nốt nhạc chính được ký hiệu bằng các bảng chữ cái; A, B, C, D, E, F, G và thường kết thúc bằng một A khác luôn ở quãng tám cao hơn quãng đầu A. Trong âm nhạc, một số phiên bản của những nốt này tồn tại như nốt A đầu tiên và nốt A cuối cùng. được phân biệt từng thứ bằng sự biến đổi của chúng và với nhau bằng một trong những đặc điểm của âm thanh được gọi là cao độ. Cao độ được định nghĩa là độ to hoặc nhỏ của âm thanh và được biểu thị bằng tần số của âm thanh đó. Vì tần số của các nốt này đã được biết trước, nên để xác định cây đàn có được điều chỉnh hay không, chúng ta chỉ cần so sánh tần số của nốt của chuỗi cụ thể với tần số thực của nốt mà dây đó biểu diễn.
Tần số của 7 nốt nhạc là:
A = 27,50Hz
B = 30,87Hz
C = 16,35Hz
D = 18,35Hz
E = 20,60Hz
F = 21,83Hz
G = 24,50 Hz
Mỗi biến thể của các nốt này luôn ở một cao độ bằng FxM trong đó F là tần số và M là một số nguyên khác không. Vì vậy, đối với A cuối cùng như được mô tả trước đó, cao hơn A đầu tiên một quãng tám, tần số là;
27,50 x 2 = 55Hz.
Đàn guitar (Lead / box guitar) thường có 6 dây được ký hiệu bằng các nốt E, A, D, G, B, E trên dây mở. Như thường lệ, nốt E cuối cùng sẽ cao hơn quãng tám so với nốt E đầu tiên. Chúng tôi sẽ thiết kế bộ chỉnh guitar của mình để giúp chỉnh guitar bằng cách sử dụng tần số của các nốt này.
Theo cách chỉnh guitar tiêu chuẩn, nốt và tần số tương ứng của mỗi dây được trình bày trong bảng dưới đây.
Dây |
Tần số |
Ký hiệu |
1 (E) |
329,63 Hz |
E 4 |
2 (B) |
246,94 Hz |
B3 |
3 (G) |
196,00 Hz |
G3 |
4 (D) |
146,83 Hz |
D3 |
5 (A) |
110,00 Hz |
A2 |
6 (E) |
82,41 Hz |
E2 |
Các dòng dự án là khá đơn giản; chúng tôi chuyển đổi tín hiệu âm thanh do guitar tạo ra thành tần số sau đó so sánh với giá trị tần số chính xác của dây đang được điều chỉnh. Người chơi guitar được thông báo bằng đèn LED khi giá trị tương quan.
Việc phát hiện / chuyển đổi tần số bao gồm 3 giai đoạn chính;
- Khuếch đại
- Bù đắp
- Chuyển đổi tương tự sang kỹ thuật số (lấy mẫu)
Tín hiệu âm thanh được tạo ra sẽ quá yếu để ADC của Arduino có thể nhận ra vì vậy chúng ta cần phải khuếch đại tín hiệu. Sau khi khuếch đại, để giữ cho tín hiệu trong phạm vi có thể nhận biết được bởi ADC của Arduino để ngăn chặn việc cắt tín hiệu, chúng tôi bù đắp điện áp của tín hiệu. Sau khi bù trừ, tín hiệu sau đó được chuyển đến Arduino ADC nơi nó được lấy mẫu và thu được tần số của âm thanh đó.
Các thành phần bắt buộc
Các thành phần sau được yêu cầu để xây dựng dự án này;
- Arduino Uno x1
- LM386 x1
- Mic ngưng tụ x1
- Giắc cắm micrô / âm thanh x1
- Chiết áp 10k x1
- Tụ điện O.1uf x2
- Điện trở 100ohms x4
- 10ohms điện trở x1
- Tụ 10uf x3
- Đèn LED màu vàng 5mm x2
- Đèn LED xanh 5mm x1
- Các nút đẩy thường mở x6
- Dây nhảy
- Breadboard
Sơ đồ
Kết nối các thành phần như được hiển thị trong Sơ đồ Mạch Tuner Guitar bên dưới.
Các nút nhấn được kết nối mà không có điện trở kéo lên / xuống vì các điện trở kéo lên tích hợp của Arduino sẽ được sử dụng. Điều này là để đảm bảo mạch càng đơn giản càng tốt.
Mã Arduino cho Bộ chỉnh guitar
Thuật toán đằng sau mã cho Dự án Tuner Guitar này rất đơn giản. Để điều chỉnh một chuỗi cụ thể, nghệ sĩ guitar chọn chuỗi bằng cách nhấn nút tương ứng và sắp xếp các lần chơi một chuỗi mở. Âm thanh được thu thập bởi tầng khuếch đại và chuyển đến Arduino ADC. Tần số được giải mã và so sánh. Khi tần số đầu vào từ chuỗi nhỏ hơn tần số được chỉ định, đối với chuỗi đó, một trong các đèn LED màu vàng bật sáng cho biết chuỗi phải được thắt chặt. Khi tần số đo được lớn hơn tần số quy định cho chuỗi đó, đèn LED khác sẽ bật sáng. Khi tần số nằm trong phạm vi quy định cho chuỗi đó, đèn LED màu xanh lá cây sẽ bật sáng để hướng dẫn người chơi guitar.
Mã Arduino hoàn chỉnh được đưa ra ở cuối, ở đây chúng tôi đã giải thích ngắn gọn các phần quan trọng của mã.
Chúng tôi bắt đầu bằng cách tạo một mảng để giữ các công tắc.
int Mongolnarray = {13, 12, 11, 10, 9, 8}; //
Tiếp theo, chúng ta tạo một mảng để giữ tần số tương ứng cho mỗi chuỗi.
float freqarray = {82.41, 110.00, 146.83, 196.00, 246.94, 329.63}; // tất cả tính bằng Hz
Với việc này được thực hiện, chúng tôi sau đó khai báo các chân mà các đèn LED được kết nối và các biến khác sẽ được sử dụng để lấy tần số từ ADC.
int LowerLed = 7; int highLed = 6; int justRight = 5; #define LENGTH 512 byte rawData; số int;
Tiếp theo là hàm void setup () .
Ở đây chúng ta bắt đầu bằng cách cho phép kéo lên bên trong Arduino cho mỗi chân mà các công tắc được kết nối. Sau đó, chúng tôi đặt các chân mà các đèn LED được kết nối làm đầu ra và khởi chạy màn hình nối tiếp để hiển thị dữ liệu.
void setup () { for (int i = 0; i <= 5; i ++) { pinMode (mông, INPUT_PULLUP); } pinMode (lowLed, OUTPUT); pinMode (highLed, OUTPUT); pinMode (justRight, OUTPUT); Serial.begin (115200); }
Tiếp theo, là chức năng vòng lặp void , chúng tôi thực hiện phát hiện và so sánh tần số.
void loop () { if (count <LENGTH) { count ++; rawData = analogRead (A0) >> 2; } else { sum = 0; pd_state = 0; int period = 0; for (i = 0; i <len; i ++) { // Tự tương quan sum_old = sum; tổng = 0; for (k = 0; k <len-i; k ++) sum + = (rawData-128) * (rawData-128) / 256; // Serial.println (sum); // Máy trạng thái phát hiện đỉnh if (pd_state == 2 && (sum-sum_old) <= 0) { period = i; pd_state = 3; } if (pd_state == 1 && (sum> thresh) && (sum-sum_old)> 0) pd_state = 2; if (! i) { thresh = sum * 0.5; pd_state = 1; } } // Tần số được xác định bằng Hz if (thresh> 100) { freq_per = sample_freq / period; Serial.println (freq_per); for (int s = 0; s <= 5; s ++) { if (digitalRead (Butnarray) == HIGH) { if (freq_per - freqarray <0) { digitalWrite (lowLed, HIGH); } else if (freq_per - freqarray> 10) { digitalWrite (highLed, HIGH); } else { digitalWrite (justRight, HIGH); } } } } count = 0; } }
Các mã hoàn chỉnh với một video trình diễn được đưa ra dưới đây. Tải mã lên bảng Arduino của bạn và chơi.