Vai al contenuto

# Microcontrollore RPi

Questo documento descrive il processo di esecuzione di Klipper su un RPi e usa lo stesso RPi come mcu secondario.

## Perché usare RPi come MCU secondario?

Spesso gli MCU dedicati al controllo delle stampanti 3D hanno un numero limitato e preconfigurato di pin esposti per gestire le principali funzioni di stampa (resistenze termiche, estrusori, stepper...). L'utilizzo dell'RPi dove Klipper è installato come MCU secondario dà la possibilità di utilizzare direttamente i GPIO e i bus (i2c, spi) dell'RPi all'interno di klipper senza utilizzare plugin Octoprint (se utilizzati) o programmi esterni dando la possibilità di controllare tutto all'interno del GCODE di stampa.

Attenzione: Se la tua piattaforma è un Beaglebone e hai seguito correttamente i passi di installazione, la mcu linux è già installata e configurata per il tuo sistema.

## Installa lo script rc

Se si desidera utilizzare l'host come MCU secondario, il processo di klipper_mcu deve essere eseguito prima del processo klippy.

Dopo aver installato Klipper, installare lo script. eseguire:

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

## Creazione del codice del microcontrollore

Per compilare il codice del microcontrollore Klipper, iniziate configurandolo per il "processo Linux":

    cd ~/klipper/
    make menuconfig

Nel menu, impostate "Microcontroller Architecture" su "Linux process", poi salvate e uscite.

Per compilare e installare il nuovo codice del microcontrollore, eseguire:

    sudo service klipper stop
    make flash
    sudo service klipper start

Se klippy.log segnala un errore "Autorizzazione negata" quando si tenta di connettersi a `/tmp/klipper_host_mcu`, è necessario aggiungere l'utente al gruppo tty. Il seguente comando aggiungerà l'utente "pi" al gruppo tty:

    sudo usermod -a -G tty pi

## Configurazione rimanente

Completare l'installazione configurando l'MCU secondario di Klipper seguendo le istruzioni in RaspberryPi sample config e Multi MCU sample config.

## Facoltativo: abilitazione di SPI

Assicurati che il driver SPI di Linux sia abilitato eseguendo `sudo raspi-config` e abilitando SPI nel menu "Opzioni di interfaccia".

## Opzionale: abilitazione di I2C

Assicurati che l'interfaccia Linux I2C sia abilitato eseguendo `sudo raspi-config` e abilitando I2C nel menu "Opzioni di interfaccia". Se si intende utilizzare I2C per l'accelerometro MPU, è anche necessario impostare il baud rate su 400000: aggiungendo/deselezionando `dtparam=i2c_arm=on,i2c_arm_baudrate=400000` in `/boot/config.txt` (o `/ boot/firmware/config.txt` in alcune distribuzioni).

## Opzionale: Identificare il gpiochip corretto

Su Raspberry Pi e su molti cloni i pin esposti sul GPIO appartengono al primo gpiochip. Possono quindi essere utilizzati su klipper semplicemente riferendoli con il nome `gpio0..n`. Tuttavia, ci sono casi in cui i pin esposti appartengono a gpiochip diversi dal primo. Ad esempio nel caso di alcuni modelli OrangePi o se viene utilizzato un Port Expander. In questi casi è utile utilizzare i comandi per accedere al dispositivo a caratteri GPIO Linux per verificarne la configurazione.

Per installare il Linux GPIO character device - binary su una distro basata su debian come octopi eseguire:

    sudo apt-get install gpiod

Per controllare i gpiochip disponibili eseguire:

    gpiodetect

Per verificare il numero di pin e la disponibilità dei pin:

    gpioinfo

Il pin scelto può quindi essere utilizzato all'interno della configurazione come `gpiochip<n>/gpio<o>` dove n è il numero del chip visto dal comando `gpiodetect` e o è il numero di riga visto dal comando `gpioinfo`.

Attenzione: solo i gpio contrassegnati come `inutilizzati` possono essere utilizzati. Non è possibile che una linea sia usata da più processi contemporaneamente.

Per esempio su un RPi 3B+ dove klipper usa il GPIO20 per un interruttore:

    $ 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

## Opzionale: Hardware PWM

I Raspberry Pi hanno due canali PWM (PWM0 e PWM1) che sono esposti sull'intestazione o, in caso contrario, possono essere instradati ai pin gpio esistenti. Il demone mcu Linux utilizza l'interfaccia sysfs pwmchip per controllare i dispositivi hardware pwm sugli host Linux. L'interfaccia sysfs pwm non è esposta per impostazione predefinita su un Raspberry e può essere attivata aggiungendo una riga a `/boot/config.txt`:

    # Abilita l'interfaccia sysfs di pwmchip
    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

Con il sysfs a posto, potete ora utilizzare il canale o i canali pwm aggiungendo il seguente pezzo di configurazione al vostro `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 può essere indirizzato su gpio12 e gpio18, PWM1 può essere indirizzato su gpio13 e gpio19:

PWM | gpio PIN | Func
--- | --- | ---
0 | 12 | 4
0 | 18 | 2
1 | 13 | 4
1 | 19 | 2

Torna su