Rakentelut siinä vaiheessa, että uskaltaa uhota joskus tulevan valmistakin...
Tiedän jo nyt että kirjoituksesta tulee pitkä... Tarkoituksena vähän itsellekin saada ylös missä vaiheessa on menty ja milloin.
Tällaista lähdetään hakemaan:
YoutubeVarmaankin yksi monimutkaisimmista Lego-härveleistä ikinä...
Idea:4 nxt:tä, 12 servoa, muutama pf-palikka ja paineilmaa, näillä pitäisi saada homma tehtyä.
Valmiissa laitteessa tulee olemaan siis kaksi 6 akselista robottikättä (7 jos tarttujan liike lasketaan). Tarttujan liike olisi tarkoitus toteuttaa paineilmalla.
Itse ratkaisu tapahtuu seuraavasti:
1. Kuutio kuvataan web-kameralla*
2. Läppäri* lähettää bluetoothilla nxt:lle ratkaisun
3. Kädet pyörittelee kuution ohjeiden mukaan
4. Voilà
*Läppäri ja web-kamera korvattu älypuhelimella
Tilanne nyt:
Näyttää keskeneräiseltä, mutta oikeasti tässä vaiheessa aika paljon on jo tehty. Käsi on saanut paljon vaikutteita Akiyukyn robottikädestä (
Youtube), mutta on huomattavasti tukevampi rakenteeltaan. Lisäksi kaikki välitykset ovat tuntuvasti hitaampia. 100g painava ruubikin kuutio on yllättävän iso puntti tuollaisen käden päähän...
Mitä on valmiina:Kinematiikka: Robottikäsissä työlästä on ohjaus. Usein näkee robottikäsiä, mitkä liikuttavat yhtä niveltä/moottoria kerrallaan. Itselle kuitenkin oli ihan alusta lähtien selvää, että lähdetään hakemaan jotain luonnollisen näköisiä liikeratoja, missä kaikki nivelet liikkuvat samanaikaisesti. Koodi siis antaa servolle jatkuvasti paikkatietoa siitä, missä sen tulisi milläkin ajan hetkellä olla. Tätä ajasta riippuvaa paikkaa voidaan sitten pyörittää ihan miten halutaan. Nyt Robottikäsi aloittaa ja lopettaa kaikkien nivelteen liikkeen samanaikaisesti.
Servo-ohjaus: Näköjään valmiina ei NXC:stä löytynyt komentoa, jolla servon saisi seuraamaan jatkuvaa inputtia halutusta paikasta. Erilaiset valmiit servo-ohjausmenetelmät lähinnä sekoittivat NXT:n raskaudellaan tai saivat aikaan pahaa värinää tai muuten epätasaista liikettä. Tähän ratkaisuna oli itse tehty kevyempi PID-ohjain, joka säätää servon nopeutta sen asennon ja tavoitteen erotuksen (eli virheen) mukaisesti suoraan virheen suuruuden, sen aikaintegraalin ja sen aikaderivaatan mukaan. Näistä löytyy netistä paljon lisää infoa jos kiinnostaa..
PID-ohjaimen tekeminen oli ehkä kuudes yritys saada käsi liikkumaan jotenkin sulavasti...
Tässä nopea koodipätkä jolla kokeilimme ajaa moottoreita. Vaatii siistimistä ja joitain lisäyksiä. Toimii kuitenkin kohtuullisesti.
task PIDcontrol ()
{
int proportionalA,proportionalB,proportionalC;
float integralA,integralB,integralC;
float errorA,errorB,errorC;
long timeI;
while(true)
{
currentA = MotorRotationCount(OUT_A);
currentB = MotorRotationCount(OUT_B);
currentC = MotorRotationCount(OUT_C);
errorA = currentA - toA; //jos currentA paikalle MotorRotationCount(OUT_A) nii crashaa oudosti
errorB = currentB - toB;
errorC = currentC - toC;
proportionalA = pGain * errorA; //Adjust proportional values
proportionalB = pGain * errorB;
proportionalC = pGain * errorC; //Add derivative part here
if(errorA < -1 || errorA > 1)
integralA += iGain * errorA * (CurrentTick() - timeI); //Adjust integrative values
if(errorB < -1 || errorB > 1)
integralB += iGain * errorB * (CurrentTick() - timeI);
if(errorC < -1 || errorC > 1)
integralC += iGain * errorC * (CurrentTick() - timeI);
timeI = CurrentTick(); //Time for integral
if(errorA < -1 || errorA > 1) //Adjust motorpowers if |error| > 1
OnFwd(OUT_A,limitPower(proportionalA + integralA));
else if(moveStop == 1)
Off(OUT_A);
if(errorB < -1 || errorB > 1)
OnFwd(OUT_B,limitPower(proportionalB + integralB));
else if(moveStop == 1)
Off(OUT_B);
if(errorC < -1 || errorC > 1)
OnFwd(OUT_C,limitPower(proportionalC + integralC));
else if(moveStop == 1)
Off(OUT_C);
}
}
Palikoiden välinen kommunikointi: Oma luotto nxt:n bluetoothiin on pieni. Ainakin jos 4 nxt:tä pitää yhdistää bluetoothilla toisiinsa ja yksi läppäriin kun vain yhdessä on toimiva näyttö... Päädyttiin siihen, että yksi nxt on bluetoothilla kiinni läppärissä ja ohjaa muita valosensoreita vilkuttamalla. Koodi, joka lähettää ratkaisun muille nxt:lle ja tahdittaa liikkeitä, on valmis ja vaikuttaisi toimivan hyvin. Ainakin testaillessa ei valoilla tullut yhtäkään virhettä. Lisäksi kivaa on se että laitteen voi laittaa päälle ilman hirveää säätöä kaikenlaisten asetusten kanssa.
Ratkaisualgoritmi: Tämä on ihan puhtaasti kolmannen osapuolen tekemä ja meidän tarpeisiin sovitettu. Läppärillä pyörii ohjelma, joka kuvaa kuution kaikki sivut ja lähettää sen bluetoothilla (tai usb:llä) nxt:lle. Tämä algoritmi valittiin siksi, että se ratkaisee kuution noin 21 siirrossa, kun omat yritykset olisivat jääneet paljon suurempiin siirtomääriin. Jos laite ratkoo kuutiota messuilla esim. tunnin, niin aika monen mielenkiinto ehtii loppua...
Mitä puuttuu?Paineilma: Baseplaten päälle olisi tarkoitus laittaa ainakin paineilmaa ohjaavat venttiilit, kompressori ja paineilmasäiliö. Tämän pitäisi olla hyvin suoraviivainen homma. Lisäksi yksi NXT:istä ohjaamaan kompressoria paineen mukaan.
Tarttuja: On melkolailla valmis, mutta vaatii hienosäätöä. Näillä näkymin kuution joka sivun keskellä on magneetti (näkyy kuvassa), joka varmistaa hyvän otteen joka siirrolla ja poistaa virheen keskittämällä kuution aina uudestaan.
Toinen käsi: Helppo mutta työläs homma, pitäisi rakentaa toinen samanlainen... Samalla muuttaa kaikki vääränväriset osat.
Koppa: Homman ympärille jonkinlainen kuori, jottei ihan kaikki sisuskalut näy ulospäin, niitä kun ei aiota siistiä millään lailla. Tähän kaipaan ideoita: Millainen olisi helppo tapa toteuttaa siisti kuori?
Kuution pidike: Jonkinlainen teline mihin kuutio alussa laitetaan. Jotenkin ylitsepääsemättömäksi on muodostunut siistin tasasivuisen kolmion väsääminen...
Muuta: Baseplatet pitäisi kiinnittä esim. vanerilevyyn tukevuuden lisäämiseksi ja kuljettamisen helpottamiseksi. Lisäksi NXT:ille pitäisi rakentaa verkkovirtalähde.
Kaiken yhteensovittaminen: Varmaan työläin osa missä ongelmia alkaa tulla vastaan.
Muokattu 5 kertaa. Muokattu viimeksi 16/11/2017 20:40.