Martin Koksrud Bekkelund

Martin Koksrud Bekkelund

Teknologi • Samfunn • Politikk

Webkamera med Raspberry Pi

07.03.17

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.

Hva er laget?

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.

PiCam

Hvorfor lage selv?

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.

Hva bør du kunne?

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 å:

  • Sette sammen maskinvare selv
  • Forstå et grafisk brukergrensesnitt
  • Forstå et tekstbasert brukergrensesnitt (Bash)
  • Forstå enkle UNIX-kommandoer
  • Forstå enkel programmering (i Bash)

Hva trenger du?

Selv handlet jeg følgende fra Digital Impuls i Møllergata i Oslo. (Ja, de har fysisk butikk.)

  • 1 stykk Raspberry Pi 3 Model B
  • 1 stykk original strømforsyning
  • 1 stykk kameramodul v2
  • 1 stykk 16 GB micro-SD med NOOBS
  • 1 stykk kabinett til Pi
  • 1 stykk kabinett til kamera

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.

Koble sammen utstyret

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.

Ta et bilde

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.

Laste opp bilder

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.

Opprette kryptografisk nøkkelpar

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.

Last opp den offentlige nøkkelen

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.

Lag en mappe til bildene du laster opp

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.

Opplasting med SCP

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.

Litt om Bash

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

Automatisering med Bash

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

Last ned…
Bash • 497 bytes

Automatisering med Cron lokalt

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.

Time-lapse med Bash og Cron på serveren

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

Last ned…
Bash • 440 bytes

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.

Omstart av Raspberry Pi

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.

Fjernaksess med SSH

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.

Kabinett og oppheng

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.

GitHub-repo for scripts

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.

Hvor nyttig er denne artikkelen for deg?

Hva kan bli bedre?

Jeg blir veldig glad hvis du legger igjen noen stikkord om hva du tenker!

Duppeditter Foto Linux Martins Makerspace Programvare WWW

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.

Gi et bidrag

Husk å abonnere på nyhetsbrevet, det er gratis og du får alle artikler rett i innboksen.

 

Nyeste artikler

Enda flere artikler? Besøk arkivet.

Om Martin

Martin Koksrud Bekkelund

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...

 

Mastodon Bluesky Facebook LinkedIn YouTube Thingiverse GitHub Vipps

© 1995-2024 Martin Koksrud Bekkelund
OpphavsrettRSS og abonnementKontaktPersonvern og informasjonskapsler