ksp gửi vào
- 16777 lượt xem
Với mong muốn giúp các newbie có thể dễ dàng hình dung việc lập trình trên board mạch Arduino. Hôm nay, mình sẽ hướng dẫn các bạn làm một game khá thú vị, đó là game: "Thử tài trí nhớ". Chỉ việc sử dụng một ít led, điện trở, nút nhấn và 01 servo, cùng với tay nghề độ mod khéo léo sẵn có của bạn, chúng ta đã có một game khá thú vị rồi!
Game "Thử tài trí nhớ" là gì nhỉ?
Thử tài trí nhớ là một trong những thể loại game có lối chơi hack não, yêu cầu người chơi phải ghi nhớ và làm lại đúng những gì mà game yêu cầu. Và luật chơi của game này như sau:
- Có 04 đèn LED (đánh số từ 0 đến 3, vì sao lại là số 0 mà không là số 1? Vì trong lập trình C++, chỉ số bắt đầu của một mảng là số 0)
- Có 04 nút nhấn (đánh số từ 0 đến 3)
- Có x lần bật / tắt một đèn bất kỳ trong 04 đèn LED.
- Giữa mỗi lần bật / tắt có khoảng thời gian nghĩ (delay) để người dùng kịp ghi nhớ trạng thái.
Ví dụ:
- Có x = 5, delay = 200 (mi li giây)
- Kịch bản thứ tự các đèn sẽ được bật/tắt là: 3, 2, 1, 0, 2
- Ở lần bật/tắt (toggle) thứ 0: đèn 3 sẽ được bật trong 200ms, sau đó tắt trong 100ms.
- Ở lần bật/tắt (toggle) thứ 1: đèn 2 sẽ được bật trong 200ms, sau đó tắt trong 100ms.
- Ở lần bật/tắt (toggle) thứ 2: đèn 1 sẽ được bật trong 200ms, sau đó tắt trong 100ms.
- Ở lần bật/tắt (toggle) thứ 3: đèn 0 sẽ được bật trong 200ms, sau đó tắt trong 100ms.
- Ở lần bật/tắt (toggle) thứ 4: đèn 2 sẽ được bật trong 200ms, sau đó tắt trong 100ms.
- Yêu cầu người dùng sử dụng 04 nút nhấn và nhấn x = 5 lần sao cho các lần nhấn cho kết quả giống với kịch bản sáng của 04 đèn LED.
- Nếu người dùng nhấn đúng cả x lần, thông báo thành công và bạn cho người chơi 01 cục kẹo .
- Nếu người dùng nhấn sai ở một ví trí bất kỳ, thông báo không thành công và phát nhạc buồn .
Okay, đó là luật chơi, luật chơi chỉ có 4 dòng nhưng nó phát triển rất lớn vì ở hai tham số x và delay là các tham số biến theo và do quản trò đưa ra.
Các vấn đề để làm game này?
Để làm một game hay bất cứ một dự án nào, bạn cần phải liệt kê các vấn đề cần phải giải quyết và phương pháp có tương lai đối với bạn nhất. Vậy làm sao để liệt kê vấn đề cho đầy đủ nhất? Đó phụ thuộc vào sự sáng tạo và kinh nghiệm cuộc sống của bạn, bạn nghĩ ra các vấn đề càng chi tiết, phương pháp càng rõ ràng thì khi làm các vấn đề con phát sinh sẽ ít đi và độ thành công của dự án càng cao. Điều đó cũng giải thích cho việc những người quản trị dự án hay kiến trúc sư dự án luôn có số lương khủng trong khi bạn không thấy họ làm gì ?!? Vì vậy, hãy suy nghĩ thật kĩ càng trước khi làm, và những người suy nghĩ trước khi làm lúc nào cũng làm lớn, làm nhanh và ít khi vượt cán cân kinh phí.
Vào lại vấn đề, từ 4 luật của tập luật chơi, chúng ta sẽ liệt kê các vấn đề lần lượt theo 4 luật chơi này.
- Có 04 đèn LED (đánh số từ 0 đến 3, vì sao lại là số 0 mà không là số 1? Vì trong lập trình C++, chỉ số bắt đầu của một mảng là số 0)
- Như vậy, chúng ta phải có đèn LED và điện trở.
- Làm thế nào để bật tắt đèn LED. Xem bài viết Điều khiển 8 đèn LED sáng theo ý muốn của bạn, dễ hay khó ?
- Sử dụng điện trở như thế nào thì LED sáng mà không bị cháy khi dùng với Arduino? Điện trở 100-560 ohm là ổn nhất theo kinh nghiệm.
- Có 04 nút nhấn (đánh số từ 0 đến 3).
- Như vậy, chúng ta phải có nút nhấn (button) và điện trở.
- Tuy nhiên, có thể không cần dùng điện trở vì Arduino đã hỗ trợ điện trở PULLUP, vậy không dùng điện trở cho nút nhấn nữa mà xác định giá trị của nút nhấn thông qua việc sử dụng chế độ INPUT_PULLUP. Các bạn có thể xem bài viết Bài 3: Xác định trạng thái của một nút nhấn (button) để dễ dàng nắm bắt ở các phần sau.
- Có x lần bật / tắt một đèn bất kỳ trong 04 đèn LED.
- Như vậy, phải có một công cụ để nhập x. (1)
- Phải tạo ra kịch bản 04 LED từ x lần này. Có thể sử dụng hàm rand() để tạo ra các giá trị của mảng kịch bản.
- Giữa mỗi lần bật / tắt có khoảng thời gian nghĩ (delay) để người dùng kịp ghi nhớ trạng thái.
- Như vậy, phải có một công cụ để nhập delay. (2)
Từ (1), (2) suy ra: chúng ta cần có một công cụ để ghi nhận hai thông số này. Ở bước này, sẽ là một bước phân vân và bạn sẽ có rất nhiều hướng suy nghĩ! Hãy cùng phân tích các hướng suy nghĩ, lợi hại của từng cái nhé! Chỉ phân tích lợi hại, không phân tích kỹ thuật vào. Khi nào có 2 hướng trở lên mà bạn phân vân thì hãy đưa kỹ thuật vào. Và nếu kỹ thuật bạn không làm được thì chịu khó google xem các cách giải quyết khi người ta rơi và trường hợp như bạn nhé.
- Làm bàn phím + màn hình LCD để nhập.
- Với phương pháp này, cái lợi nhất đó là bạn có thể mang bộ game của mình đi chơi ở mọi nơi mà không cần thiết bị ngoại vi nào vào. +1
- Nhưng nó tốn lúa quá, phải cần cả LCD và bàn phím, tính sơ sơ cũng mấy trăm. -1
- Nếu người quản trò là một người không biết gì về điện tử có chạy được. +1
- Nhưng mà có thực sự cần thiết hay không? Trong khi dân điện tử là đối tượng sẽ làm ra cái máy này và đưa nó đi chơi với các bạn trẻ. -1
- Tóm lại: +1 - 1 + 1 - 1 = 0
- Nhập qua máy tính.
- Với phương pháp này lúc nào cũng phải có một cái máy tính theo. -1
- Với phương pháp này, khỏi cần phần lo pin gì cả, gắn dây usb vào máy tính thế là xong. +1
- Kinh tế hơn vì không cần phải có LCD và bàn phím với lại dân điện tử ai chả có máy tính . +1
- Có thể nhập dễ dàng thông qua giao tiếp Serial. +1
- Tóm lại: -1 + 1 + 1 + 1 = 2
- Nhập qua điện thoại.
- Điều khiển từ xa, điện thoại lúc nào chả trong túi. +2
- Thêm tiền mua module bluetooth hoặc esp8266 để giao tiếp. -1
- Phải có pin để nuôi -1
- Trông ngầu với bọn trẻ. +2
- Có thể tham khảo:
- Tóm lại: +2 - 1 - 1 + 2 = 2
Qua thống kê cho thấy, phương pháp nhập qua máy tính và nhập qua điện thoại đang chiếm ưu thế theo tầm nhìn chủ quan của mình. Cả 2 mình đều có kinh nghiệm và đều làm được. Nhưng câu hỏi đặt ra, là có cần thiết hay không? Đối tượng mình hướng đến là ai?
Đối tượng của mình là các newbie, đọc qua bài viết này có thể làm được một game mini vui vui đi khoe với bạn bè. Vì vậy, nó chỉ đơn thuần dừng ở mức project, không phải là mức product. Các đánh giá +1, -1, +2,... ở trên chỉ mang tính chủ quan đối với kiến trúc sư dự án này là mình mà thôi. Vì vậy, nó chỉ mang tính tham khảo haha. Nhưng một khi bạn đã dày dạn kinh nghiệm thì các con số đó thể hiện mức độ quan tâm của bạn đến một vấn đề, càng nhiều con số, càng khách quan, thì dự án của mình sẽ rất thành công nếu như những con số là số dương và lớn hơn một ngưỡng bạn định ra trước khi đánh giá.
Tóm lại, đã là newbie thì phải làm sao cho nó đơn giản và dễ hiểu nhất, vì vậy, mình sẽ chọn cách dễ nhất đó là điều khiển qua máy tính bằng cách sử dụng cổng serial. Vì nó tiết kiệm nhất, ít tốn chi phí nhất, nó chứa được các phần công nghệ tinh hoa mà một newbie buộc phải biết nếu muốn đi xa trong thế giới điện tử, nhà sáng chế này.
Ngoài ra, còn các vấn đề khác mang tính chất "nâng cao trải nghiệm người dùng" như:
- Có buzzer phát ra tiếng "e e" khi nhập sai hoặc "tinh tinh" khi nhập đúng.
- Có servo hay màn hình để báo bạn cần phải ghi nhớ bao nhiêu đèn LED (ý nói bạn phải nhớ bao nhiêu x đó mà haha).
- Có thêm vài con LED báo vui vui khi nhập sai hoặc nhập đúng.
Tổng kết các vấn đề
- Bật tắt đèn LED
- Đọc giá trị (trạng thái) nút nhấn
- Phát buzzer khi nhập sai / đúng.
- Quay servo báo số lượng LED cần phải nhớ.
- Tạo ra mảng kịch bản một cách ngẫu nhiên.
- Nhập x, delay thông qua giao tiếp Serial của Arduino.
- Thông báo thành công qua LED + loa.
- Thông báo thất bại qua LED + loa.
Yeah, nếu kĩ tính, bạn hãy tự mình tìm kiếm các vấn đề trên cùng với trí tưởng tượng của mình để tự mình giải quyết các vấn đề đó rồi đọc tiếp.
Để làm một dự án, sản phẩm bất kỳ, bạn cần phải có kịch bản hoạt động của nó. Đối với game, điều đó gọi là gameplay. Và Gameplay của chúng ta sẽ như sau:
- Quản trò sẽ nhập x, delay
- Game sẽ tạo ra kịch bản ghi nhớ từ x
- Game sẽ quay servo để thể hiện số lượng đèn LED cần phải nhớ, lúc đó đèn LED tại vị trí được chỉ định theo kịch bản sẽ bật (delay) rồi tắt (delay/2).
- Người dùng sẽ nhập trên game.
- Người dùng nhập đúng.
- Game báo ăn mừng.
- Quay về bước 1.
Kịch bản phụ:
- Người dùng nhập sai.
- Game báo nhập sai, nhạc não nề .
- Bạn chê người chơi.
- Quay về bước 1.
Lắp mạch
Lập trình
Mình đã ghi note lại theo kịch bản trong code lập trình, bạn hãy khám phá nhé .
Để điều khiển game này, bạn mở Serial Monitor và chọn baudrate 9600 + No line ending là ok.
Kết luận
Qua game này, mình mong muốn bạn có một cái nhìn "học thuật" hơn về việc lập trình arduino. Không chỉ đơn thuần nhắm mắt mà code, mà phải nghĩ trước khi làm. Vì điều đó sẽ giúp bạn tiếp kiệm được rất nhiều thời gian, và giúp bạn hình thành được những lập luận rõ ràng. Tránh bị dính vào những vòng luẩn quẩn The Tar Pit trong cả suy nghĩ và hành động. Chúc các bạn thành công và làm được nhiều game hay hơn nữa.