
Matériel nécessaire
- un Raspberry Pi (le pi3 dans mon cas) avec son alim et sa carte micro sd :
- un Arduino nano :
- une camera pi :
- un pan tilt 2 axes :
- Deux servo-moteur :
Ce qui donne une fois les servo-moteurs montés dans le pan tilt :
Et le montage complet :
La méthode la plus efficace et la plus simple pour le streaming que j'ai testé est celle utilisant MJPG-Streamer, nous allons donc télécharger ce programme et le dépendances, et le construire.
Considérons que le Raspberry est à jour et le ssh activé, sinon suivez ce tuto en premier.
Le programme de l'Arduino
Le Raspberry étant multitâche (micro-processeur), il ne consacre pas 100% de son temps à votre programme en python, ce qui cause certaines irrégularités dans le signal PWM transmis au servomoteur.
On utilise donc un Arduino pour contrôler les servo-moteurs ou un chipset type Attiny ou autre, Adafruit a sortie ceci pour le Raspberry.
J'utilise un Arduino car j'en ai sous la main, et pour 2 servos c'est suffisant, sinon la carte Adafruit permet de contrôler 12 servos par I2C.
Voici le programme à téléverser dans l'Arduino :
servocam.ino
Il est simple, dés que le programme servo.py sur le Raspberry pi envoi une commande par la com série, il la lit et exécute l'action en fonction de la commande, ici 0, 1, ... ou 5.
Si vous ne savez pas comment téléverser le programme dans l'arduino, regarder ce tuto, le principe est le même.
Installation de MJPG-Streamer sur le Raspberry Pi :
Dans un premier temps on installe subversion et les dépendances pour MJPG-Streamer, pour cela on tape dans le terminal:
sudo apt-get install subversion libjpeg8-dev imagemagick libv4l-dev -y
Puis on crée le lien symbolique manquant:
sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
Ensuite on télécharge MJPG-Streamer :
svn co https://svn.code.sf.net/p/mjpg-streamer/code/
on se rend dans le dossier :
cd code/mjpg-streamer
on construit le programme :
make mjpg_streamer input_file.so output_http.so
puis
sudo cp mjpg_streamer /usr/local/bin
et
sudo cp output_http.so input_file.so /usr/local/lib/
et enfin
sudo cp -R www /usr/local/www
Voilà pour l'installation de MJPG-Streamer.
Pour tester tout ça, dans votre terminal, vous tapez la commande suivante qui lance la prise de photo (dans le dossier tmp pour le moment):
raspistill --nopreview -w 1024 -h 760 -q 40 -o /tmp/pic.jpg -tl 100 -t 600000 -th 0:0:0
puis dans un second terminal, lancez le server MJPG-Streamer avec la commande suivante :
LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i "input_file.so -f /tmp -n pic.jpg" -o "output_http.so -w /usr/local/www"
Maintenant ouvrez dans votre navigateur cette adresse : http://192.168.XXX.XXX:8080 (remplacez par l'adresse ip de votre Raspberry pi) si vous êtes en SSH ou http://localhot:8080 si vous êtes en local.
Vous tombez sur la page d'accueil du serveur MJPG-Streamer comme ceci :
Vous pouvez tester sur cette page les différentes méthodes, le dossier se trouve sur le pi dans /usr/local/www/, il y a les exemples des pages HTML.
si tout est ok, on va supprimer le dossier d'installation :
cd /home/pi
et
sudo rm -r /home/pi/code
On va également copier une page web d'exemple et la renommer en : cam.html
sudo cp /usr/local/www/stream_simple.html /usr/local/www/cam.html
Installation des outils et lidrairies pour Python et de git
On tape:
sudo apt-get install python-dev python-openssl python-pip git -y
puis
sudo pip install psutil && sudo pip install pyserial
Installation d'Apache et PHP
sudo apt-get install apache2 php5 libapache2-mod-php5 php5-mysql -y
Puis on se rend dans le dossier html:
cd /var/www/html/
On enlève la page d'accueil d'apache
sudo rm index.html
On va donner les droits au dossier web à l'utilisateur pi: (pour un site en local, sinon faut passer par des liens symboliques et sécuriser apache)
sudo chown www-data:pi /var/www/html/
Puis
sudo chmod 770 /var/www/html/
Mise en place de la page web
on va télécharger la page web:
cd /home/pi
puis
git clone https://github.com/weedmanu/Camera-pi-LiveStream-width-control.git
On copie le dossier qui contient les scripts marche arret dans /home/pi
mv Camera-pi-LiveStream-width-control/stream -t /home/pi/
Puis on copie le dossier du site web dans /var/www/html
mv /home/pi/stream/LiveStream -t /var/www/html/
Et on supprime le dossier :
sudo rm -r /home/pi/Camera-pi-LiveStream-width-control
On ajoute les programmes cam.py et servo.py au démarrage du pi, ils écoutes les boutons et agissent en fonction.
sudo nano /etc/rc.local
Puis ajoutez ces lignes avant exit :
python /home/pi/stream/servocam.py &
comme ceci :
on donne les droits en écriture :
sudo chown -R www-data:pi /var/www/html/
sudo chmod -R 770 /var/www/html/
Puis on redémarre le pi:
sudo reboot
Maintenant tapez cette adresse dans votre navigateur :
http://192.168.XXX.XXX/LiveStream/
Bien sur, on remplace 192.168.XXX.XXX par l'adresse ip de son Raspberry pi.
Voila ce que cela donne :
Quand le livestreaming n'est pas activé :
Quand le livestreaming est activé :
Quand on prend une photo :
Le fonctionnement
les boutons sur la page web écrivent un chiffre dans les fichiers cam.txt pour play/stop, servo.txt pour les flèches et photo.txt pour prendre les photos.
Le programme servocam.py qui est lancé au démarrage du pi, lit toutes les secondes les fichiers txt.
Par défaut il y a écrit 0 dans ces fichiers
Le programme servocam.py :
- s'il lit 0 dans les 3 fichiers (servo.txt, cam.txt et photo.txt), il ne fait rien .
- s'il lit 1 dans cam.txt, il lance le script play.sh et s'il lit 2 , lance le script stop.sh (ce qui lance ou stop le livestreaming).
- s'il lit 1 dans le fichier photo.txt, il prend une photo et s'il lit 2 il efface les photos.
- suivant le chiffre qu'il lit dans servo.txt, il enverra une commande au programme de l'arduino pour faire bouger la camera.
- après chaque action, il remet 0 dans ces fichiers
Les codes sont consultable sur mon github si vous voulez les consulter.