หุ่นยนต์หมาเวอร์ชั่นแรก
มาสร้างหุ่นยนต์หมาเล่นกันเถิอ
วิธีทำหุ่นยนต์หมาก็ง่ายแสนง่ายเรื่มจาก
บทนำ
เอาหุ่น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โวลต์ สายซีเรี่ยว คอมพิวเตอร์
วิธีต่ออุปกรณ์
ซอฟท์แวร์
ปัญหาแนวทางแก้ไข
ปัณหาของระบบนี้คือเรื่องเวลา เราไม่อาดคาดได้ถูก 100% ว่าเมื่อเปิดใชัฟังชั่นความเร็วแล้ว เวลาจะหยุดพร้อมกัน อาดครลาดไปบ้างเล็กน้อย วิณีแก้คือสั่งคำสั่งออกไปตรอดเวลา แต่จะโหลดการทำงานขิง micro ตัวส่งได้ ดังโปรแกรมในหุ่นหมาเวอร์ชั่นที่สอง
หุ่นหมาเวอร์ชั่นที่สอง
รูป หุ่นหมาเวอร์ชั่นที่ 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 หลุดออกไปนอนขอบฝ่าเท้า ในขนะที่ยังไม่ล้มดี ก็เก้าวขาออกไปรับทำให้หุ่นไม่ล้อมและทำเช่นนี้ต่อๆไป ข้อดีคือเดินได้ไว ข้อเสียก็ต้องมีอะไรมาควบคุมไมใ่ห้ล้ม
โปรแกรม dog06
