Bài 15. Đảo chiều động cơ DC

Trong bài học này, chúng ta sẽ học cách điều khiển cả chiều quay và tốc độ của động cơ DC sử dụng Arduino và một IC điều khiển động cơ L293D.

Ví dụ này sẽ sử dụng một biến trở để thay đổi tốc độ động cơ và một nút nhấn để điều khiển chiều quay của nó.

Linh kiện cần thiết

STT Tên linh kiện SL Hình ảnh
1 Board Arduino Uno R3 1
2 Dây nguồn USB 1
3 Breadboard mini 1
4 Dây căm breadboard 1
5 Động cơ DC 5V 1
6 IC L293N 1
7 Biến trở 10kΩ 1
8 Nút nhấn 1

Thử nghiệm

Trước khi sử dụng Arduino để điều khiển động cơ, ta hãy llamfmoojt thử nghiệm với chip điều khiển động cơ L293D để hiểu thêm về cách mà nó hoạt động.

Chúng ta sẽ bắt đầu bằng cách sử dụng Arduino để cấp nguồn 5V cho động cơ.

Động cơ có thể nối vào mạch theo bất kì chiều nào, nếu đảo đầu dây, ta sẽ có chiều quay ngược lại. Hãy chú ý đến chiều quay của động cơ. Bạn có thể nắm hai ngón tay vào trục quay của nó để xác định chiều quay đó. Hãy thử đảo hai đầu dây của động cơ vào nguồn, chiều quay của nó sẽ thay đổi.

Đó là cách mà chip L293D làm việc. Chân điều khiển của nó cho phép chúng ta tác động để thay đổi chiều quay của động cơ.

Hãy đấu nối dây như bên dưới. Arduino vẫn đóng vai trò cấp nguồn, nhưng chúng ta có có thể thực nghiệm bằng tay trước khi để cho Arduino đảm nhận việc này.

Ba chân của L293D mà chúng ta cần quan tâm là chân 1 (Enable – kích hoạt), chân 2 (In1) và chân 7 (In2). Chúng được kết nối vào chân 5V và GND bằng dây tím, vàng và cam.

Khi đó, động cơ sẽ quay theo một chiều, gọi là chiều quay A.

Nếu bạn di chuyển chân 1 (Enable) đến GND, động cơ sẽ dừng cho dù bạn có cắm chân In1 và In2 vào đâu chăng nữa. Chân Enable có chức năng bật, tắt động cơ. Điều này hữu ích cho việc sử dụng một chân ngõ ra PWM để điều khiển tốc độ động cơ. Hãy nối chân 1 vào 5V và động cơ sẽ quay như cũ.

Bây giờ hãy thử chuyển chân In1 (chân 2, màu vàng) từ 5V sang GND. Cả In1 và In2 bây giờ được nối vào chân GND, khi này động cơ lại dừng.

Chuyển chân In2 từ GND sang 5V sẽ làm cho động cơ quay theo chiều ngược lại (gọi là chiều B).

Sau cùng, chuyển In2 trở lại 5V, nghĩa là khi đó cả hai chân In1 và In2 đều nối vào 5V, động cơ lại dừng.

Như vậy, ảnh hưởng của chân In1 và In2 lên motor được tổng hợp thành bảng sau

Int1 Int2 Động cơ
GND GND Dừng
5V GND Quay theo chiều A
GND 5V Quay theo chiều B
5V 5V Dừng

Sơ đồ đấu dây

Bây giờ chúng ta đã nắm được cách điều khiển trực tiếp động cơ, chúng ta có thể sử dụng Arduino quản lý các chân Enable, In1 và In2.

Khi bạn đấu dây trên breadboard, hãy chú ý rằng IC được cắm đúng chiều. Phần khuyết của IC quay lên phía trên.

Code Arduino

Hãy nạp đoạn code sau vào Arduino

/*
Bi-directional Motor
*/
 
 int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int potPin = 0;
 
 void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
}
 
 void loop()
{
  int speed = analogRead(potPin) / 4;
  boolean reverse = digitalRead(switchPin);
  setMotor(speed, reverse);
}
 
 void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}
 

Các chân được định nghĩa và chức năng của nó được thiết lập trong hàm ‘setup’ như thông thường.

Trong hàm lặp loop, tốc độ động cơ được xác định bằng cách chia giá trị đọc được từ biến trở cho 4.

Tại sao lại là 4? Vì giá trị đọc được từ hàm analogRead sẽ nằm trong khoảng từ 0 đến 1023, nhưng giá trị ngõ ra analog phải được thiết lập trong khoảng từ 0 đến 255.

Nếu nút nhấn được tác động, động cơ sẽ quay thuận, nếu không nó sẽ quay nghịch. Giá trị của biến ‘reserve’ được thiết lập theo giá trị đọc được từ chân của nút nhấn. Do đó, nếu nút nhấn bị tác động, nó sẽ mang giá trị False, ngược lại nó mang giá trị True.

Tốc độ và giá trị của biến ‘reverse’ sẽ được truyền vào một hàm (tự thiết lập), được đặt tên là ‘setMotor’, hàm này chịu trách nhiệm đóng ngắt các chân tương ứng của L293D nhằm điều khiển động cơ.

void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

Trong hàm ‘setMotor’, đầu tiên ta đặt tốc độ cho động cơ bằng cách sử dụng một lệnh analogWrite. Chân enable của L293 chỉ đơn giản là bật/tắt động cơ, bất kể giá trị của chân In1 và chân In2 là gì.

Để điều khiển chiều quay của động cơ, các chân in1 và in2 được đặt các giá trị đối lập nhau.

Nếu in1 là HIGH và in2 là LOW, động cơ sẽ quay theo một chiều, ngược lại nếu in1 là LOW và in2 là HIGH thì động cơ sẽ quay theo chiều ngược lại.

Lệnh ‘!’ có nghĩa là ‘not’ (không phải). Dòng digitalWrite đầu tiên sẽ thiết lập chân in1 đến giá trị ngược lại với giá trị của biến ‘reverse’, ví dụ nếu ‘reverse’ mang giá trị HIGH thì chân in1 sẽ được đặt giá trị LOW và ngược lại.

Còn dòng digitalWrite thứ hai thì thiết lập chân in2 đến giá trị của biến ‘reverse’. Như vậy, giá trị của in1 và in2 bao giờ cũng đối lập với nhau.

L293D

Đây là một con chip rất hữu ích. Thực ra, nó có thể điều khiển được hai động cơ DC độc lập. Trong ví dụ trên, chúng ta chỉ mới sử dụng một nửa bên của nó, một nửa bên còn lại được sử dụng để điều khiển động cơ thứ hai.

Động cơ thứ hai sẽ sử dụng các chân OUT3 và OUT4. Bạn cũng sẽ cần thêm ba chân nữa để điều khiển.

  • EN2 được kết nối vào một ngõ ra PWM trên Arduino
  • IN3 và IN4 được kết nối vào các ngõ ra digital trên Arduino

L293D có hai chân +V (8 và 16). Chân ‘+Vmotor’ *(8) cấp nguồn cho động cơ, và +V (16) cấp nguồn nuôi IC. Bạn có thể kết nối cả hai chân này vào chân 5V của Arduino. Tuy nhiên, nếu bạn sử dụng động cơ với công suất lớn, hoặc động cơ có điện áp cao hơn, bạn sẽ phải cấp một nguồn riêng bằng cách nối chân 8 vào cực dương của nguồn cấp ngoài, và cực GND của nguồn cấp ngoài sẽ nối vào chân GND của Arduino.

Mở rộng

Hãy thử thay đổi sketch để điều khiển động cơ mà không sử dụng biến trở hoặc nút nhấn. Động cơ sẽ bắt đầu quay chậm, sau đó nhanh dần lên, chậm dần lại và đổi chiều, cũng theo cách như vậy, cứ thế lặp đi lặp lại.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.