Jeg kjøpte meg nylig en Raspberry Pi, hvor jeg hintet om at jeg vurderte å bruke den som et webkamera på hytta. Her får du oppskriften på prototypen.
Enkelt forklart har jeg satt opp en Raspberry Pi til å fungere som et webkamera, eller mer presist et IP-kamera, ved hjelp av kameraet man får kjøpt som ekstrautstyr. Kameraet tar bilder hvert 5. minutt og laster dem opp på nettet, hvor jeg både kan se på dem og lagrer dem for time-lapse.
Oppskriften er lang og ganske teknisk, uten at det bør skremme noen fra å mekke selv. Det er det du lærer av.
Det endelige resultatet ser slik ut. Det vinner ingen designpris, men det gjør jobben. Strøm inn bak, kamera foran. Alt innkapslet i en liten boks.
Jeg har seks webkamera på hytta. Alle har de en eller flere svakheter. Et kamera støtter ikke SFTP for sikker opplasting. Et annet tar ikke flere enn 14 tegn i passordet. Et tar kun IP-adresser til SFTP-serveren. Ingen produserer egendefinerte filnavn. Ingen fungerer stabilt over tid. Alle har teite bugs. Og så videre. Jeg kunne klaget i timesvis, spesielt når jeg sitter på hytta med en kald øl og gjør endringer i oppsettet.
Selv om bildekvaliteten på slike webkamera som oftest er helt ålreit, er det allikevel ingen som kan matche fleksibiliteten i kameraet man for kjøpt til en Raspberry Pi. I hvert fall ikke til den prisen. Omtrent 380,- kroner for 8 megapiksler, mulighet for RAW-filer og alle tenkelige manuelle innstillinger. Mer om det litt senere.
Sist, men ikke minst, er det gøy å lage ting selv. Det er bra for forståelsen.
Hvis du ikke er redd for en utfordring trenger du strengt tatt lite forkunnskaper. Alt kan læres!
Personlig hadde jeg nok allikevel ikke begitt meg ut på dette hvis du ikke er komfortabel med å:
Selv handlet jeg følgende fra Digital Impuls i Møllergata i Oslo. (Ja, de har fysisk butikk.)
Fra før hadde jeg skjerm, tastatur, mus og en del nødvendige kabler. Sjekk hva du trenger før du handler. Trenger du noe som er like billig, så får du tastatur, mus og musematte hos Kjell & Company for til sammen ca. 200,- kroner.
Utstyret kobler du, åpenbart, sammen som beskrevet i veiledningen for Raspberry Pi og det tilhørende kameraet.
Når utstyret er sammenkoblet er det bare å starte opp og sette opp maskinen, slik at den kommer seg på nett.
Du bruker Bash, altså kommandolinja, til å ta bilder. Brukermanualen for kameraet har en uttømmende liste over funksjonalitet og er helt uvurderlig for å forstå hvilke muligheter du har og hvordan du bruker det.
I kommandolinja bruker jeg programmet raspistill
til å ta bilder. (Merk at du også kan fange video med raspivid
.) Du trenger ikke installere ytterligere programvare, alt følger med operativsystemet NOOBS.
Åpne kommandolinja og skriv raspistill
og du er i gang.
Jeg anbefaler at du selv tester ut de forskjellige innstillingene og benytter det som passer deg best, der du skal ha det stående.
Jeg lagrer bilder i den eksisterende mappen /home/pi/Pictures
.
For å ta et bilde og lagre det til disk benytter du raspistill
, hvor du kan angi for eksempel følgende parametre:
raspistill -th none -sh 50 -sa 30 -q 10 -o /home/pi/Pictures/pi.jpg
Parametrene er forklart i brukermanualen, men de gjør som følger:
-th
setter innbygging av thumbnail til none
. Altså ingen thumbnail.-sh
justerer skarpheten til 50
. Jeg har økt litt.-sa
justerer fargemetningen til 30
. Jeg har økt litt.-q
justerer kvaliteten til 10
. Jeg komprimerer en del.-o
betyr «output» og lagrer en fil til /home/pi/Pictures/pi.jpg
.Parametrene kan du prøve deg frem med selv, slik at du tar bilder som passer deg. Verdt å merke seg er parameteren -q
for kvaliteten. Filstørrelsen er jevnt over stor, inntil man kommer så langt ned som til 10
. Problemet er godt beskrevet på Stack Overflow.
Merk at filen pi.jpg
overskrives hver gang du tar et nytt bilde.
Nå har du fått din Raspberry Pi til å ta bilder manuelt og lagre dem på disk. Det neste du skal gjøre er å få dem lastet opp til nett. Jeg benytter SCP til formålet. Oppsettet er litt vanskelig, men straks det er gjort går resten av seg selv.
For å laste opp bilder med SCP trenger du å lage et kryptografisk nøkkelpar som kan benyttes slik at du slipper å lagre passordet til FTP-serveren din i klartekst i skriptet som følger i neste kapittel.
Åpne kommandolinja, skriv og trykk enter:
ssh-keygen -t rsa
Trykk enter
for å angi blankt passord.
Dersom du blir spurt om å overskrive eksisterende nøkler skal du svare nei. Deretter må du finne ut hvorfor det allerede eksisterer nøkler, for dette skal normalt ikke være gjort fra før.
Straks du har generert dette nøkkelparet, vil det i mappen /home/pi/.ssh/
ligge to filer kalt id_rsa
og id_rsa.pub
. Førstnevnte er privat og må aldri deles med andre. Sistnevnte er offentlig som kan du dele ut, og det er dette du nå skal gjøre ved å laste den opp til serveren der du skal lagre bildene.
Si at du eier domenet example.com
og at ditt brukernavn for å logge inn på dette domenet er martin
.
Da skriver du følgende i kommandolinja og taster passordet når du blir bedt om det:
cd /home/pi/.ssh/
Deretter:
scp id_rsa.pub martin@example.com:./
Dette vil kopiere den offentlige den offentlige nøkkelen til roten av domenet.
Logg så inn på domenet ved å skrive følgende i kommandolinja og tast passord når du blir bedt om det:
ssh martin@example.com
Du er nå innlogget på domenet ditt. Du finner nøkkelen ved å liste alle filene og mappene ved å skrive:
ls -la
Du vil her se id_rsa.pub
.
Dersom du ikke har en slik mappe fra før, kan du opprette en mappe kalt .ssh
på domenet ditt ved å skrive:
mkdir .ssh
Deretter kopierer du nøkkelen fra å hete id_rsa.pub
på rot til å hete authorized_keys
i mappen .ssh
ved å skrive:
cp id_rsa.pub .ssh/authorized_keys
Forflytt deg inn i mappen ved å skrive:
cd .ssh
Og liste deretter alle filer ved å skrive:
ls -la
Hvis filen authorized_keys
ligger der avslutter du ved å skrive:
exit
Nå logger du inn på nytt. Dette for å teste at passordet ditt er lagret i nøklene:
ssh martin@example.com
Du skal nå bli logget rett inn uten å bli bedt om passord.
Nå kan du for ordens skyld opprette en mappe hvor du lagrer bilder du laster opp. Dette avhenger litt av oppsettet på ditt domene, men kan hende har du mappen public_html
fra før. Da skriver du:
cd public_html
Husk å avslutte med exit
.
For å teste opplasting med SCP skriver du følgende i kommandolinja:
scp /home/pi/Pictures/pi.jpg martin@example.com:/public_html/pi.jpg
Bildet lastes nå opp og vil være tilgjengelig fra https://example.com/pi.jpg
hvis alt er gjort riktig.
Om ikke du trenger å kunne programmere i Bash, trenger du å forstå hva det er og hva du kan bruke det til.
Bash er et kommandolinjespråk som du kan benytte til å programmere en datamaskin til å foreta bestemte operasjoner. På Linux-baserte maskiner, slik som en Raspberry Pi med operativsystemet NOOBS, trenger du ikke installere ytterligere programvare for å komme i gang. Det følger med minnekortet.
Jeg benytter Bash-skript til å ta bilder og deretter laste dem opp på nett.
Selv benytter jeg editoren Geany som IDE til å skrive Bash-skript. Den følger med NOOBS og jeg benytter det faktisk også på Mac-en hjemme.
Alt du trenger å gjøre er å starte Geany og opprette en ny, tom fil. Alle Bash-skript skal starte med følgende
#!/bin/bash
Selv har jeg laget en mappe /home/pi/Code/
hvor jeg lagrer kode som skal kjøres. Alle Bash-skript lagrer jeg med filendelsen .sh
.
I tillegg må du sørge for at alle kjørbare Bash-skript skal ha rettigheter til å kjøres. Dette gjør du i kommandolinja, hvor du går til /home/pi/Code/
og skriver
chmod +x filnavn.sh
Når dette er gjort, kjører du et Bash-skript ved å skrive
./filnavn.sh
En ting er å ta bilder som beskrevet over med raspistill
. Dette fungerer fint hvis man vil vise det frem på en nettside. Da kan jeg inkludere bildet der jeg selv ønsker, f.eks:
<img src="https://example.com/pi.jpg" />
Hvis du i tillegg vil lage time-lapse av bildene du tar, må du sørge for å lage en kopi av hvert bilde og stemple kopien med et klokkeslett, slik at du kan benytte et program for å sette sammen bildene til en time-lapse-video til slutt.
Det jeg gjør, er at jeg først tar bildet, deretter laster jeg det opp og til slutt kjører jeg en jobb på serveren som lager en tidsstemplet kopi av den opplastede filen.
For å kjøre flere operasjoner i sammenheng benytter jeg Bash
#!/bin/bash
# Tar et bilde og lagrer det
raspistill -th none -sh 50 -sa 30 -q 30 -n -o /home/pi/Pictures/pi.jpg
# Laster opp bildet
scp /home/pi/Pictures/pi.jpg martin@example.com:/public_html/pi.jpg
# Sletter bildet lokalt
rm /home/pi/Pictures/pi.jpg
En ting er å lage et Bash-skript som lar deg automatisere flere oppgaver i én operasjon. Men for å få maskinen til å kjøre dette skriptet for deg, for eksempel hvert femte minutt, må du benytte programmet Cron. I likhet med den andre programvaren følger det med NOOBS.
Cron er en såkalt daemon, det vil si et program du kun starter én gang — typisk når maskinen starter — for så å ligge inaktivt og vente. Cron benytter konfigurasjonsfiler når det kjører, kalt crontab
. Når et tidspunkt for en oppgave som er definert i crontab
inntreffer, utfører Cron jobben og går i dvale igjen.
Cron benytter jeg til å kjøre Bash-skriptet hvert 5. minutt mellom kl. 07.00 og 17.00, altså innenfor et fornuftig intervall med tanke på når det er lyst.
Til det trenger du å redigere crontab
. I kommandolinja skriver du
crontab -e
Her legger du til
*/5 7-17 * * * /home/pi/Code/kommando.sh
Avslutt med CTRL + X
og trykk enter
for å lagre. Ikke la deg forvirre av det temporære filnavnet, det blir lagret i crontab.
Cron vil deretter kjøre skriptet kommando.sh
hver dag fra og med 07.00 til og med 17.00. Hvert 5. minutt får du nå et oppdatert bilde på nett.
Jeg leker med tanken om å bruke en solcelle til å gjøre en dynamisk vurdering av om det er tilstrekkelig lys til å ta bilde, slik at jeg kun tar bilder når det er mørkt. Eventuelt å få kameraet til å måle det, eller bygge noe selv. Det får bli et senere prosjekt.
For å minimere båndbreddebruken lokalt, og for å sikre backup, lager jeg alt jeg trenger til time lapse på serveren. Også dette gjør jeg med Bash og Cron.
Straks et nytt bilde er lastet opp, vil jeg lage en tidsstemplet kopi av bildet på formatet ÅÅÅÅ-MM-DD_TTMMSS
.
Først lager jeg et Bash-skript for selve jobben.
#!/bin/bash
# Sjekksum for å se om filen er endret siden sist
md5sum -c --status $HOME/public_html/pi.md5
if [ $? -eq 1 ]
then
# Filen er endret, ta en kopi
cp $HOME/public_html/pi.jpg $HOME/public_html/log/$(date +%Y-%m-%d_%H%M%S).jpg
# Oppdater sjekksum
md5sum -b $HOME/public_html/pi.jpg > $HOME/public_html/pi.md5
fi
Deretter kjører jeg Bash-skriptet med Cron akkurat på samme måte som jeg tar bildet. Min ISP har et webbasert grensesnitt for å administrere Cron-jobber, hvis ikke benytter du samme kommandoer som beskrevet over for å redigere dem manuelt via SSH.
Elektronikk har det med å fuske. Dette oppsettet har jeg stående på hytta hvor jeg ikke kommer til det så lett hvis det skulle henge seg opp og ha behov for en omstart. Derfor har jeg lagt inn følgende linje i Crontab:
0 0 * * * sudo /sbin/reboot
Deretter starter maskinen på nytt av seg selv ved midnatt, hver natt.
Jeg benyttet skjerm, tastatur og mus direkte tilkoblet min Pi da jeg satte den opp. Jeg klarer meg fint i kommandolinja, men foretrekker et GUI når jeg skal arbeide over lengre tid.
Når maskinen derimot er ferdig satt opp, trekker jeg ut alt utstyret, slik at det kun er strømkabelen som henger tilbake. Dette kalles å kjøre maskinen «headless». Da er det åpenbart ikke hensiktsmessig å trekke frem alt utstyret på nytt hvis jeg skal gjøre endringer. Heldigvis kan du aksessere maskinen via SSH.
Du åpner kommandolinja og skriver
ssh -l pi 127.0.0.1
hvor du erstatter 127.0.0.1
med den faktiske IP-adressen til maskinen. Parameteret -l
betyr login
og angir det brukernavnet du ønsker å logge inn med, i dette tilfellet pi
. Passordet er standardpassordet, eventuelt et nytt du har angitt for brukeren pi
selv.
Herfra er du på egenhånd. Kos deg med Unix-kunnskapene dine. Nano er din venn.
Alternativt kan du feige ut og aktivere VNC-tilgang via Preferences
Raspberry Pi Configuration
Interfaces
for å få tilgang til et GUI med f.eks. RealVNC.
Nå som oppsettet kjører stabilt, må det pakkes pent inn og henges opp et passende sted. Det er verdt å merke seg at oppsettet kun er til innendørs bruk.
En Raspberry Pi 3 Model B måler alene ca. B 87 x H 19 x D 56 mm. Til å feste maskinen kjøpte jeg et lite kabinett fra One Nine Design. Dette måler B 112 x H 40 x D 80 mm, altså noe større enn maskinen.
Dette kabinettet har imidlertid ikke feste for selve kameraet. Jeg kunne også tenke meg å skjule det meste som stikker ut av ledninger fra kabinettet. Derfor handlet jeg et ytre kabinett, strengt tatt en koblingsboks, til 149,- kroner fra El og Belysning AS.
Selv om dette strengt tatt ikke er et kabinett, er det allikevel godt egnet for formålet. Det er laget for å huse elektronikk og det har kabelgjennomføringer hvor man kan trekke ledninger og sikre lufting. I tillegg ser det rimelig minimalistisk ut, selv om det ikke vinner noen designpremie.
Deretter kuttet jeg et lite hull med Dremel, slik at kameraet kunne monteres på innsiden. Deretter laget jeg hull for lufting, som vist på bildene. Så monterte jeg først bunnen på kabinettet, satte inn maskinen og dro frem ledninger, så monterte jeg midtseksjonen av kabinettet og trakk frem kameraet til hullet jeg hadde kuttet.
Til slutt sitter jeg igjen med en enkel boks, med kun en ledning stikkende ut for strømtilførsel. Plugg inn ledningen og resten går av seg selv. Det er også mulig å koble til skjerm, tastatur og mus, om nødvendig.
Skulle du mot all formodning ha behov for å skru den av, anbefaler jeg ikke at du trekker ut strømmen, da det kan føre til korrupt filsystem på minnekortet. Logg heller inn med SSH, som beskrevet over, skriv
sudo halt
og vent noen øyeblikk før du trekker ut kontakten.
Scriptene brukt for å ta bilder, laste opp og lagre for time lapse er, som du kanskje allerede har forstått, tilgjengelige fra et eget repo på GitHub. Finner du feil eller gjør forbedringer, er du hjertelig velkommen til å legge inn en pull request.
Som leser kan du gi et bidrag til produksjonen, til driften og til å skaffe utstyr til testing for å sikre regelmessige, uavhengige artikler, tester og vurderinger av høy kvalitet.
Husk å abonnere på nyhetsbrevet, det er gratis og du får alle artikler rett i innboksen.
Enda flere artikler? Besøk arkivet.
Dette er Martin Koksrud Bekkelund sitt private nettsted, hvor han skriver om forbrukerteknologi, teknologiledelse og hvordan teknologi, samfunn og politikk påvirker hverandre. Martin er innehaver av konsulentselskapet Nivlheim. Les mer...
© 1995-2024 Martin Koksrud Bekkelund
Opphavsrett • RSS og abonnement • Kontakt • Personvern og informasjonskapsler