آموزش ساخت ردیاب خورشید با آردوینو و استپر موتور و مقاومت نوری، در این پروژه ما یک ردیاب خورشید ساده خواهیم ساخت که قادر است موقعیت بهینه خورشید را روی یک محور تشخیص دهد و خود را با آن تطبیق دهد. هدف از ساخت این پروژه ایجاد یک حلقه کنترلی است که بتواند یک سلول خورشیدی را به دقت رو به روی نور آفتاب قرار دهد. در ادامه با ما همراه باشید.
قطعات و لوازم موردنیاز
در این پروژه از یک استپر موتور (28BYJ_48) برای نمایش نحوه استفاده از کتابخانه استپر موتور و بعضی از توابع آن استفاده شده است.
- استپرموتور : 28BYJ-48
- مقاومت نوری(LDR)
- مقاومت 220اهم 4/1 وات
موارد اختیاری:
- بردبرد(breadboard)
اتصالات مدار
اتصالات این پروژه پیچیدگی زیادی ندارند. استپرموتور از طریق مدارکنترل کننده آن (که معمولا همراه استپرموتور است) به آردوینو وصل میشود. در این پروژه از پایههای 11,10,9و12 آردوینو استفاده شده است. مدار کنترل کننده استپرموتور دارای یک کانکتور مادگی 5 پین است که با کانکتور استپرموتور جفت میشود .مقاومتهای حساس به نور به صورت سری با مقاومتهای 220 اهم بین 5v و gnd قرار گرفتهاند. سیگنالهایی که مد نظر ما هستند بین مقاومتهای نوری و مقاومتهای 220 اهم قرار دارند که به پایههای A0 و A1 آردوینو متصل میشوند.
کد پروژه ردیاب خورشید با آردوینو
دو جز اصلی برنامه کنترل سروو و حلقه تثبیت موقعیت مقاومت نوری هستند.
const int rightSensorPin = A0; const int leftSensorPin = A1; int rightSensorRead = 0; int leftSensorRead = 0; int rightLightPct = 0; int leftLightPct = 0; int degreeChange = 1; //Arduino's CustomStepper library //Author: Igor Campos #include CustomStepper stepper(9, 10, 11, 12);
قدم اول مقدار دهی اولیه چند متغییری است که در برنامه استفاده خواهند شد. ما از دو پایه آنالوگ استفاده خواهیم کرد: A0وA1. مقدارهای خام اندازه گیری شده در متغییرهای مربوطه ذخیره میشوند. متغییرهای “Pct” برای ذخیره درصد نوری که سنسورها دریافت میکنند به کار میروند. متغییر degreeChange برای موقعیت یابی در حلقه لوپ به کار میرود که بعدا در مورد آن توضیح خواهیم داد. در آخر سر استپر دلخواه برای کنترل سلول خورشیدی مقدار دهی اولیه میشود.
قسمت دوم کد پروژه
void setup() { Serial.begin(9600); stepper.setRPM(5); stepper.setSPR(4075.7728395); } void loop() { rightSensorRead = analogRead(rightSensorPin); leftSensorRead = analogRead(leftSensorPin); rightLightPct = map(rightSensorRead, 0, 1023, 0, 100); leftLightPct = map(leftSensorRead, 0, 1023, 0, 100); degreeChange = map(abs(rightLightPct-leftLightPct),0,100,2,10); Serial.print("right = "); Serial.print(rightSensorRead); Serial.print(" left = "); Serial.print(leftSensorRead); Serial.print(" Pct r/l = "); Serial.print(rightLightPct); Serial.print("/"); Serial.println(leftLightPct);
در این بخش به مقدار دهی اولیه ارتباط سریال میپردازیم و سپس به پارامترهای استپرموتور. اولین آنها RPM است که برای استپر استفاده میشود و میتواند مقادیر مختلفی بسته به کاربرد داشته باشد که در این پروژه از مقدار 5 استفاده شده است. تابع setSPR برای تعیین تعداد پله یا استپها در هر دور استفاده میشود. این مقدار از نسبت چرخ دندههای موتور بدست میآید.
درون حلقه لوپ، ما با خواندن پایههای آنالوگ که به سنسورهای نوری متصل هستند شروع میکنیم. سپس این مقادیر خوانده شده با استفاده از تابع map به درصد تبدیل میشوند. خط بعد متغییر degreeChange را محاسبه میکند که زاویهای که سلول خورشیدی در آن قرار میگیرد را مشخص میکند. هر چه اختلاف بین دو سنسور بیشتر باشد سلول خورشیدی حرکت بیشتری خواهد کرد.
خطوط مربوط به ارتباط سریال کد که در زیر مشاهده میکنید عمدتا برای ایرادیابی استفاده شده اند. من از آنها برای گزارش دادن مقادیر خوانده شده از سنسورها استفاده کردهام تا مطمئن شوم که مقدار نور بدرستی دریافت شده و به درصد تبدیل میشود.
قسمت سوم کد پروژه
if(rightLightPct < 30 && leftLightPct < 30){ Serial.println("No sun detected!"); }else if(rightLightPct > leftLightPct){ Serial.println("Turning CCW!"); rotateLeft(); stepper.run(); }else{ Serial.println("Turning CW!"); rotateRight(); stepper.run(); } }
این بخش از کد، حلقه کنترل اصلی میباشد. اولین شرطی که در این حلقه بدنبال آن میگردیم “عدم حضور خورشید” است که هنگامی رخ میدهد که هر دو سنسور مقداری کمتر از 30 درصد را نشان میدهند. در این حالت آردوینو هیچ تغییری در موقعیت استپرموتور ایجاد نخواهد کرد. شرط دوم بررسی میکند که آیا سنسور سمت راست نور بیشتری نسبت به سنسور سمت چپ دریافت میکند یا خیر. اگر این شرط برقرار باشد استپرموتور در جهت خلاف عقربههای ساعت شروع به چرخش خواهد کرد و در غیر این صورت استپرموتور در جهت حرکت عقربههای ساعت گردش میکند.
قسمت چهارم کد پروژه
void rotateLeft(){ stepper.setDirection(CCW); stepper.rotateDegrees(degreeChange); while(stepper.isDone() == false){ stepper.run(); } } void rotateRight(){ stepper.setDirection(CW); stepper.rotateDegrees(degreeChange); while(stepper.isDone() == false){ stepper.run(); } }
بخش آخر حاوی توابعی است که در بالا مشخص شده است. هر دوی این توابع برای چرخاندن موتور در جهت حرکت عقربههای ساعت یا خلاف آن استفاده میشوند. موتور تا اتمام گردش به حرکت خود ادامه خواهد داد.
آموزش ساخت ردیاب خورشید با آردوینو و استپر موتور و مقاومت نوری
منابع و لینک های مرتبط
کد کامل برنامه : اینجا کلیک کنید.
کتابخانه استپر موتور : اینجا کلیک کنید.
دیتاشیت موتور : اینجا کلیک کنید.
نتیجه گیری
در پایان این پروژه شما یک نمونه آزمایشی (یا کامل) از ردیاب خورشید با کارایی کامل خواهید داشت. اکنون شما میتوانید با استپرموتورها و مقاومتهای نوری نیز کار کنید و از آنها در پروژههای بعدی خود استفاده کنید.
سورس کد کامل:
//Full Program: https://github.com/VRomanov89 const int rightSensorPin = A0; const int leftSensorPin = A1; int rightSensorRead = 0; int leftSensorRead = 0; int rightLightPct = 0; int leftLightPct = 0; int degreeChange = 1; //Arduino's CustomStepper library //Author: Igor Campos #include <CustomStepper.h> CustomStepper stepper(9, 10, 11, 12); void setup() { Serial.begin(9600); stepper.setRPM(5); stepper.setSPR(4075.7728395); } void loop() { rightSensorRead = analogRead(rightSensorPin); leftSensorRead = analogRead(leftSensorPin); rightLightPct = map(rightSensorRead, 0, 1023, 0, 100); leftLightPct = map(leftSensorRead, 0, 1023, 0, 100); degreeChange = map(abs(rightLightPct-leftLightPct),0,100,2,10); Serial.print("right = "); Serial.print(rightSensorRead); Serial.print(" left = "); Serial.print(leftSensorRead); Serial.print(" Pct r/l = "); Serial.print(rightLightPct); Serial.print("/"); Serial.println(leftLightPct); if(rightLightPct < 30 && leftLightPct < 30){ Serial.println("No sun detected!"); }else if(rightLightPct > leftLightPct){ Serial.println("Turning CCW!"); rotateLeft(); stepper.run(); }else{ Serial.println("Turning CW!"); rotateRight(); stepper.run(); } } void rotateLeft(){ stepper.setDirection(CCW); stepper.rotateDegrees(degreeChange); while(stepper.isDone() == false){ stepper.run(); } } void rotateRight(){ stepper.setDirection(CW); stepper.rotateDegrees(degreeChange); while(stepper.isDone() == false){ stepper.run(); } }
منبع: میکرودیزاینرالکترونیک