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ị

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

Để định nghĩa 1 kiểu số thực, bạn có thể sử dụng kiểu dữ liệu float.

Một biến dùng kiểu dữ liệu này có thể đặt một giá trị nằm trong khoảng  -3.4028235E+38 đến 3.4028235E+38. Nó chiếm 4 byte bộ nhớ.
Với kiểu dữ liệu float bạn có từ 6-7 chữ số có nghĩa nằm ở bên mỗi bên dấu ".". Điều đó có nghĩa rằng bạn có thể đặt một số thực dài đến 15 ký tự (bao gồm dấu .)

Lưu ý trong sử dụng kiểu dữ liệu float:

Để biểu diễn giá trị thực của một phép chia bạn phải 2 số thực chia cho lẫn nhau. Ví dụ: bạn xử lý phép tính 5.0 / 2.0 thì  kết quả sẽ trả về là 2.5. Nhưng nếu mà bạn xử lý phép tính 5 / 2 thì kết quả sẽ là 2 (vì hai số nguyên chia nhau sẽ ra một số nguyên).

Ví dụ về kiểu dữ liệu float trong chương trình ardunio:

float myfloat;
float sensorCalbrate = 1.117;

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

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

Code tham khảo sử dụng kiểu dữ liệu float:

int x;
int y;
float z;
x = 1;
y = x / 2;            // y sẽ trả về kết quả là 0
z = (float)x / 2.0;   //z sẽ có kết quả là 0.5 (bạn nhập 2.0, chứ không phải là 2)

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

Kiểu dữ liệu char là kiểu dữ liệu biểu diễn cho 1 ký tự.

Nếu bạn cần biểu diễn một chuỗi trong chương trình Arduino - bạn cần sử dụng kiểu dữ liệu String. Kiểu dữ liệu này chiếm 1 byte bộ nhớ!
Kiểu char chỉ nhận các giá trị trong bảng mã ASCII.
Kiểu char được lưu dưới dạng 1 số nguyên byte có số âm (có các giá trị từ -127 - 128), thay vì thiết đặt một biến kiểu char có giá trị là 'A', bạn có thể đặt là 65. Để hiểu rõ hơn bạn xem ví dụ dưới đây.

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

char myChar = 'A';
char myChar = 65;      // cả 2 cách khai báo đều hợp lệ

CÁCH NẠP MỘT CHƯƠNG TRÌNH ĐƠN GIẢN CHO ARDUINO

Ở bài viết này các bạn sẽ được hướng dẫn cách nạp chương trình đơn giản  điều khiển đèn LED nhấp nháy theo chu kì 2 giây cho Arduino Uno R3.
Trước tiên hãy đảm bảo rằng máy tính của bạn đã cài đặt Arduino IDE và Arduino driver . Nếu chưa bạn hãy xem bài viết này và thực hiện theo nha. Và nếu các bạn chương biết về cấu trúc của một chương trình arduino bạn hãy xem bài viết cấu trúc chương trình arduino.
Khi phần mền xong ta hãy chuẩn bị phần cứng như sau:
+ Một board Arduino uno r3.
+ Một sợi dậy cáp ( để kết nối arduino với máy tính).
Các bạn hãy làm theo các bước sau để nạp được chương trình cho arduino uno r3.
Bước 1: Kết nối arduino uno r3 với máy tính.
nạp chương trình cho arduino uno r3
Kết nối arduino uno r3 với máy tính
Bước 2: Tìm cổng kết nối của Arduino Uno R3 với máy tính.
Khi Arduino Uno R3 kết nối với máy tính, nó sẽ sử dụng một cổng COM để máy tính và bo mạch có thể truyền tải dữ liệu qua lại thông qua cổng này. Windows có thể quản lí đến 256 cổng COM. Để tìm được cổng COM đang được sử dụng để máy tính và mạch Arduino UNO R3 giao tiếp với nhau, bạn phải mở chức năng Device Manager của Windows.
chương trình arduino uno r3
Mở cửa sổ Device Manager lên để tìm cổng COM kết nối với arduino uno r3
Mở mục Ports (COM & LPT), bạn sẽ thấy cổng COM Arduino Uno R3 đang kết nối.
chọn cổng COM cho arduino uno r3
Ở đây arduino uno r3 được kết nối với COM3
Thông thương Windows sẽ sử dụng lại cổng COM3 để kết nối nên bạn không cần thực hiện thêm thao tác tìm cổng COM này nữa.
Bước 3: Nạp chương trình cho arduino uno r3.
Ta hãy thử nạp chương trình có sẵn trong arduino IDE trước. Trước tiên bạn hãy làm các thao tác sau.
cách nạp chương trình cho arduino uno r3
Các bạn lưu ý nhớ chọn đúng board ardunio mình sử dụng 
Tiếp theo vào menu Tools -> Serial Port -> chọn cổng Arduino đang kết nối với máy tính.
chọn cổng COM cho arduino uno r3
Chọn cổng COM cho arduino IDE
Xác nhận cổng COM của Arduino IDE ở góc dưới cùng bên phải cửa sổ làm việc.
Xác nhận cổng COM 
Vào menu Tools -> Programmer -> chọn AVR ISP
chọn chíp phù hợp cho arduino uno
Lưu ý các bạn phải chọn AVR ISP
Tiếp theo ta nạp mã nguồn chương cho arduino uno r3.
mở và nạp chương trình mẫu cho arduino
Mở chương trình mẫu của arduino IDE
Bạn sẽ thấy Arduino IDE mở một cửa sổ mới chứa mã nguồn Blink. Chương trình  này có chức năng là điều khiển đèn LED 13 màu cam trên mạch Arduino Uno R3 nhấp nháy với chu kì 1 giây.
chương trình mẫu của arduino uno r3
Cửa sổ chương trình "Blink" hiện ra
Và ta làm 1 thao tác cuối cùng để nạp chương trình.
nạp chương trình cho arduino
Đúp chuột vào chổ chỉ của dấu mũi tên để đổ chương trình xuống arduino uno r3
CHÚC CÁC BẠN THÀNH CÔNG!!!

CÁCH CÀI THƯ VIỆN VÀO ARDUINO IDE

Thư viện trong Arduino chứa các mã nguồn có những đặc điểm chung, được xây dựng thành một gói bao gồm file:examples, .h, .cpp,...Nhằm giúp người sử dụng giải quyết được vấn đề nhanh chóng, trong bài viết này tôi sử dụng thư viện I2C làm ví dụ để cài đặt vào Arduino IDE.
Sau khi tải thư viện I2C về với file .zip, ta vào Sketch/ Include Library/Add sau đó chọn file vừa tải về:
cài thư viện vào arduino IDE
Nếu cửa sổ Arduino IDE báo dòng chữ dưới đây thì đã cài thành công.
cài thư viện cho arduino IDE hổ trợ lập trình
Dòng trong ô đỏ là báo đã cài thư viện vào arduino IDE thành công
Tất cả thư viện của arduino IDE ta nên đặt trong 1 file.
Cài xong ta reset lại Arduino IDE và xem lại thư viện I2C đã có trong IDE chưa.
kiểm tra lại thư viện đã có trong arduino IDE chưa
Như vậy là đã cài xong thư viện I2C vào arduino IDE
CHÚC CÁC BẠN THÀNH CÔNG!!!

THAY ĐỔI ĐỘ SÁNG CỦA ĐÈN LED BẰNG ARDUINO

Trong bài viết này chúng ta sẽ tìm hiểu cách sử dụng các chân digital để xuất giá trị analog và ứng dụng chúng trong việc làm thay đổi độ sáng của đèn (làm mờ đèn).

Phần cứng cần thiết để làm thay đổi độ sáng của đèn: 

+ 1 Breadboard
+ Dây cắm breadboard
+ 1 điện trở 560 Ohm (hoặc 220 Ohm hoặc 1kOhm)
+ 1 đèn LED siêu sáng.
Những linh kiện trên đều được tích hợp trong bộ tự học arduino.

Lắp mạch điều khiển thay đổi độ sáng đèn LED.

thay đổi độ sáng của đèn led bằng arduino
Thay đổi độ sáng đèn LED bằng arduino

Nếu ta có bộ tự học arduino thì viêc thực hành sẽ dễ dàng hơn.

điều khiển đèn led bằng arduino

Code điều khiển thay đổi độ sáng đèn LED.

Lưu ý những chân digital có dấu ~ phía trước và những chân analog mới hỗ trợ analogWrite.
int led = 6;           // cổng digital mà LED được nối vào
int brightness = 0;    // mặc định độ sáng của đèn 
int fadeAmount = 5;    // mỗi lần thay đổi độ sáng thì thay đổi với giá trị là bao nhiêu
void setup()  {
                      pinMode(led, OUTPUT);  // pinMode đèn led là OUTPUT
                      }
void loop()  {
                       analogWrite(led, brightness);       //xuất giá trị độ sáng đèn LED
                       brightness = brightness + fadeAmount;          // thay đổi giá trị là đèn LED
// Đoạn code này có nghĩa nếu độ sáng == 0 hoặc bằng == 255 thì sẽ đổi chiều của biến thay đổi độ sáng. Ví dụ, nếu đèn từ sáng yếu --> sáng mạnh thì fadeAmount dương. Còn nếu đèn sáng mạnh --> sáng yếu thì fadeAmmount lúc này sẽ có giá trị âm
                   if (brightness == 0 || brightness == 255) {
                                                                                  fadeAmount = -fadeAmount ;
                                                                                    }   
                   delay(30);             //đợi 30 mili giây để thấy sự thay đổi của đèn                
                     }

CHÚC CÁC BẠN THÀNH CÔNG!!!

ĐIỀU KHIỂN 8 ĐÈN LED SÁNG THEO YÊU CẦU BẰNG ARDUINO.

Trong bài viết này, chúng ta sẽ học cách điều khiển 8 đèn LED và chúng ta sẽ hiểu được cách làm thế nào để điều khiển nhiều led bằng cách sử dụng các chân digital, hoặc sử dụng IC HC595!

Phần cứng cần chuẩn bị cho việc điều khiển 8 đèn LED sáng theo yêu cầu.

+ 8 điện trở 560 Ohm (hoặc 220 Ohm hoặc 1kOhm).
+ Breadboard.
+ Dây cắm breadboard.
+ 8 đèn LED siêu sáng.

1. Ta điều kiển 8 led bằng 8 chân digital của arduino.

Ta tiến hành lắp mạch:
điều khiển 8 led bằng arduino
Ta nối các chân từ chân số 2 đến chân số 9 lần lượt cho 8 led
Và được lắp trên bộ tự học arduino.
điều khiển 8 led đơn bằng arduino
Sau đây là đoạn code lập trình, các bạn chỉ cần copy vào dán vào Arduino IDE thôi.
byte ledPin[] = {2,3,4,5,6,7,8,9}; // Mảng lưu vị trí các chân Digital mà các đèn LED sử dụng theo thứ tự từ 1->8. Bạn có thể thêm các LED bằng cách thêm các chân digital vào mảng này
byte pinCount; // Khai báo biến pinCount dùng cho việc lưu tổng số chân LED
void setup() {
   pinCount = sizeof(ledPin);  //Xem thêm thông tin về hàm sizeof 
  for (int i=0;i<pinCount;i++) {
  pinMode(ledPin[i],OUTPUT);  //Các chân LED là OUTPUT
  digitalWrite(ledPin[i],LOW); //Mặc định các đèn LED sẽ tắt
                                           }
}
void loop() {
  /*
    Bật tuần tự các đèn LED
  */
  for (int i=0; i < pinCount; i++) {
    digitalWrite(ledPin[i],HIGH); //Bật đèn
    delay(500); // Dừng để các đèn LED sáng dần
                                                 }
  /*
    Tắt tuần tự các đèn LED
  */
  for (int i = 0;i < pinCount; i += 1) {
    digitalWrite(ledPin[i],LOW); // Tắt đèn
    delay(500); // Dừng để các đèn LED tắt dần
                                                    }
                      }

Nếu các bạn chưa biết cách nạp chương trình thì hãy xem bài viết này.

2. Điều khiển 8 LED với 1 IC 595 và arduino uno r3.

Datasheet của IC hc595:
datasheet của ic 595
Datasheet IC hc595
Trước hết chúng ta cần bật IC hc595 lên. Bạn hãy nối mạch như sau:
+ GND (pin 8) nối đến cực âm
+ Vcc (pin 16) nối đến chân 5V
+ OE (pin 13) nối đến cực âm
+ MR (pin 10) nối đến chân 5V
mở ic HC595
Cấp nguồn cho IC HC595 bằng arduino
Tiếp theo, chúng ta sẽ nối Arduino với IC HC595.
+ DS (pin 14)đến Arduino DigitalPin 11
+ SH_CP (pin 11)đến Arduino DigitalPin 12
+ ST_CP (pin 12)đến ArduinoDigitalPin 8.
Sau đó, bạn sử dụng 8 đèn LED của chúng ta đã mắc ban đầu và mắc theo như sơ đồ dưới đây.
arduino uno r3 và ic hc595 điều khiển 8 led
Sơ đồ đấu nối Arduino, IC HC595 và 8 led.
Và việc đấu nối dây trong bộ tự học arduino sẽ dễ dàng hơn.
bộ tự học arduino uno và ic hc595
Để điều khiển được LED qua IC HC 595, chúng ta phải làm quen với một kỹ thuật, được gọi là shiftOut. Bạn chỉ cần hiểu đơn giản, shiftOut là việc gửi tín hiệu cho 1 IC có hỗ trợ shiftOut (ví dụ HC 595 này), cứ mỗi lần gửi nó gửi 1 byte, mỗi 1 bit (có tổng cộng 8 bit trong 1 byte) sẽ quản lý giá trị điện tại chân tín hiệu của HC 595 (các chân có tên là Q0-Q7).
Còn IC 595 sẽ nhận lệnh shiftOut của Arduino và sẽ quản lý 8 chân tín hiệu của nó (các chân có tên Q0-Q7) bằng 1 byte ⇔ 8 bit (từ bit 0 đến bit 7). Nếu tại bit 0 có giá trị là 1 ⇒ Q0 được nối với nguồn 5V, nếu bit 0 có giá trị là 0 thì Q0 sẽ được nối tới cực âm, tương tự với các 7 bit còn lại.

Code chương trình điều khiển 8 đèn led bằng arduino và IC HC595.

/*
shiftOut với 8 LED bằng 1 IC HC595
*/
//chân ST_CP của 74HC595
int latchPin = 8;
//chân SH_CP của 74HC595
int clockPin = 12;
//Chân DS của 74HC595
int dataPin = 11;
//Trạng thái của LED, hay chính là byte mà ta sẽ gửi qua shiftOut
byte ledStatus;
void setup() {
  //Bạn BUỘC PHẢI pinMode các chân này là OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
void loop() {
  /*
    Trong tin học, ngoài các phép +, -, *, / hay % mà bạn đã biết trên hệ cơ số 10.
    Thì còn có nhiều phép tính khác nữa. Và một trong số đó là Bit Math (toán bit) trên hệ cơ số 2.
    Để hiểu những gì tôi viết tiếp theo sau, bạn cần có kiến thức về Bit Math.
          */
  //Sáng tuần tự
  ledStatus = 0;//mặc định là không có đèn nào sáng hết (0 = 0b00000000)
  for (int i = 0; i < 8; i++) {
    ledStatus = (ledStatus << 1) | 1;//Đẩy toàn bộ các bit qua trái 1 bit và cộng bit có giá trị là 1 ở bit 0 
       /**
      Bắt buộc phải có để shiftOut
    **/
        digitalWrite(latchPin, LOW); //các đèn LED sẽ không sáng khi bạn digital LOW
    //ShiftOut ra IC
    shiftOut(dataPin, clockPin, MSBFIRST, ledStatus); 
    digitalWrite(latchPin, HIGH);//các đèn LED sẽ sáng với trạng thái vừa được cập nhập
    /**
      Kết thúc bắt buộc phải có
    **/
    delay(500); // Dừng chương trình khoảng 500 mili giây để thấy các hiệu ứng của đèn LED
  }
  //Tắt tuần tự
  for (int i = 0;i<8;i++) {
    ledStatus <<= 1; //Đẩy tất cả các bit qua bên trái 1 bit
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, ledStatus); 
    digitalWrite(latchPin, HIGH);
    delay(500);
  }
}