#15

Arduino Simulator: Mobile

March 27, 2026

React NativeThree.jsExpoGoogle PlayArduinoOTG/USB

I ported the web Arduino simulator to React Native and shipped it on Google Play. Pre-built labs with live 3D simulation. The April update added real Arduino Uno support via OTG: connect your board and flash code directly from your Android phone.

What is it?

This is the mobile version of my Arduino simulator, shipped on Google Play. I wanted the same idea as the web version, but in a form where someone could run labs and simulations directly from their phone. Later I pushed it further by adding support for real Arduino Uno flashing over OTG.

That made the app much more than a simulator. It became a bridge between virtual labs and actual hardware, which is the part I am happiest with.

The porting reality

Porting this from web to mobile was much harder than I expected. A lot of browser assumptions disappear on React Native. Rendering changes. Audio changes. WebAssembly support changes. Graphics plumbing changes. Small features that were easy on the web suddenly need a completely different implementation path.

So the hard part was not just rewriting screens. It was mapping browser-native ideas onto mobile-native ones one by one. That is why the mobile version took so much longer than the original web simulator even though the product concept was already proven.

Google Play submission

Shipping on Google Play taught me a bunch of practical app-store rules I had never needed before. Signing keys matter permanently. The upload format is different. Privacy policy hosting matters. Closed testing matters. Even getting the store assets right takes real time.

A lot of people think the hard part is only the app code. It is not. The release process itself is a whole extra system with its own constraints, and if you ignore that, the project does not ship no matter how good the code is.

OTG hardware integration

The OTG update is the most technically fun part. Android can act as a USB host, which means the phone can talk directly to the Arduino board. I detect the device using USB identifiers, take the compiled HEX output from the simulation side, and hand it off to a native flashing path built around `avrdude`.

What I like about this is that the same code path can start as a simulation and end on real hardware. You can test the logic in the app, connect the board, and then flash the sketch from the phone itself. That made the project feel much more complete.

Current limitations and next steps

Right now, some of the lab controls are still fairly static, and I want to push the experience further so changing a parameter can trigger a faster rebuild and reflashing loop. The challenge is making that loop feel responsive enough that it still feels interactive on mobile hardware.

That is the next technical step I care about here: shrinking the path from edit to compile to flash so the app feels less like a packaged demo and more like a live experimentation tool.

Key takeaways

  • Expo EAS Build: cloud Android compilation, keystore management, AAB vs APK
  • Google Play requirements: 14-day closed testing, privacy policy, content rating
  • USB OTG on Android: USB host API, VID/PID device enumeration
  • avrdude: Arduino HEX format, upload protocols (stk500, avr109), flashing via CLI
  • React Native gaps vs browser: Web Audio, WebAssembly, WebGL and their native equivalents
Try it live →← all projects