Mục lục:

Trò chơi Lego Mini Memory: 5 bước (có hình ảnh)
Trò chơi Lego Mini Memory: 5 bước (có hình ảnh)

Video: Trò chơi Lego Mini Memory: 5 bước (có hình ảnh)

Video: Trò chơi Lego Mini Memory: 5 bước (có hình ảnh)
Video: Tony | Cuộc Thi Sáng Tạo Cùng LEGO 2024, Tháng mười một
Anonim
Image
Image
Trò chơi trí nhớ Lego Mini
Trò chơi trí nhớ Lego Mini

Cách đây một năm, tôi đã viết một Tài liệu hướng dẫn về việc lắp đặt một loạt đèn LED trong Lego Mini Cooper. Sự đổi mới, chẳng hạn như trước đây, là các đèn LED có thể được điều khiển bằng điện thoại thông minh (hoặc thông qua bất kỳ trình duyệt web nào, cho vấn đề đó).

Như tôi đã mô tả một cách chăm chỉ trong bài Hướng dẫn đó, hầu hết mọi nỗ lực hồi đó đều liên quan đến việc nối dây cho Mini mà toàn bộ mọi thứ không bị đổ vỡ. Tôi hơi ngạc nhiên là Mini sau đó đã sống sót sau chuyến đi từ Connecticut đến Toronto và ít nhiều đã hoạt động kể từ đó.

"Nếu nó không bị hỏng, anh ấy đã sửa nó cho đến khi nó được" tốt nhất sẽ là văn bia của tôi, vì vậy khi Mini trở về nhà vào dịp Giáng sinh, đó là thời điểm cho Lego Mini 2.0. Rốt cuộc, nếu Tesla có thể đẩy các bản cập nhật phần mềm cho ô tô của mình, thì điều đó có thể khó khăn đến mức nào?

Tôi có một vài ý tưởng:

  • Cải thiện giao diện người dùng khá rắc rối
  • Thêm một cái sừng!
  • Cải thiện tính năng "đèn tự động"; và, quan trọng nhất
  • Thêm một chức năng trò chơi (ngay cả khi tôi nhận ra rằng tính mới của việc bật và tắt đèn của Mini trên điện thoại của bạn sớm muộn gì cũng sẽ ngừng hoạt động)

Chức năng trò chơi là nhiệm vụ lớn nhất, đặc biệt là vì tôi không rõ ràng ngay lập tức nó có thể là loại trò chơi nào. Mini quá mỏng manh để duy trì một trò chơi liên quan đến việc xử lý nó (ngoại trừ có thể là một biến thể đáng buồn của Jenga). Một trở ngại khác là tôi chưa bao giờ lập trình một trò chơi nào trong đời.

Sau một năm cân nhắc không có kết quả, tôi tình cờ biết được một dự án về Hackster, trong đó Arduino Uno được sử dụng để mô phỏng một món đồ chơi trò chơi trí nhớ có từ những năm 1970 tên là Simon. Tóm lại, thiết bị Simon đã phát một chuỗi đèn mà người chơi sau đó phải nhớ và phát lại bằng cách nhấn các nút. Sau mỗi vòng thành công, độ dài của chuỗi được tăng lên.

Mặc dù thuộc loại cổ điển cần thiết, tôi thực sự chưa bao giờ nghe nói về trò chơi này, và tôi phải nói rằng thật tuyệt vời những gì đã qua cho trò chơi giải trí trong ngày. Điều tuyệt vời hơn nữa là trò chơi Simon vẫn đang được bán và nhận được nhiều lời khen ngợi, trên Amazon. Rõ ràng, đây phải là ứng cử viên hàng đầu để thích ứng với mục đích của tôi. Rốt cuộc, Mini đã có đèn, vì vậy tất cả những gì tôi cần làm là loại bỏ các nút vật lý và cung cấp đầu vào của người dùng thông qua điện thoại thông minh. Do đó, về mặt phần mềm, có vẻ như đây chỉ là một công việc cắt và dán.

Nhưng trước tiên, tôi cần thực hiện một số sửa đổi nhỏ đối với phần cứng.

Bước 1: Thành phần, Công cụ & Tài nguyên

Thành phần, Công cụ & Tài nguyên
Thành phần, Công cụ & Tài nguyên

Nếu bạn đang tái tạo dự án này bằng Lego Mini, bạn sẽ cần tất cả những thứ được liệt kê trong Có thể hướng dẫn trước đây của tôi. Thứ duy nhất bạn cần là một bộ rung thụ động, được sử dụng cho còi và tạo ra một loạt tiếng ồn khó chịu trong trò chơi (có thể bị vô hiệu hóa).

Như sẽ trở nên rõ ràng khi thảo luận về phần mềm, không cần thực sự sử dụng Lego Mini cho trò chơi. Bạn có thể sử dụng một bộ Lego khác hoặc thực sự là một chùm đèn LED trên bảng mạch được nối với bất kỳ bảng phát triển ESP8266 nào. Với một số rơ le, bạn thậm chí có thể sử dụng ánh sáng trong phòng của ngôi nhà của mình. Các con, hãy hỏi bố mẹ trước về vấn đề đó.

Tương tự, không cần công cụ hoặc tài nguyên bổ sung nào ngoài những công cụ được liệt kê cho dự án ban đầu.

Nếu bạn là một trong số ít những người đã đọc mô tả dự án ban đầu, bạn sẽ biết rằng Lego Mini ban đầu được mua như một món quà cho con gái lớn của tôi, người có một Mini "thật" gần như giống hệt nhau, hoặc gần giống như nó có thể được cho rằng nó là một chiếc Mini Mới, không phải một chiếc "Cổ điển". Việc thiếu bất kỳ thành phần bổ sung có ý nghĩa nào đã làm cho dự án mới này trở nên hấp dẫn hơn vì nó sẽ cho phép tôi tặng lại Lego Mini 2.0 một cách hiệu quả như một món quà Giáng sinh mới mà không tốn một xu. Thiên tài!

Bước 2: Sửa đổi phần cứng

Sửa đổi phần cứng
Sửa đổi phần cứng

Dự án ban đầu có đèn LED nội thất RGB có thể điều khiển riêng. Những thứ này đã sử dụng ba chân trên NodeMCU, mà tôi đang sử dụng làm bảng phát triển. Sau khi tham khảo ý kiến riêng biệt với chủ sở hữu Lego Mini, người ta xác định rằng đèn LED RGB là một tính năng không được sử dụng. Đây là thông tin quan trọng vì tôi cần giải phóng một chốt cho còi / còi.

Sơ đồ mạch trên là từ dự án ban đầu. Thay đổi duy nhất cần thiết cho dự án này là loại bỏ các đèn LED RGB và sử dụng ba chân giải phóng như sau:

  • D1 cho tín hiệu điều khiển còi (tín hiệu này cũng được nối trực tiếp với nguồn điện 5VDC)
  • D7 cho đèn LED nội thất màu trắng
  • D8 cho một trong những đèn LED màu nhấp nháy, mà tôi gọi là đèn "disco"

Bản thân bộ rung được đặt gọn gàng dưới khoang động cơ nên việc chạy dây trở lại NodeMCU chỉ diễn ra trong tích tắc.

Bước 3: Cập nhật GUI

Cập nhật GUI
Cập nhật GUI
Cập nhật GUI
Cập nhật GUI
Cập nhật GUI
Cập nhật GUI

Bước đầu tiên trong việc cập nhật GUI là tạo bốn trang web riêng biệt:

  • "Màn hình giật gân" khởi chạy qua biểu tượng tùy chỉnh trên điện thoại thông minh của bạn và liên kết đến các trang khác
  • Trang "Điều khiển" điều khiển đèn (và tất nhiên bây giờ là còi)
  • Trang "Trò chơi"
  • Trang Thiết lập chứa các tùy chọn cấu hình như:

    • Bật và tắt âm thanh
    • Đặt múi giờ (Mini lấy thời gian từ internet để nó có thể nhấp nháy đèn vào giờ với thời gian thích hợp)
    • Điều chỉnh thời điểm "đèn tự động" sẽ bật và tắt đèn pha dựa trên mức độ ánh sáng xung quanh
    • Đặt lại Điểm cao và tên Người ghi điểm cao (được lưu trữ trong EEPROM)

Việc tách các chức năng ra theo cách này sẽ tạo ra trải nghiệm giống ứng dụng hơn nhiều. Việc đưa NodeMCU phân phát nhiều trang là một trong những thách thức đối với dự án này. Sau khi thử một vài cách tiếp cận khác nhau, tôi đã xem được đoạn mã mà bạn thấy ở dòng 232 đến 236 của bản phác thảo Arduino chính. Điều này hoạt động tuyệt vời - chỉ cần tạo tệp chỉ mục của bạn sau đó đặt tên cho các trang tiếp theo là trang1, trang2, v.v. Tôi nhận thấy rằng tôi phải đặt tất cả các tệp tài nguyên (CSS và hình ảnh) trong thư mục dữ liệu gốc nhưng đây không thực sự là vấn đề đối với các trang web của kích thước này.

Tiếp theo, tôi phải làm việc với CSS và Javascript để tạo ra thứ gì đó trông giống như một chiếc Lego Mini. Vì tôi không biết gì về một trong hai chủ đề nên đã có rất nhiều Google tìm kiếm ở đây trước khi nhận được thứ mà tôi hài lòng. Tôi bắt đầu bằng cách sao chép một cách hổ thẹn một viên gạch lego theo kiểu CSS trên CodePen tại đây. Tôi cũng muốn loại bỏ việc gắn nhãn các nút bằng văn bản và kết thúc bằng cách sử dụng đồ họa đơn giản từ Icons8, những thứ hoàn hảo cho mục đích của tôi. Phần còn lại rơi vào đúng vị trí từ đó. Các trang hiển thị khá tốt trên tất cả các iPhone mà tôi đã thử nghiệm. Hy vọng rằng điều này cũng đúng với điện thoại Android (có vẻ ổn trên trình duyệt Chrome trên máy tính để bàn).

Bước 4: Mã trò chơi

Mã trò chơi
Mã trò chơi

Giao tiếp giữa máy chủ NodeMCU và trình duyệt trên điện thoại thông minh thông qua Websockets. Sau khi người dùng nhấn nút, trình duyệt sẽ gửi một ký tự văn bản đến NodeMCU tương ứng với một hoặc nhiều đèn của Mini. Các nhân vật bổ sung được gửi đến để kiểm soát dòng chảy trò chơi. Sau đó, mã Arduino thực hiện hành động dựa trên ký tự nhận được. Giao tiếp websocket chỉ có thể xử lý các ký tự nhị phân và văn bản nên cần một số chuyển đổi cho số nguyên (ví dụ: múi giờ).

Như tôi đã đề cập, tôi đã dự đoán ban đầu bằng cách sử dụng mã từ dự án Hackster được liên kết cho các chức năng trò chơi cốt lõi. Những gì tôi dự đoán sẽ xảy ra là, sau khi người chơi nhấn một nút, đèn LED tương ứng sẽ sáng lên và mã sẽ thực hiện kỹ thuật số Đọc trên tất cả các đèn LED để xem đúng đèn có sáng không (dự án Hackster kiểm tra các đầu vào nút vật lý nhưng nó là cùng một ý tưởng). Điều này đã thành công, đại loại, nhưng vì những lý do mà tôi vẫn chưa rõ ràng, không hoàn toàn. Khoảng 10% thời gian Mini sẽ nói rằng một nút không chính xác đã được nhấn trong khi thực tế, nút chính xác đã được nhấn. Mọi thứ có vẻ ổn dựa trên những gì tôi có thể thấy trong màn hình nối tiếp và trong bảng điều khiển trình duyệt, vì vậy tôi không biết tại sao nó không hoạt động.

Sau rất nhiều khó khăn với việc cố gắng đưa ra một số kiểm tra lỗi, tôi đã bỏ toàn bộ ý tưởng về việc đọc trạng thái đèn LED và tạo một mảng "câu trả lời" để kiểm tra xem văn bản Websocket nhận được có tương ứng với chân đúng được lưu trữ trong mảng "chuỗi" hay không chơi chuỗi ánh sáng để ghi nhớ. Điều này có vẻ là đáng tin cậy 100% ngay cả khi cách tôi thực hiện nó hơi khó chịu. Sau khi tìm ra phương pháp này, tôi đã tình cờ thấy điều này, đó là một khám phá thú vị về cách một số khóa kỹ thuật số hoạt động và tương tự như cách tiếp cận được sử dụng trong trò chơi.

Thời gian của các đầu vào nút hiện được xử lý bằng Javascript ở phía trình duyệt (tôi cho phép khoảng 10 giây giữa các lần nhập nút) và luồng của trò chơi hiện do người chơi kiểm soát hoàn toàn chứ không phải mã hóa cứng. Màn hình bao gồm các cửa sổ hiển thị thời gian còn lại để thực hiện nhấn nút tiếp theo và số lượng đầu vào còn lại trước khi trình tự được người chơi gửi chính xác.

Điểm cao được lưu trữ trong EEPROM (hoặc những gì vượt qua cho EEPROM trong thế giới ESP8266) và nếu người chơi đạt điểm cao mới, hộp bật lên cho phép họ nhập tên mà họ chọn, tên này cũng được lưu trong EEPROM. Các giá trị này có thể được đặt lại thông qua trang Thiết lập (Tôi chắc rằng có thể có lý do chính đáng cho việc này).

Với tất cả những gì đã nói, tôi đã sử dụng lại một đoạn mã trò chơi Hackster khá tốt để tăng tốc độ mọi thứ lên rất nhiều.

Bước 5: Phần còn lại của mã

Phần còn lại của mã
Phần còn lại của mã

So với mã dự án Hackster, bản phác thảo Arduino của tôi trông rất lớn, ngay cả khi không có tất cả HTML, CSS và Javascript trong các tệp dữ liệu. Nhưng phần lớn của bản phác thảo là một loạt các chức năng liên quan đến các hoạt động cơ bản như tạo và quản lý máy chủ, lấy thời gian NTP, mDNS, cung cấp cập nhật qua mạng, quản lý WiFi, quản lý tệp SPIFFS và những thứ tương tự.

Javascript trong các tệp HTML chủ yếu để xử lý các thông báo Websocket (nhận và gửi) và tăng tính tương tác của GUI.

Như tôi đã đề cập, tôi muốn cải thiện chức năng của tính năng "đèn tự động", sử dụng điện trở phụ thuộc vào ánh sáng trên chân analog duy nhất của NodeMCU để phát hiện ánh sáng xung quanh và bật đèn của Mini ở mức đặt trước (khi không ở Chế độ trò chơi, Đương nhiên). Mặc dù đây là một tính năng rất phù phiếm trong một dự án phù phiếm, nhưng điều khiến tôi khó chịu là trong dự án ban đầu, tôi đã mã hóa cứng ngưỡng bật và người dùng không có cách nào để biết mức độ ánh sáng phổ biến liên quan đến ngưỡng đó như thế nào. Giờ đây, việc đọc mức độ ánh sáng được gửi đến trang Cài đặt sau mỗi năm giây và trang đó cũng hiển thị các ngưỡng bật và tắt hiện tại (người dùng có thể định cấu hình). Vì vậy, công việc hoàn thành trên đó.

Ồ, suýt nữa thì quên mất. Mã có trên GitHub tại đây. Sau khi tải xuống, hãy đặt toàn bộ gói vào một thư mục mới, tải lên bản phác thảo Arduino, sau đó tải nội dung của thư mục dữ liệu vào SPIFFS.

Đề xuất: