Sisällysluettelo:

Walabot FX - Guitar Effect Control: 28 vaihetta (kuvilla)
Walabot FX - Guitar Effect Control: 28 vaihetta (kuvilla)

Video: Walabot FX - Guitar Effect Control: 28 vaihetta (kuvilla)

Video: Walabot FX - Guitar Effect Control: 28 vaihetta (kuvilla)
Video: Walabot FX- Guitar Effect Control. Full Demo 2024, Marraskuu
Anonim
Walabot FX - Guitar Effect Control
Walabot FX - Guitar Effect Control

Ohjaa suosikki kitaratehosteesi käyttämällä vain mahtavia kitara -asentoja!

Vaihe 1: Asioita, joita tarvitset

Laitteiston osat

Walabot - Walabot

Raspberry Pi - Raspberry Pi 3 Malli B

Sunfounder LCD1602

SunFounder PCA9685 16-kanavainen 12-bittinen PWM-servo-ohjain Arduinolle ja Raspberry Pi: lle

Servo (yleinen) Ei linkkiä

9V akun pidike

4xAA -paristopidike

AA -paristot

Hyppyjohdot (yleinen)

DPDT Latching Action Foot -kytkin

Korg SDD3000-PDL

Ohjelmistojen käyttöjärjestelmät, sovellukset ja verkkopalvelut

Autodesk Fusion360 -

Blynk -

Työkalut yms

3D tulostin

Juotin

Vaihe 2: Tiivistelmä

Getting Started
Getting Started

Miltä tuntuisi hallita musiikillista ilmaisua käyttämällä vain kitaran asentoa 3D -tilassa? No, kirjoitetaan jotain ja selvitetään!

Vaihe 3: Perusidea

Halusin pystyä ohjaamaan 3 -tehosteparametria reaaliajassa, halusin tehdä tämän käyttämällä kitarani sijoittamista. Joten yksi asia oli selvä, tarvitsin muutamia asioita.

  • Anturi, joka pystyy näkemään 3D -tilan
  • Servot kääntämään nuppeja
  • LCD -näyttö
  • I2C Servo -ohjain
  • Raspberry Pi
  • Oppia Python

Vaihe 4: Walabot

Haluatko nähdä seinien läpi? Tunne esineitä 3D -tilassa? Onko järkeä, jos hengität huoneen toiselta puolelta? No, olet onnekas!

Walabot on aivan uusi tapa havaita ympärilläsi oleva tila käyttämällä pienitehoista tutkaa.

Tämä oli avain tähän projektiin, pystyisin ottamaan esineiden carteasan (X-Y-Z) -koodinaatit 3D-avaruudessa ja kartoittamaan ne servoasentoihin muuttamalla kitaratehosteen kuulosta reaaliajassa koskematta pedaaliin.

Voittaa.

Lisätietoja Walabotista löytyy täältä

Vaihe 5: Aloittaminen

Ensinnäkin tarvitset tietokoneen Walabotin ajamiseen, tässä projektissa käytän Raspberry Pi 3: ta (tässä viitaten RPi: hen) sisäänrakennetun WiFi: n ja yleisten lisäominaisuuksien vuoksi

Ostin 16 Gt: n SD -kortin, johon oli esiasennettu NOOBS, jotta asiat olisivat mukavia ja yksinkertaisia, ja päätin asentaa Raspianin Linux -käyttöjärjestelmäksi

(jos et ole perehtynyt Raspianin asentamiseen, lue hetki ja lue tämä hieman)

OK, kun Raspian on käynnissä RPi -laitteellasi, sinun on suoritettava muutama määritysvaihe, jotta asiat saadaan valmiiksi projektillemme

Vaihe 6: Raspberry Pi: n käyttöönotto - 1

Varmista ensin, että käytät uusinta ytimen versiota, ja tarkista päivitykset avaamalla komentokuori ja kirjoittamalla

sudo apt-get päivitys

sudo apt-get dist-upgrade

(sudo lisätään varmistaaksesi, että sinulla on järjestelmänvalvojan oikeudet, esim. tavarat toimivat)

Tämä voi kestää jonkin aikaa, joten mene ja nauti mukava kuppi teetä.

Vaihe 7: Asenna Raspberry Pi - 2

Sinun on asennettava Walabot SDK for RPi. Siirry RPi -selaimestasi osoitteeseen https://www.walabot.com/gettingstarted ja lataa Raspberry Pi -asennuspaketti.

Komentokuoresta:

cd -lataukset

sudo dpkg -I walabotSDK_RasbPi.deb

Vaihe 8: Asenna Raspberry Pi - 3

Meidän on aloitettava RPi: n määrittäminen käyttämään i2c -väylää.

sudo apt-get install python-smbus

sudo apt-get install i2c-tools

Kun tämä on tehty, sinun on lisättävä seuraava moduulitiedostoon

Komentokuoresta:

sudo nano /etc /modules

lisää nämä 2 merkkijonoa erillisille riveille:

i2c-dev

i2c-bcm2708

Vaihe 9: Asenna Raspberry Pi - 4

Walabot saa melko vähän virtaa, ja käytämme myös GPIO: ta tavaroiden hallintaan, joten meidän on määritettävä nämä

Komentokuoresta:

sudo nano /boot/config.txt

lisää seuraavat rivit tiedoston loppuun:

safe_mode_gpio = 4

max_usb_current = 1

RPi on erinomainen työkalu valmistajille, mutta se on rajoitettu nykyisessä Walabotille lähetettävässä virrassa. Siksi lisäämme 1 A: n maksimivirran tavallisen 500 mA: n sijasta

Vaihe 10: Python

Miksi Python? No, koska se on erittäin helppo koodata, nopea käynnistää ja saatavilla on paljon hyviä esimerkkejä pythonista! En ollut koskaan käyttänyt sitä aikaisemmin ja sain sen nopeasti käyttöön. Nyt RPi on määritetty haluamallemme tavalla, seuraava askel on määrittää Python pääsemään Walabot -sovellusliittymään, LCD Servo -rajapintoihin

Vaihe 11: Walabot

Komentokuoresta

Sudo pip -asennus”/usr/share/walabot/python/WalabotAPI-1.0.21.zip”

Vaihe 12: Servoliitäntä

Komentokuoresta

sudo apt-get install git build-essential python-dev

cd ~

git -klooni

cd Adafruit_Python_PCA9685

sudo python setup.py install

Miksi meidän on käytettävä servo -ohjainta? No, RPi: stä pari syytä.

1. Servon vetämä virta voi olla erittäin suuri, ja tämä luku kasvaa sitä enemmän, mitä enemmän servoja sinulla on (tietysti). Jos ohjaat servo -ohjainta RPi: stä, olet vaarassa tuhota sen virtalähteen

2. PWM: n (Pulse Width Modulation) ajoitukset, jotka säätelevät servoja, ovat erittäin tärkeitä. Koska RPi ei käytä reaaliaikaista käyttöjärjestelmää (voi olla keskeytyksiä ja vastaavia), ajoitukset eivät ole tarkkoja ja voivat saada servot nykimään hermostuneesti. Erillinen ohjain mahdollistaa tarkan ohjauksen, mutta mahdollistaa myös jopa 16 servon lisäämisen, joten tämä sopii erinomaisesti laajentamiseen.

Vaihe 13: LCD -näyttö

Blynk
Blynk

avaa RPi -selain

www.sunfounder.com/learn/category/sensor-k…

ladata

github.com/daveyclk/SunFounder_SensorKit_…

Komentokuoresta:

sudo mkdir/usr/share/sunfounder

Kopioi graafisen tutkimusohjelman avulla python -kansio zip -tiedostosta uuteen sunfounder -kansioon

Nestekidenäytöllä kehotetaan käyttäjää selvittämään, mitä tapahtuu. Näytetään määritysprosessi aina x-, y- ja z -arvoihin, jotka on kartoitettu kullekin servolle

Vaihe 14: Blynk

Blynk
Blynk
Blynk
Blynk

Blynk on loistava IoT -palvelu, jonka avulla voit luoda mukautetun sovelluksen asioidesi hallitsemiseksi. Tuntui täydelliseltä ratkaisulta antaa minulle kauko -ohjain walabotista, jotta voin todella valita asetukset …

Yksi ongelma. Blynk ei ole tällä hetkellä tuettu Python -alustalla, vika. Mutta älä pelkää! Löysin mukavan pienen työn, joka mahdollistaa kauko -ohjauksen ja etäparametrien syöttämisen! se on vähän noloa

ensimmäinen askel on ladata Blynk -sovellus suosikkisovelluskaupastasi

Toiseksi, hanki tili

Kun tämä on tehty, avaa sovellus ja aloita uusi projekti valitsemalla laitteistoksi Raspberry Pi 3.

Sovellus antaa sinulle käyttöoikeustunnuksen (tarvitset tämän koodin syöttämiseen)

Kun olet tehnyt sen. sinun on asennettava sovellus kuvien mukaisesti. Näin se liitetään walabotiin.

Vaihe 15: Blynk -sovelluksen määrittäminen

Blynk -sovelluksen määrittäminen
Blynk -sovelluksen määrittäminen
Blynk -sovelluksen määrittäminen
Blynk -sovelluksen määrittäminen
Blynk -sovelluksen määrittäminen
Blynk -sovelluksen määrittäminen

Vaihe 16: Voit käyttää tätä QR -koodia Blynk -sovelluksen kanssa projektin kloonaamiseen säästääksesi aikaa

Voit käyttää tätä QR -koodia Blynk -sovelluksen kanssa projektin kloonaamiseen säästääksesi aikaa
Voit käyttää tätä QR -koodia Blynk -sovelluksen kanssa projektin kloonaamiseen säästääksesi aikaa

OK Nyt kun kaikki sovellukset on määritetty, voimme määrittää Pythonin ja RPi: n puhumaan sen kanssa Internetin kautta. Taika

Vaihe 17: Blynkin käyttäminen Raspberry Pi: n kanssa ja Blynk HTTPS: n käyttäminen Pythonissa

Ensinnäkin sinun on asennettava Blynk HTTPS -kääre Pythonille

Komentokuoresta:

sudo git klooni

sudo pip asenna blynkapi

Toiseksi sinun on asennettava Blynk -palvelu RPi: hen

Komentokuoresta:

git -klooni

cd blynk-kirjasto/linux

puhdista kaikki

blynk -palvelun suorittamiseen

sudo./blynk --token = YourAuthToken

Varmistaaksesi, että Blynk -palvelu toimii käynnistyksen yhteydessä, sinun on muutettava /etc/rc.local

tekemällä

sudo nano /etc/rc.local

lisää tämä loppuun

./blynk-library/linux/blynk --token = tunnukseni &

(Olen lisännyt /etc/rc.local -tiedoston kopion koodiosaan viitteeksi)

Voit testata sen toimimisen kirjoittamalla

sudo /etc/rc.local start

Blynk -palvelun pitäisi nyt olla käynnissä

Vaihe 18: Käynnistä komentosarja automaattisesti

Nyt kun tämä kaikki on määritetty ja konfiguroitu, ja meillä on python -koodi valmiina. voimme asettaa asiat toimimaan automaattisesti, jotta voimme hylätä näppäimistön ja näytöt

Tekemistä on muutama

Luo uusi komentotiedosto, jotta Python -ohjelma loppuu

sudo nano kitaroefekti.sh

lisää nämä rivit

#!/bin/sh

python /home/pi/GuitarEffectCLI.py

muista tallentaa se

Seuraavaksi meidän on annettava komentosarjalle lupa toimia kirjoittamalla

Sudo chmod +x /home/pi/guitareffect.sh

Ja lopuksi, meidän on lisättävä tämä komentosarja /etc/rc.local -tiedostoon, jota käsitimme aiemmin.

Sudo nano /etc/rc.local

Lisätä

/home/pi/guitareffect.sh &

Muista sisällyttää "&", jolloin Python -skripti voidaan suorittaa taustalla

Oikein! Siinä kaikki kokoonpano ja ohjelmistot lajiteltu, seuraavaksi on aika kytkeä laitteisto

Vaihe 19: Laitteisto

Image
Image
Walabot guitar effects control proto1
Walabot guitar effects control proto1

Ensimmäinen Breadboard -prototyyppi

Vaihe 20: Kotelon suunnittelu

Kotelon suunnittelu
Kotelon suunnittelu
Kotelon suunnittelu
Kotelon suunnittelu

Kotelo on suunniteltu ja renderöity mahtavaan Fusion360: een

Vaihe 21: Guts Shots

Guts Shots
Guts Shots
Guts Shots
Guts Shots
Guts Shots
Guts Shots

Vaihe 22: Lopulliset kokoonpanokuvat

Lopulliset kokoonpanokuvat
Lopulliset kokoonpanokuvat
Lopulliset kokoonpanokuvat
Lopulliset kokoonpanokuvat
Lopulliset kokoonpanokuvat
Lopulliset kokoonpanokuvat

Vaihe 23: Walabotin kiinnittäminen telineeseen

Walabotin kiinnittäminen telineeseen
Walabotin kiinnittäminen telineeseen

Kiinnitä se Walabotin mukana tulevalla itseliimautuvalla metallikiekolla

Vaihe 24: Laitteiston STL -tiedostot 3D -tulostusta varten

Vaihe 25: Kaaviot asian kytkemisestä

Vaihe 26: Koodi

Käytä liitteenä olevaa Python -komentosarjaa projektillesi

from _future_ import print_functionfys sys -tuontialustalta os -tuontijärjestelmästä blynkapista tuonti Blynk -tuonti WalabotAPI -tuontiajan tuonti RPi. GPIO GPIO: na

#asettaa GPIO käyttämällä hallituksen numerointia

GPIO.setmode (GPIO. BOARD) GPIO.setup (18, GPIO. IN, pull_up_down = GPIO. PUD_UP)

#blynk -todennustunnus

auth_token = "sinun_auton_token_ täällä"

# Tuo servo -ohjaukseen tarkoitettu PCA9685 -moduuli.

Tuo Adafruit_PCA9685

#tuonti LCD -moduuli paikasta

imp imp load load_source LCD1602 = load_source ('LCD1602', '/usr/share/sunfounder/Python/LCD1602.py')

# Alusta PCA9685 käyttämällä oletusosoitetta (0x40).

pwm = Adafruit_PCA9685. PCA9685 ()

# blynk -objektia

oletusarvot = Blynk (auth_token, pin = "V9") start_button = Blynk (auth_token, pin = "V3") Rmax = Blynk (auth_token, pin = "V0") Rmin = Blynk (auth_token, pin = "V1") Rres = Blynk (auth_token, pin = "V2")

ThetaMax = Blynk (auth_token, pin = "V4")

ThetaRes = Blynk (auth_token, pin = "V5")

PhiMax = Blynk (auth_token, pin = "V6")

PhiRes = Blynk (auth_token, pin = "V7")

Kynnys = Blynk (auth_token, pin = "V8")

ServoMin = Blynk (auth_token, pin = "V10")

ServoMax = Blynk (auth_token, pin = "V11")

def LCDasetukset ():

LCD1602.init (0x27, 1) # init (orjaosoite, taustavalo)

def numMap (x, in_min, in_max, out_min, out_max): "" "käytetään walabot -lukemien kartoittamiseen servoasentoon" "" return int ((x- in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

# käytä tätä pyöristettäessä raakatiedot määritettyyn arvoon

def myRound (x, base = 2): return int (base * round (float (x)/base))

#poimii numeron palautetusta blynk -merkkijonosta

def numberExtract (val): val = str (val) return int (suodatin (str. numero, val))

# Aseta taajuus 60 Hz, hyvä servoille.

pwm.set_pwm_freq (60)

# Määritä mini- ja maksimipalvelupulssien pituudet oletusarvoiksi

SERVO_MIN = 175 # Minimipulssin pituus 4096: sta SERVO_MAX = 575 # Maksimipulssin pituus 4096: sta

# walabotin oletusarvot

R_MAX = 60 R_MIN = 20 R_RES = 5

THETA_MAX = 20

THETA_RES = 5

PHI_MAX = 20

PHI_RES = 5

THRESHOLD = 1

# muuttujaa blynk -vaihdolle

päällä = "[u'1 ']"

Walabot -luokka:

def _init _ (itse):

self.wlbt = WalabotAPI self.wlbt. Init () self.wlbt. SetSettingsFolder () self.isConnected = False self.isTargets = False

def blynkConfig (itse):

load_defaults = defaults.get_val () if str (load_defaults) == on: SERVO_MAX = ServoMax.get_val () SERVO_MAX = numberExtract (SERVO_MAX) print ("Servo Max =", SERVO_MAX)

SERVO_MIN = ServoMin.get_val ()

SERVO_MIN = numberExtract (SERVO_MIN) print ("Servo MIN =", SERVO_MIN) R_MAX = Rmax.get_val () R_MAX = numberExtract (R_MAX) print ("R max =", R_MAX)

R_MIN = Rmin.get_val ()

R_MIN = numberExtract (R_MIN) print ("R Min =", R_MIN)

R_RES = Rres.get_val ()

R_RES = numberExtract (R_RES) print ("R Res =", R_RES)

THETA_MAX = ThetaMax.get_val ()

THETA_MAX = numberExtract (THETA_MAX) print ("Theta Max =", THETA_MAX) THETA_RES = ThetaRes.get_val () THETA_RES = numberExtract (THETA_RES) print ("Theta Res =", THETA_RES)

PHI_MAX = PhiMax.get_val ()

PHI_MAX = numberExtract (PHI_MAX) print ("Phi Max =", PHI_MAX) PHI_RES = PhiRes.get_val () PHI_RES = numberExtract (PHI_RES) print ("Phi Res =", PHI_RES)

THRESHOLD = Kynnys.get_val ()

THRESHOLD = numberExtract (THRESHOLD) print ("Threshold =", THRESHOLD)

else: # jos mitään blynk -sovelluksesta, lataa oletusarvot SERVO_MIN = 175 # Min. pulssin pituus 4096: sta SERVO_MAX = 575 # Maksimipulssin pituus 4096: sta

# walabotin oletusarvot

R_MAX = 60 R_MIN = 20 R_RES = 5

THETA_MAX = 20

THETA_RES = 5

PHI_MAX = 20

PHI_RES = 5

THRESHOLD = 1

def connect (self): try: self.wlbt. ConnectAny () self.isConnected = True self.wlbt. SetProfile (self.wlbt. PROF_SENSOR) #self.wlbt. SetDynamicImageFilter (self.wlbt. FILTER_TYPE_MTI) its.wlbt. (self.wlbt. FILTER_TYPE_NONE) #self.wlbt. SetDynamicImageFilter (self.wlbt. FILTER_TYPE_DERIVATIVE) self.wlbt. SetArenaTheta (-THETA_MAX, THETA_MAX, THETA_RES) self (-XI) PHILIP-PHILIP. SetArenaR (R_MIN, R_MAX, R_RES) self.wlbt. SetThreshold (THRESHOLD) paitsi self.wlbt. WalabotError as err: if err.code! = 19: # 'WALABOT_INSTRUMENT_NOT_FOUND' korotusvirhe

def start (itse):

self.wlbt. Start ()

def kalibroi (itse):

self.wlbt. StartCalibration ()

def get_targets (itse):

self.wlbt. Trigger () return self.wlbt. GetSensorTargets ()

def stop (itse):

self.wlbt. Stop ()

katkaise yhteys (itse):

self.wlbt. Disconnect ()

def main ():

flag = True check = "" LCDsetup () kun lippu: LCD1602.write (0, 0, 'Guitar') LCD1602.write (0, 1, 'Effect Control') time.sleep (2) LCD1602.write (0, 0, 'Paina Käynnistä') LCD1602. Kirjoittaa (0, 1, 'aloita') time.sleep (2) jos (str (check) == on): flag = False else: check = start_button.get_val () # tarkista blynk -käynnistyspainike paina jos (GPIO.input (18) == 0): #check footswitch flag = False

LCD1602.write (0, 0, "OK! Tehdään se")

LCD1602.write (0, 1, '') wlbt = Walabot () wlbt.blynkConfig () wlbt.connect () LCD1602.clear () jos ei wlbt.isConnected: LCD1602.write (0, 0, 'Not Connected') else: LCD1602.write (0, 0, 'Connected') time.sleep (2) wlbt.start () wlbt.calibrate () LCD1602.write (0, 0, 'Calibrating…..') time.sleep (3)) LCD1602.write (0, 0, 'Walabotin käynnistäminen')

appcheck = start_button.app_status () lippu = True # reset lippu pääohjelmalle

kun lippu: # käytetään tehon asettamiseen valmiustilaan (tehokkaasti)

if (appcheck == True): if (str (check)! = on): if (GPIO.input (18)! = 0): #check footswitch flag = False else: check = start_button.get_val () #check for Käynnistä -painike paina appcheck = start_button.app_status ()

muu:

if (GPIO.input (18)! = 0): #check footswitch flag = False

xval = 0

yval = 0 zval = 0 keskiarvo = 2 delayTime = 0

target = wlbt.get_targets ()

jos len (kohteet)> 0:

j alueella (keskiarvo):

target = wlbt.get_targets ()

jos len (kohteet)> 0: tulosta (len (kohteet)) kohteet = kohteet [0]

tulosta (str (target.xPosCm))

xval += int (target.xPosCm) yval += int (target.yPosCm) zval += int (target.zPosCm) time.sleep (delayTime) else: print ("ei tavoitteita") xval = xval/keskiarvo

xval = numMap (xval, -60, 60, SERVO_MIN, SERVO_MAX)

xval = myRound (xval), jos xval SERVO_MAX: xval = SERVO_MAX LCD1602.write (0, 0, 'x =' + str (xval) + '') pwm.set_pwm (0, 0, xval)

yval = yval/keskiarvo

yval = numMap (yval, -60, 60, SERVO_MIN, SERVO_MAX)

yval = myRound (yval) jos yval SERVO_MAX: yval = SERVO_MAX LCD1602.write (0, 1, 'y =' + str (yval)) pwm.set_pwm (1, 0, yval)

zval = zval/keskiarvo

zval = numMap (zval, R_MIN, R_MAX, SERVO_MIN, SERVO_MAX)

zval = myRound (zval) jos zval SERVO_MAX: zval = SERVO_MAX LCD1602.write (8, 1, 'z =' + str (zval)) pwm.set_pwm (2, 0, zval)

muu:

tulosta ("ei kohteita") LCD1602.write (0, 0, "Sammutus") LCD1602.write (0, 1, 'The Walabot') time.sleep (3) wlbt.stop () wlbt.disconnect ()

jos _name_ == '_main_':

kun taas totta: main ()

kitariefekti.sh

#!/bin/sh

cd /koti /pi

sudo python GuitarEffectCLI.py

Kopio paikallisesta RC -tiedostosta viitteeksi

#!/bin/sh -e # # rc.local # # Tämä komentosarja suoritetaan jokaisen monikäyttäjän ajotason lopussa. # Varmista, että komentosarja "poistuu 0" onnistumisesta tai mikä tahansa muu # arvo virheestä. # # Jotta voit ottaa tämän skriptin käyttöön tai poistaa sen käytöstä, muuta vain suoritus # bittiä. # # Oletuksena tämä skripti ei tee mitään.

# Tulosta IP -osoite

_IP = $ (isäntänimi -I) || tosi jos ["$ _IP"]; sitten printf "IP -osoitteeni on %s / n" "$ _IP" fi

./blynk-library/linux/blynk --token = "sinä tunnuksesi menee tänne" &

nukkua 10 sudo /home/pi/guitareffect.sh & exit 0

Vaihe 27: Käytettävät Github -arkistot

Käytä tätä Sunfounder -nestekidenäytössä

github.com/daveyclk/SunFounder_SensorKit_f…

Käytä tätä servo -ohjaimelle

github.com/daveyclk/Adafruit_Python_PCA968…

Käytä tätä Blynk Python HTTPS Wrapperille

github.com/daveyclk/blynkapi

Vaihe 28: Johtopäätös

Image
Image
Walabot FX- Guitar Effect Control. Full Demo
Walabot FX- Guitar Effect Control. Full Demo
Johtopäätös
Johtopäätös
Johtopäätös
Johtopäätös

Tämä on ollut jyrkkä oppimiskäyrä, mutta se on ollut sen arvoista.

Poimintani ovat

  • Minun piti oppia Python.. osoittautuu, että se on ässä
  • Liitetty Python Raspberry Pi: hen Blynk IoT -palvelun kanssa. Tätä ei tueta virallisesti, joten sen toiminnoilla on joitain rajoituksia. Toimii silti loistavasti!
  • Osoittautuu, että Walabot soveltuu erinomaisesti musiikilliseen ilmaisuun. Käytin sitä Korg SDD3000 -laitteessa, mutta voit käyttää mitä tahansa haluamaasi tehostetta

Käy itse. Tämä ei rajoitu kitaratehosteisiin, minua voidaan käyttää minkä tahansa instrumentin kanssa, jolla on mikä tahansa vaikutus.

Raspberry Pi -kilpailu 2017
Raspberry Pi -kilpailu 2017
Raspberry Pi -kilpailu 2017
Raspberry Pi -kilpailu 2017

Toinen sija Raspberry Pi -kilpailussa 2017

Suositeltava: