Projekt: OctoPrint auf dem Raspberry Pi installieren

Mit ** gekennzeichne Links auf dieser Seite sind Affiliatelinks.

Dieses Mal wird es etwas umfangreicher. So umfangreich, dass ich das Video in zwei Teile teilen musste. Wir installieren gemeinsam Schritt für Schritt OctoPrint auf unserem Raspberry Pi. In meinem Fall ein Raspberry Pi der ersten Generation. Also wirklich ein altes Schätzchen. Ziel ist es, den 3D-Drucker (einen Anycubic i3 Mega) von überall steuern zu können und neue Aufträge starten zu können. Dabei kann ich dann mit der Webcam den Prozess überwachen. Später lasse ich mich dann noch mit Bildern über den Fortschritt informieren. In diesem Projekt installieren wir aber erstmal OctoPrint, Konfigurieren den Drucker und die Oberfläche, sodass wir am Ende Zeitraffer von unserem Druck herunterladen können.

Ich habe dieses komplette Projekt unter dem aktuellsten Raspbian Stretch umgesetzt. Alles funktionierte sogar auf Anhieb. Das einzige Problem auf dem Weg war die Firmware auf dem Anycubic i3 Mega, welche aktualisiert werden musste. Hier habe ich zum Glück eine Update-Datei auf GitHub gefunden, welche die Probleme mit dem Drucker beheben konnte. Außerdem muss man zwei Plugins für OctoPrint installieren, damit die Kommunikation zwischen Drucker und Raspberry einwandfrei läuft - hier hat sich Anycubic nicht richtig an das Protokoll gehalten, wodurch komische Sachen passieren, wenn man die Plugins nicht installiert. Aber all das wird in den folgenden Videos gezeigt.

Was wird benötigt?

  • Ein Raspberry Pi mit Raspbian Stretch
  • Ein Anycubic i3 Mega (oder anderer 3D-Drucker)
  • Eine Logitech C270 (oder andere Webcam)
  • Ein paar M3-Schrauben und Muttern

Video 1

Arduino-Kurs

Video 2

Arduino-Kurs

Komponenten

Befehle

Teil 1

Wir starten mit ein Befehlen aus dieser Anleitung.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-pip python-dev python-setuptools python-virtualenv git libyaml-dev build-essential
git clone https://github.com/foosel/OctoPrint.git
cd OctoPrint
virtualenv venv

Bei den folgenden beiden Befehlen ist etwas Zeit mitzubringen. Einfach in Ruhe einen Kaffee machen und abwarten.

./venv/bin/pip install pip --upgrade
./venv/bin/python setup.py install
mkdir ~/.octoprint
~/OctoPrint/venv/bin/octoprint serve

Danach kann unter Port 5000 im Browser der Wizard gestartet werden. Wie genau das geht, wird im Video gezeigt.

Als nächstes muss die CuraEngine geladen und kompiliert werden. Stand heute, dürfen die neueren Versionen (2.x, 3.x) nicht genutzt werden, da diese nicht mit OctoPrint kompatibel sind. Daher müssen wir älteren 15.04.xx Versionen nutzen. Die Versionsnummern sind etwas verwirrend. 15 ist also älter 2 oder 3. Eine Anleitung gibt es hier. Alle nötigen Befehle sind aber ebenfalls nachfolgend aufgeführt.

sudo apt-get install gcc g++

git clone https://github.com/Ultimaker/CuraEngine.git
cd CuraEngine/
git checkout tags/15.04.6
cd ..
make -C CuraEngine

Das dauert dann auch wieder eine ganze Weile. Gerade auf meinem alten Raspberry Pi der ersten Generation ist das ziemlich zeitintensiv.

Als nächstes Drucken wir dann den Kamera-Arm. Dieser positioniert unsere Webcam so, dass wir den laufenden Druck gut beobachten können. Das Ganze wird mit ein paar Schrauben zusammengebaut (sind oben verlinkt). Ich habe die 6mm-Variante gedruckt. Die erforderlichen Dateien für den Arm findest Du hier. Mein Ergebnis habe ich ebenfalls auf Thingiverse veröffentlicht.

Teil 2

Weiter geht es mit der Installation von MJPEG-Streamer. Dieser stellt einen Webserver bereit, welcher uns Zugriff auf die Webcam erlaubt. Die zur Verfügung gestellten Streams werden dann einfach in OctoPrint konfiguriert.

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

Dann können wir das Ganze auch schon testen. Der zweite Aufruf enthält die angepassten Parameter für die Auflösung der Logitech C270 und passt die Framerate auf 30 fps an. Für andere Kameras muss man hier natürlich mit anderen Parametern arbeiten.

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so"
./mjpg_streamer -i "./input_uvc.so -r 1280x720 -f 30" -o "./output_http.so"

Jetzt wird es etwas blöd. Ich musste die Firmware des Anycubic i3 Mega aktualisieren, da diese nicht out of the box mit OctoPrint sprechen wollte. Dabei gibt es da draußen ganz viele verschiedene Versionen. Am besten man probiert erstmal, ob man die Verbindung zum Drucker aus OctoPrint heraus herstellen kann. Erst wenn das nicht klappt, sollte man sich an die Firmware wagen. Immerhin kann dabei schon etwas schief gehen. Ich habe es einfach riskiert und es hat auf Anhieb funktioniert.

Dafür lädt man einfach die "update.zip" aus diesem Issue auf GitHub herunter, entpackt die Zip-Dateie und schiebt die Datei auf eine SD-Karte (direkt ins Root, nicht in einen Unterordner). Dann schaltet man den Anycubic aus und steck die SD-Karte ein. Sobald man den Drucker einschaltet, fängt dieser an zu piepen. Das klingt im ersten Moment als wäre etwas falsch, aber es ist alles richtig so! Bei mir hat das Ganze so 15-20 Sekunden gedauert. Danach startet der Drucker ganz normal wieder und die neue Firmware-Version ist installiert. Danach die Datei unbedingt wieder von der SD-Karte löschen!

In meinem Fall wurde die Version v1.4.1RC1/P2 auf v1.4.1RC2/P2 aktualisiert. Nach dem Update konnte sich OctoPrint auch sofort mit dem Drucker verbinden! Damit die Kommunikation reibungslos abläuft, müssen aber noch zwei Plugins für Anycubic installiert werden. Dafür wird OctoPrint einmal beendet (falls es noch läuft) und folgende Befehle ausgeführt:

cd ~/.octoprint/plugins
wget https://gist.githubusercontent.com/foosel/924a6518b2dea77c9a6ff1f2561b8bb7/raw/46dcd2cd651817683746772907917b72d0c201a5/strip_m110_parameter.py
wget https://gist.githubusercontent.com/foosel/77e4792921db744a157764f66d1d72a5/raw/8593ddb36e8d41a67ad9ccc01c36bb2863f5e7c2/rewrite_wait_to_busy.py

Um OctoPrint dann beim Systemstart automatisch starten zu lassen, muss folgendes ausgeführt werden:

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

Damit alles mit unserem venv vernünftig läuft, muss noch eine Zeile (wie im Video gezeigt) einkommentiert werden. Alternativ kann die Zeile natürlich auch zusätzlich in die Datei eingefügt werden. Wie man es macht, ist egal.

sudo vi /etc/default/octoprint

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

Dann noch den Autostart erweitern und fertig ist der erste Teil:

sudo update-rc.d octoprint defaults
sudo service octoprint start

Was jetzt noch fehlt ist die Integration der Webcam. Diese lief ja bis gerade auch nur im aktiven Terminal und startet sich nicht automatisch. Genau das ändern wir jetzt. Die Anleitung dafür habe ich aus dem Wiki von OctoPrint, allerdings habe ich den Code hier direkt an die C270 angepasst.

cd
mkdir scripts
vi /home/pi/scripts/webcam

In diese Datei kommt der folgende Inhalt:

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

Die Datei wird gespeichert und geschlossen. In die zweite Datei kommt folgendes:

vi /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 1280x720 -f 30"
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

Das war es eigentlich auch schon. Theoretisch könnte die Datei noch gekürzt werden, da diese irgendwelche Unterscheidungen für die Raspberry-Kamera enthält. Aber das tut jetzt nicht weh. Ist einfach nur ein Check und ein paar Zeilen Code mehr als wir brauchen. Aber funktioniert natürlich auch so. Die beiden Dateien werden dann noch ausführbar gemacht:

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

Fertig! Als letztes wird noch die config.yaml um folgende Einträge erweitert, sodass wir die Kamera auch über die Oberfläche starten und stoppen können. Dann läuft diese eben nur, wenn wir auch einen Druck starten wollen. Ist ganz praktisch und schont auch die Kamera ein wenig.

vi .octoprint/config.yaml
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

Das wars. Die restliche Konfiguration wird im Video gezeigt. Soweit steht jetzt also die Basis für unsere weiteren Projekte. Wie schon gesagt, wird OctoPrint noch in fhem integriert, sodass ich den Drucker mit einem Zwischenstecker abschalten kann wenn der Druck fertig ist (und alles abgekühlt ist). Weiterhin kann ich mit über den Stream Fotos holen, welche ich dann per Telegram an mich schicken lasse. So bin ich auch unterwegs über den Druckstatus informiert. Aber dazu in einem weiteren Video später mehr.


Newsletter

Trage Dich jetzt in den Newsletter ein und genieße dadurch viele Vorteile:

  • 5€-Gutschein als Dankeschön
  • Zugang zu exklusiven Inhalten
  • Rabattaktionen für Kurse
  • Angebote für Produkte

* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir regelmäßig Informationen und Produktempfehlungen aus dem Fachgebiet Smart Home zugesendet werden. Mit dem Eintrag akzeptieren Sie unsere Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.

Matthias Kleine

Matthias Kleine

Großer Fan und Anhänger von OpenSource-Projekten und erweiterbaren Haus-Automatisierungskomponenten. Je offener und flexibler das System, desto besser. Ich lege mich nicht auf einzelne Protokolle oder Standards fest, sondern probiere aus allen Welten das Beste zu verheiraten. Unterwegs als Softwareentwickler, Trainer und Blogger im Bereich Smart Home.

Auf YouTube und hier im Blog gibt es bereits unzählige kostenlose Videos, Informationen und Tutorials. Wenn Dir das noch nicht reicht, ist ein Training genau das richtige für Dich! Die folgenden Trainings haben den Vorteil, dass immer von Anfang an gestartet wird und Du ohne Vorwissen teilnehmen kannst.