Học Arduino qua dự án làm xe điều khiển từ xa - Phần 2: Bật tắt đèn

Trong phần 2 của loạt bài "Học Arduino qua dự án làm xe điều khiển từ xa", mình sẽ hướng dẫn các bạn:

  • Cách làm một module đèn LED đơn giản
  • Cách điều khiển nhiều đèn LED sử dụng transistor.
  • Cách lập trình bật/tắt đèn LED. 

 Mình sẽ hướng dẫn các bạn làm trên breadboard, phần hàn mạch các bạn tự làm vì nó không có gì phức tạp cả. 

Loạt bài "Học Arduino qua dự án làm xe điều khiển từ xa"

1/ Mở đầu vấn đề

Bạn cần xây dựng một module gồm 10 đèn LED có thể được điều khiển bật/tắt (chỉ chuyển đổi trạng thái, không quan tâm đến trạng thái là bật hay tắt). Việc điều khiển này được thực hiện bằng 1 chân trên mạch Arduino UNO R3

Để làm được module đèn LED trên xe điều khiển từ xa, bạn phải giải quyết được vấn đề trên. Hãy cùng xem video dưới đây để xem module đèn LED trên xe hoạt động như thế nào.

ps: không bàn tới cái màn hình và tay điều khiển nhé :D Mình sẽ viết về chúng sau :D

Video: Demo cách hoat động của module đèn LED 

Hình 1: Vị trí của module đèn LED trong hệ thống (ô màu vàng)

2/ Chuẩn bị

  • 1 breadboard (full-size)
  • 4 dây cắm breadboard loại male-male.
  • 1 mạch Arduino UNO R3.
  • 10 đèn LED cùng màu.
  • 1 transistor 2N3904 (hoặc tương đương).
  • 1 điện trở 220 Ohm.
  • 1 điện trở 68 Ohm.
  • 1 điện trở 1K Ohm. 

Nếu không có linh kiện như trên, các bạn có thể chọn linh kiện khác với thông số kĩ thuật tương đương, hoặc hỏi mình ở phần comment dưới bài viết.

3/ Lượn qua về mạch điện

3.1/ Ví dụ thần thánh - Blink

Đầu tiên, ta hãy bắt đầu với ví dụ Blink thần thánh của Arduino - Làm một đèn LED nhấy nháy theo chu kì 1 giây. Có thể xem Blink như là chương trình "Hello world !" dành cho nền tảng Arduino.

Hình 2: Cách lắp mạch cho ví dụ Blink ở chân 13.

Phần lập trình cho ví dụ Blink, có lẽ cũng quá quen thuộc với nhiều bạn rồi :D

int led = 13;  // Dùng chân 13 để điều khiển đèn

void setup()
{
    pinMode(led, OUTPUT);   // Khai báo chân 13 ở chế độ OUTPUT
iây

void loop()
{
    digitalWrite(led, HIGH);    // Bật đèn
    delay(1000);                // Chờ 1 giây (1000 mili giây)
    digitalWrite(led, LOW);     // Tắt đèn
    delay(1000);                // Chờ 1 giây
}

Điện trở 220 Ohm trong ví dụ này có nhiệm vụ giúp dòng điện ở chân 13 ở mức an toàn, cụ thể ở đây là: 5V (điện áp ở chân 13) / 220 Ohm = 23mA. Nên nhớ rằng cường độ dòng điện tối đa qua một chân trên mạch Arduino là 40 mA.

3.2/ Vấn đề phát sinh - Sáng yếu

Bây giờ, bạn hãy mắc thêm 9 đèn LED nữa song song với đèn đã có. Vấn đề sẽ phát sinh, bạn sẽ nhanh chóng nhận ra nó thôi.

Hình 3: Arduino UNO R3 đang cố gắng điều khiển 10 đèn LED

Bạn có thấy rằng 10 đèn LED này sáng yếu hơn so với 1 đèn LED ban nãy không ? Đó là vì dòng điện giúp 1 đèn LED phát sáng (như ví dụ Blink ban đầu) bây giờ phải chia sẻ cho 10 đèn.

Thực tế mà nói, chênh lệch về độ sáng là không nhiều. Nhưng mình không muốn các bạn phải lắp 20, 30 cái đèn để thấy rõ sự chênh lệch, nên 10 đèn là đủ :D

Nếu bạn loay hoat tìm cách làm cho 10 đèn LED sáng bình thường bằng cách tìm trên Google hay táy máy vào mạch điện, xin chúc mừng, bạn có khiếu học Arduino đấy :D

Bạn có thể sẽ nghĩ tới ý tưởng giảm trị số của điện trở xuống để tăng dòng điện lên. Nhưng không, đó là một ý tưởng sai lầm, bạn có thể làm hỏng chip điều khiển trên Arduino UNO R3 (vì dòng qua một chân điều khiển chỉ có tối đa là 40mA). Nếu giảm xuống 100 Ohm chẳng hạn, dòng điện sẽ là 50mA, Oh Noooooooooooo.

Có thể một số bạn khác còn nghĩ đến chuyện tháo bỏ điện trở 220 Ohm luôn. Ồ, đây là một hành động thiếu suy nghĩ hơn nữa. Đèn LED xét về cấu tạo là một diode, do vậy việc tháo điện trở ra tương đương với việc chân điều khiển của Arduino UNO R3 bị nối thẳng xuống GND (dòng điện từ chân 13 qua đèn LED (diode) rồi xuống GND). Khi đó, dòng điện trong mạch trên lí thuyết sẽ là cộng vô cực. Bạn có thể tham khảo Mục 1Mục 10 tại bài viết Làm sao để phá hỏng Arduino Uno R3 để biết thêm chi tiết. 

Diode là một loại linh kiện điện tử bán dẫn. Đặc trưng của diode là chỉ cho phép dòng điện đi qua nó từ cực anode (+) sang cathode(-), không có chiều ngược lại.

3.3/ Đi tìm vị cứu tinh - transistor

Trong trường hợp này, chúng ta sẽ sử dụng một loại linh kiện điện tử bán dẫn là transistor (loại BJT). Linh kiện này vừa giúp cả 10 đèn LED đều sáng bình thường, mà vừa giúp Arduino UNO R3 điều khiển được 10 đèn ấy.

BJT chỉ một họ transistor. Thường thì khi nói về transistor, bạn sẽ hay gặp loại transistor BJT hơn là các loại khác (thử Google sẽ thấy :D) nhưng để đúng về mặt ý nghĩa, mình vẫn ghi đầy đủ là transistor (BJT) để tránh cho người đọc hiểu nhầm sang loại transistor khác.

Trong mạch điện, transistor (BJT) đóng vai trò như một cái cầu dao đóng ngắt mạch điện đi qua 2 chân của nó, chân còn lại đóng vai trò là chân điều khiển. Bạn có thể hình dùng transistor nó giống như thế này.

Hình 4: Transistor (BJT) = công tắc

Về cơ bản, transistor (BJT) là một cái công tắc đóng mở cho dòng điện chạy qua. Transistor chỉ khác công tắc thường ở chỗ nó chỉ cho dòng điện qua theo 1 chiều, và bạn không cần dùng tay để đóng/ngắt nó :)

Xem chi tiết hơn về transistor tại Transistor (BJT) và ứng dụng trong điều khiển động cơ DC

Về tổng quát, một transistor (BJT) có 3 cực là B (Base), C (Collector) và E (Emitter).

Với loại NPN:

  • Dòng điện đi từ C sang E.
  • Chân B ở mức HIGH thì transistor (BJT) mở cho dòng điện chạy qua và ngược lại.

Với loại PNP

  • Dòng điện đi từ E sang C
  • Chân B ở mức LOW thì transistor (BJT) mở cho dòng điện chạy qua và ngược lại.

Hình 5: Mô tả sơ lược transistor NPN và PNP - learningaboutelectronics.com

Ở đây, ta sẽ dùng transistor 2N3904 loại NPN. Đây là loại transistor rất phổ biến, đồng thời cũng cho phép ta điều khiển một dòng điện lên đến 200mA - vừa đủ cho 10 đèn LED.

Hình 6: Sơ đồ chân của transistor 2N3904

Nào, ta hãy thử lắp lại mạch ở Hình 2

Hình 7: Điều khiển 10 đèn LED bằng transistor 2N3904

Điện trở 68 Ohm ở đây đóng vai trò tương tự như điện trở 220 Ohm ở Hình 1Hình 2 (phải giảm trị số xuống để đảm bảo đủ dòng điện cung cấp cho 10 đèn LED chia nhau xài :D).

Điện trở 1K Ohm giúp giảm dòng điện qua chân B của transistor (vì ta chỉ cần điện áp ở mức HIGH ở chân B để mở transistor). Dòng điện quá lớn qua chân B có thể làm hỏng transistor.

OK, hình này sẽ giúp bạn hiểu rõ hơn về mạch ở Hình 6. Người ta hay gọi loại mạch này là Sơ đồ nguyên lí (Schematic)

Hình 8: Sơ đồ nguyên lí điều khiển 10 đèn LED bằng transistor 2N3904

4/ Lập trình khó xơi

4.1 Viết hàm

Nãy giờ bạn đã thấy mớ đèn LED của mình hoạt động rồi. Bây giờ ta phải lập trình tí để có thể tự điều khiển nó bật tắt một cách thuận tiện hơn. Vì vậy, ta cần viết một hàm như thế này.

void toggleLED();

Hàm toggleLED() cho phép bạn đảo trạng thái của đèn LED từ bật sang tắt, hoặc tắt sang bật. Điều này có nghĩa là thay vì bạn phải ra lệnh "Bật đèn" hay "Tắt đèn" như ví dụ Blink, bây giờ bạn chỉ cần ra lệnh "Đảo trạng thái của đèn". OK, chuyện điều khiển sẽ dễ dàng hơn vì bạn không quan trọng chuyện đèn đang bật hoặc tắt.

...... dừng lại, cho bạn 5 phút suy nghĩ cách viết hàm toggleLED(). Đã hết 5 phút, mời bạn đọc tiếp (vì sự thật là như vậy :D)

Chúng ta sẽ cần một biến toàn cục (bạn có thể dùng biến này trong mọi nơi trong chương trình) để lưu trạng thái hiện tại của đèn LED. Biến này dùng kiểu bool (true/false) là hợp lí vì ta chỉ cần lưu 2 trạng thái bật/tắt.

Hàm setup() của ta sẽ giống thế này:

bool LEDstatus;

void setup()
{
    LEDstatus = false;
}

Hoặc ta gán giá trị cho biến lúc khai báo luôn (thường làm cách này hơn).

int LEDstatus = false;

void setup()
{

}

Tiếp tục, ta sẽ viết hàm điều khiển. Hãy bắt đầu chuyện này bằng một thứ ngôn ngữ dễ nuốt nào.

Định nghĩa hàm không có dữ liệu trả về toggleLED
{
    Nếu đèn đang tắt
        Bật đèn
        Ghi nhận trạng thái bật đèn
        // Thông báo đã bật đèn
    ngược lại (có nghĩa là đèn đang bật)
        Tắt đèn
        Ghi nhận trạng thái tắt đèn
        // Thông báo đã tắt đèn
}

Bây giờ thì có lẽ bạn sẽ dễ hiểu đoạn code dưới đây hơn

void toggleLED()
{
    if (LEDstatus == false)
    {
        // Bật đèn
        digitalWrite(LED, HIGH);
        LEDstatus = true;
    } else
    {
        // Tắt đền
        digitalWrite(LED, LOW);
        LEDstatus = false;
    }
}

4.2 Chương trình đầy đủ

int led = 13;           // Điều khiển LED ở chân 13
bool LEDstatus = false; // Trạng thái ban đầu là tắt

void setup()
{
    pinMode(led, OUTPUT);
}

void loop()
{
    toggleLED();        // Chuyển trạng thái của LED
    delay(1000);        // Chờ 1 giây
    toggleLED();        // Chuyển trạng thái của LED
    delay(1000);        // Chờ 1 giây
}

void toggleLED()
{
    if (LEDstatus == false) // Nếu LED đang tắt thì bật nó lên
    {
        digitalWrite(led, HIGH);
        LEDstatus = true;
    } else                  // Ngược lại, tắt nó đi
    {
        digitalWrite(led, LOW);
        LEDstatus = false;
    }
}

5/ Vì sao nãy giờ mình lại hướng dẫn những điều trên ?

Vì nó là nền tảng để các bạn làm được nhiều việc hơn, đặc biệt là cách sử dụng transistor. Thực sự mà nói, không thể nào miêu tả đúng về transistor chỉ trong vài dòng. Do vậy điều mình luôn muốn chuyển tới người đọc không phải là chân trời kiến thức, mà là con đường dẫn tới chân trời kiến thức. Bạn có thể dễ dàng nắm bắt và áp dụng một định luật/định lí nào đó, nhưng con đường để tìm ra định luật/định lí ấy, chẳng có mấy người biết được.

6/ Tổng hợp những gì ta đã có được

  • Một mạch điện ở Hình 7/Hình 8
  • Code bật tắt đèn ở mục 4.2

Hãy cất những thứ này đi và bắt tay vào cùng tìm hiểu với mình về Mạch điều khiển động cơ ở bài viết tiếp theo nhé.

Cảm ơn các bạn đã theo dõi.

Nếu bạn cần bất kì điều gì hay có ý kiến đóng góp gì, xin đừng ngần ngại nói lên ở phần comment của bài viết. Mình luôn nghiêm túc lắng nghe mọi ý kiến phản hồi.

lên
12 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

lowByte()

lowByte() là hàm trả về byte cuối cùng (8 bit cuối cùng) của một chuỗi các bit. Một số nguyên bất kì cũng được xem như là một chuỗi các bit, vì bất kì số nguyên nào cũng có thể biểu diễn ở hệ nhị phân dưới dạng các bit "0" và "1".

lên
0 thành viên đã đánh giá bài viết này hữu ích.

[Intel Galileo] Cài đặt Linux Yocto (iot-devkit) lên Intel Galileo

Để hỗ trợ cho nền tảng Galileo của mình, Intel đã cho ra mắt bộ Intel IoT Developer Kit (iot-devkit) bao gồm cả haware (các linh kiện giống như trên nền tảng Arduino) và software (OS, IDE, các tool phát triển,...). Trong bài viết này, mình sẽ hướng dẫn các bạn cài Linux Yocto - là một hệ điều hành thuộc nhánh Software trong iot-devkit.

lên
4 thành viên đã đánh giá bài viết này hữu ích.