Arduino and Motor Control : Part 1
วันนี้เรามาพูดถึงการควบคุมมอเตอร์กระแสตรงกันหน่อย (ขอโฆษณานิดนะครับ ของที่ใช้ในการทำอยู่ในArduino Stater Kit 1) แต่บอกไว้ก่อนนะครับ ผมกะจะเขียนบทความแบ่งออกเป็นตอนๆ โดยจะมีเนื้อหาในการควบคุมมอเตอร์ชนิดต่างๆ ดังนี้ครับ
- ง่ายสุดก็ DC motor หรือ มอเตอร์กระแสตรง ซัก 2 ตอน โดยว่ากันถึงการควบคุมทิศการหมุน และ การควบคุมความเร็วรอบ
- ต่อมาก็ Servo motor ซัก 2 ตอน
- และปิดท้ายด้วย Stepping Motor 2 ตอน ครับ
วันนี้ก็ดูจะง่ายๆ ไปก่อนนะครับ Sketch ที่ใช้เป็นตัวอย่างผมไปเอามาจาก Arduino Cookbook โดยคุณ Michael Margolis นะครับ แล้วมาเขียนเนื้อหาใหม่ โดยอธิบายให้ง่าย และลึกขึ้น บอกไว้ก่อนเดี๋ยวจะมีคนหาว่าไปลอกมาอีก
DC motor ประกอบด้วย 2 ส่วนหลักๆ ได้แก่ โรเตอร์ และสเตเตอร์ นะครับ โรเตอร์ก็คือส่วนที่หมุน ส่วนสเตเตอร์คือส่วนที่เป็นขดลวดที่สร้างสนามแม่เหล็ก
หลักการทำงานของ DC motor คร่าวๆ ก็คือการนำกระแสตรงมาตัดผ่านสนามแม่เหล็ก ทำให้เกิดทอร์กขึ้นในทิศที่เหมาะสม และสร้างให้เกิดการหมุนของแกนโรเตอร์ ถ้าอยากดู Animation เท่ห์ๆ ของ Professor ใจดีที่ทำเพื่ออธิบายหลักการทำงานของ DC motor ก็ไปที่นี่เลยครับ
ทีนี้ในงานส่วนมาก เราต้องการควบคุมทิศทาง และ ความเร็วรอบของมอเตอร์ ไม่ว่าจะเป็นการขับเคลื่อนสายพาน หรือ ล้อของหุ่นยนต์ เพราะเราคงไม่ต้องการให้หมุนแบบอิสระควบคุมไม่ได้ ดังนั้นก็เลยมีคนคิดวงจรที่ใช้ในการควบคุมมอเตอร์ขึ้นมา แบบที่นิยมใช้กันเรียกว่าวงจร "H-Bridge"
วงจรที่เห็นนี้ทำหน้าที่ได้ทั้งคุมทิศทางและความเร็วของมอเตอร์นะครับ มาว่ากันทีละส่วน เริ่มจากการคุมทิศทางการหมุนก่อนครับ
โดยปกติหากต้องการกลับทิศการหมุนของมอเตอร์กระแสตรง วิธีนึงที่ทำได้คือ กลับทิศแหล่งจ่าย ทีนี้ลองดูที่รูปวงจร H-Bridge ด้านบนนะครับ
- หากต้องการให้หมุนตามเข็ม (Clockwise :CW) ก็ให้ S1 และ S4 ปิดวงจร และให้ S2 และ S3 เปืดวงจร
- หากต้องการให้หมุนทวนเข็ม (Conter Clockwise :CCW) ก็ให้ S2และ S3 ปิดวงจร และให้ S1 และ S4 เปืดวงจร
จะเห็นว่าสวิตช์จะทำงานเป็นคู่นะครับ S1 คู่กับ S4 และ S2 คู่กับ S3 คู่แรกทำงาน คู่สองต้องเปิดวงจร และในทางตรงข้ามก็คือคู่สองทำงาน คู่แรกต้องเปิดวงจร
ทีนี้จะทำอย่างไรให้การเปิดปิดเป็นแบบที่ง่ายกว่านี้ คำตอบก็คือ ใช้อุปกรณ์สารกึงตัวนำเช่น MOSFET หรือ IGBT หรือ อื่นๆ แล้วแต่ความเหมาะสม เช่น ขนาดกระแส แรงดันที่ต้องการควบคุม ครับ
Schematic ขอวงจร H-Bridge ก็ตามนี้ครับ จะใช้วงจรนี้ก็ต้องเชิญไปบ้านหม้อและซื้ออุปกรณ์ตามลิงค์นี้มาต่อวงจรกันเอานะครับ แต่โชคดีที่เรามีทั้ง Motor Shield L293D Motor Shield L298P และ IC ที่มีวงจร H-Bridge ให้ครับ ที่มีขายในบ้านเรามีให้เลือก 2 แบบ หลักๆ คือ L293D และ L298P ครับ สองตัวนี้ต่างกันอย่างไรเหรอครับ ก็ที่ขนาดของกระแสที่รับได้ ซึ่งหมายถึงขนาดของมอเตอร์ที่ใช้นะครับ
ถ้ามากกว่านี้เหรอครับ คงต้องต่อกันเอาเองแล้วครับ แต่จริงๆ ก็ไม่ได้ยากอะไรขนาดนั้นครับ แค่ต่อตาม Schematic เท่านั้น แต่แหม เลือกได้คงไม่ต่อเองใช่รึเปล่าครับ
วันนี้ลองมาใช้ L293D ทีให้มาใน Arduino Stater Kit 1 ของร้าน Arduitronics เพื่อทดลองคุมทิศทางการหมุนดูนะครับ
ก่อนอื่นเริ่มจากการต่อวงจรก่อนครับ ก็ต่อตามภาพด้านล่างนี้ครับ (ภาพจาก Arduino Cookbook by Michael Margolis)
ในตัวอย่างนี้ผมใช้ถ่าน 9 V เป็นแหล่งจ่ายนะครับ อย่าใช้ 5 V จาก Board เป็นแหล่งจ่ายนะครับ เพราะ Port ของ Arduino จ่ายกระแสได้แค่ 50 mA เท่านั้น อาจจะทำให้บอร์ดพังได้ครับ
Sketch ก็ตามนี้นะครับ
/** Brushed_H_Bridge_simple2 sketch* commands from serial port control motor direction* + or - set the direction, any other key stops the motors*/const int in1Pin = 5; // H-Bridge input pinsconst int in2Pin = 4;const int in3Pin = 3; // H-Bridge pins for second motorconst int in4Pin = 2;void setup(){Serial.begin(9600);pinMode(in1Pin, OUTPUT);pinMode(in2Pin, OUTPUT);pinMode(in3Pin, OUTPUT);pinMode(in4Pin, OUTPUT);Serial.println("+ - sets direction of motors, any other key stops motors");}void loop(){if ( Serial.available()) {char ch = Serial.read();if (ch == '+'){Serial.println("CW");// first motordigitalWrite(in1Pin,LOW);digitalWrite(in2Pin,HIGH);//second motordigitalWrite(in3Pin,LOW);digitalWrite(in4Pin,HIGH);}else if (ch == '-'){Serial.println("CCW");digitalWrite(in1Pin,HIGH);digitalWrite(in2Pin,LOW);digitalWrite(in3Pin,HIGH);digitalWrite(in4Pin,LOW);}else{Serial.print("Stop motors");digitalWrite(in1Pin,LOW);digitalWrite(in2Pin,LOW);digitalWrite(in3Pin,LOW);digitalWrite(in4Pin,LOW);}}} |
ถ้าทุกอย่างถูกต้องไม่มีปัญหา จะได้หน้าจอ Serial Monitor ดังนี้ครับ โดยจะเห็นมอเตอร์หมุนทิศนึงตอนกด "+" และทิศตรงข้ามถ้ากด "-" ถ้ากดอย่างอื่นจะหยุดหมุนครับ
นาย สุธรรม แสงทรง
อ้างอ้ง
https://www.arduitronics.com/article/22/arduino-and-motor-control-part-1
ไม่มีความคิดเห็น:
แสดงความคิดเห็น