The ESP32 WiFi robot is a shrunken-down version of the ZeroBot (https://hackaday.io/project/25092). Instead of a Raspberry Pi, it is powered by the similarly popular ESP32. Despite its lower processing power, the ESP32 robot has a ton of features. It streams color video over WiFi, runs on a small LiPo battery and can be controlled accurately from any web browser. With the 4€ Esp32 and a 3€ camera, it's also really cheap.
Features: - Fully 3D printed chassis,(almost) no glue needed - Analog controls using a websocket interface - Low latency streaming (~100ms) at 120x160px - Custom PCB, no more messy wiring - Works with any 3.7V LiPo battery - Micro USB for programming and charging
The ESP32 requires no app, it can be controlled from any PC or mobile device that has a web browser. Unlike with other browser based robots, the web interface uses a virtual analog stick, which works accurately with any touchscreen or mouse. Even keyboard input is accepted. The streaming resolution can be considered potato-quality at 160x120px. It still surpasses the Gameboy camera and has 8-bit color. The robot can be used in access point mode or it can connect to an existing WiFi router. A single cell LiPo battery powers the robot and can be recharged from a micro USB port, which is also used to program the ESP32. Additional features include temperature and battery voltage monitoring and a bright LED output. To make the robot as compact as possible, the components are soldered to a custom PCB.
If you are interested in this robot and want to build it yourself, be warned that the development is not 100% complete. The Zerobot (Pro) might be a better beginners project.
To make the robot as small as possible I had to design a custom PCB instead of using individual modules. The ESP32 actually needs very few external components to function. In order to program it a USB-Serial bridge is needed. For this part I copied some of Sparkfun's layout for the "ESP32 Thing" which uses a FT231XS.
There are cheaper solutions like the CP2104, but these are difficult to solder by hand without a hot air station. To connect the camera, there are 18 pads on the edge of the PCB. This is all it takes to program the robot and stream video.
Additional components are the DRV8833 which is a tiny stepper motor /dual brushed motor driver. For supplying power, there is a LiPo charger on board. USB power and the battery can be plugged in at the same time. There is also a small transistor for switching on higher power LEDs. However these headlight LED have not been included in the 3D printed parts yet.
Below is a little animation of the layout process in Eagle:
The PCBs were ordered from Aisler, which is a German circuit board supplier, very similar to OSHPark in the US. Less than two weeks later I had the finished boards in my mail:
Fully populated, the PCB looks like this:
The Motors are connected by two wires each. I made a small design error by placing the Battery port right in front of the printed part. Depending on the battery that's used a small adapter might be needed anyway.
Another design error are the missing i2c pullup resistors for the camera. I assumed the camera board included those, but it seems to work just fine without them.
The original Zerobot has become quite popular with well over 20.000 downloads on Thingiverse. Because of that I kept on improving the code and adding more features over the past two years. Now I wanted to build something new, based on the web interface of the Zerobot. One option was to switch from the Raspberry Pi Zero to a Pi 3B+, but that wouldn't have changed anything apart from increased size and performance. Instead, I decided to make the robot smaller by using an ESP32. With the change from a linux computer to a microcontroller comes an obvious decrease in processing power.
I found that streaming at QQVGA (160x120px) works very well. The resolution is terrible compared to modern standards, but usable for navigating around on a desk. Here's a snapshot:
After I had a working prototype, I went on to design the PCB. It includes a FT232 module for programming the ESP32 a LiPo charger and a DRV8833 motor controller. The camera is directly soldered to the board to reduce the overall size of the robot.
While waiting for the PCBs to arrive from Aisler, I designed and printed a chassis. I would have liked to make the robot even smaller but the OV7670 is gigantic compared to the Arduino camera. I went through different designs before the robot ended up looking like it does now. This design was scrapped entirely:
There are again two shells that are 3D printed with the inside facing the print bed. I had to move the motors under the camera, this makes it possible to use smaller wheels. I still favor the more simplistic design of the Zerobot, but with the OV7670 this was as much as I could do. The remaining empty space in the chassis can be used for bigger batteries or other add-ons. It might even be possible to fit a regular ESP32 dev board inside instead of my PCB.