10:34 PM
1

Điều khiển 8 đèn LED sáng theo ý muốn của bạn, dễ hay khó?

Giới thiệu, nội dung cần nắm
     Hôm nay, chúng ta sẽ học cách điều khiển 8 đèn LED. Vấn đề này, vừa dễ lại vừa khó, vậy nó dễ chỗ nào, khó chỗ nào, chúng ta cùng nhau tìm hiểu nhé!
     Qua bài học này, bạn 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!

Bạn sẽ làm được gì trong ngày hôm nay?

Tôi mắc mạch không được đẹp lắm, các bạn hãy làm nó đẹp hơn tôi nhé
và đừng quên chia sẻ cho cộng đồng dưới mục bình luận!


Video hoạt động của mạch, bạn sẽ làm nhiều hiệu ứng hơn tôi chứ ?

Phần cứng

  • Arduino Uno
  • 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 (tất cả các loại màu đều được cả, bạn không cần chuẩn bị 8 LED sáng cùng màu như tôi, hãy thử mua nhiều LED khác màu và lắp nhấp nháy theo ý mình nhé).

Thời gian

  1. Nếu bạn chỉ tham khảo bài viết và làm theo hướng dẫn để tạo mạch LED 8 đèn thì bạn cần 20 phút.
  2. Còn nếu bạn muốn tham khảo cách làm với nhiều LED hơn, thì bạn cần nhiều thời gian (1 tiếng hoặc hơn) và cần nhiều phần cứng hơn:
    • IC 74HC595 (trên thị trường nhất nhiều loại, bạn chỉ cần tìm IC nào có chữ này là được). Nếu bạn muốn điều khiển nhiều LED hơn thì bạn hãy mua nhiều hơn 1 con (cứ 1 con điều khiển được 8 LED)!

Bây giờ, không làm mất thời gian của bạn nữa, tiến hành thôi!

Thứ nhất, điều khiển 8 LED bằng 8 chân Digital của Arduino!

Bạn hãy lắp mạch như sau, kích vào hình để xem ảnh "bự" nhé.
bạn có thể thích cách mắc như thế này
Sau đây là đoạn code lập trình, tôi đa chú thích trong đoạn code khá rõ ràng, bạn chỉ cần copy vào dán vào Arduino IDE thôi, một số kiến thức bạn cần tham khảo nếu chưa biết là:
  1. pinMode
  2. digitalWrite
  3. array
  4. for
  5. delay
  6. int
  7. byte
  8. sizeof
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 tại http://arduino.vn/reference/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
  }
}
Và bạn đã hoàn thành bài hướng dẫn ngày hôm nay rồi đấy ?!? Vẫn chưa đến phần hay mà, nhưng nếu muốn đi tiếp bạn phải dành thời gian và mua IC HC595 đấy. Ngoài ra, bạn có thể tải về bản mô phỏng Proteus tại đây.

Thứ hai, phân tích những ưu điểm, nhược điểm ở mạch điều khiển 8 LED bằng 8 chân digital

Ưu điểm:
  1. Dễ lắp đặt
  2. Dễ lập trình
  3. Dễ hiểu
  4. Đồ điện sẵn có từ các ví dụ khác của arduino.vn
Nhược điểm không thể khắc phục:
  1. Bạn chỉ có thể điều khiển tối đa được 20 đèn LED với cách này mà thôi (dù bạn có pro đến mức nào đi nữa)
  2. Nếu mang tặng người yêu mà chỉ 20 đèn LED thì quả thật sẽ rất khó làm được nhiều ứng dụng hay, đúng không nào ?
Vậy, có cách nào khác để khắc phục mà lại cực kỳ dễ dàng với người mới làm không? Vâng, CÓ!

Thứ ba, điều khiển nhiều đèn LED (bao nhiêu cũng được, phụ thuộc vào thời gian của bạn mà thôi) chỉ với 3 chân Digital heart

Bạn có tin được hay không, chỉ với 3 chân digital mà thôi, bạn có thể điều khiển được rất nhiều đèn LED, mà bạn chỉ cần một mạch Arduino UNO R3 và vài con IC HC 595. Không nói nhiều nữa, tiến hành ngay thôi!
Kiến thức bạn cần biết thêm cũng không nhiều đâu, tôi sẽ hướng dẫn một cách dễ hiểu nhất, hãy kiên trì bạn nhé.
PINS 1-7, 15Q0 đến Q7các chân xuất tín hiệu, giống như các chân Digital được cài đặt là OUTPUT
PIN 8GNDGround, Cực âm
PIN 9Q7"Chân xuất ra tín hiệu Serial
PIN 10MRMaster Reclear, nối cực âm để bật IC hoạt động
PIN 11SH_CPShift register clock pin
PIN 12ST_CPStorage register clock pin (latch pin)
PIN 13OEOutput enable, nối cực âm để các đèn LED có thể sáng được.
PIN 14DSSerial data input
PIN 16VccCấp nguồn cho IC và LED.

Thứ tư, điều khiển 8 LED với 1 IC 595

Lưu ý nho nhỏ với các bạn là các bạn hãy giữ nguyên các chân cắm của mạch 8 LED nhấp nháy chúng ta vừa làm ở trên nhé, chỉ tháo các khớp nối giữa các dây breadboard với Arduino thôi nha.
Đầu tiên, chúng ta cần bật IC 595 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
Tại sao lại mắc như vậy? Đó là bởi vì trong datasheet (tài liệu thông tin vi mạch) của 595 yêu cầu như vậy. Ngoài ra, bạn cũng có thể mắc các chân OE, MR bằng các chân digital của Arduino (để bật tắt các IC 595) mà thôi tôi nghĩ điều này không cần thiết đâu, với lại như vậy lại tốn thêm nhiều chân digital smiley.
Tiếp theo, chúng ta sẽ nối Arduino với IC HC595.
  • DS (pin 14) đến Ardunio DigitalPin 11 (dây xanh nước biển)
  • SH_CP (pin 11) đến Ardunio DigitalPin 12 (dây màu vàng)
  • ST_CP (pin 12) đến Ardunio DigitalPin 8 (dây màu xanh lá).
Lưu ý, vì một số IC HC 595 bị nhiễu trong quá trình shiftout. Nếu gặp tình trạng như vậy thì bạn đừng lo, chúng ta đã có cách, bạn chỉ mắc một tụ điện khoảng 0,1 uF (micro pha ra) (cực dương của tụ gắn với chân digital HC 595 và cực âm vào cực âm của nguồn).
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!
bạn có thể thích cách mắc này hơn
Cuối cùng, phần quan trọng nhất của buổi học hôm nay của chúng ta, đó là lập trình để điều khiển những con LED này!
Để đ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. Nói vậy thôi chứ không có khó đâu, 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 (không hơn không kém), 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).
Bây giờ để dễ hình dung, chúng ta sẽ tưởng tương như thế này:
  1. Các LED sẽ sáng nếu được cấp điện thế dương (5V chẳng hạn) vào cực dương và cực âm của LED được gắn vào cực âm của nguồn (hiển nhiên rồi), vì vậy chúng ta sẽ gắn cực âm của LED vào nguồn và nếu muốn điều khiển cho đèn LED sáng thì chỉ quản lý điện thế gắn vào cực dương của LED, nếu là âm thì đèn tắt, nếu là dương thì đèn sáng.
  2. 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.
  3. Bây giờ, chúng ta sẽ dùng shiftOut để quản lý hiệu điện thế các chân từ Q0 đến Q7 của IC HC595, từ đó, điều khiển việc bật / tắt đèn.
Lợi ích của việc này, đó là bạn chỉ cần 3 chân digital như đã hướng dẫn mắc ở trên là có thể điều khiển được bao nhiêu LED tùy ý (cứ mỗi con HC 595 điều khiển được tối ta 8 LED). Để điều khiển nhiều LED, chúng ta chỉ việc mắc thêm các bé 595 vào thôi, mắc như thế nào chúng ta sẽ biết ngay thôi smiley.
Bạn copy đoạn code sau và dán vào bên trong Arduino IDE, trong này, tôi có hướng dẫn bạn shiftOut để thực hiện lại quá trình đèn LED như lúc chúng ta sử dụng 8 chân digital.
/*
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.
    Để tìm hiểu về Bit Math, bạn vào mục Tài liệu tham khảo ở bảng chọn nằm phía trên cùng trang web và chạy xuống khi bạn kéo chuột trên trang Arduino.VN
    
  */
  //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);
  }
}
Bạn thấy đấy, đoạn bắt buộc phải có để shiftOut chúng ta có thể thay thế bằng một hàm tự tạovoid. Ngoài ra, bạn có thể tải về bản mô phỏng Proteus tại đây.

Thứ năm, điều khiển nhiều đèn LED (số lượng LED chỉ phụ thuộc vào mức độ chịu khó của bạn) bằng Arduino với nhiều IC HC 595

Như bạn đã biết, cứ mỗi một con HC 595 thì chúng ta sẽ điều khiển được tối đa 8 LED (mà tôi khuyên bạn nên thiết kế với số LED chia hết cho 8). Vậy theo lý thuyết và thực tế là như vậy, chỉ cần nhiều 595 là chúng ta làm được nhiều LED hơn. Cái khó, mà không, cũng không khó, chỉ cần hiểu sơ sơ là bạn sẽ làm được LED như mấy tấm biển quảng cáo rồi! Trước hết, bạn cần đọc nguyên lý mà tôi đã soạn để bạn - một người mới nghiên cứu có thể hiểu và làm được.
  1. Chỉ IC HC595 đầu tiên mắc như những gì nói ở trên, kể từ IC HC595 thứ hai trở đi, các bạn mắc như những gì tôi nói ở đây và theo trình tự như sau: IC 2 nối với IC 1, IC 3 nối với IC 2, IC 4 nối với IC 3, và cứ như thế IC mắc sau cùng sẽ mắc vào IC vừa được mắc trước đó.
  2. Cứ mỗi lần shiftOut, thì byte đầu tiên sẽ đến IC HC 595 cuối cùng, byte thứ hai sẽ đến IC HC595 thêm trước IC HC595 đó và cứ như thế nhé.
  3. Cứ mỗi lần shiftOut ra trạng thái các LED, bạn buộc phải shiftOut hết cho đến shiftOut đầu tiên (vì shiftOut lần 1 sẽ tới cái IC cuối cùng). Nếu chưa rành, bạn hãy sử dụng hàm void shiftOutHC595 để shiftOut mỗi khi bạn muốn cập nhập trạng thái của mình.
  4. Mệt đừng nản, hãy kiên trì!
Nào, chúng ta cùng lắp mạch thôi, những IC HC 595 thêm mới chúng ta vẫn lắp như mục Thứ 4 ở trên. Nhưng có một thay đổi nhỏ xíu, đó là thay vì nối chân số 14 của HC 595 với chân digital 11 của Arduino mà chúng ta phải nối vào chân số 9 của IC 595 trước đó. Bạn hãy tham khảo mạch sau để rõ hơn.
hoăc bạn có thể thích cách mắc này hơn
Việc cuối cùng bạn cần làm là dán đoạn code này vào Arduino IDE, sau đó đọc từng dòng tôi comment trong này nhé devil!
1.     /*
2.     shiftOut với 8 LED bằng 1 IC HC595
3.     */
4.     //chân ST_CP của 74HC595
5.     int latchPin = 8;
6.     //chân SH_CP của 74HC595
7.     int clockPin = 12;
8.     //Chân DS của 74HC595
9.     int dataPin = 11;
 
10. //Trạng thái của LED, hay chính là byte mà ta sẽ gửi qua shiftOut
11. const int HC595_COUNT = 2;//Nếu bạn dùng nhiều hơn thì thay bằng một số lớn hơn 2.
12. byte ledStatus[HC595_COUNT]= {0}; 
13. void setup() {
14. //Bạn BUỘC PHẢI pinMode các chân này là OUTPUT
15. pinMode(latchPin, OUTPUT);
16. pinMode(clockPin, OUTPUT);
17. pinMode(dataPin, OUTPUT);
18. }
 
19. void fillValueToArray(byte value) {
20. for (int i = 0;i < HC595_COUNT; i += 1) {
21. ledStatus[i] = value;
22. }
23. }
 
24. void shiftOutHC595(int dataPin, int clockPin, byte ledStatus[]) {
25. digitalWrite(latchPin, LOW);
 
26. for (int i = 0; i < HC595_COUNT; i++) {
27. shiftOut(dataPin,clockPin,LSBFIRST,ledStatus[i]);  // Chúng ta dùng LSBFIRST thay cho MSBFIRST là có lý do của nó, cái này tôi không biết trình như thế nào để bạn hiểu rõ nhất
28. // Tốt nhất bạn hãy thay LSBFIRST thành MSBFIRST để rõ ràng những gì tôi muốn nói.
29. }
 
30. digitalWrite(latchPin, HIGH);
31. }
 
32. void loop() { 
33. /*
34. Trong tin học, ngoài các phép +, -, *, / hay % mà bạn đã biết trên hệ cơ số 10.
35. 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.
36. Để 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.
37. Để tìm hiểu về Bit Math, bạn vào mục Tài liệu tham khảo ở bảng chọn nằm phía trên cùng trang web và chạy xuống khi bạn kéo chuột trên trang Arduino.VN
38. */
39. //Sáng tuần tự
 
40. //vì ledStatus là một mảng vì vậy để mặc định tất cả đèn tắt thì chúng ta phải for đến từng giá trị của mảng rồi đặt giá trị là 0.
41. fillValueToArray(0);
42. //Bật tuần tự
43. for (int i = 0; i < HC595_COUNT; i++) {
44. for (byte j=0;j<8;j++) {
45. ledStatus[i] = (ledStatus[i] << 1) | 1;
46. shiftOutHC595(dataPin,clockPin,ledStatus);
47. delay(100); // Dừng chương trình khoảng 500 mili giây để thấy các hiệu ứng của đèn LED
48. }    
49. }
 
50. //Tắt tuần tự
51. for (int i = 0; i < HC595_COUNT; i++) {
52. for (byte j=0;j<8;j++) {
53. ledStatus[i] = (ledStatus[i] << 1);
54. shiftOutHC595(dataPin,clockPin,ledStatus);
55. delay(100); // Dừng chương trình khoảng 500 mili giây để thấy các hiệu ứng của đèn LED
56. }    
57. }
 
58. /*
59. Một số thuật toán nhấp nháy khác, tôi chia sẻ với các bạn đây, hãy làm một cái gì đấy tặng người thân yêu mình nhé. 
60. Cộng đồng của chúng ta không chỉ hướng tới Arduino, mà còn hướng tới cuộc sống tinh thần của các bạn nữa :)
61. */
 
62. //Nhấp nháy nhanh
63. for (byte k = 0; k < 20; k++) {
64. fillValueToArray(0b10101010);
65. shiftOutHC595(dataPin,clockPin,ledStatus);
66. delay(50);
67. fillValueToArray(0b01010101);
68. shiftOutHC595(dataPin,clockPin,ledStatus);
69. delay(50);
70. }
 
71. //sáng 1 đèn rồi cách 1 đèn ko sáng rồi lại sáng những đèn chưa bật
72. fillValueToArray(0);
73. for (int i = 0; i < HC595_COUNT; i++) {
74. for (byte j = 0;j<8;j += 2) {
75. ledStatus[i] |= 1 << j;
76. shiftOutHC595(dataPin,clockPin,ledStatus);
77. delay(200);
78. }
79. }
80. for (int i = 0; i < HC595_COUNT; i++) {
81. for (byte j = 1;j<8;j += 2) {
82. ledStatus[i] |= 1 << j;
83. shiftOutHC595(dataPin,clockPin,ledStatus);
84. delay(200);
85. }
86. }
 
87. //Tắt dần theo thứ tự trên
88. for (int i = HC595_COUNT - 1; i >= 0; i--) {
89. for (int j = 7;j >= 0;j -= 2) {
90. ledStatus[i] &= ~(1 << j);
91. shiftOutHC595(dataPin,clockPin,ledStatus);
92. delay(200);
93. }
94. }
95. for (int i = HC595_COUNT - 1; i >= 0; i--) {
96. for (int j = 6;j >= 0;j -= 2) {
97. ledStatus[i] &= ~(1 << j);
98. shiftOutHC595(dataPin,clockPin,ledStatus);
99. delay(200);
100.   }
101.   }
 
102.   /// Hãy khám phá thế giới lập trình này nhé :)
103.   }
Video tham khảo:


1. shiftOut(dataPin, clockPin, MSBFIRST, ledStatus); admin cho hỏi tai sao lại co MSBFIRST ở đây, giai thich ho ty
Nó là bit order, tức là nó cho phép bạn lựa chọn bit đầu tiên (có chỉ số là 0) trong chuỗi bit được shiftout ra là bit ngoài cùng bên trái hoặc ngoài cùng bên phải
http://arduino.vn/reference/sh...
2. anh cho em hỏi là nếu như thế này thì chỉ chạy được 1 vòng đúng không anh
Chạy 1 for cho led hả bạn? Bạn muốn for bao nhiêu cũg đc hết á! Vì for cũg chỉ là một lệnh (đặc biệt) thôi mà !
3.1 Vậy là nếu làm tặng người thân thì nhất định phải mất 1 con arduino sao ạ :( ??? còn cách nào khác giống như kiểu dùng ATtiny 13 điều khiển nhiều led không ạ? em mới tìm hiểu nên không rành lắm ạ :)
bạn đọc bài viết sau: http://arduino.vn/bai-viet/178...
3.2 1 chân IC 595 điều khiển được tối đa bao nhiêu con led mắc song song, nếu muốn 1 chân IC 595 điều khiển được nhiều led mắc song song thì làm thế nào?
HC595 có tối đa 8 chân output (Q0 - Q7) => bạn có 8 luồng. Mỗi luồng có thể xuất tối đa 8mA (http://k2.arduino.vn/img/2014/... ). Bạn nên dùng con ULN2803 để khuếch đại dòng điện lên. Dùng nó ntn thì bạn có thể google thêm, rất dễ.
4. Có cách nào để bỏ điện trở được không admin ơi, dùng 1 điện trở nối vào cục âm chung của led có được không nhỉ? mình lắp mạch led trái tim vì vậy muốn tiết kiệm diện tích bảng mạch, chứ mỗi con led lắp thêm 1 điện trở thì rách việc quá
led khi đó sẽ mắc song song và như vậy led sẽ sáng yếu hơn, vì sao? Bạn hãy thử giải thích và thực nghiệm xem
5. ledStatus <<= 1; //Đẩy tất cả các bit qua bên trái 1 bit. tại sao phải làm vậy ai chỉ giáo em với
1 byte gồm 8 bit. Tại bit đó là 1 thì đèn sáng, bit đó là 0 thì đèn tắt.
Như vậy, nếu 1 byte gồm 8 bit như sau: 11111111
Nếu ta đẩy byte vừa rồi qua trái 1 bit rồi lưu lại, ta đc: 11111110
Nếu ta tiếp tục đẩy như vậy mỗi lần 1 bit thì dần dần các đèn sẽ bị tắt tuần tự.
6. ad cho e hỏi cái hàm void fillValueToArray(byte value) là sao ạ ? e mới tìm hiểu nên không biết nhiều ạ
vâng, hàm đó sẽ có nhiệm vụ đặt giá trị cho mọi phần tử trong mảng = value
đặt giá trị đó ý mình là gán giá trị cho mọi phần tử trong mảng bằng một giá trị.
7. mình cũng bị như Cụ Đô, gắn thêm HC595 thứ 3-thứ 4 thì nó không chạy tiếp, mà chạy theo con thứ 1-thứ 2, mình cũng đã khai báo mảng từng bit như của led 7 đoạn nhưng cũng chỉ điều khiển đc 1 HC595, admin có thể hướng dẫn lại cách mà UNO điều khiển HC595 thứ 1, HC595 thứ 2, thứ 3..., làm sao để UNO biết bit 9 là chuyển qua HC595 thứ 2, bit 17 là chuyển qua HC595 thứ 3....Và mình muốn lấy 4bit đầu của HC595 thứ 4 có đc ko?
Thanks admin nhiều, chờ đợi admin từng phút!!!!!!!!!!!! hix
Mình sẽ tóm tắc lại nhé cách nối nhé:
Mỗi bé hc595 sẽ mắc chung 2 chân 11 và 12.
 
Bé 595 đầu tiên được mắc vào Arduino thì chân 14 sẽ được nối với chân dataPin của Arduino.
Các bé 595 thứ 2, thứ 3, ... thứ n, thì chân số 14 của mỗi bé sẽ được nối với chân số 9 của bé liền trước. Ví dụ như trên bài viết, 595 thứ 2 có chân 14 nối với chân 595 số 1.
Các bit sẽ được chuyển thế nào?
Bạn hãy tưởng tượng dãy các bé hc 595 là một STACK (ngăn xếp). Mỗi khi bạn thêm một bé 595 vào, nó sẽ PUSH (đẩy) bé của bạn vào đầu ngăn xếp. Mỗi mỗi khi bạn shiftout (mỗi lần shiftout 8 bit = 1 byte = 1 bé HC 595) thì bạn sẽ phải shiftout tuần tự từ bé mới nhất đến bé cũ nhất.
 
Tức là con 595 nào bạn thêm vào cuối cùng thì khi bạn shiftout lần đầu tiên thì Arduino sẽ shiftout đến nó. Sau đó là các bé khác cũ hơn.
Trước khi shiftout bạn phải
digitalWrite(latchPin, LOW);
sau đó
 
shiftout
cuối cùng
digitalWrite(latchPin, HIGH);
....
Bạn có thể xem thêm hình sau để rõ hơn nhé






1 comments:

  1. rất hay và học hỏi bổ ích rất nhiều ạ , mong ad có thêm nhiều bào hay bổ ích chi tiết cho chúng em học hỏi ạ .

    ReplyDelete

 

Lập trình

-

Arduino Hải Phòng

,