Giao tiếp Arduino với một số linh kiện điện tử.
1) Project 1: Led nhấp nháy.
Sau đây tôi sẽ tạo một project nhấp nháy led thời gian delay là 1 giây sử dụng proteus để mô phỏng.
Sơ đồ mạch:
Code chương trình.
Sau khi gõ code vào chương trình soạn thảo bạn cần click và để kiểm tra lổi.
Tạo File Hex.
Chúng ta cần phải có file Hex để cung cấp cho proteus và khi bấm play chương trình mới hoạt động được. Cách tạo file Hex trên Arduino IDE như sau:
Click vào File chọn Preferences.
Chương trình sẽ tự động built một file hex được lưu ở đường dẫn như hình dưới
Hình 20: Đường dẫn chứa file hex.
Các bạn chép file hex ra một thư mục nào đó sau đó mở proteus lên và double click vào Aruino Uno.
Hình 21: Add file Hex cho Proteus.
Trong Arduino sketch cần phải có hàm setup() và loop() nếu không có thì chương trình báo lỗi. Hàm Setup() chỉ chạy một lần kể từ khi bắt đầu chương trình. Hàm này có chức năng thiết lập chế độ vào, ra cho các chân digital hay tốc độ baud cho giao tiếp Serial…
Cấu trúc của hàm pinMode() là như sau:
pinMode(pin,Mode); pin : là vị trí chân digital.
Mode: là chế độ vào ( INPUT), ra (OUTPUT).
Lệnh tiếp theo.
pinMode(ledPin, OUTPUT);
Lệnh này thiết lập chân số 9 trên board là chân ngõ ra (OUTPUT). Nếu không khai báo “ int ledPin = 9; ” thì bạn có thể viết cách sau nhưng ý nghĩa không thay đổi:
pinMode(9, OUTPUT);
Bắt buộc khai báo một hàm loop() trong Arduino IDE. Hàm này là vòng lặp vô hạn
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
Tiếp theo ta sẽ phân tích hàm digitalWrite( ledPin, HIGH); lệnh này có ý nghĩa là xuất ra chân digital có tên là ledPin ( chân 9) mức cao ( HIGH), mức cao tướng ứng là 5 volt.
delay(1000);
Lệnh này tạo một khoảng trễ với thời gian là 1 giây. Trong hàm delay() của IDE thì 1000 tương ứng với 1 giây.
digitalWrite(ledPin, LOW);
Cũng giống như digitalWrite( ledPin, HIGH); lệnh này xuất ra chân ledPin mức thấp (LOW) tức là 0 volt.
Và tiếp tục là một hàm delay().
Như vậy chúng ta có thể thấy chương trình sẽ thực hiện tắt sáng led liên tục không ngừng trừ khi ta ngắt nguồn.
2) Project 2 : Đèn sáng khi nhấn phím.
Sơ đồ mạch:
Code chương trình :
const int buttonPin = 2;
const int ledPin = 13;
int buttonState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT); }
void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH); }
else {
digitalWrite(ledPin, LOW);
}}
Giải thích chương trình :
Trước tiên ta khai báo hai biến để lưu trữ vị trí chân của phím nhấn và led :
const int buttonPin = 2;
const int ledPin = 13;
Phím nhấn sẽ ở vị trí chân số 2 và led chân số 13.
Ta khai báo một biến trang thái của phím nhấn là int buttonState = LOW;
Trong hàm setup() là khai chế độ (Mode) cho chân button và chân led. Chân button là chân ngõ vào và chân led là chân ngõ ra.
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
Trong hàm loop() ta có câu lệnh đầu tiên là :
buttonState = digitalRead(buttonPin);
Câu lệnh này có nghĩa là gán giá trị đọc được từ chân button (chân 2) cho biến buttonState.. buttonState sẽ có giá trị 0 nếu như button không được nhấn và có giá trị 1 nếu được nhấn. Bằng cách sử dụng hàm digitalRead() ta có thể kiểm tra được các chân digital đang ở mức cao hay thấp.
Sau khi đọc được giá trị có ở chân buttonPin ( chân 2) ta kiểm tra xem là button có nhấn hay không.
Nếu có tức là buttonState =HIGH thì lúc này ta bật led bằng lệnh digitalWrite()
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH); }
Ngược lại thì ta một lần nửa sử dụng hàm digitalWrite() để tắt led
else {
digitalWrite(ledPin, LOW);
}
3) Project 3 : Led sáng dần từ led 1 đến led 10 và ngược lại.
Sơ đồ mạch.
Hình 23: Led sáng dần từ led 1 đến led 10 và ngược lại.
Code chương trình.
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int direction = 1;
int currentLED = 0;
void setup() {
for (int x=0; x<10; x++) {
pinMode(ledPin[x], OUTPUT);} }
void loop() {
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(500);
}
Giải thích chương trình.
Trong Project này chúng ta sử dụng 10 chân digital để điều khiển 10 led, để cho chương trình ngắn gọn thì ở đây tôi sử dụng mảng 1 chiều gồm 10 phần tử trong đó chứa 10 vị trí chân led mà ta sử dụng trong project
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
Tiếp tục khai báo 2 biến integer là :
int direction = 1;
int currentLED = 0;
Trong hàm setup() tôi sử dụng một vòng lặp để định nghĩa mode cho các chân led. Tôi nghĩ là không khó để hiểu được các câu lệnh này.
Tiếp theo là hàm loop(), đầu tiên tôi tắt tất cả các led bằng các câu lệnh:
for (int x=0; x<10; x++) {
digitalWrite(ledPin[x], LOW);}
Sau đó cho sáng led đầu tiên bằng câu lệnh :
digitalWrite(ledPin[currentLED], HIGH);
Vì ta đã khai báo currentLED = 0 nên mãng sẽ truy xuất phần tử đầu tiên trong mãng có giá trị là 4 vì thế led ở vị trí chân digital số 4 sẽ sáng.
currentLED += direction;
Tăng currentLED lên 1 đơn vị ( direction =1 ). Vòng lặp tiếp theo sẽ là led ở chân digital 5 sáng và cứ như thế cho đến led ở chân số 13 sáng, thì lúc này currentLED == 9, câu lệnh “ if (currentLED == 9) {direction = -1;}” sẽ thực hiện và led sẽ sáng ngược lại từ led 10 xuống led thứ 1.
Hai câu lệnh :
if (currentLED == 9) {direction = -1;}
if (currentLED == 0) {direction = 1;}
dùng để quy định chiều sáng của led là tăng dần hay giảm dần. Nếu là Led thứ 10 sang thì tiếp theo sẽ giảm xuống led thứ 9 và ngược lại nếu led thứ 0 sang thì chu kỳ tiếp theo led 1 sẽ sáng.