Ghi chú nhanh: Mỗi sở thích đều có những dự án quan trọng riêng như phần giới thiệu Hello World trong lập trình. Cộng đồng Arduino thích bắt đầu mọi người bằng ánh sáng LED nhấp nháy. Nhưng chúng ta có thể làm gì với 64 đèn LED trong một ma trận? Chúng tôi có thể hiển thị tất cả các loại như số, chữ cái, và thậm chí cả hình ảnh đơn giản. Trong bài viết này, chúng ta sẽ xem xét cách thực hiện điều đó cũng như Trò chơi cuộc đời của Conway.

Tanh ấy Arduino đã chứng kiến ​​sự phổ biến bùng nổ trong thập kỷ qua. Có hàng ngàn thư viện có sẵn cho nó. Đó là một nền tảng được ghi chép rất tốt và tuyệt vời để học lập trình và thiết kế điện tử.

Trong bài viết này, chúng tôi sẽ giới thiệu sơ lược về việc sử dụng các trình điều khiển LED MAX7219 và MAX7221 với thư viện LedControl, có sẵn để tải xuống và cài đặt trong Arduino IDE cũng như trên Githubvà chúng tôi sẽ thực hiện Trò chơi cuộc sống của Conway. Hai bộ phận quan trọng bạn sẽ cần cho điều này là một trong các trình điều khiển đèn LED được đề cập ở trên và ma trận LED tương thích (tất nhiên là ngoài Arduino và một số linh kiện điện tử tiêu chuẩn). Bạn có thể tìm thấy nhiều món hàng với giá rất rẻ (dưới $ 3USD) trên các cửa hàng trực tuyến khác nhau như eBay, Banggood và AliExpress. Tuy nhiên, điều rất quan trọng là phải đọc mô tả về những thứ bạn đang mua, bởi vì nhiều thứ trong số này là những bộ dụng cụ cần được lắp ráp và hàn. Tùy thuộc vào nơi bạn sống, thời gian vận chuyển có thể là một vài tuần, vì vậy hãy nhớ kiểm tra kỹ thời gian đến dự kiến ​​cho khu vực của bạn.

Tôi đã tiếp tục và chia sẻ nguồn cho dự án này trên (nam tước) Github , vì vậy hãy tải xuống, sửa đổi, đăng lại hoặc bất cứ điều gì bạn muốn. Bạn sẽ cần phải làm theo và có rất nhiều bình luận trong đoạn mã trên Github không được đưa vào bài viết này đơn giản vì nó sẽ là một bài viết dài và chúng hiệu quả hơn nhiều trong mã thực tế hơn là cố gắng bóp chết chúng vào bài báo này.

Sau tệp tiêu đề và định nghĩa ghim, bạn sẽ thấy một dòng có thể không hợp lý.

LedControl lc = LedControl(DIN, CLK, CS, 0);

Điều này tạo ra đối tượng LedControl được sử dụng để giao tiếp với trình điều khiển LED của chúng tôi bằng cách cung cấp đầu vào kỹ thuật số, đồng hồ và chân tín hiệu chip, cũng như chỉ định số lượng thiết bị (chúng có thể được nối với nhau để có màn hình lớn). Giao thức điều khiển giữa trình điều khiển LED và Arduino là SPI (Giao diện ngoại vi nối tiếp), nhưng chúng ta không cần phải làm điều đó vì chúng ta có một đối tượng của lớp LedControl để thực hiện việc đặt giá thầu cho chúng ta.

Phần tiếp theo, trong thiết lập() chức năng, hầu hết là tự giải thích, nhưng chúng tôi sẽ trình bày rõ hơn về nó.

lc.shutdown(0, false);
lc.setIntensity(0, 8);
lc.clearDisplay(0);

Trình điều khiển đèn LED sẽ ở trạng thái tắt khi bật nguồn lần đầu tiên, vì vậy chúng ta cần yêu cầu nó thức dậy, đó là những gì dòng đầu tiên làm. Thứ hai đặt độ sáng, vì chúng tôi chỉ sử dụng một màn hình duy nhất nên tham số đầu tiên, địa chỉ của ma trận, là 0và cường độ nên được đặt cho bạn bất kỳ giá trị nào bạn muốn, giá trị hợp lệ lớn nhất là 15. Cuối cùng, chúng tôi xóa hiển thị bất kỳ giá trị nào có thể có trước đó. Đây thường không phải là vấn đề, nhưng nếu Arduino của bạn khởi động lại vì lý do nào đó, nó có thể khiến các đèn LED không mong muốn được chiếu sáng.

Trước khi bắt đầu lập trình, điều quan trọng là phải hiểu Trò chơi cuộc sống của Conway là gì và các quy tắc là gì. Trò chơi là một trò chơi “không người chơi”. Tất cả điều đó có nghĩa là người chơi chọn trạng thái ban đầu, mà chúng tôi sẽ thực hiện một cách ngẫu nhiên, và sau đó tuân theo các quy tắc. Trò chơi Cuộc sống rất đơn giản và chỉ có bốn quy tắc:

  1. Bất kỳ ô sống nào có ít hơn hai người hàng xóm còn sống sẽ chết, như thể do dân số ít.
  2. Bất kỳ ô sống nào có hai hoặc ba người hàng xóm sống tiếp tục sống cho thế hệ tiếp theo.
  3. Bất kỳ phòng giam nào có nhiều hơn ba người hàng xóm còn sống sẽ chết, như thể do dân số quá đông.
  4. Bất kỳ tế bào chết nào có chính xác ba hàng xóm sống đều trở thành tế bào sống, như thể bằng cách sinh sản.

– Wikipedia

Nhận bảng Arduino của riêng bạn và bắt đầu tự làm ngay hôm nay

Để biểu diễn lưới, chúng tôi sử dụng hai mảng hai chiều. Vì chúng tôi đang làm việc với ma trận 8 × 8, đó là các kích thước mà chúng tôi áp dụng cho các mảng của mình. Trong khi mảng byte sẽ hiệu quả hơn nhiều trong bộ nhớ (và trên thực tế được sử dụng thường xuyên trong các ứng dụng như thế này), boolean dễ dàng sửa đổi hơn nhiều trong một mảng so với các bit trong một byte. Việc sửa đổi các bit trong một byte sẽ yêu cầu sử dụng bitwise các hoạt động sẽ phức tạp hơn một chút so với các mảng boolean đơn giản. Mảng thứ hai là do chúng ta phải tính toán trạng thái tiếp theo từ trạng thái hiện tại, nhưng nếu chúng ta thay đổi trạng thái hiện tại, chúng ta sẽ không có được trạng thái kế tiếp mong muốn.

Hai vòng lặp for tiếp theo là để khởi tạo cgrid mảng với các giá trị ngẫu nhiên và ngrid mảng với sai các giá trị. Có một phần tư cơ hội rằng ô đó sẽ ‘sống’, điều này được thực hiện bằng cách tạo một số ngẫu nhiên từ 0 đến 3, nếu số lớn hơn 2 thì ô đó vẫn còn sống.

Phần còn lại của mã hoặc đủ đơn giản để không cần giải thích thêm hoặc có giải thích trong mã. Nhưng displayGeneration () chức năng thú vị hơn. Hàm này, với một chút sửa đổi, có khả năng lấy các mảng byte và đẩy chúng trực tiếp vào ma trận. Các lc.setColumn () lệnh gọi phương thức thực sự nhận một byte vì nó là đối số cuối cùng, đối số đầu tiên là địa chỉ và cột đang được đặt. Bằng cách sử dụng và thiết lập như bên dưới, bạn có thể dễ dàng tạo một hàm sẽ hiển thị một mảng byte tám phần tử, chẳng hạn như một chữ cái hoặc hình ảnh, trên ma trận.

void printByte(byte ba[8]){
  for (int i = 0; i < 8; i++){
    lc.setRow(0,0,ba[i]);
}

Bạn có thể thấy rằng phương pháp được sử dụng là setRow () phương pháp đối lập với setColumn () phương pháp. Điều này chỉ đơn giản là áp dụng byte theo chiều ngang trái ngược với chiều dọc, một phép quay 90 độ đơn giản. Đây là một điểm quan trọng vì định hướng dự án của bạn không nhất thiết phải giống tôi. Ngoài ra, bạn có thể đảo ngược thứ tự các byte được đặt bằng cách sử dụng (7 - i) là đối số thứ hai của bạn, phản ánh hiệu quả đầu ra. Đây là một cách rất dễ dàng để định hướng chính xác đầu ra cho dự án của bạn.

Nếu bạn có ý định hiển thị văn bản trên ma trận của mình, bạn có thể tìm thấy phông chữ ma trận 8 × 8 trực tuyến. Tuy nhiên, điều rất quan trọng cần lưu ý là tổng dung lượng RAM mà bộ vi điều khiển của bạn có. Tôi đã sử dụng Uno cho dự án này và một trong những phông chữ bao gồm các định nghĩa cho các cấu hình 128-bit ngoài tiêu chuẩn ASCII 7-bit. Điều này là quá nhiều cho Uno của tôi (đó là 8 byte x 256 = 2048 byte, toàn bộ của Uno dung lượng) và tôi cần giảm một nửa bộ thành 128 định nghĩa ASCII ban đầu để làm cho phông chữ đó hoạt động. Vì vậy, hãy nhớ rằng số dặm của bạn có thể thay đổi tùy thuộc vào bộ vi điều khiển của bạn.

Sau một khoảng thời gian ngắn làm việc, bạn có thể ngồi lại và xem hiệu ứng mê hoặc của Trò chơi cuộc sống trên màn hình ma trận LED nhỏ của riêng bạn.

Có bất kỳ dự án Arduino nào khác mà bạn muốn xem được đề cập trên Affizon không? Cho chúng tôi biết trong các ý kiến ​​dưới đây.

This post is also available in: Spanish German Tiếng Việt Italian

LEAVE A REPLY

Please enter your comment!
Please enter your name here