🎹 Piano Arduino?! Bisa Main Lagu! 🎶
Ingin belajar membuat alat musik sederhana dengan Arduino? Dalam proyek ini, kita akan membuat piano mini Arduino menggunakan push button, buzzer, dan layar LCD. Piano ini mampu memainkan berbagai nada dan bahkan memungkinkan pengaturan oktaf dan transposisi nada.
🔧 Komponen yang Dibutuhkan
- 1x Arduino Uno
- 8x Push Button
- 1x Buzzer
- 8x Resistor 10K
- 1x Breadboard
- Kabel jumper secukupnya
- 1x LCD 16x2 (mode 4-bit)
⚡ Skema Rangkaian
Push button dihubungkan ke pin digital 4–18. Buzzer ke pin digital 8. Tombol kontrol (oktaf/nada): pin 2, 3, A0, A1. LCD: RS ke pin 13, EN ke A2, D4–D7 ke A3–A6.
🧠 Penjelasan Fitur Piano
- Menekan tombol akan memainkan nada tertentu dari array
baseTones[]
. - Empat tombol tambahan mengatur oktaf dan transposisi nada.
- LCD menampilkan info oktaf dan shift nada saat ini.
- Fungsi
tone()
digunakan untuk menghasilkan frekuensi suara sesuai perhitungan skala musik.
💻 Kode Program Arduino
Gunakan kode berikut dan unggah ke papan Arduino Uno Anda:
// Potongan kode awal
#define NOTE_C4 262
#define NOTE_CS4 277
// ...
#define NOTE_C5 523
#include <math.h>
// ...
👉 Kode lengkap
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#include <math.h>
#define SPEAKER_PIN 8
#define OCTAVE_UP_PIN 3
#define OCTAVE_DOWN_PIN 2
#define TONE_UP_PIN A0
#define TONE_DOWN_PIN A1
#define LCD_RS 13
#define LCD_EN A2
#define LCD_D4 A3
#define LCD_D5 A4
#define LCD_D6 A5
#define LCD_D7 A6
const uint8_t buttonPins[] = { 18,12,11,10,9,7,6,5,4,14,15,16,17};
const int baseTones[] = {
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4,
NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, NOTE_C5
};
const int numButtons = sizeof(buttonPins) / sizeof(buttonPins[0]);
int octaveShift = 0;
int toneShift = 0;
void setup() {
for (uint8_t i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(OCTAVE_UP_PIN, INPUT_PULLUP);
pinMode(OCTAVE_DOWN_PIN, INPUT_PULLUP);
pinMode(TONE_UP_PIN, INPUT_PULLUP);
pinMode(TONE_DOWN_PIN, INPUT_PULLUP);
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(LCD_RS, OUTPUT);
pinMode(LCD_EN, OUTPUT);
pinMode(LCD_D4, OUTPUT);
pinMode(LCD_D5, OUTPUT);
pinMode(LCD_D6, OUTPUT);
pinMode(LCD_D7, OUTPUT);
lcd_init();
lcd_clear();
lcd_print("Octave: ");
lcd_set_cursor(0, 1);
lcd_print("Tone: ");
}
void loop() {
static unsigned long lastDebounce = 0;
static bool updateDisplay = true;
if (millis() - lastDebounce > 200) {
if (digitalRead(OCTAVE_UP_PIN) == LOW && octaveShift < 3) {
octaveShift++;
lastDebounce = millis();
updateDisplay = true;
}
if (digitalRead(OCTAVE_DOWN_PIN) == LOW && octaveShift > -3) {
octaveShift--;
lastDebounce = millis();
updateDisplay = true;
}
if (digitalRead(TONE_UP_PIN) == LOW && toneShift < 11) {
toneShift++;
lastDebounce = millis();
updateDisplay = true;
}
if (digitalRead(TONE_DOWN_PIN) == LOW && toneShift > -11) {
toneShift--;
lastDebounce = millis();
updateDisplay = true;
}
}
if (updateDisplay) {
lcd_set_cursor(8, 0);
lcd_print_num(octaveShift);
lcd_print(" ");
lcd_set_cursor(6, 1);
lcd_print_num(toneShift);
lcd_print(" ");
updateDisplay = false;
}
float pitch = 0;
for (uint8_t i = 0; i < numButtons; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
int semitoneShift = octaveShift * 12 + toneShift;
pitch = baseTones[i] * pow(2.0, semitoneShift / 12.0);
break;
}
}
if (pitch > 0) {
tone(SPEAKER_PIN, (unsigned int)pitch);
} else {
noTone(SPEAKER_PIN);
}
}
void lcd_send_nibble(uint8_t data) {
digitalWrite(LCD_D4, data & 0x01);
digitalWrite(LCD_D5, (data >> 1) & 0x01);
digitalWrite(LCD_D6, (data >> 2) & 0x01);
digitalWrite(LCD_D7, (data >> 3) & 0x01);
digitalWrite(LCD_EN, HIGH);
delayMicroseconds(1);
digitalWrite(LCD_EN, LOW);
delayMicroseconds(100);
}
void lcd_send_byte(uint8_t data, bool isCommand) {
digitalWrite(LCD_RS, isCommand ? LOW : HIGH);
lcd_send_nibble(data >> 4);
lcd_send_nibble(data & 0x0F);
if (isCommand && data < 4) {
delay(2);
} else {
delayMicroseconds(100);
}
}
void lcd_init() {
delay(50);
lcd_send_nibble(0x03);
delay(5);
lcd_send_nibble(0x03);
delayMicroseconds(150);
lcd_send_nibble(0x03);
lcd_send_nibble(0x02);
lcd_send_byte(0x28, true);
lcd_send_byte(0x0C, true);
lcd_send_byte(0x06, true);
lcd_clear();
}
void lcd_clear() {
lcd_send_byte(0x01, true);
delay(2);
}
void lcd_set_cursor(uint8_t col, uint8_t row) {
uint8_t address = col + (row == 0 ? 0x00 : 0x40);
lcd_send_byte(0x80 | address, true);
}
void lcd_print(const char *str) {
while (*str) {
lcd_send_byte(*str++, false);
}
}
void lcd_print_num(int num) {
char buf[16];
itoa(num, buf, 10);
lcd_print(buf);
}
🎥 Demo Video Piano Arduino
Berikut demo piano Arduino yang telah dibuat:
✅ Kesimpulan
Piano Arduino ini sangat cocok untuk belajar interaksi digital dan pengolahan suara. Anda bisa menambahkan fitur seperti speaker eksternal, tombol lebih banyak, atau bahkan membuat versi portabel!
📣 Jangan lupa share artikel ini dan subscribe YouTube kami!