Imprimante 3D

MultiCam Octoprint

Dans le tutoriel sur l’installation d’Octoprint, je vous proposais d’acheter deux webcams :

  • Une logitech c920
  • Une Picamera

Nous allons maintenant voir comment faire en sorte que nous puissions avoir le double flux vidéo. En effet, Octoprint nativement ne met a disposition qu’un seul flux vidéo, qui sera en premier lieu celui d’une webcam branchée en USB.

Pour rappel voici le matériel avec lequel j’ai écris ce tutoriel :

Logitech C920 HD Pro Webcam

Logitech C920 HD Pro Webcam,
Appels Vidéo Full HD 1080p à 30ips, Son Stéréo, Correction d’Éclairage HD, Portable/PC/Mac/Android – Noir
≃ 87.10€

Raspberry Pi v2.1 8 MP 1080p Module Caméra

Raspberry Pi v2.1 8 MP 1080p Module Caméra ≃ 27€

Ainsi qu’un câble plus long pour brancher la picam

AZDelivery Câble de remplacement flex 200 cm pour caméra/écran Raspberry pi et Arduino ≃ 6.3€

Un peu de théorie

Comme vous avez pu le voir, Octoprint gère très bien une webcam, en fait Octoprint met en place un flux vidéo via un programme Linux appelé mjpg-streamer. Le principe est en fait relativement simple. Ce logiciel récupère le flux de votre webcam pour le transformer en un flux HTTP. c’est en gros un serveur de streaming pour faire simple.

Pour le prouver c’est très simple , reprenons un scan de notre Raspberry:

Comme vous pouvez le voir nous avons un port ouvert sur le Raspberry en 8080.

Si à l aide de votre navigateur internet vous décidiez de visiter l’adresse Ip de votre Raspberry en spécifiant le port vous retrouveriez les images de votre caméra.
Pour faire cela tapez : http://192.168.0.10:8080 dans la barre d’adresse. Bien sûr, changez l’adresse ip de cette adresse par celle de votre Raspberry.
Et voila ce que vous devriez obtenir :


Pourtant dans la configuration d’Octoprint on appelle une autre URL pour tester votre flux vidéo, il propose un : /webcam/?action=stream et aussi un http://127.0.0.1:8080/?action=snapshot.

Une petite explication s’impose.

En informatique l’adresse 127.0.0.1 est ce que l on appelle un localhost. En gros ça veut dire appelle toi toi-même. Votre Octoprint s’appelle lui même sur le port 8080, qui est comme on l’a vu le port du streaming vidéo.
Mais alors pourquoi on parle de /webcam/ ?

Et bien tout simplement pour vous faciliter la vie, il est plus simple de se rappeler d’une URL comme ceci : http://192.168.0.10/webcam/ que de se souvenir d’un port ce qui donne http://192.168.0.10:8080.

Pour cela nous utilisons le programme HAPROXY qui va servir de passe plat. Il prend tout ce qui vient sur /webcam/ pour l’envoyer sur le port 8080.

Maintenant que ces notions théoriques sur le fonctionnement ont été vues nous allons voir comment mettre en place un deuxième flux vidéo très simplement.

Activer une deuxième Webcam sur Octoprint

Objectif

Le but est de faire en sorte que nous ayons un nouveau flux vidéo provenant de la Picam :

  • Ce flux sera disponible sur le port 8081
  • Ce flux pourra aussi être appelé avec une Url simplifiée /picam/

Paramétrage de la Picaméra

Nous allons pour cela nous connecter via Putty sur votre Raspberry. Si vous ne l’avez jamais fait je vous invite à lire le tutoriel sur la sécurisation de votre Octoprint .

Le but du jeu est de faire en sorte simplement que le flux se lance à chaque redémarrage de votre Raspberry. Nous allons pour cela utiliser les taches planifiées de linux appelées aussi cron.

Crontab

Copier la ligne de code ci-dessous après être passé en super utilisateur (la commande ‘sudo su -‘)

Attention cette ligne de commande ne marche que pour la Pi cam !!!

 
echo '@reboot /home/pi/mjpg-streamer/mjpg_streamer -i "/home/pi/mjpg-streamer/input_raspicam.so -fps 15 -x 1920 -y 1080" -o "/home/pi/mjpg-streamer/output_http.so -w /home/pi/mjpg-streamer/www -p 8081"' >> /root/crontab && crontab /root/crontab

Grâce à cette simple commande nous allons avoir un flux disponible directement à l’adresse http://192.168.0.10:8081 et cela même si votre Raspberry redémarre.
Pour tester redémarrer votre Raspberry et rendez vous sur le port 8081 de votre Raspberry, vous devriez avoir ceci :


Félicitation, votre flux est disponible !!!

Vous pouvez vous arrêtez là ou alors pousser un peu plus loin la réflexion..

Haproxy

Nous allons faire en sorte que tout ce qui va vers l’URL de votre Octoprint en /picam/ soit dirigé vers le port 8081
Connectez vous à l’aide de Putty à votre Raspberry et passez en mode super utilisateur.
Nous allons copier coller dans le terminal toutes ces lignes, vous pouvez toutes les sélectionner d’un coup puis collez le tout dans le terminal et appuyer sur la touche Entrée de votre clavier.

 
sed -i '25i    use_backend picam if { path_beg  /picam/ }' /etc/haproxy/haproxy.cfg &&
echo "backend picam" >> /etc/haproxy/haproxy.cfg &&
echo "reqrep ^([^\ :]*)\ /picam/(.*)    \1\ /\2" >> /etc/haproxy/haproxy.cfg &&
echo "server webcam2 127.0.0.1:8081" >> /etc/haproxy/haproxy.cfg &&
echo "errorfile 503 /etc/haproxy/errors/503-no-webcam.http" >> /etc/haproxy/haproxy.cfg &&
/etc/init.d/haproxy restart

Vous pouvez directement tester en vous rendant sur votre URL http://192.168.0.10/picam/ , n’oubliez pas le / à la fin de l URL et de changer avec l’adresse Ip de votre Raspberry.

Bonus : et si ma deuxième caméra est USB?

Et bien vous pouvez reprendre toutes les étapes de la picamera en changeant juste le crontab comme ci-desoous :

 
echo '@reboot /home/pi/mjpg-streamer/mjpg_streamer -i "/home/pi/mjpg-streamer/input_uvc.so -d /dev/video0 -n -f 15 -r 1920x1080" -o "/home/pi/mjpg-streamer/output_http.so -w /home/pi/mjpg-streamer/www -p 8081"' >> /root/crontab && crontab /root/crontab

Ce que vous avez a change suivant votre configuration :

  • -d /dev/video0 : ceci est le point de montage dans linux de votre webcam , utilise la commande dmesg dans le terminal en SSH,pour le trouver
  • – r 1920×1080 : la résolution de ta webcam
  • -p 8081 pour un autre port si déjà utilisé comme le 8082 par exemple

Il ne te reste plus bien sur qu a faire ta configuration haproxy en changeant le terme picam par celui que tu veux.

Conclusion

Voila en quelques instant vous avez maintenant un deuxième flux vidéo pour surveiller sous un autre angle vos prints. Mais pas que cela !!! Grace à des plugins comme Octolapse vous allez aussi pouvoir faire des Timelaps sous deux angles différents !!! Cela nous l’explorerons dans un autre tutoriel sur Octoprint

A noter aussi que rien ne vous empêche à rajouter un troisième, ou un quatrième flux vidéo, il suffit juste de changer le port de sortie !! Mais attention de pas trop en mettre car votre Raspberry n ‘est pas très puissant et la gestion d’un flux vidéo est relativement gourmand en ressource.
18 commentaires
  • Christian
    Répondre

    Bonjour Ivan,

    Ce que je regrette dans tes tutos, c’est l’emploi de termes anglicisé, comme « Timelaps » et d’autres du genre. Je pratique l’anglais sous la tortue et même si j’ai des bases il y a des gens qui s’intéressent à ce genre de technologie, mais qui ne sont pas forcément doués en Anglais. Une traduction vers le réel sens du mot en français serait, il me semble, très intéressante. Je continue à lire tes Tutos, c’est super ce que tu as fait.

    1. TM
      Répondre

      Merci christian, pour ça que j ai aussi fait le tutos de traduction d’octoprint en français. Le souci pour le terme Timelapse, c est que j ai pas trouvé de traduction vraiment parlante pour remplacer ce terme. Je suis ouvert à la suggestion

  • Joël
    Répondre

    Bonjour,
    Je bloque dès la première instruction:
    echo ‘@reboot /home/pi/mjpg-streamer/mjpg_streamer -i « /home/pi/mjpg-streamer/input_raspicam.so -fps 15 -x 1920 -y 1080 » -o « /home/pi/mjpg-streamer/output_http.so -w /home/pi/mjpg-streamer/www -p 8081″‘ >> /root/crontab && crontab /root/crontab
    y’a bien un fichier crontab créé, avec en contenu cette phrase.
    mais l’instruction http://192.168.1.30:8081 m’indique « site inaccessibledonc pas de flux.
    La différence au niveau du Pi et de la caméra pi est que j’i utilisé deux adaptateurs( « nappe de connexion »/ »hdmi « ), permettant d’utiliser un câble hdmi plus long, plus solide, etc que la nappe de fils habituelle.

  • Joël
    Répondre

    toujours en attente de modération depuis le 5 septembre ?

  • Denovan
    Répondre

    Bonjour
    J’ai suivi ton tuto a la lettre>>> ET je n’ai meme plus l’affichage d’octoprint>. Si tu avais une solution pour que je retrouve ma config originale, ca m’eviterait de tout re-installer> Pourtant, a t’ecouter, ca avait l’air simple

  • Sébastien
    Répondre

    Bonjour, je viens d’essayer votre tuto, et c’est la galère 😐
    j’ai bien un flux sur le port 8081, mais je n’ai plus d’accès au port 8080 (même si je débranche la seconde cam usb, le flux 8081 est reporté sur la cam 1) mais surtout, je n’ai plus accès à octoprint (Ce site est inaccessible)
    comment puis-je me dépanner ?
    merci

  • Sébastien
    Répondre

    Hello,
    bon ben j’ai tout réinstallé, mais bon j’aimerais bien gérer mes deux flux USB, je ne sais pas où j’ai merdé

  • bernard
    Répondre

    Bonjour j’ai eu le même problème, j’ai recommencé 3 fois mais la 3eme fois avant de faire le tuto j’ai ouvert putty pour faire : sudo apt -get update puis, sudo apt-get upgrade, puis sudo apt- get install vim, puis sudo reboot
    ensuite j’ai suivi pas à pas le tuto et ça fonctionne
    avant de faire le tuto j’avais fait une sauvegarde d’octoprint au cas ou…
    voilà si ça peut aider

  • Jraf56
    Répondre

    Bonjour. PI4B avec 4go ram, picam V2 + endoscope usb, ça a fonctionné, merci beaucoup !!! mais, ma picam était devenue horriblement lente, delai de 2 à 3 secondes, 2 à 3 images par seconde. j’ai bypassé le haproxy et dans multicam plugin, j’ai indiqué l’adresse en dur avec le port 8081/?action=stream. elle est un peu moins nerveuse qu’avant (je crois…) mais c’est très supportable. quoi qu’il en soit, merci encore et bonne journée

    1. TM
      Répondre

      avec plaisir et bon print

  • Teddy
    Répondre

    bonjour, pareil, j’ai perdu mon accès a octoprint! après avoir réssayer plusieur fois la manip, j’ai bien les 2 caméras opérationnel mais plus Octoprint.
    Est ce que quelqu’ un a la solution S’il vous plaît. Merci

    1. TM
      Répondre

      desole pour le temps d attente, mais as tu verifier que tes deux process tourne bien sur des port 8080 et 8081 et non pas le 80? car le 80 est le port http de base et donc du serveur octoprint

  • Cyrille
    Répondre

    Salut,
    Je suis à la fois perdu et surpris: L’année dernière, j’ai suivi ton tuto pour mettre deux caméras sur mon premier octoprint et ça fonctionne nickel! J’ai voulu renouveler l’opération avec un deuxième raspberry (3b+). je dois en être à la 5ème tentatives. dans mon cas j’ai une picam qui est deja installée et qui fonctionne. je souhaite ajouter une cam usb. j’essaie donc avec la dernière ligne de commande de ton tuto mais je ne parviens pas à obtenir une image sur le port 8081/?action=stream
    j’ai cherché la partie a modifier en faisant la commande dmesg mais je ne parviens pas a voir ce qu’il faut changer

    1)
    [ 4.642994] of_cfs_init
    [ 4.648914] of_cfs_init: OK
    [ 4.657055] Waiting for root device PARTUUID=9986153b-02…
    [ 4.704960] mmc0: host does not support reading read-only switch, assuming wr ite-enable
    [ 4.721613] mmc0: new high speed SDHC card at address 0001
    [ 4.731076] usb 1-1: new high-speed USB device number 2 using dwc_otg
    [ 4.740781] Indeed it is in host mode hprt0 = 00001101
    [ 4.809851] mmcblk0: mmc0:0001 SD16G 14.9 GiB
    [ 4.821652] mmcblk0: p1 p2
    [ 4.846718] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. O pts: (null)
    [ 4.861250] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
    [ 4.881497] devtmpfs: mounted
    [ 4.895976] Freeing unused kernel memory: 420K
    [ 4.903669] Kernel memory protection not selected by kernel config.
    [ 4.913125] Run /sbin/init as init process
    [ 4.920280] with arguments:
    [ 4.920299] /sbin/init
    [ 4.920311] with environment:
    [ 4.920325] HOME=/
    [ 4.920336] TERM=linux
    [ 4.991606] usb 1-1: New USB device found, idVendor=0424, idProduct=9514, bcd Device= 2.00
    [ 5.006479] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
    [ 5.021292] hub 1-1:1.0: USB hub found
    [ 5.030189] hub 1-1:1.0: 5 ports detected
    [ 5.361077] usb 1-1.1: new high-speed USB device number 3 using dwc_otg
    [ 5.501593] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00, b cdDevice= 2.00
    [ 5.516572] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber =0
    [ 5.534254] smsc95xx v2.0.0
    [ 5.897398] systemd[1]: System time before build time, advancing clock.
    [ 5.919421] libphy: smsc95xx-mdiobus: probed
    [ 5.932157] smsc95xx 1-1.1:1.0 eth0: register ‘smsc95xx’ at usb-20980000.usb- 1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:ce:cd:d3
    [ 6.047580] NET: Registered protocol family 10
    [ 6.055682] usb 1-1.3: new high-speed USB device number 4 using dwc_otg
    [ 6.068402] Segment Routing with IPv6
    [ 6.167436] systemd[1]: systemd 241 running in system mode. (+PAM +AUDIT +SEL INUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL + XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybr id)
    [ 6.201652] systemd[1]: Detected architecture arm.
    [ 6.237841] systemd[1]: Set hostname to .
    [ 6.259312] random: systemd: uninitialized urandom read (16 bytes read)
    [ 6.269758] systemd[1]: Initializing machine ID from random generator.
    [ 6.280480] systemd[1]: Installed transient /etc/machine-id file.
    [ 6.580173] usb 1-1.3: New USB device found, idVendor=0c45, idProduct=6366, b cdDevice= 1.00
    [ 6.595239] usb 1-1.3: New USB device strings: Mfr=2, Product=1, SerialNumber =3
    [ 6.606037] usb 1-1.3: Product: USB Live camera
    [ 6.614005] usb 1-1.3: Manufacturer: Sonix Technology Co., Ltd.
    [ 6.623300] usb 1-1.3: SerialNumber: SN0001
    [ 7.932938] uart-pl011 20201000.serial: no DMA platform data
    [ 9.325939] random: systemd: uninitialized urandom read (16 bytes read)
    [ 9.365046] random: systemd: uninitialized urandom read (16 bytes read)
    [ 9.380573] systemd[1]: Created slice User and Session Slice.
    [ 9.394514] random: systemd: uninitialized urandom read (16 bytes read)
    [ 9.406383] systemd[1]: Listening on Journal Socket (/dev/log).
    [ 9.420205] systemd[1]: Reached target Swap.
    [ 9.432185] systemd[1]: Reached target Slices.
    [ 9.449835] systemd[1]: Created slice system-serial\x2dgetty.slice.
    [ 11.291855] systemd[1]: Starting File System Check on Root Device…
    [ 11.484919] systemd[1]: Mounted Kernel Configuration File System.
    [ 11.831288] systemd[1]: Started Apply Kernel Variables.
    [ 12.023653] systemd[1]: Started File System Check Daemon to report status.
    [ 12.333165] systemd[1]: Started Journal Service.
    [ 26.247933] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
    [ 26.841715] systemd-journald[91]: Received request to flush runtime journal f rom PID 1
    [ 29.349246] mc: Linux media interface: v0.10
    [ 29.461413] vc_sm_cma: module is from the staging directory, the quality is u nknown, you have been warned.
    [ 29.464185] bcm2835_vc_sm_cma_probe: Videocore shared memory driver
    [ 29.464227] [vc_sm_connected_init]: start
    [ 29.496929] [vc_sm_connected_init]: installed successfully
    [ 29.651876] videodev: Linux video capture interface: v2.00
    [ 29.674880] snd_bcm2835: module is from the staging directory, the quality is unknown, you have been warned.
    [ 29.758087] bcm2835_mmal_vchiq: module is from the staging directory, the qua lity is unknown, you have been warned.
    [ 29.762798] bcm2835_mmal_vchiq: module is from the staging directory, the qua lity is unknown, you have been warned.
    [ 29.766847] bcm2835_audio bcm2835_audio: card created with 8 channels
    [ 29.767150] bcm2835_mmal_vchiq: module is from the staging directory, the qua lity is unknown, you have been warned.
    [ 29.787648] bcm2835_v4l2: module is from the staging directory, the quality i s unknown, you have been warned.
    [ 29.805066] bcm2835_isp: module is from the staging directory, the quality is unknown, you have been warned.
    [ 29.876356] bcm2835_codec: module is from the staging directory, the quality is unknown, you have been warned.
    [ 30.456172] bcm2835-isp bcm2835-isp: Device node output[0] registered as /dev /video13
    [ 30.457072] bcm2835-codec bcm2835-codec: Device registered as /dev/video10
    [ 30.457164] bcm2835-codec bcm2835-codec: Loaded V4L2 decode
    [ 30.466476] bcm2835-isp bcm2835-isp: Device node capture[0] registered as /de v/video14
    [ 30.482102] bcm2835-isp bcm2835-isp: Device node capture[1] registered as /de v/video15
    [ 30.486349] bcm2835-isp bcm2835-isp: Device node stats[2] registered as /dev/ video16
    [ 30.486418] bcm2835-isp bcm2835-isp: Register output node 0 with media contro ller
    [ 30.486464] bcm2835-isp bcm2835-isp: Register capture node 1 with media contr oller
    [ 30.486497] bcm2835-isp bcm2835-isp: Register capture node 2 with media contr oller
    [ 30.486527] bcm2835-isp bcm2835-isp: Register capture node 3 with media contr oller
    [ 30.487004] bcm2835-codec bcm2835-codec: Device registered as /dev/video11
    [ 30.498064] bcm2835-codec bcm2835-codec: Loaded V4L2 encode
    [ 30.501952] bcm2835-isp bcm2835-isp: Loaded V4L2 bcm2835-isp
    [ 30.573742] bcm2835-codec bcm2835-codec: Device registered as /dev/video12
    [ 30.583763] bcm2835-codec bcm2835-codec: Loaded V4L2 isp
    [ 30.587260] bcm2835-v4l2-0: scene mode selected 0, was 0
    [ 30.588063] bcm2835-v4l2-0: V4L2 device registered as video0 – stills mode > 1280×720
    [ 30.594986] bcm2835-codec bcm2835-codec: Device registered as /dev/video18
    [ 30.595101] bcm2835-codec bcm2835-codec: Loaded V4L2 image_fx
    [ 30.676219] bcm2835-v4l2-0: Broadcom 2835 MMAL video capture ver 0.0.2 loaded .
    [ 32.962160] uvcvideo: Found UVC 1.00 device USB Live camera (0c45:6366)
    [ 33.074138] input: USB Live camera: USB Live cam as /devices/platform/soc/2 0980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/input/input0
    [ 33.075072] usbcore: registered new interface driver uvcvideo
    [ 33.075099] USB Video Class driver (1.1.1)
    [ 33.520177] usb 1-1.3: 3:1: cannot get freq at ep 0x84
    [ 33.723255] usbcore: registered new interface driver snd-usb-audio
    [ 43.953907] 8021q: 802.1Q VLAN Support v1.8
    [ 44.090722] random: crng init done
    [ 44.090764] random: 6 urandom warning(s) missed due to ratelimiting
    [ 44.991144] usb 1-1.3: reset high-speed USB device number 4 using dwc_otg
    [ 45.221288] cfg80211: Loading compiled-in X.509 certificates for regulatory d atabase
    [ 45.465094] Adding 102396k swap on /var/swap. Priority:-2 extents:4 across:2 23648k SSFS
    [ 46.079058] cfg80211: Loaded X.509 cert ‘sforshee: 00b28ddf47aef9cea7’
    [ 47.104760] SMSC LAN8700 usb-001:003:01: attached PHY driver [SMSC LAN8700] ( mii_bus:phy_addr=usb-001:003:01, irq=POLL)
    [ 47.117977] smsc95xx 1-1.1:1.0 eth0: hardware isn’t capable of remote wakeup
    [ 47.123502] smsc95xx 1-1.1:1.0 eth0: Link is Down
    [ 47.956811] EXT4-fs (mmcblk0p2): resizing filesystem from 541184 to 3834368 b locks
    [ 49.212692] smsc95xx 1-1.1:1.0 eth0: Link is Up – 100Mbps/Full – flow control off
    [ 49.212789] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
    [ 58.383178] EXT4-fs (mmcblk0p2): resized to 2621440 blocks
    [ 64.879413] EXT4-fs (mmcblk0p2): resized filesystem to 3834368
    pi@octopi:~ $>

    help!

    1. TM
      Répondre

      tu as installé une image d’ocotprint ou tu l as monté depuis une ultime version de raspbian? débranche ta cam, fait un dmesg -C puis branche la cam et refait un dmesg et poste le resultat stp

  • Alain06
    Répondre

    Bonjour,
    Comment tu obtiens la première copie d’écran sous  »reprenons un scan de notre Raspberry ».
    Félicitations pour tous tes tutos très pédagogiques.

    1. TM
      Répondre

      si tu parles des scans des ports, tu utilises la commande netstat -anp

  • Alain
    Répondre

    Bonjour
    juste après un peu de théorie, tu présente un tableau du scan du Raspberry, où l’on peut voir un port ouvert en 8080. Comment obtiens-tu ce tableau ?
    Merci et encore félicitation pour ta générosité et tes tutos. J’espère qu’ils te seront profitables.

    1. TM
      Répondre

      netstat -anp c est la commande sous linux pour voir les ports ouverts

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *