Thursday, August 10, 2017

Lệnh digitalRead() trong chương trình Arduino

Trong bài viết này ta tìm hiểu về lệnh digitalRead() để đọc tín hiệu điện từ một chân digital (được thiết đặt là INPUT). Trả về 2 giá trị HIGH hoặc LOW.

Cú pháp lệnh digitalRead():

digitalRead(pin)

Thông số lệnh digitalRead():

  pin (chân) : giá trị của digital muốn đọc

Trả về giá trị

HIGH hoặc LOW

Ví dụ về lệnh digitalRead():

Ví dụ này sẽ làm cho đèn led tại pin 13 nhận giá trị như giá trị tại pin 2
int ledPin = 13; // chân led 13
int inPin = 2;   // button tại chân 2
int val = 0;     // biến "val" dùng để lưu tín hiệu từ digitalRead

void setup()
{
  pinMode(ledPin, OUTPUT);      // đặt pin digital 13 là output
  pinMode(inPin, INPUT);      // đặt pin digital 2 là input
}

void loop()
{
  val = digitalRead(inPin);   //  đọc tín hiệu từ digital2
  digitalWrite(ledPin, val);    // thay đổi giá trị của đèn LED là giá trị của digital 2
}

Một số chân số của chương trình arduino INPUT, INPUT_PULLUP và OUTPUT

Chân digital của arduino có thể được sử dụng như là INPUT, INPUT_PULLUP , hoặc OUTPUT Để thay đổi cách sử dụng một pin, chúng ta sử dụng hàm pinMode().
Cấu hình một chân là INPUT
Các chân của Arduino  được cấu hình là một INPUT với pinMode ( ) có nghĩa là làm cho pin ấy có trở kháng cao. Pin được cấu hình là INPUT làm việc tiêu thụ năng lượng điện của mạch rất nhỏ, nó tương đương với một loạt các điện trở 100 Mega-ôm ở phía trước của pin . Điều này làm cho chúng cực kì hữu ích cho việc đọc một cảm biến, nhưng không cung cấp năng lượng một đèn LED.
Nói một cách nôm na, dân dã, thì khi một chân được cấu hình là INPUT thì bạn sẽ dễ dàng đọc được các tín hiệu điện và đọc được từ bất cứ thứ gì (Có điện <= 5V)
Nếu bạn đã cấu hình chân là INPUT, bạn sẽ muốn chân có một tham chiếu đến mặt đất (GND, cực âm), thường được thực hiện với một điện trở kéo xuống.

Cấu hình một chân là INPUT_PULLUP

Chip Atmega trên Arduino có nội kéo lên điện trở (điện trở kết nối với hệ thống điện nội bộ) mà bạn có thể truy cập. Nếu bạn không thích mắc thêm một điện trở ở mạch ngoài, bạn có thể dùng tham số INPUT_PULLUP trong pinMode(). Mặc định khi không được kết nối với một mạch ngoài hoặc được kết nối với cực dương thì chân sẽ nhận giá trị là HIGH, khi pin được thông tới cực âm xuống đất thì nhận giá trị là LOW.

Cấu hình một chân là đầu ra (OUTPUT)

Để thiết đặt chân là một OUTPUT, chúng ta dùng pinMode ( ), điều này có nghĩa là làm cho pin ấy có một trở kháng thấp (cho dòng điện đi ra). Điều này có nghĩa, chân sẽ cung cấp một lượng điện đáng kể cho các mạch khác. Chân của vi điều khiển Atmega có thể cung cấp một nguồn điện liên tục 5V hoặc thả chìm ( cho điện thế bên ngoài chạy vào ) lên đến 40 mA ( milliamps ). Điều này làm cho chúng hữu ích để tạo năng lượng đèn LED nhưng vô dụng đối với các cảm biến đọc!
Lúc bấy giờ, nếu bạn làm làm ngắn mạch (digitalWrite 1 chân là HIGH rồi nối trực tiếp đến cực âm hoặc digitalWrite 1 chân là LOW rồi mắc trực tiếp đến cực dương, hoặc những việc làm tương tự) thì mạch sẽ bị hỏng! Ngoài ra, với dòng điện chỉ 40mA thì trong một số trường hợp chúng ta không thể làm cho mô tơ hoặc relay hoạt động được. Để làm chúng hoạt động thì chúng ta cần chuẩn bị cho mình một số mạch sử dụng các IC khuếch đại chuyên dụng (gọi là mạch giao tiếp)

Hàm nhập xuất analogReference() trong chương trình arduino

Hàm analogReference() có nhiệm vụ:

Đặt lại mức (điện áp) tối đa khi đọc tín hiệu analogRead. Ứng dụng như sau, giả sử bạn đọc một tín hiệu dạng analog có hiệu điện thế từ 0-1,1V. Nhưng mà nếu dùng mức điện áp tối đa mặc định của hệ thống (5V) thì khoảng giá trị sẽ ngắn hơn dẫn đến độ chính xác kém hơn và vì vậy hàm này ra đời để giải quyết việc đó.

Cú pháp hàm analogReference():

analogReference(type) 
type: một trong các kiểu giá trị sau: DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, hoặc EXTERNAL
Trong đó:
+ DEFAULT : Đặt mức điện áp tối đa là 5V (nếu trên mạch dùng nguồn 5V làm nuôi chính) hoặc là 3,3V (nếu trên mạch dùng nguồn 3,3V làm nguồn nuôi chính).
+ INTERNAL : Đặt lại mức điện áp tối đa  là 1,1 V (nếu sử dụng vi điều khiển ATmega328 hoặc ATmega168)
Đặt lại mức điện áp tối đa là 2,56V (nếu sử dụng vi điều khiển ATmega8).
+ INTERNAL1V1 : Đặt lại mức điện áp tối đa là 1,1 V ( Chỉ có trên Arduino Mega).
+ INTERNAL2V56 : Đặt lại mức điện áp tối đa là 2,56 V (Chỉ có trên Arduino Mega).
+ EXTERNAL : Đặt lại mức điện áp tối đa BẰNG với mức điện áp được cấp vào chân AREF ( Chỉ được cấp vào chân AREF một điện áp nằm trong khoảng 0-5V ).
Chú ý: 
Trường hơp, bạn sử dụng kiểu EXTERNAL cho hàm analogReference thì bạn  phải cấp nó một nguồn nằm trong khoảng từ 0-5V, và nếu bạn đã cấp một nguồn điện thỏa mãn điều kiện trên vào chân AREF thì bạn phải gọi dòng lệnh analogReference(EXTERNAL) trước khi sử dụng analogRead() ( nếu khồn sẽ làm hư mạch của bạn).

Hàm nhập xuất analogRead() trong chương trình ardunio

Nhiệm vụ của hàm analogRead():

Là đọc giá trị điện áp từ một chân Analog . Trên mạch Arduino UNO có 6 chân Analog In, được kí hiệu từ A0 đến A5. Trên các mạch khác cũng có những chân tương tự như vậy với tên chữ "A" đứng đầu, sau đó là số hiệu của chân.
analogRead() luôn trả về 1 số nguyên nằm trong khoảng từ 0 đến 1023 tương ứng với thang điện áp (mặc định) từ 0 đến 5V. Bạn có thể điều chỉnh thang điện áp này bằng hàm analogReference().
Hàm analogRead() cần 100 micro giây để thực hiện.

Cú pháp hàm analogRead():

analogRead(chân đọc điện áp);

Ví dụ hàm analogRead():

int voltage = analogRead(A0);
Trong đó A0 là chân dùng để đọc giá trị điện áp.
Nếu bạn chưa kết nối chân đọc điện áp, hàm analogRead() sẽ trả về một giá trị ngẫu nhiên trong khoảng từ 0 đến 1023. Để khắc phục điều này, bạn phải mắc thêm một điện trở có trị số lớn (khoảng 10k ohm trở lên) hoặc một tụ điện 104 từ chân đọc điện áp xuống GND.

Sơ đồ đấu nối dây của arduino để đo điện áp sử dụng hàm analogRead(chân đọc điện áp):

sơ đồ đấu nối chân arduino để đo điện áp sử dụng hàm analogRead.
sơ đồ đấu nối dây của arduino để đo điện áp sử dụng hàm analogRead
sử dụng hàm analogRead để đọc giá trị điện áp

sơ đồ đấu nối trực tiếp sử dụng điện trở 10k và mạch arduino

Wednesday, August 9, 2017

HÀM NHẬP XUẤT ANALOGWRITE() TRONG ARDUINO

Nhiệm vụ của hàm analogWrite():

analogWrite() là lệnh xuất ra từ một chân trên mạch Arduino một mức tín hiệu analog (phát xung PWM). Người ta thường điều khiển mức sáng tối của đèn LED hay hướng quay của động cơ servo bằng cách phát xung PWM như thế này.
Bạn không cần gọi hàm pinMode() để đặt chế độ OUTPUT cho chân sẽ dùng để phát xung PWM trên mạch Arduino.

Cú pháp hàm analogWrite():

analogWrite([chân phát xung PWM], [giá trị xung PWM]);
Giá trị mức xung PWM nằm trong khoảng từ 0 đến 255, tương ứng với mức duty cycle từ 0% đến 100%

Ví dụ hàm analogWrite():

int led = 10;

void setup() {
}

void loop() {
         for (int i = 0; i <= 255; i++) 
                {
                 analogWrite(led,i);
                 delay(20);
                 }
            }
Đoạn code trên có chức năng làm sáng dần một đèn LED được kết nối vào chân số 10 trên mạch Arduino

CÁCH SỬ DỤNG XUNG PWM TRONG CHƯƠNG TRÌNH ARDUINO

Kiến thức cần nắm về xung:

Xung là các trạng thái cao / thấp về mức điện áp được lặp đi lặp lại. Đại lượng đặc trưng cho 1 xung PWM (Pulse Width Modulation) bao gồm tần số (frequency) và chu kì xung (duty cycle).
Vậy tần số tần số là gì???
Tần số là số lần lặp lại trong 1 đơn vị thời gian. Đơn vị tần số là Hz, tức là số lần lặp lại dao động trong 1 giây.
Lấy ví dụ, 1Hz = 1 dao động trong 1 giây. 1KHz = 1000 dao động trong 1 giây. 16MHz = 16 triệu dao động trong 1 giây.
Cách xác định 1 dao động như thế nào? Đa phần các bạn mới nghiên cứu điện tử thường mắc sai lầm ở việc xác định 1 dao động. Dao động được xác định từ trạng thái bắt đầu và kết thúc ngay trước khi trạng thái bắt đầu được lặp lại.
dao động của xung PWM
Khoảng cách giữa hai vạch đỏ là 1 dao động

Như vậy thông thường, 1 dao động sẽ bao gồm 2 trạng thái điện: mức cao (x giây) và mức thấp (y giây). Tỉ lệ phần trăm thời gian giữa 2 trạng thái điện này chính là chu kì xung.
Với x/y = 0% ta có xung chứa toàn bộ điện áp thấp.
Với x/y = 50% thì 50% thời gian đầu, xung có điện áp cao, 50% sau xung có điện áp thấp.
Với x/y=100% ta có xung chứa toàn bộ điện áp cao.
Tóm lại, với 1 xung ta có:
    + Tần số: để tính toán ra được thời gian của 1 xung
    + Chu kì xung: bao nhiêu thời gian xung có mức áp cao, bao nhiêu thời gian xung có mức áp thấp.

Và trong arduino khái niệm xung PWM ta hiểu như thế nào??

Hàm analogWrite() trong Arduino giúp việc tạo 1 xung dễ dàng hơn. Hàm này truyền vào tham số cho phép thay đổi chu kì xung. Tần số xung được Arduino thiết lập mặc định.
Đối với board Arduino Uno, xung trên các chân 3,9,10,11 có tần số là 490Hz, xung trên chân 5,6 có tần số 980Hz.
cách sử dụng xung PWM trong arduino
Xung được sử dụng với hàm analogWrite trong Arduino

KIỂU DỮ LIỆU INT TRONG CHƯƠNG TRÌNH ARDUINO

Kiểu int là kiểu số nguyên chính được dùng trong chương trình Arduino.

Kiểu int chiếm 2 byte bộ nhớ !
Trên mạch Arduino Uno, nó có đoạn giá trị từ -32,768 đến 32,767 (-215 đến 215-1) (16 bit)
Trên mạch Arduino Due, nó có đoạn giá trị từ -2,147,483,648 đến 2,147,483,647 (-231 đến 231-1) (32 bit) (lúc này nó chiếm 4 byte bộ nhớ)

Ví dụ về kiểu dữ liệu int:

int ledPin = 13;

Cú pháp kiểu dữ liệu int:

int var = val; 
var: tên biến
val: giá trị