Robot Cat
เมื่อพูดถึงสัตว์เลี้ยงประจำบ้านของคนไทยที่นิยมเลี้ยงกันเป็นจำนวนมาก เชื่อว่าคงไม่พ้น “แมว” อย่างแน่นอน เพราะด้วยรูปร่างที่น่ารัก รวมไปถึงลักษณะนิสัยเฉพาะตัว แต่ในความเป็นจริงบางครอบครัวก็มีปัญหาบางอย่างซึ่งทำให้ไม่สามารถที่จะเลี้ยงแมวได้ เราจึงได้จัดทำตัว Robot Cat ขึ้นมาเพื่อตอบสนองความต้องการของคนที่ไม่สามารถเลี้ยงสัตว์เลี้ยงได้ แต่อยากได้เพื่อนแก้เหงา ซึ่งตัว Robot Cat จะมีกล้องติดตั้งทำให้สามารถตอบสนองกับผู้ใช้งานได้
ซึ่งส่วนวันนี้เราจะมาเล่าถึงตัวภาพรวมของตัว Robot Cat นะครับ
โดยในตอนแรก Robot Cat จะจับภาพจากกล้อง M5 Stick V ซึ่งตัวกล้องนั้นจะมี Ai ในตัวซึ่งจะทำให้สามารถ Detect สิ่งต่างๆ ตามที่ได้เขียนโค้ดเข้าไป โดยในที่นี้เราจะให้ตรวจจับใบหน้าของคน แล้วจะนำ Coordinate ของใบหน้าที่จับได้เพื่อไปคิดหา Movement ว่าต้องหมุนมอเตอร์ตัวไหนบ้าง หมุนไปกี่องศา เพื่อขยับ Robot Cat ให้เคลื่อนที่ไปตามที่ต้องการ ซึ่งจะทำให้ User ได้เห็นการเคลื่อนที่ตอบโต้
Hardware
หุ่นยนต์แมวตัวนี้เป็นหุ่นยนต์แมวแบบ Open Source ที่มีรายละเอียดการใช้งานอยู่แล้วจึงสามารถกำหนดอุปกรณ์และขึ้นรูปได้เลย
ในส่วนของอุปกรณ์มีดังนี้
ในส่วนของไฟล์ CAD สำหรับนำไปขึ้นรูปตัวชิ้นงานนั้นมีทั้งหมด 14 ส่วน
โดยเราขึ้นรูปทั้ง 14 ส่วนนั้นด้วยการปริ้น 3 มิติ (Material: PLA+) และสามารถดาวน์โหลดไฟล์ CAD ได้จาก Servo Robot Cat Prototype 3 — EMAX Servo by moononournation — Thingiverse
หลังจากได้อุปกรณ์มาทั้งหมดแล้ว สามารถนำมาวางแบบวงจรของระบบได้ดังนี้
Software
ในส่วนของ Software จะมีหลัก ๆ อยู่สองคือส่วนที่จะทำการควบคุมมอเตอร์ และส่วนที่จะ Detect สีจากรูปเพื่อทำการส่ง Coordinate ไปให้ส่วนของการควบคุมมอเตอร์
ซึ่งจากการที่ได้ทดลองใช้ตัวกล้อง M5 Stick Vในตัวกล้องจะสามารถที่จะ Detect ได้หลายอย่าง เช่น ใบหน้าของบุคคล,สิ่งของต่างๆ,สี รวมไปถึง การเคลื่อนที่ต่างๆ
โดยจะทำการ Develop code ด้วยภาษา Python โดยใช้ IDE เป็น Visual Studio Code เพื่อให้ M5 Stick V ทำการตรวจจับ Object ตามที่ต้องการซึ่งในโปรเจคนี้จะเลือกใช้เป็นการตรวจจับใบหน้า แล้วส่งค่าไปควบคุม Servo Motor
import sensor
import imagesensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)while(True):
img = sensor.snapshot()
img.rotation_corr(x_rotation=0.0, y_rotation=0.0, z_rotation=90, x_translation=0.0, y_translation=0.0, zoom=1.0)
lcd.display(img)
lcd.clear()
ในส่วนนี้คือการนำภาพที่ได้รับจากกล้องมาแสดงผลที่จอของ M5stick-v แล้วทำการหมุนภาพเพื่อให้ได้ภาพแบบที่ต้องการ
import KPU as kpu
from fpioa_manager import fmtask = kpu.load(0x300000)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
img = sensor.snapshot()
code = kpu.run_yolo2(task, img)
if code:
a = img.draw_rectangle(code[0].rect())
print(code[0])
if(code[0].x() <= 100):
print('1')
elif((code[0].x() > 100)and(code[0].x() < 220)):
print('2')
elif(code[0].x() >= 220):
print('3')
หลังจากนั้นก็นำภาพที่ได้จากกล้องไปคำนวนเพื่อหาส่วนที่มีความใกล้เคียงที่จะเป็นใบหน้าออกมา แล้วนำไปคิดหาตำแหน่งของใบหน้าบุคคลที่จับได้เพื่อที่คิดว่าจะสั่งควบคุมมอเตอร์ตัวไหนเพื่อให้หุ่นแมวหันไปในตำแหน่งที่ต้องการ
from machine import UART
fm.register (34, fm.fpioa.UART1_TX)
fm.register (35, fm.fpioa.UART1_RX)
uart_A = UART (UART.UART1, 9600, 8, None, 1, timeout = 1000, read_buf_len = 4096)
uart_A.write('1')
โดยจากโปรแกรมจะส่งข้อมูลไปในรูปแบบ UART จาก m5stick-V ไปที่ Board drive
ในการควบคุม Servo Motor ทั้ง 2ตัวนั้นสามารถใช้ Library ได้เลย โดยสามารถเข้าไปโหลด Library เพื่อใช้งานโมดูล PCA9685 ได้ที่ HCPCA9685 — Library for PCA9685 16ch 12bit PWM controller — forum.hobbycomponents.com
#include "HCPCA9685.h"
#include <SoftwareSerial.h>
#include "Wire.h"
#define I2CAdd 0x40
HCPCA9685 HCPCA9685(I2CAdd);
int Current[3] = {180,120};void fw(int i, int j, int k){
for(int s = j; s <= k; s++){
HCPCA9685.Sleep(false);
HCPCA9685.Servo(i, s);
delay(10);
}
}void bw(int t, int m, int w){
for(int s = m; s >= w; s--){
HCPCA9685.Sleep(false);
HCPCA9685.Servo(t, s);
delay(10);
}
}
โดยจะดึงฟังก์ชั่น Forward และ Backward มาใช้เพื่อทำการหมุนมอเตอร์ไปและกลับ และกำหนด Position ของหุ่นเริ่มต้นไว้
if (SerialPort.available() > 0)
{
income[0] = SerialPort.read();
Serial.print("income = ");
Serial.println(income[0]);
switch(income[0])
{
case '1':
Serial.println();
Block[0] = A1[0];
Block[1] = A1[1];
break;
case '2':
Serial.println();
Block[0] = A2[0];
Block[1] = A2[1];
break;
case '3':
Serial.println();
Block[0] = A3[0];
Block[1] = A3[1];
break;
case '4':
Serial.println();
Block[0] = A4[0];
Block[1] = A4[1];
break;
}
}
หลังจากนั้นก็จะรอค่าที่ส่งมาจากตัว Camera M5stick-V แล้วนำไปแปลงเพื่อให้พร้อมที่จะนำไปใช้งานต่อได้
if(Current[0] > Block[0])
{
bw(9,Current[0],Block[0]);
fw(11, 10, 450);
bw(11, 450, 10);
}
else if(Current[0] < Block[0])
{
fw(9,Current[0],Block[0]);
fw(11, 10, 450);
bw(11, 450, 10);
}
if(Current[1] > Block[1])
{
bw(10,Current[1],Block[1]);
fw(11, 10, 450);
bw(11, 450, 10);
}
else if(Current[1]<Block[1])
{
fw(10,Current[1],Block[1]);
fw(11, 10, 450);
bw(11, 450, 10);
}
Current[0] = Block[0];
Current[1] = Block[1];
แล้วนำไปเปรียบเทียบกับ Position ของหุ่นว่าควรไปหมุนมอเตอร์ตัวไหนไปที่ตำแหน่งไหน แล้วนำตำแหน่งที่หมุนไปไปเก็บไว้เพื่อนำค่าไปใช้ต่อ
System Evaluation
โดยการวัดผลของระบบได้วางแผนไว้สองแบบคือ การวัดผลประสิทธิภาพของระบบ และการวัดผลคุณค่าของระบบ
ซึ่งในส่วนของ Face Detection ได้มีการทดลองโดยการนำรูปใบหน้าของบุคคลทั้งหมด 100 รูป (นำรูปมาจาก Face Detection Data Set and Benchmark (FDDB)) เพื่อหาความแม่นยำของระบบ ซึ่งจะมีความแม่นยำอยู่ที่ 73%
และในส่วนสุดท้ายการวัดคุณค่าของระบบว่าระบบจะเป็นที่ต้องการและที่น่าพึงพอใจของ User ไหมโดยจะวัดจากการทำแบบสอบถามของ User ที่ได้ลองใช้ Robot Cat
และในส่วนสุดท้ายการวัดคุณค่าของระบบว่าระบบจะเป็นที่ต้องการและที่น่าพึงพอใจของ User ไหมโดยจะวัดจากการทำแบบสอบถามของ User ที่ได้ลองใช้ Robot Cat
ทำแบบประเมินได้ที่
Team Develop