Giao tiếp Arduino với một số linh kiện điện tử.
4) Project 4 : Led sáng dần từ led 1 đến led 10 và ngược lại thời gian delay thay đổi được.
Sơ đồ mạch :
Trong project này hoàn toàn giống project 3 chỉ thêm một biến trở dùng để điều chỉnh thời gian delay cho chương trình
Code chương trình.
int ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int direction = 1;
int currentLED = 0;
int potPin = 0;
unsigned long changeTime; void setup() {
for (int x=0; x<10; x++) { pinMode(ledPin[x], OUTPUT);
}
}
void loop() {
int delayvalu= analogRead(potPin);
for (int x=0; x<10; x++) {
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH);
currentLED += direction;
if (currentLED == 9) {direction = -1;}
if (currentLED == 0) {direction = 1;}
delay(delayvalu);
}
Giải thích chương trình.
Chương trình ta chỉ thêm và thay đổi một vài câu lệnh mà thôi ngoài ra không khác gì nhiều so với project 3, các câu lệnh đó như sau :
int potPin = 0 ;
int delayvalu= analogRead(potPin);
delay(delayvalu);
Đầu tiên chúng ta khai báo một biến chứa vị trí chân biến trở kết nối đó là vị trí A0
int potPin = 0 ;
Đọc giá trị từ chân analog A0 bằng câu lệnh analogRead(potPin) và gán nó cho biến delayvalu. Arduino có 6 chân đầu vào analog đánh dấu từ A0 đên A5 với 10 bit chuyển đổi từ analog sang digital (ADC). Nghĩa là chân analog có thể đọc được các giá trị điện áp từ 0 đến 5 volt tương ứng với các số integer từ 0 ( 0 volt ) đến 1023 ( 5 volt ).
Trong project này chúng ta cần thiết lập thời gian delay bằng cách điều chỉnh biến trở. Ta sử dụng câu lệnh delay(delayvalu) để tạo thời gian trễ. Nếu ta điều chỉnh biến trở sao cho điện áp đầu vào chân analog là 5 volt thì delayvalu sẽ có giá trị là 1023 ( hơn 1 giây), nếu là 2,5 volt thì delayvalu sẽ là 511. Các bạn thử điều chỉnh biến trở ta sẽ thấy thời gian delay thay đổi hoặc là nhanh dần hoặc là chậm dần.
Lưu ý : đối với các chân analog chúng ta không cần thiết lập chế độ vào ra bằng hàm pinMode như các chân digital. Mặc định các chân analog là input.
5) Project 5: Điều khiển tốc độ động cơ bằng PWM.
Sơ đồ mạch
Code chương trình.
int potPin = 0;
int transistorPin = 9;
int potValue = 0;
void setup() {
pinMode(transistorPin, OUTPUT);}
void loop() {
potValue = analogRead(potPin) / 4;
analogWrite(transistorPin, potValue);
}
Giải thích chương trình.
Như trong sơ đồ mạch ta thấy biến trở được nối với chân A0, transistor được nối với chân số 9 thông qua điện trở 1k. Như vậy ta khai báo 2 biến chứa vị trí chân cho biến trở và transistor.
int potPin = 0;
int transistorPin = 9;
Biến integer potValue chứa giá trị đọc được từ chân A0.
int potValue = 0
Một câu hỏi đặt ra ở đây là nếu chúng ta không kết nối transistor điều khiển động cơ vào chân số 9 mà thay vào đó là chân số 1 hoặc 2 để điều khiển tốc độ động cơ thì có được không ?.
Câu trả lời là Không. Vậy tại sao Không ?
Tôi sẽ trả lời câu hỏi này sau. Nhưng trước hết tôi nói về PWM. PWM (pulse width modulation) là phương pháp điều chế dựa trên sự thay đổi độ rộng của chuổi xung dẫn đến sự thay đổi điện áp ra.
Để tạo ra được PWM trên Arduino thì chúng ta sử dụng lệnh analogWrite(Pin, Value);
Trong đó:
Pin: là vị trí chân, đối với Arduino Uno thì chỉ có các chân 3, 5, 6, 9, 10 & 11 mới có chức năng tạo PWM. Vậy chúng ta có thể trả lời được câu hỏi bên trên, các chân digital còn lại của có thể đọc hoặc xuất 2 giá trị là 0 và 1 mà thôi.
Value: Giá trị nằm trong khoảng 0 đến 255.
Để hiểu rõ hơn về PWM tôi sẽ minh hoạ qua ví dụ sau.
Nếu tôi sử dụng lệnh analogWrite(transistorPin, 127); thì dạng xung ở chân 9 (transistorPin = 9) sẽ như hình dưới và giá trị trung bình ngõ ra sẽ là 2,5V (50% ).
Từ ví dụ trên ta thấy sự thay đổi độ rộng của chuổi xung dẫn đến sự thay đổi điện áp ra. Ta cũng thấy rằng điện áp trên motor cũng thay đổi tuyến tính theo sự thay đổi điện áp ngõ ra trên chân 9. Tức là nếu điện áp trung bình trên chân 9 là 2,5 volt (50% ) thì điện áp trên hai đầu motor là 6 volt ( nguồn motor là 12 volt ).
Quay lại chương trình ta cần quan tâm tới một câu lệnh đó là:
potValue = analogRead(potPin) / 4;
Chúng ta cần phải chia giá trị đọc được cho 4 vì giá trị analog sẽ nằm trong khoảng 0 (0 volt ) đến 1023 (5 volt ), nhưng giá trị cần xuất ra ngoài chân 9 lại nằm trong khoảng 0 đến 255 đó chính là lý do tại sao có chia 4 ở đây.
Và câu lệnh cuối cùng là tạo PWM trên chân 9 để điều khiển tốc đố động cơ.
analogWrite(transistorPin, potValue);
Nếu như đã điều kiển được tốc độ động cơ bằng PWM rồi thì việc điều khiển độ sáng của Led hay đèn đối với các bạn bay giờ là chuyện quá đơn giản. Các bạn chỉ cần nối chân số 9 với một Led có điện trở hạn dòng là 220 ohm và code chương trình hoàn toàn giống như điều khiển động cơ. Lưu ý là khi mô phỏng các bạn sẽ không thấy được led thay đổi độ sáng mà chỉ thấy nhấp nháy nguyên nhân là do phần mềm proteus không đáp ứng kịp sự thay đổi của các xung PWM. Nhưng khi làm thực tế các bạn sẽ thấy được sự thay đổi độ sáng của Led rõ rệt.
6) Project 6 : Điều khiển động cơ bằng L293D.
Sơ đồ mạch:
Code chương trình
#define switchPin 2 // chân công tắc
#define motorPin1 8 // L293D Input 1
#define motorPin2 7 // L293D Input 2
#define speedPin 9 // L293D enable chân 1
#define potPin 0 // chân biến trở nối với A0
int Mspeed = 0;
void setup() {
pinMode(switchPin, INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(speedPin, OUTPUT);
}
void loop() {
Mspeed = analogRead(potPin)/4;
analogWrite (speedPin, Mspeed);
if (digitalRead(switchPin)) {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH); }
else {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
}
}
Giải thích chương trình:
Code của project này hoàn toàn đơn giản. Trước tiên ta định nghĩa các chân sẽ sử dụng trên arduino.
#define switchPin 2 // chân công tắc
#define motorPin1 8 // L293D Input 1
#define motorPin2 7 // L293D Input 2
#define speedPin 9 // L293D enable chân 1
#define potPin 0 // chân biến trở nối với A0
Khai báo một biến chứa tốc độ đọc từ biến trở.
int Mspeed = 0;
Tiếp theo trong setup() ta thiết lập chế độ vào, ra cho các chân vừa định nghĩa.
pinMode(switchPin, INPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(speedPin, OUTPUT)
Trong vòng loop() chúng ta đọc giá trị từ biến trở kết nối với chân A0 và gán nó cho
Mspeed :
Mspeed = analogRead(potPin)/4;
Thiết lập tốc độ cho động cơ bằng câu lệnh:
analogWrite (speedPin, Mspeed);
Kiểm tra xem công tắc có được bật hay không, nếu có thì thiết lập motorPin1 = LOW và motorPin2 = HIGH ta sẽ thấy động cơ quay ngược chiều kim đồng hồ.
if (digitalRead(switchPin)) {
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH); }
và nếu công tắc không được bật thì motor sẽ quay cùng chiều kim đồng hồ:
else {
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
}