| บทนำ
เนื่องจากเวปไซด์ไทยไอโอมุ่งเน้นในเรื่องการเขียนโปรแกรมควบคุมการทำงานกับพอร์ตคอมพิวเตอร์
แต่ยังไม่ได้ทำเป็นโครงงานเพื่อให้เข้าถึงจุดหมายของการเรียนรู้ด้านการใช้คอมพิวเตอร์ติดต่อฮาร์ดแวร์
จึงเป็นที่มาของโครงงานแรก
ที่ง่ายๆไม่ยากครับ
พื้นฐานการควบคุมสเต็ปมอเตอร์
โดยใช้สเต็ปมอเตอร์ 2 เฟส
ดังรูปที่1
และใช้วงจร
สวิทช์ด้วยโซลิสสเตทรีเลย์กับทรานซิสเตอร์เป็น
ชุดไดรเวอร์โดยมีแหล่ง
จ่ายไฟกระแสตรง
9.6 V กระแส 0.4 A โดยผมนำรูปเพื่อความเข้าใจ
รูปที่2
จากที่เคยได้นำเสนอหลักการทำงานของ
Step Motor (คลิกเพื่อดูทบทวน)
มาแล้วนั้นเพื่อให้เห็น
ภาพยิ่งขึ้นประกอบกับพื้นฐานการเขียนโปรแกรมติดต่อพอร์ตที่ได้นำเสนอมาแล้ว
เราจึงเลือกโครงงานนี้
อีกทั้งอุปกรณ์ก็หาซื้อง่าย
ในโครงงานนี้ไม่จำเป็นต้องใช้
Card I/O 8255
ตามที่เราทดลองก็ได้
มาไปใช้ Printer Port
แทนก็ใช้งานได้เหมือนกัน
|
รูปที่1
แสดงเนมเพจของสเต็ปมอเตอร์

รูปที่
2 แสดงภาพโดยรวมของ PC Interface Hardware
จากรูปที่3
และ รูปที่ 4
เราได้นำสายสัญญาณ Input/Output
ของCard I/O 8255
โดยใช้สายแพรและไปเข้าที่
Input ของวงจรทรานซิเตอร์ไดร์เวอร์
เพื่อจะนำสัญญาณไปทริกขาของ
โซลิสเตทรีเลย์ให้ทำงานจากนั้นโซลิสเตท
จึงจะจ่ายกระแสไปทริกขาของทราน
ซิสเตอร์อีกที
ที่ต้องทำเช่นนี้เพราะว่า
ขดลวดของสเต็ปมอเตอร์จะสร้าง
สัญญาณรบกวนกับมาที่วงจรและอาจส่ง
ผลต่อพอร์ตของ PC
ที่ทำวิธีนี้เรียกว่า
การแยกกราวด์ของวงจรนั้นเอง
จากนั้นเรานำจุดต่อของขาทรานซิสเตอร์ที่จะคอยสวิทช์และจ่ายไฟ
9.6 V 0.4 A ของแหล่งจาก
ไปให้กับขั้วของสเต็ปมอเตอร์ในแต่ละขั้วซึ่งจะทำงานเรียงตามลำดับหรือในที่นี้เราเขียนโดยใช้
หลักการแบบเวฟซึ่งก็เขียนโปรแกรมสั่งใช้
Parallel Port
สั่งค่าออกไปที่พอร์ตตั้งแต่
บิต 1 - 4 จะใช้เรียงจาก4บิตล่างหรือ
4บิตก็ได้ทั้งนี้ขึ้นอยู่ที่เราเขียนโปรแกรมควบคุมนั้นเอง
|

รูปที่
3
แสดงการต่อสายเข้ากับสเต็ปมอเตอร์

รูปที่
4
แสดงตำแหน่งของการต่อสายในส่วนต่างๆ

รูปที่
5 การจัดวางอุปกรณ์
จากรูปที่
5 เราสามารถสรุป
จากตำแหน่งของอุปกรณ์,ชื่อ,หน้าที่,จำนวนที่ใช้
เป็นตารางได้ดังนี้
| หมายเลข |
ชื่ออุปกรณ์ |
หน้าที่ |
จำนวน |
| 1 |
โซลิสสเตทรีเลย์
4N28K616 |
สวิทช์โดยรับสัญญาณมาจากพอร์ต
ของ Card 8255 4 บิต |
4 |
| 2 |
ไอซีเรกกูเล็ท
7812 |
จำกัดขนาดของแรงดันที่ใช้ในวงจร
เพื่อจะใช้กับสเต็ปมอเตอร์ |
1 |
| 3 |
บิทเรทติไฟท์ |
แปลงไฟฟ้ากระแสสลับไปเป็นกระแสตรง |
1 |
| 4 |
เทอร์มินัลของหม้อแปลง |
รับไฟกระแสสลับ
9-12 V. เพื่อเข้าวงจร |
2 |
| 5 |
หลอดไฟ
LED |
สำหรับแสดงผลการทำงานของไฟที่จ่ายไปให้ขั้วของสเต็ปมอเตอร์ |
4 |
| 6 |
ทรานซิสเตอร์
E3055T705 |
เป็นเสมือนสวิทช์คอยจ่ายไฟให้ที่ขั้วขอลวดของมอเตอร์ |
4 |
| 7 |
เทอร์มินัลของขั้วบวกแหล่งจ่ายไฟ |
จ่ายไฟให้กับขดลวดของสเต็ปมอเตอร์ |
4 |
| 8 |
เทอร์มินัลของกราวด์แหล่งจ่ายไฟ |
เป็นจุดกราวด์ของแหล่งจ่ายไฟให้กับขดลวดของสเต็ปมอเตอร์ |
1 |
| 9 |
ทรานซิสเตอร์
2N3904 |
คอยทรกขาสัญญาณของ
ทรานซิสเตอร์ E3055T705
ให้ทำงาน |
4 |
| 10 |
เทอร์มินัลของกราวด์ด้าน
Input |
เป็นจุดกราวด์ของสัญญาณ
Input ที่มาจากพอร์ต Crad I/O 8255 |
1 |
| 11 |
เทอร์มินัลของขั้วบวกด้าน
Input |
เป็นจุดขั้วบวกของสัญญาณ
Input ที่มาจากพอร์ต Crad I/O 8255 |
4 |
| 12 |
ทรานซิสเตอร์
1 k โอท์ม |
เป็นค่าความต้านทานที่ต่อเข้ากับขา
B ของ ทรานซิสเตอร์ 2N3904 |
4 |
| 13 |
ไดโอด |
ป้องกันการกลับทิศทางของกระแส |
1 |
ส่วนด้านหลังของแผงวงจรสามารถดูได้จากรูปที่
6
ซึ่งแสดงลายวงจรการต่อของอุปกรณ์
โดยจริงๆแล้ว
มาจากวงจรพื้นฐานที่เคยกล่าวมาแล้ว
คลิกเพื่อทบทวนของวงจรทรานซิสเตอร์สวิทช์
โดยนำมาต่อร่วมกัน 4
ชุด
ผนวกเข้ากับแหล่งจ่ายไฟ
|

รูปที่
6
ลายวงจรด้านหลังแผนวงจรไดร์เวอร์สเต็ปมอเตอร์
| เราใช้ซอฟแวร์
MS Visual Basic 6
ในการเขียนโปรแกรม
ควบคุมการทำงานของสเต็ปมอเตอร์
โดยหน้าที่ของโปรแกรมจะคอยส่งค่าให้พอร์ตส่งสัญญาณไฟ
5 V. ไปควบคุมการทริกของ
ขาโซลิสสเตท
โดยเราเขียนโปแกรมให้มีฟังก์ชั่นการทำงานดังนี้
- ให้สเต็ปมอเตอร์หมุนทางซ้าย
- ให้สเต็ปมอเตอร์หมุนทางขวา
- ให้สเต็ปมอเตอร์หมุนตามจำนวนสเต็ปที่เราใส่ค่ากำหนด
- ให้สเต็ปมอเตอร์หมุนแบบต่อเนื่องจนกว่าจะกดปุ่ม"หยุดหมุน"
-
สามารถกำหนดความเร็วในการหมุนให้สเต็ปมอเตอร์
ในโปแกรมนี้เรายกตัวอย่างมาใหเดูกันแค่นี้
ทั้งนี้คุณสามารถจะเพิ่มเติมฟังก์การทำงานอื่นๆได้อีก
ที่สำคัญทำเป็นฟังก์ชั่น
เราได้นำซอร์ดโค๊ดมาให้ดูอยู่ด้านล่าง |
โค๊ดโปรแกรมทั้งหมดครับ
ใช้พื้นฐานการเขียนโปรแกรมVisual
Basic
Dim ValExit As Boolean
' ตัวแปรสำหรับหยุดการหมุนของมอเตอร์
Dim valStep, BitStep, valCount As Long ' ตัวแปรของค่าสเต็ป,ส่งไปควบคุมบิต,นับจำนวนสเต็ป
Dim valSpeed As Single ' หน่วงเวลาการแต่ละสเต็ป
Dim PortAddress As Long ' กำหนดตำแหน่งพอร์ตที่เราใช้ต่อควบคุมสเต๊ปมอเตอร์
Private Sub Combo1_Click()
Select Case Combo1.Text
Case Is = "Print Port": PortAddress = &H378 ' กำหนดค่าของตำแหน่งพอร์ต Printer
Case Is = "I/O 8255 Port A": PortAddress = &H300 ' กำหนดค่าของตำแหน่งพอร์ต A I/O 8255
Case Is = "I/O 8255 Port B": PortAddress = &H301 ' กำหนดค่าของตำแหน่งพอร์ต B I/O 8255
Case Is = "I/O 8255 Port C": PortAddress = &H302 ' กำหนดค่าของตำแหน่งพอร์ต C I/O 8255
End Select
End Sub
Private Sub Command1_Click()
' เมื่อมีการกดปุ่มให้มอเตอร์หมุนซ้าย
ValExit = False
valSpeed = Val(Text1.Text) 'กำหนดความเร็วในแต่ละสเต็ป
valStep = Val(Text2.Text) ' กำหนดจำนวนสเต็ป
valCount = 0
If Option1.Value = True Then ' ถ้าเลือกการหมุนแบบตามจำนวนสเต็ปที่กำหนด
BitStep = 1
Do
DoEvents ' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
valCount = valCount + 1 ' นับจำนวนสแต็ป
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวดเริ่มต้นที่บิตแรก
Out PortAddress, BitStep
DelayTime (valSpeed) 'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
BitStep = BitStep + BitStep ' เพิ่มค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
If BitStep > 8 Then BitStep = 1 ' เมื่อถึงบิตที่ 4 ให้รีเซทค่าไปที่บิต 1 ใหม่
Label1.Caption = valCount ' แสดงค่าจำนวนสเต็ปที่ Label 1
Loop Until valCount = valStep ' จบการทำงานเมื่อค่านี้เท่ากับค่าจำนวนสเต็ปที่ตั้งไว้
End If
If Option2.Value = True Then ' ถ้าเลือกการหมุนแบบสเต็ปต่อเนื่อง
BitStep = 1
Do
DoEvents
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวด
Out PortAddress, BitStep
Call DelayTime(valSpeed) 'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
BitStep = BitStep + BitStep ' เพิ่มค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
If BitStep > 8 Then: BitStep = 1 ' เมื่อถึงบิตที่ 4 ให้รีเซทค่าไปที่บิต 1 ใหม่
Label1.Caption = valCount ' แสดงค่าจำนวนสเต็ปที่ Label 1
Loop Until ValExit = True 'จบการทำงานเมื่อกดปุ่มหยุดหมุนโดยจะรับค่า ValExit=True
End If
End Sub
Private Sub Command2_Click()
ValExit = True 'สั่งให้มอเตอร์หยุดหมุนโดยจะส่งค่า ValExit=True
End Sub
Public Sub DelayTime(DelayTime) ' รูทีนการหน่วงเวลาหน่วยวินาที
Dim LoopTime As Long 'กำหนดจำนวนรอบเวลา
Const SecInDay = 86400 ' จำนวนวินาทีใน1วัน
LoopTime = Timer + DelayTime 'กำหนดจำนวนรอบเวลาบวกกับค่าที่เราต้องการตั้ง
If LoopTime > SecInDay Then ' เมื่อไรที่ค่าจำนวนรอบเวลายังน้อยกว่าจำนวนวินาทีใน1วัน
LoopTime = LoopTime - SecInDay 'ให้นำจำนวนวินาทีใน1วันลบค่าจำนวนรอบเวลา
Do While Timer > LoopTime ' เมื่อไรที่ค่าเวลาของเครื่องยังมากกว่าค่าจำนวนรอบเวลา
DoEvents ' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
Loop ' กลับไปตรวจสอบเงื่อนไขใหม่
End If
Do While Timer < LoopTime ' เมื่อไรที่ค่าเวลาของเครื่องยังน้อยกว่าค่าจำนวนรอบเวลา
DoEvents ' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
Loop
' กลับไปตรวจสอบเงื่อนไขใหม่ ถ้าตรงเงื่อนไขก็เป็นอันว่าจบการตั้งเวลาออกจากรูทีน
End Sub
Private Sub Command3_Click()
' เมื่อมีการกดปุ่มให้มอเตอร์หมุนซ้าย
ValExit = False
valSpeed = Val(Text1.Text) 'กำหนดความเร็วในแต่ละสเต็ป
valStep = Val(Text2.Text) ' กำหนดจำนวนสเต็ป
valCount = 0
If Option1.Value = True Then ' ถ้าเลือกการหมุนแบบตามจำนวนสเต็ปที่กำหนด
BitStep = 8
Do
DoEvents ' ปล่อยให้ CPU ไปประมวลผลอย่างอื่นบ้าง
valCount = valCount + 1 ' นับจำนวนสแต็ป
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวดเริ่มต้นที่บิตสุดท้าย
Out PortAddress, BitStep
DelayTime (valSpeed) 'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
BitStep = BitStep / 2 ' ลดค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
If BitStep < 1 Then BitStep = 8 ' เมื่อถึงบิตที่ 1 ให้รีเซทค่าไปที่บิต 4 ใหม่
Label1.Caption = valCount ' แสดงค่าจำนวนสเต็ปที่ Label 1
Loop Until valCount = valStep ' จบการทำงานเมื่อค่านี้เท่ากับค่าจำนวนสเต็ปที่ตั้งไว้
End If
If Option2.Value = True Then ' ถ้าเลือกการหมุนแบบสเต็ปต่อเนื่อง
BitStep = 8
Do
DoEvents
' ส่งค่าออกพอร์ตไปสั่งให้โซลิสสเตจทำงานเพทาอจ่ายแรงดันให้ขดลวด
Out PortAddress, BitStep
Call DelayTime(valSpeed) 'หน่วงเวลาเพื่อควบคุมความเร็วรอบแต่ละสเต็ป
BitStep = BitStep / 2 ' ลดค่าทีละ 2 เท่า เพื่อให้เป็นทีละบิตเรียงกัน
If BitStep < 1 Then BitStep = 8 ' เมื่อถึงบิตที่ 1 ให้รีเซทค่าไปที่บิต 4 ใหม่
Label1.Caption = valCount ' แสดงค่าจำนวนสเต็ปที่ Label 1
Loop Until ValExit = True 'จบการทำงานเมื่อกดปุ่มหยุดหมุนโดยจะรับค่า ValExit=True
End If
End Sub
Private Sub Form_Load()
Out &H303, &H80 ' ตั้งค่าดีฟอต์นที่พอร์ตควบคุม ของCard I/O 8255
End Sub
|

รูปที่
7
โปรมแกรมควบคุมการหมุนของสเต็ปมอเตอร์

รูปที่
8
สามารถเลือกพอร์ตที่ติดต่อควบคุมกับสเต็ปมอเตอร์

รูปที่
9
ทดสอบโปรแกรมควบคุมสเต็ปมอเตอร์
|