دوستان خوبم سلام. بابا اینقدر گفتید دیر آپدیت می کنی که دیگه خودمم عذاب وجدان گرفتم ! اصلا فلسفه وبلاگ همینه دیگه! هر دو سه روز در میون باید آپ کرد. حالا کار ما که آموزشیه دیگه بدتر تا بیام مطلب آماده کنم شونصد روز طول میکشه... بیخیال بچسبیم به آموزش امروزمون.

امروز می خوام مدار سنسوری رو نشونتون بدم که در عین سادگی -البته از مدار قبلی پیچیده تره- کارایی و بازده بسیار بالاتری داره. درواقع اگر کار شما یکم به سمت حرفه ای شدن پیش بره دیگه مجبورید مدار قبلی رو کنار بگذارید و به مدارهایی که از آیسی های OpAmp بهرمی برند، استفاده کنید. لیست قطعات رو می نویسم و بعد توضیح میدم:

لیست قطعات:

  1. یک عدد آیسی آپ-امپ LM358
  2. مقاومت ۱۰k یک عدد
  3. مقاومت ۲۲۰ دو عدد
  4. پتانسیومتر 10k یک عدد
  5. پک سنسور (گیرنده و فرستنده) از نوع خروجی ترانزیستور

اول از همه بگم که لیست قطعات بالا برای راه اندازی یک سنسور (فرستنده و گیرنده) کافی می باشد و برای افزایش سنسورهاتون باید به نسبت قطعات بیشتری تهیه کنید (البته بجز آیسی که هر یک دونش میتونه ۲ تا سنسور رو راه بندازه). همچنین هم می تونید از سنسورهایی که به صورت یک پک هستند (فرستنده و گیرنده باهم) مثل CNY70 و هم از فرستنده و گیرنده جدا استفاده کنید. چیزی که مهمه اینه که سنسور شما باید از نوع خروجی ترانزیستور باشه! (برای اینکه سردرگم نشید همون CNY70 رو پیشنهاد می کنم). نقشه مدار رو ببینید تا من روش بیشتر توضیح بدم:

مختصری درباره LM358: این آیسی حاوی دوعدد آپ-امپ (DUAL OPAMP) است و ۸ پایه دارد. آپ-امپ ها جهت مقایسه ولتاژهای ایجاد شده از سنسورها بکار می روند. در واقع می دونید در الکترونیک دیجیتال ۵ ولت به معنای بالا یا ۱ و زمین یا ۰ ولت به معنای پایین یا ۰ هستش. ولتاژ خروجی از سنسورها با دور یا نزدیک کردن جسم در رنجهای مختلفی تغییر میکنه، حالا وظیفه آپ-امپ اینه که با وقایسه این ولتاژ خروجی مناسب رو که یا ۱ یا ۰ هست ایجاد کنه تا هنگام وصل این خروجی به میکرو، اجازه تصمیم گیری صریحتر و دقیقتری برای میکروکنترلرمون فراهم کنیم. در واقع خروجی این آیسی یا ۱ هست به معنای قرار گرفتن سنسور روی خط سیاه و یا ۰ هست به معنای حالت عادی یا قرار گرفتن سنسور روی سطح سیاه  و دیگه حالتی بین این دو نخواهیم داشت در صورتی که در مدار قبلی حالت میانگینی هم وجود داشت که در مواقعی باعث اختلال خواهد شد.

قسمتی که با نقطه چین مشخص شده دلخبخواه هست و برای مشاهده و آزمایش خروجی بکار میره که البته پیشنهاد می کنم وقتی این مدار رو روی بردبورد می بندید با قرار دادن این مقاومت و LED خروجی کاملا دقیقتون رو مشاهده کنید.

راستی اگر از CNY70 استفاده می کنید بدونید که: پایه های سمتی از این سنسور که نوشته ندارد مربوط به LED فرستنده و دو پایه قسمتی که نوشته ندارد مربوط به گیرنده هستند. همچنین اگر می خواهید دوسنسور رو با یک آیسی آپ-امپ LM358 راه بندازید، یک مدار دیگه شکل همین ببندید و اینبار بجای پایه های ۱ و ۲ و ۳ به ترتیب از پایه های ۵ و ۶ و ۷ استفاده کنید (که خروجی پایه شماره ۷ هستش). در صورتی که بخواهید بیشتر از دوتا سنسور استفاده کنید باید بازهم آیسی آپ-امپ تهیه کنید. با تنظیم پتانسیومترها می توانید فاصله و حساسیت سنسورها را تعین کنید. البته پیشنهاد می کنم قبل از لحیم کردن این مدار روی فیبر اون رو یکبار روی برد بورد آزمایش کنید.

در نوشتن این مطلب از بخشی از مقاله ربات مسیریاب، برگرفته از دانشنامه سایت رشد استفاده شده است (البته با مقدار زیادی تغییرات). موفق پیروز باشید

+ نوشته شده توسط نیما در یکشنبه بیست و هشتم اسفند 1384 و ساعت 18:0 |
سلام به دوستان دوست داشتنی خودم... می دونم دیگه از دستم کلافه شدید اما گفته بودم که دلیل چیه! حالا به بزرگی خودتون ببخشید و منم قول میدم دیگه پسر خوبی باشم...

بفرمایید اینم تصاویری که قولش رو داده بودم! دو ردیف اول مربوط میشه به بخشهای الکترونیکی و مکانیکی رباتهای (!) خودم. تمام تصاویر Tumbnail هستند یعنی با کلیک روی هر کدوم نمونه بزرگش در یه صفحه جیدی باز میشه. راستی به دلایلی موفق نشدم تصویر ربات بچه های امام دانشگاه امام حسین و خیلی های دیگه رو هم بزارم اما چند تا عکس دیگه که مربوط میشه به ربات های مسیریاب (یا ...) دوستانی که در همین دوره جدید مسابقات حلی کاپ شرکت کرده بودند... راستی تمام این تصاویر اورجینال هستند (برای اولین بار در وب منتشر میشن :)) و توسط دوربین آقا فاضل گرفته شدن (دستش درد نکنه)


AVR, تغذیه, ULN2803

مدار سنسورها

مکانیک رباتم با استپر

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

به همراه بدنه :)

مکانیک رباتم با موتور DC

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

...و

همونطور که تو تصاویر رباتهام دیدید مدار سنسورهای من با مداری که تو وبلاگ آموزش دادم زمین تا آسمون فرق می کنه. که البته این مدل ۱۰۰٪ کاراتر و حرفه ای تر هستش. به همین خاطر تو مقاله بعدی به تشریح این مدار خواهم پرداخت.

درضمن برای شروع کار حرفه ای تر از مقالات بعدی نحوه کار با موتورهای DC (درایو کردن و...) رو آموزش خواهم داد و از اون به بعد کار رو با این نوع موتور پیش خواهیم گرفت...

برای همتون آرزوی موفقیت دارم. تا بزودی خدانگهدار

+ نوشته شده توسط نیما در جمعه بیست و ششم اسفند 1384 و ساعت 12:2 |
سلام بچه ها! خیلی ببخشید که دیر به دیر میام! آخه حقیقت کارا جور نمیشه! قرار بود این سری عکسهایی از ربات خودم و ربات چندتا از دوستان که در حلی کاپ هم شرکت کرده بودن به نمایش بگذارم... مشکل اینه که من دوربین ندارم و تا پیدا کردن این دوستانم هم باید یکم صبر کنم! ایشاالله قول میدم تا شب ۵ شنبه یا خودم بیام (یا خبرم ).

راستی بچه ها بابت اشتباه در کد مقاله قبل عذر می خوام... چون تو خونه نوشته بودم و تو کافی نت پست کرده بودم یادم رفت تو کافی نت این قسمتو تصحیح کنم. اما بحث جالب شما رو در کامنتها دیدم و کلی حال کردم... با اجازه آقا رحیم با روش پیشنهادی ایشون هم تصحیحش کردم.. و از مزدک جان هم ممنونم اما از خودش می خوام یه بار دیگه به کدش نگاه کنه، خودش میفهمه اشکال کدش کجاست! (این هم از اولین کمبود بیسکام :).

اما!!!! اما باید بگم دلیل اصلی نوشتن این پست (به ظاهر بیهوده) چیزی نبود بجز معرفی یه وبلاگ پر بار  . طرف کامنت گذاشته بود که من بهت لینکیدم بیا توهم بهم بلینک... وقتی رفتم تو وبلاگش دیدم چه مقالات باحالی داره! یکم که بیشتر دقت کردم دیدم چقدر سبک نوشتنش شبیه منه! یکم بیشتر که دقت کردم دیدم به به!!!! نخیر مثل اینکه آقا در امر کپی و paste فوق لیسانس داره! تازه می خواد دکتراشم بگیره!! کلی برام جالب بود. خوشحال شدم که مقالاتم حداقل برای یکی این ارزش رو داشته که بخواد ازشون کپی برداری کنه (نمی گم کش رفتن) خلاصه ما که بخیل نیستیم قصد ما استفاده دوستانه حالا چه اینجا چه اونجا!  اینم لینکش:http://www.roboedukia.blogsky.com/. راستی چون بهم لینک نداده بود منم بهش نلینکیدم!!!

بازم معذرت می خوام که دیر دیر میام.. اگر مقالات خودم بود مثل قبل ۲   ۳ روز در میون می نوشتم اما چه کنم که کارم لنگ خلق الله ست... پس یکم منتظر باشید تا با تصاویر اورجینال برگردم! راستی از یکی که میدونم الان داره خودشم این پست رو می خونه خواهش کردم تا عکس رباتش رو که به عنوان کوچکترین ربات (5/3×2/3×2/2) حلی کاپ هم ازش تقدیر شد، برامون بفرسته. شما هم تو کامنتها ازش بخواید تا یوقت یادش نره....... دوستون دارم یا حق.

این پست موقتی می باشد...

+ نوشته شده توسط نیما در یکشنبه بیست و یکم اسفند 1384 و ساعت 23:28 |
دوستان خوبم، سلام به روی ماهتون .... شرمنده از اینکه یکم نه!!! بلکه خیلی دیر کردم. آخه این چند روز خیلی bussy بیدم :)) از صبح ساعت ۵ تا شب ساعت ۹ بعدشم لالا....... حالاشم اینترنتم قطعه و ندید، فقط بخاطر اینکه خیلی دلم براتون تنگ شده بود دارم مینویسم. اگر با نظراتتون ابراز لطف کردید که دمتون گرم! خستگیم دراومد اگر نه خیلی بدید .

امروز دیگه می خوام یجورایی این مباحث مقدماتی رو جمعش کنم و ایشالله اگر عمری بود از دفعات بعد بریم برا کارای حرفه ای تر. تو پست امروز می خوام کد کامل یک روبات ساده مسیر یاب رو تحلیل کنم که در واقع اشتراک چند مقاله قبلی مربوط به برنامه نویسی هستش. اول کد رو ببینید بعد توضیح میدم:

$crystal = 1000000
$regfile = "m32def.dat"

Config Portd = Output                                    'right motor
Config Portd = Output                                    'left motor
Config Pinc.0 = Input
Config Pinc.1 = Input

Dim Rm As Byte                                          'right motor
Dim Lm As Byte                                          'left motor
Dim Ls As Bit                                           'left sensor
Dim Rs As Bit                                           'right sensor

Rm = &B10001000
Lm = &B10001000

Declare Sub Left_step()
Declare Sub Right_step()
Declare Sub Turn_left()
Declare Sub Turn_right()
Declare Sub Forward()

Do
  Ls = Pinc.0
  Rs = Pinc.1

  If Ls = 1 Then                              'Left sensor trigered?
    Call Turn_left()
  End If
  If Rs = 1 Then                              'Right sensor trigered?
    Call Turn_right()
  End If

If Pinc.0 = 1 And pinc.1 = 1 Then 'Thanx 2 Rahim!
Call Forward()
End If
If Pinc.0 = 0 And Portc.1 =0 Then
Call Forward()
End If

  Waitms 10
Loop


Sub Forward()                                 'Goes forward 1 step
  Call Left_step()
  Call Right_step()
End Sub

Sub Turn_right()
  Call Left_step()
End Sub

Sub Turn_left()
  Call Right_step()
End Sub

Sub Left_step()                         'rotates left motor n step
    Rotate Lm , Right
    Portd = Lm
End Sub

Sub Right_step()                        'Rotates Right motor n steps
    Rotate Rm , Right
    Portb = Rm
End Sub

End

خوب همونطور که گفتم این کد درواقع اشتراکی هست از مقالات قبلی برای همین موضوع جدید و مهمی نداره بجز استفاده از روال ، زیربرنامه یا Sub. این ویژگی از زبان بیسیک کامپایلر Bascom به شما اجازه میده تا برنامتون رو به چند قسمت ساده تر تقسیم کنید و هر کدوم رو با بکار بردن نامش بعد از کلمه کلیدی CALL به دفعات دلخواه در برنامتون استفاده کنید. (فکر کنم دیگه همه قبلا برنامه نویسی کردن و با مفهوم روال و تابع آشنایی دارند برای همین توضیح اضافی نمیدم فقط کار هر روال این برنامه رو تیتر وار می نویسم:

  • Left_Step(): روالی برای چرخش موتور چپ به اندازه یک استپ
  • Right_Step(): برای چرخش موتور سمت راست به اندازه یک استپ
  • Turn_left(): برای چرخش روبات به سمت چپ (موتور راست ۱ استپ)
  • Turn_right(): برای چرخش ربات به سمت راست (موتور چپ ۱ استپ)
  • Forward(): برای حرکت ربات به سمت جلو (موتور چپ و راست هر کدام ۱ استپ)

راستی برای استفاده از توابع یا روالها باید ابتدا در بالای برنامه با فرمت Declare Sub subname() اونها رو تعریف کنیم تا بتونیم در قسمتها مختلف برنامه از اونها استفاده کنیم... شاید در اینجا استفاده از زیربرنامه ها حتی باعث طولانی تر شدن کد هم شده باشه اما در کل هم باعث خواناتر شدن و هم باعث آسانتر شدن امکان تغیرات در برنامه میشه، که البته در برنامه های حجیم تر باعث کوتاهتر شدن برنامه هم خواهد شد.

شرح کلی: طبق کد موتور سمت چپ رو باید بواسطه درایور به پورت D و موتور سمت راست رو به پورت B وصل کنید (قبلا توضیح داده شده چطور). دو سنسور چپ و راست رو هم به ترتیب به پین ۰ و ۱ از پورت C وصل کنید (اینم قبلا آموزش دادم). حالا طبق کد اگر سنسور سمت چپ خط سایه رو سنس کنه موتور سمت راست حرکت میکنه که باعث حرکت ربات به سمت چپ و اگر سنسور سمت راست خط سیاه رو سنس کنه موتور سمت چپ حرکت میکنه و ربات رو به سمت راست می راند. تا همواره ربات بین خطوط حرکت کنه...  در صورتی که دو سنسور همزمان سطح تیره یا روشن سنس کنند هردو موتور حرکت می کنند تا ربات مستقیم بره!

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

+ نوشته شده توسط نیما در پنجشنبه هجدهم اسفند 1384 و ساعت 12:3 |

سلام بچه ها، ببخشید که یکم دیر میام! آخه کارم یه جورایی گیر کرده و اذیت می کنه! امروز هم فقط اومدم چندتا نکته مهم (سوتی های خودم) رو بگم و بعد هم به چندتا از سوالات دوستان که خیلی لطف داشتند جواب بدم و یه کتاب جدید به معرفی کتاب اضافه کنم و ....

از سوتی پست قبل شروع می کنیم که در اون بعد از شرطهای IF که صفر یا یک بودن پین صفر پورت سی رو چک میکرد  و بعد می خواستیم به تناسب اون پین ۱ همون پورت رو صفر یا یک کنیم، من این کار رو با کد Pinc.1=1/0  انجام داده بودم درصورتی که اینکار اشتباه هست و باید از Portc.1=1/0 استفاده کرد. از PinX.Y برای خواندن مقدار دریافتی از پین استفاده می کنیم. این خطا رو BASCOM با پیام "You can not write to pin register" نمایش میده... باز هم معذرت

دومین سوتی برمیگرده به چند پست قبل که مربوط بود به مدار سنسورها! در تصویر مدار من خروجی سنسور رو هم به ۵ولت وصل کرده بودم که دیگه انگار مدار ما هیچ خروجی برای وصل کردن به میکرو نداشت! پس تا زمانی که من تصویر رو تصحیح کنم مواظب باشید اشتباه نکنید... (دست فرزاد جان درد نکنه که این دوتا سوتی رو اونم گوشزد کرده بود! اما از این به بعد هرکی سوتی بگیره جایزه داره!!!! )

راستی در مدار رگولاتور می تونید بجای استفاده از دو خازن ۱میکروفارادی در قسمت ورودی و خروجی، از دوخازن ۱۰۰۰میکروفارادی و ۱۰۰نانوفارادی به صورت موازی فقط در خروجی استفاده کنید. اینکار نویزهای خروجی رگولاتور رو تا حد زیادی فیلتر میکنه! البته مدار قبلی کارمون رو راه میندازه اما در بعضی پروژه های حساس ممکنه باعث خلل بشه....

 

نقل از فرزاد:
وقتی برای برنامه End گذاشتی دیگه چرا حلقه هم استفاده کردی؟

گفتیم که END به معنای پایان برنامه هست و برای جلوگیری از حرکت اشاره گر برنامه به قسمتهای دیگر حافظه میکرو استفاده مشه. ما حلقه رو استفاده کردیم تا کد بین اون بینهایت بار تکرار بشه و دائما ورودی پین ۰ چک بشه و خروجی به پین ۱ فرستاده بشه. اگر حلقه نمی گزاشتیم که فقط یکبار این کار انجام میشد و نتیجه دلخواه رو نمی گرفتیم! اما اگر سوالت اینجوری بود "وقتی از حلقه استفاده کردی دیگه چرا END گزاشتی؟" قابل قبول بود چون اشاره گر برنامه هیچوقت از حلقه خارج نمی شد تا به قسمتهای دیگه حافظه بره! اما در اون صورت هم باید قواعد برنامه نویسی رو رعایت کنیم و END رو بزاریم! (حالا اگه شده برا قشنگی)

نقل از فرزاد:
سر آند رو باید به میکرو و سر کاتد رو به زمین وصل کنی. و گر نه دیود به جای اینکه خاموش شه کم نور میشه!

اینطور قرار داد شده که بهتره همیشه سر منفی مصرف کننده تون رو بواسطه مقاومت مناسب به پینهای میکرو نصب کنید تا با صفر شدن پین جریان در مدار ایجاد بشه.... کم نور شدن دیود بخاطر رعایت نشدن قوانین دیود در مدار شماست! (فکر می کنم اختلاف پتانسیل دو سر دوید باید حداقل ۲ولت باشه تا به طور عادی روشن بشه!) در اینباره با فرزاد بیشتر بحث میکنم :)

نقل از علی:
کمتر کتاب میکروکنترلرهای avr نوشته علی کاهه رو بخون

 علی آقا باید بگم منظور شما رو خوب فهمیدم! اما من هرجایی که به طور صریح از مطالب این کتاب استفاده کردم بدون شک منبعش رو هم ذکر کردم دقیقا یکی رو مورد رو الان تو خاطرم هست.. یه مدتی این کتاب یکه تازی میکرد و من هم خیلی از مطالبی رو که از AVR میدونم از این کتاب یادگرفتم اما قرار نیست کدهایی رو که خودم می نویسم رو هم به دلیل شباهت، به این کتاب رفرنس بدم!!! پس تمام مهندس ها هم باید هرکاری میکنن اسم استاداشون رو زیرش بنویسن ها؟

بقیه سوالات یا درخواستهای شخصی بوده یا اینکه به صورت خصوصی جواب داده شدند! منتظر نظرات و سوالات شما هستم. برام دعا کنید  تا منم زود إ زود برگردم........

+ نوشته شده توسط نیما در جمعه دوازدهم اسفند 1384 و ساعت 13:15 |
دوستان خوبم سلام. یواش یواش داریم به شروع مسابقات رباتیک مختلف از جمله حلی کاپ، رباتهای شهری و مسابقات دانشجویی و دانش آموزی مشهد نزدیک میشیم و شوروحال عجیبی بین شرکت کننده ها و علاقمندان رباتیک راه افتاده!! بعضی از دوستان لطف کرده بودن و حتی سوالاتشون رو از من پرسیده بودند. من هم تصمیم گرفتم یه بخش معرفی کتاب تو وبلاگ راه بندازم و کتابهای مفید در این زمینه که حتی می تونه جوابگوی خیلی از سوالات من و شما باشه رو معرفی و لینک دانلودشون رو قرار بدم. اولیش رو که ملاحضه می کنید (یکم پایین تر سمت راست). منتظر کتابهایی در مورد مکانیک، الکترونیک و ... ربات هم باشید.

اما آموزش های خودمون رو پی میگیریم با یه بخش مقدماتی دیگه که مربوط میشه به گرفتن خروجی سنسورها و تصمیم گیری بر مبنای این خروجی. اینم کد کامل و توضیح بخش به بخش:

$crystal = 1000000
$regfile = "m32def.dat"

Config Pinc.0 = Input
Config Pinc.1 = Output

Dim Sensor As Byte

Do
   Sensor = Pinc.0
   If Sensor = 1 Then
      Pinc.1 = 1
   Else
      Pinc.1 = 0
   End If
Loop

End

کارکرد این کد:  همونطور که گفتم در این کد قصد داریم از پینهای میکرو به عنوان ورودی ۰ یا ۱ استفاده کنیم و بر اساس ۰ یا ۱ بودن اون نتیجه گیری کنیم. شما باید سر خروجی یکی از سنسورهاتون رو که مدارش رو در پست شماره 14 و 15 گذاشتم به واسطه یک مقاومت قرمز-قرمز-نارنجی، به پین ۰ از پورت C میکرو تون وصل کنید سپس سر کاتد یک LED ساده رو (پایه کوتاهه کاتد و بلنده آند هستش) بواسطه یک مقاومت نارنجی-نارنجی-نارنجی به پین ۱ از پورت C میکرو و سر آند اون رو مستقیما به ۵ ولت وصل کنید تا بتونیم به این طریق ورودی و خروجی های این برنامه رو شبیه سازی کنیم.

Config Pinc.0 = Input
Config Pinc.1 = Output

گفتیم که از Config PortX = Input/Output برای پیکربندی پورت به عنوان ورودی یا خروجی استفاده می کنیم. اما می توانیم هر کدام از پینهای یک پورت را هم به صورت جدا گانه به عنوان ورودی یا خروجی پیکربندی کنیم. فرمت کلی آن به صورت Config PinX.Y = Input/Output هستش و نمونه اون رو هم که در کد بالا ملاحضه می کنید. در اینجا پین ۰ از پورت C به عنوان ورودی و پین ۱ از همان پورت خروجی معرفی شده. ما سنسورمان را به پین ۰ که  ورودی است وصل کردیم و LED  رو هم به پین ۱ که خروجی است وصل نمودیم.

Dim Sensor as Bit
Do
 Sensor = Pinc.0
 ...
Loop

در پست قبل گفتم از کلمه Dim برای معرفی متغییر استفاده میشه در اینجا متغیر Sensor از نوع Bit معرفی شده (بیت فقط می تواند ۰ یا ۱ باشد). کاربرد حلقه Do...Loop رو هم در پست قبل گفتم. اما کد میانی در واقع مقدار گرفته شده از Pinc.0 که به سنسور متصل است را در متغیر Sensor قرار می دهد. اگر جسم سفیدی مقابل پک سنسورها قرار دهیم این مقدار ۰ و اگر جسم تیره استفاده کنیم این مقدار ۱ خواهد بود. درست مثل حالتی که خط سیاهی روی زمینه سفید داریم (یاد مسابقات رباتیک افتادم )

   If Sensor = 1 Then
      Pinc.1 = 1
   Else
      Pinc.1 = 0
   End If

در بیسیک با استفاده از IF (expression) Then عبارات شرطی درست می کنیم که Expression همان شرت ماست. در اینجا می گوییم اگر Sensor مساوی ۱ بود یعنی جسم سیاهی مقابل سنسورمان بود کد بعد از Then را که Pinc.1=1 است را اجرا کن! این کد در واقع مقدار ۱ را به پین ۱ از پورت C میکرو ارسال می کند. در واقع این کار باعث خاموش شدن LED متصل به این پین می شود. کلمه Else نیز از موارد اختیاری عبارت شرطی است بدین معنا که اگر شرط برقرار نبود کد بعد از Else را اجرا کن. در این شرط ۱ بودن متغییر سنسور بررسی می شد، اگر یک نبود (یعنی ۰ بود) کد Pinc.1=0 اجرا می شود. اینکار باعث روشن شدن LED ما خواهد شد.

امیدوارم میکروتون رو با این کد پروگرام کنید و از نتیجه حاصله هرچند پیش پا افتاده لذت ببرید! (من که  هنوزشم خیلی لذت می برم). نمی دونم چطور توضیح میدم! خوب یا بد؟ لطفا بهم بگید که اصلا متوجه میشید و استفاده می کنید یا نه؟ منتظر نظر شما هستم. پس تا پست بعد خدانگهدار

+ نوشته شده توسط نیما در یکشنبه هفتم اسفند 1384 و ساعت 14:36 |

سلام. امروز (البته الان شبه ) می خوام ادامه کدی رو که تو پست قبل داشتیم رو تحلیل کنم:

Do
  'some code
Loop

حتی اگر مقدار کمی هم برنامه نویسی (حتی نه به زبان بیسیک) بلد باشید، در این قسمت هیچ احتیاجی به توضیح نخواهید داشت. اما برای دوستانی که آشنایی کافی ندارن حتما باید بگم که هر کدی که بین دو کلمه Do و  Loop قرار میگیره به صورت حلقه از بالا به پایین به صورت مکرر تکرار میشه. البته در استفاده از این دستور میشه شرایطی تعیین کرد که درصورت لزوم از حلقه بی پایان خارج شد ولی ما در اینجا به این حلقه بی پایان احتیاج داریم و دلیلش رو هم بعد از توضیح کد بین اون خواهید فهمید.
راستی یادتونه که در بیسیک هر متنی که بعد از علامت " ' " قرار میگیره به عنوان توضیحات محصوب میشه. شما میتونید در قسمتهای مختلف کدتون از توضیحات استفاده کنید تا اگر کدتون طولانی شد یا اون رو به بقیه دادید در فهمش دچار مشکل نشید.

Rotate A , Left

شاید ندونید که در بیسیک (وبعضی زبانهای دیگه) میشه از توابع و رویه ها بدون حضور پرانتز استفاده کرد! در این کد هم در واقع Rotate یک دستور یا رویه هستش که در اینجا ۲ مقدار ورودی A و Left رو به اون دادیم که بعد از توضیح کار این دستور دلیل استفاده ازا ین ۲ مقدار رو به عنوان ورودی خواهم گفت. از تابع برای چرخاندن تمام بیتهای یک متغیر به سمت راست یا چپ استفاده میشه...  خوب یادتون هست که A رو به عنوان یک متغیر از نوع بایت معرفی کردیم و اون رو برابر با مقدار دودویی B۱۰۰۰۱۰۰۰ (یا معادل دهدهی ۱۳۶) قرار دادیم. پارامتر اول این دستور نام متغیر برای چرخاندن بیتهاش هست و پارامتر دوم یک مقدار LEFT یا RIGHT هستش به معنی چرخش بیتها به سمت چپ یا راست، هستش. در اینجا دستور Rotate باعث چرخش بیتهای A به سمت چپ و تبدیل مقدار اون به B0010001 (معادل دهدهی ۶۸) میشه. اگر توجه کنید می بینید که با استفاده از این دستور هیچ بیتی از بین نمیره! بلکه همه بیتها به چپ یا راست می چرخن. دلیل این کار رو در توضیح کد پایین ملاحضه کنید.

Portb = A

یادتون هست که پورت b رو به عنوان خروجی معرفی کردیم در این مرحله مقدار خروجی اون رو مشخص می کنیم. دونستیم که هر پورت دارای ۸ پین هست که میشه با اونها مثل ۸ بیت یا در کل با یک پورت مثل یک بایت رفتار کرد. در اینجا هم پورت بی رو مساوی متغیر A که اون هم از نوع بایت هست قرار می دیم. چون متغیر A حاوی مقدار B00010001 بود بنابراین پینهای شماره ۱،2،۳،۵،۶ و ۷ پورت، صفر و پینهای شماره ۰ و ۴ ، یک خواهند شد. 
در دوخط بعد نیز اتفاقات بالا عینا برای متغیر B و پورت سی اتفاق میافتد. اما در خط بعد داریم:

Waitms 15

Waitms هم یک دستور یا رویه می باشد که به اندازه مقدار ورودی اش برحسب میلی ثانیه در اجرای برنامه وقفه ایجاد خواهد کرد. مقدار ۱۵ برای تاخیر ۱۵ میلی ثانیه ای در این کد است.

در خطهای بعد هم Loop که نماد پایان حلقه و End که قبلا گفتیم نماد پایان برنامه می باشد را داریم اما ببینیم کدهای داخل حلقه چه عملی را انجام می دهند و علت استفاده از انها چیست؟

طبق جدولهای پست شماره 19 دیدم که چه بیتهایی را باید پشت سر هم به سیمهای موتور القا کنیم با کمی تامل در کد بالا هم میبینیم که با چرخاندن بیتهای دو متغیر A و B در واقع مدل یک بیتی راه اندازی موتورهای پله ای را شبیه سازی کرده ایم. شما می توانید با وصل کردن ۴ پین اول پورت b و c به آیسی درایور همانند شکل پست شماره 20 باعث چرخش موتور متصل به پورت b در خلاف جهت ساعت و موتور متصل به پورت c در جهت ساعتگرد شوید.
همچنین با کم کردن مقدار تاخیر در دستور Waitms می توانید باعث افزایش سرعت چرخش شوید. البته توجه کنید این تاخیر را تا حدی معینی می توان کم کرد (۳ یا ۴ میلی ثانیه) و کم کردن بیش از حد آن به دلیل گشتاور مشخص موتور نتنها باعث افزایش سرعت نمی شود بلکه مانع از استارت موتور و در نتیجه چرخش آن خواهد شد.

نکات خیلی زیادی باقی موند که بخاطر محدودیت های متعدد حداقل تو این پست که موفق به ذکرشون نشدم. اما شما با امتحان کردن این کد و راه اندازی موتورتون مطمئنا این نکات رو به صورت عملی تجربه خواهید کرد.

موفق باشید

+ نوشته شده توسط نیما در چهارشنبه سوم اسفند 1384 و ساعت 0:40 |