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.
Ohessa listaa tarvittavasta välineistöstä. Suluissa on oma laitteistoni.
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.
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.
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.
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.
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.
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.
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ää.
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