Jeg har vel et dusin forskjellige devkort basert på ESP32, men for denne sessionen skal jeg bruke et kort som ikke er selv-laget og som støttes av Espressif i Zephyr. Det gjør prosessen veldig mye enklere.

For å følge med så må du bruke Windows Subsystem for Linux (WSL2) med Ubuntu installert. Du kan også bruke Ubuntu direkte uten Windows, og jeg antar du klarer sortere ut hvilke deler du kan hoppe over.

Devkortet jeg kommer til å bruke heter ESP32-C6-DevKitC-1 som har en ESP32-C6-WROOM modul på seg i tillegg til en RGB LED. Du får helt sikkert dette til med et annet devkort også!

Oppdater Ubuntu

Du må holde systemet oppdatert, og gamle pakker kan skape trøbbel under installering av ting, så for din egen del kjør kommandoen sudo apt update ; sudo apt upgrade før du går videre.

Installere nødvendige pakker

Dette er strengt tatt ikke nødvendig, men vi legger til Kitware sin repository for å få en nyere versjon av CMake.

1
2
wget https://apt.kitware.com/kitware-archive.sh
sudo bash kitware-archive.sh

Så bruker vi apt til å installere noen nødvendige pakker:

1
2
3
4
sudo apt install --no-install-recommends git cmake ninja-build gperf \
  ccache dfu-util device-tree-compiler wget \
  python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
  make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1

Installere Python pakker og hente Zephyr

Vi begynner med å lage et virtuelt Python miljø. Da slipper du at Python installasjonen din blir tukla til og vice versa. Først installerer vi venv pakken:

1
sudo apt install python3-venv

Så lager vi et virtuelt miljø:

1
python3 -m venv ~/zephyrproject/.venv

Deretter aktiverer vi miljøet, og dette vil du gjøre hver gang før du bruker Zephyr:

1
source ~/zephyrproject/.venv/bin/activate

Nå skal vi installere west som er Zephyr sitt verktøy for “alt”:

1
pip install west

Nå begynner vi å sette opp et workspace:

1
2
3
west init ~/zephyrproject
cd ~/zephyrproject
west update

Vi er godt i gang nå. Vi fortsetter med å eksportere en Zephyr CMake pakke, som gjør det mulig for CMake å finne sakene du trenger for å bygge Zephyr applikasjonene dine:

1
west zephyr-export

Og til slutt installerer vi Python pakker som Zephyr krever med kommandoen:

1
west packages pip --install

Installere Zephyr SDK

Trodde vel ikke vi var ferdige alt? Nå skal vi hente SDK pakken, og den legger vi i mappen ~/zephyrproject/zephyr med disse kommandoene:

1
2
cd ~/zephyrproject/zephyr
west sdk install

Greia her er at Zephyr inkluderer bare host tools til Linux, og ikke til Windows. Så med å da bruke WSL2 så slipper vi mange andre skritt, og mindre stress. Vi liker mindre stress.

Så langt er installeringen helt generisk for Zephyr, og det vil være samme opplegget for de fleste andre supporterte mikrokontrollere.

Installere binærtillegg fra Espressif

Espressif har prekompilerte binærfiler som vi må linke mot for å bruke ESP32. Disse inneholder sikkert skumle ting som må holdes hemmelig (?) siden Espressif ikke publiserer dem. Uansett, skriv disse kommandoene:

1
2
cd ~/zephyrproject
west blobs fetch hal_espressif

Klapp deg selv på skulderen. Forhåpentligvis har du klar å klippe og lime alle kommandoene korrekt, og er derfor halvveis på reisen. En Martini med en grønn oliven er ikke feil nå - og ikke glem shaker med is og så strainer du av isen. Splendid.

Bygge Hello World

Hva passer bedre nå enn å kjøre en klassisk Hello World? Nei nettopp. Vi kopierer sample koden:

1
cp zephyr/samples/hello_world . -R

Går inn i hello_world mappa:

1
cd hello_world

Bygger koden:

1
west build -p always -b esp32c6_devkitc/esp32c6 --pristine

Se etter teksten Successfully created esp32c6 image.. Gratulerer, du har et image til mikrokontrolleren din.

Men det gjør ingen nytte på PCen din, så la oss flashe det til devkortet. Enkelt med west:

1
west flash

What? A fatal error occurred: Could not connect to an Espressif device on any of the 0 available serial ports. my a$$. Så så, det er ikke så ille som meldingen sier, men dersom du får denne meldingen så har vi noen skritt til som må gjøres.

Saken er den at Windows har oppdaget kortet ditt og lastet drivere i Windows for dette. Så det som må gjøres er å redirigere disse til WSL2, og for å gjøre dette enkelt så bruker vi noen ekstra programmer.

Først trenger vi usbipd-win som kan installeres med kommandoen:

1
winget install usbipd

Det neste er et QoL tillegg da et GUI gjemmer bort avanserte ting for oss, og det kan du laste ned og installere herfra: alelec / wsl-usb-gui

Nå skal du finne kortet ditt i listen, og rett og slett høyreklikke og velge Attach to WSL.

La oss teste flashing igjen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
west flash

-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner esp32
-- runners.esp32: reset after flashing requested
-- runners.esp32: Flashing esp32 chip on None (921600bps)
esptool.py v4.7.0
Found 1 serial ports
Serial port /dev/ttyACM0
Connecting....
Detecting chip type... ESP32-C6
Chip is ESP32-C6 (QFN40) (revision v0.0)
Features: WiFi 6, BT 5, IEEE802.15.4
Crystal is 40MHz
MAC: 40:4c:ca:ff:fe:40:35:54
BASE MAC: 40:4c:ca:40:35:54
MAC_EXT: ff:fe
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 8MB
Flash will be erased from 0x00000000 to 0x00023fff...
Wrote 147456 bytes at 0x00000000 in 0.7 seconds (1654.0 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Qapla’! eller den satt i sikringsboksen… Vi flasha kortet! La oss sjekke med monitor:

1
west espressif monitor

Å-ja-da! Dette ser lovende ut!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP32-C6
--- idf_monitor on /dev/ttyUSB0 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ESP-ROM:esp32c6-20220919
Build:Sep 19 2022
rst:0x1 (POWERON),boot:0xc (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:2
load:0x40800000,len:0x8c34
0x40800000: _esp32c6_vector_table at ??:?

load:0x40808c50,len:0x1904
0x40808c50: ?? at /home/grumpy/zephyrproject/modules/hal/espressif/components/esp_hw_support/sleep_modes.c:234

SHA-256 comparison failed:
Calculated: 66f6a7cf15e7340d1ae336ea219c24dab8943f5691d87767296cb5737dc3a183
Expected: 00000000805a0000000000000000000000000000000000000000000000000000
Attempting to boot anyway...
entry 0x40801b42
I (47) soc_init: ESP Simple boot
0x40801b42: __start at /home/grumpy/zephyrproject/zephyr/soc/espressif/common/loader.c:247

I (47) soc_init: compile time Jan  9 2025 22:02:21
I (48) spi_flash: detected chip: gd
I (48) spi_flash: flash io: dio
W (49) spi_flash: Detected size(8192k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (62) soc_init: chip revision: v0.0
I (65) flash_init: SPI Speed      : 80MHz
I (68) flash_init: SPI Mode       : DIO
I (72) flash_init: SPI Flash Size : 8MB
I (76) soc_random: Enabling RNG early entropy source
I (80) boot: DRAM: lma 0x00000020 vma 0x40800000 len 0x8c34   (35892)
0x40800000: _esp32c6_vector_table at ??:?

I (86) boot: DRAM: lma 0x00008c5c vma 0x40808c50 len 0x1904   (6404)
0x40808c50: ?? at /home/grumpy/zephyrproject/modules/hal/espressif/components/esp_hw_support/sleep_modes.c:234

I (93) boot: padd: lma 0x0000a578 vma 0x00000000 len 0x5a80   (23168)
I (99) boot: IMAP: lma 0x00010000 vma 0x42800000 len 0x94c    (2380)
0x42800000: _image_drom_vaddr at ??:?

I (105) boot: padd: lma 0x00010954 vma 0x00000000 len 0xf6a4   (63140)
I (111) boot: IMAP: lma 0x00020000 vma 0x42000000 len 0x34e0   (13536)
0x42000000: _OffsetAbsSyms at /home/grumpy/zephyrproject/zephyr/arch/riscv/core/offsets/offsets.c:144

I (117) boot: Image with 6 segments
I (121) boot: DROM segment: paddr=00010000h, vaddr=42800000h, size=00950h (  2384) map
I (128) boot: IROM segment: paddr=00020000h, vaddr=42000000h, size=034E0h ( 13536) map
I (147) soc_random: Disabling RNG early entropy source
I (147) boot: Jumping to the main image...
I (178) heap_runtime: ESP heap runtime init at 0x4080cb80 size 446 kB.
*** Booting Zephyr OS build v4.0.0-3113-g5aeda6fe7dfa ***
Hello World! esp32c6_devkitc/esp32c6

Da er du klar til å utvikle spennende løsninger i Zephyr, og gjøre koden din litt mindre avhengig av hvilken mikrokontroller du har. Den store fordelen med Zephyr er jo nettopp at samme kodebase brukes mot mange mikrokontrollere og det er minimalt, om noe, behov for spesialkode.

G’luck mate!