Делаем таймлапс для 3D принтера при помощи Raspberry Pi

Таймлапс - видео, сделанное из серии картинок, снятых с определённым интервалом в течении длительного времени.

В этом примере мы сделаем таймлапс, который будет делать снимки не через интервал времени, а по событиям, таким как: нажатие кнопки, срабатывания концевика, срабатывания датчика и т. п. В нашем случае это будет цифровой датчик линии и мы будем делать таймлапс для 3D принтера. Для того чтоб этот пример работал необходимо добавить в файл gcode для печати координаты "убирания" головки принтера после каждого слоя на заданную координату, где будет прикреплён датчик линии. Для этого можно воспользоваться нашим модификатором g-code. Перед тем как приступить к данному руководству, необходимо настроить ваш Raspberry Pi по этому руководству.

Нам понадобятся:

Для подключения к Raspberry Pi необходим компьютер с ОС Windows, GNU/Linux или MacOS. Для подключения мы будем использовать ssh. На компьютерах под управлением GNU/Linux и MacOS должен стоять пакет openssh, для Windows можно использовать Putty, Cygwin, Windows Terminal, Termius и т.п. В нашем примере мы будем использовать ПК на ОС Windows и менеджер удалённых подключений PuTTY.

Так же, начиная с Windows 10 october 2018 update майкрософт что-то сделали с mDNS сервером и для обнаружения Raspberry не по IP адресу, а по имени необходимо установить mDNS. Мы будем использовать самый легкий от Apple (ирония), Bonjour Print Services for Windows v2.0.2 . Скачать можно тут.

Подключение:

Чтобы подключить камеру, нужно аккуратно выдвинуть до упора черную защёлку в сторону  от печатной платы в плоскости печатной платы на разъёме камеры, вставить шлейф камеры контактами к печатной плате и закрыть защёлку:

Далее мы припаяем колодку из трёх контактов к выводам GND, GPIO23, GPIO24, подключим к ней датчик линии и приготовим USB кабель для подключения к блоку питания:

Внимане! Запитывать датчик мы будем от вывода GPIO23. Выводы GPIO Raspberry могут выдерживать максимальную нагрузку в 16 мА на вывод, при этом общая нагрузка на все выводы не должна превышать 51 мА. Наш датчик потребляет 10 мА, что вписывается в данные требования.

Перед включением:

Мы хотим, чтоб наша Raspberry при первой же загрузке подключилась к WiFi и открыла доступ по SSH, поэтому прежде чем извлекать SD карту из компьютера, на котором она была сделана, необходимо создать два файла (ssh.txt и wpa_supplicant.conf) в разделе под названием boot.

  • Первый файл должен быть пустым и называться ssh.txt - это необходимо для того, чтобы Pi поняла что необходим доступ по ssh
  • Второй файл должен называться wpa_supplicant.conf и содержать данные для подключения к WiFi. При загрузке Raspberry сама перенесёт данные из этого файла в /etc/wpa_supplicant/wpa_supplicant.conf

Вот пример файла wpa_supplicant.conf:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="НАЗВАНИЕ ТОЧКИ ДОСТУПА WiFi"
    psk="ПАРОЛЬ WiFi"
    key_mgmt=WPA-PSK
}

Название точки доступа и пароль пишутся в кавычках, например, если wifi точка называется Druidia и пароль 12345:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="Druidia"
    psk="12345"
    key_mgmt=WPA-PSK
}

После создания файлов безопасно извлекаем SD карту из ПК:

Далее вставляем карту в Raspberry. Подключаем камеру и включаем питание. Через несколько секунд Pi загрузится и можно начать с ней работать.

Подключаемся через SSH:

В этом шаге мы сделаем следующее:

  • установим на ПК mDNS сервер
  • установим на ПК программу-менеджер удалённых подключений PuTTY
  • подключимся к Raspberry по ssh

Перед подключением по SSH необходимо установить mDNS сервер, для подключения по имени компьютера. Мы будем использовать Bonjour Print Services for Windows. После его установки ничего настраивать не нужно, всё заработает автомагически. Это не опечатка.

Далее необходимо подключится через SSH. В этом примере мы будем использовать PuTTY, так как это самый простой способ подключатся к устройствам по SSH из Windows. Скачать его можно здесь.

После установки открываем Putty: открываем окно запуска (win+r), набираем putty и клавишу enter. Далее вводим в поле "Host Name" следующую информацию: [email protected] и нажимаем Open

Выскочит окно с предупреждением, нажимаем Да:

Далее необходимо ввести пароль, по умолчанию "raspberry", пароль никак не отображается во время введения, после ввода необходимо нажать enter:

Если пароль был введен верно, нас приветствует bash консоль Raspberry:

Настраиваем Raspberry:

В этом шаге мы сделаем:

  • Изменим название Raspberry в сети
  • Настроим загрузку без GUI
  • Включим интерфейс камеры

Для начала мы хотим изменить имя Raspberry в сети, на случай, если у нас в сети появится ещё одна плата Raspberry. Мы назовём эту timelapsepi, и далее будем подключаться к ней по этому имени: [email protected] Здесь же включим интерфейс камеры.

Для этого мы запустим предустановленную утилиту raspi-config с правами супер-пользователя (superuser). Для этого перед командой с такими требованиями необходимо вводить sudo (сокращение от super user do).

Вводим в консоли:

sudo raspi-config

Затем enter. Окно будет выглядеть следующим образом:

Стрелками клавиатуры "ВНИЗ" выбираем "Network Options":

Нажимаем enter, окно выглядит следующим образом:

Снова нажимаем enter, окно будет выглядеть так:

Снова нажимаем enter:

Стираем название клавишей backspace и вводим новое название timelaplsepi:

Нажимаем enter, мы снова в главном меню raspi-config. Теперь мы убедимся, что Raspberry загружается в консоль. Выбираем "Boot Options":

Enter, далее "Desktop/CLI":

Enter, далее "Console Autologin":

Enter. Мы снова в главном меню. Теперь мы включим интерфейс камеры. Выбираем "Interfacing Options":

Нажимаем enter, далее "Camera":

Enter и отвечаем yes на следующий вопрос:

Далее нажимаем enter:

В главном меню нажимаем на клавиатуре два раза стрелку вправо, красное поле выделения окажется на кнопке "<Finish>". Нажимаем enter:

На вопрос о перезагрузке отвечаем yes:

Ждем пару минут пока Pi перезагрузится, снова запускаем PuTTY (win+r, putty, enter). Вводим новое название ([email protected]) и нажимаем Open. PuTTY снова выдаст security alert, так как для него это новый компьютер в сети, нажимаем "Да", вводим пароль "raspberry" и мы снова в bash консоли Raspberry уже с новым названием:

Пишем скрипт для Python

Для удобства работы создадим директории Capture и Python в домашней директории Pi и перейдём в последнюю. Для этого используем команды mkdir и cd. В конце каждой строки нажимаем enter:

mkdir Capture
mkdir Python
cd Python

Для редактирования файлов будем использовать nano - простой консольный редактор текста, предустановленный почти в каждом дистрибутиве GNU/Linux. При запуске редактора укажем в команде название файла скрипта:

nano timelapse.py

Откроется окно редактора:

Мы можем вводить текст скрипта:

#encoding=utf-8
import RPi.GPIO as GPIO                             # подключаем модуль GPIO
from picamera import PiCamera                       # подключаем модуль камеры
from time import sleep                              # подключаем модуль sleep
import glob                                         # подключаем модуль glob

switchVcc = 23                                      # назначаем вывод питания датчика
switch    = 24                                      # назначаем вывод состояния датчика

GPIO.setmode(GPIO.BCM)                              # устанавливаем режим нумерации выводов по номенклатуре BCM
GPIO.setup(switchVcc, GPIO.OUT)                     # устанавливаем вывод питания в режим выход
GPIO.output(switchVcc, 1)                           # устанавливаем вывод питание в режим логической единицы
GPIO.setup(switch, GPIO.IN)                         # устанавливаем вывод датчика в режим вход

directory = "/home/pi/Capture/"                     # директория для хранения снимков
camera = PiCamera()                                 # создаём объект камеры
i = len(glob.glob(directory + "image[0-9]*.jpg"))   # записываем количество файлов .jpg в директории в переменную i
while True:                                         # основной цикл программы
    if GPIO.input(switch) == GPIO.LOW:              # если датчик линии сработал
        #делаем новый снимок в директории Capture:
        camera.capture(directory + "image"+str(i)+".jpg") 
        print("image"+str(i)+" was captured")       # выводим в консоль информацию о том, что снимок был успешно сделан
        i+=1                                        # приращиваем i
        while GPIO.input(switch) == GPIO.LOW:       # останавливаем программу пока не изменится состояние вывода
            sleep(0.1)                              # не даём циклу работать со слишком большой скоростью и загрузкой процессора
    sleep(0.1)                                      # даём процессору "отдохнуть" в основном цикле программы

Нажимаем ctrl+x, далее Y - сохраняем изменения и enter, выходим из nano обратно в консоль. Для запуска скрипта необходимо ввести следующую команду:

python timelapse.py

Теперь каждый раз при срабатывании датчика линии в папке Capture будет появляться новое фото и в консоль будет выводиться название файла фотографии. Чтоб завершить программу нажмём ctrl+c.

Работа в фоновом режиме:

В этом шаге мы сделаем:

  • создадим unit файл для systemd
  • запустим сервис timelapse

Мы хотим сделать так, чтоб наш скрипт не только запускался при загрузке Raspberry, но и работал в фоновом режиме. Для этого мы сделаем юнит загрузки для systemd. Systemd - это так называемый системный daemon, который контролирует почти всё в современном GNU/Linux.

Для начала создадим файл в /lib/systemd/system/ под названием timelapse.service

sudo nano /lib/systemd/system/timelapse.service

Откроется редактор nano в который мы введем текст настройки юнита

[Unit]
Description=Timelapse Service
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/python /home/pi/Python/timelapse.py
Restart=on-abort

[Install]
WantedBy=multi-user.target

Нажимаем ctrl+x, затем Y и enter.

Далее мы добавим модуль в systemd, используя systemctl и он загрузится при следующем перезапуске системы:

sudo systemctl enable timelapse

Если всё прошло хорошо, консоль напишет "Created symlink" - создана символическая ссылка.

Настраиваем общую папку:

Для удобства скачивания и удаления фотографий мы настроим сетевую папку на Raspberry, которая будет доступна другим компьютерам в локальной сети. Сделаем мы это при помощи пакета Samba.

Установка пакета Samba:

Устанавливать пакет мы будем при помощи менеджера пакетов apt-get. Для этого введём в консоли следующее, нажимая после каждой строки enter:

sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install samba samba-common-bin

Настройка samba:

Теперь нам необходимо настроить samba. Настройки находятся в файле /etc/samba/smb.conf

sudo nano /etc/samba/smb.conf

Клавишей PageDown идём в самый конец файла и добавляем следующее:

[share]
Comment = Timelapse Capture
path = /home/pi/Capture
read only = no
public = yes
writeable = yes

Далее ctrl+x, Y и enter, мы опять в bash консоли. Разрешим всем пользователям в сети изменять содержимое папки Capture:

sudo chmod a+w Capture/

Перезапустим samba:

sudo /etc/init.d/samba restart

Просмотр файлов по сети:

Настроим сетевую папку в Windows.

Выбираем в окне Проводника "Этот компьютер", нажимаем правой клавишей мыши в окне и выбираем "Добавить новый элемент в сетевое окружение":

Откроется мастер добавления сетевого расположения, нажимаем далее:

Нажимаем далее:

Указываем сетевой адрес нашей папки с фотографиями (\\timelapsepi\share) и нажимаем далее:

Указываем название, которое будет отображаться в Проводнике:

Нажимаем готово, откроется папка с нашими фото:

Теперь можно копировать и удалять фотографии, вставлять их в ваш любимый видео редактор нелинейного монтажа и делать таймлапсы!

Ссылки:

Обсуждение