หุ่นยนต์หมาเวอร์ชั่นแรก

มาสร้างหุ่นยนต์หมาเล่นกันเถิอ
วิธีทำหุ่นยนต์หมาก็ง่ายแสนง่ายเรื่มจาก

บทนำ

เอาหุ่น4ขาตัวเก่ามาปัดฝุนกันใหม่ โดยของเดิมใช้เป็น PICทั้งหมด ของใหม่เป็นบอด RC Servo Motor 8 2บอด
และบอร์ดอเนกประสงค์2 และมอเตอร์ RC 12 ตัว โดยจะแบงการทำเป็น 2 เวอร์ชั่น
เวอร์ชั้นที่ 1 ประกอบด้วยระบบเดิม โปรแกรมเก่าที่ทำไว้นานแล้ว สร้างท่าเดินจากการจัดในคอม แล้วสร้างเป็นฟาย txt ขั้นมาเรียกรัน
โดยใช้ฟังชั่นความเร็วอันตโรมัตบนบอด RC Servo Motor 8
เวอร์ชั่นที่ 2 จะเป็นการเปลี่ยนซอยส่งตำแหน่งออกจากบอดหลักทุกๆ 20 ms จะไม่ใช้ฟังชั้นบนบอดช่วย

หลักการ

จากโปรแรกมจัดท่า ให้ใส่ระยะก้าว กับเวลา แล้วกดท่าเดินตรง หรือเดินถอยหลัง
สมการอินเวิสจะสร้างท่าให้
แล้วกดน้องเซฟ
แล้วกดน้องเซฟ2
โปรแรกมจะสร้างฟาลย์ dsj_mem.txt ขึ้นมา ในนั้นประกอบด้วย
1.ท่าเซนเตอร์
2.ท่าก้าวจากเซนเตอร์
3.ท่าเดินตรง หรือถอยกลัง หรือเลี้ยว มีคอมเม้นปรากตในโปรแรกม
กลังจากนั้นให้ทำการสร้างฟาย dsj_mem.C ขั้นโดนใส่
#include <util/delay.h> // util_delay

extern void delay_ms(uint16_t i);
extern unsigned int time1;
extern void cann1(unsigned char num,unsigned int posection);
จากนั้นก็ใส่ฟังชั่นย่อยตามใจชอบ
ส่วนโปรแรกมเมนก็มีฟังชั่นส่งค่าออก เท่านั้น

ตัวอย่างโปรแกรม

void put_motor1(unsigned char num,unsigned int posection)
{
motor_o[num]= posection; //???????????????????

loop_until_bit_is_set(UCSRA, UDRE);
// put data into buffer sends the data
UDR = num;

loop_until_bit_is_set(UCSRA, UDRE);
// put data into buffer sends the data
UDR = posection/256;
loop_until_bit_is_set(UCSRA, UDRE);
// put data into buffer sends the data
UDR = posection%256;
}

void cann1(unsigned char num,unsigned int posection)
{
// put_motor1(num,posection);
motor[num] = posection;
}

void bb3(void){ //กำหนดฟังชั่นชื่อ bb3
cann1(67,9000); // เปิดฟังชั่นความเร็ว ฟังชั่น 67
cann1(65,9000); // เปิดฟังชั่นคำนวนคสามเร็วอันโนมัตร ฟังชั่น 65
time1 = 15; //กำหนดเวลา 15x20ms = 300 ms
cann1(69,time1); // ส่งต่าเวลาออกไปฟังชั่นที่ 69

cann1(1,25382); // ส่งตำแหน่งมอเจอร์ตัวที่ 1
cann1(2,34455);
cann1(3,17317);
cann1(4,26390);
cann1(5,34707);
cann1(6,17317);
cann1(7,25000);
cann1(8,25000);
cann1(9,22610);
cann1(10,13285);
cann1(11,30171);
cann1(12,23366);
cann1(13,13537);
cann1(14,31179);
cann1(15,25000);
cann1(16,25000);// ส่งตำแหน่งมอเจอร์ตัวที่ 1
delay_ms(300);// รอจนทามเมอร์ทำงานเสร็จ
}

อุปกรณ์

1. บอร์ดอเนกประสงค์2
2. บอร์ด RC Servo Motor8 2 บอด
3. RC Servo Motor 12 ตัว
4. โครงอลูมิเนียม(พับเองตามแบบ)
5. ลูกปืน 12 ตัว
6. ถ่าน6โวลต์ สายซีเรี่ยว คอมพิวเตอร์

วิธีต่ออุปกรณ์

ซอฟท์แวร์

GLMgr_dog.zip
DOG.c
dsj_mem.c

ปัญหาแนวทางแก้ไข

ปัณหาของระบบนี้คือเรื่องเวลา เราไม่อาดคาดได้ถูก 100% ว่าเมื่อเปิดใชัฟังชั่นความเร็วแล้ว เวลาจะหยุดพร้อมกัน อาดครลาดไปบ้างเล็กน้อย วิณีแก้คือสั่งคำสั่งออกไปตรอดเวลา แต่จะโหลดการทำงานขิง micro ตัวส่งได้ ดังโปรแกรมในหุ่นหมาเวอร์ชั่นที่สอง

VDO

หุ่นหมาเวอร์ชั่นที่สอง

รูป หุ่นหมาเวอร์ชั่นที่ 2เปลี่ยนแปลงแต่โปรแรกมนิดหน่อย แทนมราจะเรียกใช้ฟังชั้นสำเร็จของบอด แต่กลับซอยส่งคำสั่งออกไปทุกๆ 20 วินาทีแทน

ในที่นี้เราส่งคำสั่งคุมมิเตอร์ 16 ตัว ตัวละ 3 ไบท์ นั่นคือ 16*3*10 = 480 บิท
เราใช้บอทเรต 57600 ส่งทุกๆ20 ms 57600*20/1000 = 1152 บิท
1152คือจำนวนบิทสูงสุดที่เราจะส่งได้ภายใน 20ms แต่เราส่งแค่ 480บิท แสดงว่าใช้ได้
ถ้าหากใช้ไม่ได้ก็เพื่มบอทเรตไปเป็น 115200 แทน

จากโปรแกรมเดิมเพื่อมฟังชั่น Startgate เข้าไปเพื่ออทำการซอยท่าย่อยส่งออกไปตามเวลาที่กำหมด
โดย time1 = 20ms
ถ้าต้องการเวลาในการเครื่อที่ 200ms time1 จะเท่ากับ 10
เขียนโดยเปิดทามเมอร์ 2 ตังเวลาที่20ms เพื่อเครียดค่า ดังตัวอย่าง
for(i = 1;i<= time1;i++){
timer02int = 1;
TCNT2 = 256-156;
for(j=1;j<=16;j++){
put_motor1(j,motor_oo[j]+motor_v[j]*i); // ส่งค่าออก
}
while(timer02int ); // รอจนกระทั่ง 20ms แล้วค่อยหลุดออกไป
}

ตัวอย่างโปรแรกม

void bb4(void){

cann1(1,25382);
cann1(2,34455);
cann1(3,17317);
cann1(4,26390);
cann1(5,34707);
cann1(6,17317);
cann1(7,25000);
cann1(8,25000);
cann1(9,22610);
cann1(10,13285);
cann1(11,30171);
cann1(12,23366);
cann1(13,13537);
cann1(14,31179);
cann1(15,25000);
cann1(16,25000);
time1 = 1;
startgate();
}

การจัดท่า

การจัดท่าเดิน จัดได้หลายแบบแล้วแต่ใครจะคิด แต่ในที่นี้จะจะดแบบแสตติดและไดนามิก
จากท่าเดินที่ผ่านมาเป็นการจัดท่าแบบแสตติก คือ จุด CG ไม่ออกนอกบริเวณของเท้าที่ยืน ถ้าหาก CG หลุดไปหุ่นก็ล้อมดังในวีดีโอ

ส่วนการจัดแบบไดนามิกเป็นการจับที่จุด CG หลุดออกไปนอนขอบฝ่าเท้า ในขนะที่ยังไม่ล้มดี ก็เก้าวขาออกไปรับทำให้หุ่นไม่ล้อมและทำเช่นนี้ต่อๆไป ข้อดีคือเดินได้ไว ข้อเสียก็ต้องมีอะไรมาควบคุมไมใ่ห้ล้ม

VDO

โปรแกรม dog06