19.10.2014

Futaba s3003 feedback mod

Testattu, toimii - avataan se.
Sähkövaihdeprojektin osaprojektit jatkuvat. Takavaihtajaa liikuttelevaa servoa on helppo komentaa siirtymään johonkin tiettyyn asentoon, mutta jälkikäteen servosta ei voi lukea, mihin asentoon se jäi. On toki olemassa kalliimpia ja ilmeisesti parempia servoja, joissa tällainen ominaisuus löytyy ("open loop" tai "feedback" servo) mutta yllätys kyllä, halvin lähikaupan hyllystä löytynyt standardikokoinen servo (Futaba s3003) ei ole sellainen.

Toiset asiat täytyy tehdä itse ja toiset asiat saa tehdä itse.

"Nyt mä oon iskä, mä saan päättää."

Takakansi auki.
Toisinaan se sisäinen pikkupoika kikattelee ja kiljuu riemusta, kun uuden ja ehjän lelun saa avata ihan luvan kanssa - oman luvan, tottakai. Servon takakansi aukesi helposti neljä ruuvia irrottamalla ja kannen alta paljastui servon ohjauspiiri.

Asento ja kuinka se tunnistetaan?

Jotta servo itse tietäisi missä kohdassa se on menossa, servoissa on potentiometri. Potentiometri kertoo ohjauselektroniikalle tiedon servon asennosta. Potentiometreissä on kolme nastaa:
  1. vasen reuna
  2. pyyhkijä
  3. oikea reuna
Pienellä yleismittaroinnilla ja valistuneella arvauksella ohjainpiiristä löytyi kolme rinnakkaista juotosta, joista kuvassa ylin kontakti oli yhteydessä servon maajohtoon. Bingo, joka varmistui mittaamalla vastusarvoja samalla kun käänteli servoa edestakaisin.
Futaba s3003 ohjainpiiri, potentiometrin kontaktit ympyröitynä.
Servon asentotiedon luku perustuu yksinkertaiseen kikkaan. Juotetaan yksi ylimääräinen johto servon piirilevylle ja seurataan potentiometrin arvoa myös servon ulkopuolelta.

Vihreä johto lukee potentiometriä.
Rajoitettu määrä käsiä ja aikaa esti minua ottamasta parempia kuvia, mutta kaiketi sen lopputuloksen näistäkin näkee. Mittasin vihreän johdon samanpituiseksi kuin muutkin johdot, kuorin ja esitinasin johtimen pään ja pienen kohdistus-tasapainotusleikin jälkeen kosketin potentiometri/johtoyhdistelmää kolvilla.

Jäikö varaosia?

Takaisin yhtenä palasena.
Osien kokoaminen takaisin ehjäksi servoksi käy luonnollisesti täsmälleen päinvastaisessa järjestyksessä kuin servon purkaminen. Ongelmana on vain se, että perinteisten ylimääräiseksi jäävien osien sijaan servossa on nyt enemmän osia kuin sitä avattaessa.

Jotta kotelon sai takaisin kiinni, avarsin pienellä viilalla kolon servon koteloon uutta johdinta varten. Mielestäni loogisin paikka uudelle johdolle oli alkuperäisten vieressä ja pienen askartelun jälkeen kansi sulkeutuikin taas nätisti.

Mitataan se!

Maajohto - musta, pyyhkijä - vihreä
Mittaus tapahtui ensin lukemalla potentiometrin palauttamia arvoja yleismittarilla. Oletuksena oli, että maajohtimen ja uuden johtimen välinen vastusarvo muuttuu, kun potentiometriä (=servon vipua) liikuttaa.

Kuvasarja yleismittarin tuloksista servon eri asennoissa.
Yleismittarin näyttämät arvot vaihtelivat 0,67 ja 2,12 kOhm välillä, joten uskalsin kytkeä servon kiinni arduinoon / johtosarjaan ja katsoa mitä tapahtuu.

Testikytkentä.
Ilman testiohjelmaa ei tapahdu tietenkään mitään, joten kirjoitin sellaisen. Kaikessa yksinkertaisuudessaan ohjelma liikuttaa servoa edestakaisin laidasta laitaan 10 asteen välein ja lukee potentiometrin arvon joka askeleella. Askeleiden välissä ohjelma tulostaa sekä servolle kirjoitetun että potentiometriltä luetun arvon sarjaporttiin. Lopuksi kopioin arvot sarjaporttia kuuntelevasta konsolista taulukkolaskentaohjelmaan.

Tulokset

Futaba s3003 potentiometrin mittausdata.
Maltoin odottaa kaksi kokonaista 0-180-0 asteen kierrosta ennen numeronmurskausta. Taulukon vasemmassa reunassa on servolle kirjoitettu asentotieto angle. Seuraavat neljä up/dn -saraketta kertovat servon potentiometriltä luetun asentotiedon arvon liikuttaessa myötä- (up) tai vastapäivään (dn). Avg -sarakkeeseen on laskettu neljän mittauksen keskiarvo.

Map() angle -sarake on hieman monimutkaisempi. Sarakkeeseen on asetettu arduinon map() -funktion referenssistä löytynyt kaava, jolla voidaan skaalata arvojoukkoon kuuluva luku toiseen arvojoukkoon. Sarakkeissa min() ja max() on tähän kaavaan liittyvät ensimmäisen arvojoukon rajat, jotka ovat suurin ja pienin potentiometriltä luettu arvo. Sarakkeet out_min ja out_max määrittävät halutun kohde-arvojoukon rajat, tässä tapauksessa asteluvut 0-180.

Vertaamalla Map() angle -sarakkeen arvoja angle -sarakkeen arvoihin voidaan todeta, että potentiometriltä luettu arvo vastaa kohtuullisella ja ennen kaikkea käyttökelpoisella tarkkuudella servolle syötettyjä arvoja.

Kehitysehdotuksia

Osa syötettyjen ja luettujen arvojen välisestä erosta on kompensoitavissa map-funktion lähtöarvojoukkoa muokkaamalla. Esim. max() -arvon muutos absoluuttisesta maksimiarvosta mittausten keskiarvoon tuottaa map() angle -sarakkeeseen yhtä arvoa vailla täsmälleen servolle syötetyn lukusarjan.

Toinen tapa parantaa mittaustarkkuutta olisi skaalata servolta luetut arvot jo rautatasolla laajemmalle alueelle, sillä nykyinen arvojen vaihteluväli 177-368 on vain murto-osa arduinon analogimuuntimen tarjoamasta 0-1023 -skaalasta. Skaalaaminen ei ole kaiketi kovin vaikeaa, se vaatisi vain sopivan ulkoisen jännitereferenssin kytkemistä arduinon aref-pinniin. Silti, toistaiseksi tämä harjoitus on vasta mielikuvien asteella.

Ei kommentteja :

Lähetä kommentti