رابط گرافیکی درایور MDC20
۲۱ تیر ۱۳۹۸راهاندازی درایور MDC20 با آردوینو
۲۱ تیر ۱۳۹۸مقدمه
در عصر اطلاعات، اجرای عملیات فیزیکی از راه دور که تحت عنوان «TeleOperation» نامیده میشود امری ضروری و اجتنابناپذیر خواهد بود. انجام چنین فعل و انفعالاتی از طریق شبکههای کامپیوتری مثل اینترنت و تجهیزات دیگر همچون روباتها امکانپذیر میگردد. به طور کلی سیستمهای دور عملیات، تعمیمی از حواس انسان و توانایی انجام کار با بازوی مکانیکی از یک موقعیت دور است. در سیستمهای Teleoperation دو ربات به عنوان ربات راهبر و رهرو امکان دستکاری غیرمستقیم یک محیط را فراهم میآورند.
در کاربردهایی مختلفی مانند فضا یا پزشکی ربات رهرو از بازوهای سبک یا نازک استفاده میکنند. چنین انتخابی برای رباتهای پزشکی باعث ایجاد شکافهای بسیار کوچک بر روی بدن بیمار را فراهم میسازد. به این ترتیب علاوه بر درد کمتر بیمار، طول دورهی درمان نیز بسیار کاهش خواهد یافت. همچنین برای رباتهای فضایی، هزینه و انرژی لازم برای حرکت ربات در طول مدت انجام عملیات کمینه خواهد گردید. به کمک درایور MDC20 شما قادر هستید این عملیات بسیار جالب را به راحتی با نرم افزار متلب تجربه کنید.
عملیات از راه دور Teleoperation در نرم افزار متلب توسط درایور MDC20
در مقاله پیشین «پیاده سازی کنترلر PID در نرم افزار MATLAB به کمک درایور MDC20» با نحوهی نوشتن و ارتباط نرمافزار متلب با درایور MDC20 صحبت شد. در این مقاله قصد داریم که به کمک درایور MDC20 محصول شرکت دانشبنیان رباتسازان، این عملیات را پیادهسازی کنیم. برنامه این عملیات در نرم افزار متلب (MATLAB) نوشته شده است. در این برنامه انکودر ۱ به موتور دیسی متصل شده است. این موتور نقش رهرو را دارد. همچنین انکودر ۲ به عنوان راهبر میباشد.
در این کد برای فراخوانی موقعیت انکودر ۱ از دستور:
"gotoConfig = hex2dec({'00','6D'})"
و برای فراخوانی انکودر ۲ از دستور:
"gotoConfig = hex2dec({'00','6E'})"
استفاده شده است. انکودر ۱ موقعیت واقعی موتور را مشخص کرده، در صورتی که انکودر ۲ موقعیت مطلوب را نشان میدهد.
این برنامه از دو برنامه تشکیل شده است. در برنامه اصلی مقادیر اولیه، فراخوانی اطلاعات از انکودر ۱، فراخوانی اطلاعات از انکودر ۲ و کنترل PID نوشته شده است. در برنامه کمکی دستور سرعت و حرکت به موتور نوشته شده است. برای اطلاعات بیشتر به مقاله PID با عنوان «پیاده سازی کنترلر PID در نرم افزار MATLAB به کمک درایور MDC20» مراجعه کنید.
نکته ۱) در برنامه اصلی و در حلقه while مقدار انکودر ۲ به صورت زیر نوشته شده است:
R0 = 24*abs(fscanf(s,'%e',14))*2*pi/12000;
عبارت (2*pi/12000) برای تبدیل تعداد پالس به رادیان میباشد. در این عبارت مقدار ۱۲۰۰۰ از حاصلضرب نسبت گیربکس (در موتور استفاده شده نسیت گیربکس 1-24 است) در تعداد پالس انکودر ایجاد شده است که به این معناست که به ازای یک چرخش شفت موتور مقدار ۱۲۰۰۰ پالس برای ورودی انکودر رهور ( انکودر ۱ ) درایور ارسال خواهد شد.
از آنجایی که قصد داریم الگوریتم Teleoperation را پیادهسازی نماییم بایستی مقدار دریافتی هر دو انکودر به ازای یک چرخش مشخص مطلوب یکسان باشد. بنابراین مقدار دریافتی از انکودر راهبر (انکودر ۲) در مقدار ثابت ۲۴ (نسبت گیربکس موتور DC) ضرب میکنیم.
نکته ۲) مقدار واقعی که موتور دوران کده yp است که در عبارت (2*pi/12000) ضرب شده است. این تبدیل تعداد پالس را به رادیان تبدیل میکند.
نکته ۳) عبارتهای ‘6D’ و ‘6E’ به ترتیب برای فراخوانی اطلاعات از انکودر ۱ و ۲ میباشند. برای کسب اطلاعات بیشتر به راهنمای درایور MDC20 مراجعه کنید.
نکته ۴) عبارتهای ’64’ و ’66’ به ترتیب دستورات ساعتگرد و پادساعتگرد بودن موتور میباشند.
نکته ۵) برای آشنایی بیشتر با تاثیر بهرههای کنترلی به مقاله زیر مراجعه نمایید.
تابع اصلی
clc; close all; clear; delete(instrfind) s=serial('COM13'); set(s,'BaudRate',9600); fopen(s); %% Initial Condition yp = 0; % init response Kp = 150; % proportional constant Ki =20; % proportional constant Kd = 0; % derivative term is not necessary in this problem previous_error = 0; integral= 0; dt = 0.001; i=0; % CONTROL LOOP while (1) %% Read the position of Encoder 2 gotoConfig = hex2dec({'00','6E'}); fwrite(s,gotoConfig); R0 = 24*abs(fscanf(s,'%e',14))*2*pi/12000; %% Main Control error = R0-yp; % update error integral = integral + error*dt; % integral term derivative = (error-previous_error)/dt; % derivative term u = fix(Kp*error+Ki*integral+Kd*derivative); % action of control goForward(u,s); gotoConfig = hex2dec({'00','6D'}); fwrite(s,gotoConfig); yp = abs(fscanf(s,'%e',14))*2*pi/12000; % solve ode for velocity end
تابع کمکی goForward
function goForward(w,s) if w>0 if w>255 w=255; end w=fix(w); gotoConfig = hex2dec({'00','64',num2str(w)}); fwrite(s,gotoConfig); else if w<-255 w=-255; end w=fix(w); gotoConfig = hex2dec({'00','66',num2str(abs(w))}); fwrite(s,gotoConfig); end end
شما میتوانید نمایی از عملکرد TeleOperate را در فیلم زیر مشاهده فرمایید.