Yliopiston etusivulle Suomeksi Inte på svenska No english version available
Helsingin yliopisto Tietojenkäsittelytieteen laitos
 

Tietojenkäsittelytieteen laitos

582326 Robottiohjelmoinnin harjoitustyö (4 op), kevät 2010

Kurssin etusivulle

Ohjehakemisto

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

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ö

  1. pura wiiusej ja lisää wiiusej.jar CLASSPATH-ympäristömuuttujaan
  2. käännä proxy-ohjelma
    javac -6 WiiNXT_Proxy.java
    
  3. 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
  4. käynnistä NXT:n ohjelma yhteydenmuodostustilaan (WiiNXT.getInstance())
  5. paina ohjaimesta yhtä aikaa nappeja 1 ja 2, jolloin ohjain siirtyy hakutilaan ja ledit vilkkuvat
  6. 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) sensoriarvot

Huom! 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ä taulukko

Esimerkki:

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 tila

Nä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)

Ohjaimen infrapunakameran hyötykäyttöä

Nunchuk + I2C + Arduino