Descargo de responsabilidad:
No me hago cargo de ninguna afectación física, legal o de los componentes de software que puedan derivarse de la aplicación del contenido de este artículo. Continue bajo su propio riesgo!
Introducción:
El modelo de patinete eléctrico xiaomi 4 pro 1ra Generación incorporó nuevas prestaciones como son una mejor ergonomía, ruedas de 10″ provistas de gel autoreparable, una autonomía mejorada, etc. La controladora DRV y de la batería también han sido mejoradas sustancialmente en sus sistemas de protección, seguridad y desempeño.
Sus espesificaciones técnicas son:
- Marca: Xiaomi Electric Scooter
- Modelo: 4 Pro
- Potencia: 350W
- Potencia nominal: 700W
- Velocidad: 25 km/h
- Carga máxima: 120 Kg
- Sistema de frenos doble eABS
- Neumáticos autosellantes sin cámara de 10″
- Funciones:
- Pantalla LED
- Bluetooth v4.1
- Compatible con Android 4.3 / iOS 9.0 o superior
- Sube pendientes de 20º
- Batería:
- Capacidad: 12400 mAh/474 Wh
- Autonomía: 55 km
- Dimensiones: 1198 x 484 x 1240 mm
- Peso: 16.5 Kg
En este artículo, a modo de tutorial, voy a explicar la forma de liberar las limitaciones del software e incorpoarar mejoras en la autonomía, la potencia del motor y la duración de la batería. Debo ante todo reconocer que la idea original y el contenido están basados en el video del canal “CamiAlfa Electrónico” y es a él a quien le pertenece el crédito. La adición que hago a su excelente trabajo es llevar el procedimiento a plataformas Apple, concretamente a macOS v14+ con procesadores Apple Silicon. He realizado el proyecto en una mac Mini M2 pro con macOS Sequoia v15.1
A continuación les muestro un índice de las tareas a seguir:
Preparación del software:
- Descarga los archivos necesarios
- Instalación de HomeBrew
- Instalación de Python3 con brew
- Instalación de stLink con brew
- Instalación de openocd con brew
- Ajustes en el fichero *.py de configuracion
Preparación de Hardware
- StLink V2 (comprar módulo de programación)
- Cables Dupont (hembra-macho)
- Destornillador y juegos de puntas
- Pinzas
- Lupa pequeña
- Una tasa de cafecito o té [opcional 😁 ]
Procedimiento
- Quitar la tapa trasera del patinete
- Retirar la placa controladora
- Remover la silicona para descubrir los pines de programación del microcontrolador STM
- Colocar los cables dupont en la controladora y en el módulo stlink
- Comprobación del estado del módulo stlink
- Conexión con openocd
- Flasheo de la eeprom
- Comprobación del estado de la controladora
- Montaje en reversa de los componentes
- Conclusiones finales
–Comencemos–
Instalación de HomeBrew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Una vez instalado para comprobar su funcionamiento escriba en una ventana de terminal el comando debajo. Deberá recibir el mensaje “Your system is ready to brew”
brew doctor
//Salida: Your system is ready to brew.
Instalación de Python 3
Python es un popular lenguaje de programación de propósito general que tiene la ventaja de contar con un gran número de librerias de terceros para realizar las tareas más variadas, incluyendo la conexión con openOCD y stlink v2 para la programación y depuración de microcontroladores.
Puede instalar python utilizando su instalador de serie que puede obtenerse desde su página web; o mucho más sencillo resulta instalarlo con homebrew. Para nuestro trabajo python se encarga se ejecutar el código que maneja la reprogramación del microcontrolador STM32 en la DRV del patinete eléctrico.
Para instalar Python 3 con homebrew escriba en una ventana de la terminal en macOS:
brew install python
Una vez instalado Python para comprobar su funcionamiento primero asegúrese de que esta en la lista de elementos de homebrew como “python@3x”:
brew list
//Salida:
==> Formulae
aom fontconfig krb5 libusb-compat pkg-config
apr freetds libavif libvmaf python@3.13
apr-util freetype libdeflate libzip readline
argon2 gd libftdi little-cms2 rtmpdump
aspell gettext libidn2 lz4 sqlite
autoconf giflib libnghttp2 m4 stlink
automake gmp libpng mpdecimal tidy-html5
boost hidapi libpq oniguruma unixodbc
brotli highway libsodium open-ocd webp
ca-certificates icu4c libssh2 openexr xz
capstone icu4c@75 libtiff openldap zstd
cmake imath libtool openssl@3
confuse jpeg-turbo libunistring pcre2
curl jpeg-xl libusb php
==> Casks
Luego para comprobar el funcionamiento de Python escriba en la terminal en macOS:
python --version
//Salida: Python 3.xx.x
Homebrew instalará por lo regular la mayoria de las dependencias para Python pero puede comprobar si necesita alguna ejecutando el comando en la terminal:
brew info python
//Salida:
....
==> Dependencies
Build: pkg-config ✔
Required: mpdecimal ✔, openssl@3 ✘, sqlite ✔, xz ✔
....
En el resultado de salida chequee el bloque de “Dependencies” y si existe alguna dependencia que no esta instalada se marcará con una cruz roja (x). En el ejemplo de arriba la dependencia openssl@3 esta marcada como ausente (la marca @3 significa la versión). Para instalar una dependencia siga el mismo procedimiento:
brew install openssl
Ahora si vuelve a comprobar (brew info python) verá que todas las dependencia de Python están instaladas.
Una vez tengamos Python instalado en el sistema pasemos a instalar el resto de las heramientas.
Instalación de stlink v2 drivers
Stlink V2 es una popular herramienta para la depuración y programación de microcontroladores ARM de la serie stm8 y stm32. El módulo de programación cuenta con una interfaz de conexión de pines y USB que se conectar al computador.
Para nuestra trabajo, esta herramienta irá conectada, por un extremo a nuestra placa DRV del patinete y por el otro extremo al puerto USB A del computador.
Para instalar los drivers del módulo stlink v2 utilizamos el comando homebrew en la ventana de la terminal de macOS:
brew install stlink
Para comprobar su correcta instalación pruebe chequear si se muestra su resumen de instalación con homebrew:
brew info stlink
//Salida:
==> stlink: stable 1.8.0 (bottled), HEAD
STM32 discovery line Linux programmer
https://github.com/stlink-org/stlink
Installed
/opt/homebrew/Cellar/stlink/1.8.0 (107 files, 767KB) *
Poured from bottle using the formulae.brew.sh API on 2024-10-23 at 16:10:39
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/s/stlink.rb
License: BSD-3-Clause
==> Dependencies
Build: cmake ✔, pkg-config ✔
Required: libusb ✔
....
Instalación de openOCD
OpenOCD (Open On-Chip Debugger) es una herramienta de software libre y de código abierto ampliamente utilizada en el mundo del desarrollo de sistemas embebidos. Su principal función es facilitar la depuración, programación y testeo de microcontroladores, especialmente aquellos basados en arquitecturas ARM.
Instalar openOCD es muy fácil con homebrew, solo ejecute el siguiente comando en una ventana de la terminal de macOS:
brew install openocd
Compruebe que openocd esta correctamente instalado y todas sus dependencias:
brew info openocd
//Salida:
==> open-ocd: stable 0.12.0 (bottled), HEAD
On-chip debugging, in-system programming and boundary-scan testing
https://openocd.org/
...
==> Dependencies
Build: pkg-config ✔
Required: capstone ✔, hidapi ✔, libftdi ✔, libusb ✔
...
Ajuste del fichero *.py de configuración-programación
Dentro de los archivos descargados seleccione el que lleva el nombre “flash_hack_pro4.py” y abrálo en un editor de texto. Este fichero es un programa escrito en python que se encarga de controlar el proceso de reprogramación del microcontrolador de la placa del patinete eléctrico.
Localice la línea: serial =’35802/1JA2S22DJG7338′ y cambie los cinco primeros dígitos de acuerdo a tu región:
- 35802 is EU limited to 25Kmh
- 35804, 35803, 38190 other regions, limited to 25Kmh
- 35806 is German, limited to 20Kmh
- 38191 other region limited to 20Kmh
- 38949 is US limit 30Kmh
El resto de la numeración es el número de serie de tu patinete; puedes encontrarlo en el lateral del patinete, en la factura de su compra o en la placa controladora. Si no lo recuerdas no pasa nada. Solo debes colocar correctamente los cincos primeros dígitos. Por ejemplo, para españa seria: 35802/….
La otra variable que podemos modificar son los Km recorridos. Localize la línea: KM=1400
Puedes poner los Km que quieras, incluso 0.
En esta etapa del proyecto ya hemos realizados todos los preparativos a nivel de software.
Procedimiento
Remover la tapa trasera del patinete
Para ello volcamos el patinete al revés para que la tapa inferior quede accesible. Podemos apoyarlo sobre un cojin de tela como se muestra en la figura:
A continuación retiramos todos los tornillos y removemos la tapa. Localizamos el compartimento de la placa controladora (DRV).
Ahora es importante descargar los capacitores de la placa, para ello desconecte el cable de la batería (véase la figura) e intente encender el patín tres veces como mínimo. Esto permite trabajar con seguridad.
Retiramos con cuidado el resto de los conectores. Solo los conectores de fases de motor(véase la figura) van en una orientación definida. El resto de los conectores son únicos y no hay peligro de poder reconectarlos inadecuadamente. nota: Para remover los conectores de fases del motor hay que hacer una ligera presión lateral.
Una vez hallamos liberado la placa debemos proceder a descubrir la zona donde se encuentran los pines de programación. Para ello debemos auxiliarnos de una herramienta de madera o plástico para evitar dañar los componentes de la placa. Yo he utilizado una orquilla de sugetar ropa(madera) pero podeis utilizar la herramienta de su elección. Si tiene dudas puedes ver el video. Deberia quedarnos algo así:
Preparación del modulo stlink v2
Ahora procederemos a conectar los conectores dupont a la placa y al módulo de stlink v2 respectivamente. Después de varios intentos he desarrollado un método que permite mantener los cables fijos entre la placa y el módulo stlink. Véase la figura. Note que he recomendado conectores dupont macho-hembra porque las puntas podrían caber perfectamente en los orificios de los pines de programación de la placa controladora. Para mi fue un poco tarde para esta última mejora pero me quedé con la idea para futuras operaciones de ingeniería inversa.
Con los conectores en posición y fijos intente no mover la placa durante las operaciones siguientes. A continuación, vamos a comprobar si el computador reconoce el módulo stlink v2 y la placa conectada al mismo. Para ello, conectamos el módulo stlink v2 a al computador, como se muestra en la figura de arriba. Abrimos una ventana de terminal en macOS y escribimos lo siguiente:
st-info --probe
//salida:
Found 1 stlink programmers
version:V2J37S7
serial:55FF6B067188485721300767
flash:3072 (pagesize: 1024)
sram:20480
chipid:0x410
dev-type:STM32F1XX_MD
El comando st-info –probe realiza una comprobación para ver si hay conectado algún dispositivo stlink v2 y su hardware anexo. En este caso ha detectado el dispositivo conectado a un microcontrolador de tipo: STM32F1XX_MD
Ahora, sin mover los componentes. Copiamos los archivos necesarios, que descargamos al inicio, en una nueva carpeta llamada hack en el directorio Downloads. Esto no es estricto hacerlo, pero por conveniencia lo recomiendo. Teniendo en cuenta este ajuste, abrimos una ventana de la terminal y ejecutamos esta serie de comandos.
nota:
cd Downloads && cd hack
//Dentro del directorio hack:
openocd -f interface/stlink-v2.cfg -c "transport select hla_swd" -f target/stm32f1x.cfg
La finalidad es ejecutar el servidor de openOCD para crear la interfas de programación que más tarde utilizará el script de Python para conectarse a la placa y reprogramar el microcontrolador.
Aqui openOCD puede darnos una advertencia diciendo que la interface/stlink-v2 está obsoleta,que la reemplacemos por interface/stlink.cfg. En este caso modifique la interface para que solo sea: stlink.cfg. A mi me ha funcionado a pesar de esta advertencia.
Deberíamos ver una respuesta como la que se muestra arriba. Note que ahora el servidor de openODC esta escuchando por los puertos 6666 para conecciones tcl y 4444 para telnet. Precisamente el módulo stlink v2 se conecta al puerto 6666 para sus operaciones.
En este punto el LED del módulo stlink v2 debería estar parpadeando en colores. Ahora es el momento de ejecutar el script de Python que llevará a cabo el resto de las operaciones. Asi que abrimos una nueva ventana de terminal (dejamos la terminal del servidor openODC abierta tal cual) y escribimos lo siguiente:
python flash_hack_pro4.py
Al ejecutar este comando, puede que aparezca el error siguiente:
UUID = oocd.read_memory(0x1FFFF7E8,3)
File “/Users/Yorjandis/Downloads/hack/openocd.py“, line 121, in read_memory
values = [int(raw[2 * i + 1]) for i in range(len(raw) // 2)]
~~~^^^^^^^^^^^^^^^^
A partir de aquí el script se detiene y no permite seguir. Si le ha sucedido esto, tengo la solución, pero primero entendamos porque se produce este error. Aquí python está intentando convertir un string a un número entero de base 10, pero la cadena contiene caracteres hexadecimales (base 16) y por tanto no es válido una conversión directa a base 10. Para solucionar este error debemos especificarle a la función Int() que la cadena que intenta convertir está en base 16.Entonces, vaya a la carpeta hack donde están todos los archivos descargados y localize el fichero openocd.py, según el mensaje de error la línea que hay que buscar es la 121, asi que vaya a la línea 121 y realice el siguiente cambio:
Anterior:
values = [int(raw[2 * i + 1]) for i in range(len(raw) // 2)]
Nuevo:
values = [int(raw[2 * i + 1], 16) for i in range(len(raw) // 2)]
Con este pequeño cambio, el script funciona y termina todas las operaciones. Verá una pantalla como la siguiente:
Si ha llegado a esta etapa !felicidades! ha realizado la reprogramación de la placa controladora y la ha dotado de mejoras en la velocidad y gestión de la batería, entre otras.
Ahora toca retirar los conectores dupont de la placa controladora de patinete eléctrico y volver a colocarla en su sitio. Asegúrese de que la superficie inferior de la placa controladora tenga una fina capa de pasta térmica porque ello ayuda a la disipación del calor. Vuelva a conectar todos los conectores, prestando especial atención a los conectores de fases del motor. Mire la imagen para que tenga una guía. El resto de los conectores tienen su propio enganche. Por último, conecte el cable de la bateria y sin cerrar la tapa verifique que todo este conectado y haga una prueba encendiendo el patinete eléctrico. Compruebe que se muetra los valores en la pantalla del patinete. Compruebe las nuevas velocidades que deben ser aproximadamente 15, 25, 32 para los modos ECO, DRIVE y SPORT respectivamente. Coloque la tapa en su sitio y atornille correctamente, pero no con mucha fuerza, para evitar romper el plástico.
Conclusiones finales
En esta guía hemos realizado el procedimiento de reprogramación de una placa controladora para el modelo patinete eléctrico Xiaomi mi365 4 pro 1ra generación. Hemos utilizado herramientas como openOCD y stlink v2 en entorno Apple, en macOS.
Este procedimiento solo es válido para este modelo de patinete. De ningún modo intente realizarlo sobre otros modelos porque podría inutilizar la placa controladora.
Si por algún motivo necesita volver a la configuración de fábrica solo tiene que seguir el mismo procedimiento descrito utilizando el script “flash_pro4_1gen.py” en lugar de “flash_hack_pro4.py”.
Espero que les haya gustado el contenido y disfruten de las nuevas prestaciones que tandrá su patinete xiaomi 4 pro. Una vez más gracias a sr. Camilo del canal CamiAlfa por ser el creador original de este procedimiento.
Si este contenido le ha parecido útil o quiere saber algo relacionado puede dejarme algún comentario. Que tenga un feliz día!