آموزش کنترل استپر موتور با ماژول درایور DRV8825 و آردوینو

آموزش کنترل استپر موتور با ماژول درایور DRV8825 و آردوینو

چنانچه قصد ساخت یک پرینتر سه بعدی یا یک دستگاه CNC را دارید، به کنترل تعدادی استپر موتور نیاز خواهید داشت. کنترل تمام آن­‌ها به پردازش زیادی نیاز دارد و با داشتن یک آردوینو امکان کنترل چیز دیگری جز موتورها را نخواهید داشت، مگر اینکه از ماژول درایور DRV8825 که یک درایور ویژه برای استپر موتورها است، استفاده نمایید. با کمک این درایور می­توانید سرعت و جهت چرخش یک استپر موتور دوقطبی مانند استپر موتور NEMA17 را تنها با دو پایه کنترل کنید. چقدر عالی!

استپر موتورها چگونه کار می‌کنند؟

استپر موتورها برای دوران یک پله در هر زمان، از چرخ‌دنده‌ای با 32 دندانه و 4 آهن‌ربای الکتریکی استفاده می‌کنند. ارسال هر پالس HIGH، به سیم‌پیچ انرژی می‌دهد. خاصیت مغناطیسی ایجاد شده توسط سیم پیچ نیز، نزدیک‌ترین دندانه‌ی چرخ‌دنده را جذب می‌کند و در نهایت موتور را یک پله به حرکت درمی‌آورد. نحوه عملکرد استپر موتور را می‌توانید در انیمیشن زیر مشاهده کنید:

نحوه‌ی عملکرد استپرموتور

نحوه‌ی پالس دادن شما به این سیم‌پیچ‌ها، به‌شدت بر رفتار موتور تاثیر می‌گذارد:

  • توالی پالس‌ها، جهت دوران موتور را تعیین می‌کند.
  • فرکانس پالس، سرعت موتور را تعیین می‌کند.
  • تعداد پالس‌ها، میزان دوران موتور را تعیین می‌کند.

تراشه‌­ی درایور استپر موتور DRV8825

در قلب ماژول درایور DRV8825، یک تراشه­‌ی درایور میکرواستپ تحت عنوان DRV8825. قرار دارد. این تراشه­‌ی بسیار کوچک (0.6×0.8 اینچ) ساخت شرکت Texas Instruments می‌­باشد.  

تراشه­‌ی درایور میکرواستپ ماژول درایور DRV8825

درایور استپر موتور DRV8825 با حداکثر ولتاژ خروجی 45 ولت، امکان کنترل یک استپر موتور دوقطبی با حداکثر جریان خروجی 2.2 آمپر به ازای هر سیم­پیچ را فراهم می­سازد.

این درایور دارای دو پایه‌­ی کنترلی است، یک پایه برای کنترل سرعت و دیگری برای کنترل جهت چرخش موتور. علاوه­‌براین، این درایور با 6 رزولوشن مختلف کار می­کند: یک پله یا گام کامل، یک دوم گام، یک چهارم گام، یک هشتم گام، یک شانزدهم گام و یک سی­‌ام گام.

پایه‌های ماژول درایور DRV8825

این تراشه برای ارتباط با دنیای بیرون 16 پایه دارد که در تصویر زیر نشان داده شده‌­است:

پایه‌های ماژول درایور DRV8825

پایه‌های تغذیه

پایه‌­های VMOT و GND MO، تغذیه‌­ی موتور را تأمین می­کنند و می­توان آن‌­ها را به ولتاژ­های 8.2 تا 45 ولت متصل نمود. طبق دیتاشیت، لازم است یک خازن دیکوپلینگ با قابلیت تحمل 4 آمپر به پایه­های تغذیه متصل شود.

پایه‌های تغذیه ماژول درایور DRV8825

از آنجایی که درایورDRV8825 ، ولتاژ تغذیه خود را از رگولاتور داخلی 3.3 ولت تأمین می­کند، نیازی به هیچ پایه‌ی تغذیه‌ی منطقی ندارد. با این حال باید پایه­‌ی GND LOGIC را به پایه­‌ی زمین میکروکنترلر خود متصل کنید.

هشدار:

بر روی برد این ماژول یک خازن سرامیکی قرار دارد که تراشه‌­ی درایور را در برابر افزایش ولتاژ آسیب‌پذیر می‌سازد. گاهی این افزایش ولتاژ به بیش از 45 ولت (ماکزیمم ولتاژ نامی DRV8825) می‌رسد که سبب آسیب جدی به برد و حتی موتور خواهد شد.

یک راه برای محافظت از درایور در برابر افزایش ولتاژهای بیش از حد، افزودن یک خازن الکترولیتی100 میکروفاراد (یا حداقل 47 میکروفاراد)  به دو سر پایه‌های تغذیه‌ی موتور است.

پایه‌های انتخاب میکرواستپ

درایور DRV8825 با تقسیم هر گام کامل به چندین گام بسیار کوچک، میکرواستپینگ را میسر می‌سازد. در واقع این امر با تغییر سطح جریان سیم‌پیچ‌ها انجام می‌شود.

برای مثال، با انتخاب درایور NEMA17 با زاویه‌ی چرخش 1.8 درجه که به ازای یک دور چرخش کامل 200 استپ (گام) را طی می‌کند، در مد یک چهارم گام به ازای یک دور چرخش کامل 800 میکرواستپ را طی می‌کند.

پایه‌های M0, M1 & M2 وظیفه‌ی انتخاب میکرواستپ را دارند

پایه‌های M0, M1 & M2 در درایور DRV8825 ، سه پایه‌ی ورودی انتخاب سایز میکرواستپ هستند. با تنظیم سطح ولتاژ منطقی این سه پایه می‌توانید یکی از 6 رزولوشن زیر را برای موتور تنظیم کنید.

M0M1M2Microstep Resolution
LowLowLowFull step
HighLowLowHalf step
LowHighLow1/4 step
HighHighLow1/8 step
LowLowHigh1/16 step
HighLowHigh1/32 step
LowHighHigh1/32 step
HighHighHigh1/32 step

سه پایه‌ی انتخاب میکرواستپ با مقاومت‌های داخلی Pull-down شده‌‍اند؛ بنابراین اگر آن‌ها را بدون اتصال باقی بگذارید، موتور در مد گام کامل عمل خواهد کرد.

پایه‌های کنترلی ورودی

این درایور دارای دو پایه کنترلی ورودی STEP و DIR است.

پایه‌های کنترلی ورودی STEP و DIR

پایه‌ی ورودی STEP ، میکرواستپ‌های موتور را کنترل می‌کند. به ازای هر پالس HIGH که به این پایه ارسال می‌شود، موتور را بر اساس تعداد میکرواستپ‌هایی که توسط پایه‌های انتخاب میکرواستپ تنظیم شده‌است، حرکت می‌دهد. ارسال هرچه سریع‌تر پالس ها، سبب چرخش سریع‌تر موتور خواهدشد.

پایه‌ی ورودی DIR ، جهت چرخش موتور را کنترل می‌کند. با اعمال ولتاژ HIGH به این پایه، موتور به صورت ساعت‌گرد و با اعمال ولتاژ LOW به این پایه، موتور به صورت پادساعتگرد خواهد چرخید.

اگر می‌خواهید موتور تنها در یک جهت بچرخد، کافی‌است این پایه را مستقیماً به VCC یا GND متصل کنید.

پایه‌های کنترل وضعیت توان

تراشه‌ی DRV8825 ، ‌سه ورودی مختلف برای کنترل وضعیت توان دارد: EN, RST, SLP.

پایه‌های کنترل وضعیت توان ماژول درایور DRV8825

EN: این پایه‌ی ورودی، active low است؛ یعنی یا اعمال ولتاژ LOW به این پایه، درایور DRV8825 فعال می‌شود. به صورت پیش فرض این پایه در وضعیت LOW قرار دارد؛ بنابراین درایور همیشه فعال است مگر آنکه آن‌ را در وضعیت HIGH قرار دهید.

SLP: این پایه‌ی ورودی، active low است؛ یعنی یا اعمال ولتاژ LOW به این پایه، درایور در مد Sleep قرار می‌گیرد و مصرف توان آن به حداقل می‌رسد. زمان‌هایی که موتور بلااستفاده است به منظور صرفه‌جویی در مصرف توان می‌توانید این پایه را به این‌ صورت مقداردهی کنید.

RST: این پایه‌ی ورودی، active low است؛ یعنی یا اعمال ولتاژ LOW به این پایه، تمام ورودی‌های پایه‌ی STEP نادیده گرفته می‌شوند، تا زمانی که ولتاژ HIGH به این پایه اعمال شود. همچنین این پایه در وضعیت از پیش تعریف شده Home ، می‌تواند درایور را ریست کند. وضعیت Home وضعیت اولیه‌ای است که موتور شروع به‌کار می‌کند و با توجه به انتخاب میکرواستپ می‌تواند متفاوت باشد.

پایه‌ تشخیص خطا ماژول درایور DRV8825

این درایور یک خروجی FAULT  دارد و هر زمان که ترازیستورهای FE پل H به منظور محافظت در برابر افزایش جریان یا حرارت بیش از حد غیرفعال می‌شوند، وضعیت این خروجی به LOW تغییر خواهد کرد.

پایه‌ 10 پایه‎‌ی تشخیص خطا ماژول درایورDRV8825 است

در عمل پایه FAULT به پایه SLEEP  متصل می‌شود و هرزمان که وضعیت پایه‌ی تشخیص خطا LOW می‌شود، کل تراشه غیرفعال شده و غیر فعال باقی می‌ماند تا زمانی که ریست شود یا ولتاژ تغذیه موتور (VMOT) قطع و وصل شود.

پایه‌های خروجی ماژول درایور DRV8825

درایور موتور DRV8825 دارای 4 پایه‌ی خروجی 1B, 1A, 2A , 2B می‌باشد. شما می‌توانید هر استپر موتور دوقطبی با ولتاژ 8.2 الی 45 ولت را به این پایه‌ها متصل نمایید. هر یک از پایه‌های خروجی قادر به تأمین جریان حداکثر 2.2 آمپر برای موتور هستند. با این وجود، مقدار جریان تأمین شده برای موتور، به منبع تغذیه‌ی سیستم، سیستم خنک‌کننده و تنظیم محدودکننده‌ی جریان بستگی دارد.

 DRV8825 دارای 4 پایه‌ی خروجی 1B, 1A, 2A , 2B می‌باشد.

سیستم خنک‌کننده(هیت‌سینک) ماژول درایور DRV8825

اتلاف توان بیش از حد آی‌سی درایور DRV8825، منجر به افزایش دما می‌شود و چنانچه از میزان دمای قابل تحمل آی‌سی فراتر رود، منجر به آسیب ‌دیدن آی‌سی خواهد شد.

اگرچه حداکثر جریان قابل تحمل آی‌سی درایور DRV882  به ازای هر سیم‌­پیچ 2.2 آمپر است، اما این تراشه تنها می­تواند 1.5 آمپر را بدون اینکه بیش از حد داغ شود، برای هر سیم‌­پیج تأمین کند. برای عبور جریان بیش از 1.5 آمپر به ازای هر سیم‌­پیچ، استفاده از یک هیت‌­سینک یا سایر روش­‌های خنک‌­سازی ضروری است.

سیستم خنک‌کننده(هیت‌سینک) ماژول درایور DRV8825

معمولاً همراه با ماژول درایور DRV8825، یک هیت­‌سینک هم هست که توصیه می­شود قبل از استفاده از درایور آن را نصب کنید.

محدود کننده­‌ی جریان

پیش از استفاده از موتور، باید حداکثر جریان عبوری از سیم‌­پیچ‌­های استپر موتور محدود شود تا مانع از افزایش جریان بیش از حد موتور گردد.

محدود کننده­‌ی جریان جهت مانع شدن از افزایش بیش از حد جریان

این امر توسط پتانسیومتر کوچکی که بر روی ماژول درایور DRV8825 قرار گرفته است، انجام می­شود. شما باید جریان محدود کننده را بر روی حداقل مقدار جریان قابل تحمل موتور یا کمتر تنظیم کنید. بدین منظور دو روش وجود دارد:

روش اول:

 در این روش جریان محدود کننده، با اندازه‌گیری ولتاژ مرجع (Vref) از پایه “ref” انجام می­شود.

  1. دیتاشیت استپر موتور مورد نظر خود را مطالعه نموده و جریان قابل تحمل آن را یادداشت نمایید. برای مثال، جریان قابل تحمل استپر موتور NEMA 17  با 200 پله در هر دور چرخش، 350 میلی‌آمپر به ازای 12 ولت است.
  2. درایور را در مد گام کامل قرار دهید. بدین منظور باید سه پایه­‌ی انتخاب میکرواستپ را بدون اتصال باقی بگذارید.
  3. موتور را در وضعیت ثابتی قرار دهید. بدین منظور هیچ پالسی نباید به پایه­‌ی ورودی STEP اعمال شود.
  4. درحالی که پتانسیومتر را تنظیم می­کنید، ولتاژ آن  (Vref) را اندازه‌گیری نمایید.
  5. جریان محدودکننده را از رابطه­‌ی زیر محاسبه کنید:

جریان محدود کننده = 2 Vref x

Current Limit = Vref x 2

برای مثال، چنانچه جریان قابل تحمل استپر موتور 350 میلی­‌آمپر باشد، باید ولتاژ مرجع را بر روی 0.175 ولت تنظیم نمایید.

محدود کردن جریان با روش اندازه‌گیری ولتاژ مرجع  (Vref)از پایه “ref”

نکته:
یک راه آسان برای تنظیم پتانسیومتر بر روی مقدار موردنظر این است که از گیره سوسماری استفاده کنید. به طوری که یک سر گیره را به پیچ­‌گوشتی وصل کرده  و سر دیگر ان را به مولتی­‌متر خود متصل کنید. بدین ترتیب می­توانید همزمان با چرخاندن پتانسیومتر، ولتاژ را با مولتی‌­متر اندازه بگیرید.

روش دوم:

در این روش جریان محدود کننده با اندازه‌گیری جریان عبوری از سیم­‌پیچ انجام می­شود.

  1. دیتاشیت استپر موتور مورد نظر خود را مطالعه نموده و جریان قابل تحمل آن را یادداشت نمایید. برای مثال، جریان قابل تحمل استپر موتور NEMA 17  با 200 پله در هر دور چرخش، 350 میلی آمپر به ازای 12 ولت است.
  2. درایور را در مد گام کامل قرار دهید. بدین منظور باید سه پایه­‌ی انتخاب میکرواستپ را بدون اتصال باقی بگذارید.
  3. موتور را در وضعیت ثابتی قرار دهید. بدین منظور هیچ پالسی نباید به پایه­‌ی ورودی STEP اعمال شود.
  4. یک آمپرمتر را با یکی از سیم‌­پیچ­های استپر موتور خود سری و جریان عبوری از آن­ را اندازه‌گیری کنید.
  5. با استفاده از یک پیچ­گوشتی، پتانسیومتر را چرخانده و جریان محدود کننده را بر روی مقدار جریان قابل تحمل استپر موتور تنظیم کنید.
محدود کردن جریان ماژول درایور DRV8825 با روش اندازه‌گیری جریان عبوری از سیم­‌پیچ

نحوه اتصال ماژول درایور DRV8825 به آردوینو UNO

با داشتن اطلاعات کامل درباره این درایور ، اکنون آن را به آردوینو متصل می­کنیم.

اتصالات به سادگی انجام می­شود. پایه ریست را به پایه­ SLP/SLEEP  و سپس هر دو را به پایه 5 ولت آردوینو وصل کنید تا درایور فعال شود.

پایه زمین ماژول را به زمین آردوینو متصل کنید. سپس پایه‌های ورودی DIR و STEPرا به ترتیب به پایه‌های خروجی دیجیتال 2 و 3 آردوینو وصل نمایید.

در این مرحله، استپر موتور را به پایه‌های A1, A2, B1, B2 متصل کنید.

هشدار:
اتصال و جدا کردن استپر موتور درحالی که درایور به تغذیه متصل است، به درایور آسیب می­رساند.

توجه داشته باشید که پایه‌های انتخاب میکرواستپ را بدون اتصال باقی بگذارید تا موتور در مد گام کامل عمل کند.

در نهایت، پایه تغذیه موتور را به پایه­‌های  VMOTو GND MOT از ماژول درایور وصل کنید. به یاد داشته باشید که یک خازن الکترولیتی دی‌کوپلینگ 100 میکروفاراد نیز بین دو پایه­‌ی تغذیه­‌ی موتور قرار دهید.

نحوه اتصال ماژول درایور DRV8825 به آردوینو UNO

کد آردوینو- مثال مقدماتی

برنامه­‌ی زیر درک کاملی راجع به نحوه کنترل سرعت و جهت یک استپر موتور دو قطبی با استفاده از ماژول درایور DRV8825 به شما خواهد داد. که می­توانید از ان به عنوان برنامه‌­ی پایه در اکثر پروژه‌­ها و آزمایشات عملی استفاده نمایید.

// Define pin connections & motor's steps per revolution
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;

void setup()
{
	// Declare pins as Outputs
	pinMode(stepPin, OUTPUT);
	pinMode(dirPin, OUTPUT);
}
void loop()
{
	// Set motor direction clockwise
	digitalWrite(dirPin, HIGH);

	// Spin motor slowly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(2000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(2000);
	}
	delay(1000); // Wait a second
	
	// Set motor direction counterclockwise
	digitalWrite(dirPin, LOW);

	// Spin motor quickly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(1000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(1000);
	}
	delay(1000); // Wait a second
}

توضیحات کد:

برنامه با معرفی پایه‌های آردوینو که به ترتیب به پایه‌هایSTEP و  DIRماژول درایور DRV8825 متصل شده­‌اند، آغاز می­شود.

سپس متغیر stepsPerRevolution تعریف و با توجه به مشخصات استپر موتور موردنظر مقداردهی می­گردد.

const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;

در تابع setup ، تمام پایه‌های کنترلی موتور به عنوان یک خروجی دیجیتال معرفی می­شوند.

inMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);

در تابع loop، چرخش موتور به آرامی و به صورت ساعت‌گرد انجام می­شود و سپس در طی مدت زمان یک ثانیه به سرعت جهت چرخش موتور تغییر و به صورت پادساعت‌گرد خواهد چرخید.

کنترل جهت چرخش: به منظور کنترل جهت چرخش یک موتور، پایه DIR را در وضعیت HIGH یا LOW قرار می­دهیم. ورودی HIGH موتور را به صورت ساعت‌گرد و ورودی LOW موتور را به صورت پادساعت‌گرد خواهد چرخاند.

digitalWrite(dirPin, HIGH);

کنترل سرعت: سرعت یک موتور با فرکانس پالس­‌های ارسالی به پایه STEP تعیین می­شود. پالس­‌های بیشتر موتور را با سرعت بیشتری می­چرخاند. پالس چیزی نیست جز HIGH کردن خروجی، انتظار به اندازه­‌ی یک بیت و سپسLOW کردن خروجی و انتظار مجدد به اندازه‌­ی یک بیت. با تغییر تأخیر بین دو پالس، فرکانس پالس‌­ها و در نتیجه سرعت موتور تغییر می­کند.

for(int x = 0; x < stepsPerRevolution; x++) {
	digitalWrite(stepPin, HIGH);
	delayMicroseconds(1000);
	digitalWrite(stepPin, LOW);
	delayMicroseconds(1000);
}

کد آردوینو- استفاده از کتابخانه AccelStepper

در کاربردهای ساده‌­ی تک موتوره، کنترل استپر موتور بدون یک کتابخانه ساده است. اما برای کنترل چندین استپر موتور به یک کتابخانه نیاز خواهید داشت.

در مثال بعدی از یک کتابخانه پیشرفته استپر تحت عنوان کتابخانه‌­ی AccelStepper استفاده می­کنیم. این کتابخانه موارد زیر را پشتیبانی می­کند.

  • افزایش و کاهش سرعت
  • مدیریت همزمان چندین استپر موتور

نصب کتابخانه

ابتدا برای نصب کتابخانه به مسیر Sketch > Include Library > Manage Libraries بروید. صبر کنید تا Library Manager  لیست کتابخانه‌ها را دانلود کرده و لیست کتابخانه‌های نصب شده را آپدیت کند.

نصب کتابخانه از مسیر Sketch > Include Library > Manage Libraries

سپس جستجوی خود را با نوشتن عبارت ‘accelstepper’ فیلتر کنید. از بین چند گزینه‌ای که می‌بینید، اولی را نصب کنید.

انتخاب کتابخانه AccelStepper و شروع نصب آن

کد آردوینو

در این برنامه، ابتدا سرعت موتور در یک جهت افزایش یافته، سپس کاهش می­یابد و در حالت استراحت قرار می­گیرد. پس از یک دور چرخش کامل موتور، جهت چرخش تغییر می­کند. این امر چندین مرتبه تکرار می­شود.

// Include the AccelStepper Library
#include <AccelStepper.h>

// Define pin connections
const int dirPin = 2;
const int stepPin = 3;

// Define motor interface type
#define motorInterfaceType 1

// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position
	myStepper.setMaxSpeed(1000);
	myStepper.setAcceleration(50);
	myStepper.setSpeed(200);
	myStepper.moveTo(200);
}

void loop() {
	// Change direction once the motor reaches target position
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	// Move the motor one step
	myStepper.run();
}

توضیحات کد:

برنامه با افزودن کتابخانه‌­­ی نصب شده AccelStepper آغاز می­شود.

#include <AccelStepper.h>

پس از آن پایه‌های آردوینو که به ترتیب به پایه‌های STEP و DIR از ماژول درایور DRV8825 متصل شده‌‍اند، تعریف می­شوند. همچنین مقدار متغیر motorInterfaceType را 1 قرار می­دهیم (1 به معنای یک درایور خارجی استپر موتور با پایه‌های STEP و DIR است).

// Define pin connections
const int dirPin = 2;
const int stepPin = 3;

// Define motor interface type
#define motorInterfaceType 1

سپس یک شیء از کتابخانه تحت عنوان myStepper می­سازیم.

AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

در تابع setup، ابتدا حداکثر سرعت موتور را بر روی 1000 تنظیم کرده و سپس یک ضریب سرعت برای موتور تعیین می­کنیم تا امکان افزایش و کاهش سرعت استپر موتور را فراهم سازیم.

سرعت معمولی موتور و تعداد پله‌هایی که می­خواهیم حرکت کند را بر روی 200 تنظیم می­کنیم. (به خاطر اینکه استپر موتور NEMA 17 در یک دور کامل 200 پله را طی می­کند).

void setup() {
	myStepper.setMaxSpeed(1000);
	myStepper.setAcceleration(50);
	myStepper.setSpeed(200);
	myStepper.moveTo(200);
}

در تابع loop، از دستور if برای بررسی اینکه موتور باید چه مسافتی را طی کند ( با خواندن مقدار تابع distanceToGo) تا به موقعیت هدف برسد (با استفاده از تابع moveTo)، استفاده می­‌کنیم. زمانی­‌که مقدار تابع distanceToGo به صفر برسد، با کمک تابع moveTo جهت چرخش موتور را تغییر می­‌دهیم.

در انتهای تابع loop، تابع ()run فراخوانی می­شود. این تابع مهمترین تابع است؛ زیرا بدون اجرای این تابع موتور حرکت نخواهد کرد.

void loop() {
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	myStepper.run();
}

همان‌طور که دیدید، راه اندازی استپر موتور با استفاده از ماژول درایور DRV8825 و برد آردوینو چندان دشوار نیست. در این مقاله ما از موتور پله‌ای دو قطبی NEMA 17 به عنوان نمونه استفاده کردیم، اما شما می‌توانید از استپر موتور دیگری در این پروژه استفاده کنید. تنها کافی است به تفاوت‌های موتور خود با موتور استفاده شده در این مقاله دقت کنید.

مقالات مشابه

۲ دیدگاه. Leave new

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات