Điều khiển động cơ bước dùng Arduino

0
6673
Điều khiển động cơ bước dùng Arduino

Trong bài viết này, tôi sẽ hướng dẫn các bạn điều khiển động cơ bước lưỡng cực bằng cách sử dụng Arduino UNO. Động cơ bước là một loại động cơ điện một chiều không chổi than dùng để biến đổi các tín hiệu điều khiển dưới dạng các xung điện rời rạc kế tiếp nhau thành các chuyển động góc quay, tức là trục của động cơ bước quay theo các bước rời rạc. Khi một máy tính được sử dụng để điều khiển các bước này, chúng ta có thể điều khiển chính xác vị trí và tốc độ của động cơ bước.

Do tính chất rời rạc này của chuyển động quay theo bước của động cơ bước, chúng thường được sử dụng trong các hệ thống tự động hóa công nghiệp, CNC, v.v., nơi yêu cầu chuyển động chính xác.

Giới thiệu về động cơ bước

Như đã đề cập trước đó, động cơ bước là một loại động cơ DC quay theo các bước rời rạc. Do thiết kế độc đáo của chúng mà động cơ bước có thể được điều khiển để định vị chính xác mà không cần bất kỳ phản hồi nào.

Một động cơ bước điển hình có nhiều cuộn dây được chia thành các pha. Khi các pha được cấp điện theo thứ tự, rotor của động cơ bước sẽ quay theo từng bước.

Cấu tạo động cơ bước

Hình 1: Cấu tạo của động cơ bước.

Về cơ bản, có ba loại động cơ bước: Động cơ bước từ trở biến đổi (VR – Variable Reluctance), động cơ bước nam châm vĩnh cửu (PM – Permanent Magnet) và động cơ bước lai (Hybrid). Dựa trên cuộn dây của stato, động cơ bước cũng có thể được phân loại thành động cơ bước lưỡng cực và động cơ bước đơn cực.

Các loại động cơ bước

Hình 2: Các loại động cơ bước.

Chúng ta sẽ không đi vào chi tiết các loại động cơ bước nhưng điều quan trọng là phải xác định xem động cơ bước mà chúng ta sử dụng là động cơ lưỡng cực hay đơn cực. Điều này quan trọng là bởi vì phương pháp điều khiển cho mỗi động cơ bước này là khác nhau.

Ví dụ, mạch điều khiển của động cơ bước đơn cực có thể được thực hiện với mạch đơn giản dùng transistor hoặc IC transistor Darlington như ULN2003A. Nhưng trong trường hợp động cơ bước lưỡng cực, chúng ta cần sử dụng bộ điều khiển kiểu cầu H như IC điều khiển động cơ L293D.

Xem thêm bài viết: Điều khiển động cơ DC dùng IC L293D và Arduino

Hình ảnh dưới đây cho thấy một động cơ bước lưỡng cực (Bipolar Stepper Motor), một động cơ bước đơn cực (Unipolar Stepper Motor) 5 dây, 6 dây và 8 dây.

Hình 3: Động cơ bước đơn cực và lưỡng cực.

Số bước hoặc góc quay phổ biến nhất của động cơ bước là 1,80 hoặc 200 bước (cả hai đều giống nhau 1,80 x 200 = 3600).

Làm thế nào để thiết kế mạch điều khiển động cơ bước?

Trong bài hướng dẫn này, tôi sử dụng động cơ bước lưỡng cực. Do đó, tôi sẽ sử dụng IC điều khiển động cơ L293D, là bộ điều khiển loại mạch cầu H. Vì động cơ sử dụng là một động cơ bước lưỡng cực, nên chúng ta chỉ cần kết nối 4 dây.

Bạn thực hiện kết nối hai đầu dây của một cuộn dây đến các chân ngõ ra Ouput 1 và Output 2 của IC L293D và hai đầu dây còn lại của cuộn dây thứ hai đến các chân ngõ ra Output 3 và Output 4.

Bốn chân ngõ vào (Input 1,2,3,4) của IC điều khiển động cơ L293D được kết nối với Arduino UNO. Bạn có thể kết nối 4 chân ngõ vào này với 4 chân I/O digital bất kỳ nào của Arduino (ở đây, tôi chọn kết nối chúng với các chân 2, 3, 4 và 5 của Arduino UNO).

Lưu ý: Bạn cần tìm hiểu các yêu cầu về nguồn điện cấp cho động cơ bước mà bạn sử dụng. Nguồn điện cấp cho động cơ phải chính xác. Nếu bạn cấp nguồn điện sai sẽ làm hỏng động cơ vĩnh viễn.

Việc điều khiển các bước được thực hiện với sự trợ giúp của máy tính thông qua serial monitor. Vì vậy, bạn phải đảm bảo rằng các chân RX và TX của Arduino không được sử dụng làm các chân I/O digital. Ngoài ra, chúng ta có thể điều khiển các bước hoặc vòng quay của động cơ với sự trợ giúp của ngõ vào tương tự (analog) thông qua một biến trở.

Linh kiện cần thiết

  • Arduino UNO 
  • IC điều khiển động cơ L293D
  • Động cơ bước lưỡng cực
  • Nguồn cấp điện (phù hợp với động cơ bước sử dụng)  
  • Breadboard 
  • Dây cắm breadboard

Sơ đồ mạch điều khiển động cơ bước dùng Arduino

Hình 4: Mạch điều khiển động cơ bước dùng Arduino.

Hoạt động của mạch

Động cơ bước được sử dụng trong bài hướng dẫn này là loại động cơ bước lai nam châm vĩnh cửu (Permanent Magnet Hybrid). Vì là động cơ lưỡng cực nên chỉ có 4 dây tương ứng với các đầu cuối của hai cuộn dây. 4 dây này được kết nối với các chân ngõ ra của IC điều khiển động cơ L293D.

Để điều khiển động cơ bước, chúng ta sẽ sử dụng một kỹ thuật được gọi là “điều khiển bước đủ – Full Step”. Động cơ được sử dụng trong bài hướng dẫn này có 200 bước đếm. Với động cơ bước kích thích một pha, tức là tại một thời điểm chỉ cấp điện cho một pha, chúng ta có thể đạt được vòng quay 200 bước bình thường với mức tiêu thụ điện năng ít nhất.

Động cơ bước được kích thích hai pha là một kỹ thuật khác trong đó hai pha được cấp điện tại cùng một thời điểm. Với kỹ thuật này, số bước không thay đổi so với kích thích một pha nhưng mô-men xoắn và tốc độ được tăng lên đáng kể. Nhược điểm của kỹ thuật này là nó đòi hỏi năng lượng gấp đôi.

Hình ảnh sau đây cho thấy hoạt động của động cơ bước với 4 bước/1 vòng quay, sử dụng phương pháp kích thích một pha và hai pha.

Điều khiển bước đủ

Hình 5: Điều khiển bước đủ.

Có một kỹ thuật điều khiển khác được gọi là “điều khiển nửa bước – Half Step”. Đây là sự kết hợp của kích thích một pha và hai pha. Số bước được tăng lên gấp đôi tức là có thể đạt được nửa góc của một bước.

Vì vậy, với kỹ thuật điều khiển nửa bước, chúng ta có thể tăng gấp đôi độ phân giải và động cơ sẽ hoạt động mượt mà hơn. Hình ảnh dưới đây minh họa cho phương pháp điều khiển nửa bước.

Điều khiển nửa bước

Hình 6: Điều khiển nửa bước.

Như đã đề cập trước đó, góc bước của động cơ được sử dụng trong bài hướng dẫn này là 1,80, tức là động cơ cần 200 bước để quay hết một vòng. Để tăng độ phân giải (gấp đôi độ phân giải), chúng ta sẽ sử dụng phương pháp điều khiển nửa bước và vì vậy cần 400 bước để quay được 1 vòng.

Chúng ta sẽ sử dụng serial monitor để kiểm soát hoạt động quay của động cơ. Trong chương trình, ký hiệu ‘+’ được sử dụng để cho biết động cơ bước quay theo chiều kim đồng hồ, và ngược lại, khi động cơ quay ngược chiều kim đồng hồ, dấu ‘-’ sẽ được sử dụng.

Sau khi chọn hướng, chúng ta có thể nhập trực tiếp số bước bất kỳ từ 1 đến 400.

Chương trình

const int out1 = 4;

const int out2 = 3;

const int out3 = 5;

const int out4 = 2;

int i=0;

int negative=0;

int positive=0;

char temp_print=0;

char temp_print1=0;

int led=13;

void setup()

{

  pinMode(out1, OUTPUT);

  pinMode(out2, OUTPUT);

  pinMode(out3, OUTPUT);

  pinMode(out4, OUTPUT);

  pinMode(led,OUTPUT);

  digitalWrite(out1,LOW);

  digitalWrite(out2,LOW);

  digitalWrite(out3,LOW);

  digitalWrite(out4,LOW);

  digitalWrite(led,LOW);

  Serial.begin(9600);

 }

void loop()

{

  if(temp_print1==1)

  {

    Serial.println(“.”);

    delay(1000);

    Serial.println(“.”);

    delay(1000);

    Serial.println(“.”);

    delay(1000);

    Serial.println(“.”);

    delay(1000);

    Serial.println(“.”);

    delay(1000);

    Serial.println(“.”);

    delay(1000);

    Serial.println(“.”);

    Serial.println(“Hoan tat hieu chinh……”);

    Serial.println(“Dong co buoc san sang”);

    temp_print1=temp_print1+1;

  }

  if(temp_print==0)

  {

    Serial.println(“Nhap HUONG va BUOC de hieu chinh”);

    temp_print=temp_print+1;

    temp_print1=temp_print1+1;

  }

  abc:

  Serial.print(“Chieu quay = “);

       while(Serial.available()==false);

    char temp = Serial.read();

       if(temp==’+’)

    {

      Serial.println(temp);

      Serial.print(“So buoc = “);

       while(Serial.available()==false)

       {

        digitalWrite(led,HIGH);

        delay(50);

        digitalWrite(led,LOW);

        delay(50);

       }

          int val = Serial.parseInt();

    Serial.println(val);

    if(val>=0 && val<=400)

      {

        for(int a=val;a>0;a–)

          {

            if(negative==1)

             {

              if(i==7)

              i=0;

              else

              a=a+1;

              i=i+1;

              negative=0;

                        }

            positive=1;

            if(i==0)      { digitalWrite(out1,HIGH);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(60);  }

            else if(i==1) { digitalWrite(out1,HIGH);digitalWrite(out2,HIGH);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(60); }

            else if(i==2) { digitalWrite(out1,LOW);digitalWrite(out2,HIGH);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(60);  }

            else if(i==3) { digitalWrite(out1,LOW);digitalWrite(out2,HIGH);digitalWrite(out3,HIGH);digitalWrite(out4,LOW);delay(60); }

            else if(i==4) { digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,HIGH);digitalWrite(out4,LOW);delay(60);  }

            else if(i==5) { digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,HIGH);digitalWrite(out4,HIGH);delay(60); }

            else if(i==6) { digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,HIGH);delay(60);  }

            else if(i==7) { digitalWrite(out1,HIGH);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,HIGH);delay(60); }

            if(i==7)

            {i=0;continue;}

            i++;

          }

      }

           else

      {

        goto abc;

      }

     digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(50); 

      val=0;

           }

         else if(temp==’-‘)

    {

      Serial.println(temp);

      Serial.print(“So buoc = “);

     while(Serial.available()==false)

       {

        digitalWrite(led,HIGH);

        delay(50);

        digitalWrite(led,LOW);

        delay(50);

       }

    int val = Serial.parseInt();

     Serial.println(val);

    if(val>=0 && val<=400)

      {

        for(int a=val;a>0;a–)

          {

 

           if(positive==1)

           {

            i=i-1;

            positive=0;

            a=a+1;

           }

           negative=1;           

            if(i==0)      { digitalWrite(out1,HIGH);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(60);  }

            else if(i==1) { digitalWrite(out1,HIGH);digitalWrite(out2,HIGH);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(60); }

            else if(i==2) { digitalWrite(out1,LOW);digitalWrite(out2,HIGH);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(60);  }

            else if(i==3) { digitalWrite(out1,LOW);digitalWrite(out2,HIGH);digitalWrite(out3,HIGH);digitalWrite(out4,LOW);delay(60); }

            else if(i==4) { digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,HIGH);digitalWrite(out4,LOW);delay(60);  }

            else if(i==5) { digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,HIGH);digitalWrite(out4,HIGH);delay(60); }

            else if(i==6) { digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,HIGH);delay(60);  }

            else if(i==7) { digitalWrite(out1,HIGH);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,HIGH);delay(60); }

            if(i==0)

            {i=7;continue;}

            i–;

            }

      }

       else

      {

        goto abc;

      }

     digitalWrite(out1,LOW);digitalWrite(out2,LOW);digitalWrite(out3,LOW);digitalWrite(out4,LOW);delay(50); 

      val=0;

     }

     else

     goto abc;

}

Ứng dụng

  • Bài viết cho thấy hoạt động của động cơ bước và điều khiển động cơ bước bằng Arduino. Động cơ bước thường được sử dụng trong robot, máy CNC, tự động hóa công nghiệp, các thiết bị nhỏ như máy in, v.v.
  • Do độ chính xác cao và mô-men xoắn lớn, động cơ bước được sử dụng ở những nơi cần điều khiển chính xác.

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây