The ESP32-CAM module
Introduction
The ESP32-CAM module is dedicated to camera readout. It provides
- an ESP32-S CPU
- a 2 mega pixel OV2640 camera and its interface.
- a very bright LED used as a flashlight connected to GPIO 4
- a user LED connected to GPIO 33
- an SD cardholder for SD card with up to 4GBytes capacity
The pinout
You find a detailed description of the pinout at
https://randomnerdtutorials.com/esp32-cam-ai-thinker-pinout
The interface for the SD card:
Board Variants
The ESP32-CAM comes in a number of variants.
The original ESP32-CAM
The original version has no USB connector and can only be controlled with a USB to serial adapter.
The connections to the USB to serial adapter are as follows:
In order to flash the board, GPIO 0 (marked IO0) must be jumpered to GND and the board must be reset. This sets the ESP32 to flash mode. Once flashing is finished, the jumper must be removed and the board reset. Thereafter, the board can be accessed with the USB to serial connection and a virtual terminal like minicom or gtkterm.
The ESP32-CAM-MB
The second variant comes with the ESP32-CAM-MB main board, which provides a micro USB connector.
The ESB32-CAM board, to be used with this main board, is slightly modified with respect to the original one:
|
|
The original ESP32-CAM |
The ESP32-CAM modified to work with the main board |
On the modified ESP32 cam board, the pin marked GND/R (just GND, on the original board) is connected to the ESP32 reset pin on the camera board and to the RTS line of the serial port on the ESP32-CAM-MB board. GPIO 0 is connected to serial DTR. Since the Unix serial driver sets RTS and DTR when connecting, the board is always in flash programming mode.
In order to access REPL you must pull both DTR and RTS low. This can be done with gtkterm, which has buttons to toogle these lines, or you can use rshell with DTR and RTS set to "false":
export RSHELL_RTS="false"
export RSHELL_DTR="false"
When trying to run thonny you will hit the same problem. The new version of thonny (I use version 4.0.0-dev) however allows you to disable DTR and RTS in the file
$HOME/.config/Thonny/configuration.ini. Just add the 2 lines setting DTR and RTS to False at the end of the file.
The esp32-cam model with the micro USB connector installed
This model works similarly to the original version, but with the micro USB connector and a "flash button" already installed. A simple micro USB cable is needed for communication. In order to set the module to flash mode, hold the flash button while pushing the RST button.
Testing with esp32-who
The github repository
esp32-who provides the esp32-cam driver, as well as a number of example programs. Before trying to integrate the driver into MicroPython I build the camera_web_server example and check that the hardware works correctly:
First configure the application with
idf.py menuconfig
In the Kconfig menu coming up you must
- specify your WiFi setup (SSID and password)
- select the camera type (AI Thinker)
This results in the following GPIO settings:
With these settings, we can build the application and flash it to the board.
idf.py build
idf.py flash
After successful flashing connect minicom (or rshell in the case of the esp32-cam-mb) to the camera module and reset the machine.
Integration into MicroPython
Espressif provides an
esp32-camera driver, which must be installed in the
components folder of esp-idf. First I created a copy of esp-idf-v4.3.1, the latest stable version of esp-idf at the time of writing and named it esp32-v4.3.1-cam. Then I downloaded esp32-camera to the same level as esp-idf-v4.3.1-cam and micropython and created a symbolic link to it in
esp-idf-v4.3.1-cam/components. In order to make sure that the correct esp-idf is used for compilation I set:
export ESPIDF=/opt/ucc/micros/esp32/esp32-v4.3.1-cam
export IDF_PATH=/opt/ucc/micros/esp32/esp32-v4.3.1-cam
Reserving some space in SPIRAM for the image buffer
Standard MicroPython uses all the SPIRAM for its heap. This results in an error when the esp32 camera driver tries to allocate space in SPIRAM for its image buffer. I therefore modified the MicroPython sources to keep some free space for the camera driver. Here is the part I modified in main.c. As you can see, 256 kBytes are reserved.
After this modification, you may follow the description in
https://lemariva.com/blog/2020/06/micropython-support-cameras-m5camera-esp32-cam-etc (DIY from Scratch) for the modifications to lv_micropython needed in order to produce an interpreter with the camera driver included.
--
Uli Raich - 2021-10-21
Comments