در این پروژه ما یک ردیاب خورشید ساده خواهیم ساخت که قادر است موقعیت بهینه خورشید را روی یک محور تشخیص دهد و خود را با آن تطبیق دهد .هدف از ساخت این پروژه ایجاد یک حلقه کنترلی است که بتواند یک سلول خورشیدی را به دقت رو به روی نور آفتاب قرار دهد .در ادامه با میکرو دیزاینر الکترونیک باشید.
قطعات و لوازم موردنیاز
در این پروژه از یک استپر موتور (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(); } }
منبع : EEEnthusiast
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
واسه فروش نیست این پروژه ؟؟
نه، بصورت رایگان میتوانید از توضیحات و سورس استفاده کنید.
تشکر
سلام ببخشید من داخل این پروژه کل مراحل رو رفتم و انصالات رو برقرار کردم در دو فتوسل یک پایه از هرکدوم رو به پنج ولت و دو پایه باقی مونده رو به gnd متصل کردم(سیم های بعد مقاومت)و سیم های قبل از مقاومت و بعد از پایه فتوسل رو یکی رو به0به1 انالوگ متصل کردم اما وقتی میخواستمgndرو به پایه های دیگه متصل کنم درایو خاموش میشد و وقتی سیمgndرو قطع میکردم دوباره روشن میشد
لطفاً کمک کنید
ممنون
سلام وقت بخیر
وسایل مورد نیاز این پروژه رو نگفتید؟
ممنون