วันจันทร์ที่ 6 กุมภาพันธ์ พ.ศ. 2560

Arduino and Motor Control

Arduino and Motor Control



วันนี้เรามาพูดถึงการควบคุมมอเตอร์กระแสตรงกันหน่อย  (ขอโฆษณานิดนะครับ ของที่ใช้ในการทำอยู่ใน 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 ก็ไปที่นี่เลยครับ
http://www.walter-fendt.de/ph14e/electricmotor.htm

  ทีนี้ในงานส่วนมาก เราต้องการควบคุมทิศทาง และ ความเร็วรอบของมอเตอร์  ไม่ว่าจะเป็นการขับเคลื่อนสายพาน หรือ ล้อของหุ่นยนต์   เพราะเราคงไม่ต้องการให้หมุนแบบอิสระควบคุมไม่ได้  ดังนั้นก็เลยมีคนคิดวงจรที่ใช้ในการควบคุมมอเตอร์ขึ้นมา  แบบที่นิยมใช้กันเรียกว่าวงจร "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 pins
const int in2Pin = 4;
const int in3Pin = 3;  // H-Bridge pins for second motor
const 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 motor
      digitalWrite(in1Pin,LOW);
      digitalWrite(in2Pin,HIGH);
      //second motor
      digitalWrite(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 ดังนี้ครับ  โดยจะเห็นมอเตอร์หมุนทิศนึงตอนกด "+" และทิศตรงข้ามถ้ากด "-"  ถ้ากดอย่างอื่นจะหยุดหมุนครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น