Aller au contenu

Microcontrôleur RPi

Ce document décrit le processus via lequel il est possible de lancer Klipper sur un Raspberry Pi et d'utiliser le même Raspberry Pi comme mcu secondaire.

Pourquoi utiliser un RPi comme microcontrôleur secondaire ?

Souvent les microcontrôleurs dédiés au contrôle des imprimantes 3D disposent d'un nombre limité et pré-configuré de broches exposées pour gérer les principales fonctions d'impression (résistances thermiques, extrudeuses, steppers...). L'utilisation du RPi où Klipper est installé en tant que MCU secondaire donne la possibilité d'utiliser directement les GPIO et les bus (i2c, spi) du RPi à l'intérieur de klipper sans utiliser de plugins Octoprint (le cas échéant) ou de programmes externes donnant la possibilité de tout contrôler à l'intérieur l'impression GCODE.

Avertissement : Si votre plate-forme est un Beaglebone et que vous avez correctement suivi les étapes d'installation, le mcu linux est déjà installé et configuré pour votre système.

Installer le script rc

Si vous souhaitez utiliser l'hôte comme MCU secondaire, le processus klipper_mcu doit s'exécuter avant le processus klippy.

Après avoir installé Klipper, installez le script. Executez :

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

Construire le code du microcontrôleur

Pour compiler le code du micro-contrôleur Klipper, commencez par le configurer pour le "Linux process" :

cd ~/klipper/
make menuconfig

Dans le menu, définissez "Architecture du microcontrôleur" sur "Processus Linux", puis enregistrez et quittez.

Pour compiler et installer le nouveau code du microcontrôleur, exécutez :

sudo service klipper stop
make flash
sudo service klipper start

Si klippy.log signale une erreur "Autorisation refusée" lors de la tentative de connexion à /tmp/klipper_host_mcu, vous devez ajouter votre utilisateur au groupe tty. La commande suivante ajoutera l'utilisateur "pi" au groupe tty :

sudo usermod -a -G tty pi

Configuration restante

Terminez l'installation en configurant le MCU secondaire de Klipper en suivant les instructions dans RaspberryPi exemlple de configuration et Exemples de configuration Multi MCU.

Facultatif : Activer SPI

Assurez-vous que le pilote SPI Linux est activé en exécutant sudo raspi-config et en activant SPI dans le menu « Options d’interface ».

Facultatif : Activer I2C

Assurez-vous que le pilote Linux I2C est activé en exécutant sudo raspi-config et en activant I2C dans le menu "Interfacing options". Si vous prévoyez d'utiliser I2C pour l'accéléromètre MPU, il est également nécessaire de définir le débit en bauds sur 400 000 en : ajoutant/décommentant dtparam=i2c_arm=on,i2c_arm_baudrate=400000 dans /boot/config. txt (ou /boot/firmware/config.txt dans certaines distributions).

Facultatif : identifiez la bonne puce gpio

Sur Raspberry Pi et sur de nombreux clones, les broches disponibles sur le connecteur GPIO appartiennent à la première puce gpio. Ils peuvent donc être utilisés sur klipper simplement en les référençant avec le nom gpio0..n. Cependant, il existe des cas dans lesquels les broches disponibles appartiennent à des puces gpio autres que la première. Par exemple dans le cas de certains modèles OrangePi ou si un "Port Expander" est utilisé. Dans ces cas, il est utile d'utiliser les commandes pour accéder au Périphérique de caractères GPIO Linux pour vérifier la configuration.

Pour installer le périphérique de caractères *Linux GPIO - binaire * sur une distribution basée sur Debian comme Octopi, exécutez :

sudo apt-get install gpiod

Pour vérifier la puce gpio disponible exécutez :

gpiodetect

Pour vérifier la numérotation des broches du connecteur GPIO et leur disponibilité, exécutez :

gpioinfo

La broche choisie peut donc être utilisée dans la configuration comme gpiochip<n>/gpio<o>n est le numéro de puce tel qu'il est vu par la commande gpiodetect et o est le numéro de ligne vu par la commande gpioinfo.

Avertissement : seul les broches gpio marquées comme inutilisées peuvent être utilisées. Il n'est pas possible qu'une ligne soit utilisée par plusieurs processus simultanément.

Par exemple sur un RPi 3B+ où klipper utilise le GPIO20 comme un interrupteur :

$ 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

Facultatif : PWM matériel

Les Raspberry Pi ont deux canaux PWM (PWM0 et PWM1) qui sont disponibles sur le connecteur ou, sinon, peuvent être redirigés vers des broches gpio existantes. Le service mcu Linux utilise l'interface pwmchip sysfs pour contrôler les périphériques matériels pwm sur les hôtes Linux. L'interface pwm sysfs n'est pas disponible par défaut sur un Raspberry et peut être activée en ajoutant une ligne à /boot/config.txt :

# Activer l'interface pwmchip sysfs
dtoverlay=pwm,pin=12,func=4

This example enables only PWM0 and routes it to gpio12. If both PWM channels need to be enabled you can use pwm-2chan:

# Enable pwmchip sysfs interface
dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4

This example additionally enables PWM1 and routes it to gpio13.

The overlay does not expose the pwm line on sysfs on boot and needs to be exported by echo'ing the number of the pwm channel to /sys/class/pwm/pwmchip0/export. This will create device /sys/class/pwm/pwmchip0/pwm0 in the filesystem. The easiest way to do this is by adding this to /etc/rc.local before the exit 0 line:

# Enable pwmchip sysfs interface
echo 0 > /sys/class/pwm/pwmchip0/export

When using both PWM channels, the number of the second channel needs to be echo'd as well:

# Enable pwmchip sysfs interface
echo 0 > /sys/class/pwm/pwmchip0/export
echo 1 > /sys/class/pwm/pwmchip0/export

Avec le sysfs en place, vous pouvez maintenant utiliser l'un ou l'autre des canaux pwm en ajoutant la configuration suivante à votre printer.cfg :

[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

This will add hardware pwm control to gpio12 and gpio13 on the Pi (because the overlay was configured to route pwm0 to pin=12 and pwm1 to pin=13).

PWM0 peut être redirigé vers gpio12 et gpio18, PWM1 peut être redirigé vers gpio13 et gpio19 :

PWM (Modulation en Largeur d'Impulsion) Broche gpio Func
0 12 4
0 18 2
1 13 4
1 19 2
Retour en haut de la page