The overview, with examples running, is on the board page and The ESP32-C6 model (every register).
The ESP32-C6-DevKitC-1
A second RISC-V board: the same core as the ESP32-C3 at 160 MHz, with thirty-one GPIOs, half a megabyte of SRAM and an addressable RGB LED on GPIO 8.
What it is
An ESP32-C6-WROOM-1 module on a 52.5 by 25.4 mm board, with two fifteen-pin headers 0.9 inch apart, so it straddles a breadboard's center channel with a free row on each side. The reference page is The ESP32-C6 model.
The high-performance core is the one Mokxi runs: RV32IMC at 160 MHz, one instruction per cycle, the same hart as the C3.
How it differs from the C3
Four things, and none of them is the instruction set.
- Thirty-one GPIOs rather than twenty-two, numbered 0 to 30. GPIO 24 and up are the SPI flash and are on neither header.
- 512 KB of SRAM in one window. On a C3 the same RAM appears twice, once for
each bus; here both buses reach it at the same addresses, which is why the
linker script is simpler and
.dataneeds no copy at reset. - An addressable RGB LED on GPIO 8, where a C3-DevKitM-1 has one too but a plain LED is what most sketches drive.
- Two USB-C sockets. One goes to a USB-to-UART bridge, which is what the serial monitor talks to; the other goes to the chip's own USB, which Mokxi does not model.
An ELF built for a C3 will not run here and the editor will not offer you one: same instruction set, different memory map.
The RGB LED
GPIO 8 is the board's own WS2812. It wants twenty-four bits, not a level, so the board part does not decode it: a WS2812 is a protocol. Wire the WS2812 part to GPIO 8 and the colors are real.
The built-in Rainbow program does exactly that, bit-banging the pulse widths from a counted loop. That is not a shortcut here: the RMT peripheral that would normally drive it is not modeled.
The analog pins
GPIO 0 to GPIO 6 are ADC1 channels 0 to 6, and analogRead() on one of them
is a real conversion of the voltage on the pin: twelve bits, 0 to 4095,
against a full scale the attenuation picks. The default is 11 dB, about the
whole 3.3 V rail, so a potentiometer or a thumb stick across the supply spans
the range; analogSetPinAttenuation() takes ADC_0db (1.1 V), ADC_2_5db
(1.5 V), ADC_6db (2.2 V) or ADC_11db, and analogReadResolution() shifts
the result if you want an Uno's ten bits back.
One read costs about five microseconds of simulated time, which is what the
converter takes. A pin with nothing on it reads 0 rather than noise. Seven
analog inputs and no more: any other pin reads 0 too.
PWM
analogWrite(pin, 0..255) works on any GPIO. The output comes from LEDC,
the chip's LED PWM controller, and reaches the pin through the GPIO matrix, so
there is no fixed set of ~ pins the way there is on an Uno.
The default is eight bits at 1 kHz. When the frequency matters (a servo wants fifty frames a second and a pulse width, not a duty), use the ESP32 spelling:
ledcAttach(4, 50, 14); // fifty frames a second, 16384 counts each
ledcWrite(4, 1229); // 1.5 ms of a 20 ms frame: the middle
There are six channels and four timers. Channels asking for the same frequency
and resolution share a timer, so six pins fading together cost one of the four;
ask for a fifth distinct pair and ledcAttach returns false rather than
retuning a timer another pin is riding on. pinMode() and digitalWrite()
take a pin back from LEDC, so a pin that was fading and is then written to is
really written to.
A duty of 0 is a solid low and a duty of 255 a solid high, out of the
hardware, with no edges at all, which also means the simulator has nothing to
wake the board for.
WiFi, simulated
There is no radio. There never will be: an 802.11 MAC is not something this model could reproduce honestly.
What there is, since September 2026, is a simulated network. A block that is
Mokxi's own rather than the chip's (a mailbox at 0x6FFF_E000, where a real
C6 has nothing mapped at all) carries WiFi.h, HTTPClient.h and
WebServer.h, so the Arduino code a tutorial gives you runs here: the board
joins an access point whose name and password are properties of the board,
WiFi.status() walks the same states in the same one to three seconds, DHCP
leases it 192.168.4.2, and a sketch can fetch a page or serve one.
What is behind it is software, and nothing is hidden about that. There is no
802.11, no channel, no scan, no WPA2, no TCP, no TLS and no real internet:
four made-up names under .mokxi resolve and no others, and nothing a sketch
does can reach the network your browser is on. WiFiClientSecure compiles and
then fails, saying TLS is not simulated. The Web and Cloud panels along the
bottom of the editor open with that sentence and do not scroll it away.
Three examples ship for this board: WiFi: join the network, WiFi: fetch the weather and WiFi: a lamp on a web page.
WiFi, simulated is how to use it; Simulated WiFi is the contract, limit by limit.
What this model does not have
More than usual, and the contract says so rather than inventing register offsets it cannot stand behind.
- No radio. No 802.11, no Bluetooth LE, no Thread or Zigbee. The WiFi above it is simulated and says so.
- No low-power core. The C6's LP domain is half of what makes the chip interesting and none of it is here.
- No RMT, which is what would normally drive the RGB LED, and none of the SAR ADC beyond ADC1's one-shot path or of LEDC beyond its timers and channels.
- Five of the model's base addresses (GPIO, IO_MUX, SYSTIMER, LEDC and the SAR
ADC) are its best account rather than something it can stand behind, and so
are the GPIO matrix signal numbers LEDC's channels use. They are named in one
header, so an image being taken to real silicon has a short list of
#defines to check. Section 7 of the reference page is the list, and sections 3.6 and 3.7 mark the two newest blocks register by register.
The firmware
Nine built-in programs: Blink, Button (the BOOT button on GPIO 9), Serial, Fade, WiFi: join the network, WiFi: fetch the weather, WiFi: a lamp on a web page, Thumb stick and Rainbow.
Fade breathes an LED on GPIO 10 with analogWrite, so the waveform comes
out of the hardware and the core sleeps between steps. Thumb stick reads a
KY-023 on ADC1 channels 0 and 1, prints both axes, and lights the LED on the
side you push towards as brightly as you push it: one sketch using both of the
peripherals this board grew.
Serial is UART0 and goes to the serial monitor. delay() parks the core on a
SYSTIMER alarm rather than spinning, so an idle sketch costs the simulator
almost nothing.
Stock Arduino libraries
A tutorial that includes Servo.h, Wire.h, SPI.h, EEPROM.h,
LiquidCrystal_I2C.h, Adafruit_GFX.h with Adafruit_SSD1306.h,
Adafruit_NeoPixel.h, ESP32Servo.h and DHT.h compiles here as it stands.
Each is Mokxi's own header under the upstream name, written on the drivers for
the parts in the bin, and none of it is the upstream library's code.
Wire.begin()puts the I2C bus on GPIO23(SDA) and GPIO22(SCL);Wire.begin(sda, scl)moves it.EEPROM.hworks, but this board's model has no EEPROM or writable flash, so the bytes live in 4 KB of RAM: they read back within a Run and are gone at a reset.
The code editor and compiling lists what each one covers and how it differs from the upstream library.
Which board is this?
The ESP32-C6-DevKitC-1. Not the C6-DevKitM-1, not a bare module on a carrier of your own, and not the C6 Mini variants. The GPIO numbers are the chip's and would be the same, but the header order would not.