วันศุกร์ที่ 22 กันยายน พ.ศ. 2560

บทความการใช้งาน การใช้งาน L298N motor drive

บทความการใช้งาน การใช้งาน L298N motor drive

          เมื่อพูดถึงการใช้งานมอเตอร์กระแสตรงแล้ว หลีกเลี่ยงไม่ได้ที่จะนึกถึง หุ่นยนต์ หรือแม้กระทั่งรถบังคับ ส่วนใหญ่จะใช้มอเตอร์เป็นตัวขับเคลื่อนการทำงาน เช่น การเคลื่อนที่ของรถ บังคับ หรือ แม้กระทั่งใช้เป็นกลไกในการทำงานของของหุ่นยนต์ เมื่อพูดถึงมอเตอร์ การที่จะต้องใช้งานมอเตอร์ทำงานอย่างมีประสิทธิภาพทั้ง การควบคุมความเร็วรอบของมอเตอร์และการควบคุมการหมุนทวนเข็มและตามเข็ม สิ่งเหล่านี้ทำได้ แต่ต้องมีโมดูลเสริมหรือตัวกำหนดตัวแปรที่จะทำให้สามารถควบคุมการทำงานของมอเตอร์ได้ ซึ่งโมดูลที่ใช้ได้มีด้วยกันหลายรุ่น แต่ในที่นี้จะขอยกตัวอย่างเอารุ่น L298N motor drive มาเป็นกรณีศึกษา  
          L298N เป็นชุดขับมอเตอร์ชนิด H-Bridge ซึ่งส่วนใหญ่จะถูกนำไปใช้ในการควบคุมทิศทางและความเร็วของมอเตอร์ ซึ่งสามารถควบคุมมอเตอร์ได้ทั้งหมด 2 Channel
        หลักการทำงาน
วงจร H-Bridge ของ L298N จะขับกระแสเข้ามอเตอร์ ตามขั้วที่กำหนดด้วยลอจิกเพื่อควบคุมทิศทาง ส่วนความเร็วของมอเตอร์นั้นจะถูกควบคุมด้วย สัญญาณ (PWM Pulse Width Modulation)
PWM หมายถึง การควบคุมช่วงจังหวะการทำงานของอิเล็กตรอน ลองจินตนาการถึงแปรงขดลวดในมอเตอร์เป็นระหัดวิดน้ำและอิเล็กตรอนเป็นน้ำที่ตกลงมาจากระหัดวิดน้ำ
ค่าแรงดันไฟฟ้าก็คล้ายกับกระแสน้ำที่ไหลผ่านระหัดวิดน้ำด้วยความเร็วคงที่ ยิ่งกระแสน้ำไหลเร็วเท่าไรก็จะหมายความว่าแรงดันไฟฟ้ายิ่งสูงขึ้น แต่มอเตอร์มีอัตราความเร็วคงที่และสามารถเสียหายได้หากมีแรงดันไฟฟ้าสูงไหลผ่านหรือหยุดทันทีเพื่อที่จะหยุดมอเตอร์ ดังนั้น PWM คล้ายกับการควบคุมระหัดวิดน้ำให้ตักน้ำในจังหวะคงที่ที่กระแสน้ำคงที่ ยิ่งระหัดวิดน้ำหมุนเร็วเท่าไรช่วงของ pulse ก็จะยาวขึ้น ในทางกลับกันถ้าระหัดวิดน้ำหมุนช้าช่วงของ pulse จะสั้นลง ดังนั้นเพื่อยืดอายุการใช้งานของมอเตอร์จึงควรที่จะควบคุมมอเตอร์ด้วย PWM
พิจารณาโครงสร้างโค้ดคร่าวๆของ Arduino
       โค้ดการทำงานของ Arduino มีการพัฒนาขึ้นเรื่อยๆ แต่ยังไม่มีสร้าง library ที่เกี่ยวกับตัว L298N Dual H-Bridge เพื่อควบคุมมอเตอร์ดังนั้นผู้ใช้งานจึงต้องประกาศพินเพื่อใช้งานขึ้นมาเอง สามารถใช้โค้ด int dir(number)Pin(letter) ต่อเข้ากับพินดิจิตอลที่เลือกใช้ แค่นี้ก็สามารถทำงานได้อย่างถูกต้องและช่วยให้ตัว L298N Dual H-Bridge ควบคุมมอเตอร์ได้อย่างอเนกประสงค์ถ้าบอร์ด Arduino ที่เลือกใช้งานมีพินหลายตัว และถ้าต้องการปรับความเร็วของมอเตอร์ด้วย PWM สามารถใช้คำสั่ง int speedPin(letter) แล้วต่อเข้ากับพินที่เลือกใช้ หากต้องการวิธีลัดเพื่อใช้งาน PWM ย่างรวดเร็วสามารถเลือกพินใช้งานได้ตามรายการด้านล่าง
AT MEGA –PWM 2-13 และ 44-46 ตั้งค่าเอาท์พุทของ PWM ให้เป็น 8 bit ด้วยฟังก์ชั่น analogWrite()
UNO-PWM 3, 5, 6, 9, 10 และ 11 ตั้งค่าเอาท์พุทของ PWM ให้เป็น 8 bit ด้วยฟังก์ชั่น analogWrite()


รูปที่ 1 แสดงรายละเอียดของบอร์ด
          รายละเอียดของบอร์ด
§  Out 1: ช่องต่อขั้วไฟของมอเตอร์ A
§  Out 2: ช่องต่อขั้วไฟของมอเตอร์ A
§  Out 3: ช่องต่อขั้วไฟของมอเตอร์ B
§  Out 4: ช่องต่อขั้วไฟของมอเตอร์ B

§  12V: ช่องจ่ายไฟเลี้ยงมอเตอร์ 12V (ต่อได้ตั้งแต่ 5V ถึง 35V)
§  GND: ช่องต่อไฟลบ (Ground) 
§  5V: ช่องจ่ายไฟเลี้ยงมอเตอร์ 5V (หากมีการต่อไฟเลี้ยงที่ช่อง 12V แล้ว 
§  ช่องนี้จะทำหน้าที่จ่ายไฟออก เป็น 5V Output 
§  สามารถต่อไฟจากช่องนี้ไปเลี้ยงบอร์ด Arduino ได้

§  ENA: ช่องต่อสัญญาณ PWM สำหรับมอเตอร์
§  IN1: ช่องต่อสัญญาณลอจิกเพื่อควบคุมทิศทางของมอเตอร์ A
§  IN2: ช่องต่อสัญญาณลอจิกเพื่อควบคุมทิศทางของมอเตอร์ A
§  IN3: ช่องต่อสัญญาณลอจิกเพื่อควบคุมทิศทางของมอเตอร์ B
§  IN4: ช่องต่อสัญญาณลอจิกเพื่อควบคุมทิศทางของมอเตอร์ B
§  ENB: ช่องต่อสัญญาณ PWM สำหรับมอเตอร์

สเปกทางเทคนิค
·       Dual H bridge Drive Chip : L298N
·       แรงดันสัญญาณลอจิก : 5V Drive voltage: 5V-35V
·       กระแสของสัญญาณลอจิก : 0-36mA
·       กระแสขับมอเตอร์ : สูงสุดที่ 2A (เมื่อใช้มอเตอร์เดียว)
·       กำลังไฟฟ้าสูงสุด : 25W
·       ขนาด : 43 x 43 x 26 มิลลิเมตร
·       น้ำหนัก : 26 กรัม
*มี Power Supply 5V ในตัว สามารถจ่ายไฟออกจากช่อง 5V (เพื่อจ่ายให้บอร์ด Arduino) ได้ เมื่อต่อไฟเลี้ยงเข้าที่ช่อง 12V

อุปกรณ์
1.Arduino UNO R3
2. DC Motor 1ตัว
3. L298 Motor Drive Module
การต่อเข้าใช้งานกับ Arduino
ในการต่อกับ Arduino นั้น ขา IN1,IN2,IN3 และ IN4 นั้น สามารถต่อกับพอร์ต Digital ใดๆก็ได้ เนื่องจาก 4 ขานี้ จะใช้ในการควบคุมสัญญาณลอจิกบอกทิศทางให้กับมอเตอร์ ส่วน ENA และ ENB นั้น จำเป็นที่จะต้องต่อกับพอร์ต Digital ที่รองรับ PWM เนื่องจากจะต้องใช้สัญญาณ PWM ในการควบคุมความเร็วของมอเตอร์

รูปที่ 2 แสดงการต่อใช้งานอุปกรณ์
ตัวอย่างโปรแกรม

// Declare L298N Dual H-Bridge Motor Controller directly since there is not a library to load.
// Motor 1
int dir1PinA = 4;
int dir2PinA = 5;
int speedPinA = 10; // Needs to be a PWM pin to be able to control motor speed
void setup() {  // Setup runs once per reset
            Serial.begin(9600);
//Define L298N Dual H-Bridge Motor Controller Pins
    pinMode(dir1PinA,OUTPUT);
    pinMode(dir2PinA,OUTPUT);
    pinMode(speedPinA,OUTPUT);
}
void loop() {
// Initialize the Serial interface:
int speed; // Local variable
analogWrite(speedPinA, 255);//Sets speed variable via PWM
          digitalWrite(dir1PinA, LOW);
          digitalWrite(dir2PinA, HIGH);
          Serial.println("Motor 1 Forward");
}

อ้างอิง

วันพฤหัสบดีที่ 21 กันยายน พ.ศ. 2560

การใช้งาน Arduino uno r3 กับ เซ็นเซอร์วัดระยะทาง (Ultrasonic Module HC-SR04)

การใช้งาน Arduino uno r3 กับ เซ็นเซอร์วัดระยะทาง (Ultrasonic Module HC-SR04)          



        ก่อนที่เราจะเข้าสู่ขั้นตอนการใช้งาน  Arduino uno r3 กับ เซ็นเซอร์วัดระยะทาง (Ultrasonic Module HC-SR04) นั้น เรามาทำความรู้จักเจ้า Sensor ตัวนี้กันก่อนดีกว่า
        โมดูล HC-SR04 เป็นอุปกรณ์อิเล็กทรอนิกส์ราคาถูก สำหรับวัดระยะห่างด้วยคลื่นอัลตราโซนิค (ใช้คลื่นเสียงความถี่ ประมาณ 40kHz) มีสองส่วนหลักคือ ตัวส่งคลื่นที่ทำหน้าที่สร้างคลื่นเสียงออกไปในการวัดระยะแต่ละครั้ง ("Ping") แล้วเมื่อไปกระทบวัตถุหรือสิ่งกีดขวาง คลื่นเสียงถูกสะท้อนกลับมายังตัวรับแล้วประมวลผลด้วยวงจรอิเล็กทรอนิกส์ภายในโมดูล ถ้าจับเวลาในการเดินทางของคลื่นเสียงในทิศทางไปและกลับ และถ้าทราบความเร็วเสียงในอากาศ ก็จะสามารถคำนวณระยะห่างจากวัตถุกีดขวางได้


รูปที่ 1 แสดง Ultrasonic Module HC-SR04

       โมดูล HC-SR04 ทำงานที่แรงดันประมาณ +5V (4.5V ถึง +5.5V) โดยป้อนให้ขา VCC และ GND โมดูลนี้ มีขาสัญญาณดิจิทัล TRIG (อินพุต) และ ECHO (เอาต์พุต) ที่นำไปเชื่อมต่อกับไมโครคอนโทรลเลอร์ได้ อย่างเช่น Arduino ในการวัดระยะห่างแต่ละครั้ง จะต้องสร้างสัญญาณแบบ Pulse ที่มีความกว้าง (Pulse Width) อย่างน้อย 10 usec ป้อนให้ขา TRIG และหลังจากนั้นให้วัดความกว้างของสัญญาณช่วง HIGH จากขา ECHO ถ้าวัตถุอยู่ใกล้ ความกว้างของสัญญาณ Pulse ที่ได้ก็จะน้อย แต่ถ้าวัตถุอยู่ไกลออกไป ก็จะได้ค่าความกว้างของสัญญาณ Pulse ที่มากขึ้น

รายละเอียดสำคัญของตัวเซ็นเซอร์ 
          ·       ใช้แรงดันประมาณ +5V
          ·       กินกระแสประมาณ 15mA
          ·       ช่วงการวัดระยะทาง (measurement range): ประมาณ 4cm ถึง 4m
          ·       ความกว้างเชิงมุมในการวัด (measuring angle): 15 องศา
          ·       ความกว้างของสัญญาณ Pulse สำหรับ Trigger: 10 usec
          ·       ระดับแรงดันลอจิกสำหรัขา TRIG และ ECHO: 5V TTL
Datasheet: http://elecfreaks.com/store/download/HC-SR04.pdf (local copy)

การต่อใช้งานระหว่าง Arduino uno r3 กับ Ultrasonic Module HC-SR04

  • Vcc -> 5v
  • Gnd -> Gnd
  • Trig -> 10
  • Echo -> 9
Example Code

#define ECHO_PIN  9 
#define TRIG_PIN  10 

void setup() {
  pinMode( TRIG_PIN, OUTPUT ); 
  pinMode( ECHO_PIN, INPUT ); 
  digitalWrite( TRIG_PIN, LOW ); // output LOW to the TRIG pin
  Serial.begin( 115200 ); // initialize serial, use baudrate=115200
}

void loop() {
 
   Distance();
 // Serial.println(  cm  );

}
void Distance()
{
   int  cm;
  unsigned long duration_usec;
  unsigned long distance_mm;
  // v = 340 m/s = (340 * 100)/10^6 cm/usec = 34/1000 cm/usec
  // 2*d = v*t => d = v*t/2 = (17*t)/1000 cm = (17*t)/100 mm. 

    duration_usec = ping();
    distance_mm = (17*duration_usec)/100;
    if ( distance_mm > 4000 ) { // out of range (beyond 4 meters)
       // Serial.println( "Out of range!" );
      
    }
    else
    {
    Serial.print( "Distance: " );
    cm = distance_mm / 10;
    Serial.print( cm );
    Serial.print( '.' );
    Serial.print( distance_mm % 10 );
    Serial.println( " cm" );
    }
}
unsigned long ping() {
  // send a pulse (at least 10 usec long) to the TRIG pin
  digitalWrite( TRIG_PIN, HIGH );
  delayMicroseconds( 12 );
  digitalWrite( TRIG_PIN, LOW );
  // measure the ECHO pulse width (in microseconds)
  unsigned long duration_usec = pulseIn( ECHO_PIN, HIGH );
  return duration_usec;
}
/////////////////////////////////////////////////////////////////////
ผลลัพท์ที่ได้


อ้างอิงข้อมูลจาก