esp32 cam digital low latency fpv

Overview

esp32-cam-fpv

esp32 cam digital, low latency FPV

This project uses a modified esp-camera component running on an AI Thinker board to send low-latency mjpeg video to a Raspberry PI base station with 1-2 wifi cards using packet injection and monitor mode.

It uses FEC encoding (4/7 currently configured) with 1400 byte packets and it achieves quite good performance:

  • Up to 12Mbps video rate.
  • More than 90 FPS at 400x296 or lower with 20-50 ms latency.
  • 34-44 FPS at 800x600 or 640x480 with 50-80 ms latency.
  • 12 FPS at 1024x768 with >100 ms latency.
  • Air unit weighs in at 18g with camera, antenna and a 3D printed case.

It's based on an Ai Thinker board with an OV2640 camera board and the esp-camera component.

The data is received from the camera module as JPEG ar 20MHz I2S clock and passed directly to the wifi module and written to the SD card if the DVR is enabled. The ESP camera component was modified to send the data as it's received from the DMA instead of frame-by-frame basis. This decreases latency quite significantly (10-20 ms) and reduces the need to allocate full frames in PSRAM.

The wifi data is send using packet injection with configurable rate - from 2 MB CCK to 72MB MCS7 - and power.

The air unit can also record the video straight from the camera to a sd card. The format is a rudimentary MJPEG without any header so when playing back the FPS will be whatever your player will decide.
There is significant buffering when writing to SD (3MB at the moment) to work around the very regular slowdowns of sd cards.

The receiver is a Raspberry PI 4 with 2 wifi adapters in monitor mode (TL-WN722N). The adapters work as diversity receivers and the data is reconstructed from the FEC packets.

The JPEG decoding is done with turbojpeg to lower latency and - based on the resolution - can take between 1 and 7 milliseconds.
It's then uploaded to 3 separate textures as YUV and converted to RGB in a shader.

The link is bi-directional so the ground station can send data to the air unit. At the moment it sends camera and wifi configuration data but I plan to have a full bi-directional serial port for telemetry coming soon.
The back link uses 64byte packets with a 2/6 FEC encoding (so quite solid) at a low wifi rate (I think 1Mb).

This is very WIP at the moment, but it proves that the ESP32 can definitely stream video with very low latency.
I plan to use this is a long range micro quad.

Here is a video shot at 30 FPS at 800x600 (video converted from the source mjpeg):

session004_segment000.mp4

Building

esp32 firmware:

  • Uses esp-idf-v4.3-beta1, can probably work with newer idf versions. It needs to be properly installed (follow the instructions in the IDF documentation)
  • Only the Ai Thinker esp cam board tested
  • In the air_firmware, execute this: idf.py -p /dev/tty.usbserial1 flash monitor. Replace tty.usbserial1 with your serial port.
  • Make sure you place the board in flashing mode bu connecting IO0 to GND and resetting the board.
  • After compiling and resetting, you should get some stats per second, smth like this in the console:
    WLAN S: 695196, R: 350, E: 0, D: 0, % : 0 || FPS: 64, D: 401268 || D: 0, E: 0
    WLAN S: 761616, R: 420, E: 0, D: 0, % : 0 || FPS: 69, D: 443679 || D: 0, E: 0
    WLAN S: 763092, R: 420, E: 0, D: 0, % : 0 || FPS: 69, D: 449410 || D: 0, E: 0
    WLAN S: 764568, R: 420, E: 0, D: 0, % : 0 || FPS: 69, D: 450996 || D: 0, E: 0
    WLAN S: 761616, R: 350, E: 0, D: 0, % : 0 || FPS: 69, D: 449347 || D: 0, E: 0

Raspberry Pi ground station:

  • I use a Raspberry Pi 4 in a RasPad3 enclosure, but any HDMI display should work. Raspberry Pi 3 should work as well.
  • You need to use 2 TL-WN722N adapters connected to USB. Check the EZ-wifibroadcast wiki for more info about the hardware revision of these adapters and alternative adapters. Make sure you get the 2.4GHz ones, of course. NOTE: the adapters are critical, not all work in monitor mode!
  • If you only have one adapter or they are not called wlan1 & wlan2, check the main.cpp file and change the names and number there:
    rx_descriptor.interfaces = {"wlan1", "wlan2"};
    tx_descriptor.interface = "wlan1";
    Eventually this should be command line driven.
  • The UI uses ImGui and is touch driven - but mouse should work as well
  • Dependencies: sudo apt install libdrm-dev libgbm-dev libgles2-mesa-dev libpcap-dev libturbojpeg0-dev libts-dev libsdl2-dev
  • In the gs folder, execute make -j4
  • Run sudo -E DISPLAY=:0 ./gs

The GS can run both with X11 and without. However, to run it without GS you need to compile SDL2 yourself to add support for kmsdrm: git clone https://github.com/libsdl-org/SDL.git
cd SDL
mkdir build
cd build
../configure --disable-video-rpi --enable-video-kmsdrm --enable-video-x11 --disable-video-opengl
make -j5
sudo make install

To run without X11 using the just compiled SDL2, do this:
sudo -E LD_LIBRARY_PATH=/usr/local/lib DISPLAY=:0 ./gs

Some other things that should improve latency:

  • Disable the compositor from raspi-config. This should increase FPS
  • Change from fake kms to real kms in config.txt: dtoverlay=vc4-fkms-v3d to dtoverlay=vc4-kms-v3d

VSync is disabled and on a PI4 you should get > 200FPS if everything went ok and you have configured the PI correctly.

Comments
  • ground station can only get a part of data

    ground station can only get a part of data

    Hi, Thanks for your share about your work.

    I test this projects by using ESP32-CAM and My PC(linux) with net card(AR9271 and RT3070), because I have no RP3 or RP4. I removed the code related to RaspberryPi/Decode/GUI and just test the data transmition.

    while I power on the esp32-cam, and run the program, the log shows that I only got a part of the data. For example, 2 part of 1 frame, and could not get a complete video frame.

    I) src/main.cpp: 129: OK Video frame 49896, 10 1457 - CRC OK 117. 
    (I) src/main.cpp: 129: OK Video frame 49896, 20 1457 - CRC OK 21. 
    (I) src/main.cpp: 129: OK Video frame 49897, 4 1457 - CRC OK 49. 
    (I) src/main.cpp: 129: OK Video frame 49899, 1 1457 - CRC OK 240. 
    (I) src/main.cpp: 129: OK Video frame 49899, 9 1457 - CRC OK 233. 
    (I) src/main.cpp: 129: OK Video frame 49900, 7 1457 - CRC OK 217. 
    (I) src/main.cpp: 129: OK Video frame 49901, 11 1457 - CRC OK 89. 
    (I) src/main.cpp: 129: OK Video frame 49901, 21 1457 - CRC OK 57. 
    (I) src/main.cpp: 129: OK Video frame 49902, 17 1457 - CRC OK 140. 
    (I) src/main.cpp: 129: OK Video frame 49905, 0 1457 - CRC OK 105. 
    (I) src/main.cpp: 129: OK Video frame 49905, 20 1457 - CRC OK 212. 
    (I) src/main.cpp: 129: OK Video frame 49907, 2 1457 - CRC OK 129. 
    (I) src/main.cpp: 129: OK Video frame 49907, 14 1457 - CRC OK 23. 
    (I) src/main.cpp: 129: OK Video frame 49908, 11 1457 - CRC OK 152. 
    (I) src/main.cpp: 129: OK Video frame 49909, 11 1457 - CRC OK 142.
    

    the log format is:

    LOGI("OK Video frame {}, {} {} - CRC OK {}. ", air2ground_video_packet.frame_index, (int)air2ground_video_packet.part_index, payload_size, crc);
    

    the code is here: https://github.com/Ncerzzk/esp32-cam-fpv/tree/temp

    have you met this kind of problem?

    opened by Ncerzzk 6
  • fatal error: crc.h: No such file or directory

    fatal error: crc.h: No such file or directory

    root@raspberrypi:~# git clone https://github.com/jeanlemotan/esp32-cam-fpv.git Cloning into 'esp32-cam-fpv'... remote: Enumerating objects: 277, done. remote: Counting objects: 100% (277/277), done. remote: Compressing objects: 100% (185/185), done. remote: Total 277 (delta 99), reused 238 (delta 74), pack-reused 0 Receiving objects: 100% (277/277), 905.21 KiB | 388.00 KiB/s, done. Resolving deltas: 100% (99/99), done. root@raspberrypi:~#cd esp32-cam-fpv root@raspberrypi:~/esp32-cam-fpv# cd gs/ root@raspberrypi:~/esp32-cam-fpv/gs# ls Makefile src root@raspberrypi:~/esp32-cam-fpv/gs# make g++ -MT .o/src/main.o -MD -MP -MF .d/src/main.Td -std=c++17 -O3 -DNDEBUG -ffast-math -funroll-loops -mcpu=cortex-a8 -mfpu=neon -Wall -DRASPBERRY_PI -Isrc -Isrc/utils -Isrc/imgui -Icomponents/common -I/opt/vc/include/ -I/usr/include/freetype2 -c -o .o/src/main.o src/main.cpp src/main.cpp:20:10: fatal error: crc.h: No such file or directory 20 | #include "crc.h" | ^~~~~~~ compilation terminated. make: *** [Makefile:126: .o/src/main.o] Error 1 root@raspberrypi:~/esp32-cam-fpv/gs# `

    opened by jeng37 3
  • Allwinner v3s + ESP32 version

    Allwinner v3s + ESP32 version

    I love the premise of this project, but want to take it a step up in video quality and latency. To do this I'm using a Allwinner V3s as camera interface, image signal processor and jpeg compressor. This allows many many more sensors, frame rates and resolutions to be an option, then using an ESP32 as wifi broadcast card (as per ESP32_bridge_broadcast).

    Currently testing with an OV5640 as it works, but I'm aiming to use a OV4669 (same as the Runcam Split 3), which should provide a big boost in quality, and be good for 720p/60 (the sensor is good for 720p/120, but I don't have enough CSI lanes) I've eventually managed to get hardware accelerated jpeg encoding to run, and it should be good for 720p 60fps.

    Wifi wise I'm ending up with similar findings to what you found with the ESP8266_bridge_broadcast : finding SDIO Wifi modules capable of Monitor mode is tough, getting drivers on the ancient kernel I'm using a pain, so I heading down using an ESP32 over SPI (tested to 25Mhz, and 4K SPI messages allows over 20Mbps of throughput). I just need to hack esp32-cam-fpv to take it's input from SPI, and then get the OV4669 working and it should be good for a test.

    Have you got any interest on working on esp32-cam-fpv, or are you done with it? If possible I'd love a bit of assistance in working out the magic in camera_data_available(), but if not I'm sure I'll get there eventually.

    opened by peteallenm 2
  • What is the limiting factor in the current system?

    What is the limiting factor in the current system?

    Hi, what is currently the limiting factor of the whole system? Is it the camera or the esp32 itself, would offloading image processing and acquisition to another board allow lower latency at higher resolutions?

    opened by jtomes123 2
  • I am having difficulty compiling

    I am having difficulty compiling

    I have to admit I never used ESP-IDF before so I am having difficulty compiling your great project. I always use Arduino IDE for my small projects.

    Can you please publish compiled binary which I can upload to ESP32 or guide me to use it with Arduino ?

    Thanks.

    opened by happytm 1
  • make -j4 gives error: unrecognized command-line option ‘-mfpu=neon’

    make -j4 gives error: unrecognized command-line option ‘-mfpu=neon’

    Hello, I am trying to install the gs on my raspberry pi 4 with ubuntu, I have installed all the dependencies as listed on the guide and edited main.cpp according with my wireless adapters, tough when I try to run sudo make -j4 (just make -j4 gives me permission errors) I get this error and I can't quite figure out what is the problem:

    g++ -MT .o/src/main.o -MD -MP -MF .d/src/main.Td -std=c++17 -O3 -DNDEBUG -ffast-math -funroll-loops -mcpu=cortex-a8 -mfpu=neon -Wall -DRASPBERRY_PI -Isrc -Isrc/utils -Isrc/imgui -Icomponents/common -I/opt/vc/include/ -I/usr/include/freetype2 -c -o .o/src/main.o src/main.cpp g++ -MT .o/src/droid_sans_font.o -MD -MP -MF .d/src/droid_sans_font.Td -std=c++17 -O3 -DNDEBUG -ffast-math -funroll-loops -mcpu=cortex-a8 -mfpu=neon -Wall -DRASPBERRY_PI -Isrc -Isrc/utils -Isrc/imgui -Icomponents/common -I/opt/vc/include/ -I/usr/include/freetype2 -c -o .o/src/droid_sans_font.o src/droid_sans_font.cpp g++ -MT .o/src/HUD.o -MD -MP -MF .d/src/HUD.Td -std=c++17 -O3 -DNDEBUG -ffast-math -funroll-loops -mcpu=cortex-a8 -mfpu=neon -Wall -DRASPBERRY_PI -Isrc -Isrc/utils -Isrc/imgui -Icomponents/common -I/opt/vc/include/ -I/usr/include/freetype2 -c -o .o/src/HUD.o src/HUD.cpp g++ -MT .o/src/imgui_impl_opengl3.o -MD -MP -MF .d/src/imgui_impl_opengl3.Td -std=c++17 -O3 -DNDEBUG -ffast-math -funroll-loops -mcpu=cortex-a8 -mfpu=neon -Wall -DRASPBERRY_PI -Isrc -Isrc/utils -Isrc/imgui -Icomponents/common -I/opt/vc/include/ -I/usr/include/freetype2 -c -o .o/src/imgui_impl_opengl3.o src/imgui_impl_opengl3.cpp g++: error: unrecognized command-line option ‘-mfpu=neon’ make: *** [Makefile:126: .o/src/main.o] Error 1 g++: error: unrecognized command-line option ‘-mfpu=neon’ make: *** Waiting for unfinished jobs.... make: *** [Makefile:126: .o/src/droid_sans_font.o] Error 1 g++: error: unrecognized command-line option ‘-mfpu=neon’ g++: error: unrecognized command-line option ‘-mfpu=neon’ make: *** [Makefile:126: .o/src/HUD.o] Error 1 make: *** [Makefile:126: .o/src/imgui_impl_opengl3.o] Error 1

    Does anyone have any idea what I might be doing wrong? Thank you for your time

    opened by francesco-miccoli 1
  • PIXFORMAT_GREYSCALE uncompressed streaming

    PIXFORMAT_GREYSCALE uncompressed streaming

    Hi, currently, this only works when using jpeg compressed streaming. Would support for high fps (30-90)fps be possible with grayscale output and a low res like 96x96?

    opened by thet0ast3r 1
  • Write to SD card: how to?

    Write to SD card: how to?

    Hi, Thanks for sharing your great work. How can we have the mjpeg file on the sdcard?

    I tried with below steps:

    • inserted a sdcard
    • turned on the esp
    • On monitor, it shows the expected output
    • wait a few seconds
    • turn off the esp
    • checking the sd card, but no files created.

    (Not related but, is there any chance to use your logic to have better FPS to be sent to a browser/video program?)

    Thanks in advance,

    opened by RibeiroSantos 1
  • Is it possible to use a pi zero as the base station?

    Is it possible to use a pi zero as the base station?

    Apologies in advanced im not to experienced with this kind of stuff but I wanted to make an rc car/tank. With the current unavailiablity of pi 4s I was wondering if it would be possible to use a pi zero that I have lying about.

    Additionally can data be sent back to the esp32? It would simplify my project if i could control the car with a controller or something plugged into the pi.

    opened by Cryaniptic 1
  • I end up with an end-to-end latency of around 800 milliseconds

    I end up with an end-to-end latency of around 800 milliseconds

    I tried to get this running, but found several issues, which might or might not be related to each other. Any idea what's going wrong?

    Issues:

      1. I end up with an end-to-end latency of around 800 milliseconds – far beyond the figures in the description. I found this out by by directing the camera to the display and at the same time to a stopwatch app and taking a photo of the setup. 2. The output on the display shows checkerboard-like compression artefacts and is virtually unusable. 3. Though I can move the cursor on the RPI-screen with the mouse, I cannot change the configuration-settings. 4. gs shows error messages on startup (I added LOGE("{}", SDL_GetError()); in the SDLCHK macro)

    pi@fpvbusterpi:~/esp32-cam-fpv/gs $ sudo -E LD_LIBRARY_PATH=/usr/local/lib ./gs (I) src/PI_HAL.cpp: 125: Initializing pigpio (I) src/PI_HAL.cpp: 283: Drivers: 4 (I) src/PI_HAL.cpp: 286: Driver 0: x11 (I) src/PI_HAL.cpp: 286: Driver 1: KMSDRM (I) src/PI_HAL.cpp: 286: Driver 2: dummy (I) src/PI_HAL.cpp: 286: Driver 3: evdev (I) src/PI_HAL.cpp: 295: Mode 0: 1280x1024 (I) src/Comms.cpp: 718: Radiocap header size: 11, IEEE header size: 24 (I) src/Comms.cpp: 581: Opening interface wlan1 in monitor mode (I) src/Comms.cpp: 282: DLT_IEEE802_11_RADIO Encap (I) src/Comms.cpp: 581: Opening interface wlan2 in monitor mode (I) src/Comms.cpp: 282: DLT_IEEE802_11_RADIO Encap (I) src/Video_Decoder.cpp: 160: SDL window: 31254080 (E) src/Video_Decoder.cpp: 161: SDL error -1 in SDL_GL_MakeCurrent(m_impl->window, m_impl->contexts[thread_index])file src/Video_Decoder.cpp line 161 (E) src/Video_Decoder.cpp: 161: Unable to make EGL context current (call to eglMakeCurrent failed, reporting an error of EGL_BAD_ACCESS) (I) src/Video_Decoder.cpp: 160: SDL window: 31254080 (E) src/Video_Decoder.cpp: 161: SDL error -1 in SDL_GL_MakeCurrent(m_impl->window, m_impl->contexts[thread_index])file src/Video_Decoder.cpp line 161 (E) src/Video_Decoder.cpp: 161: Unable to make EGL context current (call to eglMakeCurrent failed, reporting an error of EGL_BAD_ACCESS) (I) src/Video_Decoder.cpp: 160: SDL window: 31254080 (E) src/Video_Decoder.cpp: 161: SDL error -1 in SDL_GL_MakeCurrent(m_impl->window, m_impl->contexts[thread_index])file src/Video_Decoder.cpp line 161 (E) src/Video_Decoder.cpp: 161: Unable to make EGL context current (call to eglMakeCurrent failed, reporting an error of EGL_BAD_ACCESS) (I) src/Video_Decoder.cpp: 160: SDL window: 31254080 (E) src/Video_Decoder.cpp: 161: SDL error -1 in SDL_GL_MakeCurrent(m_impl->window, m_impl->contexts[thread_index])file src/Video_Decoder.cpp line 161 (E) src/Video_Decoder.cpp: 161: Unable to make EGL context current (call to eglMakeCurrent failed, reporting an error of EGL_BAD_ACCESS)

    What's my setup and what did I do?

      • I’m using an RPI4 with a Buster image and TL-WN722 v2 adapters together with appropriate driver from https://github.com/aircrack-ng/rtl8188eus. • I provided the prerequisites as described • I fixed the obvious issue in Makefile in order to find all headers • I had to change Comms.cpp ( pcap_set_rfmon(pcap.pcap, 0) < 0) ) in order to work around a PCAP problem (pcap_activate … too many arguments) • WLAN1 und WLAN2 are successfully brought up in monitoring mode before startup of gs • I made sure ESP32-CAM was running continuously • I accessed RPI by ssh to start gs • I did serial monitoring on ESP32

    Typical output of gs:

    … (I) src/main.cpp: 104: RX len: 77910, RSSI: -65, Latency: 158/158/158 (I) src/main.cpp: 104: RX len: 99960, RSSI: -69, Latency: 144/144/144 (I) src/main.cpp: 104: RX len: 104370, RSSI: -47, Latency: 168/168/168 (I) src/main.cpp: 104: RX len: 113190, RSSI: -81, Latency: 162/162/162 (I) src/main.cpp: 104: RX len: 110250, RSSI: -47, Latency: 130/130/130 (I) src/main.cpp: 104: RX len: 108780, RSSI: -65, Latency: 140/140/140 (I) src/main.cpp: 104: RX len: 104370, RSSI: -69, Latency: 144/144/144 (I) src/main.cpp: 104: RX len: 107310, RSSI: -47, Latency: 167/167/167 (I) src/main.cpp: 104: RX len: 98490, RSSI: -47, Latency: 160/160/160 (I) src/main.cpp: 104: RX len: 108780, RSSI: -81, Latency: 195/195/195 (I) src/main.cpp: 104: RX len: 97020, RSSI: -65, Latency: 126/126/126 (I) src/main.cpp: 104: RX len: 102900, RSSI: -95, Latency: 180/180/180 (I) src/main.cpp: 104: RX len: 101430, RSSI: -95, Latency: 130/130/130 (I) src/main.cpp: 104: RX len: 104370, RSSI: -95, Latency: 141/141/141 …

    HAL widget on DISPLAY reports <5ms/frame and >200fps

    Typical output of esp32-cam:

    … MEMORY Before Loop: Heap summary for capabilities 0x00000004: At 0x3f800000 len 4194303 free 979859 allocated 3211264 min_free 979859 largest_free_block 966656 alloc_blocks 257 free_blocks 1 total_blocks 258 At 0x3ffae6e0 len 6432 free 4 allocated 4136 min_free 4 largest_free_block 0 alloc_blocks 35 free_blocks 0 total_blocks 35 At 0x3ffb7920 len 165600 free 4 allocated 162832 min_free 4 largest_free_block 0 alloc_blocks 153 free_blocks 0 total_blocks 153 At 0x3ffe0440 len 15072 free 4 allocated 12876 min_free 4 largest_free_block 0 alloc_blocks 10 free_blocks 0 total_blocks 10 At 0x3ffe4350 len 113840 free 6888 allocated 104528 min_free 6872 largest_free_block 6784 alloc_blocks 68 free_blocks 2 total_blocks 70 Totals: free 986759 allocated 3495636 min_free 986743 largest_free_block 966656 WLAN S: 29520, R: 70, E: 0, D: 0, % : 99 || FPS: 1, D: 68846 || D: 0, E: 0 Wifi rate changed from 9 to 13 Camera resolution changed from 3 to 0 Target FPS changed from 30 to 0 Camera quality from 8 to 63 WLAN S: 119556, R: 280, E: 0, D: 0, % : 97 || FPS: 48, D: 537492 || D: 0, E: 0 WLAN S: 119556, R: 210, E: 0, D: 0, % : 97 || FPS: 54, D: 123820 || D: 0, E: 0 WLAN S: 119556, R: 350, E: 0, D: 0, % : 95 || FPS: 54, D: 124757 || D: 0, E: 0 WLAN S: 119556, R: 210, E: 0, D: 0, % : 97 || FPS: 54, D: 124719 || D: 0, E: 0 WLAN S: 121032, R: 210, E: 0, D: 0, % : 95 || FPS: 54, D: 125311 || D: 0, E: 0 WLAN S: 119556, R: 350, E: 0, D: 0, % : 97 || FPS: 53, D: 125379 || D: 0, E: 0 WLAN S: 119556, R: 210, E: 0, D: 0, % : 97 || FPS: 54, D: 125704 || D: 0, E: 0 WLAN S: 119556, R: 210, E: 0, D: 0, % : 97 || FPS: 53, D: 123120 || D: 0, E: 0 WLAN S: 121032, R: 280, E: 0, D: 0, % : 95 || FPS: 53, D: 122297 || D: 0, E: 0 WLAN S: 119556, R: 210, E: 0, D: 0, % : 95 || FPS: 53, D: 124083 || D: 0, E: 0 WLAN S: 119556, R: 280, E: 0, D: 0, % : 95 || FPS: 53, D: 125109 || D: 0, E: 0 WLAN S: 119556, R: 280, E: 0, D: 0, % : 95 || FPS: 53, D: 124289 || D: 0, E: 0 WLAN S: 119556, R: 350, E: 0, D: 0, % : 97 || FPS: 53, D: 124572 || D: 0, E: 0 WLAN S: 121032, R: 350, E: 0, D: 0, % : 95 || FPS: 53, D: 123323 || D: 0, E: 0

    opened by vguenther 1
  • Ideas for a faster/lower latency system

    Ideas for a faster/lower latency system

    I thought I was smart when I started my own project 3 days ago that grabbed the JPEG image and dumped it through 80211_tx function. Little did I know that I was re-inventing the wheel...

    Anyway, I read some of your code and it's actually smart, how you've implemented error correction, why you do so, etc. My last trick (as in idea, haven't done that yet) was to:

    • Tell the camera to spit out raw pixels (much faster than JPEG I think)
    • Maaaaaaybe apply some kind of compression on each packet?
    • Encode each packet with FEC (is this feasible or you need the whole video frame?)
    • Reduce the DMA buffer to 2-3x the max 80211 frame size (1500-32 but taking into account compression/FEC/other metadata)
    • Access the DMA directly with "just enough" data to send a packet frame (essentially override the dma ISR esp-camera sets up)

    There's also the ability to disable the sanity checks that 80211_tx does by overwriting ieee80211_raw_frame_sanity_check to always return ESP_OK. Check out some of the esp32 deauther projects

    What do you think? Have you thought of these or even tried them?

    opened by dzervas 7
Owner
null
Builds and runs an exported image classification impulse on ESP32 Cam

ESP32 Cam and Edge Impulse How to run custom inference on a ESP32 cam using Edge Impulse. Material This code has been tested the AI Thinker ESP32 Cam

Edge Impulse 65 Dec 31, 2022
My humble attempt at getting tensorflow and the ESP32-CAM to cooperate

ESP32-Object-Recognition My humble attempt at getting tensorflow and the ESP32-CAM to cooperate (among other things) Notes: "Webcam_detection.py" isn'

null 13 Jun 21, 2022
ESP32-CAM with LVGL Speech/Face Recognition IR Control

ESP_MASTER 视频介绍:https://www.bilibili.com/video/BV1SM4y1V7Yb This is a comprehensive project that combines the powerful computing capabilities of ESP32

Kevincoooool 198 Jan 5, 2023
ESP32-Cam mod for Voron V2

ESP32-Cam Mod For Voron V2 This is a webcam mod for Voron V2. This project is currently under development. What else you need: ESP32-CAM with ov2640/o

Vaan Ip 33 Dec 10, 2022
Tiny and cheap robot car for inspecting sewer pipes >= 125 mm. With pan servo for the ESP32-Cam module

ESP32-Cam Sewer inspection car Version 1.0.0 - work in progress Based on esp32-cam-webserver by Owen Carter. Additional Features Pan servo for the ESP

Armin 5 Nov 6, 2022
ESP32-Skid-Steer - Bruder Catepillar Skid Steer model converted to RC, controlled by an ESP32 with 2 analog joysticks and a receiver that is an ESP32 on the model.

ESP32-Skid-Steer Bruder Catepillar Skid Steer model converted to RC, controlled by an ESP32 with 2 analog joysticks and a receiver that is an ESP32 on

null 6 Oct 27, 2022
CC2500 Low-Cost Low-Power 2.4 GHz RF Transceiver driver for esp-idf

esp-idf-cc2500 CC2500 Low-Cost Low-Power 2.4 GHz RF Transceiver driver for esp-idf. I ported from this. 2.00mm pitch External Antena 1.27mm pitch PCB

null 3 May 29, 2022
ESP-32 CAM implementation of a Bird classifier using Arduino IDE

Bird-Classifier ESP-32 CAM implementation of a Bird classifier using Arduino IDE For the file server to run, you also need to have the ESP32 SD File M

null 3 Mar 28, 2022
Bluetooth low energy (BLE) tracker for ESP32

BLEcker Bluetooth low energy (BLE) tracker for ESP32 This software is written for ESP32 boards to track BLE devices. It can be used for your smart hom

Vörös Ákos 42 Jan 3, 2023
A couple of demos showing how to use the Ultra Low Power coprocessor on the ESP32

ESP32 Ultra Low Power (ULP) coprocessor You can watch a video explanation of this code here This repo contains two demo project: ulp-gpio Shows you ho

atomic14 8 Nov 9, 2022
null 313 Dec 31, 2022
Allows for multiple SwitchBot buttons and curtains to be controlled via MQTT sent to ESP32. ESP32 will send BLE commands to switchbots and return MQTT responses to the broker. Also supports Meter/Temp Sensor

SwitchBot-MQTT-BLE-ESP32 Switchbot local control using ESP32. no switchbot hub used/required. works with any smarthub that supports MQTT https://githu

null 343 Dec 27, 2022
AnalogWrite for ESP32 and ESP32-S2 with LEDC PWM. Includes PWM Phase Control, DAC and Smart GPIO resource management.

analogWrite() ESP32 Installation Instructions This library was tested using using the ESP32 Arduino IDE Boards Manager installation method. Stable rel

null 36 Jan 5, 2023
ESP32 + GitHub Actions + Husarnet. A boilerplate project for ESP32 allowing in-field firmware update using GitHub Actions workflow.

esp32-internet-ota ESP32 + GitHub Actions + Husarnet. A boilerplate project for ESP32 allowing in-field firmware update using GitHub Actions workflow.

Husarnet 31 Sep 22, 2022
Comparing the performance of Wave Digital Filter implementations

WDF Bakeoff Comparing performance between Wave Digital Filters implemented in C++ and Faust. Building First clone the repository and submodules: git c

null 12 Dec 4, 2022
Voltage Controlled Digital Core Multimode Oscillator using Mozzi library on Arduino

Arduino-VDCO Voltage Controlled Digital Core Multimode Oscillator using Mozzi library on Arduino Its a digital Oscillator/Voice for the Eurorack Stand

null 47 Dec 12, 2022
Direct Digital Synthesis DDS with microcontroller

Direct Digital Synthesis DDS with microcontroller DDS is a cool thing. To understand how it works is even cooler. So I wrote a little tutorial about D

weigu 2 Nov 8, 2022
Digital control and signal processing library for DSPs developed in C

digital-control Overview Thisis a simple C library containing very useful digital control and signal processing functionalities destinated for DSP's a

CLECIO JUNG 4 Oct 25, 2022
A set of tutorial projects for creating a simple digital radio receiver based on the STM32G431KB microcontroller

simple-radio Обучающие проекты по созданию простого цифрового радиоприемника на базе микроконтроллера STM32G431KB. Разработка программ выполнялась в W

null 9 Sep 21, 2022