Talaan ng mga Nilalaman:

Lego Mini Memory Game: 5 Hakbang (na may Mga Larawan)
Lego Mini Memory Game: 5 Hakbang (na may Mga Larawan)

Video: Lego Mini Memory Game: 5 Hakbang (na may Mga Larawan)

Video: Lego Mini Memory Game: 5 Hakbang (na may Mga Larawan)
Video: Biglang nag Trending sa tiktok Ang Bata na nag dance ng sa malamig🙀 2024, Hulyo
Anonim
Image
Image
Lego Mini Memory Game
Lego Mini Memory Game

Isang taon o higit pa ang nakakaraan, nagsulat ako ng isang Maituturo tungkol sa pag-install ng isang grupo ng mga LED sa isang Lego Mini Cooper. Ang pagbabago, tulad nito, ay ang mga LED ay maaaring kontrolin sa isang smartphone (o sa pamamagitan ng anumang web browser, para sa bagay na iyon).

Habang ako ay matrabaho na inilarawan sa Instructable na iyon, ang karamihan sa pagsisikap noon ay nauugnay sa mga kable ng Mini nang hindi nabagsak ang buong bagay. Medyo nagulat ako, pagkatapos ay nakaligtas ang Mini sa isang paglalakbay mula sa Connecticut patungong Toronto at nagtrabaho, higit pa o mas kaunti, mula pa noon.

"Kung hindi ito nasira, naayos niya ito hanggang sa maging" magiging epitaph ko, pinakamahusay, kaya't nang umuwi ang Mini para sa Pasko, oras na para sa Lego Mini 2.0. Pagkatapos ng lahat, kung maaaring itulak ng Tesla ang mga pag-update ng software sa mga kotse nito, gaano kahirap ito?

Mayroon akong ilang mga ideya:

  • Pagbutihin ang sa halip clunky user interface
  • Magdagdag ng isang sungay!
  • Pagbutihin ang tampok na "mga ilaw ng sasakyan"; at, pinakamahalaga
  • Magdagdag ng isang pag-andar ng laro (kahit na nakilala ko na ang kabaguhan ng pag-on at pag-off ng mga ilaw ng Mini sa iyong telepono ay mas mabilis o mas mabilis.)

Ang pagpapaandar ng laro ay ang pinakamalaking gawain, hindi bababa sa dahil hindi ito kaagad halata sa akin kung anong uri ng laro ito. Ang Mini ay masyadong marupok upang mapanatili ang isang laro na kinasasangkutan nito na hawakan (maliban sa posibleng isang nakalulungkot na pagkakaiba-iba ng Jenga). Ang isa pang sagabal ay hindi ko na-program ang isang laro sa aking buhay.

Matapos ang isang taon ng walang bunga na pagninilay, natagpuan ko ang isang proyekto sa Hackster, kung saan ginagamit ang isang Arduino Uno upang tularan ang isang laruang memory game mula pa noong 1970 na tinawag na Simon. Sa madaling sabi, nagpe-play ang aparato ng Simon ng isang pagkakasunud-sunod ng mga ilaw na dapat tandaan at i-play muli ng manlalaro sa pamamagitan ng pagpindot sa mga pindutan. Matapos ang bawat matagumpay na pag-ikot ang pagkakasunud-sunod ay nadagdagan ang haba.

Sa kabila ng pagiging kinakailangang vintage, talagang hindi ko narinig ang larong ito, at sasabihin kong kamangha-mangha kung ano ang lumipas para sa libangan noong araw. Ang higit pang kamangha-mangha ay ang laro ng Simon ay ipinagbibili pa rin, at nakakakuha ng magagandang pagsusuri, sa Amazon. Malinaw, ito ang dapat na maging pangunahing kandidato upang umangkop para sa aking mga hangarin. Pagkatapos ng lahat, mayroon nang mga ilaw ang Mini, kaya ang kailangan ko lang gawin ay ang kanal ng mga pisikal na pindutan at ibigay ang input ng gumagamit sa pamamagitan ng isang smartphone. Sa panig ng software, samakatuwid, tila ito ay higit sa isang cut-and-paste-job.

Ngunit una, kailangan kong gumawa ng ilang mga menor de edad na pagbabago sa hardware.

Hakbang 1: Mga Bahagi, Tool at Mapagkukunan

Mga Bahagi, Tool at Mapagkukunan
Mga Bahagi, Tool at Mapagkukunan

Kung kinokopya mo ang proyektong ito sa isang Lego Mini, kakailanganin mo ang lahat ng mga bagay na nakalista sa aking naunang Instructable. Ang tanging dagdag na bagay na kakailanganin mo ay isang passive buzzer, na ginagamit para sa sungay at upang makagawa ng isang bungkos ng mga nakakainis na ingay sa panahon ng laro (na maaaring hindi paganahin).

Tulad ng magiging malinaw kapag tinatalakay ang software, hindi totoong pangangailangan na gumamit ng Lego Mini para sa laro. Maaari kang gumamit ng isa pang Lego kit, o sa katunayan isang pangkat ng mga LED sa isang breadboard na naka-hook sa anumang board ng pag-unlad ng ESP8266. Sa ilang mga relay, maaari mo ring gamitin ang ilaw ng kuwarto ng iyong bahay. Mga bata, tanungin muna ang inyong mga magulang sa isang iyon.

Katulad nito, walang karagdagang mga tool o mapagkukunan ang kinakailangan na lampas sa mga nakalista para sa orihinal na proyekto.

Kung kabilang ka sa kaunting mga tao na nagbasa ng orihinal na paglalarawan ng proyekto, malalaman mo na ang Lego Mini ay orihinal na binili bilang isang regalo sa aking may edad na anak na babae, na may halos magkatulad na "totoong" Mini, o halos magkapareho maaari itong ibigay ito ay isang Bagong Mini, hindi isang "Klasikong". Ang kakulangan ng anumang makabuluhang mga karagdagang sangkap na ginawang mas kaakit-akit ang bagong proyektong ito dahil paganahin nito akong mabisang muling regaluhan ang Lego Mini 2.0 bilang isang bagong regalo sa Pasko nang hindi nagkakahalaga ng halos isang dolyar. Genius!

Hakbang 2: Pagbabago ng Hardware

Pagbabago ng Hardware
Pagbabago ng Hardware

Ang orihinal na proyekto ay may isa-isa na makokontrol na mga panloob na LED ng RGB. Naubos nito ang tatlong pin sa NodeMCU, na ginagamit ko bilang development board. Matapos ang discrete consultation sa may-ari ng Lego Mini, natukoy na ang mga RGB LEDs ay isang hindi ginagamit na tampok. Ito ay mahalagang katalinuhan sapagkat kailangan kong magbakante ng isang pin para sa buzzer / sungay.

Ang nasa itaas na diagram ng circuit ay mula sa orihinal na proyekto. Ang kinakailangang pagbabago lamang para sa proyektong ito ay upang alisin ang mga RGB LEDs at gamitin ang tatlong pinalaya na mga sumusunod na sumusunod:

  • D1 para sa signal ng control ng buzzer (na direktang naka-wire din sa 5VDC power supply)
  • D7 para sa isang puting interior LED
  • D8 para sa isa sa mga kumikislap na kulay na LEDS, na tinawag kong ilaw na "disco"

Ang buzzer mismo ay nakatago nang maayos sa ilalim ng kompartimento ng engine kaya't ang pagpapatakbo ng mga wire pabalik sa NodeMCU ay isang iglap.

Hakbang 3: Ina-update ang GUI

Ina-update ang GUI
Ina-update ang GUI
Ina-update ang GUI
Ina-update ang GUI
Ina-update ang GUI
Ina-update ang GUI

Ang unang hakbang sa pag-update ng GUI ay ang paglikha ng apat na magkakahiwalay na mga web page:

  • Isang "splash screen" na inilulunsad sa pamamagitan ng isang pasadyang icon sa iyong smartphone at mga link sa iba pang mga pahina
  • Ang pahinang "Mga Kontrol" na, kung gayon, kinokontrol ang mga ilaw (at ngayon, syempre, ang sungay)
  • Ang pahina ng "Laro"
  • Isang pahina ng Pag-set up na naglalaman ng mga pagpipilian sa pagsasaayos tulad ng:

    • Ang pag-on at pag-off ng tunog
    • Ang pagtatakda ng time zone (ang Mini ay nakakakuha ng oras mula sa internet upang ma-flash nito ang mga ilaw nito sa oras na may naaangkop na oras)
    • Ang pag-aayos kapag ang "mga ilaw ng auto" ay magpapasara at magpapapatay ng mga headlight batay sa antas ng ambient light
    • Pag-reset ng Mataas na Marka ng pangalan at Mataas na Scorer (nakaimbak sa EEPROM)

Ang paghihiwalay ng mga pag-andar sa ganitong paraan ay gumagawa ng higit pang karanasan na tulad ng app. Ang pagkuha ng NodeMCU upang maghatid ng maraming mga pahina ay isa sa mga hamon para sa proyektong ito. Matapos subukan ang isang pares ng magkakaibang mga diskarte naabutan ko ang code na nakikita mo sa mga linya 232 hanggang 236 ng pangunahing Arduino sketch. Magaling ito - lumikha lamang ng iyong file ng index pagkatapos ay pangalanan ang kasunod na mga pahina ng pahina1, pahina2 atbp. Nalaman kong kailangan kong ilagay ang lahat ng mga file ng mapagkukunan (CSS at mga imahe) sa root data folder ngunit hindi talaga ito isyu para sa mga site ng ang laki na ito

Susunod, kailangan kong gumana sa CSS at Javascript upang makagawa ng isang bagay na mukhang nagmamay-ari ng isang Lego Mini. Dahil alam kong susunod-sa-wala tungkol sa alinmang paksa ay maraming Googling dito bago makakuha ng isang bagay na masaya ako. Nagsimula ako sa pamamagitan ng walang kahihiyang pagkopya ng isang CSS na may istilong lego sa CodePen dito. Nais ko ring lumayo mula sa pag-label ng mga pindutan na may teksto at magtatapos gamit ang mga simpleng graphics mula sa Icons8, na perpekto para sa aking mga layunin. Ang natitirang uri ng nahulog sa lugar mula doon. Medyo mahusay na nag-render ang mga pahina sa lahat ng mga iPhone na nasubukan ko ang mga ito. Sana totoo din ang pareho para sa mga teleponong Android (mukhang OK sa isang desktop Chrome browser).

Hakbang 4: Ang Code ng Laro

Ang Code ng Laro
Ang Code ng Laro

Ang komunikasyon sa pagitan ng NodeMCU server at ng browser ng smartphone ay sa pamamagitan ng Websockets. Matapos ang isang pindutan ay pinindot ng gumagamit, ang browser ay nagpapadala ng isang text character sa NodeMCU na tumutugma sa isa o higit pa sa mga ilaw ng Mini. Ang mga karagdagang character ay ipinadala upang makontrol ang daloy ng laro. Ang Arduino code pagkatapos ay magsasagawa ng pagkilos batay sa natanggap na character. Kakayanin lamang ng komunikasyon sa websocket ang mga binary at text character kaya't kinakailangan ng ilang conversion para sa mga integer (hal. Ang time zone).

Tulad ng nabanggit ko, orihinal kong inaasahan ang paggamit ng code mula sa naka-link na proyekto ng Hackster para sa mga pangunahing pag-andar ng laro. Ang inaasahan kong mangyayari ay na, pagkatapos ng isang manlalaro ay pinindot ang isang pindutan, ang kaukulang LED ay mag-iilaw at ang code ay gagawa ng isang digitalRead sa lahat ng mga LED upang makita kung ang tama ay naiilawan (suriin ng proyekto ng Hackster ang mga pisikal na pag-input ng butones ngunit ito ay ang parehong ideya). Gumana ito, uri ng, ngunit para sa mga kadahilanan na hindi pa malinaw sa akin, hindi perpekto. Humigit-kumulang 10% ng oras na sasabihin ng Mini na ang isang hindi tamang pindutan ay pinindot nang, sa katunayan, ang wastong naging. Ang lahat ay tila OK batay sa nakikita ko sa serial monitor at sa browser console kaya't wala akong ideya kung bakit hindi ito gumana.

Matapos ang maraming faffing sa pagsubok na ipakilala ang ilang error sa pag-check, inilagay ko ang buong ideya ng pagbabasa ng mga estado ng LED at lumikha ng isang "sagot" na array na suriin kung ang natanggap na teksto ng Websocket ay tumutugma sa tamang pin na nakaimbak sa "pagkakasunud-sunod" na array na nagpe-play ang ilaw na pagkakasunud-sunod upang matandaan. Tila ito ay magiging 100% maaasahan kahit na ang paraan ng pagpapatupad ko nito ay medyo plodding. Matapos na maisip ang pamamaraang ito, nangyari ako rito, na isang kagiliw-giliw na paggalugad ng paraan ng paggana ng ilang mga digital lock at kahalintulad sa pamamaraang ginamit sa laro.

Ang pag-time ng mga pag-input ng pindutan ay pinangangasiwaan na ngayon ng Javascript sa panig ng browser (pinapayagan ko ang isang napaka mapagbigay na 10 segundo sa pagitan ng mga pag-input ng pindutan) at ang daloy ng laro ay ganap na kinokontrol ng player sa halip na hard-code. Kasama sa display ang mga bintana na nagpapakita ng natitirang oras upang gawin ang susunod na pindutin ang pindutin at ang bilang ng mga input na natitira bago ang pagkakasunud-sunod ay wastong naisumite ng player.

Ang mataas na iskor ay nakaimbak sa EEPROM (o kung ano ang pumasa para sa EEPROM sa mundo ng ESP8266) at kung ang isang manlalaro ay tumama sa isang bagong mataas na marka ang isang pop-up box ay nagpapahintulot sa kanila na magpasok ng isang pangalan na kanilang pinili, na nakaimbak din sa EEPROM. Ang mga halagang ito ay maaaring i-reset sa pamamagitan ng pahina ng Pag-set up (Sigurado akong maaaring may mga lehitimong dahilan para dito).

Sa lahat ng nasabi, muling ginamit ko ang isang disenteng tipak ng code ng laro ng Hackster na pinabilis ang maraming bagay.

Hakbang 5: Ang Natitirang Code

Ang Natitirang Code
Ang Natitirang Code

Kung ihahambing sa code ng proyekto ng Hackster, ang aking Arduino sketch ay mukhang napakalaking, kahit na walang lahat ng HTML, CSS at Javascript sa mga file ng data. Ngunit ang karamihan ng sketch ay isang grupo ng mga pagpapaandar na nauugnay sa pangunahing mga pagpapatakbo tulad ng paglikha at pamamahala ng server, pagkuha ng oras ng NTP, mDNS, pagbibigay para sa sobrang pag-update, pamamahala ng WiFi, pamamahala ng file na SPIFFS at iba pa.

Ang Javascript sa mga file ng HTML ay pangunahin para sa paghawak ng mga mensahe ng Websocket (natanggap at naipadala) at pagdaragdag ng pagkakakonekta ng GUI.

Tulad ng nabanggit ko, nais kong pagbutihin ang pagpapaandar ng tampok na "auto lights", na gumagamit ng isang light dependant na risistor sa nag-iisang analog pin ng NodeMCU upang makita ang ilaw ng paligid at buksan ang mga ilaw ng Mini sa isang preset na antas (kapag wala sa Game Mode, syempre). Habang ito ay napaka isang walang kabuluhan na tampok sa isang walang kabuluhan na proyekto, nag-abala sa akin na sa orihinal na proyekto ay hard-code ko ang turn-on na threshold at ang isang gumagamit ay walang paraan upang makita kung paano ang umiiral na antas ng ilaw na nauugnay sa threshold na iyon. Ngayon ang pagbabasa sa antas ng ilaw ay ipinapadala sa pahina ng Pag-set up bawat limang segundo at ipinapakita rin ng pahinang iyon ang kasalukuyang mga threshold para i-on at i-off (na maaaring mai-configure ng gumagamit). Kaya't tapos na ang trabaho sa isang iyon.

Oh, halos nakalimutan. Ang code ay nasa GitHub dito. Pagkatapos mag-download, ilagay ang buong pakete sa isang bagong folder, i-upload ang Arduino sketch, pagkatapos ang mga nilalaman ng folder ng data sa SPIFFS.

Inirerekumendang: