แนะนำตัวและแรงบันดาลใจ
สวัสดีอีกครั้งทุกคน พี่เพิ่งได้บอร์ด Sparkfun Sound Detector มาเล่น และสิ่งแรกที่พี่ทำก็คือใช้คู่มือฮุคอัพอย่างเป็นทางการของ Sparkfun เพื่อทดสอบเจ้า Sound Detector ตัวนี้ หลังจากนั้นพี่ก็อยากเพิ่มความท้าทายหน่อย – มันจะเป็นไปได้มั้ยถ้าเราจะใช้ไฟ LED ทั่วไปมาทำเป็น Sound Visualizer จากค่าที่อ่านได้จาก Sound Detector? ความคิดนั้นเลยพาพี่มาสู่โปรเจคนี้ – ตัวอย่างวิดีโออยู่ด้านล่างเลยจ้า –
ขั้นตอนที่ 1: แนะนำอุปกรณ์
สำหรับโปรเจคนี้ น้องจะต้องมี
- บอร์ด Arduino (พี่เลือกใช้ Mega 2560)
- สายจัมเปอร์
- เบรดบอร์ด
- Sparkfun Sound Detector
- LED สีแดง
- LED สีน้ำเงิน
- LED สีเหลือง
นี่คือบทเรียนพื้นฐานสำหรับใช้อุปกรณ์พวกนี้
- บทเรียนพื้นฐานสำหรับการต่อไฟ LED
- บทเรียนพื้นฐานสำหรับ Sparkfun Sound Detector
เอาล่ะ มาดูการต่อวงจรกันดีกว่า สู้งานนะน้อง!
ขั้นตอนที่ 2: การต่อวงจรฮาร์ดแวร์
โอเค เริ่มแรกเลย มาวิเคราะห์เจ้า Sound Detector กันก่อน อย่างแรกสุดเลย ถ้าน้องซื้อแบบที่ยังไม่ได้บัดกรีหัวเข็มมา ก็ต้องบัดกรีหัวเข็มให้เรียบร้อยก่อนนะ
สังเกตว่ามีขาทั้งหมด 5 ขา – Audio, Envelope, Gate, VCC, และ GND โดย Audio, Envelope, และ Gate เป็นอินพุตทั้งหมด ส่วน VCC คือไฟเลี้ยง และ GND คือกราวด์ สำหรับโปรเจคนี้ เราจะทำตามการต่อในคู่มือฮุคอัพของ Sparkfun ซึ่งใช้ทุกขายกเว้น Audio
ตามที่ SparkFun บอกไว้
"การต่อสาย:
ต่อ Sound Detector เข้ากับ Arduino ดังนี้:
(Sound Detector -> ขา Arduino)
GND → GND
VCC → 5V
Gate → ขา 2
Envelope → A0"
ต่อส่วนนั้นเสร็จแล้ว ที่เหลือก็ง่ายดาย LED แต่ละดวงจะมีขายาว (ขาบวก) และขาสั้น (ขาลบ) ขาลบของแต่ละดวงให้ต่อลงกราวด์ (GND) ส่วนขาบวกให้ต่อเข้ากับขา Digital IO ผ่านตัวต้านทาน (Resistor) 220 โอห์ม ในโปรเจคของพี่ ขา Digital IO หมายเลข 5 คือ LED สีเหลืองทางซ้ายสุด, ขา Digital IO หมายเลข 4 คือ LED สีน้ำเงินตรงกลาง, และขา Digital IO หมายเลข 3 คือ LED สีแดง นี่คือวงจรสำหรับ LED
เมื่อต่อ LED และ Sound Detector เสร็จแล้ว ก็ไปต่อที่ส่วนโค้ดกันเลย อย่าช็อตนะตัวนี้!
ขั้นตอนที่ 3: ซอฟต์แวร์และการเขียนโค้ด
คัดลอกโค้ดด้านล่างนี้ไปวางใน Arduino IDE ได้เลยจ้า
//Use Sparkfun's Sound Detector Guide to Create a Sound Visualizer
// Define the Pin connections
#define PIN_GATE_IN 2
#define IRQ_GATE_IN 0
#define PIN_LED_OUT 13
#define PIN_ANALOG_IN A0
void soundISR()
{
int pin_val;
pin_val = digitalRead(PIN_GATE_IN);
digitalWrite(PIN_LED_OUT, pin_val);
}
void setup()
{
Serial.begin(9600); //Starts Newline Baud Connection
pinMode(PIN_LED_OUT, OUTPUT); //Setting builtin LED for the SOUND detector as OUTPUT
pinMode(PIN_GATE_IN, INPUT); //Setting the Gate Pin as input
attachInterrupt(IRQ_GATE_IN, soundISR, CHANGE);
//Set LED Pins as OUTPUT
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
}
void loop()
{
//Sets the LEDs to OFF
digitalWrite(5, LOW);
digitalWrite(4, LOW);
digitalWrite(3, LOW);
int value;
value = analogRead(PIN_ANALOG_IN);
Serial.println("Volume Value: ");
if ((value>=10) && (value <=20))
{
digitalWrite(5, HIGH);
Serial.print(value);
Serial.println("LOW VOLUME");
}
else if ( (value > 20) && (value <= 30) )
{
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
Serial.print(value);
Serial.println("MEDIUM VOLUME");
}
else if (value > 30)
{
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
Serial.print(value);
Serial.println("HIGH VOLUME");
}
else {
Serial.println("LITTLE/NO VOLUME DETECTED");
}
delay(1000);
}
อัพโหลดโค้ดไปเลยน้อง! ถ้ามันขึ้น Error อะไรก็อปปี้ข้อความมาแปะไว้ในคอมเมนต์ละกัน จัดไปวัยรุ่น! สู้งานนะน้อง
รายละเอียดเทคนิคแบบจัดเต็ม
การประมวลผลสัญญาณเสียง (Acoustic Signal Processing)
โปรเจคนี้มันคือการแปลงคลื่นเสียงในอากาศให้กลายเป็นแสงไฟที่เต้นตามจังหวะได้เลย เหมือนเป็น "Visual Equalizer" แบบเร่งด่วนนั่นแหละ
- การสุ่มตัวอย่างสัญญาณเสียงแบบอนาล็อก (Analog Audio Sampling): Arduino ของเราจะไปอ่านค่าจากขาเอาต์พุต "envelope" ของ Sound Detector ด้วยลูปที่อ่านค่าบ่อยๆ (high-frequency analog polling loop) มันจะจับ "จุดสูงสุด (Peaks)" ของสัญญาณเพื่อหาค่าความดังในตอนนั้น แล้วก็โยงค่ามาแสดงผลกับ LED ตามที่เห็นในโค้ดเลย
- การควบคุมความเข้มของ LED แบบกำหนดตำแหน่งได้ (Addressable LED Intensity - แนวคิดขั้นสูง): ถ้าอยากอัพเกรดให้เทพกว่านี้ ลองใช้ NeoPixel strip หรือเป็นแถว LED แบบกำหนดตำแหน่งได้ดู ความดังของเสียงสามารถเอาไปควบคุมความยาวของ "Level Meter" หรือความสว่างของสีได้เลย ให้แสงไฟตอบสนองกับจังหวะเพลงได้แบบทันใจ
ฟีเจอร์ขั้นสูง (Advanced Features)
- การแยกความถี่ด้วย FFT (FFT Frequency Breakdown): (เวอร์ชันขั้นสูง) น้องสามารถใช้ไลบรารี Fast Fourier Transform (FFT) มาช่วยแยกเสียงออกเป็น Bass, Mid, และ Treble ได้เลย จะได้สั่งให้ Arduino ควบคุมแต่ละส่วนของ LED strip ตามความถี่ของเสียงที่ได้ กลายเป็น Spectrum Analyzer ของจริงไปเลย ห้ามช็อตนะตัวนี้!