Zum Inhalt

RPi Mikrocontroller

Dieses Dokument beschreibt den Prozess, Klipper auf einem Raspberry Pi laufen zu lassen und denselben Raspberry Pi als sekundäre Steuerung zu verwenden.

Warum sollte man den Raspberry Pi als zweite MCU verwenden?

Oft haben die MCU's der 3D Drucker nur eine begrenzte Anzahl an Ein und Ausgängen um die grundlegenden Funktionalitäten (Thermistoren, Extruder, Schrittmotor...) dieser zu steuern. Den Raspberry pi als sekundäre MCU zu nutzen erlaubt es die GPIOs und verwendbaren Buse wie (i2c, spi) direkt in Klipper zu verwenden ohne auf Plugins in Octoprint (falls verwendet) Zurückgreifen zu müssen, oder andere Programme über GCODE befehle diese zu verwenden.

Warnung: Wenn Ihre Plattform ein Beaglebone ist und Sie die Installationsschritte korrekt befolgt haben, ist die Linux-MCU bereits installiert und für Ihr System konfiguriert.

Installieren Sie das rc Skript

Wenn Sie den Host als sekundäre MCU verwenden wollen, muss der klipper_mcu Prozess vor dem klippy Prozess laufen.

Nach der Installation von Klipper installieren Sie das Skript. Führen sie dafür folgenden Befehl aus:

cd ~/klipper/
sudo cp ./scripts/klipper-mcu.service /etc/systemd/system/
sudo systemctl enable klipper-mcu.service

Erstellung des Mikrocontroller Codes

Um den Code des Klipper Mikrocontrollers zu kompilieren, müssen Sie ihn zunächst für den "Linux-Prozess" konfigurieren:

cd ~/klipper/
make menuconfig

Stellen Sie im Menü "Microcontroller Architecture" auf "Linux process", speichern und beenden Sie das Programm.

Um den neuen Mikrocontroller-Code zu erzeugen und zu installieren, führen Sie aus:

sudo service klipper stop
make flash
sudo service klipper start

Wenn klippy.log einen "Permission denied" Fehler meldet, wenn Sie versuchen, sich mit /tmp/klipper_host_mcu zu verbinden, dann müssen Sie Ihren Benutzer zu der tty Gruppe hinzufügen. Der folgende Befehl fügt den Benutzer "pi" zur tty Gruppe hinzu:

sudo usermod -a -G tty pi

Restliche Konfiguration

Schließen Sie die Installation ab, indem Sie die sekundäre Klipper MCU gemäß den Anweisungen in RaspberryPi sample config und Multi MCU sample config konfigurieren.

Optional: SPI aktivieren

Vergewissern Sie sich, dass der Linux-SPI-Treiber aktiviert ist, indem Sie sudo raspi-config ausführen und SPI im Menü "Interfacing options" aktivieren.

Optional: I2C aktivieren

Stellen Sie sicher, dass der Linux I2C-Treiber aktiviert ist, indem Sie sudo raspi-config ausführen und I2C im Menü "Interfacing options" aktivieren. Wenn Sie I2C für den MPU Beschleunigungsmesser verwenden möchten, müssen Sie auch die Baudrate auf 400000 einstellen, indem Sie dtparam=i2c_arm=on,i2c_arm_baudrate=400000 in /boot/config.txt (oder /boot/firmware/config.txt in einigen Distributionen) hinzufügen/entfernen.

Optional: Den richtigen Gpiochip identifizieren

Auf dem Raspberry Pi und auf vielen Nachbauten gehören die am GPIO herausgeführten Pins zum ersten gpiochip. Sie können daher in Klipper einfach verwendet werden, indem man sie mit dem Namen gpio0..n anspricht. Es gibt jedoch Fälle, in denen die herausgeführten Pins zu anderen gpiochips als dem ersten gehören, zum Beispiel bei einigen OrangePi-Modellen oder wenn ein Port-Expander verwendet wird. In diesen Fällen ist es sinnvoll, die Befehle für den Zugriff auf das Linux-GPIO-Zeichengerät zu verwenden, um die Konfiguration zu überprüfen.

Um das Linux GPIO character device - binary auf einer debian basierten Distribution wie octopi zu installieren, führen Sie aus:

sudo apt-get install gpiod

Um den verfügbaren gpiochip zu testen, führen Sie aus:

gpiodetect

Überprüfen Sie die Pin Nummer und die Verfügbarkeit der Pins:

gpioinfo

Der gewählte Pin kann also in der Konfiguration als gpiochip<n>/gpio<o> verwendet werden, wobei n die Chipnummer ist, die der Befehl gpiodetect anzeigt und o die Leitungsnummer, die der Befehl gpioinfo anzeigt.

Warnung: nur als unused markierte gpio können verwendet werden. Es ist nicht möglich, dass eine Leitung von mehreren Prozessen gleichzeitig verwendet wird.

Zum Beispiel auf einem RPi 3B+, wo Klipper den GPIO20 für einen Schalter verwendet:

$ gpiodetect
gpiochip0 [pinctrl-bcm2835] (54 lines)
gpiochip1 [raspberrypi-exp-gpio] (8 lines)

$ gpioinfo
gpiochip0 - 54 lines:
        line   0:      unnamed       unused   input  active-high
        line   1:      unnamed       unused   input  active-high
        line   2:      unnamed       unused   input  active-high
        line   3:      unnamed       unused   input  active-high
        line   4:      unnamed       unused   input  active-high
        line   5:      unnamed       unused   input  active-high
        line   6:      unnamed       unused   input  active-high
        line   7:      unnamed       unused   input  active-high
        line   8:      unnamed       unused   input  active-high
        line   9:      unnamed       unused   input  active-high
        line  10:      unnamed       unused   input  active-high
        line  11:      unnamed       unused   input  active-high
        line  12:      unnamed       unused   input  active-high
        line  13:      unnamed       unused   input  active-high
        line  14:      unnamed       unused   input  active-high
        line  15:      unnamed       unused   input  active-high
        line  16:      unnamed       unused   input  active-high
        line  17:      unnamed       unused   input  active-high
        line  18:      unnamed       unused   input  active-high
        line  19:      unnamed       unused   input  active-high
        line  20:      unnamed    "klipper"  output  active-high [used]
        line  21:      unnamed       unused   input  active-high
        line  22:      unnamed       unused   input  active-high
        line  23:      unnamed       unused   input  active-high
        line  24:      unnamed       unused   input  active-high
        line  25:      unnamed       unused   input  active-high
        line  26:      unnamed       unused   input  active-high
        line  27:      unnamed       unused   input  active-high
        line  28:      unnamed       unused   input  active-high
        line  29:      unnamed       "led0"  output  active-high [used]
        line  30:      unnamed       unused   input  active-high
        line  31:      unnamed       unused   input  active-high
        line  32:      unnamed       unused   input  active-high
        line  33:      unnamed       unused   input  active-high
        line  34:      unnamed       unused   input  active-high
        line  35:      unnamed       unused   input  active-high
        line  36:      unnamed       unused   input  active-high
        line  37:      unnamed       unused   input  active-high
        line  38:      unnamed       unused   input  active-high
        line  39:      unnamed       unused   input  active-high
        line  40:      unnamed       unused   input  active-high
        line  41:      unnamed       unused   input  active-high
        line  42:      unnamed       unused   input  active-high
        line  43:      unnamed       unused   input  active-high
        line  44:      unnamed       unused   input  active-high
        line  45:      unnamed       unused   input  active-high
        line  46:      unnamed       unused   input  active-high
        line  47:      unnamed       unused   input  active-high
        line  48:      unnamed       unused   input  active-high
        line  49:      unnamed       unused   input  active-high
        line  50:      unnamed       unused   input  active-high
        line  51:      unnamed       unused   input  active-high
        line  52:      unnamed       unused   input  active-high
        line  53:      unnamed       unused   input  active-high
gpiochip1 - 8 lines:
        line   0:      unnamed       unused   input  active-high
        line   1:      unnamed       unused   input  active-high
        line   2:      unnamed       "led1"  output   active-low [used]
        line   3:      unnamed       unused   input  active-high
        line   4:      unnamed       unused   input  active-high
        line   5:      unnamed       unused   input  active-high
        line   6:      unnamed       unused   input  active-high
        line   7:      unnamed       unused   input  active-high

Optional: Hardware PWM

Raspberry Pi's haben zwei PWM Kanäle (PWM0 und PWM1), die auf dem Header freigelegt sind oder, falls nicht, auf bestehende gpio Pins geroutet werden können. Der Linux mcu Daemon verwendet die pwmchip sysfs Schnittstelle, um Hardware PWM-Geräte auf Linux Hosts zu steuern. Die pwm sysfs Schnittstelle ist auf einem Raspberry standardmäßig nicht verfügbar und kann durch Hinzufügen einer Zeile in /boot/config.txt aktiviert werden:

# Aktivieren der pwmchip sysfs Schnittstelle
dtoverlay=pwm,pin=12,func=4

Dieses Beispiel aktiviert nur PWM0 und leitet es an gpio12. Wenn beide PWM-Kanäle aktiviert werden müssen, können Sie pwm-2chan verwenden:

# Aktivieren der pwmchip sysfs Schnittstelle
dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4

In diesem Beispiel wird zusätzlich PWM1 aktiviert und an gpio13 geleitet.

Das Overlay stellt die PWM-Leitung beim Booten nicht über sysfs bereit; sie muss durch Schreiben der Nummer des PWM-Kanals nach /sys/class/pwm/pwmchip0/export exportiert werden. Dadurch wird das Gerät /sys/class/pwm/pwmchip0/pwm0 im Dateisystem angelegt. Am einfachsten geschieht dies, indem Folgendes in /etc/rc.local vor der Zeile exit 0 eingefügt wird:

# Aktivieren der pwmchip sysfs Schnittstelle
echo 0 > /sys/class/pwm/pwmchip0/export

Wenn Sie beide PWM Kanäle verwenden, muss die Nummer des zweiten Kanals ebenfalls mit einem Echo versehen werden:

# Aktivieren der pwmchip sysfs Schnittstelle
echo 0 > /sys/class/pwm/pwmchip0/export
echo 1 > /sys/class/pwm/pwmchip0/export

Nachdem die sysfs eingerichtet ist, können Sie nun entweder den/die pwm-Kanal/Kanäle verwenden, indem Sie den folgenden Teil der Konfiguration zu Ihrer printer.cfg hinzufügen:

[output_pin caselight]
pin: host:pwmchip0/pwm0
pwm: True
hardware_pwm: True
cycle_time: 0.000001

[output_pin beeper]
pin: host:pwmchip0/pwm1
pwm: True
hardware_pwm: True
value: 0
shutdown_value: 0
cycle_time: 0.0005

Dies fügt Hardware Pwm-Steuerung zu gpio12 und gpio13 auf dem Pi hinzu (weil das Overlay so konfiguriert wurde, dass pwm0 zu pin=12 und pwm1 zu pin=13 geleitet wird).

PWM0 kann auf gpio12 und gpio18 geroutet werden, PWM1 kann auf gpio13 und gpio19 geroutet werden:

PWM gpio PIN Funktion
0 12 4
0 18 2
1 13 4
1 19 2
Zurück zum Seitenanfang