If you’re like me, you might enjoy being able to do things on your phone that you might otherwise do from your computer.
I wanted to play around with my ESP32-WROOM-32 development board, but apparently there is no online guide specifically for Termux, so I want to document the steps that worked for me as a future reference for myself and others.
⚠️ DISCLAIMER I am not responsible for any damage that could occurr by following this guide. This is written for educational purposes.
Requirements
any ESP32 development board will do, but in my case I will use a ESP32-WROOM-32
an OTG adapter
a USB-A cable (in my case micro-USB, but it depends by your board)
a phone with Termux installed, ideally from F-Droid
❗️ NOTE Make sure that your USB-A cable supports data transfer. This is crucial. Many cables I tried either did not support data transfer or were not delivering the power correctly, making the board brownout.
Getting started
The first thing you need to do is installing TCPUART transparent Bridge . This application will act as a bridge between the android Serial USB API and Termux. It will expose a local two-way TCP server that will forward the data to and from UART .
Installing a third party application is not ideal. An alternative could have been using termux-usb through Termux-API , but I was facing constant disconnections and setup issues, so I settled for this app.
TCPUART main screen After connecting the ESP32 After starting the local TCP server TCPUART app screenshots
TCPUART Setup
Set Baud Rate to 115200
Press the Connect button
button A prompt should appear (see the second screenshot). Click OK
Between client and server , choose server
and , choose Use 8080 as the port
as the port Click the Start button
Termux setup
Make sure you have the following termux packages installed. Run this command:
pkg install -y python esptool mpremote socat
We will then setup a TCP bridge virtual device file:
socat pty,link = $HOME /esp32,raw,echo = 0 tcp:127.0.0.1:8080 &
If it was executed successfully, the command should not print any output and socat will run in background. A file named esp32 will be created in the Termux home folder.
Resetting the ESP32
We need to reset the ESP32 memory, so we need to reboot it into download mode.
Hold the physical BOOT button on the board. The one on the bottom right in this image.
button on the board. The one on the bottom right in this image. Press and release the EN / ENABLE / RST / RESET button (basically the other button)
/ / / button (basically the other button) Release the BOOT button
button The device is now in download mode
To reset the ESP32 , run this command on Termux:
esptool --chip esp32 --port $HOME /esp32 --before no-reset --after no-reset erase-flash
Flashing the Micropython firmware
We now need to flash Micropython on the ESP32 .
The firmware link is obtained from https://micropython.org/download/ESP32_GENERIC/.
Run these commands on Termux to download and flash the firmware. Remember to go into Download mode before running the second command:
curl -L https://micropython.org/resources/firmware/ESP32_GENERIC-20250911-v1.26.1.bin -o esp32-micropython.bin esptool --chip esp32 --port $HOME/esp32 --before no-reset --after no-reset write-flash -z 0x1000 esp32-micropython.bin
❗️ IMPORTANT After the flash is complete, press and release the ENABLE / RESET button in the board to exit download mode.
🎉 Success
Congratulations, Micropython should now be flashed in your board.
Next steps
If you want to try the Micropython REPL, run this command:
mpremote connect port: $HOME /esp32 repl
By the way, there is also minicom if you want to interact with the REPL :
minicom -D $HOME /esp32 -b 115200
If you want to upload a program that will run on the ESP32 boot, without the need for it to be connected to your phone:
Create a file named program.py with nano (or any other editor) and put it in your $HOME directory
with (or any other editor) and put it in your directory Inside it, write the code you want. The code I will be using is:
import machine import time led = machine . Pin ( 2 , machine . Pin . OUT ) print ( "Starting LED blink..." ) print ( "Press Ctrl+C to stop" ) try : while True : led . on ( ) print ( "LED ON" ) time . sleep ( 1 ) led . off ( ) print ( "LED OFF" ) time . sleep ( 1 ) except KeyboardInterrupt : led . off ( ) print ( "Stopped" )
It will blink the builtin LED on the board every second, and will output the logs in the UART serial connection.
Uploading the code:
mpremote connect port: $HOME /esp32 cp $HOME /program.py :main.py
To run it immediately:
mpremote connect port: $HOME /esp32 run $HOME /program.py
Useful mpremote commands
List files
mpremote connect port:$HOME/esp32 fs ls
View a file
mpremote connect port:$HOME/esp32 fs cat main.py
Delete a file
mpremote connect port:$HOME/esp32 fs rm unwanted.py
Interactive REPL
mpremote connect port:$HOME/esp32 repl
Conclusion
Termux is linked against Bionic Libc , and in my phone specifically it runs on aarch64 , so many prebuilt binaries will not work. This means that I could not compile firmware binaries from scratch, as I could not setup a toolchain for it.
What I tried that either did not work or I gave up on trying:
Running PlatformIO : the xtensa-esp32-elf-g++ binary would not execute, as it is compiled for another architecture
: the binary would not execute, as it is compiled for another architecture An Ubuntu proot with PlatformIO
Using esp-idf
Rust’s espflash , espup , esp-rs
, , To connect to the UART serial: termux-usb and Termux: API . It would disconnect often and get a new device identifier each time, requiring to accept the permission each time. It was not a very practical solution, and I did not even get to making the UART communicate.