Mục lục:

Máy thuật toán: 13 bước (có hình ảnh)
Máy thuật toán: 13 bước (có hình ảnh)

Video: Máy thuật toán: 13 bước (có hình ảnh)

Video: Máy thuật toán: 13 bước (có hình ảnh)
Video: Giới thiệu về các thuật toán - Khoa học Máy tính tập 13 | Tri thức nhân loại 2024, Tháng bảy
Anonim
Image
Image
Thanh LED: In 3D Mặt nạ
Thanh LED: In 3D Mặt nạ

Tôi đã dạy môn khoa học máy tính ở trình độ đại học được 15 năm và mặc dù chuyên môn của tôi nhiều hơn về mặt lập trình, tôi vẫn dành khá nhiều thời gian để nghiên cứu các thuật toán tiêu chuẩn để tìm kiếm và sắp xếp. Từ quan điểm giảng dạy, vấn đề trọng tâm là độ phức tạp của tính toán: mỗi thuật toán yêu cầu bao nhiêu thời gian, đầu vào có kích thước cụ thể? Nhưng có rất nhiều sắc thái. Ví dụ: các thuật toán có thời gian chạy khác nhau tùy thuộc vào các giá trị đầu vào cụ thể (trái ngược với kích thước) không? Trong trường hợp nào bạn sẽ chọn một thuật toán sắp xếp hơn một thuật toán khác? Mặc dù chúng tôi thảo luận về những vấn đề này trong phần tóm tắt, nhưng điều đó luôn làm tôi khó hiểu rằng không có cách nào dễ dàng để xem các thuật toán khác nhau hoạt động như thế nào trong các điều kiện khác nhau.

Bàn thắng

Mục tiêu chung của tôi cho dự án này là tạo ra một màn hình tương tác để sinh viên hình dung và khám phá các thuật toán. Tôi tự giới hạn bản thân với các thuật toán hoạt động trên mảng giá trị (số nguyên), vì vậy tôi có thể sử dụng dải LED RGB có địa chỉ để trực quan hóa nội dung mảng. Mảng có 100 phần tử và mỗi số nguyên được ánh xạ thành một màu theo thứ tự cầu vồng, để hiển thị ngay lập tức khi mảng được sắp xếp, sắp xếp một phần hoặc ngẫu nhiên. Tuy nhiên, ngoài các giá trị, tôi muốn có một cách để trực quan hóa các khía cạnh điều khiển của thuật toán - ví dụ: phần tử nào của mảng hiện đang được so sánh hoặc hoán đổi.

Các mục tiêu cụ thể là:

- Cung cấp nhiều thuật toán tìm kiếm và sắp xếp

- Trực quan hóa các giá trị trong mảng theo cách làm nổi bật tiến trình thuật toán

- Trực quan hóa điều khiển thuật toán; đặc biệt là các yếu tố đang được xem xét.

- Cho phép người dùng chọn các mẫu dữ liệu đầu vào thay vì luôn tạo ra các giá trị ngẫu nhiên

- Cho phép người dùng kiểm soát tốc độ và tạm dừng thuật toán

- Cho phép người dùng buộc hành vi trong trường hợp tốt nhất, trường hợp xấu nhất, trường hợp trung bình (theo thuật toán cụ thể)

- Hiển thị số bước khi thuật toán tiến hành

Hình dung

Từ quan điểm thiết kế vật lý, phần thú vị nhất của dự án này là hình ảnh hóa của mảng. Tôi đã vật lộn với việc làm thế nào để hiển thị dữ liệu và điều khiển cũng như cách xây dựng chính thiết bị hiển thị. Mục tiêu của tôi là hiển thị các giá trị dữ liệu dưới dạng các vòng tròn được tô màu và các điểm điều khiển dưới dạng các mũi tên màu hướng vào các giá trị dữ liệu. Sau một số thử nghiệm, tôi quyết định thiết kế với hai dải 100 đèn LED RGB song song (WS2812) với mặt nạ hình tròn trên mỗi đèn LED dữ liệu và mặt nạ hình tam giác trên mỗi đèn LED điều khiển. Tôi đã tạo mô hình 3D của mặt nạ với 10 cặp hình tròn và hình tam giác, sau đó in 3D 10 mô-đun này cho tổng số 100 hình tròn và 100 hình tam giác. Kích thước và khoảng cách của mặt nạ của tôi được thiết kế cho các dải có 100 đèn LED trên mỗi mét. Các tệp mô hình 3D được cung cấp sau trong phần mô tả này.

Điện tử và vỏ máy

Phần còn lại của thiết bị rất đơn giản, từ quan điểm điện tử. Ngoài hai dải đèn LED, có một loạt các nút tạm thời, một bộ mã hóa vòng quay (để điều khiển tốc độ) và một màn hình 7 đoạn (để hiển thị các bước). Với rất nhiều nút và điều khiển, tôi đã chọn sử dụng vi điều khiển ESP32 vì nó có rất nhiều chân cắm và vì nó khá mạnh. Tôi sẽ xem qua chiến lược đi dây, nhưng nó khá cơ bản. Bạn có thể làm điều gì đó thông minh với thanh ghi shift nếu bạn muốn sử dụng ít chân hơn.

Bạn có thể chế tạo vỏ bọc cho thiết bị này bằng nhiều hình thức khác nhau. Ban đầu tôi tưởng tượng nó giống như một bảng hình chữ nhật lớn với dải đèn LED ở trên cùng và một lưới các nút ở giữa. Hình thức mà tôi kết thúc được lấy cảm hứng từ một loại quan điểm của năm 1960 về công nghệ thời đại không gian. Bạn cũng có thể xây dựng nó bằng các dải LED theo hướng dọc. Hoặc làm cho phần đèn LED lớn hơn nhiều - lấp đầy toàn bộ bức tường - bằng một bảng điều khiển riêng biệt.

Phần mềm

Mã cho thiết bị này có sẵn miễn phí trên GitHub và tôi đã cố gắng hết sức để ghi lại cách hoạt động và cách định cấu hình nó. Thư viện bên ngoài duy nhất bạn cần là FastLED để điều khiển các dải WS2812.

Quân nhu

Thiết bị điện tử

1 bảng phát triển ESP32 (ví dụ:

2 dải LED WS2812 hoặc tương tự, mật độ 100 đèn LED trên mét (ví dụ:

1 Nút "bắt đầu" hình tam giác (ví dụ:

12 nút tạm thời (ví dụ: https://amzn.com/B01N4D4750) - các hình dạng khác nhau nếu bạn muốn

1 Gói (20) đầu nối nút được quấn sẵn (ví dụ:

1 gói kết nối JST (ví dụ:

1 bộ mã hóa quay (ví dụ:

1 Núm cho bộ mã hóa quay (ví dụ:

1 gói đầu nối Dupont (ví dụ: https://amzn.com/B014YTPFT8) - bạn cũng nên mua công cụ uốn.

1 Giắc cắm thùng (cho nguồn) (ví dụ:

1 màn hình số 7 đoạn TM1637 (ví dụ:

Thiết bị hàn và đi dây

Tệp mô hình 3D

Bạn có thể tìm thấy mô hình 3D cho một cặp mô-đun 10 ánh sáng trên Thingiverse:

www.thingiverse.com/thing:4178181

Bạn sẽ cần in mô hình này năm lần với tổng số 10 mô-đun.

Phần mềm

github.com/samguyer/AlgorithmMachine

Bao vây

Gỗ, plexiglass, bu lông và ốc vít bằng thép không gỉ

Vật liệu khuếch tán. Yêu thích của tôi là Lee Filters # 216 khuếch tán toàn màu trắng, nhưng có những lựa chọn khác. Ngay cả giấy trắng đơn giản cũng hoạt động tốt.

Bước 1: Thuật toán 101

Rất nhiều người nghĩ rằng khoa học máy tính về bản chất là nghiên cứu về lập trình. Nhưng trái tim và linh hồn thực sự của lĩnh vực này là các thuật toán: nghiên cứu các quy trình có hệ thống để giải quyết vấn đề và chi phí của chúng (điển hình là chúng mất bao lâu). Các nhân vật bán nguyệt trong lĩnh vực này, như Alan Turing, Alonzo Church, và Edsger Dijkstra, đã suy nghĩ về những ý tưởng này trước cả máy tính như chúng ta biết chúng thậm chí còn tồn tại.

Đặc điểm chính của một thuật toán để giải quyết một vấn đề cụ thể là nó rất chi tiết và chính xác, vì vậy ai đó có thể sử dụng nó để có được một giải pháp mà không cần hiểu nó hoạt động như thế nào; chỉ cần làm theo các bước theo kiểu máy móc và bạn sẽ nhận được câu trả lời đúng. Bạn có thể thấy điều này giúp ích như thế nào với máy tính lập trình, vì chúng cần mức độ chi tiết này. Máy tính không thể điền vào các chi tiết còn thiếu hoặc đưa ra phán đoán, theo cách mà một người có thể làm.

Làm cái đó mất bao lâu?

Một khi chúng tôi có một quy trình chi tiết, một câu hỏi tự nhiên là mất bao lâu để có câu trả lời? Chúng ta không thể sử dụng các đơn vị thời gian thông thường, vì nó phụ thuộc vào ai đang thực hiện công việc (so sánh tốc độ một người có thể tính toán một cái gì đó so với một siêu máy tính). Ngoài ra, nó còn phụ thuộc vào lượng dữ liệu mà chúng ta có. Rõ ràng, việc tìm kiếm danh sách một triệu số điện thoại sẽ mất nhiều thời gian hơn so với danh sách một trăm.

Để mô tả chi phí của một thuật toán, trước tiên chúng ta chọn một số thao tác trong thủ tục đại diện cho một "bước" - thường là một cái gì đó đơn giản, như so sánh hoặc cộng hai số, cần một khoảng thời gian cố định để thực hiện. Sau đó, chúng tôi đưa ra một công thức mô tả thuật toán sẽ thực hiện bao nhiêu bước với một số mục dữ liệu. Vì lý do lịch sử, chúng ta hầu như luôn biểu thị số lượng mục dữ liệu bằng chữ N.

Ví dụ, xem qua danh sách N số điện thoại sẽ thực hiện N bước. Nhìn qua danh sách hai lần, có 2 bước. Cả hai điều này được gọi là thuật toán thời gian tuyến tính - tổng số bước là bội số của kích thước đầu vào. Các thuật toán khác là bậc hai (N bình phương thời gian) hoặc bậc ba (N lập phương) hoặc logarit (log N) hoặc một số kết hợp của chúng. Một số bài toán tính toán khó nhất yêu cầu các thuật toán thời gian hàm mũ (2 ^ N).

OK, vậy thì sao?

Khi số lượng mục dữ liệu N nhỏ thì điều đó không quan trọng lắm. Ví dụ, đối với N = 10, 10N là tên đó là N bình phương. Nhưng N = 1000 thì sao? hoặc N = 1000000? Một triệu bình phương là một con số khá lớn. Ngay cả trên một máy tính rất nhanh, một thuật toán bậc hai có thể mất nhiều thời gian nếu đầu vào đủ lớn. Các thuật toán theo cấp số nhân rắc rối hơn nhiều: đối với N = 50, thuật toán cấp số nhân sẽ mất hai tuần để hoàn thành ngay cả trên một máy tính mà mỗi bước chỉ là một nano giây (1 phần tỷ giây). Oái oăm!

Ở đầu kia của thang đo, chúng tôi có các thuật toán thời gian logarit, rất nhanh. Thời gian nhật ký ngược lại với thời gian hàm mũ: kích thước đầu vào N cho trước, số bước là số mũ T trong công thức 2 ^ T = N. Ví dụ: nếu kích thước đầu vào của chúng ta là một tỷ, thì thuật toán thời gian nhật ký chỉ yêu cầu 30 các bước, vì 2 ^ 30 = 1, 000, 000, 000. Thật ngọt ngào làm sao?! ??!

Bạn có thể tự hỏi, ai quan tâm đến kích thước đầu vào hàng triệu hoặc hàng tỷ? Hãy nghĩ về nó: có bao nhiêu người dùng trên Facebook? Có bao nhiêu trang web được lập chỉ mục bởi Google? Có bao nhiêu cặp bazơ trong bộ gen người? Có bao nhiêu phép đo đi vào mô phỏng thời tiết?

Bước 2: Các thuật toán

Máy thuật toán hiện đang thực hiện các thuật toán sau. Hai trong số đó là thuật toán tìm kiếm (tìm một giá trị cụ thể trong danh sách), phần còn lại là thuật toán sắp xếp (đặt các giá trị theo thứ tự).

Tìm kiếm tuyến tính

Tìm kiếm lần lượt qua danh sách các giá trị bắt đầu từ đầu. Yêu cầu thời gian tuyến tính.

Tìm kiếm nhị phân

Tìm kiếm danh sách bằng cách chia đôi liên tục. Yêu cầu thời gian ghi nhật ký, nhưng danh sách phải được sắp xếp để nó hoạt động.

Sắp xếp bong bóng

Sắp xếp danh sách một danh sách liên tục trao đổi các phần tử lân cận không theo thứ tự. Yêu cầu thời gian bậc hai.

Sắp xếp chèn

Sắp xếp danh sách bằng cách đặt từng phần tử vào vị trí thích hợp của nó trong danh sách các giá trị đã được sắp xếp. Yêu cầu thời gian bậc hai.

Sắp xếp nhanh chóng

Sắp xếp danh sách bằng cách chia đôi danh sách nhiều lần và di chuyển tất cả các giá trị nhỏ hơn giá trị trung vị sang nửa đầu tiên và tất cả các giá trị lớn hơn giá trị trung bình sang nửa sau. Trong thực tế, chúng tôi không thể tìm thấy giá trị trung bình một cách hiệu quả, vì vậy chúng tôi chọn một giá trị một cách ngẫu nhiên. Do đó, thuật toán này có thể là bậc hai trong trường hợp xấu nhất, nhưng thường yêu cầu thời gian N * logN.

Hợp nhất sắp xếp

Sắp xếp danh sách bằng cách chia đôi, sắp xếp hai nửa riêng biệt (sử dụng sắp xếp hợp nhất), sau đó hợp nhất chúng với nhau bằng cách xen kẽ các giá trị. Luôn yêu cầu thời gian N * logN.

Sắp xếp đống

Sắp xếp danh sách bằng cách xây dựng cấu trúc dữ liệu được gọi là heap, cho phép bạn tìm giá trị nhỏ nhất trong thời gian ghi nhật ký. Luôn yêu cầu thời gian N * logN.

Loại bitonic

Tương tự như hợp nhất sắp xếp và sắp xếp nhanh, chia một nửa danh sách, sắp xếp các nửa và kết hợp chúng lại. Thuật toán này yêu cầu thời gian N * logN * logN, nhưng có ưu điểm là dễ dàng ghép song song.

Bước 3: Thanh LED: In 3D Mặt nạ

Thanh LED: In 3D Mặt nạ
Thanh LED: In 3D Mặt nạ
Thanh LED: In 3D Mặt nạ
Thanh LED: In 3D Mặt nạ

Bước đầu tiên trong việc xây dựng thanh LED là in 3D mặt nạ tạo hình dạng cho đèn. Mỗi mô-đun bao gồm mười phần tử của mảng, 10 giá trị (hình tròn) và 10 chỉ số (hình tam giác), vì vậy, bạn sẽ cần 10 mô-đun tổng cộng. Tệp STL mà tôi đang cung cấp ở đây chứa hai phiên bản của mô-đun, vì vậy bạn sẽ cần thực hiện năm chu kỳ in. Tôi không có máy in 3D tốt nhất, vì vậy tôi phải thực hiện một số thao tác dọn dẹp thủ công chúng bằng cách sử dụng tệp và giấy nhám. Điều quan trọng nhất là các lỗ hình tròn và hình tam giác phải sạch sẽ.

Trong các bức ảnh, bạn sẽ thấy thiết lập thử nghiệm của tôi: Tôi đã dán hai dải đèn LED xuống và nối chúng với một bảng mạch có bộ vi điều khiển. Bước này không cần thiết, nhưng tôi muốn xem nó trông như thế nào trước khi bắt đầu lắp ráp vỏ máy. Tôi xếp các mô-đun mặt nạ trên hai dải đèn LED và chạy một bản phác thảo đơn giản với màu sắc ngẫu nhiên. Với một dải vật liệu khuếch tán, hình dạng và màu sắc thực sự nổi bật.

Bước 4: Lựa chọn thay thế thanh LED

Thanh LED thay thế
Thanh LED thay thế
Thanh LED thay thế
Thanh LED thay thế
Thanh LED thay thế
Thanh LED thay thế

Khi tôi lần đầu tiên bắt đầu dự án này, tôi đã thử nghiệm các cách khác để làm mặt nạ LED. Nếu bạn không có máy in 3D, bạn có thể xem xét một trong các tùy chọn này. Tôi thành thật mà nói: đó là một nỗi đau rất lớn khi thực hiện những bộ phận này.

Đối với các vòng tròn, tôi đã mua một ống đồng 13/32, có đường kính gần đúng 1cm. Tôi cắt nó thành một trăm đoạn dài 1cm và sau đó phun sơn màu trắng cho chúng.

Đối với các hình tam giác, tôi sử dụng giấy nhôm có khối lượng lớn được cắt từ chảo nướng dùng một lần. Tôi tạo một hình tam giác từ gỗ, sau đó quấn các dải giấy bạc ngắn xung quanh hình đó và dán chúng lại. Một lần nữa, bạn sẽ cần cả trăm thứ này, vì vậy cần một chút thời gian và sự kiên nhẫn.

Bước 5: Bao vây thanh LED

Vỏ thanh LED
Vỏ thanh LED
Vỏ thanh LED
Vỏ thanh LED
Vỏ thanh LED
Vỏ thanh LED

Bao vây của tôi khá đơn giản: hai dải gỗ ở hai bên và hai dải plexiglass cho mặt trên và mặt dưới. Tất cả các bộ phận dài khoảng 102cm (1 mét đối với đèn LED, cộng thêm một chút để chứa hệ thống dây điện). Các cạnh nên cao hơn 1cm một chút để nhường chỗ cho các dải đèn LED. Sau khi cắt các dải, tôi kẹp các miếng mặt nạ in 3D vào giữa chúng để đo chiều rộng cho tấm kính. Cắt hai miếng plexiglass có chiều rộng và chiều dài của thanh. Cuối cùng, cắt một dải vật liệu khuếch tán để vừa với mặt nạ.

Đối với sự khuếch tán, tôi thực sự thích Lee Filters # 216 (khuếch tán toàn màu trắng). Nó là một tấm nhựa mỏng giúp khuếch tán đều mà không làm mất nhiều ánh sáng. Nhưng nó là thứ đắt tiền. Đôi khi bạn có thể tìm thấy những tờ nhỏ hơn được rao bán trực tuyến, nhưng cả một cuộn sẽ khiến bạn mất khoảng 125 đô la. Một số tùy chọn khác là giấy trắng hoặc bất kỳ loại sa tanh hoặc nhựa mờ nào khác. Một lựa chọn phổ biến là thảm cắt nhựa mỏng.

Trước khi bạn lắp ráp thanh LED, hãy đảm bảo rằng bạn đã hàn các đầu nối thích hợp vào các dải LED. Rất nhiều dải đi kèm với các dây dẫn được hàn sẵn, vì vậy bạn có thể chỉ cần sử dụng chúng.

Tôi bắt đầu lắp ráp bằng cách vặn miếng plexiglass trên cùng vào các mặt gỗ (xem ảnh). Sau đó, tôi lật nó lên và đặt dải khuếch tán vào, tiếp theo là 10 miếng mặt nạ. Một khi tôi hài lòng với khoảng cách, tôi ghim chúng vào vị trí bằng một vài chấm keo nóng.

Tiếp theo, đặt hai dải đèn LED cạnh nhau trên mặt nạ. Đảm bảo các đèn LED hướng xuống và đảm bảo mỗi đèn LED thẳng hàng với lỗ tương ứng trên mặt nạ. Thêm một ít keo nóng hoặc băng dính để giữ các dải đèn LED tại chỗ. Cuối cùng, vặn vít vào miếng plexiglass phía sau.

Chạy một mẫu thử nghiệm. Công việc tốt! Bạn đã hoàn thành phần khó nhất!

Bước 6: Bảng điều khiển

Bảng điều khiển
Bảng điều khiển
Bảng điều khiển
Bảng điều khiển
Bảng điều khiển
Bảng điều khiển
Bảng điều khiển
Bảng điều khiển

Bảng điều khiển là phần mang lại sự tự do sáng tạo nhất. Nó chỉ cần chứa tất cả các điều khiển và thiết bị điện tử, cùng với thanh đèn LED. Thiết kế đơn giản nhất là một bảng hình chữ nhật: khoan lỗ cho các nút và nút điều khiển, gắn thanh đèn LED vào. Tôi thích kết hợp gỗ, plexiglass và các vật liệu khác để tạo ra một kiểu dáng hơi cổ điển / hiện đại. Trong trường hợp này, tôi cắt một miếng plexiglass nặng để giữ các nút lựa chọn thuật toán chính và một thanh gỗ để giữ phần còn lại của thiết bị điện tử. Tôi đã khoan lỗ để phù hợp với kích thước của các nút trò chơi điện tử. Hệ thống dây điện hiển thị ở mặt sau, nhưng tôi thích nó!

Tôi cũng dành không gian cho màn hình 7 đoạn, bộ mã hóa quay và một số hệ thống dây điện ở mặt sau. Tôi cắt một thanh dado ở trên cùng để giữ thanh LED.

Bước 7: Khai thác nút

Khai thác nút
Khai thác nút
Khai thác nút
Khai thác nút
Khai thác nút
Khai thác nút

Việc đấu dây nhiều nút có thể là một vấn đề thực sự. May mắn thay, những người tạo ra máy arcade đã đưa ra một số đầu nối tiêu chuẩn mà bạn có thể sử dụng. Mỗi cáp kết nối nút có hai dây, một dây cho VCC và một dây nối đất. Một đầu có các đầu nối hình chóp phù hợp với các dây dẫn ở mặt sau của nút - gắn đất vào dây dẫn "thường mở" và VCC vào dây dẫn "chung". Trong cấu hình này, khi người dùng ấn nút, mạch đã hoàn thành và vi điều khiển sẽ đọc HIGH trên chân đầu vào tương ứng.

Đầu kia của cáp có đầu nối JST (thứ màu trắng nhỏ). Điều thú vị về các đầu nối này là chúng chỉ đi vào ổ cắm theo một cách, vì vậy không có cách nào để vô tình đảo ngược VCC và nối đất.

Những gì tôi đã làm là xây dựng một dây nịt nhỏ cho các đầu nối này. Tôi hàn một loạt các ổ cắm JST vào một miếng protoboard và sau đó chạy dây trở lại các đầu nối Dupont mà tôi sẽ cắm vào bộ vi điều khiển. Dây màu đỏ là đường VCC, và nó kết nối với tất cả các ổ cắm JST. Các dây màu xanh lam là những dây riêng biệt cho mỗi nút.

Bước 8: Bộ mã hóa quay

Bộ mã hóa quay
Bộ mã hóa quay

Bộ mã hóa quay cho phép người dùng kiểm soát tốc độ của thuật toán. Tôi sử dụng một mô-đun đi kèm như một bảng đột phá bao gồm các điện trở kéo lên cho hai đường dữ liệu (dây màu vàng). Điều này cũng xảy ra là một nút, nhưng tôi không sử dụng tính năng đó. Hai dây còn lại là VCC và nối đất. Tôi cũng có được một núm béo đẹp.

Điều tôi thích ở bộ mã hóa quay, trái ngược với chiết áp, là nó chỉ phát tín hiệu quay (theo chiều kim đồng hồ so với ngược chiều kim đồng hồ) tới bộ vi điều khiển, vì vậy thật dễ dàng để thay đổi cách diễn giải giá trị. Ví dụ: bạn có thể cho nó cảm giác tăng tốc (giống như một con chuột) khi người dùng quay nó nhanh.

Bước 9: Màn hình 7 đoạn

Màn hình 7 đoạn
Màn hình 7 đoạn

Không có nhiều điều để nói ở đây. Những thứ này ở khắp mọi nơi. Các đèn LED được điều khiển bởi một chip có tên TM1637, chip này giao tiếp với bộ vi điều khiển thông qua một giao thức nối tiếp đơn giản. Tôi sử dụng một thư viện hiện có cho phép tôi cho nó biết số tôi muốn hiển thị và nó thực hiện phần còn lại.

Mặt sau có bốn chân: VCC, nối đất và hai dây cho giao thức nối tiếp. Tôi đã hàn một đoạn đầu cắm 4 chân, kết nối với đầu nối Dupont tương ứng có dây với bộ vi điều khiển.

Bước 10: Bảng điều khiển chính

Bảng điều khiển chính
Bảng điều khiển chính
Bảng điều khiển chính
Bảng điều khiển chính
Bảng điều khiển chính
Bảng điều khiển chính

Bo mạch điều khiển chính chứa bản thân bộ vi điều khiển và tất cả các đầu nối với các điều khiển (nút, màn hình, đèn LED). Bộ vi điều khiển là ESP32, cung cấp nhiều năng lượng tính toán và bộ nhớ, đồng thời có nhiều chân cắm. Hệ thống dây điện khá chuẩn, nhưng tôi sẽ chỉ ra một vài điểm thú vị.

LƯU Ý: Bạn có thể muốn xem mã (https://github.com/samguyer/AlgorithmMachine) trước khi bắt đầu đấu dây bảng mạch chính, để cấu hình pin của bạn khớp với cấu hình của tôi.

Tôi hàn một giắc cắm thùng vào bo mạch để lấy điện, và kết nối hai dây đồng chắc chắn với nguồn điện và đường ray nối đất của bo mạch. Lý do là thanh đèn LED có thể tiêu thụ nhiều điện năng nếu đặt độ sáng cao và tôi không muốn sử dụng tất cả nguồn điện đó thông qua đầu nối USB trên vi điều khiển.

Để đơn giản hóa việc đấu dây nút, tôi đã hàn một dải tiêu đề góc vuông từ nam sang nữ xuống toàn bộ mặt bên của bộ vi điều khiển (mặt trên của bo mạch như hình minh họa). Các đầu nối Dupont từ dây nịt nút cắm trực tiếp vào tiêu đề này.

QUAN TRỌNG: nguồn điện cho các nút (dây màu đỏ) phải được kết nối với đường dây điện 3.3V trên bộ vi điều khiển. ESP32 là chip 3.3V, vì vậy chỉ nên gắn nguồn 3.3V vào chân dữ liệu.

Bộ vi điều khiển lấy nguồn (hoặc đẩy nguồn) đến các thanh ray (mặt dưới của bo mạch như hình minh họa) thông qua chân cắm USB 5V và nối đất. Tất cả các dây màu đỏ / đen khác là VCC và nối đất.

Hai dây màu xanh lam là đường dữ liệu cho các dải LED (WS2812s). Cặp màu vàng / xanh lá cây là các đường dữ liệu cho bộ mã hóa quay và cặp màu vàng là kết nối nối tiếp với màn hình 7 đoạn.

Bước 11: Lắp ráp

cuộc họp
cuộc họp
cuộc họp
cuộc họp
cuộc họp
cuộc họp
cuộc họp
cuộc họp

Loạt ảnh này cho thấy quá trình lắp ráp và đi dây cuối cùng. Tôi cũng gắn bảng điều khiển chính vào mặt sau ở phía trên.

Trước khi kích hoạt nó, tôi đã kiểm tra một vài lần để tránh bất kỳ bất ngờ khó chịu nào. Đặc biệt, để đảm bảo rằng tôi không có bất kỳ đầu nối nguồn / nối đất nào ngược lại và không bị đoản mạch. Đặt đồng hồ vạn năng của bạn để kiểm tra tính liên tục - nó sẽ phát ra tiếng bíp khi có đường dẫn điện giữa hai dây dẫn. Gắn một dây dẫn vào đường VCC chung vào các nút. Sau đó gắn dây dẫn còn lại vào từng chốt của dây nịt. Đồng hồ vạn năng chỉ phát ra tiếng bíp khi bạn nhấn nút. Nếu bạn nhận được bất kỳ tiếng bíp nào khác, điều đó có nghĩa là bạn có một sự đảo ngược hoặc bán khống. Hãy theo dõi và sửa chữa nó trước khi bạn bật nguồn!

Bước 12: Mã

Trước tiên, hãy mở Arduino IDE của bạn và đảm bảo rằng bạn đã cài đặt thư viện FastLED.

Tải xuống mã Máy thuật toán từ GitHub:

github.com/samguyer/AlgorithmMachine.git

Bạn có thể sao chép nó trực tiếp vào thư mục Arduino của mình hoặc sao chép nó bằng tay.

Trước khi tải lên, hãy đảm bảo cài đặt ghim khớp với cấu hình phần cứng của bạn. Tôi đã đặt tất cả các cài đặt ghim ở đầu tệp.

Tải lên và tận hưởng!

Bước 13: Cách sử dụng

Máy thuật toán rất dễ sử dụng và hầu hết mọi sự kết hợp của các nút đều ổn!

Đầu tiên, sử dụng các nút dữ liệu để khởi tạo các giá trị trong mảng. Có ba lựa chọn: (1) ngẫu nhiên hóa, (2) thêm một giá trị ngẫu nhiên và (3) đảo ngược mảng. Lưu ý rằng các giá trị là cố định, vì vậy bạn có thể thực hiện những việc như sắp xếp chúng trước, sau đó thêm một số nhiễu, sau đó chạy một thuật toán sắp xếp hoặc tìm kiếm khác.

Chọn một thuật toán tìm kiếm hoặc sắp xếp từ các lựa chọn nút khác. Hiện tại, không có phản hồi khi bạn đưa ra lựa chọn này (một cái gì đó cho công việc trong tương lai). Sau đó nhấn nút "play".

Núm điều khiển tốc độ. Bạn cũng có thể nhấn "play" để tạm dừng và bỏ tạm dừng thuật toán.

Nó sẽ tự động dừng khi hoàn tất. Bạn cũng có thể nhấn một nút thuật toán khác bất kỳ lúc nào. Máy sẽ dừng thuật toán hiện tại và khởi tạo thuật toán mới, nhưng vẫn giữ nguyên dữ liệu chính xác như thuật toán trước đó đã để lại.

Cuộc thi STEM
Cuộc thi STEM
Cuộc thi STEM
Cuộc thi STEM

Giải thưởng lớn trong Cuộc thi STEM

Đề xuất: