در این پروژه دو عدد موتور پله ای به صورت مجزا از طریق دو پورت سریال کامپیوتردر حالت دو بیتی راه اندازی می شود.موقعیت دقیق موتور توسط برنامه ای که به زبان ویژوآل بیسیک نوشته شده با ارسال پالسهای دیجیتال (0و1) به پایه های 1و2 آیسی ULN2803 برای موتور اول و پایه های 5 و 6 همان آیسی برای موتور دوم کنترل می شود موتور پله ای که در این پروژه استفاده شده چهار قطبی می باشد
    

وسایل مورد نیاز

ابزار مورد نیاز

1-کامپیوتر
2-برد بورد
3-سیم تلفنی
4-منبع تغذیه یا باطری 12VDC(منظور از DC همان ولتاژ ثابت است)
5-هویه
6-سیم لحیم
7-فایلهای DLL

قطعات مورد نیاز

1-دو عدد موتور پله ای
2-دو سوکت RS232
IC ULN2803-3

روش کار


میزان ولتاژ قابل تحمل آیسیULN2803 تا حدود 50ولت میباشد.پایه های 1 تا 8 این آیسی ورودی وپایه های 18 تا 11 خروجی هستند.پایه 10 تغذیه و پایه 9 منفی آیسی است.میزان جریان قابل تحمل این آیسی حدود 500 میلی آمپر است. اگر به شکل این آیسی نگاه کنید متوجه یک نیم دایره کوچک در وسط یکی از عرضهای آن می شوید اگر این نیم دایره را پیدا کردید سمت چپ آن شروع پایه های آیسی از 1 می شود.


img/daneshnameh_up/d/da/uln2803.jpg

img/daneshnameh_up/1/1c/2803.gif

در هنگام شروع به کار با منبع تغذیه در صورتیکه منبع تغذیه هر دو حالتAC, DC (منظور از AC همان ولتاژ متغیر است مثل برق شهر) داشته باشد حتما آنرا روی حالت DC قرار دهید و کلید تنظیم مربوط به ولتاژ را تا حدی بچرخانید که صفحه نمایش 12vرا نمایش دهد.خروجی مثبت ومنفی منبع تغذیه یا باطری 12vDCرا مطابق شکل انتهای صفحه بر روی برد بورد قرار دهید
البته فعلا آنرا خاموش کنید.
پایه 9 آیسی را به قطب منفی که از باطری یا منبع تغذیه آورده اید وصل کنید و پایه 10 آیسی را به قطب مثبتی که از باطری یا منبع تغذیه آمده است وصل کنید

روش اتصال سیمهای سوکت RS232

اگر به دو عدد سوکت RS232 که تهیه کرده اید به خوبی نگاه کنید متوجه یک سری شماره از 1 تا 9 روی آن می شوید این شماره ها در واقع همان شماره پینهای مربوط به ارسال و دریافت هستند در این پروژه ما به 3 پین احتیاج داریم پینهای 4و5و7 پین 4 DTR پین 5 GND پین 7 RTS پین 5 در واقع زمین ما در ارسال ودریافت استانداردRS232 است که می بایست به قطب منفی که از منبع تغذیه یا باطری به روی برد بورد آورده ایم وصل کنید.برای اتصال این پینها بر روی برد بورد پیچهای مربوط به این سوکتها را باز کرده واز سیمهای تلفنی که در اختیار دارید حدود سه تکه 30سانتی متری بسته به فاصله کامپیوتر تا میز کار ببرید.حال با استفاده از هویه و سیم قلعی که تهیه کرده اید این سیمها را به پینهای سوکت RS232 وصل کنید در هنگام لحیم کردن به شماره پینها دقت کنید و برای اینکه بعدا مشکلی پیش نیاید بهتر است برای هر پین یک سیم رنگی مجزا در نظر بگیرید.حال DTR را که پین 4 است و آنرا به یک تکه سیم لحیم کرده اید به پایه شماره 1 آیسی و RTS را که پین 7 میباشد و آنرا نیز لحیم کرده اید به پایه 2 آیسی بر روی برد بورد قرار دهید.ضمننا همانطور که گفته شد حتما پین 5 را نیز لحیم کرده و به منفی روی برد بورد وصل کنیر.
از پایه 18 آیسی که خروجی پایه 1 آیسی است به پایه 3 آیسی و از پایه 17 آیسی که خروجی پایه 2 آیسی است به پایه 4 آیسی وصل کنید
img/daneshnameh_up/2/2f/9_pin.jpg

table img/daneshnameh_up/c/ce/9_PIN_PIN_OUT.gif



نحوه اتصال موتور پله ای بر روی بورد


حال به سراغ موتور پله ای می رویم به سیمهای رنگی که از موتور پله ای بیرون آمده نگاه کنید هر کدام از این سیمهای رنگی به سر یک قطب موتور پله ای اتصال دارد.و این سیمها را در اصطلاح سیمها پالس می نامیم ویک سیم در واقع گراند یا مشترک هم سیمها است.در هنگام خرید موتور پله ای از فروشنده رنگ سیم گراند یا مشترک را سوال کنید.این سیم در این پروژه می بایست به قطب مثبت برد بورد وصل شود.در حالتیکه چرخش موتور تمام شده وکارتان را انجام داده ایدمی بایست اتصال این سیم را با قطب مثبت برد بورد قطع کنید وگرنه این ولتاژ روی موتور می ماند وچون موتور حرکتی ندارد به شدت گرم می شود.به غیر از سیم مشترک که به قطب مثبت وصل کرده اید بقیه سیمها را به ترتیب به پایه های 18و17و16و15 آیسی وصل کنید.

برای اینکه موتور پله دوم را نیز راه اندازی کنید سیم مشترک این موتور پله را نیز مانند موتور پله اول به مثبت برد بورد وصل کنید.وسوکت RS232 دومی را که سه عدد سیم مانند سوکت اولی به آن لحیم کرده اید پین 4 یا DTR را به پایه 5 آیسی و پین 7 یا RTS را به پایه 6 آیسی وصل کنید . از پایه 14 آیسی که خروجی پایه 5 در این آیسی است به پایه 7 آیسی و از پایه 13 که خروجی پایه 6 است به پایه 7 آیسی وصل کنید سیمهای دیگر موتور پله ای که سیمهای پالس نامیده می شود به پایه های 14و13و12و11 وصل کنید.
حال 2 عدد سوکت RS232 را یکی به COM1,دیگری را به COM2 وصل کنید.وبه همان ترتیبی که گفته شد روی بورد قرار دهید.
حال بعد از انجام مراحل فوق دو برنامه زیر را اجرا کنید وقبل از اینکه شروع را بزنید منبع تغذیه را روشن کنید.می بایست اتصال منبع تغذیه با برد بورد قطع باشد. پس از تنظیم ولتاژ بر روی 12v dc همانطور که گفته شدآنرا به برد بورد اتصال دهید.

نرم افزارهای لازم

فایلهای DLL


برای اجرا کردن این این برنامه میبایست یک سری فایل DLL را در دایرکتوری SYSTEM ویندوز کپی کنید.


Source

برنامه کنترل موتور پله ای


دراین برنامه از دو پورت سریال (COM) استفاده شده است شما می توانید هر دو برنامه را با هم اجرا کنید یا هر کدام را به صورت مجزا دقت داشته باشید

در صورتیکه شما برنامه مربوط به پورت سریال 1 را اجرا کنید.والمان دیگری مثل موس (Mouse) در این پورت باشد با پیغامی تحت عنوان پورت در دسترس نیست مواجه می شوید .این امر در مورد پورت 2 نیز صادق است.دقت داشته باشید این برنامه در ویندوز های با FAT32 اجرا می شود.
حال نحوه کد نویسی برنامه را با هم بررسی میکنیم

کد نویسی بدنه اصلی برنامه

به سراغ Private Form Load در خط 52 میرویم. .پارامترهای داخل این عبارت
اشاره به مسایلی میکند که در هنگام اجرای اولیه برنامه Load می شوند. با یک دستور شرطی If اگر پورت سریال در اتصال به چیز دیگری مثل موس باشد با ارسال پیغام COM unavailabld کاربر را از این قضیه مطلع می سازد. در این قسمت همچنین دو عبارت DTR,RTS را مشاهده می کنید .اینها بیتهای ارسال RS232 هستند که در هنگام Load برنامه هر دو مقدار یک را دارند. اگر در هنگام Load برنامه تغذیه آیسی و موتور پله ای وصل باشد متوجه حرکت کوچکی در موتور پله ای می شوید.که این به خاطر مقدار دهی DTR,RTS در هنگام Load برنامه است .
در قسمت Private Command1_Clickدو متغییر i,U با مقادیر وارد شده توسط کاربر مقداردهی می شو ند. یکی مربوط به تعداد پله ودیگری مربوط به شمارش پله موتور پله ای
پس از اجرا متوجه می شوید text مربوط به تعداد پله غیر فعال است .با کلیک بر روی Check Box بالای تعداد پله این text فعال می شود وشما مثلا در آن عدد 1000 را وارد کنید وسپس کلید شروع را بزنید. شمارش پله بعد از هر 30میلی ثانیه (30 میلی ثانیه در واقع فاصله بین هر پالس است.این عبارت در ُسابروتین Output قرار دارد وشما می توانید فاصله پالسها وسرعت موتور پله ای را با تغییر این پارامتر مطابق میل خودتان تنظیم کنید) یکی یکی اضافه می شود تا به مقدار 1000 که مقدار تعیین شده درtext تعدادپله توسط شما است برسد .در این پروژه تعداد دورهای موتور پله ای نیز در صورت تمایل شما با فعال کردن Check Box سمت راست بالای صفحه هم به صورت نهایی و هم به صورت لحظه به لحظه نشان داده می شود.پس از توضیح خلاصه از نحوه عملکرد برنامه سراغ کلید شروع می رویم .در انتهای سابروتین مربوط به Command1
در خط 27 به سابروتین Output اشاره شده است.در این سابروتین در خط 58 با رستور While بر خورد می کنید.
در دستور While گفته شده تا زمانیکه مقدار تعداد پله با شمارش پله یکی نشده در حلقه While بمان و آنقدر مقدار شمارش پله را کم وزیاد بکن تا به مفدار تعدادپله برسد.فا صله زمانی بین هر دو پالس نیز در دستور While TimeREADدر خط 71 وجود دارد.دراین کد برنامه هر بار که مقدار تعداد پله با شمارش آن متفاوت باشد
به آن مقدار یک را اضافه می کند.سپس باقیمانده تقسیم صحیح شمارش پله بر عدد 4 را در متغییر Phase می ریزد. و بر حسب اینکه این حاصل تقسیم 0و1و2و3 باشد به سابروتینهایPhase 1,Phase 2,Phase3 Phase 4 میرود.ودر اینجا بیتهای DTR,RTS را یک و صفر می شوند.البته این نحوه 0و1 کردن بیتها بر مبنای تحریک دوبیتی سیم پیچهای موتور پله ای است .که می بایست در هر لحضه دو سیم پیچ به توالی 1و0 شوند بقیه کد های برنامه بسیار ساده است .وتنها جهت آموزشی شدن برنامه ارایه شده است مثل برنامه نویسی محاسبه تعداد دور یا حرکت عکس موتور پله ای در حالت عکس حرکت موتور پله ای که کد آن در خط 30 وجود دارد مقادیر شمارش پله با مقادیر حرکت پله جابجا می شود.در این حالت موتور در حالت عکس حرکت فعلیش می چرخد.شما به جای RTS می توانید از TXD نیز استفاده کنید.
در ضمن زمانیکه دکمه توقف را کلیک کنید.پورت سریال مربوطه بسته می شود.وبا صفر کردن مقادیر U,i شما حتی در حالت نرم افزاری هم متوقف می شوید.کد این قسمت از برنامه در خط
جهت اجرا کردن این برنامه در کامپیوتر کدهای DLL مورد نیاز این برنامه را در دارکتوری system ویندوز کپی کنید.


  1:  
  2:  
  3:  
  4:  Private Sub Check1_Click()
  5:   If Check1.Value = 1 Then
  6:      Text3.Enabled = True
  7:   Else
  8:      Text3.Enabled = False
  9:   End If
 10:  End Sub
 11:  
 12:  Private Sub Check2_Click()
 13:   If Check2.Value = 1 Then
 14:       Label15.Caption = Left((Text1.Text * Text3.Text) / 360, 6)
 15:   Else
 16:      Label15.Caption = "تعداد دور"
 17:   End If
 18:  End Sub
 19:  
 20:  Private Sub Command1_Click()
 21:   i = Val(Text3.Text)
 22:   U = Val(Text6.Text)
 23:   If Check2.Value = 1 Then Label15.Caption = Left((Text1.Text * Text3.Text) / 360, 6)
 24:   OPENCOM ("COM2:9600,N,8,1")
 25:   If i = U Then MsgBox "جهت حرکت موتور پله ای مقدار تعداد پله را متفاوت با شمارش پله وارد کنید", vbInformation
 26:   Text7 = Text1
 27:   Output
 28:  End Sub
 29:  
 30:  Private Sub Command2_Click()
 31:   If Command1.Caption = "مستقیم" Then
 32:      Command1.Caption = "معکوس"
 33:      Z = Text3.Text
 34:      Text3.Text = Text6.Text
 35:      Text6.Text = Z
 36:      Call Command1_Click
 37:   Else
 38:      
 39:      Z = Text6.Text
 40:      Text6.Text = Text3.Text
 41:      Text3.Text = Z
 42:      Call Command1_Click
 43:  End If
 44:  End Sub
 45:  
 46:  Private Sub Command3_Click()
 47:   CLOSECOM
 48:   U = 0
 49:   i = 0
 50:  End Sub
 51:  
 52:  Private Sub Form_Load()
 53:   i = 0: U = 0
 54:   DTR 1
 55:   RTS 1
 56:  End Sub
 57:  Sub Output()
 58:   While i <> U
 59:      If Check2.Value = 1 Then Label16.Caption = Left((Text6.Text * Text7.Text) / 360, 5)
 60:      If Check1.Value = 1 Then Check1.Enabled = True
 61:      If i > U Then U = U + 1
 62:      If i < U Then U = U - 1
 63:      Text6.Text = Str$(U)
 64:      Phase = U Mod 4
 65:      If Phase < 0 Then Phase = Phase + 4
 66:      If Phase = 0 Then Phase1
 67:      If Phase = 1 Then Phase2
 68:      If Phase = 2 Then Phase3
 69:      If Phase = 3 Then Phase4
 70:      TIMEINIT
 71:      While TIMEREAD < 30
 72:       DoEvents
 73:      Wend
 74:    Wend
 75:  End Sub
 76:  Sub Phase1()
 77:   DTR 1
 78:   RTS 1
 79:   Text4.Text = "1"
 80:   Text5.Text = "1"
 81:   End Sub
 82:  Sub Phase2()
 83:   DTR 1
 84:   RTS 0
 85:   Text4.Text = "1"
 86:   Text5.Text = "0"
 87:   End Sub
 88:  Sub Phase3()
 89:   DTR 0
 90:   RTS 0
 91:   Text4.Text = "0"
 92:   Text5.Text = "0"
 93:  End Sub
 94:  Sub Phase4()
 95:   DTR 0
 96:   RTS 1
 97:   Text4.Text = "0"
 98:   Text5.Text = "1"
 99:  End Sub
100:  
101:  Private Sub Form_Unload(Cancel As Integer)
102:   CLOSECOM
103:  End Sub





کد نویسی Module برنامه

در قسمت module برنامه از فایلهای API ویندوز استفاده شده است .فایلهای API در واقع فایلهای برنامه ویندوز است .که برنامه نویس ها جهت بالا بردن کارایی برنامه از آن در برنامه های خود استفاده می کنند.
نحوه معرفی کردن API در هر زبان برنامه نویسی متفاوت است .در زبان ویژوآل بیسیک نحوه معرفی API به صورت زیر است.
بعد از عبارت Declare Function نام تابع API , پس از آن عبارت Lib می آوریم.Lib بیانگر کتابخانه ای است که این فایل dll در آن وجود دارد پس از آن نوع متغییر ورودی یا خروجی بودن آن مشخص می شود.


  1:  
  2:  
  3:  Declare Sub CLOSECOM Lib "Port" ()
  4:  Declare Sub SENDBYTE Lib "Port" (ByVal b%)
  5:  Declare Function READBYTE Lib "Port" () As Integer
  6:  Declare Sub DTR Lib "Port" (ByVal b%)
  7:  Declare Sub RTS Lib "Port" (ByVal b%)
  8:  Declare Sub TXD Lib "Port" (ByVal b%)
  9:  Declare Function CTS Lib "Port" () As Integer
 10:  Declare Function DSR Lib "Port" () As Integer
 11:  Declare Function RI Lib "Port" () As Integer
 12:  Declare Function DCD Lib "Port" () As Integer
 13:  Declare Sub DELAY Lib "Port" (ByVal b%)
 14:  Declare Sub TIMEINIT Lib "Port" ()
 15:  Declare Sub TIMEINITUS Lib "Port" ()
 16:  Declare Function TIMEREAD Lib "Port" () As Long
 17:  Declare Function TIMEREADUS Lib "Port" () As Long
 18:  Declare Sub DELAYUS Lib "Port" (ByVal l As Long)
 19:  Declare Sub REALTIME Lib "Port" (ByVal i As Boolean)
 20:  Declare Sub OUTPORT Lib "Port" (ByVal A%, ByVal b%)
 21:  Declare Function INPORT Lib "Port" (ByVal p%) As Integer
 22:  Declare Function JOYX Lib "Port" () As Long
 23:  Declare Function JOYY Lib "Port" () As Long
 24:  Declare Function JOYZ Lib "Port" () As Long
 25:  Declare Function JOYW Lib "Port" () As Long
 26:  Declare Function JOYBUTTON Lib "Port" () As Integer
 27:  Declare Function SOUNDSETRATE Lib "Port" (ByVal Rate%) As Integer
 28:  Declare Function SOUNDGETRATE Lib "Port" () As Integer
 29:  Declare Function SOUNDBUSY Lib "Port" () As Boolean
 30:  Declare Function SOUNDIS Lib "Port" () As Boolean
 31:  Declare Sub SOUNDIN Lib "Port" (ByVal Puffer$, ByVal Size%)
 32:  Declare Sub SOUNDOUT Lib "Port" (ByVal Puffer$, ByVal Size%)
 33:  Declare Function SOUNDGETBYTES Lib "Port" () As Integer
 34:  Declare Function SOUNDSETBYTES Lib "Port" (ByVal b%) As Integer
 35:  Declare Sub SOUNDCAPIN Lib "Port" ()
 36:  Declare Sub SOUNCAPDOUT Lib "Port" ()



module فوق یک module کلی است.و در خیلی از برنامه های دیگر جواب می دهد.برای این برنامه شما میتوانید از module زیر که ساده شده module فوق می باشد استفاده کنید.همانطور که ملا حظه می کنید تنها از فایل API مربوط به باز کردن وبستن پورت وبیتهای DTR,RTS وعبارات مربوط به فاصله زمانیها استفاده شده است

  1:  
  2:  Declare Function OPENCOM Lib "Port" (ByVal A$) As Integer
  3:  Declare Sub CLOSECOM Lib "Port" ()
  4:  Declare Sub DTR Lib "Port" (ByVal b%)
  5:  Declare Sub RTS Lib "Port" (ByVal b%)
  6:  Declare Sub DELAY Lib "Port" (ByVal b%)
  7:  Declare Sub TIMEINIT Lib "Port" ()
  8:  Declare Sub TIMEINITUS Lib "Port" ()
  9:  Declare Function TIMEREAD Lib "Port" () As Long
 10:  Declare Function TIMEREADUS Lib "Port" () As Long
 11:  Declare Sub DELAYUS Lib "Port" (ByVal l As Long)