# Host como segunda MCU

En ocasiones como por ejemplo añadir un sensor acelerómetro, un relé de apagado o la gestión de dispositivos por GPIO nos puede interesar usar nuestro host como segunda MCU y poder integrarla para su uso en Klipper.

## Instalación firmware Klipper en nuestro Host para que actúe como MCU

El proceso es muy sencillo:

* Usando nuestro cliente SSH/Terminal favorito nos conectaremos a nuestro Host. Os aconsejamos usar [Terminus](https://termius.com/) o [PuTTY](https://www.putty.org/) por ejemplo.

{% hint style="info" %}
Para OS Raspberry, recordamos que por defecto normalmente se usa "**pi**" como nombre de usuario y "**raspberry**" como contraseña.

Revisar en cualquier caso el user/password de vuestro sistema
{% endhint %}

* Entraremos en el directorio de Klipper lanzando el siguiente comando:

{% code overflow="wrap" %}

```bash
cd ~/klipper/
```

{% endcode %}

* Instalaremos el soporte local para MCU, al usar el comando sudo nos solicitará la contraseña:

```bash
sudo cp ./scripts/klipper-mcu.service /etc/systemd/system/
```

* Haremos que el servicio de MCU Klipper funcione en el arranque:

```bash
sudo systemctl enable klipper-mcu.service
```

* Crearemos nuestro firmware Klipper para nuestro Host, en las opciones iremos con las flechas a la opción **Micro-controller Architecture** y pulsando enter seleccionaremos de la lista **Linux process** una vez seleccionado pulsaremos **Q** e **Y** para confirmar:

```bash
cd ~/klipper/
make menuconfig
```

<figure><img src="/files/jfTp6YyBn281O9tlacmi" alt=""><figcaption></figcaption></figure>

* Pararemos por seguridad el servicio Klipper con el siguiento comando:

```bash
sudo service klipper stop
```

* Ejecutaremos el comando siguiente para crear y aplicar el firmware Klipper para nuestro Host:

```bash
make flash
```

<figure><img src="/files/LWjPIGp5VKApiyVQx5uq" alt=""><figcaption></figcaption></figure>

* Ahora tan solo tenemos que iniciar nuestro servicio Klipper y si hemos seguido las instrucciones correctamente y no falló ningún paso ya tendremos nuestro Host como segunda MCU:

```bash
sudo service klipper start
```

{% hint style="warning" %}
Si nuestro **Klipper no conecta con nuestro Host como MCU podemos revisar el log de Klipper (klippy.log):**

* revisaremos que el servicio klipper-mcu funcione correctamente\
  `systemctl status klipper-mcu`\
  Nos debería retornar algo así:\
  `klipper@bigtreetech-cb1:~# systemctl status klipper-mcu ● klipper-mcu.service - Starts the MCU Linux firmware for klipper on startup Loaded: loaded (/etc/systemd/system/klipper-mcu.service; enabled; preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Mon 2023-12-11 19:39:56 CET; 4s ago Docs: https://www.klipper3d.org/RPi_microcontroller.html Process: 2408 ExecStart=/usr/local/bin/klipper_mcu -r -I ${KLIPPER_HOST_MCU_SERIAL} (code=exited, status=255/EXCEPTION) Main PID: 2408 (code=exited, status=255/EXCEPTION) CPU: 6ms`\
  En el caso que nos indique que el servicio no este funcionando y mediante un sudo service klipper-mcu restart nos diga que el servicio no existe realizaremos los pasos previos para montarlo
* **si vemos problemas de Permission denied al intentar conectar a /tmp/klipper\_host\_mcu** podemos intentar reparando añadiendo permisos al usuario pi al grupo tty necesario para el acceso:

```bash
sudo usermod -a -G tty pi
```

{% endhint %}

## Añadir nuestro MCU Host a nuestra configuración

Ahora solo nos queda añadir a nuestro printer.cfg la configuración de nuestra nueva MCU:

{% code title="printer.cfg" %}

```django
# The rpi microcontroller is used as secondary.
# Typically, both the X and Y axes
# are connected to the main micro-controller. The rpi microcontroller is used
# on non time-critical functions such as enclosure sensors, additional fan or
# light sources
[mcu host]
serial: /tmp/klipper_host_mcu
```

{% endcode %}

{% hint style="info" %}
Podemos cambiar el nombre de host en la definición de la sección \[mcu por otro más descriptivo como rpi, raspberry, cb1 o host si os es más sencillo para identificarla, en todo caso recordad que ese será el nombre que debereis usar al definir componentes conectados a nuestro host `pin: host:gpio211` a modo de ejemplo
{% endhint %}

## Habilitar SPI (Raspberry)

Este paso es opcional y normalmente se utilizará en el caso de que queramos usar un componente externo SPI conectado a nuestra RPI como por ejemplo un acelerómetro.

Para ello y desde SSH ejecutaremos:

```bash
sudo raspi-config
```

Encontraremos la **opción de habilitar SPI en Interfacing options**:

![](/files/Oqj3QRkYei2sdpS8Sjrv)

## Habilitar I2C (Raspberry)

Al igual que el paso anterior, en ocasiones puede interesarnos habilitar el soporte para I2C, normalmente para acelerómetros de la familia MPU.

Para ello y desde SSH ejecutaremos:

```bash
sudo raspi-config
```

Encontraremos la **opción de habilitar I2C en Interfacing options**:

![](/files/1inXH6TjuItAlbUbXnwP)

Además, en este caso necesitaremos añadir o des comentar unas líneas de nuestro /boot/config.txt (o /boot/firmware/config.txt dependiendo de la distro usada para instalar el OS en nuestra RPI):

{% code title="sudo nano /boot/config.txt" %}

```bash
dtparam=i2c_arm=on,i2c_arm_baudrate=400000
```

{% endcode %}

{% hint style="info" %}
Con este cambio habilitaremos el canal I2C para que use 400000 como baudrate, en caso que nuestro dispositivo use uno diferente deberiamos ajustarlo
{% endhint %}

## Utilidades GPIO (Raspberry)

Ahora que ya podemos usar nuestra Raspberry como segunda MCU de nuestro Klipper y dado que normalmente el objetivo suele ser para poder tener control desde Klipper sobre las funcionalidades de nuestra Raspberry como pueda ser el acceso a los GPIO os sugerimos algunas herramientas que facilitarán la gestión:

* Lo primero que haremos será instalar las herramientas para tenerlas disponibles:

```bash
sudo apt-get install gpiod
```

* Con gpiod instalado ya dispondremos de comandos útiles para la gestión de nuestro GPIO:

  * **gpiodetect**, que nos permitirá detectar nuestros gpio
  * **gpioinfo**, nos proporcionará información sobre gpio

  <figure><img src="/files/fz6rBMAiG216FnfDd0kT" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://klipper.3dwork.io/klipper/mejoras/raspberry-como-segunda-mcu.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
