Octoprint no RaspberryPi do zero, passo a passo.


O Octoprint é um host de impressão 3D com interface web. Você instala ele em um RaspberryPi, pluga na sua impressora e ela fica disponível pela rede! Já fáz uns 5 anos que venho aprimorando a minha impressora e considero o Octoprint essencial. Recentemente eu precisei reinstala-lo e aproveitei para montar esse tutorial, que é o primeiro de vários que estou escrevendo. Pegue um café, plugue o Raspberry Pi e vamos mudar a forma como você imprime em 3D!

Octoprint Web
O Octoprint permite que você acompanhe e controle sua impressora 3d pelo navegador ou aplicativo.

O Octoprint roda em linux, não necessariamente precisa ser instalado em um Raspberry Pi, mas isso é o mais comum.

Pessoalmente recomendo o Raspberry Pi 3 B ou hardware superior, com os plugins a instalação pode ficar pesada.

Você tem duas opções:

  • baixar uma imagem pronta como a OctoPI.
  • Instalar manualmente como eu ensinarei abaixo (um pouco longo mas vale a pena).

Para efeitos didáticos assumirei que você nunca utilizou um Raspberry PI nem Linux. Se isso de fato for verdade e você não estiver determinado a se aventurar no terminal considere o OctoPI e esse excelente tutorial do Thomas Sanladerer (em inglês).

A vantagem de instalar manualmente como eu faço é que você estará com o sistema todo atualizado.

Embora seja possível atualizar os pacotes da imagem pronta eu prefiro entender o que tem no sistema.

Outra vantagem é que quando for preciso atualizar novamente você já conhecerá o processo. (A atualização deveria ocorrer ao clique de um botão mas já tive problemas e precisei atualizar manualmente.)

Downloads necessários

  • Raspian (Sistema Operacional, se não estiver instalado no Raspberry Pi).
  • Etcher (Para gerar o sdcard do Raspberry Pi)
  • Putty (Para acesso remoto ao RaspberryPi, se você utiliza windows)

Faremos o download do Octoprint diretamente do Git de dentro do Raspberry Pi.

Sempre que possível gosto de instalar apenas o essencial no sistema, por isso optei pelo Raspian lite.
A versão lite do Raspian no momento tem 346MB contra 1.6GB da versão desktop (arquivos compactados).
A versão lite não possui interface gráfica, se você optar pela versão desktop o processo continua sendo o mesmo.

Instalando o Raspian no SD Card

Primeiramente instale o Etcher, basta executar o instalador e concordar com os termos de uso:

Etcher Setup

Aguarde o progresso da instalação, nenhuma ação adicional é necessária:

Etcher Setup

Ao concluir a instalação o Etcher vai abrir, se você receber uma mensagem de erro verifique se você possui unidades criptografadas:

Etcher Error

Identifiquei que esse erro acontece quando se utiliza BitLocker em algum disco, basta destravar todos os discos e abrir novamente.

Coloque o cartão de memória do Raspberry Pi no computador, ele será detectado automaticamente pelo Etcher.

Extraia o arquivo zip do Raspian que você baixou, a imagem é bem maior, no meu caso foi de 364MB para 1.72GB.

Abra a imagem do Raspian no Etcher:

Etcher Selecionar Arquivo

Escolha o dispositivo onde o Cartão de memória esta:

Etcher Selecionar Dispositivo

Inicie o processo no botão “Flash“, progresso e estimativa de tempo serão exibidos no lugar do botão:

Etcher Progresso

Ao final do processo será exibida uma tela de sucesso:

Etcher Sucesso

Você agora pode retirar o cartão introduzir no Raspberry Pi, plugar os cabos e liga-lo.

Configurando o Raspian

Como eu não tenho como capturar a tela diretamente eu fiz as capturas utilizando o putty que explicarei a seguir.

Ao ligar o raspberry pi você verá as mensagens de boot do dispositivo, o diagnóstico de todos os itens detectados pela placa e finalmente o pedido de login.

O login padrão é:

usuário: pi

senha: raspberry

(a senha não aparece quando você digita, isso é normal do linux)

Wifi

A primeira coisa que faremos é conecta-lo à rede. Para ter certeza de que ele pode “ver” a rede, utilize esse comando:

sudo iwlist wlan0 scan | grep ESSID
Raspberry Pi Wifi Scan

Com isso você deve ver as redes ao alcance do Raspberry Pi.

Para configurar a sua rede será preciso editar um arquivo de texto com o comando:

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

(quando eu estava capturando a tela utilizei o vi no lugar do nano, então sua tela pode ter aparência diferente)

Raspberry Config Wifi

Adicione os detalhes da sua rede  no fim do arquivo, dessa forma:

network={
    ssid="Sua Rede"
    psk="ASenhaDaSuaRede"
}
Wifi Config Raspberry

(Você pode mudar o código de pais para Brasil como eu fiz na primeira linha do arquivo. Nunca tive problemas por causa disso, em tese isso muda a faixa de canais permitidos. Isso só fará efeito se o seu roteador também estiver configurado assim.)

Utilize Ctrl+O para salvar e Ctrl+X para sair do arquivo.

Se você preferir não deixar a senha da rede escrita explicitamente no arquivo, utilize o comando:

wpa_passphrase "Nome da Rede" "Sua Senha"

Isso vai exibir a senha em um formato seguro para você colocar no arquivo:

Safe Wifi Password

Para ter certeza de que o Wifi vai funcionar automaticamente quando ligar eu gosto de reiniciar e ver se ele conecta. Para isso utilize o comando:

sudo reboot

Para verificar se o Wifi está funcionando utilize o seguinte comando:

ifconfig wlan0
Raspbery Wifi Status


Expandindo o sistema de arquivos

Quando você instalou o sistema no cartão, o Etcher descomprimiu uma imagem de sistema no seu cartão. Na maioria das vezes o tamanho do seu cartão é maior do que o necessário para a imagem. Para o raspberry ter acesso a todo o espaço disponível precisamos expandir o sistema de arquivos para utilizar todo o espaço disponível.

Fazemos isso através do utilitário raspi-config que tem várias funções, para abri-lo digite:

sudo raspi-config

Escolha a opção 7 – Opções Avançadas:

Raspi-config Advanced

Dentro dessa opção, escolha a opção A1 – Expandir Sistema de Arquivos

Raspi-config Expandir Arquivos

Você receberá uma mensagem informando que isso será concluído após reiniciar o dispositivo:

Raspi-config Reboot

Trocando a senha

Você pode trocar a senha pela linha de comando, como em qualquer linux, mas já que estamos com o raspi-config aberto podemos utiliza-lo para trocar a senha na primeira opção:

Raspi-config Password

Você será levado para uma tela de troca de senha e como de costume ao escrever você não verá “********”.

É uma boa ideia trocar a senha, caso contrário qualquer um na sua rede poderá acessar o dispositivo como administrador. Vulnerabilidades como essa são utilizadas em ataques o tempo todo.

Trocando o Nome

Trocar o nome do dispositivo facilita a organização da rede. Você poderá acessar utilizando um nome como “Impressora3d” ao invés do endereço IP.

Para isso escolha a segunda opção 2 – Hostname:

Raspi-config hostname

Escolha um novo nome:

Raspi-config hostname

Habilitando Acesso Remoto

Para poder gerenciar remotamente o Raspberry Pi utilizaremos o SSH. Para ativa-lo Selecione a opção 5 – Interfacing Options:

raspi-config interfacing options

Dentro dessa opção escolha a opção P2 – SSH:

raspi-config ssh

Por fim confirme a ativação:

raspi-config sshReiniciando

Para essas alterações terem efeito devemos reiniciar o Raspberry Pi.

Selecione a opção “Finish” no menu e confirme que deseja reiniciar o dispositivo:

Raspi-config confirm reboot

Pequenas correções

Tudo deveria funcionar, mas pelo menos na versão que instalei aqui precisei fazer algumas correções antes de acessar remotamente.

Embora o nome do dispositivo já aparece diferente na tela de login (com o nome que você escolheu) ele ainda não aparece assim na rede.

Para poder acessar utilizando o nome de rede precisamos instalar o suporte a rede no padrão que o windows usa, fazemos isso com o comando:

sudo apt-get -y install samba

A partir desse ponto será possível acessar utilizando o nome do dispositivo. Para testar você pode utilizar o comando ping em seu PC:

ping nomedodispositivo

(No windows utilize o CMD ou Powershell, no Mac ou Linux o aplicativo Terminal)

Ping Raspberry Pi

A próxima correção é limpar as credenciais para o acesso remoto funcionar.

Para isso utilize os seguintes comandos:

sudo rm /etc/ssh/ssh_host_* 
sudo dpkg-reconfigure openssh-server

Isso vai gerar uma nova assinatura para o SSH funcionar. Isso não deveria ser necessário mas parece ser um problema comum.

Utilizando SSH

O SSH é um protocolo que nos dá acesso remoto ao sistema.

A partir desse ponto não precisamos mais estar com o teclado e monitor plugado no Raspberry Pi. Faremos toda a configuração remotamente pelo SSH.

Se você utiliza Linux ou Mac basta abrir o terminal e digitar:

ssh nomeDoSeuRaspberryPi

Se você utiliza windows, basta abrir o Putty e digitar o nome do dispositivo no campo hostname:

Putty

Ao clicar em “Open” para abrir uma nova conexão o usuário e senha será solicitado:

SSH Login

Se ele mostrar uma mensagem perguntando se você confia no dispositivo basta aceitar.

(dica: para colar os códigos no terminal basta usar o botão direito do mouse).

Instalando o Octoprint

Antes de mais nada vamos atualizar o sistema e os pacotes instalados com o comando:

sudo apt-get update; sudo apt-get dist-upgrade

Ele vai pedir para você confirmar a instalação e basta apertar enter:

Confirm Update

Agora vamos instalar algumas ferramentas necessárias:

sudo apt-get install python-pip python-dev python-setuptools python-virtualenv git libyaml-dev build-essential

Agora vamos fazer o download da ultima versão do Octoprint:

cd ~
git clone https://github.com/foosel/OctoPrint.git

Finalmente vamos compilar e instalar a aplicação:

*Edit: Atualizado para python3

cd OctoPrint
virtualenv --python=/usr/bin/python3 venv
./venv/bin/pip install pip --upgrade
./venv/bin/python setup.py install
mkdir ~/.octoprint

Vamos dar permissão para o usuário padrão rodar o programa:

sudo usermod -a -G tty pi
sudo usermod -a -G dialout pi

Nesse ponto já podemos testar ser o Octoprint funciona:

~/OctoPrint/venv/bin/octoprint serve

Você receberá diversas mensagens sobre as atualizações que ele está fazendo.

Em algum lugar do output haverá uma mensagem dizendo que ele está acessível na porta 5000:

Octoprint Lintening 5000

Deixe essa janela de terminal aberta, vamos voltar para ela em breve.

Para acessar o Octoprint abra um navegador no seu pc e acesse http://nomedoseudispositivo:5000:

Octoprint Wizard

Configurando o Octoprint

Na primeira tela você pode escolher um nome de usuário e senha ou desabilitar o login.

Octoprint Chose Password

Não recomendo desabilitar a senha, é possível compartilhar o acesso somente da camera.

Se você não utilizar senha sua impressora estará aberta para qualquer controlar ela pela rede. Controlar pela rede inclui parar sua impressão, começar uma nova ou aquece-la excessivamente e danifica-la.

Clique em Keep Access Control Enabled e depois em Next

Ignore a configuração da Cura Engine, é preciso instala-la primeiro.

Octoprint Cura

Na próxima tela temos algumas abas para configurar alguns dados da impressora.

Na primeira podemos escolher nome e modelo (facilita quando tem mais de uma):

Octoprint Printer Name

O tamanho e formato da prancha, para visualização das camadas e controle:

Octoprint Bed

A velocidade máxima dos eixos (o firmware da impressora ainda tem prioridade sobre isso):

Octoprint Feed Rate

E o número de extrusores:

Octoprint Extruders

A próxima tela tem um detalhe importante, é a de configuração dos comandos:

Octoprint Commands

Preenchi com o comando para reiniciar o Octoprint:

sudo service octoprint restart

(esse comando não está disponível ainda porque ainda não configuramos o serviço)

E reiniciar o Raspberry Pi:

sudo reboot

Repare que eu deixei o comando de desligar em banco e existe um motivo para isso.

Se desligarmos o Raspberry Pi perderemos acesso a ele mas isso não desligará a impressora. Isso aconteceria se você tivesse um relê que o raspberry pudesse controlar para cortar a energia da impressora (explicarei em um outro artigo como fazer e configurar isso). A impressora tem uma série de medidas de segurança para não por fogo na casa, mas mante-la energizada sem poder controla-la em um cenário remoto é um risco de incêndio ou dano ao hardware. Por isso eu deixo tudo ligado e desligo na tomada manualmente.

Na próxima tela, para o update automático funcionar preencha o campo com:

/home/pi/OctoPrint

Mantenha o seletor em “Release” para receber somente atualizações testadas e estáveis.

A próxima tela é para configuração da câmera, ignore essa tela pois ainda precisamos instalar o suporte à camera.

Octoprint Webcam

Na tela seguinte, clique em “Finish” para concluir a configuração. Você finalmente terá acesso à interface do OctoPrint:

OctoPrint Home

Iniciando automaticamente

Agora que conseguimos rodar o OctoPrint vamos configura-lo para iniciar automaticamente.

Antes de mais nada pare o programa. Voltando para o terminal do Raspberry onde ele está rodando digite Ctrl+C para encerrar o programa.

Para isso vamos registra-lo como um serviço que roda ao ligar o Raspberry PI.

Copie e habilite os scripts modelo com os seguintes comandos:

sudo cp ~/OctoPrint/scripts/octoprint.init /etc/init.d/octoprint
sudo chmod +x /etc/init.d/octoprint
sudo cp ~/OctoPrint/scripts/octoprint.default /etc/default/octoprint

Edite o arquivo “/etc/default/octoprint”:

sudo nano /etc/default/octoprint

Remova o # antes do caminho do daemon deixando a linha dessa forma:

DAEMON=/home/pi/OctoPrint/venv/bin/octoprint
Daemon Config

Salve o arquivo e feche. (Ctrl+O, Ctrl+X)

Agora adicione-o à inicialização com o comando:

sudo update-rc.d octoprint defaults

Pronto, agora o sistema já o entenderá como um serviço e você pode usar a sintaxe:

sudo service octoprint {start|stop|restart}

Ou seja, para iniciar o OctoPrint use:

sudo service octoprint start

Repare que o terminal não fica mais bloqueado e você pode continuar usando.

Octoprint Service Start

Se precisar parar basta rodar o comando trocando o start por stop ou restart conforme a necessidade.

Agora ele já deve subir automaticamente quando você ligar o Raspberry Pi.

Para testar use o comando sudo reboot para reiniciar (ou deligue a fonte e ligue novamente).

Conectando a impressora

Com o Octoprint instalado basta plugar a impressora ao Raspberry Pi para poder começar a usar.

Antes de mandar imprimir ou dar comandos a ela é preciso apenas escolher as opções de conexão:

Octoprint Connect

No meu caso, deixar tudo no automático funciona, eu apenas lembro de marcar para conectar automaticamente ao ligar e salvar as opções.

Ao conectar ela deve aparecer como Operational e os sensores de temperatura começarão ao funcionar.

Octoprint Working

Já é possível dar comandos, ajustas a temperatura e até imprimir.

Configurando a Camera

Um dos recursos mais legais do Octoprint é poder assistir a impressão remotamente.

Plugando uma WebCam no USB do Raspberry Pi podemos assistir, gravar e até fazer um time lapse automático das impressões.

Para isso funcionar vamos utilizar o MJPG-Streamer (esses comandos foram um pouco demorados no meu Pi3):

cd ~
sudo apt-get install subversion libjpeg62-turbo-dev imagemagick ffmpeg libv4l-dev cmake
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
export LD_LIBRARY_PATH=.
make

Agora você deve ser capaz de iniciar a camera com o seguinte comando:

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so"

*Caso o comando anterior não funcione, é possivel que você precise utiliza-la no modo YUV. Isso é bastante pesado e pode atrapalhar o desempenho do sistema e até a impressão, mas o comando para isso é:

./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so"

**Caso você esteja utilizando o modulo de camera oficial do Raspberry PI o comando nesse caso é:

./mjpg_streamer -i "./input_raspicam.so -fps 5" -o "./output_http.so"

Você provavelmente verá alguns avisos e erros mas no final o comando deve te avisar que a camera está disponível na porta 8080:

Camera Disponível 880

Se tudo ocorreu bem você será capaz de acessar a camera no endereço: http://nomedoseudispositivo:8080/?action=stream:

Camera Octoprint

Agora abra o arquivo de configuração:

nano ~/.octoprint/config.yaml

Vá até o fim do arquivo e adicione as seguintes linhas:

webcam:
  stream: http://nomedoseudispositivo:8080/?action=stream
  snapshot: http://127.0.0.1:8080/?action=snapshot
  ffmpeg: /usr/bin/avconv

Talvez você tenha percebido o que parecer ser um erro nessa configuração. O endereço de stream aponta para o dispositivo pelo nome mas o snapshot aponta para localhost (127.0.0.1).
Isso funciona da seguinte forma, o endereço stream é passado para o navegador na aba de controle e o navegador precisa acessar o dispositivo pelo nome para abrir um stream de video. Se você deseja acessar o stream de vídeo de fora da rede, você precisa configurar um ddns, mapear uma porta para esse feed de vídeo e usar esse novo endereço nessa configuração. Esse processo pode ser um pouco complicado e por isso vou explica-lo em um artigo futuro.

O endereço de snapshot é de uso interno do Octoprint e por isso aponta para 127.0.0.1 para ser mais rápido. Esse snapshot é utilizado para capturar as imagens que depois são transformadas em um video de time lapse quando essa opção está habilitada.

Salve e feche o arquivo (Ctrl+O, Enter, Ctrl+X).

Agora vamos criar alguns scripts para controle da camera com os seguintes comandos:

mkdir /home/pi/scripts 
nano /home/pi/scripts/webcam

Coloque o código abaixo, salve e feche o script (Ctrl+O, Enter, Ctrl+X).

#!/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

Agora vamos criar o arquivo que rodará o serviço da camera (Daemon):

nano /home/pi/scripts/webcamDaemon

Cole o código abaixo, salve e feche o script (Ctrl+O, Enter, Ctrl+X).

Tenha o cuidado de maximizar a tela do putty para que não ocorra quebras de linha, caso contrário algo pode não funcionar.

#!/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

Agora marque os arquivos como executáveis:

chmod +x /home/pi/scripts/webcam
chmod +x /home/pi/scripts/webcamDaemon

Agora vamos adicionar os botões de controle da camera na interface (para iniciar e parar o serviço pela interface caso você tenha problemas com desempenho da camera).

Edite o arquivo de configuração:

nano /home/pi/.octoprint/config.yaml

No fim do arquivo cole o seguinte código:

system:
  actions:
   - action: streamon
     command: /home/pi/scripts/webcam start
     confirm: false
     name: Start video stream
   - action: streamoff
     command: /home/pi/scripts/webcam stop
     confirm: false
     name: Stop video stream

Salve e feche o arquivo  (Ctrl+O, Enter, Ctrl+X).

Por fim, vamos colocar a câmera em início automático editando o arquivo /etc/rc.local:

sudo nano /etc/rc.local

Adicione a seguinte linha antes do da ultima linha (antes do exit 0):

/home/pi/scripts/webcam start

(se você tiver problemas de desempenho com a camera, o que pode acontecer em modelos mais antigos do Raspberry Pi, você pode remover essa linha e inicia-la manualmente quando necessário)

o fim do arquivo deve ficar assim:

Webcam Auto Start

Se tudo deu certo você pode reiniciar o Raspberry PI e ao acessar o Octoprint, os recursos de câmera devem estar disponíveis na interface.

sudo reboot

Os botões para iniciar e parar o serviço de camera ficam nas opções de energia:

Webcam Options

Conclusão

Se você chegou até aqui você agora tem uma instalação funcional e atualizada do Octoprint, a versão atual já é capaz de se atualizar pela interface, mas se você encontrar algum problema basta executar os seguintes comandos:

cd ~/OctoPrint/
git pull
./venv/bin/python setup.py clean
./venv/bin/python setup.py install

Também é possivel instalar diversos plugins pela interface, existem alguns realmente úteis, sugiro que você explore as opções disponíveis!

Se algo que você procura ficou de fora, você pode dar uma olhada nesse excelente tutorial feito pela criadora do Octoprint, Gina Häußge (em inglês).


Uma resposta para “Octoprint no RaspberryPi do zero, passo a passo.”