582326 Robottiohjelmoinnin harjoitustyö (4 op), kevät 2010
24.2. Lisätty huomio wiiusej-kirjaston libbluetooth-versioista, kiitos maininnasta Tuomas Starckille
24.2. Lisätty huomio proxy-ohjelman käyttämästä BT-pinosta, kiitos maininnasta Youssef El-Khourille
Wiimoten käyttäminen NXT:n kanssa
Jos sattuu omistamaan Nintendo Wii -pelikonsolin ohjaimia, voi näiden ominaisuuksia hyödyntää robotin kanssa langattomasti. Ohjain ei kuitenkaan suoraan keskustele NXT:n kanssa, vaan väliin tarvitaan myös toinen tietokone, joka lukee ohjaimen arvoja ja lähettää ne NXT:lle.
Ohjaimen ominaisuudet:
- ADXL330-kiihtyvyysanturi, jolla mitataan kiihtyvyyttä kolmen akselin suuntaisesti
- VGA-resoluutioinen infrapunakamera (edessä), joka ainakin kahta vertailupisteinä käytettävää infrapunalähdettä (ledit, kynttilä…) kohti osoitettuna antaa tietoa ohjaimen sijainnista (x,y,z)
- ohjain seuraa pisteitä ja laskee niistä sijaintinsa itse
- värinäyksikkö
- 12 nappia (joista neljä ristiohjaimena)
- Nunchuk-lisäyksikössä myös kiihtyvyysanturi (eri rauta kuin pääohjaimessa: STMicroelectronics LIS3L02AL), tattiohjain ja 2 nappia
- kiinnostavaa on, että Nunchukin tilan voi lukea I2C:llä (näpertelijät huomio)
Mahdollisia käyttökohteita muun muassa:
- kauko-ohjaus
- kallistuksen tunnistus
- tähtäys (IR-kamera seuraa pisteitä)
- navigoinnin apu
- asennon korjaus
- jne.
Koodia
Hae ensin tarvittava lähdekoodi täältä. Koodin käyttäminen vaatii wiiusej-kirjaston (suora linkki pakettiin). WiiNXT_Proxy ei tällä hetkellä tue Nunchukia. Ominaisuuksiin kuuluu nappien lukeminen, infrapunakamera, liikkeentunnistus, värinä, tiedon lähetys koneelle ja valikoiva tiedonsiirto.
WiiNXT_Proxy käännetään javac:llä ja suoritetaan tietokoneessa (ei NXT:ssä).
NXT:llä ajettavassa ohjelmassa voidaan käyttää WiiNXT-luokkaa:
// luo WiiNXT ja muodosta yhteys proxyyn WiiNXT mote = WiiNXT.getInstance();
WiiNXT:n luomisen yhteydessä odotetaan yhteyttä tietokoneen proxy-ohjelmalta, joka taasen käynnistyessään etsii ja muodostaa yhteyden ohjaimeen. Kun yhteys on muodostunut, voidaan muun muassa arvoja lukea.
Koska infrapunakamera ja liikkeentunnistus kuluttavat paristoja, ne voidaan haluta kytkeä pois päältä jos ominaisuuksia ei tarvita. Tiedonsiirron pitämiseksi vähäisenä WiiNXT kommunikoi WiiNXT_Proxyn kanssa käyttäen yksinkertaista protokollaa, jossa kone odottaa käskyä NXT:ltä. NXT lähettää kontrollikoodin (int), jonka asetetut bitit kuvaavat haluttuja toimintoja. Kontrollikoodi voi siis sisältää useita käskyjä. Sensorien arvoista voi valita lähetettäväksi vain ne, joita tarvitaan (ks. kohta Aseta tila
).
Lähetysvalinnat ovat vähän sekavasti toistaiseksi: setMode:lla oikeastaan tehdään asioita jotka koskevat read()-metodia yms.
// halutaan kiihtyvyysarvot ja nappien tilat, kytketään liikkeentunnistus päälle
mote.setMode(WiiNXT.RECVMOTION | WiiNXT.RECVBUTTONS | WiiNXT.MOTIONON);
// päivitetään ohjaimen tila
mote.read();
// nyt mote-oliosta voidaan lukea senhetkiset arvot
System.out.println(""+mote.buttonA()+", "+mote.pitch());
// tulosta koko ohjaimen tila
System.out.println(""+mote.state());
Käyttö
- pura wiiusej ja lisää wiiusej.jar CLASSPATH-ympäristömuuttujaan
- käännä proxy-ohjelma
javac -6 WiiNXT_Proxy.java
- käynnistä proxy-ohjelma seuraavasti:
java WiiNXT_Proxy 00:16:53:0A:8E:D4
- missä numerosarja on palikkasi bluetooth-osoite
- ohjelma jää odottamaan enterin painallusta
- käynnistä NXT:n ohjelma yhteydenmuodostustilaan (WiiNXT.getInstance())
- paina ohjaimesta yhtä aikaa nappeja 1 ja 2, jolloin ohjain siirtyy hakutilaan ja ledit vilkkuvat
- paina enteriä proxy-ohjelmasta, jotta yhteys muodostuu
- ohjain värähtää kun yhteys on muodostettu
Jos yhteydenmuodostus ei onnistunut, kannattaa koittaa uudestaan rauhallisemmin.
Huomio WiiNXT_Proxystä:
WiiNXT_Proxy-luokan rivillä 257 lukee seuraavaa:
Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(n, true, WiiUseApiManager.WIIUSE_STACK_MS);
Ilmeisesti Windows XP:llä (WIDCOMM-bluetooth-ajuri) tämän rivin pitää mahdollisesti olla:
Wiimote[] wiimotes = WiiUseApiManager.getWiimotes(n, true, WiiUseApiManager.WIIUSE_STACK_UNKNOWN);
Jos ongelmia on bluetooth-ajurin lataamisessa, bluecoven jar:n sisältyminen CLASSPATHiin kannattaa varmistaa.
Huomio wiiusej:stä:
Lainaus wiiusej:n kotisivun uutisista:
18/01/09: A different news but an important one :D Thanks to Young-Jae i added in the download section the new libwiiuse.so for linux. He pointed out the fact that Ubuntu Intrepid (8.10) now uses libbluetooth version 3 instead of version 2. He recompiled it and made it available to everyone else. Greetings to him ! Download is here : http://wiiusej.googlecode.com/files/libwiiuse.zip
Lista tärkeimmistä toiminnoista
Aseta tila
setMode muuttaa ohjaimen tilaa sille annetulla kontrollinumerolla (koodit on määritelty WiiNXT-luokassa ja ovat kahden kerrannaisia). RECVMOTION, RECVBUTTONS ja RECVIR eivät varsinaisesti tee mitään ohjaimelle, vaan vaikuttavat vain siihen, mitkä arvot read() pyytää koneelta:
- RECVMOTION = halutaan kiihtyvyysarvot kutsuttaessa read()
- RECVBUTTONS = halutaan nappien tilat kutsuttaessa read()
- RECVIR = halutaan kameran arvot kutsuttaessa read()
- MOTIONON = kytke liikkeen havainnointi päälle
- MOTIONOFF = kytke liikkeen havainnointi pois
- IRON = kytke infrapunakamera päälle
- IROFF = kytke infrapunakamera pois
- RUMBLEON = kytke värinä päälle
- RUMBLEOFF = kytke värinä pois
- TRANSMIT = halutaan lähettää tietoa (write() käyttää tätä → käytä write():a)
Kontrollikoodilla NXT ilmoittaa koneelle, pitäisikö sen lähettää ohjaimen arvot, muuttaa ohjaimen tilaa tai vastaanottaa dataa NXT:ltä.
- yhdellä kontrollikoodilla voidaan tehdä monta asiaa samalla kertaa
- halutut toiminnot yhdistetään yhdeksi numeroksi käyttämällä OR-bittioperaatiota '|'
- käytä write()-metodia tiedon lähettämiseen NXT:ltä koneelle
- rajoituksena tällä haavaa on, että RECVMOTION/RECVBUTTONS/RECVIR -optioita ei voi kätevästi kytkeä pois päältä (ja protokolla on muutenkin hieman sekava).
// halutaan lukea IR-arvot mote.setMode(WiiNXT.RECVIR | WiiNXT.IRON); // mote muistaa mitkä arvot kysytään koneelta (tässä IR) mote.read();
Ohjaimen ominaisuudet
public synchronized void setRumble(boolean active); // kytke värinä päälle/pois public synchronized void setIR(boolean active); // kytke IR päälle/pois public synchronized void setMotionDetection(boolean active); // kytke liiketunnistus päälle/pois
Sensoriarvojen päivitys
public synchronized void read (); // päivitä (setModella valitut) sensoriarvotHuom! Vaikka ohjaimelle olisi annettu setModella RECVMOTION, eivät arvot päivity ellei myös MOTIONON ole päällä.
Datan lähettäminen
Dataa voi lähettää NXT:ltä tietokoneelle samalla yhteydellä:
public synchronized void write (int[] data); // lähetä taulukkoEsimerkki:
mote.write(new int[]{ 50, 120, 500, 3000 });Write() ilmoittaa proxy-ohjelmalle haluavansa lähettää tietoa ja kertoo kuinka pitkä kokonaislukutaulukko (int) lähetetään. Proxy lukee lähetetyn datan ja voi käyttää sitä johonkin (esim. tulostaa sen).
Aksessorit
public float pitch(); // nyökkääminen public float roll(); // kallistuminen public boolean buttonA(); // nappi A public boolean buttonB(); // nappi B public boolean buttonOne(); // nappi 1 public boolean buttonTwo(); // nappi 2 public boolean buttonPlus(); // nappi + public boolean buttonMinus(); // nappi - public boolean buttonHome(); // nappi Home public boolean buttonUp(); // nuoli ylös public boolean buttonDown(); // nuoli alas public boolean buttonLeft(); // nuoli vasemmalle public boolean buttonRight(); // nuoli oikealle public short buttons(); // kaikkien nappien tilaNämä vaativat IR-kameran kytkemistä päälle:
public float yaw(); // kääntyminen public int X(); // ohjaimen osoittama X-koordinaatti public int Y(); // ohjaimen osoittama Y-koordinaatti public float Z(); // ohjaimen etäisyys vertailupisteestäMuuta:
public int getLastRequest(); // viimeisin koneelle lähetetty kontrollikoodi public String state(); // palauttaa kaikki arvot yhtenä ruudullisena tekstiä
Lisätietoa
Wii Remote (Wikipedia)

