Turinys:

Sukurkite interaktyvų „Rainbow“tiltą naudodami „Minecraft Raspberry Pi Edition“: 11 žingsnių
Sukurkite interaktyvų „Rainbow“tiltą naudodami „Minecraft Raspberry Pi Edition“: 11 žingsnių

Video: Sukurkite interaktyvų „Rainbow“tiltą naudodami „Minecraft Raspberry Pi Edition“: 11 žingsnių

Video: Sukurkite interaktyvų „Rainbow“tiltą naudodami „Minecraft Raspberry Pi Edition“: 11 žingsnių
Video: Baltijos baleto teatro (BBT) studija - "Vasaros dienos šokių vaikų stovykla 2020" 2024, Lapkritis
Anonim
Image
Image

Vakar mačiau savo aštuonerių metų sūnėną žaidžiantį „Minecraft“su „Raspberry Pi“, kurį jam daviau anksčiau, tada aš sugalvojau, kad naudojant kodą sukuriamas pritaikytas ir įdomus „Minecraft-pi“LED blokų projektas. „Minecraft Pi“yra puikus būdas pradėti dirbti su „Raspberry Pi“mikrokompiuteriu, „Minecraft Pi“yra speciali pagal užsakymą pagaminta „Minecraft“versija, leidžianti mums bendrauti su žaidimu naudojant mirtinai paprastą „Python“API, kad pritaikytume žaidimo patirtį ir rekvizitus!

„Minecraft“pasaulyje yra daug projektų, kuriuos galite atlikti naudodami „Raspberry Pi“, tačiau specialiai mums to nepakako, mes ieškojome kažko sudėtingo ir tuo pat metu mirksinčio. Šiame projekte mes pasieksime kelis „Minecraft“blokus, aptiksime bloko ID ir nustatysime konkretaus bloko, ant kurio mes žengėme, spalvą, atsižvelgdami į spalvą, kurią uždegsime RGB šviesos diodą, kad sukurtume interaktyvų žingsnių žaidimą!

Efektui pasiekti naudosiu du metodus, pirmasis - priedų naudojimas, kuris gali būti labai chaotiškas …; antrasis - naudojant „CrowPi2“(mokomąjį kompiuterį su daugybe jutiklių, šiuo metu sutelktiniu būdu finansuojamą „Kickstarter“: CrowPi2)

pradėkime ir pažiūrėkime, kaip archyvuoti tokį nuostabų projektą!

Prekės

„CrowPi2“dabar veikia tiesioginiame „Kickstarter“, „CrowPi2“projektas surinko beveik 250 000 USD.

Spausk nuorodą:

1 metodas Priedų naudojimas

1 žingsnis: medžiagos

● 1 x „Raspberry Pi 4“modelis B

● 1 x TF kortelė su vaizdu

● 1 x Raspberry Pi maitinimo šaltinis

● 1 x 10,1 colio monitorius

● 1 x maitinimo šaltinis monitoriui

● 1 x HDMI kabelis

● 1 x klaviatūra ir pelė

● 1 x RGB šviesos diodas (bendras katodas)

● 4 x džemperiai (nuo moterų iki moterų)

2 žingsnis: prijungimo schema

Ryšio schema
Ryšio schema

Iš tikrųjų RGB spalvos šviesos dioduose yra trys lemputės: raudona, žalia ir mėlyna. Valdykite šiuos tris žibintus, kad jie skleistų skirtingo intensyvumo šviesą, o sumaišę jie gali skleisti įvairių spalvų šviesą. Keturi LED lemputės kaiščiai yra atitinkamai GND, R, G ir B. Mano naudojamas RGB šviesos diodas yra įprastas katodas, o ryšys su „Raspberry Pi“yra toks:

RaspberryPi 4B (funkcijos pavadinime) RGB šviesos diodas

GPIO0 1 RAUDONA

GPIO1 3 ŽALIA

GPIO2 4 MĖLYNA

GND 2 GND

Antrasis paveikslėlis yra aparatūros jungtis

3 veiksmas: sukonfigūruokite SPI

Konfigūruokite SPI
Konfigūruokite SPI
Konfigūruokite SPI
Konfigūruokite SPI
Konfigūruokite SPI
Konfigūruokite SPI
Konfigūruokite SPI
Konfigūruokite SPI

Kadangi RGB valdymui turime naudoti SPI, pirmiausia turime įgalinti SPI sąsają, kuri pagal nutylėjimą yra išjungta. Norėdami įjungti SPI sąsają, galite atlikti šiuos veiksmus:

Pirma, galite naudoti darbalaukio GUI, eidami į „Pi“pradžios meniu „Raspberry Pi Configuration“, kaip parodyta pirmame paveikslėlyje.

Antra, eikite į „Sąsajos“ir įjunkite SPI ir spustelėkite Gerai (antra nuotrauka).

Galiausiai iš naujo paleiskite „Pi“, kad pakeitimai įsigaliotų. Spustelėkite „Pi“meniu Pradėti „PreferencesShutdown“. Kadangi mums tiesiog reikia iš naujo paleisti, spustelėkite mygtuką Perkrauti.

4 žingsnis: Kodas

Pradėsime rašydami savo „python“kodą, pirmiausia importuodami kelias bibliotekas, kurių mums prireiks, kad galėtume integruoti savo kodą į „Minecraft“pasaulį. Tada importuosime laiko biblioteką, konkrečiai funkciją, vadinamą miego režimu. Miego funkcija leis mums palaukti tam tikrą intervalą prieš atliekant funkciją. Paskutinis, bet ne mažiau svarbus dalykas - importuojame RPi. GPIO biblioteką, kuri leidžia mums valdyti „Raspberry Pi“GPIO.

iš mcpi.minecraft importuoti „Minecraft“iš laiko importo miego režimo importuoti RPi. GPIO kaip GPIO

Štai ir viskas, mes baigėme importuoti bibliotekas, dabar atėjo laikas jomis naudotis! Pirmiausia reikia naudoti „Minecraft“biblioteką, norime prijungti savo „python“scenarijų prie „Minecraft“pasaulio, tai galime padaryti, iškviesdami MCPI bibliotekos „init“() funkciją, tada nustatę GPIO režimą ir išjungdami įspėjimą.

mc = Minecraft.create () GPIO.setmode (GPIO. BCM) GPIO.setwarnings (0)

Dabar mes apibrėžiame kai kurias vaivorykštės spalvas šešioliktainiais, kad galėtume pakeisti RGB spalvas.

BALTA = 0xFFFFFF RED = 0xFF0000 ORANGE = 0xFF7F00 GELTONA = 0xFFFF00 GREEN = 0x00FF00 CYAN = 0x00FFFF BLUE = 0x0000FF PURPLE = 0xFF00FF MAGENTA = 0xFF0000

Toliau turime apibrėžti kai kuriuos kintamuosius, kad įrašytume vilnos bloko spalvą, kuri jau yra apibrėžta „Minecraft“blokų sąraše.

W_WHITE = 0 W_RED = 14 W_ORANGE = 1 W_YELLOW = 4 W_GREEN = 5 W_CYAN = 9 W_BLUE = 11 W_PURPLE = 10 W_MAGENTA = 2

„Minecraft“vilnos bloko ID yra 35. Dabar turime sukonfigūruoti RGB lemputės kaištį ir juos nustatyti.

red_pin = 17 green_pin = 18 blue_pin = 27

GPIO.setup („red_pin“, „GPIO. OUT“, pradinis = 1) „GPIO.setup“(„green_pin“, „GPIO. OUT“, pradinis = 1) „GPIO.setup“(„blue_pin“, „GPIO. OUT“, pradinis = 1)

Tada nustatykite kiekvieno kaiščio PWM, atkreipkite dėmesį, kad PWM reikšmių diapazonas yra 0–100. Čia pirmiausia nustatėme baltos spalvos RGB spalvą (100, 100, 100).

raudona = GPIO. PWM („red_pin“, 100)

žalia = GPIO. PWM (žalia_pin, 100) mėlyna = GPIO. PWM (mėlyna_pin, 100) raudona.start (100) žalia.pradis (100) mėlyna.startas (100)

Toliau sukurkite dvi funkcijas, kurios gali būti naudojamos dekoduoti spalvas ir apšviesti RGB lemputę! Atminkite, kad „map2hundred“() funkcija yra susieti reikšmes nuo 255 iki 100, kaip minėjome anksčiau, PWM vertė turėtų būti 0–100.

def map2hundred (vertė): return int (vertė * 100 /255)

def set_color (color_code): # dekoduoti red_value = color_code >> 16 & 0xFF green_value = color_code >> 8 & 0xFF blue_value = color_code >> 0 & 0xFF

# Žemėlapio vertės red_value = map2hundred (red_value) green_value = map2hundred (green_value) blue_value = map2hundred (blue_value)

# Apšviesk! red. ChangeDutyCycle (red_value) žalia. ChangeDutyCycle (green_value) mėlyna. ChangeDutyCycle (blue_value)

Šauniai padirbėta! Atėjo laikas pradėti mūsų pagrindinę programą, palaukite, prieš pagrindinę programą reikia apibrėžti kitą kintamąjį, kad būtų įrašytas vilnos bloko spalvos kodas:

last_data = 0 bandymas: x, y, z = mc.player.getPos () mc.setBlocks (x, y, z, x+1, y, z+2, 35, 14) mc.setBlocks (x+2, y+1, z, x+3, y+1, z+2, 35, 11) mc.set Blokai (x+4, y+2, z, x+5, y+2, z+2, 35, 2) mc.setBlocks (x+6, y+3, z, x+7, y+3, z+2, 35, 5) mc.setBlocks (x+8, y+4, z, x+9, y+4, z+2, 35, 4) mc.setBlocks (x+10, y+5, z, x+11, y+5, z+2, 35, 10) mc.setBlocks (x+12, y+6, z, x+13, y+6, z+2, 35, 1) mc.set Blokai (x+14, y+5, z, x+15, y+5, z+2, 35, 10) mc.setBlocks (x+16, y+4, z, x+17, y+4, z+2, 35, 4) mc.setBlocks (x+18, y+3, z, x+19, y+3, z+2, 35, 5) mc.setBlocks (x+20, y+2, z, x+21, y+2, z+2, 35, 2) mc.setBlocks (x+22, y+1, z, x+23, y+1, z+2, 35, 11) mc.set Blokai (x+24, y, z, x+25, y, z+2, 35, 14), o tiesa: x, y, z = mc.player.getPos () # žaidėjo pozicija (x, y, z) block = mc.getBlockWithData (x, y-1, z) # bloko ID #print (block) if block.id == WOOL and last_data! = Block.data: if block.data == W_RED: print ("Red!") Set_color (RED) if block.data == W_ORANGE: print ("Orange"!) Set_color (ORANGE), jei block.data == W_ GELTONA: spausdinti ("Geltona!") Set_color (GELTONA), jei block.data == W_GREEN: print ("Green!") Set_color (GREEN) if block.data == W_CYAN: print ("Cyan!") Set_color (CYAN)) if block.data == W_BLUE: print ("Blue!") set_color (BLUE) if block.data == W_PURPLE: print ("Purple!") set_color (PURPLE) jei block.data == W_MAGENTA: print (" Rausvai raudona! ") Set_color (MAGENTA) if block.data == W_WHITE: print (" White! ") Set_color (WHITE) last_data = block.data sleep (0.05), išskyrus KeyboardInterrupt: pass GPIO.cleanup ()

Kaip parodyta aukščiau esančioje pagrindinėje programoje, pirmiausia, norint sukurti spalvingus vilnos blokus, reikia naudoti kai kurias komandas, tada turime išsiaiškinti žaidėjo poziciją, kad galėtume gauti blokų identifikatorių ir jo spalvos kodą. Gavę informaciją apie bloką, mes naudosime teiginį, kad nustatytume, ar blokas po grotuvu yra vilnos blokas ir ar jis turi spalvos kodą. Jei taip, nuspręskite, kokios spalvos yra vilnos blokas, ir iškvieskite funkciją set_color (), kad pakeistumėte RGB lemputės spalvą taip pat, kaip ir vilnos blokas.

Be to, pridedame teiginį try/išskyrus, kad pagautume vartotojo pertraukimo išimtį, kai norime uždaryti programą, kad išvalytume GPIO kaiščių išvestį.

Pridedamas visas kodas.

Gerai padaryta, tiek daug priedų ir pernelyg sudėtinga, tiesa? Nesijaudinkite, pažiūrėkime antrąjį projekto įgyvendinimo metodą, kuris leis jums jaustis lankstesniam ir patogesniam, naudojant mūsų „CrowPi2“!

5 žingsnis: rezultatas

Image
Image

Atidarykite žaidimą ir paleiskite scenarijų, rezultatą pamatysite aukščiau esančiame vaizdo įraše

Tada mes naudosime „CrowPi2“, kad pastatytume „Rainbow“interaktyvų tiltą

6 žingsnis: „CrowPi2“medžiagų naudojimas

● 1 x „CrowPi2“

7 žingsnis: „CrowPi2“ryšio schemos naudojimas

Nereikia. „CrowPi2“yra daug naudingų jutiklių ir komponentų (daugiau nei 20), visa tai yra viename nešiojamame nešiojamajame kompiuteryje ir STEM švietimo platformoje, kuri leidžia mums lengvai ir be prakaito atlikti kelis projektus! Šiuo atveju „CrowPi2“naudosime patrauklų ir spalvingą modulį, kuris yra 8x8 RGB matricos modulis, leidžiantis vienu metu valdyti 64 RGB diodus!

8 veiksmas: „CrowPi2“naudojimas- sukonfigūruokite SPI

Nereikia. „CrowPi2“turi integruotą vaizdą su mokymosi sistema! Viskas paruošta, o tai reiškia, kad galite programuoti ir mokytis tiesiogiai. Be to, su mūsų „CrowPi2“tai paprasta ir jau integruota į plokštę kaip paruošta naudoti STEAM platforma.

9 veiksmas: „CrowPi2“kodo naudojimas

Dabar atėjo laikas pradėti mūsų programą! Pirma, importuokite kelias bibliotekas, pvz., MCPI biblioteką, kuri yra „Minecraft Pi Python“biblioteka, leidžianti naudoti labai paprastą API, kad būtų integruota į „Minecraft“pasaulį; laiko biblioteka, kuri leidžia mums miego funkcijai palaukti tam tikrą intervalą prieš atliekant funkciją; RPi. GPIO biblioteka, leidžianti valdyti Raspberry Pi GPIO kaiščius.

iš mcpi.minecraft importuoti „Minecraft“iš laiko importo miego režimo importuoti RPi. GPIO kaip GPIO

Galiausiai bibliotekoje importuosime biblioteką, pavadintą rpi_ws281x, kuri yra RGB matricos biblioteka, yra keletas funkcijų, kurias naudosime, pvz., „PixelStrip“, kad nustatytume LED juostos objektą, o „Color“, kad sukonfigūruotume RGB spalvų objektą. mūsų RGB šviesos diodai

iš rpi_ws281x importuoti „PixelStrip“, spalvotą

Štai ir viskas, mes baigėme importuoti bibliotekas, dabar atėjo laikas jomis naudotis! Taip pat pirmas dalykas yra naudoti „Minecraft“biblioteką, norime prijungti savo „python“scenarijų prie „Minecraft“pasaulio, tai galime padaryti, iškviesdami MCPI bibliotekos inicialinę funkciją:

mc = Minecraft.create ()

Dabar kiekvieną kartą, kai norime atlikti operacijas mineratų pasaulyje, galime naudoti mc objektą.

Kitas žingsnis bus apibrėžti RGB LED matricos klasę, kurią naudosime savo RGB šviesos diodams valdyti, inicijuosime klasę su pagrindine konfigūracija, pvz., Šviesos diodų skaičiumi, kaiščiais, ryškumu ir kt.

mes sukuriame funkciją, vadinamą švariu, kuri „išvalys“mažiau, nurodydama tam tikrą spalvą, taip pat funkciją, pavadintą „paleisti“, kuri inicijuos tikrąjį RGB LED objektą pirmą kartą, kai norėsime jį naudoti.

klasė RGB_Matrix:

def _init _ (savarankiškai):

# LED juostos konfigūracija:

self. LED_COUNT = 64 # LED pikselių skaičius.

self. LED_PIN = 12 # GPIO kaištis prijungtas prie taškų (18 naudoja PWM!).

self. LED_FREQ_HZ = 800000 # LED signalo dažnis hercais (paprastai 800 khz)

self. LED_DMA = 10 # DMA kanalas, naudojamas signalui generuoti (pabandykite 10)

self. LED_BRIGHTNESS = 10 # Nustatykite į 0 tamsiausiam ir 255 - ryškiausiam

self. LED_INVERT = Netiesa # Tiesa, jei norite apversti signalą

self. LED_CHANNEL = 0 # nustatytas kaip „1“GPIO 13, 19, 41, 45 arba 53

# Apibrėžkite funkcijas, kurios įvairiais būdais animuoja šviesos diodus. def švarus (savaime, juostelė, spalva):

# nuvalykite visus šviesos diodus vienu metu

i diapazone (strip.numPixels ()):

strip.setPixelColor (i, spalva)

strip.show ()

def bėgti (savarankiškai):

# Sukurkite „NeoPixel“objektą su tinkama konfigūracija.

juostelė = PixelStrip (self. LED_COUNT, self. LED_PIN, self. LED_FREQ_HZ, self. LED_DMA, self. LED_INVERT, self. LED_BRIGHTNESS, self. LED_CHANNEL)

bandyti:

grąžinimo juostelė

išskyrus klaviatūrąInterrupt:

# prieš pertrauką išvalykite matricos šviesos diodą

self.clean (juostelė)

Baigę tai, kas išdėstyta aukščiau, laikas iškviesti tas klases ir sukurti objektus, kuriuos galime naudoti savo kode, pirmiausia sukurkime RGB LED matricos objektą, kurį galime naudoti naudodami anksčiau sukurtą klasę:

matrixObject = RGB_Matrix ()

Dabar panaudokime šį objektą, kad sukurtume aktyvų LED juostos objektą, kurį naudosime valdydami atskirus RGB matricos šviesos diodus:

juostelė = matrixObject.run ()

Galiausiai, norėdami suaktyvinti šią juostelę, turėsime paleisti paskutinę funkciją:

strip.begin ()

„Minecraft“API apima daug blokų, kiekvienas „Minecraft“blokas turi savo ID. Mūsų pavyzdyje paėmėme šiek tiek „Minecraft“blokų ir bandėme atspėti, kuri spalva jiems tinkamiausia.

RGB reiškia raudoną, žalią ir mėlyną, todėl mums reikės 3 skirtingų reikšmių nuo 0 iki 255 kiekvienai iš jų, spalvos gali būti HEX arba RGB formato, savo pavyzdyje naudojame RGB formatą.

„Minecraft Pi“pasaulyje yra įprastų blokų ID ir specialių vilnos blokų ID, speciali vilna priskiriama ID numeriui 35, tačiau antriniai numeriai svyruoja nuo daugybės skirtingų ID … Mes išspręsime šią problemą sukurdami 2 atskirus sąrašus, vieną įprastiems blokams ir vienas specialių vilnos blokų sąrašas:

Pirmasis sąrašas skirtas įprastiems blokams, pavyzdžiui, 0 reiškia oro bloką, mes nustatysime spalvą 0, 0, 0, kuri yra tuščia arba visiškai balta, kai žaidėjas šokinėja ar skrenda žaidime, RGB išsijungs, 1 yra skirtingas blokas su RGB spalvomis 128, 128, 128 ir pan.

#Vaivorykštės spalvos

vaivorykštės_spalvos = {

"0": spalva (0, 0, 0), „1“: spalva (128, 128, 128), „2“: spalva (0, 255, 0), „3“: spalva (160, 82, 45), „4“: spalva (128, 128, 128), „22“: spalva (0, 0, 255)

}

Su vilnoniais blokais mes darome tą patį, tačiau svarbu prisiminti, kad visų blokų ID yra 35, šiame sąraše mes apibrėžiame bloko, kuris yra vilnos blokas, potipius. Skirtingi vilnos potipiai yra skirtingų spalvų, tačiau visi jie yra vilnos blokai.

vilnos_spalvos = {

„6“: spalva (255, 105, 180), „5“: spalva (0, 255, 0), „4“: spalva (255, 255, 0), „14“: spalva (255, 0, 0), „2“: spalva (255, 0, 255)

}

Kai baigsime apibrėžti savo pagrindinę programą, klases ir funkcijas, laikas integruotis su mūsų „CrowPi2 RGB LED“borto jutikliu.

Pagrindinė programa paims anksčiau apibrėžtus parametrus ir padarys įtaką aparatinei įrangai.

Mes naudosime „CrowPi2 RGB LED“, kad juos užsidegtume, atsižvelgdami į veiksmus, kuriuos atliekame „Minecraft Pi“viduje kiekviename bloke, pradėkime!

Pirmas dalykas, kurį mes padarysime, yra sugeneruoti kai kuriuos vilnos blokus su komandomis ir sukurti laiko ciklą, kad programa veiktų tol, kol žaisime žaidimą.

Turėsime gauti tam tikrus duomenis iš grotuvo, pirmiausia mes naudojame komandą player.getPos (), kad gautume žaidėjo poziciją, tada mes naudojame getBlockWithData (), kad gautume bloką, kuriame šiuo metu stovime (y koordinatė yra -1, kuri reiškia po grotuvu)

x, y, z = mc.player.getPos ()

mc.setBlocks (x, y, z, x+1, y, z+2, 35, 14)

mc.setBlocks (x+2, y+1, z, x+3, y+1, z+2, 35, 11)

mc.setBlocks (x+4, y+2, z, x+5, y+2, z+2, 35, 2)

mc.setBlocks (x+6, y+3, z, x+7, y+3, z+2, 35, 5)

mc.setBlocks (x+8, y+4, z, x+9, y+4, z+2, 35, 4)

mc.setBlocks (x+10, y+5, z, x+11, y+5, z+2, 35, 10)

mc.setBlocks (x+12, y+6, z, x+13, y+6, z+2, 35, 1)

mc.setBlocks (x+14, y+5, z, x+15, y+5, z+2, 35, 10)

mc.setBlocks (x+16, y+4, z, x+17, y+4, z+2, 35, 4)

mc.setBlocks (x+18, y+3, z, x+19, y+3, z+2, 35, 5)

mc.setBlocks (x+20, y+2, z, x+21, y+2, z+2, 35, 2)

mc.setBlocks (x+22, y+1, z, x+23, y+1, z+2, 35, 11)

mc.setBlocks (x+24, y, z, x+25, y, z+2, 35, 14)

nors tiesa:

x, y, z = mc.player.getPos () # žaidėjo pozicija (x, y, z)

blockType, data = mc.getBlockWithData (x, y-1, z) # bloko ID

spausdinti (blockType)

Tada mes patikrinsime, ar blokas yra vilnos blokas, bloko ID numeris 35, jei taip, mes nurodysime vilnos_spalvas su bloko spalva pagal žodyno ID ir atitinkamai apšviesime tinkamą spalvą.

jei blockType == 35:

# pasirinktinės vilnos spalvos

matrixObject.clean (juostelė, vilnos spalvos [str (duomenys)])

Jei tai ne vilnos blokas, patikrinsime, ar tas blokas šiuo metu yra „rainbow_colors“žodyno viduje, kad išvengtume išimčių.

jei str (blockType) in rainbow_colors:

spausdinti (vaivorykštės_spalvos [str (blockType)])

matrixObject.clean (juostelė, vaivorykštės_spalvos [str (blockType)])

miegoti (0,5)

Visada galite pabandyti pridėti daugiau blokų prie „rainbow_color“, kad pridėtumėte daugiau spalvų ir daugiau blokų palaikymo!

Puikus! Projektų vykdymas naudojant priedus yra sudėtingas, tačiau naudojant „CrowPi2“integruotą grandinę viskas tampa daug lengviau! Be to, „CrowPi2“yra daugiau nei 20 jutiklių ir komponentų, kurie leidžia įgyvendinti idealius projektus ir net dirbtinio intelekto projektus!

Žemiau yra visas kodas:

10 veiksmas: „CrowPi2“naudojimas-rezultatas

Atidarykite žaidimą ir paleiskite scenarijų, rezultatą pamatysite aukščiau esančiame vaizdo įraše:

11 veiksmas: „CrowPi2“naudojimas- Eiti toliau

Dabar baigėme spalvingą „Minecraft“žaidimo projektą su „CrowPi2“. Kodėl nepabandžius žaisti su žaidimu naudoti kitus „CrowPi2“jutiklius ir komponentus, pvz., Vairasvirtę, skirtą valdyti žaidėjo judesį, RFID, norint sugeneruoti blokus pagal skirtingas NFC korteles ir pan. daugiau neįtikėtinų projektų su „CrowPi2“!

Dabar „CrowPi2“yra „Kickstarter“, taip pat galėtumėte mėgautis patrauklia kaina.

Pridėkite „Kickstarter“puslapio nuorodą „CrowPi2“

Rekomenduojamas: