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.

Haskero Haskell-kehitysympäristöksi vscodeen.

Jos esimerkiksi hie pohjainen haskell lisäosa ei toimi suoraan esimerkiksi vscodessa, niin tätä voi silloin kokeilla. Ainakin interoa asentaessa saa virheilmoituksia näkyviin. Kun haskero alkaa toimia, niin todennäköisesti haskell lisäosakin toimii jos siihen vaihtaa.

Näiden haskell ide ympäristöjen asentamisessa stackin kanssa näyttää olevan jonkin verran epämääräisiä bugeja, joiden ohi jos pääsee niin asiat alkaa toimia paremmin. Voit yrittää kysyä minulta apua. Vastaan todennäköisesti hyvin mielelläni.

Käyttikseni on Ubuntu. Windowsista en osaa sanoa miten hyvin toimii.
Intero (VS Codessa Haskero) ei ole enää kehityksessä, joten joudut käyttämääna vanhempaa ghc:ta. Hyvin mahdollisesti ei haittaa Funktio-ohjelmointi 1 -kurssin aikana. Jos ongelmia tulee, niin se näkyy siten, että sopimattomuuden aiheuttavaa pakettia ei löydy suoraan. Todennäköisesti stack osaa antaa tästä kuvaavia virheilmoituksia. Korjattua tämän saa vaihtamalla takaisin uudempaan ghc:hen. Tällöin Intero lakkaa toimimasta. Varmaan paras asia, mitä Intero antaa, on reaaliaikaiset virheilmoitukset, jotka editori värjää suoraan koodiin. Tulevaisuudessa voisin yrittää siirtyä johonkin lsp-pohjaiseen systeemiin, mutta toistaiseksi ovat vielä kehityksen alla.

Asenna Haskellin tool stack ”stackin” kotisivuilta. Älä asenna ainakaan apt-get:sta, rikki! Tai jos asennat niin seuraa stackin sivuilta jostakin löytyviä asennus-ohjeita.

asenna ghc aptista.  (sudo apt install ghc) Tässä vaikuttaa tulevan mukana joitakin paketteja joista intero jossakin kohtaa riippuu, jotka eivät itsekseen asennu.

Tiedoksesi: Tarvitset vanhemman stackin lts-paketin <14.27 stackin conffeihin. (kerrotaan kohta miten)
(lts-14.27 jossa mukana ghc 8.6.5 ==> näkyy täällä: https://www.stackage.org/)
(ghc versio vaatimus interolle näkyy esimerkiksi täällä: https://hackage.haskell.org/package/intero)

Stack toimii sillä tavalla että on globaali projekti (~/.stack/global-project/stack.yaml).
Ja lokaali projekti sitten, kun teet stakilla sen jonnekkin. (projektinimi/stack.yaml)

Locaalin projektin voit luoda esimerkiksi näin: stack new projektinimi simple --resolver lts-14.27

stack.yaml tiedostossa rivi ”resolver” pitää olla interolle sopiva esim: resolver: lts-14.27
Muutoksen jälkeen aja: stack install
Voit nyt myös kokeilla osaako stack: stack install intero
Jos asiat on hyvin niin ei pitäisi tulla virheitä.
En ole ihan varma katsooko vscode lokaalista vai globaalista kontekstista, mutta ainakin toisessa pitää olla resolver: lts-14.27
(voit pistää molempiin)

Pidä huoli viimeistään tässä kohtaa että .local/bin on pathissa (myös seuraavassa bootissa) (echo $PATH).

Minulla oli sekä globaali ja lokaali projekti tässä kohtaa lts-14.27:ssa ja olin ajanut kummassakin contekstissa stack install intero ihan kokeen vuoksi, en ole varma tarvitseeko tuota tehdä manuaalisesti, mutta ainakin näkee että se onnistuu.

käynnistin tässä kohtaa koneen uudelleen.

Avaa vscodessa vaikka juuri tekemäsi projektin hello world tiedosto (projektinimi/src/Main.hs)
kirjoita loppuun jotain diipadaapaa.
Huomaa kuinka mitään ei tapahdu.
Asenna vscodeen haskero extensioni (Pitäisi olla kohtuu helppoa. klikkailet vaan.)
Diipadaapan pitäisi nyt olla alleviivattu punaisella ainakin jostakin kohtaa ja kun viet hiiren päälle niin virhe pitäisi näkyä.

Jos ei toimi niin todennäköisesti sinulle aukeaa ikkuna joka kertoo sinulle, mistä it-alan ammattilaisen päivä koostuu.
Yritä ymmärtää mikä on viestin sisältö ja miksi juuri sinä saat sen.

Yleisesti stack riippuvuuksista:

Yleensä stack-projekteissa riippuvuuksien paketit pitää aina lisätä ensisijaisesti tiedostoon package.yaml tai ”simple”-projekteissa, jollainen sinulla varmaan käytössä, tiedostoon projektinimi.cabal. Sen jälkeen niistä voi importata asioita. Nämä riippuvuudet sitten haetaan tuosta stackin lts-paketista. Joskus voi tulla myös ulkosia riippuvuuksia, jotka menee samaan tiedostoon kuin tuo resolver, mutta ne ovat asia erikseen.

Riippuvan paketin nimi löytyy yleensä ainakin hooglessa scrollattavan sivun aivan vasemmasta yläkulmast, kun katsot dokumentaatiota.

Esimerkiksi Text:n paketti text löytyy kun kelaat tämän sivun sivun alkuun.

Pitäisi muokata tiedostoon projektinimi.cabal seuraavaa:
build-depends: base >= 4.7 && < 5build-depends: base >= 4.7 && < 5, text

Sitten pitää ajaa stack build.

Sitten voisi importata haskell tiedostossa näin:

import Data.Text

ja sitten voisi käyttää koodissa Text:iä:

textiksiPaketoituStringi = pack "kissa"
UPS-laitteisto

UPS, tuo unohdettu ja väsymätön datankerääjä

Tällä kertaa Zouppenin säätönurkkauksessa sähköasioita. Varoitus: Artikkeli on jännitteinen ja sisältää kompleksilukujen jäänteitä.

Elokuun alkupuolella havahduin tilanteeseen, että meillä on ollut vuosia ajossa Network UPS Tools eli nut, jota on lähinnä käytetty siihen, että UPS:n tilasta tehdään tarvittaessa hälytyksiä Icingaan. UPS kerää kuitenkin muutakin tietoa: sähkönkulutustietoja, oman lämpötilansa ja paljon muuta. Tässä esimerkki datasta:

$ upsc ups
Init SSL without certificate database
ambient.temperature: 26
ambient.temperature.high: 40
battery.charge: 100
battery.charger.status: resting
battery.runtime: 18724
battery.runtime.low: 2
battery.voltage: 104.3
device.mfr: Eaton
device.model: PW9120 3000i
device.part: 05147365-5501   
device.serial: RV091A0200      
device.type: ups
driver.name: bcmxcp_usb
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.parameter.synchronous: no
driver.version: 2.7.4
driver.version.internal: 0.31
input.frequency: 50.0
input.frequency.high: 52
input.frequency.low: 48
input.frequency.nominal: 50
input.transfer.boost.high: 195
input.transfer.high: 276
input.transfer.low: 160
input.transfer.trim.low: 254
input.voltage: 239
input.voltage.nominal: 230
output.current:  0.6
output.current.nominal: 13.0
output.frequency: 50.0
output.frequency.nominal: 50
output.phases: 1
output.voltage: 230
output.voltage.nominal: 230
ups.alarm: INVERTER_TEMP_SENSOR_FAILED DC_START_OCCURED INVERTER_ON_DELAY AUTO_OFF_COMMAND_EXECUTED ON_BUCK ON_BOOST ON_DOUBLE_BOOST TRANSFORMER_OVER_TEMP CABINET_DOOR_OPEN_VOLT_PRESENT AUTO_SHUTDOWN_PENDING STARTUP_FAILURE_CHECK_EPO OUTGOING_MODEM_CALL_STARTED
ups.beeper.status: disabled
ups.firmware: Cont:02.03 Inve:02.03
ups.load:   4.7
ups.mfr: Eaton
ups.model: PW9120 3000i
ups.power: 141
ups.power.nominal: 3000
ups.realpower: 80
ups.serial: RV091A0200      
ups.status: ALARM OL
ups.test.result: Done and passed

Dataa on siis paljon. Sieltä löytyy mm. seuraavat meitä kiinnostavat kentät:

ambient.temperatureUPS:n lämpötila (°C)
battery.chargeAkun varaustila (%)
battery.voltageAkun jännite (V)
input.frequencySähköverkon taajuus (Hz)
input.voltageSähköverkon jännite (V)
ups.powerUPS:n kuorman näennäisteho (VA)
ups.realpowerUPS:n kuorman pätöteho (W)

Muut selittävätkin itsensä, mutta pätöteho ja näennäisteho saattavat olla tuntemattomia, ellei ole sähköalan diplomi-, normi-, tai valeinsinööri. Seuraava kuva havainnollistaa asiaa trigonometrian keinoin:

Tekijä: Wikieditor4321, Lähde: Wikimedia Commons

UPS:n mittaamista parametreista kuvassa näkyy näennäisteho (engl. apparent power) sekä pätöteho (engl. real power). Usein emme ole kiinnostuneet loistehon (engl. reactive power) määrästä vaan tehokertoimesta. Tehokerroin voidaan johtaa seuraavasti:

Skippaan kuitenkin kompleksilukumatematiikan, koska olen valeinsinööri ja siten kiinnostunut vain lopputuloksesta, eli alimmasta rivistä. Tehokerroin on pätöteho jaettuna näennäisteholla (eli kompleksiluvun itseisarvolla).

Tehokerroin kuvaa kuinka ”hyvää” kuormitus on. Täydellinen tehokerroin on 1. Esimerkiksi vedenkeittimellä on sellainen. Vedenkeittimessä vastus ”luo” virran, joka on samassa vaiheessa jännitteen kanssa. Sen sijaan usein sähkömoottoreiden, loisteputkien ja pienitehoisten hakkurivirtalähteiden virta ei ole jännitteen kanssa vaiheessa. Tämä aiheuttaa joko induktiivista tai kapasitiivista kuormitusta, jotka parhaassa tapauksessa kumoavat toisensa. Näin ei kuitenkaan yleensä tapahdu, vaan kuormitus on epäideaalia ja kuormittaa näin sähköverkkoa.

Online-UPS:n tapauksessa, menemättä asiaan liian syvälle, sen korjaaminen on UPS:n tehtävä, koska kuorma ei ole suoraan kytketty sähköverkkoon. Alla yksinkertaistettu havainnekuva:

https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Ups-online.svg/640px-Ups-online.svg.png
Tekijä: Tomia, Lähde: Wikimedia Commons

Huono tehokerroin lisää UPS:n sähkönkulutusta jonkin verran. Olen tietysti kiinnostunut siitä, kuinka paljon sen vaikutus on, joten tehokerroin on yksi kiinnostava mitattava johdannaissuure.

Seuraavaksi tämä kaikki täytyykin saada Grafanaan, joka on hieno vapaakoodinen visualisointivärkki. Datan valuttaminen tietokantaan tapahtuu monilla skripteillä ja työkaluilla, joista kaikkien esittely tässä hengästyttäisi sekä kirjoittajaa että lukijaa. Se olisi oman artikkelinsa aihe.

Eräs näistä työkaluista on systemdb, jonka kirjoitin helpottamaan synkronointia datankeruulaitteen ja tietokantapalvelimen välillä. Ensiksi jokin ohjelma tuottaa lokia, yleensä systemd:n journaliin. Toinen skripti lukee eri palveluiden tuottamia lokeja ja tuottaa niistä CSV-muotoista dataa. Kolmas komponentti tässä on systemdb, joka auttaa synkronoinnissa. Se osaa kertoa, missä kohtaan lokia ollaan menossa ja pyytää sitä uudemmat datat ja suorittaa varsinaiset tietokantaoperaatiot.

Lopulta data on tietokannassa ja se näyttää tältä:

Kuvassa näkyy myös kokonaiskulutus, joka saadaan suoraan sähkömittarista. Se on oma tarinansa.

Käykää ihailemassa reaaliaikaista dataa osoitteessa https://jyvaskyla.hacklab.fi/tilastot/

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.

Kokoustamista suuren maailman malliin

Kokouskutsu: Vuosikokous 16.6. klo 18:00

Vihdoinkin koronarajoitukset ovat helpottaneet ja kokousasiakirjatkin valmistuneet. Siispä kutsutaan koolle yhdistyksen vuosikokous! Toimintaa on ollut paljon ja koetamme varata riittävästi aikaa myös tulevasta toiminnasta keskustelemiseen.

Meillä ei ole erillistä hallitus- ja toimihenkilöhakua, joten CV:tä hallitukseen pyrkimiseksi ei tarvita. Riittää että kerrot kokouksessa, että olet käytettävissä. Toki etukäteenkin voi ilmoittaa! Jos olet kiinnostunut hallituspaikasta mutta et pääse kokoukseen, ilmoita aikeistasi jollekin kokoukseen pääsevälle.

Asialistalla olevan sääntömuutosesityksen läpimeno tarkoittaisi sitä, että siirryttäisiin kahden vuosikokouksen käytäntöön. Tämä tarkoittaa sitä, että jatkossa hallituskaudet olisivat lähtökohtaisesti kalenterivuoden mittaisia. Näin ollen valittava hallitus olisi ”tynkähallitus”, joka toimii vuoden 2020 loppuun saakka ja syyskokouksessa valitaan hallitus koko vuodeksi 2021.

Kokousta voi seurata etänä Jitsi-huoneessamme. Käyttäjätunnuksia ei tarvita. Etäosallistujilla ei ole äänioikeutta, mutta puheoikeus voidaan järjestää. Voit siis olla käytännössä osallistua kokoukseen ja olla ehdolla tulevaan hallitukseen, vaikka et pääsisi kokoukseen paikan päälle.

Kokouksen päätyttyä pidetään kerhoilta normaaliin tapaan!

PS. Koronarajoituksista johtuneen kysynnän heikkenemisen vuoksi jääkaapissa pääsi vanhenemaan lavoittain virvoitusjuomaa, joten ”parasta ennen”-tuotteita saa nauttia (omalla riskillä) Huom!täysin ilmaiseksi!

Esityslista

Aika: tiistaina 16.6.2020 klo 18:00
Paikka: Hacklabin kerhotila, Emännäntie 10 O, Jyväskylä

  1. Kokouksen avaus
  2. Kokouksen järjestäytyminen
  3. Kokouksen laillisuuden ja päätösvaltaisuuden toteaminen
  4. Työjärjestyksen hyväksyminen
  5. Kokousvirkailijoiden valinta
    1. puheenjohtaja
    2. sihteeri
    3. pöytäkirjantarkastajat
  6. Asiakirjojen esittely
    1. vuosikertomus 2019–2020
    2. tilinpäätös 2019
    3. toiminnantarkastajan lausunto
    4. toimintasuunnitelma 2020
    5. talousarvio 2020
    6. sääntömuutosesitys
  7. Päätetään tilinpäätöksen vahvistamisesta ja vastuuvapauden myöntämisestä hallitukselle ja muille vastuuvelvollisille
  8. Vahvistetaan toimintasuunnitelma, tulo- ja menoarvio sekä liittymis- ja jäsenmaksun suuruus
  9. Päätetään sääntömuutoksesta
  10. Valitaan hallituksen puheenjohtaja ja muut jäsenet
  11. Valitaan toiminnantarkastajat
  12. Kokouksen päättäminen

Kokousasiakirjoihin on linkit kussakin asiakohdassa. Toiminnantarkastajan lausuntoon ja muiden asiakirjojen paperisiin versioihin voi tutustua ennen kokousta, kun asiasta sopii rahastonhoitaja Henrik Korhosen kanssa.