Langaton ohjain ATmega:lla ja NRF24L01+ radiomoduulilla

08/11/2018

Oletko koskaan pelannut pelejä, joissa näppäimet ovat todella hankalissa paikoissa? Varsinkin kun kyseessä on kaverin kanssa pelattava verkkopeli, eikä näppäinasettelua voi vaihtaa. Ei syytä huoleen, sillä voit rakentaa itsellesi langattoman ohjaimen vaivattomasti kahdella Arduinolla ja kahdella NRF24L01+ radiomoduulilla. Toinen Arduino muuttaa ohjaimen nappien painallukset arvoiksi ja lähettää ne vastaanottimelle, joka muuntaa nappien painamiset vastaavien näppäinten painamiseksi. Tähän vaaditaan USB-HID -yhteensopiva laite, kuten Arduino Leonardo. Se pystyy emuloimaan näppäimistöä, hiirtä tai peliohjainta helppokäyttöisillä kirjastoilla. Ainoana onglemana on puutteellinen SPI-liitäntä, mutta sitä pystyy käyttämään ISP-liitännän kautta. Yritin tätä, mutta yhteys tuntui olevan todella huono. Pitänee vielä tutkia ongelman aiheuttajaa. Tällä hetkellä vastaanottimena on Arduino Nano, joka tuntuu kykenevän luotettavaan radioliikenteeseen.

NRF24L01+ radiomoduulit ovat halpoja ja suhteellisen helppokäyttöisiä. Ainoana onglemana on niiden epäluotettavuus. Huonolaatuiset hyppykaapelit voi unohtaa suoraan ja siirtää ajatukset joko johtojen kolvaamiseen suoraan Arduinoon, tai omien hyppykaapelien tekemiseen. Yritin tehdä prototyypin valmiilla hyppykaapelelilla, mutta yhteys toimi vain kun johtoja nitkutti ja silloinkin vain hetken. Älä tee samaa virhettä, vaan käytä kunnon johtoja ja liittimiä.

NRF24L01+ radiomoduulit ovat todella nirsoja virtalähteen suhteen. Pienikin heitto jännitteessä heikentää linkin luotettavuutta huomattavasti. Suosittelen kolvaamaan kondensaattorin VCC:n ja GND:n väliin. Kondensaattorin arvolla ei ole kovin suurta merkitystä, kunhan se vain tasaa jännitteen vaihtelua. Itse käytän aina 10μF kondensaattoria, joka tuntuu tasaavan jännitteen vaihtelua mainiosti.


Päivitys 10.11.2018

Koodi on nyt toimiva, mutta kaipaa vielä pientä hiontaa. Tämänhetkisessä koodissa ei voi esimerkiksi laittaa samaa näppäintä useaan painikkeeseen yhtä aikaa. Uuden rungon mallit ovat valmiit, mutta 3d tulostin on niin kehno että saa nähdä kuinka kauan menee tulostaa ne.

Uuden ohjaimen rakenne on myös hyvin monimutkainen, joten saa nähdä onko sitä edes mahdollista tulostaa.

Huom! Kuvassa on prototyyppi! Kiinnitykset olivat mahdottomat käyttää!

Sain alimman osan juuri tulostettua ja sain ilokseni huomata sen olevan liian pieni. Kiinnikkeet ovat myös liian isot mahtumaan yhtä aikaa rei'istä, joten jätin vain vasemmanpuoleiset jäljelle. Lisäsin uuteen versioon 4,6 mm lisää korkeutta, jotta akku ja elektroniikka mahtusivat sinne. Toivottavasti seuraava iteraatio olisi jo toiminnallinen.

Seuraava versio on ihan toiminnallinen, mutta tiukkaa kyllä teki kasata. Ohjain on aivan hervoton palikka, mutta silti tila tuntuu olevan tiukassa.

Ainoana ongelmana on se, etten saa koodia toimimaan kahdella ohjaimella. Saa nähdä löydänkö ratkaisun ongelmaan.


Päivitys 11.11.2018

Koodi toimii nyt kahdella ohjaimella. Vika oli koodissa rf24 piirien osoitteissa. Nappasin nykyiset osoitteet esimerkkikoodista, joka voi aiheuttaa toimintahäiriöitä, jos joku muu sattuu käyttämään lähellä kyseistä testikoodia. Julkaisen koodin GitHubiin, kunhan saan sen hiottua valmiiksi. Voin myös julkaista ohjaimen 3d-mallit, jos joku niin haluaa. Saatan tehdä vielä yhden version jos jaksan. Muuten tämä projekti alkaa olla kyllä melko hyvin kasassa.

Ohjaimessa on siis Arduino Pro Mini 3,3 V versio (ei kannata käyttää 5 V versiota, ellet halua ostaa erillistä 3,3 V regulaattoria.) Jostakin syystä 5 V versio kuluttaa myös enemmän virtaa. En tiedä johtuuko se ulkoisesta regulaattorista, mutta suosittelen kuitenkin ostamaan 3,3 V version suoraan.


Päivitys 13.11.2018

Ohjaimien käytön jälkeen huomasin kulmissa sijaitsevien ohjaustappien olevan liian ohuita. Ohjaustapit ovat jo nyt poikki. Syy voi olla 3d-tulostimen huonossa laadussa, mutta joka tapauksessa on 3d-mallia vahvistettava. Virtakytkin jäi myös laittamatta, joten senkin voisi lisätä. Jos tila riittäisi, niin laittaisin latauspiirin (jossa on vielä varalta suojauspiirit) ohjaimen sisälle ja jättäisin reiän USB-portille latausta varten.


Päivitys 15.11.2018

Ohjaimen sivussa olevat ohjaustapit on suurennettu, sekä tulostuksen seinien määrää on kasvatettu. Koteloon on myös lisätty paikka pienelle virtakytkimelle ja USB-portille latausta varten. Latauspiirissä on myös samalla suojauspiiri. Vaikka akussa onkin jo suojauspiiri, ei toinen ole pahitteeksi. Kyseessä on TP4056 -piiri, joka on survottu samalle levylle suojauspiirien kera.

Älkää sitten kämmätkö kuten minä, vaan laittakaa tuet päälle! Toimihan tuo onneksi ilmankin, mutta yleensä ilmassa roikkuvat härpäkkeet olisi hyvä tukea. Varsinkin jos tulostus tapahtuu suurella nopeudella, tai kyseessä on yhtä toivottomalla tuulettimella varustettu tulostin.


Päivitys 17.11.2018

Muuten hyvä, mutta en saa kaikkea mahtumaan mitenkään ohjaimen sisälle. Pitänee tilata pienempiä akkuja jostakin. Ainoana ongelmana on vain pienien akkujen saatavuus. Kiinasta kyllä saa, mutta toimitusaika on pitkä.

Tämmöinen akku sopisi mainiosti ohjaimeen: https://www.ebay.com/itm/3DC7-493D-402030-Mini-400mha-3-7V-Li-Ion-Battery-Battery-Portable-Small-Handheld/263923491528?hash=item3d7310e2c8:g:hK8AAOSw011bkr2E:rk:1:pf:0

Ohjain vie ulkoisen regulaattorin kanssa n. 14,5 mA ja ilman ulkoista regulaattoria n. 4,6 mA. Tällöin 400 mAh toisi käyttöaikaa 19 h ja 25 min tai ilman ulkoista regulaattoria 60 h ja 52 min.


Päivitys 25.11.2018

Korotin ohjaimen akkukoteloa vielä 4 mm. Nyt sinne mahtuu kohtuu isokin akku. Yllättävän paljon jouduin kyllä nostamaan, kun vasta 8,6 mm nostolla mahtui kaikki elektroniikka sisään. 


Yhteenveto

Käsikonsoli on kohtalaisen hankala kasata, joten teen hyvin todennäköisesti toisen version jossa napit kiinnitetään suoraan PCB:lle.

Tässä projektissa rakensin kaksi Arduinolla toimivaa langatonta ohjainta, joihin voi asettaa haluamansa näppäinpainallukset. Ohjaimen voisi laittaa toimimaan sarjaportin, SPI-väylän tai I2C-väylän kautta, jos ei halua käyttää ohjainta pelaamiseen.

Laitteisto:

- 2 kpl Arduino Pro Mini (3.3 V versio ellet halua käyttää ulkoista regulaattoria. Ulkoisella regulaattorilla saat kuitenkin pitemmän kantaman ohjaimeen ja luotettavamman radiolinkin.)
- Arduino Leonardo (Arduino Pro Micro tai Arduino Micro olisi huomattavasti pienempi, mutten omista kyseistä kehitysalustaa. Luultavasti toimii, jos siinä on vain SPI-liitäntä.)
- 2 kpl NRF24L01+ radiomoduuleja
- 3d tulostettuja osia. Ei välttämättömiä, mutta ne suojaavat elektroniikkaa ja luovat mukavan kokonaisuuden, jota voi pitää kädessä. Ohjaimen voi rakentaa vaikka puusta, jos osaa.
- Ohjelmointilaite Arduinoille (Esim. ft232rl on luotettava usb -> sarjaportti muunnin. Voit myös käyttää ISP-ohjelmointilaitetta, mutta joudut kolvaamaan Arduinoon kyseisen liittimen. Itse käytin usbtinyisp ohjelmointilaitetta ISP-liittimen kautta.)
- 16 kpl 20 mm * 20 mm nappeja
- 2 kpl Li-Ion akkuja (Ehdottomasti suojauspiirillä varustettuna henkilövahinkojen välttämiseksi!)
- 2 kpl Li-Ion suojaus- ja latauspiireja, jos haluat ladata ohjainta USB-kaapelilla. Suosittelen lämpimästi TP4056 -moduuleja, joissa on suojauselektroniikka samalla levyllä.

Kytkentäkaaviot:


Huom! Kondensaattorit eivät ole pakollisia napeille, mutta ne tasaavat signaaleja. Tästä on hyötyä esim. silloin, kun haluat painaa jotakin vain kerran. Pelikäytössä kondensaattorien poisjättö ei tunnu vaikuttavan mitenkään.


Ohjelmisto:


Ohjelmisto kahdelle ohjaimelle:

Jos haluat käyttää kahta ohjainta, käännä ja lähetä gamecontroller_dualcontroller molempiin ohjaimiin. Ota kuitenkin huomioon, että molemmissa ohjaimissa on oltava eri osoite. Tämän voit tehdä avaamalla radioLink.ino koodin ja muuttamalla riviltä 22 löytyvää koodia:

radio.openWritingPipe(address[0]); //for the 1st controller use [0] and for the 2nd controller use [1]

Eli ensimmäiseen ohjaimeen kirjoita näin:
radio.openWritingPipe(address[0]);

Ja toiseen ohjaimeen näin:
radio.openWritingPipe(address[1]);

Vastaanottimeen käännä ja lähetä gamecontroller_dual_receiver_w_keystrokes. Jos haluat nostaa vastaanottimen tehoja, kirjoita radioLink_receive.ino koodiin riville 21 näin:
radio.setPALevel(RF24_PA_MAX);

Jos Arduino Leonardon uudelleenohjelmointi ei onnistu, laita johto maan (GND) ja D2 välille. Jos sekään ei toimi, lähetä haluamasi koodi ensin, ja paina reset -painiketta kahdesti nopeasti kun Arduino IDE etsii sarjaportteja. Resetin painaminen kahdesti pakottaa Leonardon bootloaderiin hetkeä pitemmäksi, joka antaa hetken enemmän aikaa kirjoittaa uuden koodin sisään ennen USB-HID yhteyden käynnistämistä.

Ohjelmisto yhdelle ohjaimelle:

Käännä ja lähetä gamecontroller.ino ohjaimeen ja gamecontroller_receiver_w_keystrokes.ino leonardoon. Muistaakseni mitään muutoksia ei tarvinut tehdä.


Projektin koodit löytyvät GitHubista.

Tässä on kaikkein uusin malli, joka on saanut 8,4 mm korotuksen.
https://a360.co/2QPYNe4


Linkin pitäisi avautua Fusion 360 pilvipalvelussa. Mallin voi ladata suoraan eri tiedostomuodoissa, mutta suosittelen lataamaan fusionin tulostamista varten. Tälläin voit tarkistaa tulostimesi vaatimat toleranssit ja muokata mallia haluamallasi tavalla. Toivon kuitenkin, että arvostat työpanostani, etkä esittele projektejani omanasi.

3D-mallista tulostettavat osat on siis Bodies kansiosta löytyvät new_bottom, new_top ja battery_compartment. Osat saa STL muotoon (se muoto, jota slicer-ohjelmat lukevat) painamalla oikeasta yläkulmasta MAKE ja ottamalla ruksin pois Send to 3D Pint Utility kohdasta. Tämän jälkeen klikkaa vain osaa, jonka haluat tulostaa ja paina OK.