360°-perhokuvaus

Alustus

360° tuotekuvausta on harrastettu jo pitkään erilaisissa nettikaupoissa ja tuotteiden esittelysivuilla. Perhojen valokuvaukseen menetelmää en kuitenkaan ollut nähnyt käytettävän. Täytyihän sitä siis kokeilla.

Lopputulosta voi ihastella ohessa:

Jos tekniikka kuvien takana kiinnostaa, niin kannattaa jatkaa lukemista.

Sisältö

Tarvittavat tarvikkeet

Kuvaussetuppi Ohessa listaa tarvittavasta välineistöstä. Suluissa on oma laitteistoni.

Kokoonpano ja mahdolliset ongelmat

Rautakokoonpano

Kytkennät EasyDriverin ja Raspberry Pin kytkemisestä löytyy netistä monia ohjeita, joten en mene siihen sen tarkemmin. Käytännössä Piltä pitää kytkeä kaksi GPIO-pinniä ja maa ohjainkortin niille varattuihin liittimiin. Lisäksi ohjainkortille pitää tuoda tasajännite ulkoiselta virtalähteeltä ja kytkeä moottori. Ehkä jossain vaiheessa minulta löytyy ylimääräistä aikaa kuvata myös kytkentä.

EasyDriverin käyttöjännitteen kanssa kannattaa olla tarkkana; liian suurella jännitteellä kortilla oleva regulaattori kuumenee helposti. Käytettävä jännite riippuu moottorin tarvitsemasta jännitteestä. Kovin suurta momenttia tässä sovelluksessa ei tarvita, joten sen puolesta jännitteen voi mitoittaa alemmas kuin moottorin nimellinen on. Minulla jännite on 10 V luokkaa.

Käyttämäni askelmoottorin nimellinen askel on 7,5°, eli täysi ympyrä on 360°/7,5° = 48 askelta. Kannattaa kuitenkin huomioida, että EasyDriver osaa tehdä osa-askelia, joten tälläkin moottorilla täysi ympyrä koostuu 8*48 = 384 osa-askeleesta.

Pyörivä alusta ja perhon kiinnitys

Alusta Alustana minulla toimii jääkiekko. Jääkiekkoon on porattu keskelle reikä, johon askelmoottorin akseli menee tiukasti. Tämän päälle olen laittanut viskipullon korkin, johon on leikattu ura häkiläpihtejä varten. Häkiläpihteihin voi sitten kiinnitellä perhoja näppärästi.

Skripti automaattiseen kuvien ottamiseen

Kuvien ottaminen on automatisoitu oheisella bash-skriptillä, joka ajetaan Raspilla.

#!/bin/bash

# configuration
STEP_PIN=7 # GPIO pin for step signal
DIR_PIN=8 # GPIO pin for direction signal
FULL_CIRC=384 # number of steps in a full circle
PHOTO_INTERVAL=12 # take a photo every nth step
PHOTO_DIR='photos' # directory to store the photos
USB_RESET=0 # if 1, reset the USB connection before every image
            # with raspi and gphoto2 the camera may stop answering if the 
            # connection is not reset
CAMERA_ID='Canon' # idenfication for the USB reset, used to grep the output 
                  # of lsusb
MOTOR_DIR=0 # motor rotating direction, set to 0 or 1

# configure step signal pin
if [ ! -d /sys/class/gpio/gpio$STEP_PIN ]
then
  echo "$STEP_PIN" > /sys/class/gpio/export
fi

echo "out" > /sys/class/gpio/gpio$STEP_PIN/direction

# configure direction signal pin
if [ ! -d /sys/class/gpio/gpio$DIR_PIN ]
then
  echo "$DIR_PIN" > /sys/class/gpio/export
fi

echo "out" > /sys/class/gpio/gpio$DIR_PIN/direction

echo "$MOTOR_DIR" > /sys/class/gpio/gpio$DIR_PIN/value

if [ ! -d $PHOTO_DIR ]
then
  mkdir $PHOTO_DIR
fi

# image counter
image=1

# main loop
for i in `seq 0 $((FULL_CIRC-1))`
do
  # take photo every nth turn
  if (($i % $PHOTO_INTERVAL == 0))
  then

    # check and reset the camera (the camera seems to freeze with raspi + gphoto2)
    if [[ $USB_RESET -eq 1 ]]
    then
      usbdevice=$(lsusb | grep $CAMERA_ID | head -n 1 | perl -nE "/Bus (\d+) Device (\d+).+/; print qq(/dev/bus/usb/\$1/\$2);")
      if [[ -n $usbdevice ]]
      then
        ./usbreset $usbdevice
      else
        echo "No Camera found!"
        exit 0
      fi
    fi

    # take the photo
    filename=$(printf "%03d.jpg" $image) # pad with zeros
    echo $name
    gphoto2 --capture-image-and-download --filename $PHOTO_DIR/$filename --force-overwrite
    retval=$?
    if [[ $retval -ne 0 ]]
    then
      echo "gphoto2 failed!"
      exit 0
    fi
    image=$((image+1))
  fi

  # rotate one step
  echo "1" > /sys/class/gpio/gpio$STEP_PIN/value
  echo "0" > /sys/class/gpio/gpio$STEP_PIN/value
  sleep 0.01
done

echo "$((image-1)) photos taken succesfully!"

Skripti on ladattavissa: 360photo.sh. Kuvien ottamiseen käytetään gphoto2-nimistä ohjelmaa, jolla kuvien ottaminen voidaan hoitaa komentoriviltä käsin.

Kameran tunnistus

Kamera liitetään Raspiin luonnollisesti USB-kaapelilla, minkä jälkeen sen pitäisi olla heti käytettävissä. Liekö syy kamerassa vai Raspissa, mutta välillä kamera katoaa aivan kuin USB-johto olisi otettu irti. Kevyt laukaisimen painallus palauttaa kameran, joten ehkä kamera vain menee nukkumaan tms., kun siihen ei ole hetkeen koskettu. Kameran löytymisen voi varmistaa komennolla

gphoto2 --auto-detect

Ohjelman pitäisi listata löydetyt kamerat.

Kameran jumittuminen

Raspberry Pin kanssa kamerani tuntui jäävän välillä jumiin. Tällöin kamera ei reagoi edes omiin nappuloihinsa, ja etsimessä vilkkuu teksti "busy". USB-piuhan tuuletus ja kameran uudelleenkäynnistys pelastavat tilanteen, mutta sitä ei voi oikein automatisoida. Pikaisen googlauksen perusteella ongelma on yleinen, ja siihen ratkaisu on USB reset. Copy-pastea koodi tiedostoon nimeltä usbreset.c ja käännä se komennolla

gcc usbreset.c -o usbreset

Jos kääntäminen ei onnistu, pitää luultavasti asentaa ensin tarvittavat työkalut:

sudo aptitude install build-essential

Tämän jälkeen sitä ajetaan tyyliin

sudo ./usbreset /dev/bus/usb/001/002

Käyttämäni skripti tekee resetin varmuuden vuoksi ennen jokaista kuvaa, jos ominaisuus on aktivoitu (skriptissä USB_RESET=1). Skripti yrittää tunnistaa käytetyn kameran tunnisteen CAMERA_ID perusteella. Jos käytössäsi on jokin muu kuin Canon, pitää tunniste muuttaa vastaavaksi. Skripti olettaa, että usbreset löytyy samasta hakemistosta kuin itse skriptikin.

Kuvien ottaminen

Kameran asetukset

Kamera laitetaan täysin manuaalisäädöille, jotta kaikki kuvat olisivat samanlaisia. Jos kameralle annetaan mitään päätösvalta, se saattaa yllättäen muuttaa esim. valotusta, mikä näkyy lopullisessa tuotoksessa välkkymisenä. Myös tarkennus pitää laittaa manuaalille. Lisäksi valkotasapaino kannattaa säätää etukäteen kohdalleen (avainsanat: custom white balance), jotta tarvittava loppukäsittely saadaan minimoitua.

Asetukset voivat olla samat kuin normaalisti perhoja kuvatessa. Esimerkiksi (suluissa arvot, joilla omat testikuvani on otettu):

Olen itse ottanut kuvat JPEG-formaatissa ja valmiiksi vähän pienempinä, koska täysikokoisille raw-kuville ei ole nettijulkaisussa tarvetta.

Skripti ajoon

Kun kameran asetukset on saatu hiottua ja perho on paikallaan, ajetaan kuvausskripti ja odotetaan

sudo ./360photo.sh

Sudotus on tarpeen, sillä peruskäyttäjällä ei ole oikeuksia kirjoittaa GPIO:lle eikä resetoida USB-laitteita. Lopputuloksena pitäisi olla haluttu määrä kuvia numeroituina 001-0xx. Käytännössä sulava liike saadaan aikaa, kun kuvia on noin 32 (tarkka luku tulee siitä, että joku testaamani esitysohjelma toimi ainoastaan kakkosen potensseilla). Enemmälle ei ole tarvetta, ja vähemmällä pyöritys on nykivää.

Julkaisu/katsominen

Valmiita kuvia voi toki katsoa ihan vaikka Windowsin photo viewerillä, mutta netistä löytyy useita valmiita javascript-toteutuksia, joilla kuvat on helppo upottaa nettisivulle katsottavaksi. Tällä sivulla on käytetty Dopeless Rotatea, joka toimii jQueryn kaverina. Dopeless Rotate on omaan käyttöön ilmainen, mutta kaupallinen käyttö vaatii lisenssin. Muitakin löytyy, mutta tässä oli mukavassa paketissa kaikki tarvitsemani ominaisuudet mukaan lukien tuki kosketusnäytöille ja zoomaukselle.

Viimeksi muokattu 8.1.2014

Mikko Saransaari / webmaster (ät) perho.org