Thử nghiệm và kiểm tra

Một phần của tài liệu Báo cáo thiết kế hệ thống cơ điện tử (Trang 60 - 75)

Thử nghiệm mạch điều khiển

60 | P a g e Thử nghiệm Robot

Hình 8.2.2 Robot đang đứng

61 | P a g e

KẾT LUẬN

Sau thời gian nghiên cứu và tìm hiểu, nhóm chúng em đã rút ra được nguyên cứu lý thuyết và tính toán bài toán cho robot 4 chân. Đây là cơ sở quan trọng nhất cho việc điều khiển chuyển động cho robot. Thấy được những khó khăn mà con người lấy cảm hứng từ thiên nhiên để xây dựng một con robot có khả năng hoạt động như một loài động vật. Nghiên cứu các loại dáng đi của robot và đưa ra mô hình hình học cho các loại dáng đi. Dựa vào động học thuận và động học nghịch, tính toán được vị trí đặt chân cho robot để có bước đi mượt và tránh bước nhảy. Nhóm đã thiết kế thành công phần cơ khí robot 4 chân. Robot đã hoạt động đúng với lệnh điều khiển từ thiết bị điều khiển từ xa (Bluetooth). Bên cạnh đó mô hình robot vẫn chưa phải là mô hình tối ưu nhất.

Thông qua đề tài này, chúng em đã trang bị nhiều kiến thức hơn nữa, viết chương trình giao tiếp giữa vi điều khiển với modul bluetooth. Điều khiển động cơ servo bằng arudino mega2560 và thực hiện các lệnh bằng phần mềm chạy bằng smartphone được tạo trên MIT.

Bên cạnh đó, nhóm cũng đã gặp không ít khó khăn cho đề tài này, nhóm chưa tính toán được động lực học cho robot, xây dựng quỹ đạo chưa hoàn chỉnh và tối ưu. Robot chỉ đi được trên bề mặt phẳng có độ nhám cao. Các sai số về quỹ đạo chưa được kiểm soát và độ ổn định của mô hình chưa cao.

Trong tương lai, nhóm muốn phát triển mô hình robot này lên một cấp độ mới với nhiều tính năng hơn. Trang bị thêm cảm biến siêu âm để có thể tránh vật cản, tích hợp camera để robot thu thập dữ liệu thông tin hình ảnh truyền về máy tính. Bước phát triển hơn nữa là sử dụng ngôn ngữ python để lập trình robot, tạo ra một robot thông minh.

62 | P a g e

TÀI LIỆU THAM KHẢO

[1] Lê Hoài Quốc, Chung Tấn Lâm, Robot công nghiệp, NXB Khoa Học Kỹ Thuật, 2006. [2] Nguyễn Thị Phương Hà, Huỳnh Thái Hoàng, Lý thuyết điều khiển tự động, NXB Đại Học Quốc Gia TPHCM, 2011.

[3] Mark W. Spong, Seth Hutchinson, and M. Vidyasagar, Robot Dynamics and Control, 2004.

[4] Nguyễn Phùng Quang, Nguyễn Phùng Quang, Matlab & Simulink dành cho kỹ sư điều khiển tự động, NXB Khoa học kỹ thuật 2003.

[5] Devdas Shetty, Richard A.Kolk, Mechatronics System Design.

[6] Giorgio Figliolini and Pierluigi Rea, Mechanics and Simulation of Six-Legged Walking Robots, Italy.

[7] Yong Gao, Weihai Chen, Zhen Lu, and Xiaoqi Chen “Dynamics Analysis and Trajectory Tracking Control for a Cockroach-Like Robot” IEEE International Conference on Control and Automation , 2009.

[8] Naoya Okamoto, Yosuke Kurihara and Kajiro Watanabe” Motion control of multi- legged machines”. ICROS-SICE International Joint Conference 2009.

[9] Abhijit Mahapatra, and Shibendu Shekhar Roy, “Computer Aided Dynamic Simulation of Six-Legged Robot”, International Journal of Recent Trends in Engineering.

Các trang web tham khảo:

Động cơ Servo hoạt động | điều khiển Servo bằng Arduino (istem.com.vn) Arduino Ant Hexapod Robot - How To Mechatronics

(PDF) Leg Trajectory Planning for Quadruped Robots with High-Speed Trot Gait (researchgate.net)

63 | P a g e

PHỤ LỤC

Code matlab

function varargout = control(varargin) gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @control_OpeningFcn, ... 'gui_OutputFcn', @control_OutputFcn, ... 'gui_LayoutFcn', [] , ...

'gui_Callback', []); if nargin && ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1}); end

(adsbygoogle = window.adsbygoogle || []).push({});

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else

gui_mainfcn(gui_State, varargin{:}); end

function control_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;

guidata(hObject, handles);

function varargout = control_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;

% Go to Up

function go_up_Callback(hObject, eventdata, handles) ModelName = 'RobotW' dem=0;a = 0; while dem<4 %REP1 if a == 0 for i=0:5:10

set_param([ModelName '/Slider Gain4'],'Gain',num2str(130-i)); set_param([ModelName '/Slider Gain10'],'Gain',num2str(-130+i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i*2)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70+i*2)); pause(0.01);

end end

64 | P a g e set_param([ModelName '/Slider Gain4'],'Gain',num2str(120+i));

set_param([ModelName '/Slider Gain10'],'Gain',num2str(-120-i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(90-i*0.5)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(90-i*0.5)); pause(0.01) ;

end

for i=0:5:10

set_param([ModelName '/Slider Gain4'],'Gain',num2str(140+i)); set_param([ModelName '/Slider Gain10'],'Gain',num2str(-140-i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(80-i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(80-i)); pause(0.01);

end

for i=0:5:20

set_param([ModelName '/Slider Gain4'],'Gain',num2str(150-i)); set_param([ModelName '/Slider Gain10'],'Gain',num2str(-150+i)); set_param([ModelName '/Slider Gain6'],'Gain',num2str(130-i*0.5)); set_param([ModelName '/Slider Gain8'],'Gain',num2str(-130+i*0.5)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-70-i)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(70+i)); pause(0.01);

end

for i=0:5:20

set_param([ModelName '/Slider Gain6'],'Gain',num2str(120+i)); set_param([ModelName '/Slider Gain8'],'Gain',num2str(-120-i)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-90+i*0.5)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(90-i*0.5)); pause(0.01);

end

for i=0:5:10

set_param([ModelName '/Slider Gain6'],'Gain',num2str(140+i)); set_param([ModelName '/Slider Gain8'],'Gain',num2str(-140-i)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-80+i)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(80-i)); pause(0.01);

end

for i=0:5:20

set_param([ModelName '/Slider Gain6'],'Gain',num2str(150-i)); set_param([ModelName '/Slider Gain8'],'Gain',num2str(-150+i)); set_param([ModelName '/Slider Gain4'],'Gain',num2str(130-i*0.5)); set_param([ModelName '/Slider Gain10'],'Gain',num2str(-130+i*0.5)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i));

65 | P a g e pause(0.01); end dem=dem+1; a =a+1; end % Default robot (adsbygoogle = window.adsbygoogle || []).push({});

function Default_Callback(hObject, eventdata, handles) ModelName = 'RobotW';

set_param([ModelName '/Slider Gain'],'Gain',num2str(90)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(-90)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(90)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(-90));

set_param([ModelName '/Slider Gain4'],'Gain',num2str(130)); set_param([ModelName '/Slider Gain6'],'Gain',num2str(130)); set_param([ModelName '/Slider Gain8'],'Gain',num2str(-130)); set_param([ModelName '/Slider Gain10'],'Gain',num2str(-130));

set_param([ModelName '/Slider Gain5'],'Gain',num2str(70)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-70)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(70)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70));

% Running model

function Run_Callback(hObject, eventdata, handles) ModelName = 'RobotW';

open_system(ModelName);

set_param(ModelName, 'BlockReduction', 'off'); set_param(ModelName, 'StopTime', 'inf');

set_param(ModelName, 'simulationMode', 'normal'); set_param(ModelName, 'startFcn', '1');

set_param(ModelName, 'simulationCommand', 'start');

% Go to Left

function go_left_Callback(hObject, eventdata, handles) ModelName = 'RobotW'; dem = 0; a = 0; while dem<4 %REP1 if a == 0 for i=0:5:10

66 | P a g e set_param([ModelName '/Slider Gain2'],'Gain',num2str(-90-i));

set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70+i)); pause(0.01)

end end

for i=0:5:15

set_param([ModelName '/Slider Gain5'],'Gain',num2str(80-i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(80-i)); pause(0.01);

end

for i=0:5:10

set_param([ModelName '/Slider Gain'],'Gain',num2str(100-i)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(-100+i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(65+i*0.5)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(65+i*0.5)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(90+i)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(-90-i)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-70-i)); pause(0.01)

end

for i=0:5:15

set_param([ModelName '/Slider Gain9'],'Gain',num2str(80-i)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-80+i)); pause(0.01);

end

for i=0:5:10

set_param([ModelName '/Slider Gain3'],'Gain',num2str(100-i)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(-100+i)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(65+i*0.5)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-65-i*0.5)); set_param([ModelName '/Slider Gain'],'Gain',num2str(90+i)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(-90-i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70+i)); pause(0.01);

end

dem =dem+1; a = a+1; end

(adsbygoogle = window.adsbygoogle || []).push({});

% Go to Right

function go_right_Callback(hObject, eventdata, handles) ModelName = 'RobotW';

67 | P a g e dem = 0; a = 0; while dem<4 %REP1 if a == 0 for i=0:5:10

set_param([ModelName '/Slider Gain'],'Gain',num2str(90-i)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(-90+i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70+i)); pause(0.01)

end end

for i=0:5:15

set_param([ModelName '/Slider Gain5'],'Gain',num2str(80-i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(80-i)); pause(0.01);

end

for i=0:5:10

set_param([ModelName '/Slider Gain'],'Gain',num2str(80+i)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(-80-i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(65+i*0.5)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(65+i*0.5)); set_param([ModelName '/Slider Gain3'],'Gain',num2str(90-i)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(-90+i)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-70-i)); pause(0.01)

end

for i=0:5:15

set_param([ModelName '/Slider Gain9'],'Gain',num2str(80-i)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-80+i)); pause(0.01);

end

for i=0:5:10

set_param([ModelName '/Slider Gain3'],'Gain',num2str(80+i)); set_param([ModelName '/Slider Gain1'],'Gain',num2str(-80-i)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(65+i*0.5)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-65-i*0.5)); set_param([ModelName '/Slider Gain'],'Gain',num2str(90-i)); set_param([ModelName '/Slider Gain2'],'Gain',num2str(-90+i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70+i)); pause(0.01);

68 | P a g e end dem=dem+1; a = a+1; end % GO to Down

function go_down_Callback(hObject, eventdata, handles) ModelName = 'RobotW' dem=0;a = 0; while dem<4 %REP1 if a == 0 for i=0:5:10

set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70+i)); pause(0.01);

end end

for i=0:5:5

set_param([ModelName '/Slider Gain4'],'Gain',num2str(130-i)); set_param([ModelName '/Slider Gain10'],'Gain',num2str(-130+i)); pause(0.01);

end

for i=0:5:30

set_param([ModelName '/Slider Gain5'],'Gain',num2str(80-i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(80-i)); pause(0.01) ;

end

for i=0:5:20

set_param([ModelName '/Slider Gain4'],'Gain',num2str(125+i*0.25)); set_param([ModelName '/Slider Gain10'],'Gain',num2str(-125-i*0.25)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(50+i));

set_param([ModelName '/Slider Gain11'],'Gain',num2str(50+i)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-70-i*0.5)); set_param([ModelName '/Slider Gain9'],'Gain',num2str(70+i*0.5)); pause(0.01);

end (adsbygoogle = window.adsbygoogle || []).push({});

for i=0:5:5

set_param([ModelName '/Slider Gain6'],'Gain',num2str(130-i)); set_param([ModelName '/Slider Gain8'],'Gain',num2str(-130+i)); pause(0.01);

end

%REP2

69 | P a g e set_param([ModelName '/Slider Gain7'],'Gain',num2str(-80+i));

set_param([ModelName '/Slider Gain9'],'Gain',num2str(80-i)); pause(0.01)

end

for i=0:5:20

set_param([ModelName '/Slider Gain6'],'Gain',num2str(125+i*0.25)); set_param([ModelName '/Slider Gain8'],'Gain',num2str(-125-i*0.25)); set_param([ModelName '/Slider Gain7'],'Gain',num2str(-50-i));

set_param([ModelName '/Slider Gain9'],'Gain',num2str(50+i)); set_param([ModelName '/Slider Gain5'],'Gain',num2str(70+i)); set_param([ModelName '/Slider Gain11'],'Gain',num2str(70+i)); pause(0.01); end dem=dem+1; a =a+1; end Code chương trình #include <Servo.h>

// create servo object to control a servo Servo myservo2; Servo myservo3; Servo myservo4; Servo myservo5; Servo myservo6; Servo myservo7; Servo myservo8; Servo myservo9; Servo myservo10; Servo myservo11; Servo myservo12; Servo myservo13; char Incoming_value = 0; int i; void setup() {

70 | P a g e Serial.begin(9600); myservo2.attach(2); myservo3.attach(3); myservo4.attach(4); myservo5.attach(5); myservo6.attach(6); myservo7.attach(7); myservo8.attach(8); myservo9.attach(9); myservo10.attach(10); myservo11.attach(11); myservo12.attach(12); myservo13.attach(13);

//CHAN TRUOC BEN PHAI myservo13.write(92);//1 myservo12.write(40);//2 myservo11.write(110);//3 //CHAN SAU BEN PHAI myservo7.write(95);//1 myservo6.write(40);//2 myservo5.write(110);//3

//CHAN TRUOC BEN TRAI myservo8.write(75); //1 myservo9.write(140); //2 myservo10.write(70);//3 //CHAN SAU BEN TRAI myservo2.write(89);//1 myservo3.write(140);//2 myservo4.write(70);//3

71 | P a g e delay(1000); } void loop() { if(Serial.available() > 0) { Incoming_value = Serial.read(); if(Incoming_value == 2) { for (i = 0;i<=10; i++) // khop 2 lui ve sau {

myservo3.write(140+i);// khop2 chan sau ben phai myservo12.write(40-i); // khop2 chan truoc ben trai

delay(5);

}

for (i = 0;i<=20; i++) { myservo3.write(150-i); myservo12.write(30+i); myservo4.write(110+i); myservo11.write(70-i); delay(5); }

for (i = 0;i<=10; i++) {

myservo12.write(50+i); myservo3.write(130-i); myservo11.write(50+8*i);//

72 | P a g e myservo4.write(130-8*i); //

delay(5); }

delay(50);

for (i = 0;i<=20; i++) { myservo3.write(120+i); myservo12.write(60-i); myservo4.write(50+3*i); myservo11.write(130-3*i); delay(5); } delay(20);

for (i = 0;i<=10; i++) //140 110 40 70 {

myservo9.write(140+i);

myservo6.write(40-i); delay(5);

} (adsbygoogle = window.adsbygoogle || []).push({});

for (i = 0;i<=20; i++) //2 { myservo9.write(150-i); myservo6.write(30+i); myservo10.write(110+i); myservo5.write(70-i);// delay(5); }

for (i = 0;i<=10; i++) //3 {

73 | P a g e myservo6.write(50+i); myservo9.write(130-i); myservo5.write(50+8*i);// myservo10.write(130-8*i); // delay(5); } delay(50);

for (i = 0;i<=20; i++) //4 { myservo9.write(120+i); myservo6.write(60-i); myservo10.write(50+3*i); myservo5.write(130-3*i); delay(5); } delay(20); } else if(Incoming_value == 5) {

//CHAN TRUOC BEN PHAI myservo8.write(75);//1

myservo9.write(140);//2 myservo10.write(110);//3 //CHAN SAU BEN PHAI myservo2.write(89);//1 myservo3.write(140);//2 myservo4.write(110);//3 //CHAN TRUOC BEN TRAI myservo13.write(92); //1

74 | P a g e myservo12.write(40); //2

myservo11.write(70);//3 //CHAN SAU BEN TRAI myservo7.write(95);//1 myservo6.write(40);//2 myservo5.write(70);//3 delay(1000);} else if(Incoming_value == 4) {

//CHAN TRUOC BEN PHAI myservo8.write(75);//1

myservo9.write(90);//2 myservo10.write(90);//3 //CHAN SAU BEN PHAI myservo2.write(89);//1 myservo3.write(90);//2 myservo4.write(90);//3

//CHAN TRUOC BEN TRAI myservo13.write(92); //1 myservo12.write(90); //2 myservo11.write(90);//3 //CHAN SAU BEN TRAI myservo7.write(95);//1 myservo6.write(90);//2 myservo5.write(90);//3 delay(1000); } } }

Một phần của tài liệu Báo cáo thiết kế hệ thống cơ điện tử (Trang 60 - 75)