Подключение и настройка веб камеры к Octoprint

Если вам нужна поддержка веб-камеры и таймлапса, вам необходимо загрузить и скомпилировать MJPG-Streamer.

MJPG-Streamer - это приложение, которое копирует кадры JPEG из одного или нескольких источников, например веб камеры в один или несколько подключаемых модулей вывода. например HTTP сервер.

Установите зависимости необходимые для сборки:

cd ~
sudo apt install cmake libjpeg8-dev gcc g++

Клонируйте исходный код MJPG-стримера и соберите его:

git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make
sudo make install

Если все прошло успешно, попробуйте протестировать MJPG-стример запустив его командой:

Не забудьте перед этим подключить камеру к МК

mjpg_streamer -i "input_uvc.so -d /dev/video0" -o "output_http.so"

Это должно дать вывод похожий на вывод показанный ниже:

MJPG Streamer Version: svn rev:
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 5
 i: Format............: MJPEG
[...]
 o: www-folder-path...: disabled
 o: HTTP TCP port.....: 8080
 o: username:password.: disabled
 o: commands..........: enabled

Если ничего получилось, проверьте список доступных в вашей системе видео устройств ls -la /dev/video* и запустите команду для каждого из них.

Для некоторых веб-камер (включая PS3 Eye) вам потребуется принудительно включить режим YUV, используя следующую команду запуска:

mjpg_streamer -i "input_uvc.so -d /dev/video0 -y" -o "output_http.so" 

Имейте в виду, что режим YUV создает дополнительную нагрузку на ЦП вашего МК, что снижает производительность, иногда, вплоть до проблем с печатью. Если вашей камере для работы требуется параметр -y, подумайте о её замене на ту, которая поддерживает формат MJPEG.

Протестируйте веб-камеру открыв в браузере URL http://<IP вашего МК>:8080/?action=stream

Пример: http://192.168.0.3:8080/?action=stream

Позже, для настройки передачи видео в Облако, вам потребуется адрес снепшота, а не потока, он будет выглядеть как http://192.168.0.3:8080/?action=snapshot

Как узнать IP моего МК с Octoprint?

Запуск камеры при старте МК

Для запуска веб камеры при старте МК необходимо создать скрипты запуска.

Создайте файл /home/pi/scripts/webcam со следующим содержимым:

#!/bin/bash
# Start / stop streamer daemon

case "$1" in
    start)
        /home/pi/scripts/webcamDaemon >/dev/null 2>&1 &
        echo "$0: started"
        ;;
    stop)
        pkill -x webcamDaemon
        pkill -x mjpg_streamer
        echo "$0: stopped"
        ;;
    *)
        echo "Usage: $0 {start|stop}" >&2
        ;;
esac

Создайте файл /home/pi/scripts/webcamDaemon:

#!/bin/bash

MJPGSTREAMER_HOME=/home/pi/mjpg-streamer/mjpg-streamer-experimental
MJPGSTREAMER_INPUT_USB="input_uvc.so"
MJPGSTREAMER_INPUT_RASPICAM="input_raspicam.so"

# init configuration
camera="auto"
camera_usb_options="-r 640x480 -f 10"
camera_raspi_options="-fps 10"

if [ -e "/boot/octopi.txt" ]; then
    source "/boot/octopi.txt"
fi

# runs MJPG Streamer, using the provided input plugin + configuration
function runMjpgStreamer {
    input=$1
    pushd $MJPGSTREAMER_HOME
    echo Running ./mjpg_streamer -o "output_http.so -w ./www" -i "$input"
    LD_LIBRARY_PATH=. ./mjpg_streamer -o "output_http.so -w ./www" -i "$input"
    popd
}

# starts up the RasPiCam
function startRaspi {
    logger "Starting Raspberry Pi camera"
    runMjpgStreamer "$MJPGSTREAMER_INPUT_RASPICAM $camera_raspi_options"
}

# starts up the USB webcam
function startUsb {
    logger "Starting USB webcam"
    runMjpgStreamer "$MJPGSTREAMER_INPUT_USB $camera_usb_options"
}

# we need this to prevent the later calls to vcgencmd from blocking
# I have no idea why, but that's how it is...
vcgencmd version

# echo configuration
echo camera: $camera
echo usb options: $camera_usb_options
echo raspi options: $camera_raspi_options

# keep mjpg streamer running if some camera is attached
while true; do
    if [ -e "/dev/video0" ] && { [ "$camera" = "auto" ] || [ "$camera" = "usb" ] ; }; then
        startUsb
    elif [ "`vcgencmd get_camera`" = "supported=1 detected=1" ] && { [ "$camera" = "auto" ] || [ "$camera" = "raspi" ] ; }; then
        startRaspi
    fi

    sleep 120
done

Добавьте следующую строку в /etc/rc.local (перед exit 0):

/home/pi/scripts/webcam start