title: "Pavlov's Cat: ฝึกแมวด้วยจิตวิทยาและเทคโนโลยี IoT กับ Arduino MKR1000"
หมายเหตุ: บทช่วยสอนนี้อาจมีการอัปเดตเนื้อหา สามารถเข้าชมเวอร์ชันปัจจุบันได้ที่ ที่นี่
หากคุณเคยพยายามฝึกแมว คุณจะรู้ว่ามันเป็นเรื่องที่ท้าทายเพียงใด แมวมักจะเป็นเจ้านายตัวเองเสมอ แต่ตอนนี้คุณมีโอกาสที่จะใช้เทคโนโลยี IoT เข้ามาช่วยสร้างปฏิสัมพันธ์และฝึกฝนพฤติกรรมของพวกเขาผ่านโปรเจคที่สนุกและสร้างสรรค์นี้
ยินดีต้อนรับสู่การทดลอง Pavlov's Cat!
ในโปรเจคนี้ เราจะประยุกต์ใช้ทฤษฎีการวางเงื่อนไขแบบคลาสสิก (Classical Conditioning) ของ Ivan Pavlov มาใช้กับสัตว์เลี้ยงของคุณ คุณจะได้เรียนรู้วิธีสอนแมวให้รู้ว่าเวลาไหนคือเวลาอาหาร (และเวลาไหนไม่ใช่) โดยใช้อุปกรณ์ในชุด MKR IoT Bundle และโครงสร้างง่ายๆ จากกระดาษลัง ซึ่งเราต่างก็รู้ดีว่าแมวรักกล่องกระดาษมากแค่ไหน!
หลักการทำงาน: ทุกครั้งที่แมวได้ยินท่วงทำนองเฉพาะ (Melody) เครื่องจะจ่ายอาหารออกมา ในขณะที่เซนเซอร์ตรวจจับแสงจะคอยตรวจสอบว่าแมวเดินมาที่เครื่องจริงหรือไม่ หากเล่นอีกท่วงทำนองหนึ่งแต่ไม่มีอาหารออกมา แมวจะเริ่มเรียนรู้ที่จะแยกแยะเสียง คุณสามารถติดตามความคืบหน้าของแมวผ่านโทรศัพท์มือถือ และตั้งค่าปริมาณอาหารได้จากระยะไกล
คำเตือน: การทดลองนี้ไม่มีการทำอันตรายใดๆ ต่อสัตว์ และไม่มีการรับประกันว่าแมวจะยอมทำตามใจคุณเสมอไป แต่นี่คือจุดเริ่มต้นที่ยอดเยี่ยมในการเรียนรู้ระบบอัตโนมัติ!
ภาพรวมของโปรเจค (In a Nutshell)
คุณจะสร้างเครื่องจ่ายอาหารอัตโนมัติที่ควบคุมด้วยบอร์ด Arduino MKR1000 ซึ่งทำหน้าที่เป็นสมองกลสั่งการมอเตอร์เซอร์โว (Servo Motor) เพื่อเปิด-ปิดช่องจ่ายอาหาร
จุดเด่นของโปรเจคนี้คือการเชื่อมต่อกับ Telegram แอปพลิเคชันส่งข้อความยอดนิยม เพื่อใช้เป็นหน้าจอควบคุม (User Interface) ให้คุณสั่งเล่นเพลงหรือจ่ายอาหารได้จากทุกที่ รวมถึงการใช้ Phototransistor เพื่อเป็น Feedback loop กลับมาบอกคุณว่า "แมวมาถึงเครื่องแล้วหรือยัง"

อุปกรณ์ที่ต้องใช้ (Components)
ในเชิงวิศวกรรม อุปกรณ์แต่ละชิ้นมีหน้าที่สำคัญดังนี้:
- Servo Motor: ทำหน้าที่เป็น Actuator แม่นยำสูงสำหรับการควบคุมตำแหน่ง เพื่อเปิดฝากล่องตามระยะเวลาที่กำหนด
- Phototransistor: เซนเซอร์ตรวจจับความเข้มแสง ทำหน้าที่เป็น "ดวงตา" ให้ระบบเพื่อรับรู้การเปลี่ยนแปลงของแสงเมื่อมีแมวเดินมาบังเซนเซอร์
- 220 Ohm Resistor: ตัวต้านทานสำหรับจำกัดกระแสในวงจรเซนเซอร์
- Buzzer: อุปกรณ์สร้างสัญญาณเสียง (Transducer) สำหรับสร้างความถี่เสียงที่แตกต่างกันในการฝึกแมว
เป้าหมายการเรียนรู้ (Learning Goals)
- การจัดการ Telegram Bots พร้อมการสร้าง Custom Keyboard เพื่อความสะดวกในการสั่งงาน
- การตั้งค่าและจัดการฟังก์ชัน Web Server บนบอร์ด MKR1000 เพื่อแสดงผลข้อมูลทางสถิติ (Pro Tip)
- การเขียนโปรแกรมควบคุม Servo และเซนเซอร์อะนาล็อกในระบบ IoT
การเชื่อมต่อ Telegram และ Arduino
Telegram ไม่ได้เป็นแค่แอปแชท แต่ยังมี API ที่ทรงพลังสำหรับสร้าง Chat-bot เพื่อควบคุมอุปกรณ์ Hardware ผ่านไลบรารี TelegramBot ของ Arduino
การสร้าง Custom Keyboard เพื่อการสั่งงานที่ง่ายขึ้น
เพื่อให้ผู้ใช้ไม่ต้องพิมพ์คำสั่งเอง เราสามารถสร้างปุ่มกดพิเศษ (Keyboard) ขึ้นมาบนหน้าจอแชทได้ ซึ่งในโปรเจคนี้เราจะใช้ Emoji เพื่อความสวยงามและเข้าใจง่าย

การวิเคราะห์โค้ด: เราต้องกำหนดแถวของปุ่ม (Rows) และนำไปรวมไว้ใน Object ของ Keyboard ดังนี้:
TelegramKeyboard keyboard_one;
// กำหนดปุ่มด้วย Unicode ของ Emoji
const char* MusicAndFood = "\\U0001F3B6 + \\U0001F36A"; // ตัวโน้ต + คุกกี้
const char* MusicNoFood = "\\U0001F3B6 NO \\U0001F36A"; // ตัวโน้ต แต่ไม่มีคุกกี้
const char* OnePortion = "\\U0001F408"; // แมว 1 ตัว (1 ส่วน)
const char* TwoPortion = "\\U0001F408 \\U0001F408"; // แมว 2 ตัว (2 ส่วน)
const char* ThreePortion = "\\U0001F408 \\U0001F408 \\U0001F408"; // แมว 3 ตัว
// จัดกลุ่มปุ่มลงในแถว
const char* row_one[] = {MusicAndFood, MusicNoFood};
const char* row_two[] = {OnePortion, TwoPortion, ThreePortion};
// นำแถวใส่เข้าไปใน Keyboard
keyboard_one.addRow(row_one, 2);
keyboard_one.addRow(row_two, 3);
ข้อควรระวัง: การส่ง Emoji จากบอร์ดไป Telegram จะใช้ Unicode (เช่น \U0001F3B6) แต่เมื่อ Telegram ส่งค่ากลับมายัง Arduino ค่าที่ได้รับอาจอยู่ในรูปแบบ String ที่ต่างออกไป (เช่น ud83cudfb6) ซึ่งคุณต้องตรวจสอบค่าที่รับมาให้ถูกต้องเพื่อให้ Logic ของโปรแกรมทำงานตามที่ตั้งใจ
ระบบตรวจจับแมว (Detect the Cat!)
เราจะใช้ Phototransistor เป็นตัวรับสัญญาณแสง เมื่อแมวเดินมาบังแสงที่ตกลงบนเซนเซอร์ ค่าความต้านทานจะเปลี่ยนไป ทำให้แรงดันไฟฟ้าที่พิน A6 เปลี่ยนแปลง

Logic การตรวจจับ: เราจะไม่ให้เซนเซอร์ทำงานตลอดเวลาเพื่อประหยัดพลังงานและลดความคลาดเคลื่อน แต่จะให้เริ่มตรวจจับเฉพาะหลังจาก "เล่นเพลง" ไปแล้วเป็นเวลา 2 นาที (120,000 มิลลิวินาที)
unsigned long timer;
bool startDetecting = false; // จะเป็น true เมื่อเริ่มเล่นเพลง
int threshold = 200; // ค่าความเข้มแสงที่กำหนด (ปรับจูนตามสภาพแสงจริง)
void loop() {
if (startDetecting) {
int value = analogRead(A6);
if (value < threshold) {
Serial.println("พบแมวแล้ว!");
startDetecting = false; // หยุดตรวจจับเมื่อเจอเป้าหมาย
}
else if (millis() - timer > 120000) {
Serial.println("ไม่พบแมวภายใน 2 นาที");
startDetecting = false;
}
}
}
เทคนิควิศวกรรม: เราใช้ฟังก์ชัน millis() แทน delay() เพื่อให้ระบบยังคงสามารถรับข้อความจาก Telegram ได้ในขณะที่รอตรวจจับแมว (Non-blocking programming)
ระบบสร้างเสียงและกลไกการจ่ายอาหาร
การเล่นเพลง: เราใช้ Buzzer ต่อเข้ากับพินดิจิทัลและใช้ฟังก์ชัน tone() เพื่อสร้างความถี่เสียงท่วงทำนองที่แตกต่างกันสำหรับการเรียนรู้ของแมว

การควบคุมเซอร์โวมอเตอร์:
เซอร์โวจะทำหน้าที่เปิดฝากล่อง โดยเรากำหนดตัวแปร PortionAmount เพื่อระบุว่าต้องการให้ฝาเปิดค้างไว้นานแค่ไหน (ยิ่งเปิดนาน อาหารยิ่งไหลออกมามาก)
#include <Servo.h>
Servo myservo;
int PortionAmount = 1; // ค่าเริ่มต้น 1 ส่วน
void moveServo() {
// ค่อยๆ เปิดฝา (0 ถึง 90 องศา)
for (int pos = 0; pos <= 90; pos += 1) {
myservo.write(pos);
delay(15);
}
// เปิดค้างไว้ตามปริมาณอาหารที่ตั้งค่าจาก Telegram
delay(PortionAmount * 300);
// ปิดฝา
for (int pos = 90; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
#ProTip: ระบบ Web Server และการจัดเก็บข้อมูลสถิติ
หนึ่งในฟีเจอร์ที่ทรงพลังที่สุดของ MKR1000 คือ Access Point Mode ซึ่งช่วยให้บอร์ดสามารถสร้างเครือข่าย Wi-Fi ของตัวเองและโฮสต์หน้าเว็บ (Web Page) เพื่อแสดงข้อมูลสถิติได้

การทำงานของระบบ Server: เมื่อคุณส่งคำว่า "Server" ผ่าน Telegram บอร์ดจะหยุดโหมด Telegram ชั่วคราวและเริ่มรัน Web Server เพื่อให้คุณเข้าดูตารางสรุปผลได้ว่า:
- อาหารถูกจ่ายไปหรือไม่ (Food delivered)
- แมวเดินมาหาเครื่องหรือไม่ (Cat Showed up)
- ใช้เวลาเท่าไหร่ในการมาถึง (Response Time)
การสร้างตารางแบบ Dynamic: ทุกครั้งที่มีการตรวจจับแมวเสร็จสิ้น บอร์ดจะสร้างแถวของตาราง HTML เพิ่มเข้าไปในหน่วยความจำ:
table_cells += "<tr><td>" + foodStatus + "</td><td>" + catDetected + "</td><td>" + timeTaken + "</td></tr>";
คำแนะนำเพิ่มเติม: หากคุณต้องการให้ข้อมูลสถิตินี้ยังคงอยู่แม้จะถอดปลั๊กหรือรีเซ็ตเครื่อง แนะนำให้ศึกษาการใช้งานไลบรารี FlashStorage หรือดูตัวอย่างจากโปรเจค The Nerd เพื่อเก็บข้อมูลลงในหน่วยความจำถาวรของบอร์ด
สรุป
Pavlov's Cat ไม่ใช่แค่เครื่องให้อาหารแมว แต่มันคือการเรียนรู้การผสานเทคโนโลยี IoT เข้ากับพฤติกรรมศาสตร์ คุณได้ฝึกทั้งแมวของคุณและฝึกทักษะการเป็นวิศวกรระบบฝังตัวไปพร้อมๆ กัน! หากคุณพร้อมแล้ว สามารถดูตัวอย่างโปรเจคอื่นๆ ในซีรีส์ MKR IoT Bundle ได้ที่นี่: