# Klipper en Android

Una de las opciones más interesantes para reciclar hardware es usar un teléfono o tablet Android como host de Klipper, sustituyendo a la Raspberry Pi. Los dispositivos Android modernos cuentan con procesadores ARM de alto rendimiento, varios GB de RAM y almacenamiento interno suficiente para correr Klipper, Moonraker y Mainsail/Fluidd sin problemas.

{% hint style="success" %}
**¿Por qué Android?**

* Reutilizas un móvil o tablet que tienes en un cajón
* Suelen tener más potencia que una Raspberry Pi Zero o Pi 3
* Pantalla integrada opcional con KlipperScreen
* Conectividad WiFi y Bluetooth de serie
  {% endhint %}

{% embed url="<https://www.youtube.com/watch?v=K6o8XyquIxQ>" %}
Tutorial en español — Instalación de Klipper en Android
{% endembed %}

## Requisitos

### Hardware

* **Teléfono o tablet Android** — mínimo 2 GB de RAM (recomendado 3+ GB), 8+ GB de almacenamiento libre
* **Android 8.0 o superior** (recomendado Android 10+)
* **Cable USB OTG** (o adaptador OTG) para conectar la MCU de la impresora
* **Cable USB-C Y (datos + carga)** o placa que alimente el teléfono — necesario para usar OTG y cargar a la vez

{% hint style="warning" %}
**USB OTG + carga simultánea** es el mayor escollo en esta instalación. No todos los dispositivos lo soportan de forma nativa. Las opciones son:

1. Usar una placa impresora que pueda alimentar el dispositivo por USB (ej. BTT Octopus Pro con 5V en el puerto USB)
2. Usar un hub USB OTG con entrada de alimentación independiente
3. Retirar la batería del teléfono y alimentar directamente (avanzado, bajo tu responsabilidad)
   {% endhint %}

### Software y métodos disponibles

| Método                 | Root necesario       | Dificultad | Rendimiento | Notas                            |
| ---------------------- | -------------------- | ---------- | ----------- | -------------------------------- |
| **Linux Deploy**       | Sí (Magisk)          | Media      | Alto        | Método más estable y documentado |
| **UserLAnd**           | No                   | Baja       | Medio       | Más sencillo, algo más lento     |
| **KlipperPhonesLinux** | No (flashing nativo) | Muy alta   | Muy alto    | Solo modelos específicos Xiaomi  |

***

## Método 1 — Linux Deploy (recomendado, requiere root)

Linux Deploy crea un contenedor Debian completo dentro de Android aprovechando el entorno chroot. Es el método más estable y con mejor rendimiento.

{% embed url="<https://www.youtube.com/watch?v=B5gGMIXwDuo>" %}
Run Klipper, Moonraker y Fluidd en Android con Linux Deploy
{% endembed %}

### Paso 1 — Rootear el dispositivo

{% hint style="danger" %}
Rootear un dispositivo puede anular su garantía y, si se hace incorrectamente, puede dejarlo inutilizable ("brickear"). Asegúrate de encontrar el procedimiento específico para tu modelo antes de continuar.
{% endhint %}

El método más recomendado actualmente es **Magisk**:

1. Descarga la imagen de stock de tu dispositivo desde el sitio oficial del fabricante
2. Extrae el `boot.img` de la imagen
3. Parchea el `boot.img` con la app **Magisk** (disponible en [github.com/topjohnwu/Magisk](https://github.com/topjohnwu/Magisk))
4. Flashea el `boot.img` parcheado con `fastboot`
5. Verifica el root instalando **Root Checker** desde la Play Store

### Paso 2 — Instalar apps necesarias

Instala desde la Play Store o F-Droid:

* [**Linux Deploy**](https://play.google.com/store/apps/details?id=ru.meefik.linuxdeploy) — el contenedor Debian
* [**BusyBox**](https://play.google.com/store/apps/details?id=ru.meefik.busybox) — utilidades necesarias para Linux Deploy
* [**JuiceSSH**](https://play.google.com/store/apps/details?id=com.sonelli.juicessh) o similar — cliente SSH para conectarte al contenedor

### Paso 3 — Configurar SELinux en modo permisivo

Para que Linux Deploy pueda montar el contenedor correctamente, SELinux debe estar en modo permisivo:

1. Instala **SELinuxModeChanger** (búscalo en GitHub o F-Droid)
2. Cambia el modo de `Enforcing` a `Permissive`
3. Reinicia el dispositivo

{% hint style="info" %}
En algunos dispositivos también es necesario añadir la siguiente ruta al PATH en la configuración de Linux Deploy: `/data/user/0/ru.meefik.linuxdeploy/files:/system/xbin`
{% endhint %}

### Paso 4 — Crear el contenedor Debian en Linux Deploy

Abre Linux Deploy y configura el contenedor con los siguientes ajustes:

```
Bootstrap:
  Distro:          Debian (Bookworm / Bullseye)
  Architecture:    arm64 (o armhf en dispositivos más antiguos de 32 bits)
  Installation:    Directory
  Path:            /data/local/debian

Init:
  Enable:          yes
  Init system:     sysv

SSH:
  Enable:          yes
  Port:            22

GUI (solo si quieres KlipperScreen):
  Enable:          yes
  Graphics:        X11
  Desktop:         XTerm
```

Pulsa **INSTALL** y espera a que finalice la instalación (puede tardar varios minutos).

### Paso 5 — Arrancar el contenedor y conectar por SSH

1. Pulsa **START** en Linux Deploy
2. Conéctate por SSH desde JuiceSSH o desde otro dispositivo en tu red:

```bash
ssh android@<IP_DEL_TELEFONO>
# Contraseña por defecto: android
```

3. Una vez dentro, actualiza el sistema:

```bash
sudo apt update && sudo apt upgrade -y
```

### Paso 6 — Instalar Klipper con KIAUH

```bash
sudo apt install git -y
cd ~
git clone https://github.com/dw-0/kiauh.git
./kiauh/kiauh.sh
```

En el menú de KIAUH selecciona e instala en este orden:

1. `1) Install` → `1) Klipper`
2. `1) Install` → `2) Moonraker`
3. `1) Install` → `3) Mainsail` (o `4) Fluidd`)
4. (Opcional) `1) Install` → `5) KlipperScreen` — tarda bastante, puede fallar en versiones antiguas de Debian

{% hint style="warning" %}
Si la instalación de KlipperScreen falla por la versión de Python, instala Python 3.11 desde source antes de continuar:

```bash
sudo apt install -y build-essential libssl-dev libffi-dev python3-dev
# Instalar Python 3.11 desde los repositorios de Debian Bookworm
sudo apt install python3.11 python3.11-venv
```

{% endhint %}

### Paso 7 — Corregir los paths de socket (si hay problemas)

En algunos casos Klipper y Moonraker no se comunican bien por los paths de socket por defecto. Comprueba y ajusta si es necesario:

En `/etc/default/klipper`:

```bash
KLIPPY_SOCKET=/home/android/printer_data/comms/klippy.sock
```

En `~/printer_data/config/moonraker.conf`:

```ini
klippy_uds_address: /home/android/printer_data/comms/klippy.sock
```

En `/etc/default/moonraker`:

```bash
MOONRAKER_SOCKET=/home/android/printer_data/comms/moonraker.sock
```

Reinicia los servicios tras los cambios:

```bash
sudo service klipper restart
sudo service moonraker restart
```

***

## Método 2 — UserLAnd (sin root)

UserLAnd es una app que permite ejecutar un entorno Linux completo sin necesidad de root. El rendimiento es algo inferior al método con Linux Deploy pero es mucho más accesible.

### Instalación

1. Descarga [**UserLAnd**](https://play.google.com/store/apps/details?id=tech.ula) desde la Play Store
2. Crea una nueva sesión → Elige **Ubuntu** o **Debian**
3. Selecciona conexión **SSH**
4. Espera a que el sistema base se instale (primera vez tarda varios minutos)
5. Conéctate por SSH con las credenciales que elegiste

### Instalar Klipper con KIAUH

El proceso es idéntico al Método 1 desde el Paso 6. UserLAnd ya proporciona un entorno Debian/Ubuntu completo.

{% hint style="info" %}
UserLAnd **no necesita root** pero puede tener problemas accediendo directamente a `/dev/ttyACM0` o `/dev/ttyUSB0`. Si la impresora no se detecta, consulta el apartado de [Conexión de la impresora](#conexion-de-la-impresora-por-usb-otg) más abajo.
{% endhint %}

***

## Método 3 — KlipperPhonesLinux (avanzado, modelos específicos)

Este proyecto convierte el teléfono en un host Linux nativo (sin Android, directamente Debian), ofreciendo el máximo rendimiento. Solo está disponible para **modelos específicos de Xiaomi** (Redmi 3, Note 3, etc.).

{% hint style="warning" %}
Este método **borra completamente Android** del dispositivo y requiere flashear un kernel Linux nativo. Es el más complejo y está limitado a unos pocos modelos concretos.

Más información en: [github.com/umeiko/KlipperPhonesLinux](https://github.com/umeiko/KlipperPhonesLinux)
{% endhint %}

***

## Conexión de la impresora por USB OTG

### Detectar el puerto serial de la MCU

Con el cable OTG conectado y la impresora encendida, ejecuta dentro del contenedor:

```bash
ls /dev/ttyACM* /dev/ttyUSB* 2>/dev/null
```

La MCU debería aparecer como `/dev/ttyACM0` o `/dev/ttyUSB0`. Si no aparece, el driver del chip USB puede no estar incluido en el kernel del teléfono.

### Si la MCU no se detecta (driver CH34x)

Muchas placas usan el chip USB-serial **CH34x**, que algunos kernels Android no incluyen. Solución con la app **Octo4a**:

1. Instala [Octo4a](https://github.com/feelfreelinux/octo4a) desde GitHub (no publicar en Play Store)
2. Ábrela y espera a que detecte la impresora (incluye driver CH34x propio)
3. No es necesario usar OctoPrint dentro de Octo4a — solo la necesitas para el driver
4. El serial pipe se expone en: `/data/data/com.octo4a/files`
5. Monta esa ruta en Linux Deploy:

```
MOUNTS → Enable: yes
  Source: /data/data/com.octo4a/files
  Target: /home/android/octo4a
```

6. En `printer.cfg`, usa:

```ini
[mcu]
serial: /home/android/octo4a/serialpipe
```

### Dar permisos al puerto serial

```bash
sudo chmod 777 /dev/ttyACM0
# o
sudo chmod 777 /dev/ttyUSB0
```

Para que el permiso sea permanente añade esta línea a `/etc/rc.local`:

```bash
chmod 777 /dev/ttyACM0
```

***

## Configuración del printer.cfg

Una vez localizado el serial, edita tu `printer.cfg` con el serial correcto. Puedes obtenerlo con:

```bash
ls /dev/serial/by-id/
```

Y añadirlo en la sección `[mcu]`:

```ini
[mcu]
serial: /dev/serial/by-id/usb-Klipper_stm32f103xe_xxxxxxxx-if00
```

Para obtener una configuración base de tu electrónica consulta el [repositorio oficial de Klipper](https://github.com/Klipper3d/klipper/tree/master/config) o los repositorios específicos de cada marca que tenemos en la [guía de instalación](https://klipper.3dwork.io/klipper/instalacion).

***

## Acceso a la interfaz web

Una vez Klipper y Moonraker estén corriendo, accede a Mainsail o Fluidd desde cualquier navegador en tu red local:

```
http://<IP_DEL_TELEFONO>
```

{% hint style="success" %}
Para encontrar la IP de tu teléfono dentro del contenedor ejecuta:

```bash
hostname -I
```

{% endhint %}

***

## Inicio automático al arrancar Linux Deploy

Para que el contenedor y los servicios arranquen solos cuando enciendas el teléfono:

1. En Linux Deploy, activa **Autostart** en los ajustes
2. Activa también **Run on startup** para que Linux Deploy inicie el contenedor al arrancar Android

***

## Solución de problemas frecuentes

| Problema                        | Causa probable                   | Solución                                                                   |
| ------------------------------- | -------------------------------- | -------------------------------------------------------------------------- |
| El contenedor no monta          | SELinux en modo `Enforcing`      | Cambiar a `Permissive` con SELinuxModeChanger                              |
| `/dev/ttyACM0` no aparece       | Driver CH34x no disponible       | Usar Octo4a para exponer el serial pipe                                    |
| Klipper y Moonraker no conectan | Path de socket incorrecto        | Verificar y ajustar los paths en los ficheros `default` y `moonraker.conf` |
| OTG + carga no funciona         | Hardware no compatible           | Usar hub USB OTG con alimentación externa o placa que alimente el USB      |
| KlipperScreen falla al instalar | Versión Python demasiado antigua | Instalar Python 3.11 desde source o usar Debian Bookworm                   |
| El contenedor es muy lento      | Poca RAM o dispositivo de 32b    | Usar dispositivo con ≥3 GB RAM y arquitectura arm64                        |

***

## Comparativa con otros hosts

| Host                       | Precio orientativo | Root/Complejidad     | Rendimiento | Notas                        |
| -------------------------- | ------------------ | -------------------- | ----------- | ---------------------------- |
| **Android (Linux Deploy)** | 0 € (reutilizas)   | Alta (requiere root) | Alto        | Ideal para reciclar hardware |
| **Raspberry Pi Zero 2W**   | \~20 €             | Baja                 | Medio       | Bajo consumo, compacto       |
| **Raspberry Pi 4 2GB**     | \~45 €             | Baja                 | Alto        | Estándar de referencia       |
| **Orange Pi Zero 2W**      | \~20 €             | Media                | Medio-Alto  | Buena alternativa económica  |
| PC con Windows (WSL)       | 0 €                | Baja-Media           | Muy alto    | PC siempre encendido         |

{% hint style="info" %}
Tenemos guías específicas para otros hosts alternativos en la [sección de instalación](https://klipper.3dwork.io/klipper/instalacion).
{% endhint %}

***

## Recursos adicionales

* [github.com/d4rk50ul1/klipper-on-android](https://github.com/d4rk50ul1/klipper-on-android) — scripts de automatización para Linux Deploy
* [github.com/umeiko/KlipperPhonesLinux](https://github.com/umeiko/KlipperPhonesLinux) — Linux nativo en móviles Xiaomi específicos
* [KlipperScreen en Android (WiFi)](https://klipper.3dwork.io/klipper/mejoras/klipperscreen-mejoras/klipperscreen-android-wifi) — usar el teléfono como pantalla táctil de KlipperScreen desde otro host
* [Grupo Telegram Klipper ES](https://t.me/Klipper_Firmware_ES) — comunidad de ayuda en español


---

# 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/instalacion/klipper-en-android.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.
