Konsola e lojërave për Arduino. Arduino UNO R3 (Gra u ping pong robimo sami). Krijimi i shkronjave master



Le të fillojmë të krijojmë një yndyrë mendore të quajtur "Llogaritësi aritmetik". Gravets kontrollohet nga një levë me aftësinë për të lëvizur nëpër një fushë me përmasa 128×90. Me lëvizje zero të levës, graviteti lëviz në qendër. Kontrolli maksimal i levës korrespondon me lëvizjen maksimale të zhavorrit. Në intervale të rregullta, gjenerohen objekte-shifra, të cilat shemben si ferr deri në fund. Pas arritjes së pozicionit të poshtëm të ekranit, shifra e objektit njihet, duke ndryshuar numrin e topave të zhavorrit me vlerën e kësaj shifre. Ndërsa Gravecs lëviz nëpër numrin e objektit në ekran, kjo do të rezultojë në një numër më të qartë të objektit dhe një rritje në vlerën shëruese të Gravets. Me intervale të rregullta, ikona e gravitetit ndryshon vlerën e saj nga numrat 0 në 9. Kur lëvizni një shifër objekti, rezultati i shëruesit rritet me shumën që është e barabartë me sasinë e mëparshme të shifrës së objektit dhe numrin e gravitetit. , që është numri Shifrat e gravitetit të lashta objekt-shifra , atëherë shëruesi i varreve do të rritet duke fituar numra. Pas arritjes së pragjeve të mëparshme të pikave, kërkohet një kalim në një nivel më të lartë vlerash, i cili do të çojë në shpejtësi më të madhe të lëvizjes dhe shpejtësi më të madhe të gjenerimit të shifrave të objekteve. Përveç kësaj, nga niveli i 4-të i një zhavorri të mbyllur me një shifër objekti, është e nevojshme jo vetëm të rritet vlera shëruese e zhavorrit, por edhe të ndryshohet (pasi figura e zhavorrit është më e vogël se figura e objekt-shifror). Ndërsa numri i pikëve në lojë bëhet më pak se 0, loja fillon nga fillimi.

Boshti i videos se çfarë doli

Ju mund të përdorni arkivat me skica dhe skedarë nga biblioteka TVOut sipas kërkesës

Unë vetë procesin e krijimit

Krijimi i lojërave të shkëlqyera

Për ngrohje, ne krijojmë objekte për të ruajtur pozicionin e rrjedhës së ngrohjes. Simboli që përfaqëson zhavorrin dhe simbolet që shfaqin objekte numerike shfaqen si informacion teksti, kështu që e gjithë fusha e lojës në rreshta dhe të gjitha lëvizjet e objekteve do të funksionojnë sikur simboli të shfaqet në një fushë të caktuar. Vlerat MAX_X=31 dhe MAX_Y=14 përcaktojnë madhësinë e fushës së lojës bazuar në numrin e dimensioneve horizontale dhe vertikale. Vlera MAX_OBJ=30 tregon numrin maksimal të objekteve me shifra që mund të jenë në fushën e lojës në të njëjtën kohë. Vargu int FIGURA ruan informacione rreth objekteve shifrore që janë aktualisht në fushë:

  • FIGURA[i] – vlera numerike e objektit shifror (0 – objekt bosh);
  • FIGURA[i] - koordinata e saktë x e shifrës së objektit;
  • FIGURA[i] – koordinata e saktë y e objektit shifror.

Për të ruajtur variabla të tjerë që përshkruajnë linjën e prodhimit, ne krijojmë strukturën GAME. Lista e fushave të strukturës:

  • xk – koordinata x(/4) e zhavorrit;
  • yk – koordinata y(/6) e gravitetit;
  • tekCursor – vlera më të sakta për kursorin;
  • blinkCursor – mulli prerës për ndezjen e kursorit;
  • vblink - shpejtësia e ndezjes në vk;
  • vk – butësia e dorezës së zhavorrit – kontrolli i hyrjeve A0, A1;
  • vo_10 – shpejtësia e ndryshimit të numrit të zhavorrit;
  • vo_11 - shpejtësia e paraqitjes së objekteve-shifra;
  • vo_12 - rrjedhshmëria e objektivave shifrorë;
  • count_objects - numri i objekteve-shifra në fushë;
  • niveli – gris raven;
  • topa - numri i topave.

int MAX_X=31; int MAX_Y=14; // struktura e të dhënave të lojës Struktura e lojës // struktura e të dhënave të lojës ( int xk; // x(/4) koordinata e zhavorrit int yk; // y(/6) koordinata e zhavorrit int tekKursor; // vlerat më të sakta të kursorit int blinkCursor; // mulli i filetimit të kursorit int vblink;// shpejtësia e ndezjes në vk gjatë vk; // shpejtësia e lëvizjes së zhavorrit - ri-verifikimi i hyrjeve A0, A1 gjatë vo_10; ( ; // Numri i topave); int MAX_OBJ=30; int FIGURA=((0,0,0),(0,0,0),(0,0,0),(0,0,0),(0,0,0), (0,0,0) ) ),(0,0,0),(0,0,0),(0,0,0),(0,0,0), (0,0,0),(0,0,0) , (0,0,0),(0,0,0),(0,0,0), (0,0,0),(0,0,0),(0,0,0),( 0,0,0),(0,0,0), (0,0,0),(0,0,0),(0,0,0),(0,0,0),(0, 0) ,0), (0,0,0), (0,0,0), (0,0,0), (0,0,0), (0,0,0) );

Shoferi është i pozicionuar pas levës.

Pozicioni i zhavorrit në ekran tregohet nga komandat e levës. Lidhësit e levës janë të lidhur me portat analoge A0, A1 të bordit Arduino. Portat aktivizohen pas një ore, vlerat përcaktohen nga parametri GAME.vk dhe këto të dhëna përpunohen nga funksioni map(), i cili në mënyrë proporcionale transferon vlerat e diapazonit të rrjedhës 0-124 në një të ri. diapazoni (vlerat e gjerësisë dhe lartësisë së ekranit). Pastaj kjo vlerë shndërrohet në koordinata kontakti. Në këtë vend, është e nevojshme të zhvendosni imazhin në simbolin e zhavorrit, duke vendosur simbolin e kapërcimit në pozicionin e përparmë të zhavorrit. Për të shfaqur zhavorrin, shfaqet një simbol ndezës - një numër dhe një hapësirë.

//******************** vendosja e një pozicioni të ri të gravitetit void set_iam() (TV.set_cursor(min(123,GAME1.xk*4),min(84,GAME1 ) .yk*6));TV.print(" "); , 96);GAME1.xk=GAME1.xk/4;GAME1.yk=GAME1.yk/6;GAME1.vblink–;if(GAME1.vblink<0) { GAME1.blinkCursor=1-GAME1.blinkCursor; GAME1.vblink=5+GAME1.blinkCursor*5; } TV.set_cursor(min(123,GAME1.xk*4),min(84,GAME1.yk*6)); if(GAME1.blinkCursor==1) TV.print(GAME1.tekCursor); else TV.print(” “); }

Simboli që përfaqëson zhavorri ndryshon pas një ore, duke përdorur parametrin GAME.vo_10 duke përdorur funksionin set_new_cursor(), ndryshimi kryhet hap pas hapi duke përdorur funksionin shtesë random().

//******************** vendosja e një lloji të ri të simbolit zhavorr void set_new_cursor() ( GAME1.tekCursor=random(0,10); )

Gjenerimi dhe lëvizja e objekteve dixhitale.

Objektet-numrat gjenerohen pas një ore, duke përdorur parametrin GAME.vo11. Thirret funksioni set_new_object(). Informacioni për të gjitha objektet dixhitale ruhet në grupin FIGURA. Programi kërkon indeksin e parë bosh në grup (FIGURA=0) dhe vendos një shifër të re objekti. Vlera dixhitale dhe koordinata horizontale e objektit të ri gjenerohen nga funksioni i rastësishëm dhe koordinata vertikale vendoset në zero. Simboli që përfaqëson objektin e ri numerik shfaqet në ekran.

//******************** Shfaqja e një objekti numër të ri void set_new_object() ( int null_index=0; if(GAME1.count_objects)<>(për(int i=0;i;i++)<>( if(FIGURA[i]==0) (null_indeksi=i;break;) ) FIGURA=random(1,9); FIGURA=të rastësishme(0,MAX_X); FIGURA = 0; // Visnovok në tabelë TV.set_cursor (FIGURA * 4.0); TV.print(FIGURA); GAME1.count_objects++; )

Funksioni i lëvizjes së objekteve-shifra (go_object()) thirret pas një ore, siç përcaktohet nga parametri GAME.vo12. Vizualizatsya Ruhu O'Skikh-Tsifre Vidbuvas, fati i simbolit të pozicionit të parë të O'Skta (shënimi i simbolit të probіl), me regjistrimin e simbolit të O'Skta (koordinata vertikale Di- cyphri zbilshaws të vetmuar). Kur të arrini në fund të ekranit, do të shihni një shifër të re objekti (regjistroni elementin 0 të grupit FIGURA[i]), si dhe një ndryshim në numrin e pikave të zhavorrit.

//******************** objekt-shifror void go_object() ( for(int i=0;i;i++)<>( if(FIGURA[i]>0) ( TV.set_kursori(FIGURA[i]*4,FIGURA[i]*6); TV.print(" "); if(FIGURA[i]))<>( FIGURA[i]++; TV.set_kursori(FIGURA[i]*4,FIGURA[i]*6); TV.print(FIGURA[i]); ) tjetër (TV.tone(294200); change_balls(FIGURA ) [i]*(-1));FIGURA[i]=0;LOJJA1.numërimi i objekteve–; ))))))

Inspektimi i zhavorrit të printuar dhe shifrave objektive.

Kur lëvizni simbolin e gdhendjes në ekran, duhet të kontrolloni gdhendjen me objektet e numrave. Për të cilin përdorim funksionin collision(). Pas futjes së një simboli që përfaqëson zhavorr, kontrollojmë elementet e grupit FIGURA për të parë nëse koordinatat e shifrave të objektit korrespondojnë me koordinatat e simbolit të zhavorrit. Kur koordinatat humbasin, veprimet e mëposhtme mund të kryhen:

  • shifra e objektit gjendet në grupin FIGURA (hyrja 0 në FIGURA[[i]);
  • ndryshon në 1 shërues për numrin e numrave të objekteve (GAME.count_objects)
  • Mjeku mund të ndryshojë numrin e topave të zhavorrit (kliko funksionin change_balls()).

//******************** kontrolloni lidhjen void collision() ( for(int i=0;i;i++)<>( if(FIGURA[i]>0) ( if(FIGURA[i]==GAME1.xk && FIGURA[i]==GAME1.yk) ( TV.tone(740,200); if(FIGURA[i]==LOJRA1 ) .tekCursor) change_balls(GAME1.tekCursor*GAME1.tekCursor), përndryshe if(FIGURA[i]>GAME1.tekCursor && GAME1.nivel>3) change_balls(FIGURA[i]*(-1));ndryshe change_balls(FIGURA [i]+GAME1.tekCursor);FIGURA[i]=0;LOJËRI1.count_objects–; ) ) )

Funksioni i ndryshimit të numrit të topave në varr (change_balls()) e kalon numrin si argument për të rritur (ndryshuar) numrin e topave në varr. Ky numër është i ngjashëm me shumën e shifrave të objektit dhe numrave të zhavorrit. Nëse një shifër është një shifër më e vjetër e një objekti shifror, atëherë transmetohet vlera që është më e vjetër se shtimi i shifrave. Për të rritur palosshmërinë e nivelit të 4-të të zhavorrit të mbyllur me numrin e objektit, jo vetëm rrisni trajtimin e zhavorrit, por më pas ndryshoni atë (pasi figura e zhavorrit është më e vogël se shifra e numrit të objektit) .

Mjek zhavorri.

Funksioni change_balls() ndryshon shëruesin e topave të varrit me vlerën e argumentit të hyrjes. Sapo numri i pikëve shërues bëhet më pak se 0, loja përfundon, ekrani pastrohet dhe loja fillon. Përveç kësaj, kur shëruesi të arrijë nivelin e këngës, loja do të kalojë në një nivel të ri, më të lartë. Vlera e vendosur e nivelit të ri përcaktohet nga funksioni new_level().

//******************** ndryshoni pikët e grumbulluara void change_balls(int top) ( GAME1.balls=GAME1.balls+top; if(GAME1.balls<0) start_game(); if(GAME1.balls>(LOJËRI1.niveli+1)*100) niveli i ri(LOJËR1.niveli); set_data_tablo(); )

Kalimi i një niveli të ri.

Kur kaloni në një nivel të ri, instalohen vlera të reja për shpejtësinë e gjenerimit dhe shpejtësinë e lëvizjes së objekteve dixhitale. Që në fillim, ishte e nevojshme të ndryshoni vlerat e shpejtësisë së ndryshimit të numrave të zhavorrit, shpejtësisë së dorës së zhavorrit dhe gjatë testimit të lojës, në varësi të cilit dikush është i bindur. Vlerat e vendosura të ndryshimeve për nivelin e ri përcaktohen nga funksioni new_level()

//******************** ndryshimi i nivelit gree void new_level(int tek_level) (GAME1.level++; GAME1.vo_10=5000; GAME1.vo_11=2000-(GAME1.level -1)*100;LOJËR1.vo_12=1000-(LOJËRI1.niveli-1)*100;

Imazhet e këtyre të dhënave shfaqen në tabelën e rezultateve.

Tabela e të dhënave ndodhet në fund të ekranit. Këtu mund të shihni numrin e pikëve të grumbulluara dhe sasinë e lojërave të luajtura. Kur ndryshoni shëruesin e rezultateve, thirret funksioni set_data_tablo(), i cili ndryshon vlerën e numrit të pikëve të mbledhura dhe nivelin e lojës në strukturat e ndryshueshme GAME dhe në tabelën e rezultateve.

//******************** shfaqja e të dhënave në tabelën e rezultateve void set_data_tablo() (TV.print(20,91," balls="); TV.print(70, 91 "," niveli = "); TV.print(48.91,GAME1.topa); TV.print(98.91,LOJË1.niveli);

Mbështetja e zërit gri.

Për dizajnimin e zërit, përdorni funksionin e tonit (frekuenca, kohëzgjatja) e bibliotekës TVOut. Kur numri i objektit arrin fundin e fushës së lojës - TV.tone(294,200) (funksioni go_object()), kur zhavorri i numrit të objektit është i mbyllur - TV.tone(740,200) (përplasja e funksionit()). Nëse dëshironi të futni në projekt një fragment nga krijimi i njëpasnjëshëm i disa notave, pasi të keni shfaqur notën e lëkurës me komandën tone (frekuenca, kohëzgjatja), duhet të futni komandën delay() me një vonesë prej të paktën tre nivelesh, parametri më i ulët i kohëzgjatjes, 6 – dalja përfundimtare Yenya dhe dy ale z pauzë.

TV.tone(294200); TV.vonesa(400); TV.ton (740,200);

Cikli kryesor i gris.

Cikli kryesor i programit formohet nga thirrja e funksioneve që kemi parë set_iam(), collision(), go_object(), set_new_object(), set_new_cursor() pas një intervali prej një ore instalimi në GAME.vk vijues , GAME.vo_10, GAME.vo_11, GAME.vo_12.

int game1() ( ndërsa (LOJËRI1.topa>0 && LOJË1.niveli<6) { long time2=millis(); if(time2-time11>GAME1.vk) (set_iam (); përplasje (); time11=time2; ) if(time2-time12>GAME1.vo_12) (go_object();time12=time2;) if(time2-time13>GAME1.vo_11) (cakto_objekt_i_ri ();time13=koha2;) if(time2-time14>LOJRA1.vo_10) (vendos_kursorin_i ri();koha14=koha2;) TV.korniza_vonesore(10); ) if(LOJRA1.topa<0) return 0; else if(GAME1.level>5) kthimi 0; tjetër kthimi 1; )

Shtimi i një menuje për zgjedhjen e igors.

Një menu është shtuar në skicë për shfaqjen e tre lojërave që mund t'i shtoni vetë.

void loop() ( switch(menu(pmenu)) ( case 1: start_game(); while(game1()>0); break; default: break; ) ) //**** menyja për zgjedhjen e menusë int të lojës (int poz) (TV.clear_screen(); pmenu=max(poz,1); int pmenu1=pmenu; TV.println(60,30,"Lojë 1"); TV.println(60,50,"Loja 2 ″); TV.println(60,70,”Lojë 3″); TV.draw_rect(50,5+20*pmenu,40,10,BARDHË,INVERT); )== ULËT) ( if(analogLeximi(A1) )<100) pmenu=max(pmenu-1,1); else if(analogRead(A1)>900) pmenu = min (pmenu + 1.3); tjetër; if(pmenu1!=pmenu) (TV.vonesa(500); TV.draw_rect(50.5+20*pmenu1,40,10,BLACK,INVERT); TV.draw_rect(50.5+20*pmenu,40, 10, BARDH, INVERT);pmenu1 = pmenu;))) kthye pmenu; )

Përshëndetje, Geek Times!
Sot do t'ju tregoj një histori jo aq të mirë se si krijova një tastierë të thjeshtë lojërash bazuar në Arduino dhe krijova një lojë komplekse për të në motorin tim të preferuar të lojës Unity.

Luaj

Kohët e fundit kam filluar të zhvilloj lojëra në motorin popullor të lojërave Unity (dikur Unity3D). Në vetëm një orë, arrita të bëj një sërë projektesh të vogla për pajisjet mobile, si dhe një sasi të madhe sigurimi për një projekt në shkallë të gjerë.
Kjo zonë është më pak e dobishme dhe sjell kënaqësi të madhe për të punuar në të.

Pajisja

Megjithatë, ndihem i detyruar të provoj diçka të re dhe një ditë vendosa të provoj arduino.
U interesova shumë se si t'i krijoj pajisjet e mia të energjisë dhe si t'i programoj ato. Pse arduino? Ka shumë postime në internet për ata që duan të përdorin Arduino. Më lejoni të them vetëm se për mua faktori më i rëndësishëm në zgjedhjen e një arduino është thjeshtësia e zgjedhjes.

Si mund ta ha këtë?

Pasi u futa në internet, gjeta një postim se si një nga zhvilluesit mblodhi konsolën e tij të thjeshtë të lojërave të bazuar në Arduino, i dha asaj një ekran të vogël 84x48 piksel dhe shkroi disa lojëra të thjeshta në të: Pong dhe Arkanoid. .
Kjo teknologji nuk më tërhoqi vërtet dhe vendosa të krijoj versionin tim të një konsole loje bazuar në mikrokontrolluesin atmega328.

Vetë tastiera

Para së gjithash, unë projektova dhe prodhova nga LUT një tabelë për një tastierë portative. Kjo ishte për të ardhur keq - që në fillim ishte e nevojshme të protestohej programi në bordin e pajisjes, për shembull, arduino uno, sepse nuk e transferova aftësinë e rrëshqitësit dhe nuk e ngarkova manualisht programin në kontrollues. Dhe gjithashtu pata mëshirë për vetë qarkun, ishte e mundur të korrigjoheshin telat, por do të ishte akoma i mbyllur.
Pasi kuptova që kisha mëshirë, lidha butonat përmes tabelës arduino uno dhe lidha direkt ekranin.
Boshti:



Dhe tani tek igori

Për të krijuar lojën, përdora motorin e lojës Unity. Unë nuk shkrova një përpilues nga Mono C# në një program për Arduino, por vendosa të shkruaj një grup skriptesh, të cilat mund të përdoren për të zgjedhur me lehtësi lojëra.
I ndava të gjitha skriptet në 3 grupe - dii, umovi dhe kombinues.
Mendoj se nuk ka nevojë të shpjegoj rëndësinë e veprimeve dhe mendjeve, por do të shpjegoj boshtin për të cilin nevojitet operatori i kombinatit. Operatori i kombinatit kontrollon idenë përfundimtare dhe më pas finalizon idenë.
Nga këto skripta, ose më saktë nga prania dhe kombinimi i tyre, algoritmi krijon një program për arduino.

Çfarë është kjo lojë?

Fillova të mendoj për diçka të thjeshtë. Cila është loja më e thjeshtë, a e dini? Kjo është e drejtë - pong. Por vendosa të luaj jo vetëm Pong, por Pong për një - një raketë, një top dhe një mur, në vend të një rakete tjetër.
E mora nga konstruktori i shkruar dhe e përpilova nga kontrolluesi. Pratsyuє!

Dhe tani le të vendosim gjithçka në rregull

Pasi loja filloi dhe unë e luajta, vendosa se ishte koha për të ripunuar tabelën, për t'i dhënë një pamje të keqe, për të hequr përbërësit SMD dhe për të marrë të gjithë skedarët. Rindërtova qarkun dhe bëra tabelën.
Boshti



fundjavave

Kodi i daljes është shumë i thjeshtë.
Çfarë duhet përdorur Unity - nga redaktori, zhvilluesi mbledh një grup objektesh UI, bashkëngjit skriptet e veprimit, mendjet dhe kombinuesit me to.
Ajo që duhet të bëni është të ekzekutoni përpiluesin (skripti parser.cs) - ai kalon nëpër të gjitha objektet, shikon skriptet e tyre dhe shton copa kodi në tekstin e skedarit build.ino, të cilat tregojnë se analogët e këtyre skripteve janë gjeneruar nga mikrokontrolluesi.

Mesazh i fundjavës - drive.google.com/open?id=0B5INc3_98cSJMEMxZmlWUTh1Ukk
Kompilimi dështon kur fillon loja. Ruhet në dosjen Assets/build/text/built.ino
Kjo skicë duhet të ngarkohet në kontrollues.

Në gjendje të vyshkur

Dua të them se kjo është edhe më e ftohtë.
Kam humbur mundësinë për të marrë dy nga argëtimet e mia - zhvillimin e lojërave dhe krijimin e pajisjeve.
Shpresoj se jeni fiksuar dhe tani mund të merrni pajisjen tuaj të lezetshme =)

Konsola e lojërave Arduino? E vertete e vertete. Pas ekranit, butona dhe lojëra. Dhe kjo nuk është një fantazi. Ka një sërë projektesh që jemi përpjekur t'i zhvillojmë dhe zbatojmë vetë një prej tyre (Gamebuino).

Meqenëse projekti është i hapur, e gjithë skema është e disponueshme në Wiki, si dhe dërgohet në PP, lojëra dhe informacione të tjera të dobishme.

Për të krijuar konsolën tonë të lojës, na duhen komponentë të lirë - një ekran Nokia 5110, gjashtë butona dhe një altoparlant. Gjithçka është e lehtë për t'u gjetur në Aliexpress ose faqe të tjera të dyqaneve kineze (problemi më i rëndësishëm është gjetja e ekranit) dhe në Rusi. Ekrani mund të quhet "masiv" dhe përshkruhet mirë, kështu që lidhja e tij gjithashtu nuk është problematike, pasi nuk mjafton.

Meqenëse Gamebuino lidhet manualisht për të vendosur elementë në tabelë, kur përpiqemi të lidhim elementë përmes kunjave standarde të Arduino, marrim foton e mëposhtme:

Në fakt, disa nga elementët tashmë janë "shpërdorur", sepse Gamebuino përdor kontaktet e mikroprocesorit që nuk janë të lidhura me tela në Arduino ose thjesht nuk janë të nevojshme. Sensori i ngarkimit të baterisë, butoni C dhe karta SD (nuk ka ndërveprim) dhe sensori i dritës së ambientit shkoi në "skrap". Është gjithashtu e mundur të përdorni rezistorë - ne nuk do të vikorizojmë ekranin në modalitetin 24/7 dhe ju mund të bëni pa asnjë mbrojtje.

Do të ishte e mundur ta krijoja atë "bukur", por më pas do të më duhej të korrigjoja kodin e bibliotekave ekzistuese dhe të "ndryshoja" kontaktet për një skemë të re. Do të doja t'i përmbahesha kozmetikës - të përdor kontakte "standarde" ose të bëj modifikime të vogla në kod nëse është e nevojshme.

Gjithashtu, pas krijimit të qarqeve, duhet të instaloni Arduino IDE dhe të instaloni boshtin e arkivit. Duhet ta zbërtheni në direktorinë Documents/Arduino dhe më pas të hapni Arduino IDE. Në këtë arkiv, tashmë janë bërë ndryshime në kodin e bibliotekës dhe jashtë kutisë që funksionojnë me këtë skemë.

Ju mund të keni një mjet Gamebuino që do t'ju lejojë të kontrolloni ekranin, butonat, etj. Dhe pastaj nisni Pong. Për të paguar, provoni Arduino UNO ose Leonardo standarde (nuk i keni testuar ende të tjerët).

Nëse keni gjithçka në rregull, ajo rrëzohet dhe bie. Faji është ushqimi i rregullt - ku janë lojërat? Gamebuino përdor mjetin e vet për të punuar me karta SD, kështu që është e pamundur të importosh HEX përmes ngarkuesit të tij pa ndezur vetë Arduino. Nëse e bëni këtë, atëherë për shkak të mungesës së sinjalit nga bateria, nuk do të mund të filloni asgjë, pasi firmware do të leh dhe do të korruptohet. HEX i parapërpiluar me lojëra gjithashtu nuk do të funksionojë për shkak të problemeve me sensorin e ngarkimit të baterisë.

Por jo gjithçka është e humbur - mund të shkarkoni kodet e daljes, t'i hapni ato në Arduino IDE dhe t'i "ngarkoni" në tastierën tonë.

Kam kontrolluar një pjesë të erës dhe erës... PRAKTIKO! Ju mund t'i shkarkoni arkivat me kodet e daljes dhe t'i shkarkoni, t'i hapni ato në Arduino IDE dhe t'i përpiloni dhe shkarkoni vetë. Ju mund të provoni vetë lojëra të tjera duke shkarkuar kodet e daljes nga Gamebuino Wiki.

Ozhe - misia vikonan! Ne morëm një tastierë lojërash në miniaturë. Tani detyra jonë është të fitojmë para në celular :) Dhe le të përpiqemi të fitojmë para nga artikujt e ardhshëm.

Dhe kështu, miqtë e mi, meqenëse tashmë keni një çantë dizajni Arduino UNO R3 (komplet fillestar) ose jeni mërzitur, nga pikëpamja teknike - jini të sjellshëm. Ne kemi një seri të tërë "mësimesh" për Arduino. Do të doja t'ju tregoja se çfarë mund të bëhet në këtë grup, jo gjithçka, por ndoshta gjithçka që do të përdoret ose jo. Konsola e lojërave, mirë, përdorni levë për të luajtur ping-pong dhe të ngjashme. Kush humbi një kompjuter të vjetër me një levë të vjetër, tani nuk funksionon, e gjithë logjika që kalon Kompleti Arduino(http://arduinokit.ru/).

Pse e shqetësoni projektin?

Krijova një tastierë të thjeshtë lojërash që mund të luajë ping-pong dhe lojëra të tjera, si në një kompjuter të vjetër Atari 2600 që mund të përdorë lehtësisht një Arduino R3. Arduino, pasi është bërë një kompjuter i vjetër, lexon hyrjet dhe daljet e të dhënave nga leva e lidhur me televizorin përmes bibliotekës standarde TVout (Për Arduino). E krijova këtë projekt vetëm për të demonstruar se kushdo (pa aftësi të veçanta) mund të krijojë konsolat dhe lojërat e veta në miniaturë. Unë gjithashtu dua që të gjithë ata që lexojnë këtë artikull të jenë në gjendje të përfitojnë nga ky gëzim absolutisht pa dëm.

Çfarë kërkohet për një tastierë lojërash Arduino?

5. Tani, për të luajtur ping pong, na duhet vetëm një lidhës me 4 pin: Përpara (1), Prapa (2), Butoni (6) dhe Tokë (8). Dhe për levën e dytë, na duhen vetëm kontaktet 1, 2 dhe 8 (butoni "kokë" përdoret vetëm për të "filluar një lojë" nën emrin e Administratorit, kështu që vetëm 1 buton përdoret për butonin e nënës).

6. Nëse vëreni kontaktet në anë, kam lidhur 4 lidhje me tela të thjeshtë që shkojnë në Arduino (“Përpara” në pinin 2, “Back” në pinin 3 dhe “Control” në pinin 4). Provova të njëjtën gjë për 3 kontaktet e tjera për Gravity 2 (në levë tjetër): "Përpara" në kontaktin 7 dhe "Prapa" në kontaktin 10). Mos harroni të lidhni levërat Kontakt 8 me tokën (ekrani po pikon)!

7. Tani, aktivizoni grupin e ping-pongut dhe kontrolloni hyrjet e levës. Fusni Arduino UNO R3 dhe të gjitha pjesët në prizat e kërkuara (kam hakuar shtresën e jashtme të hard drive-it të vjetër).

Meqenëse për herë të parë u përpoqa të punoja vetë në këtë projekt, u shqetësova edhe më shumë për fillimin e punës në këtë projekt. Fuf nuk ishte e lehtë, duke dashur ta përfundoja këtë projekt sa më shpejt. Problemi im kryesor për momentin është se po përpiqem të zbatoj levë të vjetër nga Atari në Arduino. Nëpërmjet këtij veprimi, blogerët e internetit shkruan gabimisht në forumet e tyre, duke thënë se ishte e pamundur të lexohej hyrja ose të ngjitej në mes të levës, ndërsa ata po argëtoheshin duke vikorizuar kontrollorët e tyre standardë, duke ardhur në thirrjen e tyre, ndjeva një erë. rrepa dhe një defekt më pas dëgjuan një mesazh në adresën tuaj, duke thënë: "Duart e mia nuk mund të rriten", sepse nuk mund të mbaj një saldator në duart e mia. Prote projekti im po funksionon! A jeni i dobët?

PS: Mendoj se e vetmja gjë është se tani do të dukesha ndryshe - hmm. Epo, për shembull, pasi keni blerë një fishek nga Sega ose Dendi dhe keni krijuar çdo lloj lexuesi kartash. Aksi për ju dhe konsolën e lojërave televizive mundësohet me dorë. Golovnya, se projekti im i shkallëzimit, ju mund të punoni jo vetëm me robotë fluturues, por edhe me konsolat e lojërave me duart tuaja. Përpara se të flasin, miqtë tanë kanë komponentë të ndryshëm për Arduino UNO R3 (Arduino Design Kit). Çfarëdo që dëshironi, mund të fitoni gjithçka me duart tuaja. po e bëj!

Në dritën e ditës dhe më pas në gjumë, më lindi ideja për të krijuar një set-top box të kontrolluar me energji elektrike. Vlasna, këtu më shfaqet bota e pasur dhe intensive e radioteknologjisë. Meqenëse më parë nuk kisha qenë në gjendje të përballoja prishjen serioze të elektronikës, zgjedhja ime u bazua në një opsion më të thjeshtë - Arduino Ky është modeli më i gjerë - Uno.

Plani i robotëve

1. Kontaktoni bibliotekën
2. Saldoni tabelën e daljes së videos
3. Shkruani kodin
4. Trupi Virizati

Magazina e jashtme përfundimtare nuk është veçanërisht e rëndësishme në lidhje me projekte të tilla.

Mësimi 1. Le të kuptojmë se çfarë po ndodh

Pas disa dhjetëra eksperimentesh të hollësishme, nuk mund të kuptoja se si të krijoja një parashtesë si Dandy. Epo, çfarë ka për t'u mërzitur, nëse e merr, çoje deri në fund.

Në faqen e dedikuar për projektet në Arduino, radioelektronika në përgjithësi (jo reklama) përmban një artikull në lidhje me një zhvillim të ngjashëm. U vendos që të zgjidhej biblioteka TVout, fragmente të kutisë së televizorit. Për të instaluar këtë robot, më duhej të bëja një shamanizëm të vogël.

Funksionet thelbësore të bibliotekës

Funksionet e vendosjes së modalitetit

Funksioni fillo () Përfundon daljen e sinjalit video (madhësia e veçantë e ekranit 128x96).
Sintaksë:
TVOut.begin(mode);
TVOut.begin(mode, x, y);

Parametrat:
modaliteti - standardi i sinjalit video:
_PAL – modaliteti PAL;
_NTSC – Modaliteti NTSC.
Do të thotë që rrotullohet:
0 - për një lidhje në distancë, 4 - për një dështim (memorie të pamjaftueshme për buferin e daljes).

Funksionet e grilave

Funksioni vonesë () Kjo do të ngrijë imazhin e shfaqur.
Sintaksë:

TVOut.vonesa(ms);
Parametrat:

ms – ms prerje me saktësi: 20 ms për PAL dhe 16 ms për NTSC.

Funksioni delay_frame() ngrin imazhin e shfaqur.
Sintaksë:

TVOut.delay_frame(korniza);
Parametrat:

korniza - numri i kornizave për turbullim.
Funksioni është i dobishëm për minimizimin ose tkurrjen e ekranit, duke klikuar në ekranin më të fundit.

Opsionet për zgjedhjen e parametrave

Funksioni hres () rrotullon seksionin horizontal të ekranit.
Sintaksë:

TVOut.hrs();
Parametrat:

nr.
Do të thotë që rrotullohet:

char i panënshkruar – madhësia e ekranit e ndarë horizontalisht.

Funksioni vres() rrotullon aspektin vertikal të ekranit.
Sintaksë:

TVOut.vres();
Parametrat:

nr.
Do të thotë që rrotullohet:

char i panënshkruar – ndarja vertikale e ekranit.

Funksioni char_line () rrotullon numrin maksimal të mundshëm të karaktereve në një rresht gjatë shfaqjes së informacionit të tekstit.
Sintaksë:

TVOut. char_line();
Parametrat:

nr.
Do të thotë që rrotullohet:

char i panënshkruar – numri i karaktereve.

Funksionet bazë grafike

Funksioni set_pixel() vendos ngjyrën e pikselit të ekranit në pikën në koordinatat e specifikuara.
Sintaksë:

TVOut.set_pixel(x,y,ngjyra);
Parametrat:

x, y – koordinatat e pikselit;
ngjyra - ngjyra e pikselit:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni get_pixel() merr ngjyrën e pikselit të ekranit nga një pikë në koordinatat e specifikuara.
Sintaksë:

TVOut.get_pixel(x,y);
Parametrat:

x, y – koordinatat e pikselit.
Do të thotë që rrotullohet:

ngjyra - ngjyra e pikselit:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni fill() mbush ekranin me ngjyrën e specifikuar.
Sintaksë:

TVOut.fill(ngjyra);
Parametrat:

ngjyra - ngjyra e mbushjes:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni qartë_ekrani () fshin ekranin, duke e rivendosur atë me ngjyrën e specifikuar.
Sintaksë:

TVOut.ekrani_e qartë (ngjyra);
Parametrat:

ngjyra - ngjyra e mbushjes:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.

Funksioni përmbys () Përmbys ekranin.
Sintaksë:

TVOut.invert();
Parametrat:

nr.
Funksioni shift_direction() shkatërron ekranin.
Sintaksë:

TVOut.shift_direction(distanca, drejtimi);
Parametrat:

distancë – ngrihuni për të marrë ekranin në vend të ekranit.
drejtim - direkt në zsuwu:
UP = 0 - përpjetë;
DOWN = 1 - poshtë;
LEFT = 2 - majtas;
Djathtas = 3 - me dorën e djathtë.

Funksioni viza_line () lidh dy pika në ekran.
Sintaksë:

TVOut.draw_line (x0,y0,x1,y1,ngjyra);
Parametrat:

x0, y0 – koordinatat e pikës së parë;
x1, y1 – koordinatat e një pike tjetër;
ngjyra - ngjyra e mbushjes:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni vizatoni_rreshtin() mbush rreshtin me ngjyrën e caktuar midis dy pikave të rreshtit.
Sintaksë:

TVOut.draw_row (rresht,x0,x1,ngjyra);
Parametrat:

rresht - koordinata vertikale e rreshtit;
x1,x2 – koordinatat horizontale të pikave të rreshtave;
ngjyra - ngjyra e mbushjes:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni draw_column() mbush rreshtin me ngjyrën e specifikuar midis dy pikave të kolonës.
Sintaksë:

TVOut.draw_column(kolona,y0,y1,ngjyra);
Parametrat:

kolona – koordinata horizontale e kolonës;
y1, y2 – koordinatat vertikale të pikave të fillimit;
ngjyra - ngjyra e mbushjes:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni vizato_rect() pikturon një bimë ortokutane në ekran.
Sintaksë:

TVOut.draw_rect(x,y,w,h,ngjyra);
TVOut.draw_rect(x,y,w,h,color,fillcolor);

Parametrat:

x,y - koordinatat e pikës së sipërme të majtë;
w,h - gjerësia dhe lartësia e bimës ortokutane që lyhet;
ngjyra - ngjyra midis sepjeve të drejta:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
fillcolor - ngjyra e mbulesës së barit:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni vizatoni_rrethin() pikturon në ekran.
Sintaksë:

TVOut.draw_circle(x,y,r,ngjyra);
TVOut.draw_circle(x,y,r,color,fillcolor);

Parametrat:

x,y - koordinon në qendër të kunjit;
r – rrezja e kunjit;
ngjyra - ngjyra midis kolonave:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
fillcolor - ngjyra e mbushjes:
0 - e zezë;
1 - e bardhë;
2 - ngjyra e përmbysur.
Funksioni bitmap () Shfaqni një imazh raster në ekran.
Sintaksë:

TVOut.bitmap(x,y,bmp,w,h);
Parametrat:

x,y – koordinatat e këndit të sipërm të majtë të pikës së shikimit;
bmp – tregues i grupit të memories ku ruhet fotografia;
w,h - gjerësia, lartësia e imazhit që do të shfaqet;
Më poshtë do të shikojmë procesin e krijimit të kodit për krijimin e imazheve raster.

Funksionet për shfaqjen e informacionit të tekstit

Për të aktivizuar funksionin e shfaqjes së informacionit të tekstit, duhet të lidhni skedarët me skedarët ose fontet e përfshira në bibliotekë. Për t'u lidhur me grupin e shkronjave të klientit, duhet të përfshini skedarin e kokës në skica:
#përfshi
Kompletet e mëposhtme të shkronjave janë të përfshira në depon e bibliotekës:

font4x6;
font6x8;
font8x8;
font8x8ext.
Funksioni select_font() zgjedh një font për shfaqjen e informacionit të tekstit.
Sintaksë:

TVOut.select_font(font);
Parametrat:

font – font, i lidhur me skicën.

Funksioni print_char() shfaq një karakter në ekran.
Sintaksë:

TVOut.print_char(x,y,char);
Parametrat:

x,y – pozicioni në ekran i simbolit;
char – karakter nga fonti aktual.

Funksioni set_kursor() cakton pozicionin e kursorit për shfaqjen e informacionit të tekstit në ekran.
Sintaksë:

TVOut.set_kursor(x,y);
Parametrat:

x, y – koordinatat e kursorit.
Funksioni print () Shfaqni një rresht në ekran, një simbol të numrave chi.
Sintaksë:

TVOut.print(x,y,string);
TVOut.print(x,y,char,bazë);
TVOut.print(x,y,int,bazë).

Parametrat:

x, y – koordinatat e kursorit.
bazë - formati i shfaqjes:
BYTE = 0;
DEC = 10 (e parazgjedhur);
HEX = 16.

Funksioni println () shfaqni në ekran një rresht, një simbol ose një numër dhe në fund një simbol për transferimin e një rreshti:
Sintaksë:

TVOut.println(x,y,string);
TVOut.println(x,y,char,bazë);
TVOut.println(x,y,int,bazë).

Parametrat:

x, y – koordinatat e kursorit.
bazë - formati i shfaqjes:
BYTE = 0;
DEC = 10 (e parazgjedhur);
HEX = 16.

Funksionet e daljes audio

Funksionet e daljes së zërit lejojnë që një sinjal i frekuencës së këngës të dërgohet në televizor nëpërmjet daljes audio.
Funksioni toni () sheh një sinjal audio të frekuencës së këngës.
Sintaksë:

TVOut.tone (frekuenca, kohëzgjatja);
TVOut.ton (frekuencë).

Parametrat:

frekuenca - frekuenca e sinjalit audio;
kohëzgjatja - kohëzgjatja e sinjalit.
Funksioni noTone () cakton daljen e një sinjali audio.
Sintaksë:

TVOut.noTone().

Croc 2. Bazat video saldimi

Para së gjithash, ne duhet ta bashkojmë këtë tabelë për të nxjerrë sinjalin video përmes daljes së përbërë AV (RCA). Le të ndjekim diagramin e hapave:


Ne lidhim dy rezistorë me një vlerë nominale 470 ohms dhe 1 kohm paralelisht, njëra me tjetrën dhe bashkojmë "plusin" me to përmes një kabllo tulipani. Më pas, ne do të lidhim rezistencën me telin e 470-të të pinit Arduino, sepse Kjo tregon që videoja u shfaq ( video), dhe nga rezistenca në një kemi një tel në pinin e nëntë, pasi kjo tregon sinkronizimin ( sinkronizoj). Dhe minus kabllon e tulipanit në tokë në Arduino. Më shumë detaje ( anglisht)

Krok 3. Shkruaj kodin (gru)

Unë nuk do të shpjegoj se çfarë të përfshij, apo informacionin e nevojshëm, i cili mund të gjendet gjithmonë në internet. Unë do të përshkruaj ato që është e vështirë të dihet se çfarë mungon.

Le të fillojmë me Ekrani Vitannaya kudi pa nyogo. Por këtu ushqimi është më i rëndësishëm, si mund ta quash këtë mrekulli? I shpërndava njollat ​​dhe dola me - Shimo. Tingëllon keq, tingëllon teknologjik, tingëllon kinezisht, tingëllon keq, por nuk ka rëndësi.

Le të fillojmë. Vizatoni një vijë në mes të ekranit për ndihmë TV.barazim_line(60,0,60,96,1);. Çanta shfaqet pikërisht në qendër të ekranit. Le të shkruajmë funksionin yogo rukh lëvizja e topit të zbrazët (int vel, int kënd). Instaloni për ndihmë TV.set_piksel(x,y,1);, i kam quajtur kështu.

Më tej, përpara se të manipuloni çantën, është e nevojshme të përditësoni ekranin, ose më saktë, në mënyrë që çanta të mos "qëndrojë" në ekran, atëherë kur kaloni në pozicionin sulmues, duhet të mbushni pjesën e përparme me të zezë. Për të cilat duhet të shkruajmë përpara vendimit TV.set_piksel(x,y,0);. Pas të gjitha ndryshimeve në koordinatat, është e nevojshme të regjistrohen pozicionet e krijuara tashmë dhe një shënim i vogël - TV.vonesa(50);. Kështu mund të futni përafërsisht:

Lëvizja e zbrazët e topit (int vel, int kënd) (TV.set_pixel(x,y,0); //Manipulimi i koordinatave TV.set_pixel(x,y,1); )

Tani për ndryshimin e koordinatave. Usyogo në të gjitha drejtimet (1-8), ndryshim kënd int. Dhe këtu është tashmë e thjeshtë, me kujdes para se ta kthejmë, heqim ose i shtojmë ndryshimit çdo pjesë të saj shpejtësia int. Unë e bëra kështu:

Nëse(këndi == 1) ( y -= vel; ) nëse (këndi == 3) ( x += vel; ) nëse (këndi == 5) ( y += vel; ) nëse (këndi == 7) ( x -= vel; ) if(kënd == 2) (x += rrumbullakët (vel/2); y -= rrumbullakët (vel/2); 2);y += rrumbullakët (vel/2); ) if(kënd == 6) ( x -= rrumbullakët (vel / 2); y += rrumbullakët (vel / 2); ( x - = rrumbullakët (vel / 2); y - = rrumbullakët (vel / 2); )

Tani raketat po përplasen. Është e rëndësishme të sqarohet këtu - unë jam një vikorist pa koordinata y, pra si janë pozicionet e raketave? x mos ndrysho. Le të përshkruajmë funksionin tjetër void racketsmove(). Më pas lyejmë raketat, i ndryshojmë int yb1, int yb2, TV.barazim_line(10, yb1+8, 10, yb1-8, 1);і TV.barazim_line(110, yb2+8, 110, yb2-8, 1);. Përditësimi i ekranit, në mënyrë që "pa gjurmë", është i ngjashëm me daljen nga çanta.

Për të kontrolluar raketat, ndiqni butonat. Lidhni butonat, kunjat 2 і 3 - raketa e parë, 4 і 5 - Një tjetër raketë. Kontrollojmë presionin e butonave dhe ndryshojmë koordinatat.

Boshti është funksioni i mëposhtëm:

Void racketsmove() ( TV.draw_line (10, yb1+8, 10, yb1-8, 0); TV.draw_line (110, yb2+8, 110, yb2-8, 0); if((yb1 - 8) > 1) ( nëse (lexo dixhitale (2) == LARTË) ( yb1 -= 2;) ) nëse ((yb1 + 8)< 95) { if(digitalRead(3) == HIGH) {yb1 += 2;} } if((yb2 - 8) >1) ( nëse (lexo dixhitale (4) == I LARTË) (yb2 -= 2; ) ) nëse ((yb2 + 8)< 95) { if(digitalRead(5) == HIGH) {yb2 += 2;} } TV.draw_line(10, yb1+8, 10, yb1-8, 1); TV.draw_line(110, yb2+8, 110, yb2-8, 1); }

Do të kthehem tani top. Tani le të shkruajmë madhësinë e timonit dhe vendosjen e raketave dhe mureve. Funksioni - void ballcol(). Për të cilat thjesht kontrollojmë vendndodhjen e objekteve, dhe më pas vendndodhjen. Pastaj kjo prerje ndryshohet në një tjetër. Është e lehtë të kuptosh se kush është.

Këtu është imazhi i qytetit antik, ku bie

Ju mund të krijoni disa truke fizike për zonat e këndimit të raketave.

Void ballcol() ( if(x == 1 || x == 119 || (x == 10 && y< (yb1 + 3) && y > < (yb2 + 3) && y > < (yb1 - 3) && y >(yb1 - 8)) ( a = 2; ) nëse (x == 10 && y > (yb1 + 3) && y< (yb1 + 8)) { a = 4; } if(x == 110 && y < (yb2 - 3) && y >(yb2 - 8)) ( a = 8; ) nëse (x == 110 && y > (yb2 + 3) && y< (yb2 + 8)) { a = 6; } if(y == 95 || y == 1) { if(a==1){a=5;}else if(a==2){a=4;}else if(a==3){a=7;}else if(a==4){a=2;}else if(a==5){a=1;}else if(a==6){a=8;}else if(a==7){a=3;}else if(a==8){a=6;} } }

Sa më shpejt të jetë e mundur, ju mund të vdisni me sukses.

Për momentin, ne nuk mund të krijojmë vetëm sistemin për mbajtjen e rezultatit, kohëmatësin dhe rinisjen.

Le të përfundojmë me kohëmatësin. Ndrysho sekonda noton ts(kjo kursen absolutisht gjithë orën), minna int tm(numri i kokrrave nga i cili heqim ts). Vendos vlerën tm operacion tm = ts/60;. І vlerat shfaqen në ekran, TV.print(81,1,tm); TV.print(97,1""); TV.print(100,1,int(ts-(tm*60)));.

Prodovzhimo. Funksioni i rinisjes thirret rinisja e pavlefshme (). Këtu i kthejmë kuptimet e vrazhda të ndryshimeve.

Rinisja e pavlefshme() ( TV.clear_screen(); x = 60; y = 48; yb1 = 48; yb2 = 48; a = 8; ts = 900.0; c1 = 0; c2 = 0; )

Finalja, sistemi i pikëve të shpërblimit, është kaq i thjeshtë. Ne hapim Google dhe shkruajmë "Rregullat e pingpongut". Pyes veten se për çfarë pikë jepen. Ne dimë pak për penalltitë, dhe më pas e dimë me sukses: "Një pikë shënohet nëse kundërshtari nuk është në gjendje të godasë topin saktë pas kërcimit të parë." Ushqimi po piqet, si t'i ringjallim goditjet?.. Dhe goditjet nuk kanë nevojë të ringjallen, edhe ping-pong-u ynë me grafikë dydimensionale.

Ne e dimë daljen nga situata dhe, si gjithmonë, thjesht kontrollojmë koordinatat e mureve anësore. Sapo ka një boshllëk, atëherë synojmë të shënojmë fundin e fushës. Funksioni - numërimi i topave të pavlefshëm (). Kur të dalë kohëmatësi, ne do të barazojmë bilancin e varruesit të parë (ndryshim int c1) ai i një zhavorri tjetër (zminna int c2), ka një vonesë të madhe, një mbyllje të ndrojtur dhe një rifillim.

Numri i pavlefshëm i topave() ( if(x == 1) (c2++; ) if(x == 119) (c1++; ) if(c1 >< c2 && ts == 0) { TV.println(10, 45, "Player 2 won!"); delay(10000); restart(); } else if(c1 == c2 && ts == 0) { TV.println(10, 45, "You are equal"); delay(10000); restart(); }

Aksi dhe kaq miq, e kemi shkruar kodin gri. Doli të ishte e mjaftueshme dhe mund ta humbisni.


Për dembelët, do të shkruaj të gjithë kodin.

Skenar i ri

Usyogo 218 rreshta. #përfshi #përfshi TV outout; int x, y, a, c1, c2, yb1, yb2, tm, tsh, s; noton ts; boolean pauzë=false; void setup() (TV.begin(NTSC, 120, 96); TV.clear_screen(); TV.select_font(font6x8); TV.println(0, 50, "Mirë se erdhe në Shimo"); TV.clear_screen(); x = 60; y = 48; yb1 = 48; yb2 = 48; a = 8; ts = 900.0; s = 2; ) cikli i zbrazët () ( if(! (60,0,60,96,1); TV .select_font(font8x8); racketsmove(); ballscount(); TV.print(1,1,c1); ;TV.print(26,1,c2);tm = ts / 60; ts -= 0.04; if( ts< 0) { ts = 0; } TV.draw_rect(81,1,38,10,0,0); TV.print(81,1,tm); TV.print(97,1,"."); TV.print(100,1,int(ts-(tm*60))); ballcol(); /*if(ts < 600) { s = 4; } if(ts < 300) { s = 6; }*/ ballmove(s, a); TV.delay(50); if(digitalRead(6) == HIGH) { paused = true; delay(1000); } } else { TV.println(40,4,"pause"); if(digitalRead(6) == HIGH) { paused = false; delay(1000); TV.clear_screen(); } } } void ballscount() { if(x == 1) { c2++; } if(x == 119) { c1++; } if(c1 >c2 && ts == 0) ( TV.println(10, 45, "Lojtari 1 fitoi!"); vonesë (10000); rinis (); ) tjetër nëse (c1< c2 && ts == 0) { TV.println(10, 45, "Player 2 won!"); delay(10000); restart(); } else if(c1 == c2 && ts == 0) { TV.println(10, 45, "You are equal"); delay(10000); restart(); } } void ballcol() { if(x == 1 || x == 119 || (x == 10 && y < (yb1 + 3) && y >(yb1 - 3)) | (x == 110 && y< (yb2 + 3) && y >(yb2 - 3))) (nëse(a==1)(a=5;) tjetër nëse(a==2)(a=8;) tjetër nëse(a==3)(a=7;) tjetër nëse(a==4)(a=6;) tjetër nëse(a==5)(a=1;) tjetër nëse(a==6)(a=4;) tjetër nëse(a==7)( a=3;)ndryshe nëse(a==8)(a=2;) ) nëse(x == 10 && y< (yb1 - 3) && y >(yb1 - 8)) ( a = 2; ) nëse (x == 10 && y > (yb1 + 3) && y< (yb1 + 8)) { a = 4; } if(x == 110 && y < (yb2 - 3) && y >(yb2 - 8)) ( a = 8; ) nëse (x == 110 && y > (yb2 + 3) && y< (yb2 + 8)) { a = 6; } if(y == 95 || y == 1) { if(a==1){a=5;}else if(a==2){a=4;}else if(a==3){a=7;}else if(a==4){a=2;}else if(a==5){a=1;}else if(a==6){a=8;}else if(a==7){a=3;}else if(a==8){a=6;} } } void racketsmove() { TV.draw_line(10, yb1+8, 10, yb1-8, 0); TV.draw_line(110, yb2+8, 110, yb2-8, 0); if((yb1 - 8) >1) ( nëse (lexo dixhitale (2) == LARTË) ( yb1 -= 2; ) ) nëse ((yb1 + 8)< 95) { if(digitalRead(3) == HIGH) { yb1 += 2; } } if((yb2 - 8) >1) ( nëse (lexo dixhitale (4) == LARTË) ( yb2 -= 2; ) ) nëse ((yb2 + 8)< 95) { if(digitalRead(5) == HIGH) { yb2 += 2; } } TV.draw_line(10, yb1+8, 10, yb1-8, 1); TV.draw_line(110, yb2+8, 110, yb2-8, 1); } void ballmove(int vel, int angle) { TV.set_pixel(x,y,0); if(angle == 1) { y -= vel; } if(angle == 3) { x += vel; } if(angle == 5) { y += vel; } if(angle == 7) { x -= vel; } if(angle == 2) { x += round(vel/2); y -= round(vel/2); } if(angle == 4) { x += round(vel/2); y += round(vel/2); } if(angle == 6) { x -= round(vel/2); y += round(vel/2); } if(angle == 8) { x -= round(vel/2); y -= round(vel/2); } TV.set_pixel(x,y,1); } void restart() { TV.clear_screen(); x = 60; y = 48; yb1 = 48; yb2 = 48; a = 8; ts = 900.0; c1 = 0; c2 = 0; }

Krok 4. Trup i virizueshëm

Pas prerjes së trupit në një prestar lazer (ose një prerës mulliri, nuk e di me siguri) nga kompensatë 4 mm. Pasi kisha pikturuar në InkScape, luajta pak dhe ndryshova formatin e prerësit të mullirit.


Për tabelat e lojërave, bëra dërrasa të vogla dhe hapa vrima për butonat. Doli keq, por, për fat të keq, e humba fotografinë.

Visnovok

Në këtë proces, u krijua një lojë e thjeshtë në një tastierë lojërash televizive në Arduino me një lojë standarde Ping Pong me dy tastierë lojërash, në të cilën mund të luajmë dhe të ngecim.