ESP32 Wireless Module

WiFi, Bluetooth, and Zigbee configuration for the Cruiser’s built-in ESP32-C6 module.

The Cruiser Carrier Board includes a built-in ESP32-C6 module. It can run one of two Exaviz firmware images:

  • WiFi + Bluetooth firmware (factory default) — WiFi 6 (802.11ax, 2.4 GHz) and Bluetooth LE 5.3, alongside board control (PoE management)
  • Zigbee coordinator firmware (beta, optional) — Zigbee coordination for smart home, alongside board control (PoE management)

External Antenna

The Cruiser’s ESP32-C6 is the ESP32-C6-MINI-1U variant, which uses an external antenna connector instead of an on-board PCB antenna. The board ships without an antenna - you supply your own.

Per the Espressif ESP32-C6-MINI-1U datasheet, the connector is the third-generation miniature RF connector, commonly labeled W.FL / MHF3 / IPEX3. Buy a pigtail branded for this generation: Hirose W.FL, Amphenol AMMC, and I-PEX MHF III all mate to the same standard, and pigtails are commonly labeled MHF3. It is not the common U.FL / MHF1 (first generation, ~2.0 mm) found on many other modules.

Choosing a Firmware

Because WiFi/Bluetooth and Zigbee live in separate firmware images, pick the one that matches your use case:

Use caseFirmwareWhat you get
WiFi and/or Bluetooth on the ESP32-C6WiFi + Bluetooth (default)WiFi 6 + BLE 5.3, no Zigbee
Zigbee coordinator for smart homeZigbee coordinator (beta)Zigbee, no ESP32 WiFi/BT

WiFi Setup

The ESP32-C6 provides WiFi 6 (802.11ax) connectivity at 2.4 GHz when running the WiFi + Bluetooth firmware (the factory default). WiFi and Bluetooth are not available when the module is running the Zigbee coordinator firmware - see Choosing a Firmware.

Note: For general WiFi setup instructions (including CM5 built-in WiFi), see the WiFi Setup section.

Access Point (SoftAP) Mode

The ESP32-C6 can act as a 2.4 GHz WiFi access point (SoftAP) - useful on a CM5 Lite (no on-board WiFi), or anywhere you want the Cruiser to serve its own WiFi network.

1. Confirm AP support

After updating exaviz-dkms and rebooting, install the tools and check the radio:

sudo apt install -y iw hostapd dnsmasq
# find the ESP32-C6 wifi interface (driver esp32_sdio)
for p in /sys/class/ieee80211/*; do
  [ "$(basename $(readlink -f $p/device/driver))" = esp32_sdio ] && \
    echo "esp phy=$(basename $p) iface=$(ls $p/device/net)"
done
iw phy <that-phy> info | sed -n '/Supported interface modes/,/Band/p'

You should see * AP in the supported interface modes. If you only see * managed, the installed driver predates AP support - update exaviz-dkms to 1.1.16 or newer.

2. Configure hostapd

Assume the ESP32-C6 interface is wlan0 (use the name from step 1). Create /etc/hostapd/hostapd.conf:

interface=wlan0
driver=nl80211
ssid=MyCruiserAP
hw_mode=g
channel=6
auth_algs=1
wpa=2
wpa_passphrase=change-this-passphrase
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

On Raspberry Pi OS / Trixie (NetworkManager), tell NetworkManager to leave the interface alone so it does not fight hostapd, then give it a static IP:

sudo nmcli device set wlan0 managed no
sudo ip addr add 192.168.50.1/24 dev wlan0
sudo ip link set wlan0 up

3. Hand out DHCP with dnsmasq

Create /etc/dnsmasq.d/cruiser-ap.conf:

interface=wlan0
bind-interfaces
dhcp-range=192.168.50.10,192.168.50.100,255.255.255.0,12h
dhcp-authoritative

4. Start it

sudo systemctl unmask hostapd
sudo systemctl enable --now hostapd dnsmasq

Verify with iw dev wlan0 info (should show type AP) and journalctl -u hostapd (should show AP-ENABLED). Connect a client to MyCruiserAP; it should associate and get a 192.168.50.x address. For internet access behind the AP you will also need to set up NAT/forwarding from the Cruiser’s uplink.

Antenna

Access-point operation needs the external antenna, the same as client mode - a W.FL / MHF III to RP-SMA pigtail with your own 2.4 GHz antenna.

Bluetooth LE

The ESP32-C6 provides Bluetooth Low Energy 5.3 connectivity when running the WiFi + Bluetooth firmware (the factory default). Bluetooth is not available when the module is running the Zigbee coordinator firmware - see Choosing a Firmware.

Checking Bluetooth Status

# View Bluetooth adapter
hciconfig

# Scan for devices
sudo hcitool lescan

Using bluetoothctl

bluetoothctl
# Inside bluetoothctl:
power on
agent on
scan on
# When device appears:
pair XX:XX:XX:XX:XX:XX
connect XX:XX:XX:XX:XX:XX

Zigbee Coordinator

With the Zigbee coordinator firmware, the ESP32-C6 acts as a built-in Zigbee coordinator - no external USB dongle required.

Protocol

The Exaviz Zigbee firmware implements Espressif’s ZNSP (Zigbee NCP Serial Protocol). It is not EZSP (Silicon Labs) or ZNP (Texas Instruments), so coordinators expecting those protocols will not communicate with it.

Supported Software

SoftwareStatusNotes
Home Assistant ZHA (via zigpy-espzb)SupportedThe only host stack that speaks ZNSP. zigpy-espzb is itself experimental.
zigbee2mqttNot supportedzigbee2mqtt does not implement ZNSP.
deCONZNot supporteddeCONZ does not implement ZNSP.

Serial Device Path

When the Zigbee firmware is running, the coordinator is exposed on /dev/ttyAMA4 at 115200 baud, no flow control. (/dev/ttyAMA3 is the PoE/board-control console and is not the Zigbee interface.)

dmesg | grep tty

Home Assistant ZHA

  1. Install/patch the zigpy-espzb radio library (contact support@exaviz.com for the exact versions and patches we validated).
  2. Go to Settings → Devices & Services → Add Integration
  3. Select Zigbee Home Automation (ZHA)
  4. Choose the EZSP/espzb (ZNSP) radio type and the serial device /dev/ttyAMA4 at 115200 baud
  5. Follow the setup wizard

Updating Exaviz Firmware

Exaviz provides firmware images for the ESP32-C6 module, including the optional Zigbee coordinator image. Each board’s flash is encrypted with a per-unit key fused into the chip, so images are built per board - a generic image will not boot.

Custom Firmware (Thread/Matter)

If you need Thread, Matter, or 802.15.4 support, you can install your own custom firmware on the ESP32-C6. The GPIO Control and Flash Firmware with esptool sections below explain how to enter bootloader mode and flash firmware.

Disabling Firmware Encryption

The ESP32-C6 firmware is encrypted by default. To install custom firmware, you may need to disable encryption first.

Contact support@exaviz.com for assistance with disabling ESP32 firmware encryption.

GPIO Control

The ESP32-C6 is controlled via CM5 GPIO pins for reset and firmware updates.

Install gpiod

sudo apt install gpiod

Pin Mapping

GPIOFunctionDescription
GPIO16EN (Enable)Reset the ESP32 (active low)
GPIO17BOOTEnter bootloader mode (active low)

Reset the ESP32

gpioset gpiochip0 16=0 && sleep 0.5 && gpioset gpiochip0 16=1

Enter Boot Mode (Firmware Update)

To flash new firmware to the ESP32-C6:

# Hold BOOT low
gpioset gpiochip0 17=0

# Reset while BOOT is held
gpioset gpiochip0 16=0
sleep 0.5
gpioset gpiochip0 16=1

# Release BOOT after reset
sleep 0.5
gpioset gpiochip0 17=1

The ESP32 is now in bootloader mode, ready for esptool.py or similar.

Flash Firmware with esptool

# Install esptool
pip install esptool

# Flash firmware (example) — the ESP32 bootloader UART is /dev/ttyAMA3
esptool.py --chip esp32c6 --port /dev/ttyAMA3 write_flash 0x0 firmware.bin

Troubleshooting

WiFi Not Working

If using CM5 built-in WiFi:

  1. See WiFi Setup
  2. Check wlan0 interface exists: ip link show wlan0
  3. Verify wpa_supplicant configuration

If using ESP32 WiFi:

  1. Verify ESP32 is running the latest Exaviz firmware
  2. Check ESP32 status: dmesg | grep esp
  3. Reset the ESP32 if needed
  4. Ensure ESP32 isn’t stuck in boot mode (GPIO17 should be high)
  5. Confirm the module is running the WiFi + Bluetooth firmware, not the Zigbee coordinator firmware (see Choosing a Firmware)

Bluetooth Not Found

  1. Verify ESP32 is running the latest Exaviz firmware
  2. Check hciconfig for Bluetooth adapter
  3. Reset the ESP32 if needed
  4. Ensure ESP32 isn’t stuck in boot mode (GPIO17 should be high)

Zigbee Coordinator Not Responding

  1. Confirm the ESP32 is running the Zigbee coordinator firmware (beta) - the factory WiFi + Bluetooth image has no Zigbee coordinator
  2. Verify your ZHA configuration points at /dev/ttyAMA4 (not /dev/ttyAMA3) at 115200 baud
  3. Confirm you are using ZHA via zigpy-espzb - zigbee2mqtt and deCONZ do not support the ZNSP protocol
  4. Reset the ESP32 if needed

ESP32 Unresponsive

If the ESP32 becomes completely unresponsive:

  1. Try a normal reset (GPIO16 toggle)
  2. If that fails, enter boot mode and reflash firmware
  3. Check CM5 GPIO pins are configured correctly
# Verify GPIO state
gpioget gpiochip0 16 17
# Should return: 1 1 (both high)

Resources

Last modified August 31, 2026