Domenica 27 Maggio 2018

Raspberry Pi, guida per la gestione di webcam (fotocamere digitali Canon)

Articolo completo e riaggiornato il 19 01 2018

Fino all'autunno del 2014 la gestione delle mie webcam era affidata a PsRemote, un programma windows, che gestiva gli scatti e i vari parametri delle fotocamere Canon, era installato in un notebook che mi fa "da muletto" 24 ore su 24 e che gestisce anche la stazione meteo Davis Vantage Pro 2, inoltrando i dati meteo ogni 5 minuti tramite internet al Centro Meteo Lombardo (CML) e ad altre due reti meteo: Rete Meteonetwork e Rete Linea Meteo, e anche alla rete internazionale Weather Underground, provvedendo inoltre naturalmente all’aggiornamento dei dati meteo del mio sito. Purtroppo però questo programma a volte si bloccava, procurandomi problemi sopratutto se non ero presente in casa, visto che per rimediare al blocco era necessario riavviare il notebook.
Ho deciso quindi dall’autunno scorso di cercare qualche altra alternativa, sperimentando e valutando le diverse possibilità. Dopo varie ricerche in internet, ho trovato un piccolo Pc grande poco più di una carta di credito:
Raspberry Pi  a cui si installa il sistema operativo Linux: purtroppo però per quanto riguarda la gestione delle webcam, di pappa bella pronta se ne è trovata poca o niente. Ho pertanto deciso di sperimentare quanto poi ho realizzato, soprattutto a riguardo della messa a punto dello script principale che gestisce lo scatto della fotocamera e l’inoltro al server hosting dell’immagine: la sperimentazione mi ha impegnato serate e serate di settimane intere ma alla fine sono riuscito nel mio intento, confermando il vecchio detto che "chi la dura la vince". Proprio per questo, e visto l'ottimo risultato ottenuto, ho deciso di condividere la mia esperienza e mettere a disposizione di altri amatori appassionati di meteo e fotografia le informazioni a seguire.

Sistema operativo e programmi da installare sul Raspberry Pi per la gestione della webcam, così composto:

Raspbian (una derivazione di Debian Linux),  Gphoto2 per la gestione della fotocamera,  NCFTP per l'invio delle immagini tramite FTP al server o altro. PHP5, e le librerie varie, ImageMagick: potentissima app di grafica per la gestione delle immagini, (messa a fuoco, miglioramenti vari, inserimento logo e testo, etc.)


E' necessario procurarsi il Raspberry Pi (personalmente ne ho comprati 4 in più riprese da Amazon, l'ultimo è il Raspberry Pi 3 Model B 1.2 GHz 64-bit quad-core ARM Cortex-A53 a cui fa riferimento questo articolo guida aggiornato di recente, naturalmente ho comprato anche una decina di SD card da 8 Giga con un fattore di velocità 10 e ovviamente l'alimentatore 5 volts 2000 mA). Scarichiamo il sistema operativo raspbian (raspbian Stretch Lite)  al link: https://www.raspberrypi.org/downloads/ e salviamolo sul desktop. 

Per l’installazione del sistema operativo sulla scheda SD, scarichiamo il programma win32diskimager al link: http://sourceforge.net/projects/win32diskimager/  . A riguardo delle modalità di utilizzo  di questo programma, vi rimando alle tante guide che si possono trovare in internet. Io ho proceduto lanciando Win32DiskImager (non necessita di installazione, è sufficiente estrarre lo zip in una cartella)

foto disk imagesLa finestra di Win32DiskImager, con l’immagine di Raspbian caricata e in fase di scrittura sulla SD.

Nella schermata dell'applicazione, cliccando sull’icona della cartella (a destra), andiamo a cercare il file .img appena estratto: controlliamo che la lettera sotto Device corrisponda a quella del lettore di SD, (vi straconsiglio di verificare molto bene la lettera dell'unità perchè Win32 DiskImage non tollera sbagli e non perdona, formatta e sovrascrive senza pietà) e poi  iniziamo la scrittura con Write. Dopo qualche minuto la nostra scheda SD sarà pronta per essere inserita nello slot del Raspberry per poterlo avviare. Una volta preparata la scheda SD, la possiamo inserire nel Raspberry, collegando lo stesso alla nostra rete LAN ma, inizialmente (la prima volta) dobbiamo collegare anche una tastiera usb e cosa molto importante anche un monitor tramite il connettore HDMI. Procediamo con l’accensione del Pi e seguiamo a video l'inizializzazione, al Login scriviamo pi e come password: raspberry che è quella predefinita. Ora configuriamo il sistema digitando: sudo raspi-config ci apparirà una schermata come la foto seguente

configurazione

Iniziamo assegnando la nostra nuova password al posto di quella predefinita. In 4 Localisation Options e al sottomenu I1 Change Locale scegliamo la voce  [*] it_IT.UTF-8 UTF-8 confermando con ok, passiamo al sottomenu I2 Change Timezone e scegliere EUROPE e successivamente ROME. In5 Interfacing Options abilitiamo l'interfaccia SSH che useremo dopo per comunicare con Raspberry. Ok portiamoci su Finish, confermiamo la proposta di reboot. Da ora in avanti  quindi per comunicare con il Raspberry, utilizzeremo la modalità SSH attraverso il software Putty, che scaricheremo da: http://www.putty.org/ 
Via SSH possiamo accedere al Raspberry da un qualsiasi dispositivo, ma nel nostro caso useremo il nostro Pc da tavolo o notebook con installato windows. Per collegarci però, abbiamo bisogno di conoscere l’indirizzo IP che gli è stato assegnato dal nostro modem-router: colleghiamoci quindi tramite Google Chome o Mozilla Firefox all’indirizzo 192.168.1.1, che generalmente è standard per tutti i modem (almeno quelli che possiedo io lo sono, il modem di Fastweb però per esempio usa l'Ip 192.168.1.254) e andiamo in Interface setup/LAN e in DHCP Table; qui troveremo la voce raspberrypi con l’indirizzo che il modem router gli ha appena assegnato. 
Avviamo il software Putty e in Host Name scriviamoci l'indirizzo IP che abbiamo reperito dal modem, in Port mettiamo 22, in Connection type: SSH, e clicchiamo sul pulsante “Open“. (vedi sotto la schermata di Putty)

putty configuration


Se l’IP è quello giusto, vi verrà chiesto di inserire il nome utente che è "pi" e la vostra password, che avete dato al posto di quella predefinita. A questo punto siamo collegati con Raspberry e siamo pronti per le prime configurazioni.

INSTALLAZIONE dei COMPONENTI utili al nostro caso:

Digitare: sudo apt-get update

Una volta scaricato il tutto, digitate ancora: sudo apt-get upgrade

Terminati gli aggiornamenti, riavviamo di nuovo con  sudo reboot

Riavviamo putty ed accediamo nuovamente a Raspberry con le nuove credenziali appena immesse dal pannello di configurazione.

Installiamo il programma gphoto2 che ci servirà per gestire le nostre webcam:

digitare: sudo apt-get install gphoto2
confermare con "si" o "yes" durante l'installazione. 
Ora collegare la fotocamera tramite USB al Raspberry (non dimenticate di accendere la fotocamera, in alcuni casi, è necessario attivare la modalità PTP sulla fotocamera stessa).
Digitiamo da terminale: 
gphoto2 --capture-image-and-download --force-overwrite --filename webcam.jpg
Se tutto ok, la fotocamera scatterà una foto di prova: verifichiamo, sempre da terminale  e digitando il comando ls , se effettivamente ha scattato e downloadato la foto webcam.jpg 

Per l'invio delle immagini via ftp, è necessario disporre di un programma apposito: ncftp è quello che fa al caso nostro.

Per installare ncftp, digitiamo da terminale il comando:

sudo apt-get install ncftp

Ora procediamo con l'installazione di PHP7.0, e le librerie varie:

sudo apt-get install php7.0
sudo apt-get install php7.0-cgi
sudo apt-get install php7.0-gd

Per ultimo installiamo ImageMagick:

sudo apt-get install imagemagick

Ora passiamo alla creazione dello script per la gestione dello scatto e per il trasferimento diretto dell'immagine al nostro Hosting (server) tramite Ftp.

Iniziamo con la creazione del file scatto.sh. Da terminale digitando sudo nano scatto.sh  si aprirà una schermata vuota dell'editor nano: copiare il codice sotto e incollare nel terminale, immettendo le vostre credenziali Ftp ed il percorso della cartella del sito dove salveremo lo scatto (foto). Le due righe di codice da modificare riguardanti le credenziali ftp iniziano con ncftpput, e salviamo poi con ctrl + x, confermando con si o yes, (dipende dalla lingua installata nel Raspberry) rendiamo lo script eseguibile con il comando: chmod 777 scatto3.sh

Script gestione scatto fotocamera e invio immagine al server:  ( la descrizione del codice e commenti vari sono tra ### cancelletto ###

#!/bin/bash

dn=$(php /home/pi/dn.php)

echo $dn "$uT"
if [ $dn = "1" ]
then
echo "Abilito la modalità giorno"

############### webcam Colere paese ################

### qui sotto nella linea di codice sono impostati i vari parametri  di scatto che nel mio caso sono quelli della fotocamera Canon Powershot S70 ###
###per altre fotocamere i parametri sono leggermente diversi ###

gphoto2 --camera "Canon Powershot S70 (PTP mode)" --set-config imagesize=4 --set-config imagequality=1 --set-config zoom=0 --set-config iso=1 --set-config photoeffect=1 --set-config shootingmode=0 --set-config whitebalance=2 --set-config meteringmode=2 --capture-image-and-download --force-overwrite --filename /home/pi/webcam0.jpg


######  con Imagemagick prendo la foto webcam0.jpg la ridimensiono a 1024x768 e faccio un pò di fuoco e risalvo la foto in webcam1.jpg ######
/usr/bin/convert /home/pi/webcam0.jpg -sharpen 0x1 -resize 1024x768 /home/pi/webcam1.jpg

####  con l'istruzione sotto, aggiungo la data  e l'orario  e risalvo in webcam2.jpg  ######
/usr/bin/convert -pointsize 20 -fill white -undercolor blue -gravity northwest -draw "text 850,10 \"$(date "+%H:%M %d.%m.%Y"|sed -e ' s/\"/\\\"/g' )\"" /home/pi/webcam1.jpg /home/pi/webcam2.jpg

#### qui aggiungo una descrizione in basso nella foto ######
/usr/bin/convert /home/pi/webcam2.jpg -font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf -pointsize 21 \
-draw "gravity South \
fill black text 0,12 'webcam in Colere, direzione Nord-Est, puntata sulla via Zanoli e frazione Valzella. by www.maxpiantoni.it' \
fill white text 1,11 'webcam in Colere, direzione Nord-Est, puntata sulla via Zanoli e frazione Valzella. by www.maxpiantoni.it' " \
/home/pi/webcam2.jpg

#### qui aggiungo un logo in basso a destra tramite l'istruzione -geometry +910+610  ######
/usr/bin/convert /home/pi/webcam2.jpg /home/pi/orsoscalve2.jpg -geometry +910+610 -composite /home/pi/webcam.jpg

#### ridimensiono la foto webcam a 300x255 che uso come anteprima nella home principale del mio sito ed aggiungo anche la data e l'orario dello scatto  ######
/usr/bin/convert /home/pi/webcam1.jpg -resize 300x255 -pointsize 18 -fill white -undercolor blue -gravity Southwest -draw "text 77,0 \"$(date "+%H:%M %d.%m.%Y"|sed -e ' s/\"/\\\"/g' )\"" /home/pi/webcammini.jpg

 #### con questa istruzione, ncftp invia la foto webcam.jpg al mio hosting server (mettere le vostre credenziali di accesso del vostro hosting, e mod. eventual. anche il percorso  ####

ncftpput -u nomeutenteftp -p password ftp.miodominio.it /public_html/webcam /home/pi/webcam.jpg

exit 0

                                                                                                                                           

else
if [ $dn = "2" ]
then
echo "Abilito la modalità notte"

############### webcam Colere paese ################

### qui sotto nella linea di codice sono impostati i vari parametri  di scatto che nel mio caso sono quelli della fotocamera Canon Powershot S70 ###
### per altre fotocamere i parametri sono leggermente diversi ###

gphoto2 --camera "Canon Powershot S70 (PTP mode)" --set-config /main/imgsettings/imagesize=4 --set-config /main/imgsettings/imagequality=1 --set-config /main/capturesettings/shootingmode=3 --set-config /main/capturesettings/zoom=0 --set-config /main/imgsettings/iso=1 --set-config /main/capturesettings/aperture=0 --set-config /main/imgsettings/photoeffect=0 --set-config /main/capturesettings/shutterspeed=0 --set-config /main/imgsettings/whitebalance=5 --set-config meteringmode=2 --get-all-metadata --capture-image-and-download --force-overwrite --filename /home/pi/webcam0.jpg


######  con l'app. Imagemagick prendo la foto webcam0.jpg la ridimensiono a 1024x768 e faccio un pò di fuoco e risalvo la foto in webcam1.jpg ######
/usr/bin/convert /home/pi/webcam0.jpg -sharpen 0x1 -resize 1024x768 /home/pi/webcam1.jpg

####  con l'istruzione di sotto aggiungo la data  e l'orario  e risalvo in webcam2.jpg  ######
/usr/bin/convert -pointsize 20 -fill white -undercolor blue -gravity northwest -draw "text 850,10 \"$(date "+%H:%M %d.%m.%Y"|sed -e ' s/\"/\\\"/g' )\"" /home/pi/webcam1.jpg /home/pi/webcam2.jpg

#### qui aggiungo una descrizione in basso nella foto #####
/usr/bin/convert /home/pi/webcam2.jpg -font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf -pointsize 21 \
-draw "gravity South \
fill black text 0,12 'webcam in Colere, direzione Nord-Est, puntata sulla via Zanoli e frazione Valzella. by www.maxpiantoni.it' \
fill white text 1,11 'webcam in Colere, direzione Nord-Est, puntata sulla via Zanoli e frazione Valzella. by www.maxpiantoni.it' " \
/home/pi/webcam2.jpg

#### qui aggiungo un logo in basso a destra tramite l'istruzione -geometry +910+610  ######
/usr/bin/convert /home/pi/webcam2.jpg /home/pi/orsoscalve2.jpg -geometry +910+610 -composite /home/pi/webcam.jpg

#### ridimensiono la foto webcam  a 300x 255 che uso come anteprima nella home principale del mio sito ed aggiungo anche la data e l'orario dello scatto  ######
/usr/bin/convert /home/pi/webcam1.jpg -resize 300x255 -pointsize 18 -fill white -undercolor blue -gravity Southwest -draw "text 77,0 \"$(date "+%H:%M %d.%m.%Y"|sed -e ' s/\"/\\\"/g' )\"" /home/pi/webcammini.jpg

 

 #### con questa istruzione: ncftp invia la foto webcam.jpg al mio hosting  (mettere le vostre credenziali ftp di accesso e modificare eventual. anche il percorso #### 

ncftpput -u nomeutenteftp -p password ftp.miodominio.it /public_html/webcam /home/pi/webcam.jpg

exit 0

fi
fi

exit 0

 

Il seguente script, dn.php non è mio, l'ho trovato in internet al sito: http://www.meteoliri.it/ : questo codice in php gestisce il calcolo effemeridi di alba e tramonto.

Per la creazione del file dn.php, è necessario digitare dal terminalesudo nano dn.php  ;si aprirà la solita schermata vuota dell'editor nano; copiare il codice sotto e incollare nel terminale, immettendo le vostre coordinate espresse  in gradi per la latitudine e la longitudine nelle rispettive righe. Salvare con ctrl + x ,confermando con si o yes. (dipende dalla lingua installata nel Raspberry)

Script dn.php

#!/usr/bin/php
<?php
$lat=45.97;
$long=10.08;
date_default_timezone_set('Europe/Rome');
$uT=time();
$sun_info = date_sun_info($uT, $lat,$long);
$sunrise = $sun_info['civil_twilight_begin'];
$sunset = $sun_info['civil_twilight_end'];
$alba = $sunrise+100;
$tramonto = $sunset-200;
if ($uT>$alba && $uT<$tramonto) echo "1";
else
echo "2";
?>

Infine per far eseguire lo script, scatto.sh ad intervalli regolari sarà sufficente richiamarlo dalla funzione di crontab;
esistono parecchi modi per ottenere l'operazione, personalmente ho fatto nel modo seguente:
digitare sudo crontab -e 

Si aprirà la schemata dell'editor nano e inseriamo dopo l'ultima riga il seguente codice:

15,30,45,00 * * * *    /home/pi/./scatto.sh
con queste impostazioni, come nel mio caso, la fotocamera scatta ogni 15 minuti cioè al 15°, al 30°, e al 45°, ed al 00° minuto di ogni ora.

In appendice ho pubblicato altri script per la gestione delle foto del giorno e che in pratica salva la foto della webcam ogni ora, e rinominandola con ora e minuti per poi inviarla al proprio sito.  Idem per creare la cartella ogni giorno con data e orario per creare un archivio da conservare per proprio uso.

Questo è  tutto:vi auguro buona sperimentazione, ricordo che se avete bisogno di qualche ulteriore delucidazione io sono disponibile e  potete contattarmi dalla pagina "Contatti"

Alcune foto della realizzazione

raspberry cam carbonera2

raspberry cam carbonera1
I vari componenti della realizzazione

 

Appendice:

A seguito di alcune richieste, pubblico alcuni script. Premetto che alcuni spunti li ho trovati seguendo le varie discussioni in merito, sul forum di meteonetwork e se siete appappasionati di meteo vi consiglio di iscrivervi. Il primo dei due script in codice php gestisce la rinomina della foto in ora e minuti e salva la foto nella cartella "foto_giorno" provvedete quindi a crearla all'interno del vostro user Pi. Da terminale  digitare: sudo nano foto_giorno.php e incolliamo il seguente codice, salviamo in ambito editor con Control + X confermando con Yes. Dopo aver salvato il file rendiamo lo script eseguibile con il comando: chmod 755 foto_giorno.php. Per far eseguire lo script vi consiglio di usare crontab schedulando con: sudo crontab -e  aggiungendo la seguente riga: 3 8-21 * * *   /home/pi/./foto_giorno.php   in questo caso crontab esegue lo script  alle 08.03  alle 09.03 alle 10.03 e via dicendo fino alle 21.03 - Ovviamente l'ora e i minuti di esempio li potete variare a vostro piacimento, ma vi consiglio qualche buona guida su crontab  che potrete trovare googolando.

 

#!/usr/bin/php

####### Script per rinominare la foto webcam.jpg con ora e minuti per le foto del giorno nella cartella: foto_giorno #######

$filename="webcam.jpg";
$ora = date("H.i");
$dir = "/home/pi/".$filename;
copy($dir, "/home/pi/foto_giorno/".$filename);
$new_file_name=$ora.'.'."jpg";
rename("/home/pi/foto_giorno/webcam.jpg", "/home/pi/foto_giorno/".$new_file_name);// rinomina
?>

Il secondo script in linguaggio Bash provvede al upload sul nostro sito o Hosting della foto rinominata dallo script precedente. Ovviamente dovrete creare sul vostro hosting la cartella che nel mio caso ho chiamato: foto_giorno  e aggiungere le vostre credendiali ftp per accedere al vostro sito. Quindi dal solito terminale: sudo nano upload_foto_giorno.sh  incollate il codice sotto, salvate con Control + X confermando con Yes. Dopo aver salvato il file rendiamo lo script eseguibile con il comando: chmod 755 upload_foto_giorno.sh. Per far eseguire lo script vi consiglio di usare crontab schedulando con: sudo crontab -e  aggiungete la seguenta riga: 5 8-21 * * *   /home/pi/./upload_foto_giorno.sh che in questo caso crontab esegue lo script  alle 08.05  alle 09.05 alle 10.05 e via dicendo fino alle 21.05. Ovviamente l'ora e i minuti di esempio li potete variare a vostro piaciment, ma vi consiglio qualche buona guida su crontab.

 

#!/bin/bash
###### Script per l'upload al mio sito (Hosting) della foto del giorno ######
 
ncftpput -u userftp -p password ftp.miosito.it /images/stories/foto_giorno /home/pi/foto_giorno/*.*
 
###### cancello la foto, (svuoto) la cartella locale dopo l'upload ######
 
rm -f /home/pi/foto_giorno/*.*
 
exit 0
 
Il terzo e quarto script in codice Bash riguarda la gestione della foto della webcam per creare una spece di archivio giornaliero da conservare a proprio uso. Il terzo script in pratica crea la cartella giorno mese e anno all'interno della cartella "archivio_storico" sul nostro server (quest'ultima cartella però la dobbiamo creare noi). Quindi da terminale: sudo nano crea-cartella-arch-storico.sh  incollate il codice sotto, salvate con Control + X confermando con Yes. Dopo aver salvato il file rendiamo lo script eseguibile con il comando: chmod 755 crea-cartella-arch-storico.sh  Scheduliamo con crontab come da esempio: 10 7 * * * /home/pi/crea-cartella-arch-storico.sh (alle 07.10 di ogni giorno crea la relativa cartella con nome giorno, mese, e anno).
 

#!/bin/bash
######## crea la cartella giorno mese e anno all'interno della cartella archivio_storico sul mio sito (hosting) ########

today=$(date +%d-%m-%Y)
mkdir $today
chmod 777 $today

ncftpput -R -v -u user -p password ftp.miosito.it /images/stories/archivio_storico $today
rmdir $today
exit 0

.
  
Il seguente quarto script  si incarica di salvare una foto ogni ora nella cartella creata dal terzo script per l'archivio storico sul nostro sito. Da terminale quindi: sudo nano foto-archivio-storico.sh incolliamo il codice sotto, salviamo il file con Control + X confermando con Yes. Uscire dall'editor e rendiamo lo script eseguibile con il comando: chmod 755 foto_archivio_storico.sh  scheduliamo con crontab da eseguire ogni ora come nel mio caso: 4 8-21 * * * /home/pi/foto_archivio_storico.sh
 
#!/bin/bash
##### script di wiki meteonetwork link: http://wiki.meteonetwork.it/index.php/Creazione_di_uno_Slidesow che ho adattato alle mie esigenze per salvare una foto ogni ora per l'archivio storico #####
 
cd /home/pi/
ORA=`date '+ %-H'`
MIN=`date '+ %-M'`
let ORA=ORA*100
TEMPO=$[$ORA+$MIN]
today=$(date +%d-%m-%Y)
temsca=$(date +%d-%m-%y_%H-%M)
echo $temsca
 
if [ $TEMPO -ge 0600 ] && [ $TEMPO -le 2200 ]
         then        
         cp webcam.jpg  $temsca".jpg"
         ncftpput -R -v -u userftp -p password ftp.miosito.it /images/stories/archivio_storico/$today $temsca".jpg"
         rm $temsca".jpg"
fi
 
exit 0
 
Ricordate di scaricare ogni 3 o 4 mesi tutte le relative cartelle con foto sul proprio computer per evitare di riempire tutto il vostro spazio a disposizione sul proprio sito.

Questo sito utilizza i cookie per migliorare la navigazione dell'utente. Navigandolo accetti.