ใครๆ ก็ชอบหุ่นยนต์พูดได้ มันเหมือนมีเพื่อนตัวน้อยๆ มาให้กวนประสาทเลยอะ ถ้าเป็นหุ่นยนต์ฮิวแมนนอยด์ (Humanoid) ด้วยล่ะก็ สนุกโคตรๆ เลย ในบรรดาหุ่นยนต์ทั้งหมด พอเป็นฮิวแมนนอยด์เนี่ย มันจะกลายเป็น "เขา/เธอ" แทนที่จะเป็น "มัน" ทันที การมีหุ่นยนต์ฮิวแมนนอยด์พูดได้เนี่ยมันสุดยอด แต่ดูเหมือนจะทำยากใช่ไหมล่ะ? วันนี้พี่จะมาบอกวิธีที่พี่ใช้ทำมันให้ง่ายขึ้น ไปดูกันเลย เริ่ม!
ผลลัพธ์สุดท้ายจะประมาณนี้เลยน้อง -
อุปกรณ์ที่ต้องใช้ -

1. Arduino Pro mini หรือ Arduino Nano
2. Micro sd TF module กับ micro SD card (2GB หรือน้อยกว่า)
3. Servo motor - 3 ตัว
4. เซ็นเซอร์อินฟราเรด (IR sensor) (ในรูปที่ 1) - 3 ตัว
5. ไอซีเรกูเลตแรงดัน 7805 (7805 voltage regulator IC) - 2 ตัว
6. Sound box หรือลำโพงตัวเล็ก
7. แบตเตอรี่ลิเธียม 3.7V - 2 ก้อน
8. ขาเสียบผู้-เมีย (male female headers) บ้าง
9. จัมเปอร์ไวร์ 10. สายริบบอน อะไรเทือกนี้
สำหรับทำ ตัวโครงร่าง (body) ต้องมี
1. แผ่น PVC, แนะนำให้ใช้สีขาวจะได้ลงสีทีหลังได้
2. คัตเตอร์
3. ปืนกาวร้อน (Glue gun) สำหรับติดชิ้นส่วน แค่นี้แหละ ไปต่อกันเลย
แล้วหุ่นยนต์มันทำงานยังไงล่ะ?
ก่อนจะรีบลงมือ มาทำความเข้าใจกันก่อนดีกว่า ใช่แล้ว เราจะทำหุ่นยนต์ แต่เรามาเรียนรู้กันก่อน จะได้ไปสอนคนอื่นต่อได้ด้วย เอาล่ะ การทำให้หุ่นยนต์พูดได้ เรามีสองทางเลือกหลัก (a) สังเคราะห์เสียงพูด (Speech Synthesis) (b) ใช้เสียงที่บันทึกไว้ล่วงหน้า (Prerecorded audio) ตัวเลือกแรกเนี่ย กับ Arduino มันยังไม่ค่อยเวิร์คเท่าไหร่ ดังนั้นเราจะใช้วิธีที่สอง เราจะทำไฟล์เสียง (.wav) แล้วเซฟลงการ์ด SD หุ่นยนต์จะมีข้อต่อที่ขยับได้ด้วยเซอร์โวมอเตอร์ และมีเซ็นเซอร์ไว้ตรวจจับสิ่งรอบตัว ถ้าเซ็นเซอร์ตรวจพบอะไร มัน(เธอ) ก็จะเล่นไฟล์เสียงออกมา เช่น ถ้าพี่ชี้นิ้วไปที่ตา เธอก็จะตอบสนองและขยับหัว เป็นต้น
โปรเจคนี้ถือเป็นก้าวสำคัญของ DIY animatronics เลยนะ น้อง มันผสมผสานการตรวจจับพื้นที่กับไฟล์เสียงที่บันทึกไว้ เพื่อสร้างภาพลวงตาว่ามันฉลาด—หุ่นยนต์ "เห็น" เธอแล้วก็ทักทายเธอ!
ขั้นตอนการทำเสียง (Process Audio)
พี่ใช้แอปพลิเคชันบน Android ตัวนึงในการทำไฟล์เสียง แอปนี้ให้เราพิมพ์ข้อความแล้วเซฟเป็นไฟล์ .wav ได้ เราสามารถเปลี่ยนภาษา, ความเร็วเสียง, ระดับเสียง (pitch) ได้

หลังจากเซฟไฟล์เสียงแล้ว ก็เอามาไว้ในคอมพิวเตอร์ จากนั้นก็ต้องไปประมวลผลไฟล์เสียงเป็นขั้นตอนสุดท้าย ไปที่เว็บไซต์แปลงไฟล์เสียงออนไลน์ได้เลย (หาเว็บที่แปลงไฟล์เป็น .wav นะ) อัพโหลดไฟล์เสียงเข้าไป แล้วตั้งค่าให้ถูกต้องตามนี้ -
1. ความละเอียดบิต (Bit resolution) ต้องมากกว่า 8 บิต
2. อัตราการสุ่มตัวอย่าง (Sampling rate) ต้องมากกว่า 16000Hz
3. ช่องสัญญาณเสียง (Audio channel) ใช้แบบโมโน (mono) ก็พอ
4. คลิกที่ 'Advanced Options' แล้วตั้งค่าเป็น pcm unsigned 8 bit ตามรูปเลยจ้า
หลังจากนั้นก็คัดลอกไฟล์เสียงลงไปใน Micro SD Card เอาให้ไว อย่าเซฟลงโฟลเดอร์นะ น้อง! วางลงไปใน SD Card เลยตรงๆหมายเหตุ: Arduino มันเขียนไฟล์ลง SD Card ขนาดไหนก็ได้ (พี่ลองกับ 64GB มาแล้ว) แต่มันอ่านได้เฉพาะ SD Card ที่ความจุไม่เกิน 2GB เท่านั้นแหละ ฉะนั้น หาใบที่ความจุ 2GB หรือน้อยกว่านั้นมาจัดการซะ
ต่อวงจรหรือทำ PCB กันเถอะ
วงจรก็ตรงไปตรงมานะ ต่อเซอร์โวมอเตอร์ทั้งหมดเข้ากับขา Digital ของ Arduino ส่วนโมดูล TF (TF module) ใช้ 6 ขา และขา Digital 4 ขา ขา Digital พิน 9 สำหรับส่งสัญญาณเสียงออก (audio output) เอาไปต่อกับลำโพงได้เลย ส่วนเซนเซอร์มีเรกูเลเตอร์สำหรับจ่ายไฟ 5V คงที่ให้แล้ว ระบบทั้งหมดใช้พลังงานจากแบตเตอรี่ลิเธียม 3.7V จำนวน 2 ก้อน ต่ออนุกรมกัน ดังนั้นบอร์ดและเซอร์โวมอเตอร์จะได้ไฟ 7.4 โวลต์ สบายๆ
วงจรมันอาจดูซับซ้อนไปหน่อยตอนแรก พี่เลยออกแบบ PCB ขึ้นมาเองด้วย EasyEDA งานออกมาสวยใช้ได้เลยทีเดียว คุณภาพ PCB ระดับพรีเมียม ช่วยแก้ปัญหาเรื่องการเดินสายรกๆ ได้เยอะ
มาสร้างเรือนร่าง (Body) กันดีกว่า




ส่วนนี้แหละที่เจ๋งสุด ตามดีไซน์ของพี่ที่เห็นน่ะ น้องจะออกแบบรูปร่างยังไงก็ได้ตามใจชอบเลย! พี่ใช้กล่องกระดาษแข็งทำหัว ใช้แผ่น PVC ทำตัว จากนั้นก็ทาสีแดงให้มันสวยเช้ง ตำแหน่งวางวงจรกับมอเตอร์ดูจากในรูปได้เลย พี่ติดเซนเซอร์ 2 ตัวที่หัว อีก 1 ตัวที่หน้าอก แค่นั้นแหละ ใช้สายริบบอนด้านหลังสำหรับต่อเซนเซอร์ที่หัวและ LED เข้ากับเมนบอร์ด ปล่อยความคิดสร้างสรรค์ออกมาเลย อยากได้รูปร่างไหนก็จัดไป!
โค้ด (Code)
โค้ดก็ง่ายๆ เข้าใจได้ไม่ยาก ปัญหาเดียวที่พี่เจอคือตอนใช้ไลบรารี tmrpcm ในการเล่นเสียงพร้อมกับสั่งงานเซอร์โวมอเตอร์ มันจะขัดกันเพราะทั้งสองไลบรารีใช้ Timer1 ของ Arduino ตัวเดียวกัน พี่เลยแก้ปัญหาโดยใช้ไลบรารี servoTimer2 แทน ดาวน์โหลดไลบรารีทั้งสองมา แล้วเอาไปไว้ในโฟลเดอร์ libraries ของ Arduino จากนั้นก็ include เข้ามาในโค้ด แค่นี้ก็จบ
/*MOFIZA - The Humanoid Smart Robot made with just Arduino
* By Ashraf Minhaj ashraf_minhaj@yahoo.com
* https://ashrafminhajfb.blogspot.com
*http://youtube.com/c/fusebatti */
#include "ServoTimer2.h" //declare ServoTimer2 library to run servo with TMRpcm
#include"SD.h" //declare SD library for SD cards
#define SD_ChipSelectPin 10 //select sd chip select pin 10
#include"TMRpcm.h" //library to play audio from sd card by arduino
#include"SPI.h" //create Serial peripheral Interface Communication
TMRpcm tmrpcm; //name tmrpcm
ServoTimer2 head; //declare Head servo followed by left right hand servos
ServoTimer2 lhand;
ServoTimer2 rhand;
int in1= 6; //declare Infrared sensor pins
int in2= 7;
int in3= 8;
void setup()
{
head.attach(2); //attach servos to pins
lhand.attach(3);
rhand.attach(4);
tmrpcm.speakerPin=9; //Speaker pin 9,audio out pin is 9
Serial.begin(9600); //initialize Serial communication
if(!SD.begin(SD_ChipSelectPin)) //this runs until SD is connected
{
Serial.println("SD FAIL");
return;
}
}
void loop()
{
if(!(digitalRead(in3))) //Chest sensor is low- Say "Hi there.."
{
tmrpcm.play("welcome.wav"); //Playing audio saved as 'welcome.wav'
lhand.write(2500); //hand up- saying HI
delay(2000);
lhand.write(1200); //hand comes to handshake position
delay(9000);
}
if(!(digitalRead(in1))) //Sensor on eye gets low play audio -"dont touch my eye"
{
tmrpcm.play("dont.wav"); //play file saved as "dont.wav" - dont touch my eye
rhand.write(300); //hand up
head.write(2000);
delay(3000);
}
if(!(digitalRead(in2))) //Sensor on eye gets low play audio -"dont touch my eye"
{
tmrpcm.play("dont.wav");
lhand.write(2000);
head.write(1000);
delay(3000);
}
else //No input detected - keep the robot steady.
{
lhand.write(300);
rhand.write(1700);
head.write(1500);
}
}
อัพโหลดโค้ดแล้วก็ลองรันดูเลยจ้า
รายละเอียดเทคนิคแบบจัดเต็ม
การทำงานหลักๆ ของหุ่นยนต์ตัวนี้มันมีลำดับการทำงานแบบนี้เลย:
- ตรวจจับ (Sensing): เซ็นเซอร์อินฟราเรด (IR Sensors) ทำหน้าที่เป็น "ตา" และ "หน้าอก" ของหุ่น มันจะคอยสแกนหาว่ามีวัตถุเข้ามาใกล้รึเปล่า
- จุดตัด (The Threshold): พอเซ็นเซอร์อ่านค่าได้เป็น LOW (แปลว่ามันเจอวัตถุในระยะแล้ว) มันก็จะไปกระตุ้นให้เกิดการตอบสนองแบบที่ตั้งไว้
- สั่งให้พูด (The Voice Command): Arduino จะใช้ไลบรารี TMRpcm สั่งโมดูล SD Card ให้เล่นไฟล์เสียงที่อัดไว้ล่วงหน้า (เช่น `tmrpcm.play("welcome.wav");`)
- ขยับและพูด (The Speech & Motion): ไฟล์เสียงจะถูกอ่านจาก SD Card แล้วส่งออกลำโพงที่พิน 9 พร้อมๆ กับที่เซอร์โวมอเตอร์ก็จะขยับไปยังตำแหน่งที่โปรแกรมไว้ เพื่อสร้างท่าทางเหมือนมีชีวิต
ทำให้ "ปาก" ขยับ (ตัวเลือกขั้นสูง)
ถ้าอยากให้หุ่นดูเป็นหุ่นยนต์มนุษย์สมบูรณ์แบบขึ้นไปอีก ลองเพิ่มการขยับขากรรไกรให้สอดคล้องกับเสียงพูดดู มันเป็นอัพเกรดที่ยากนิดนึงแต่เห็นผลชัดเจนมาก:
- ต่อไมโครเซอร์โวเข้ากับขากรรไกรของหุ่น
- ใช้ซอฟต์แวร์ช่วยวิเคราะห์แอมพลิจูด (ความดัง) ของสัญญาณเสียงที่กำลังส่งไปให้ลำโพงแบบเรียลไทม์
- เชื่อมโยงช่วงที่เสียงดังกับตำแหน่งของเซอร์โว:
- เสียงดัง = อ้าปาก (เช่น 30 องศา)
- เสียงเบา/เงียบ = หุบปาก
- เทคนิคนี้จะทำให้การขยับปากของหุ่นตรงกับคำพูดเป๊ะๆ ดูสมจริงสุดๆ
ฮาร์ดแวร์สำคัญ ห้ามขาด!
โปรเจคนี้ต้องใช้อุปกรณ์พวกนี้ถึงจะรันได้นะ:
- Arduino Pro Mini / Nano: สมองกลางที่คอยรันลอจิกและสั่งงานทุกอย่าง
- โมดูล Micro SD (TF): ความจำของหุ่น เก็บไฟล์เสียงตอบกลับทั้งหมด
- เซ็นเซอร์อินฟราเรด (IR Sensors): ประสาทสัมผัสหลักของหุ่น ใช้ตรวจจับการสัมผัส/ระยะใกล้
- เซอร์โวมอเตอร์ (Servo Motors): ใช้ขยับหัวและมือ
- ลำโพง / Sound Box: เสียงของหุ่น
- แผ่น PVC / กระดาษลัง: เอามาสร้างตัวและหัวหุ่น
เรียบร้อย!

แค่นี้แหละ จ่ายไฟให้หุ่นด้วยแหล่งจ่าย 7.4V DC แล้วก็ลองเล่นได้เลย ถ้าเสียงเบาไปก็หาอุปกรณ์ขยายเสียง (audio amplifier) มาต่อเพิ่มซะ ตอนนี้ก็ได้เพื่อนหุ่นยนต์มนุษย์พูดได้แล้ววว! สู้งานนะน้อง