Puinen syvyyskartta

Joululahjalistalla oli tehdä syvyyskartta kesämökin lähivesistä kalastukseen koukkuun jääneelle sukulaiselle. Idean sain Hackadaysta, jossa oli esillä vastaava vanerikerroksista tehtynä. Itse päädyin valitsemaan materiaaliksi harmaalepän, jota Hacklabilla on jokunen tuppeensahattu lauta. Työstämiseen käytin Hacklabin itserakennettua CNC-jyrsintä, jossa on Makitan yläjyrsin ja tietokoneohjaus sen liikutteluun.

Karttaa varten tarvitsin tarkat syvyystiedot. Retkikartta näyttää syvyystiedot vain n. 5 metrin välein, ja lisäksi niitä on vaikea siirtää bittikarttatiedostosta muihin ohjelmiin. Suomessa järvien syvyystietoa hallinnoi ympäristökeskus, jolla on kiitettävästi avointa dataa saatavilla. Syken latauspalvelu LAPIO ei tarjonnut tietoja haluamassani muodossa, mutta karttapalvelu KARPALO mahdollisti pelkkien syvyyskäyrien piirtämisen bittikarttakuvaan. Lisäksi käyrille sai itse määrittää värit, minkä tein harmaasävyillä logiikalla että esim. 100 = 10 metriä. Haluamani alueen maksimisyvyys oli sopivasti 25 metriä, joten 8 bittiä riitti hyvin ja 255 jäi taustan väriksi.

Sykenkään tiedoissa ei kuitenkaan ollut syvyyskäyriä tarkemmin kuin 1, 3, 6, 10, 15, 20, 25 metrin kohdilta merkittynä. Halusin karttaan 1 metrin välein käyrät, joten tarvittiin interpolointia. Aluksi kokeilin vain blurrata bittikarttaa ja sitten pyöristää lähimpään 1 metriin, mutta se tuhosi yksityiskohtia jyrkillä alueilla eikä pehmentänyt tasankoja tarpeeksi. Tein interpolointiin oman Python-skriptin, joka ottaa syötteeksi yllä näkyvän contours.png:n. Jokaisen valkoisen pisteen kohdalla se etsii 5 asteen välein joka suuntaan lähimmän syvyyskäyrän, ja laskee keskiarvon niiden välillä etäisyyden mukaan painottaen. Tällä tavalla alueilla joissa syvyyskäyrät ovat tiheässä pehmennetään vähemmän, ja tasaisilla alueilla enemmän.

Retkikartassa on kuitenkin myös ns. syvyysluotauspisteet näkyvillä, eli yksittäisiä kohdat joista syvyys on mitattu. En saanut näitä ladattua tiedostomuodossa, mutta piirsin ne käyrien joukkoon käsin kuvankäsittelyssä. Tällä tavalla pääkäyrien väliin saa enemmän tietoa syvyystasoista. Hyödynsin hieman omaa päättelyä saman syvyyksisten pisteiden yhdistämisessä, jolloin sama interpolointimenetelmä toimii näillekin. Lisäksi täytin kuvankäsittelyssä maa-alueet valmiiksi mustalla, ihan vain skriptin pyörimisen nopeuttamiseksi.

Tuloksen muutin vektorikuvaksi Inkscapella, hyödyntäen ”Trace bitmap” ja ”Brightness level” toimintoja. Tässä olisi varmaan ollut kätevämpiäkin työtapoja, mutta itse vein kunkin tason erilliseen .dxf-tiedostoon, jotka yhdistin OpenSCAD:lla 3D-kuvaksi:

Saatuani OpenSCADista .stl-tiedoston, siirryin BlenderCAM:n puolelle. Aluksi yritin tehdä jyrsintäpolut FreeCAD:n Path-toiminnolla, mutta se tukehtui tuohon karttamalliin, ilmeisesti siinä oli liikaa pisteitä. BlenderCAM selvisi hommasta kunnialla. Aluksi jyrsin 8 mm terällä käyttäen parallel-asetusta, jossa terä liikkuu edestakaisin ja vaihtaa syvyyttään mallin mukaan. Viimeistelynä jyrsin 3 mm terällä waterline-polun, jossa terä seuraa kunkin syvyystason reunoja.

Ensimmäisenä fyysisen maailman toimenpiteenä sahasin n. 40 cm pitkän pätkän puuta ja höyläsin sen pinnat suoriksi. Taustapuolelle tein kaksi 7mm reikää, joihin puuruuvin kanta sopi tiiviisti. Näitä käytin kappaleen kiinnittämisessä jyrsimen alustaan. Kun ruuvit olivat jyrsimen alustalevyssä kiinni, pystyin irrottamaan ja laittamaan työkappaleen täsmälleen samaan kohtaan takaisin. Sivuilta kiristin sen alustaa vasten parin puupalikan avulla. Alla olevassa kuvassa näkyy vielä FreeCAD:n adaptive-työstöpolku, jota kokeilin ennen BlenderCAMiin vaihtamista.

Harmaaleppä on melko pehmeä puu, ja viimeistelyvaiheessa käyttämäni jyrsintä- ja teränopeus ei varmaan ollut aivan optimaalinen. Sen seurauksena tulokseen jäi melko paljon hapsottavia puukuituja. Tässä vaiheessa olin kuitenkin sen verran kyllästynyt tietokoneen kanssa puuhailuun, että päädyin viimeistelemään reunat käsin pienillä kaiverrustaltoilla ja hiomalla. Kerros akryylilakkaa kovetti puukuidut ja teki niiden katkaisemisesta helpompaa.

Maalasin syvyystasot käsin akryylimaaleilla. Kartan otsikkotekstit tein jyrsimällä 1 mm terällä urat, jotka täytin mustaksi värjätyllä epoksiliimalla ja raaputin tasaiseksi. Pintakäsittelynä on puualueilla mehiläisvaha ja akryylimaalien päällä 2-komponenttispraylakka, jota oli autopuuhista jäänyt yli. Lisäsin karttaan yksityiskohtana myös alueella menevän venereitin ja sen opastetolpat. Oikeassa kartassa on merkattuna myös mökin sijainti, mutta tästä kuvasta editoin sen yksityisyyssyistä pois.

Laserleikkuri käyttökunnossa

Pitkällisen säätämisen jälkeen Helsingin hacklabilta saatu K40-laserleikkuri on nyt käytettävissä. Matkan varrelle on mahtunut mm. aikanaan muutossa rikki menneen putken vaihto ja paljon johdotuksen parantelua.

Laserleikkurin ohjeet löytyvät wiki-sivulta.

Alla kerron hieman projektista ja vielä todo-listalla olevista jutuista.

Johdotus

Leikkurin tullessa Jyväskylään oli se periaatteessa käyttökuntoinen, mutta siihen oli vuosien varrella tehty selvästi moneen kertaan modauksia. Sen seurauksena lähes kaikissa johdoissa oli väliliitoksia, johdotus oli melkoinen sekamelska ja osassa liittimistä oli kontaktihäiriöitä.

Jarno uusi erityisesti verkkosähköpuolen kytkennät ja itse jatkoin pienempijännitteisten kytkentöjen parantelua. Lisäksi asensin laserin kotelon sisälle 1200-wattisen 12 voltin virtalähteen, josta saadaan virransyöttö vesipumpulle ja poistoilmapuhaltimelle.

Ohjainkorttina laitteessa on jonkinlainen Kiinalainen Smoothieboard-klooni. Siinä on verkkoliitin, joka lähti toimimaan kun sen jalassa ollut puuttuva juotos korjattiin. Näin ohjaus saatiin näppärästi palvelimelta TCP:n yli.

Leikkuualusta

Alkuperäinen K40:n leikkuualusta on varsin hankala. Siinä on kiinnityskohta vain aika pienelle, n. 10x20cm kappaleelle, jolloin suurin osa leikkuualueesta jää hyödyntämättä. Lisäksi alustan korkeutta ei voi säätää, jolloin tarkennusetäisyys on useimmiten väärä ja kaiverrusjälki epätarkkaa.

Löysin netistä näppärän jousitetun leikkuualustan suunnitelmat, ja tein vastaavan. Leikkuualusta on alapuolelta jousitettu, ja nurkissa on 3D-tulostetut kappaleet jotka pitävät leikkuualustan yläpinnan oikealla korkeudella. Asettamalla kulmien väliin halutun paksuinen palikka saa leikkuualustaa helposti siirrettyä oikealle korkeudelle, niin että kaiverrettava yläpinta pysyy aina samalla korkeudella.

Vielä tehtävää

  • Jäähdytysveteen on tarkoitus lisätä virtausanturi ja hälytys siltä varalta että pumppu hajoaisi tai vesi lämpenee liikaa.
  • Veden pitämiseksi kylmänä voisi keksiä jonkin ratkaisun, esim. kylmäkalle tai jäähdytin.
  • Johdotus olisi hyvä dokumentoida.
  • Erilaisille materiaaleille pitää kerätä sopivat asetukset.
  • Poistoilmapuhallin puhaltaa nyt suoraan pihalle. Ajatuksena olisi virittää jonkinlainen kaasupesuri enimpien höyryjen poistamiseksi.
  • Jäähdytysveteen voisi lisätä jotain levänestoainetta, netissä on vertailu.
  • Kannessa oleva suojapleksi on jotenkin mennyt sumeaksi joistain kohdista, siihen voisi vaihtaa uuden ja laittaa uudet heijastuskalvot hajasäteitä estämään.

3D-tulostimelle kaappi

Hacklabille on Miikan kautta päätynyt puolikorkea räkkikaappi, johon paremman käytön puutteessa päätettiin sijoittaa 3D-tulostimet. Kaapista puuttui erinäisiä osia, mm. oven saranat, joten tein korvaavat teräksestä. Helsingin hacklabilta saatu pieni jyrsinkone puree onneksi rauhallisesti käytettynä teräkseenkin. Oven rikkinäisen lukituksen korvasin kiintolevymagneetilla, joka nappaa kiinni teräskehyksestä melkeimpä liiankin hyvin.

Muovin sulattamiseen perustuvissa 3D-tulostimissa on aina jonkinasteinen tulipaloriski, vaikka nykyaikaisissa laitteissa onkin erinäisiä ohjelmallisia turvamekanismeja. Metallinen kaappi lisää merkittävästi turvallisuutta estämällä kuumien osien joutumista kosketuksiin syttyvien materiaalien kanssa, ja mikäli kaapin sisällä jotain leimahtaisi, estämällä palon leviämistä. Tätä silmälläpitäen tein kaapin hyllyt metallikiskolla vahvistetusta kipsilevystä, joka ei pala.

Alunperin ajatuksena oli sijoittaa kaappiin kaksi tulostinta, mutta tämänhetkisellä rullapidikkeellä varustettuna kaappiin mahtui vain tuo uudempi Prusa i3 MK3S. Tosin rullat voisivat olla mahdollisesti tulostimen takanakin, mutta toisaalta aika vähän noita muita tulostimia on käytetty. Nyt tulostimen alle jäi vielä tilaa muovirullien säilytykseen.

Lisäturvallisuutta tuo jatkojohto, johon viritin lämpötilakatkaisun ja mahdollisuuden kytkeä palohälyttimestä signaali. Labin bonkkilaatikoista löytyi ns. master-slave -ohjattu jatkojohto, joka tehdasversiona kytkee slave-porteista sähkön pois kun master-portin virta alittaa raja-arvon. Sisällä oli siten valmiina tarvittava relekytkentä, jota ohjaavaa operaatiovahvistinkytkentää piti vain muokata hieman. Jatkojohdon alkuperäiset sisukset olivat varsin tökerösti juotetut, mutta nähdäkseni kuitenkin riittävän turvalliset käyttöön.

Tein operaatiovahvistimella bistabiilin portin, jonka 22 µF kondensaattori pakottaa päälle kun virta kytketään. Myöhemmin jos joko NTC tai optoerottimen kautta tuleva palohälytinsignaali aiheuttaa katkaisun, ei virta palaa päälle ennen kuin sen katkaisee kytkimestä pariksi sekunniksi. Jatkojohdossa valmiina ollut virtarajan asettamiseen tarkoitettu potentiometri sopii hyvin myös lämpötilarajan asetteluun.

Houkuttelevaa voisi olla mahdollistaa tulostaminen täysin etänä. Tätä varten täytyisi lisätä vielä webbikamera ja jonkinlainen etähallinta vaikka raspberryllä, sekä tietysti hallituksen päättää pelisäännöistä etätulostuksen turvallisuuden suhteen.

Robokäden takaperinsuunnittelua

Pitkästä aikaa olen taas ihmetellyt robokäden ohjausta. Yksi iso ongelma on pitkään ollut vaikeudet sarjaporttikommunikoinnissa. Käytössä olevan palvelin-PC:n emolevyllä oleva sarjaportti osoittautui viime syksynä epäluotettavaksi, ja tilalle hommasin neljän sarjaportin USB-purkin. Se ratkaisi ongelmat robottikädeltä PC:n suuntaan yhteydessä, ja tekemäni Robot Operating System -integraatio alkoi suurinpiirtein toimia.

Tavallaan lähellä ollaan, mutta ei sitten kuitenkaan – yhä jokin kirjaimellisesti tökkii liikkeiden ohjauksessa. Robotin liikkeet ovat jotenkin nykiviä ROS:n kautta ajettuna. Debuggailun tuloksena päädyin siihen, että käskyjä robottilaitteen päässä vastaanottava koodi pyörii liian hitaasti. Tiedossa on, että C500-robottiohjaimessa on 100MHz:n 486-prosessori, joka ajaa jotain hyvin omaperäistä käyttistä joka vähän muistuttaa Unixia. Purkilla on myös kääntäjä RAPL-3 kielelle. Jo aiemmin olen yrittänyt purkaa käännettyjä ohjelmia, mutta en ole siinä onnistunut. Nyt erinäisillä testailuilla selvisi että esim. kertolasku on käännettynä ”19 F8 F8 F9” ja jakolasku ”1B F8 F8 F9”. Nuo eivät ole millään tavalla x86-käskykannan mukaisia, vaan ilmeisesti jonkinlaista tulkattavaa tavukoodia.

Mielenkiintoisesti suurin osa järjestelmän binääreistä, kuten /bin/cp ovat myös tavukoodilla tehtyjä. Lopulta huomasin /sbin/r3interp binäärin, joka nimen perusteella kuulosti tavukoodin tulkilta. Sille file sanoikin ”FreeBSD/i386 compact demand paged executable”. FreeBSD voisi tulla kyllä kyseeseen 1990-luvun lopussa tehdyssä laitteessa.

Kuitenkin laitteelta löytyvä /kernel binääri ei sisällä mitään mainintaa BSD:stä. Siinä on ylipäätänsä aika vähän stringsin löytämää tekstiä, mutta x86:n keskeytyksille löytyy mm. tekstit ”double fault exception (very bad)” ja ”invalid TSS exception”. Vertasin näitä FreeBSD:n koodiin 26 vuoden takaa, mutta FreeBSD:ssä ne ovat aina olleet muodossa double faultja ”invalid TSS fault”. Tältä pohjalta vaikuttaa ettei kyseessä ainakaan FreeBSD ole, vaikka binääriformaatti siltä vaikuttaakin.

Noh, ristikääntöympäristön virittäminen tuolle olisi luultavasti muutenkin aika työlästä, joten RAPL-3:lla mennään. Tein simppelin for-looppitestin, ja sain 174000 kierrosta sekunnissa, ja yhdessä kierroksessa on n. 6 käskyä. Eli n. 100 kellojaksoa per tavukoodin käsky.

Tähän mennessä olen käyttänyt ROS:n simple_message -protokollaa sarjaliikenteessä, mutta se vaatii jonkin verran konvertointia robottipurkin puolella. Laskin että nyt yhden paketin käsittelyyn menee n. 2000 tavukoodin käskyä, eli n. 2 millisekuntia. Tämä ei ole mitenkään kamalan hidasta kun itse paketin siirtämiseenkin sarjaväylän yli menee 5 millisekuntia.

Yksi mahdollinen syy tökkimiseen on se, että ROS:n simple_message ei lähetä seuraavaa pakettia ennen kuin edelliseen on saatu kuittaus, joka vie joitakin kymmeniä millisekunteja. Ottamalla tämän odotuksen pois liikkeet kyllä muuttuivat vähän tasaisemmiksi, mutta samalla alkoi taas olla ongelmia sarjaliikenteessä.

Ilmeisesti robottipurkin sarjaporttien vuonohjaus ei ole millään tasolla luotettava. Speksien perusteella raudassa on 16 tavun puskuri, ja vaikuttaisi että kernelissä on n. 1.7 kilotavun puskuri. Näistä huolimatta joskus aivan kesken kaiken tipahtaa tavu pois välistä, nyt siis PC->robo suunnassa:

Vuonohjausasetukset eivät muuta paljoakaan. Xon/Xoff aktivoituu kyllä ajoittain, mutta ei riitä estämään tavujen putoilua. RTS/CTS taas ei tunnu aktivoituvan lainkaan.

Täytyy vielä tarkemmin arvioida tuon tehokkuutta. Mahdollista on tehdä jokin oma protokolla, joka olisi mahdollisimman lähellä CROS:n natiiveja tietotyyppejä jotta datat voisi siirtää ilman kummempaa konvertointia robottiajurin puolelle. Täytynee tehdä myös jonkinlainen checksum & uudelleenlähetys siirtovirheiden varalle.

Höylän tuulettimen korjaus

Kesken oikohöyläyksen alkoi yhtäkkiä kuulumaan metallin kirskuntaa ja kolinaa. Ensimmäinen arvaus oli tietysti että yksi höylän teristä oli lähtenyt irti ja olisi nyt pilalla. Mutta ei kuitenkaan, terät olivat kaikki tukevasti paikallaan eikä välissä ollut mitään.

Seuraavaksi otettiin hihnakotelo auki, mutta sielläkään ei mikään ollut selvästi pielessä. Moottoria käsin pyörittämällä kuitenkin selvisi että ääni tulee sen takaosasta. Seuraavaksi siis moottori irti, ja paljastuikin että muovinen propelli oli lisääntynyt jakautumalla. Tässä höylässä on muutenkin ollut harvinaisen hauraita muoviosia, joissa kyllä lukee ”ABS” mutta käy epäilyttämään onko muottiin mennyt jotain jämämassaa tilalle.

Kaksi osaa sai helpoiten takaisin yhteen pikaliimalla, mutta pelkkä liimaus tuskin pitäisi jo hajonnutta osaa kasassa. Jyrsin CNC:llä polykarbonaatista levyn tukemaan sitä. Levyn keskireikä on sopivan kokoinen että se menee tuulettimen keskiön ympärille ja toivottavasti estää sitä halkeamasta uudelleen. Muovilevyn liimasin epoksilla kiinni tuulettimeen.

Ainakin koekäytöllä tuntui pysyvän kasassa. Antaa epoksin kovettua seuraavaan käyttökertaan saakka niin eiköhän tuo taas jonkin aikaa kestä.