wled custom builds
WLED modifications for sp530e hardware Controllers with ESP32-C3 chips
0
Project description
WLED Custom Builds β W5500 Ethernet for LED Controllers: A Field Study in TOE vs. MACRAW
#W5500 #WIZnet #TOE #MACRAW #ESP32S3 #WLED #OTA #DDP #E131 #ArtNet #PoE #SPI
π Context: Independent open-source maintainer project β a build-and-release pipeline for custom WLED firmware targets, with the Waveshare ESP32-S3-ETH (W5500) as its most technically documented line. β Verification status: Hardware-validated on two physical Waveshare ESP32-S3-ETH boards. Ethernet/PoE link-up, Wi-Fi, DDP over both transports, the web UI over both transports, and runtime LED bus reconfiguration are all confirmed passing on the recommended v17 line. MQTT is explicitly listed as not yet tested, and OTA β while described by the maintainer as working automatically over Ethernet β is not itemized in that validation list. The superseded v16 line is documented with an equally rigorous negative result.
01 β What is this project?

π· First, some background: what WLED is, and why it works differently from ordinary firmware
Most embedded firmware is written for one product. You define the behavior, compile it, flash it, and that binary belongs to that device. WLED does not work that way, and understanding why is the key to understanding this repository.
WLED is an open-source firmware for controlling addressable LED strips β WS2812-family strips where every individual pixel has its own color, as opposed to a normal LED strip where the whole run is one color. You flash WLED onto an ESP32, connect a strip to a data pin, and the board joins your network and serves a web interface.
The crucial part: the behavior is not compiled in. WLED ships with a large built-in library of lighting effects β rainbow sweeps, fire flicker, music-reactive patterns, solid colors β and the user picks them from the web UI at runtime. Even the hardware wiring is configured through that same web UI: which GPIO carries the LED data, how many pixels are on it, which chipset they are. Those values are stored as JSON in flash and read at boot.
This means one binary serves an unlimited number of different wiring setups. The only thing that genuinely requires a different binary is a different MCU family β an ESP32, an ESP32-S3, and an ESP32-C3 produce incompatible machine code β which is why WLED's official releases are published per-MCU rather than per-board. A user downloads the one matching their chip and configures the rest by clicking.
For large installations, WLED also accepts live pixel data from professional lighting software over the network, using the protocols that industry already runs on: DDP, E1.31 (sACN), and Art-Net. A PC running sequencing software such as xLights streams frames continuously, and the controller becomes a rendering endpoint rather than an autonomous device.
π· Where that model breaks β and why this repository exists
The web UI can only expose features that exist in the compiled binary. If the code for something isn't there, no amount of configuration will summon it.
The Waveshare ESP32-S3-ETH board carries a WIZnet W5500 Ethernet controller on SPI. WLED's upstream Ethernet support was built exclusively around RMII PHYs attached to the ESP32's internal EMAC β a peripheral the ESP32-S3 does not physically contain. On an S3, WLED's stock Ethernet board table doesn't merely fail to list this board; the build refuses to compile at all.
wled-custom-builds exists to close exactly that kind of gap. Concretely, it does three things:
β It carries board-specific source modifications, not configuration presets. Each supported board has a folder containing .patch files that surgically modify upstream WLED source β network.cpp and others β plus vendored copies of libraries the maintainer had to fix, a custom partition table .csv, and PlatformIO environment fragments defining pin assignments and flash behavior. The W5500 Ethernet support is newly written driver integration code, not a flag being switched on. Upstream WLED is refetched clean on every build and the overlay is applied on top, so the engine core stays current while the board work stays separate.
This board actually carries three build lines: v15 (WLED 0.15.x, preserved and frozen, no longer actively developed), v16 (WLED 16.0.1, W5500 hardware-socket Ethernet), and v17 (WLED main, native lwIP W5500 β the recommended line). This curation concerns v16 and v17, where the Ethernet architecture work lives.
β‘ It builds those targets and publishes finished binaries. GitHub Actions builds on pushes and PRs that touch targets/** or the workflow file itself β deliberately narrow triggers β and writes a dated log and build-metadata JSON for each run, and publishes to GitHub Releases β but only when the push commit message contains the token release; adding legacy marks it as a prerelease rather than latest. Most WLED users have no development environment and cannot build from source, so shipping ready-to-flash binaries is the entire point of the distribution side.
β’ It splits every release into two artifacts, specifically to make firmware updates survivable. This is the part that dominates the repository's own documentation, and it deserves an unambiguous explanation.
π· About OTA: what WLED already provides, and what this repository actually built
OTA (Over-The-Air update) is a stock WLED feature. This repository did not create it. In WLED, OTA works like this: you open the board's web UI, go to Settings β Security & Updates, and upload a firmware file from your PC. The board writes it into its spare application partition and reboots into the new image.
Why that matters so much here: these controllers get installed permanently β twelve meters up a faΓ§ade, inside a stage rig, behind a wall. Once commissioned, reaching one with a USB cable means a ladder and a service call. OTA is the difference between a five-minute update from a laptop and a site visit.
What this repository built around that feature is twofold.
First, the two-artifact release format. Every release publishes:
| Artifact | Delivery method | When to use it |
|---|---|---|
wled-<version>-<target>-<suffix>.app.bin | OTA β uploaded via the board's web UI | Updating a board that is currently running and reachable |
wled-<version>-<target>-<suffix>.full.bin | USB/UART β flashed with esptool | New board, unresponsive board, or after a partition layout change |
The .full.bin merges bootloader, partition table, and application into a single image β the bootloader is the small program that runs first and decides which application partition to boot; the partition table is the map telling it where everything lives. The build step that produces it fails loudly if any of the three inputs is missing, because a half-formed recovery image on a release page is worse than no image at all.
This split exists because OTA has failure modes with no software escape. A build whose partition layout differs from what's on the device cannot be delivered as an .app.bin. And a mismatched flash-mode header boot-loops inside ROM before any application code executes, producing no serial output whatsoever β recoverable only by erasing the chip over USB. The documented rule is one sentence: if OTA is rejected or the board won't boot afterward, flash the matching .full.bin over UART.
Second β and this is the part that makes the whole project a WIZnet story β the maintainer discovered that whether OTA can travel over Ethernet at all depends entirely on how the W5500 is integrated. Two build lines were produced for the same board. On one, OTA reaches the device only over Wi-Fi even though the Ethernet port has a working IP address. On the other, OTA arrives over Ethernet with no additional code. For a PoE-powered controller on a site with no usable Wi-Fi, that distinction decides whether the installation is remotely maintainable or not. Sections 03 and 04 explain the mechanism in full.
02 β Why Ethernet for LED control?
π· Realtime pixel protocols are unforgiving
DDP and E1.31 are UDP streams with no retransmission and hard deadlines. A frame that arrives late is worse than useless β the renderer has already moved on. Wi-Fi's retry and backoff behavior, which is exactly what makes it work for web browsing, is what destroys it for pixel streaming. Wired Ethernet's deterministic latency is the whole reason professional lighting runs on it.
π· Permanent installs need permanent links
An installation controller is often physically inaccessible after commissioning. Ethernet plus PoE gives you one cable carrying both power and data, with a link that stays up for years and can be diagnosed from the switch port.
π· The ESP32-S3 has no EMAC β so the PHY has to be on SPI
This is the constraint that makes the project a WIZnet story. The classic ESP32 could drive an RMII PHY like the LAN8720 directly. The S3 cannot. Any Ethernet on an S3 must arrive over SPI, and the SPI Ethernet options are effectively the ENC28J60, the W5500, and its WIZnet siblings.
π· Where the W5500 sits in the WIZnet lineup
(The chip-to-chip comparison in this subsection is general background, not a claim made by the repository β the maintainer never evaluated alternatives to the W5500, since the board ships with one.) The W5500 is the mainstream WIZnet choice for this class of design: 8 hardware sockets, a 32 KB internal TX/RX buffer, SPI up to 80 MHz, and 10/100 Ethernet. Against the ENC28J60 β the only other SPI Ethernet chip with comparable ecosystem support β the W5500 wins on every axis that matters here: the ENC28J60 is 10 Mbps only, has no hardwired TCP/IP stack whatsoever, and carries a well-known reputation for erratum-driven driver complexity. Within WIZnet's own range, the W6100 adds dual-stack IPv6 and the W6300 adds a QSPI host interface for higher throughput, while the W55RP20 fuses a W5500-class MAC/PHY with an RP2040 into a single package. For a board that already has an ESP32-S3 doing the compute, the W5500's plain SPI interface and mature driver ecosystem are exactly the right trade.
03 β System architecture

04 β Why WIZnet W5500? β
π· It is the only SPI Ethernet part that gives you a real architectural choice
This is the core of why the project is worth studying. Most Ethernet controllers offer exactly one integration model. The W5500 offers two, and this project is a rare instance of an engineer building both on the same hardware and publishing the measured outcome of each.
π· Mode 1 β TOE hardware sockets (the v16 line)
The v16 line uses the W5500 exactly as WIZnet designed it: as a self-contained hardware TCP/IP socket engine. The host talks to it through a vendored, minimally patched Ethernet_Generic library, opening sockets on the chip's own hardwired stack rather than on the ESP32's lwIP. The maintainer's own summary is that this is the W5500's actual differentiating hardware β the silicon socket engine β and that using it means real protocol offload, with the ESP32 CPU never touching TCP state machines, checksums, or retransmission timers.
Validated on hardware: chip detected over SPI (hardwareStatus=3), link detected (linkStatus=1), DHCP lease obtained, and Wi-Fi and Ethernet running simultaneously with distinct IP addresses shown side by side in the WLED info panel.
And a documented limitation, reproduced twice: none of WLED's application traffic actually traverses it. WLED's DDP, E1.31, web UI, and MQTT handlers all bind to AsyncTCP/AsyncUDP, which is hardwired to the ESP32's lwIP. The W5500's hardware socket API is a parallel, second network stack that nothing in WLED's protocol layer knows how to talk to. Sending DDP to the v16 firmware's Ethernet IP does not light the strip.
This is not a shortcoming of the W5500. It is a precise statement of what hardware TCP/IP offload requires from the application above it: the application must be written against the offload engine's socket API. WLED, an lwIP-native codebase with tens of thousands of lines of AsyncTCP-bound networking, is not. The maintainer scoped what it would take β replacing WLED's web/socket layer and its realtime protocol receivers with code built on the W5500's socket API β and correctly identified it as a standing fork of WLED's networking core rather than a target overlay.
π· Mode 2 β MACRAW under native lwIP (the v17 line)
The v17 line takes the other road. ESP-IDF 5.5.4 / arduino-esp32 Core 3.3.8 ships a first-class ETH_PHY_W5500 driver that runs the chip in MACRAW mode β raw Ethernet frames in and out, with lwIP on the ESP32 doing all protocol processing. The W5500 becomes, in effect, a very well-behaved SPI-attached MAC/PHY, indistinguishable from an RMII PHY as far as the rest of the system is concerned.
The payoff is total. Because it is a real lwIP netif, DDP, E1.31, Art-Net, MQTT, the web UI, and OTA all work over Ethernet automatically, with zero per-protocol glue code. The trade is equally clear: the hardwired TCP/IP engine sits idle and the ESP32 CPU carries the stack.
That trade-off β offload versus stack compatibility β is the fundamental W5500 integration decision, and this project is the clearest real-world articulation of it available in an open repository.
π· The release pipeline is built around OTA safety
The maintainer's build system treats the update path as a first-class deliverable rather than a byproduct. Every release publishes exactly two normalized artifacts per target:
wled-<version>-<target>-<suffix>.app.binβ the OTA image, pushed through WLED's Settings β Security & Updates β Manual OTA page onto a healthy running device.wled-<version>-<target>-<suffix>.full.binβ a merged bootloader + partition table + application image for first-time UART flashing and for recovery when OTA fails or the partition layout has changed.
The .full.bin is produced by an esptool.py merge_bin step that places the bootloader at offset 0x0 on the S3, the partition table at 0x8000, and the application at 0x10000 β and fails loudly if any of the three inputs is missing, so a half-formed recovery image can never reach a release page. That matters precisely because .full.bin is the artifact you reach for when a device is already in trouble.
The documented recovery rule is a single sentence, and it is the most useful sentence in the repository for a field technician: if OTA is rejected or the board won't boot afterward, flash the matching .full.bin over UART. Two failure modes make that rule load-bearing β a partition layout change that an .app.bin cannot survive, and the flash-mode header trap described below, which boot-loops in ROM with no serial output at all and is recoverable only by esptool.py erase_flash.
The v16 line also records honestly that repeated and long-term OTA behavior on its app partition layout remains untested, with the firmware occupying a comfortable fraction of the available app slot β the maintainer declines to claim what hasn't been exercised. (Partition sizing figures come from the v16 notes; confirm against the current .csv before relying on them for a specific build.)
π· Verified evidence β
The v17 line's validation list is specific and hardware-backed across two physical boards:
- Ethernet (LAN and PoE): pass
- Wi-Fi: pass
- xLights β DDP over Ethernet: pass
- xLights β DDP over Wi-Fi: pass
- Web UI over Ethernet: pass
- Web UI over Wi-Fi: pass
- Live LED bus reconfiguration at runtime β adding, removing, and reconfiguring buses with no reboot, including "skip first N LEDs" on both RMT- and I2S/LCD-driven buses, over both Ethernet and Wi-Fi: pass
MQTT is explicitly listed as not yet tested rather than quietly claimed. That honesty is worth as much as the passes.
05 β Key components
π WIZnet W5500 β used in both TOE and MACRAW modes across two build lines
- v16 line: hardwired TCP/IP socket engine (TOE), driven via a vendored, patched
Ethernet_Generic. Hardware-validated to link-up and DHCP; documented as not carrying WLED application traffic. - v17 line (recommended): MACRAW mode via ESP-IDF's
ETH_PHY_W5500, presented to the system as a native lwIP interface. All WLED traffic traverses it. - SPI pinout, identical on both lines:
MISO=12 MOSI=11 SCLK=13 CS=14 INT=10 RST=9, confirmed against the Waveshare pinout diagram. - The v17 patch adds reserved-pin reporting in
xml.cppand dual Wi-Fi + Ethernet IP display in the info panel (json.cpp/data/index.js), so the W5500's pins and link state surface in WLED's own UI rather than being invisible to it.
π§ Waveshare ESP32-S3-ETH
ESP32-S3 with 16 MB flash and 8 MB PSRAM, W5500 Ethernet with PoE. No internal EMAC β which is precisely why the W5500 is not a convenience here but a requirement.
π‘ 8 Γ WS281x LED buses
Driven by four RMT hardware channels plus four I2S/LCD-parallel channels, handled generically at runtime by WLED's bus manager. On the v17 line the data pins were deliberately reordered to 18,17,16,15,3,2,1,21, moving GPIO0 out of the set β it is an S3 strapping pin that shares the BOOT button β and substituting GPIO21, which is free and clear of the W5500's SPI pins, the SD card, and USB.
ποΈ Target-layered build system
targets/<target>/shared/ holds the canonical per-board source of truth; targets/<target>/v15|v16|v17/ holds only version deltas. scripts/build-target.sh reads a manifest, resolves a WLED base (local checkout first, upstream fetch as fallback), applies the target overlay, and builds. Every run writes a dated log, a metadata JSON, and a summary under logs/<target>/<version>/<YYYYMMDD>/, with a latest/ copy of the newest successful run.
π Token-gated CI release pipeline
GitHub Actions builds artifacts on every relevant push, but publishes a GitHub Release only when the commit message contains the token release β with release legacy publishing as a prerelease instead. Published firmware names are normalized to wled-<version>-<target>-<suffix>.app.bin for OTA and .full.bin for first-time UART flashing, the latter produced by an esptool.py merge_bin step that combines bootloader, partition table, and application into one image and fails loudly if any input is missing.
β οΈ A flash-mode trap worth documenting
The board's flash requires DIO, but the esp32s3 core ships no DIO bootloader ELF β so board_build.flash_mode must be qio (which bootloader PlatformIO links) while custom_merge_flash_mode must be dio (what the ROM actually honors at boot). Get this wrong and the board boot-loops in ROM before any application code runs, with no serial output at all, recoverable only by esptool.py erase_flash. This is the kind of hard-won detail that saves the next person a weekend.
06 β Application scenarios
01. Permanent architectural and holiday lighting installations
An xLights sequence driving thousands of pixels at high frame rates over DDP, on a controller that is wall-mounted, PoE-powered, and physically unreachable. The v17 line is exactly this product: one cable, deterministic latency, hardware-validated DDP over Ethernet.
02. Stage, venue, and event lighting
E1.31 (sACN) and Art-Net are the native languages of theatrical lighting control. A venue with hundreds of audience phones saturating the 2.4 GHz band is the worst possible environment for Wi-Fi pixel streaming and the best possible argument for a W5500 uplink.
03. A reference design for W5500 integration decisions
Any engineer facing "should I use the W5500's hardware TCP/IP stack or run it as a MACRAW PHY?" now has a documented, hardware-validated answer for both branches, including the specific conditions under which each wins. The short version: TOE when you control the application layer, MACRAW when you are integrating into an existing lwIP-native stack.
04. Remote fleet maintenance over a single PoE run
A venue with twenty controllers behind one managed switch. Because the v17 line carries OTA over Ethernet, the entire fleet updates from a laptop on the same network β no Wi-Fi credentials to provision, no per-device ladder trip, and a link that can be diagnosed from the switch port when a unit stops answering. The .app.bin / .full.bin split gives the technician a deterministic recovery story for the one device in twenty that doesn't take the update cleanly.
05. A template for maintaining board-specific firmware forks
The target/version overlay model, the manifest fallback chain, the token-gated release workflow, and the patch-drift checker (scripts/check-target-patches.sh) together form a reusable pattern for anyone maintaining custom builds of a fast-moving upstream β which is a large fraction of the embedded open-source world.
Conclusion
This project turned "does the W5500 work with WLED?" into something far more useful: a hardware-validated, side-by-side account of what the W5500's two integration modes actually deliver in a real application β and it did so honestly enough to publish the negative result.
- β Brought W5500 Ethernet up on an ESP32-S3, a chip with no internal EMAC, where WLED's stock RMII-only Ethernet table refuses to compile
- β Built and hardware-validated both W5500 integration models β TOE hardware sockets (v16) and MACRAW under native lwIP (v17) β on the same board
- β Documented, with reproduced evidence, exactly why TOE offload cannot carry an lwIP-native application's traffic without rewriting its networking core
- β Delivered a v17 line where DDP, E1.31, and the web UI are hardware-validated over Ethernet on two physical boards, with OTA and MQTT following the same lwIP path by construction
- β Surfaced the deployment-critical consequence that OTA follows whichever stack the application binds to β making Ethernet-borne firmware updates possible only on the lwIP line, and turning an architecture choice into a maintainability decision
- β Root-caused and fixed four real defects, three of them upstream bugs affecting all ESP32-S3 users regardless of Ethernet
- β
Documented a ROM-level flash-mode trap (
qiobootloader header vs.diomerge header) that otherwise presents as an unrecoverable boot loop - β Surfaced the W5500 in WLED's own UI β reserved-pin reporting plus simultaneous Wi-Fi and Ethernet IP display in the info panel
- β
Built a reproducible target/version overlay pipeline with dated logs, build metadata, token-gated releases, and normalized
.app.bin/.full.binartifacts - β Stated openly what is not tested (MQTT, hot-plug detection, long-term OTA on the 3 MB layout) rather than overclaiming
Q&A
Q. Does the v17 line waste the W5500's hardware TCP/IP engine? In the strict sense, yes β MACRAW mode bypasses the hardwired stack and the ESP32 processes protocols in software. But the W5500 is still doing the work that matters for this application: it is the MAC/PHY that makes wired Ethernet possible at all on a chip with no EMAC, over a simple SPI bus, with a mature driver in ESP-IDF. The 32 KB internal buffer still absorbs bursts, and the chip still handles all the L1/L2 work. For an application whose entire networking layer is lwIP-bound, that is the correct engineering trade.
Q. When should I use the W5500's TOE mode instead? When you own the application layer. Greenfield firmware β an industrial Modbus TCP gateway, a data logger, a purpose-built HTTP or MQTT device β written directly against the W5500's socket API gets the full benefit: no software TCP/IP stack in flash, no CPU cycles spent on checksums and retransmission, and deterministic socket behavior. The v16 line's finding is not "TOE is worse"; it is "TOE requires that your application be written to it," which is a statement about WLED, not about the W5500.
Q. Why not use the ENC28J60, the other common SPI Ethernet option? Worth noting up front that the repository never poses this question β the board arrives with a W5500 soldered on, so no selection took place. As general background: the ENC28J60 is 10 Mbps only, it has no hardwired TCP/IP stack at all so the TOE option does not exist, and its driver ecosystem carries a long history of erratum workarounds. The W5500 is 10/100, has 8 hardware sockets and 32 KB of buffer, runs SPI up to 80 MHz, and has first-class driver support in ESP-IDF via ETH_PHY_W5500 β which is exactly what made the v17 line possible.
Q. Which build should I actually flash? The v17 line, unless you specifically want to study the hardware-socket approach. Use .app.bin for OTA onto a healthy existing install, and .full.bin over UART for a new board, a bricked board, or after a partition layout change.
Q. Can I update firmware over Ethernet? On the v17 line, per the maintainer's own description β though note that OTA is not itemized in that line's hardware-validation list, so treat it as architecturally sound rather than separately measured. WLED's OTA endpoint lives on lwIP/AsyncTCP along with everything else, so it reaches the device over whichever interface lwIP owns. On v17 the W5500 is an lwIP interface, so Ethernet OTA works with no extra code. On v16 the W5500 runs a separate hardware-socket stack that OTA has no path into β the Ethernet port has an IP you cannot push firmware to, and updates must go over Wi-Fi. If a deployment has no usable Wi-Fi, that difference is the difference between a remote update and a service call.
Q. What happens if an OTA update fails? Flash the matching .full.bin over UART β it carries bootloader, partition table, and application in one image, so it recovers a device regardless of what state the failed update left it in. Two situations make this necessary rather than optional: a build whose partition layout differs from what's on the device (an .app.bin alone cannot fix that), and a flash-mode header mismatch, which boot-loops inside ROM before any application code runs and produces no serial output at all. Keep a UART adapter on site for any installation you cannot afford to lose.
Q. Could a future WIZnet part change this trade-off? Plausibly. The W6300's QSPI host interface raises the SPI-side ceiling considerably, and the W55RP20 collapses the MCU and the W5500-class MAC/PHY into one package β a combination that is attractive precisely for greenfield controller designs where TOE mode is the natural choice from day one.
WLED Custom Builds β LED 컨νΈλ‘€λ¬λ₯Ό μν W5500 μ΄λλ·: TOEμ MACRAWλ₯Ό μ€μΈ‘μΌλ‘ λΉκ΅νλ€
#W5500 #WIZnet #TOE #MACRAW #ESP32S3 #WLED #OTA #DDP #E131 #ArtNet #PoE #SPI
π λ°°κ²½: μ€νμμ€ λ©μΈν μ΄λκ° λ¨λ μΌλ‘ μ΄μνλ νλ‘μ νΈ. 컀μ€ν WLED νμ¨μ΄ νκ²μ λΉλΒ·λ°°ν¬νλ νμ΄νλΌμΈμ΄λ©°, κ·Έμ€ Waveshare ESP32-S3-ETH(W5500) λΌμΈμ΄ κΈ°μ μ μΌλ‘ κ°μ₯ κΉκ² λ¬Έμνλμ΄ μλ€. β κ²μ¦ μν: μ€λ¬Ό Waveshare ESP32-S3-ETH 보λ 2λμμ νλμ¨μ΄ κ²μ¦ μλ£. κΆμ₯ λΌμΈμΈ v17μμ μ΄λλ·/PoE λ§ν¬μ , Wi-Fi, μμͺ½ μ μ‘ κ²½λ‘μ DDP, μμͺ½ μ μ‘ κ²½λ‘μ μΉ UI, λ°νμ LED λ²μ€ μ¬κ΅¬μ±κΉμ§ λͺ¨λ pass. MQTTλ λ―Έκ²μ¦μΌλ‘ λͺ μλμ΄ μμΌλ©°, OTAλ λ©μΈν μ΄λκ° μ΄λλ·μΌλ‘ μλ λμνλ€κ³ μμ νμΌλ κ²μ¦ λͺ©λ‘μλ νλͺ©μΌλ‘ μ¬λΌμ μμ§ μλ€. λ체λ v16 λΌμΈμ λμΌν μμ€μ μλ°ν¨μΌλ‘ λΆμ κ²°κ³Ό(negative result) κΉμ§ κΈ°λ‘λμ΄ μλ€.
01 β μ΄ νλ‘μ νΈλ 무μμΈκ°?

π· λ¨Όμ λ°°κ²½λΆν°: WLEDκ° λ¬΄μμ΄κ³ , μ μΌλ°μ μΈ νμ¨μ΄μ λ€λ₯΄κ² λμνλκ°
λλΆλΆμ μλ² λλ νμ¨μ΄λ νλμ μ νμ μν΄ μμ±λλ€. κ°λ°μκ° λμμ μ μνκ³ , μ»΄νμΌνκ³ , νλμ±νλ©΄, κ·Έ λ°μ΄λ리λ κ·Έ κΈ°κΈ°μ κ²μ΄λ€. WLEDλ κ·Έλ κ² λμνμ§ μμΌλ©°, κ·Έ μ΄μ λ₯Ό μ΄ν΄νλ κ²μ΄ μ΄ μ μ₯μλ₯Ό μ΄ν΄νλ μ΄μ λ€.
WLEDλ μ΄λλ μλΈ LED μ€νΈλ¦½μ μ μ΄νλ μ€νμμ€ νμ¨μ΄λ€. μ΄λλ μλΈμ΄λ WS2812 κ³μ΄μ²λΌ ν½μ νλνλκ° κ°μμ μμ κ°λ λ°©μμ λ§νλ€. μ€νΈλ¦½ μ μ²΄κ° ν κ°μ§ μμΌλ‘λ§ μΌμ§λ μΌλ° LED μ€νΈλ¦½κ³Ό λ€λ₯΄λ€. ESP32μ WLEDλ₯Ό κ΅½κ³ , λ°μ΄ν° νμ μ€νΈλ¦½μ μ°κ²°νλ©΄, 보λκ° λ€νΈμν¬μ μ μν΄ μΉ μΈν°νμ΄μ€λ₯Ό λμ΄λ€.
μ¬κΈ°μ κ²°μ μ μΈ λΆλΆμ μ μ μΈ λμμ΄ μ»΄νμΌ λμ΄ λ€μ΄κ°μ§ μλλ€λ μ μ΄λ€. WLEDμλ λ°©λν μ‘°λͺ μ΄ννΈ λΌμ΄λΈλ¬λ¦¬κ° λ΄μ₯λμ΄ μλ€ β 무μ§κ° νλ¦, λΆκ½ μΌλ μ, μμ λ°μ ν¨ν΄, λ¨μ λ± β κ·Έλ¦¬κ³ μ¬μ©μλ μ΄κ²μ μ€ν μ€μ μΉ UIμμ κ³¨λΌ μ΄λ€. μ¬μ§μ΄ νλμ¨μ΄ λ°°μ μ 보쑰차 κ°μ μΉ UIμμ μ€μ νλ€. LED λ°μ΄ν°λ₯Ό μ΄λ GPIOλ‘ λ΄λ³΄λΌμ§, ν½μ μ΄ λͺ κ° λ¬λ Έλμ§, μ΄λ€ μΉ©μ μΈμ§. μ΄ κ°λ€μ JSONμΌλ‘ νλμμ μ μ₯λκ³ λΆν μ μ½νλ€.
μ¦ λ°μ΄λ리 νλκ° λ¬΄νν λ§μ μλ‘ λ€λ₯Έ λ°°μ ꡬμ±μ κ°λΉνλ€. μ λ§λ‘ λ€λ₯Έ λ°μ΄λλ¦¬κ° νμν κ²½μ°λ MCU κ³μ΄μ΄ λ€λ₯Ό λλΏμ΄λ€ β ESP32, ESP32-S3, ESP32-C3λ μλ‘ νΈνλμ§ μλ κΈ°κ³μ΄λ₯Ό λ§λ λ€ β κ·Έλμ WLED 곡μ 릴리μ€λ 보λλ³μ΄ μλλΌ MCUλ³λ‘ λ°νλλ€. μ¬μ©μλ μκΈ° μΉ©μ λ§λ κ² νλλ₯Ό λ°μμ, λλ¨Έμ§λ ν΄λ¦μΌλ‘ μ€μ νλ€.
λν μ€μΉλ¬Όμ μν΄ WLEDλ λ€νΈμν¬λ‘ λ€μ΄μ€λ μ€μκ° ν½μ λ°μ΄ν°λ λ°λλ€. μ κ³κ° μ΄λ―Έ μ°κ³ μλ νλ‘ν μ½ κ·Έλλ‘λ€ β DDP, E1.31(sACN), Art-Net. PCμμ xLights κ°μ μνμ± μννΈμ¨μ΄κ° νλ μμ μ°μμΌλ‘ μλ©΄, 컨νΈλ‘€λ¬λ μμ¨μ μΌλ‘ λμνλ κΈ°κΈ°κ° μλλΌ λ λλ§ μ’ λ¨μ μ΄ λλ€.
π· μ΄ λͺ¨λΈμ΄ κΉ¨μ§λ μ§μ β κ·Έλ¦¬κ³ μ΄ μ μ₯μκ° μ‘΄μ¬νλ μ΄μ
μΉ UIλ μ»΄νμΌλ λ°μ΄λ리 μμ μ‘΄μ¬νλ κΈ°λ₯λ§ λ ΈμΆν μ μλ€. μ½λμ μλ κ²μ μ무리 μ€μ μ λ€μ Έλ λνλμ§ μλλ€.
Waveshare ESP32-S3-ETH 보λμλ SPIλ‘ μ°κ²°λ WIZnet W5500 μ΄λλ· μ»¨νΈλ‘€λ¬κ° λ¬λ € μλ€. κ·Έλ°λ° WLED μ μ€νΈλ¦Όμ μ΄λλ· μ§μμ μ€μ§ ESP32 λ΄μ₯ EMACμ λΆλ RMII PHYλ§μ μ μ λ‘ μ€κ³λμ΄ μλ€. EMACμ ESP32-S3μ 물리μ μΌλ‘ μ‘΄μ¬νμ§ μλ ν리νλ΄μ΄λ€. S3μμ WLED κΈ°λ³Έ μ΄λλ· λ³΄λ ν μ΄λΈμ μ΄ λ³΄λλ₯Ό λͺ©λ‘μ μλ μ λκ° μλλΌ, λΉλ μμ²΄κ° μ»΄νμΌμ κ±°λΆνλ€.
wled-custom-buildsλ μ νν μ΄λ° μ’ λ₯μ 곡백μ λ©μ°κΈ° μν΄ μ‘΄μ¬νλ€. ꡬ체μ μΌλ‘ μΈ κ°μ§ μΌμ νλ€.
β μ€μ ν리μ
μ΄ μλλΌ, 보λλ³ μμ€ μμ λ³Έμ λ΄κ³ μλ€. μ§μνλ 보λλ§λ€ ν΄λκ° μκ³ , κ·Έ μμλ μ
μ€νΈλ¦Ό WLED μμ€λ₯Ό μ§μ μμ νλ .patch νμΌλ€μ΄ λ€μ΄ μλ€ β network.cpp λ±. μ¬κΈ°μ λν΄ λ©μΈν
μ΄λκ° μ§μ κ³ μ³μΌ νλ λΌμ΄λΈλ¬λ¦¬μ λ²€λλ§ μ¬λ³Έ, 컀μ€ν
νν°μ
ν
μ΄λΈ .csv, ν λ°°μΉμ νλμ λμμ μ μνλ PlatformIO νκ²½ μ‘°κ°μ΄ ν¨κ» λ€μ΄ μλ€. W5500 μ΄λλ· μ§μμ μλ‘ μμ±λ λλΌμ΄λ² ν΅ν© μ½λμ΄μ§, μλ μ΅μ
μ μΌ κ²μ΄ μλλ€. μ
μ€νΈλ¦Ό WLEDλ λΉλν λλ§λ€ κΉ¨λνκ² μλ‘ λ°μμ€κ³ κ·Έ μμ μ€λ²λ μ΄λ₯Ό μΉλ ꡬ쑰λΌ, μμ§ μ½μ΄λ νμ μ΅μ μ΄λ©΄μ 보λ μμ
μ λΆλ¦¬λ μ±λ‘ μ μ§λλ€.
μ΄ λ³΄λλ μ€μ λ‘ μΈ κ°μ λΉλ λΌμΈμ κ°κ³ μλ€. v15(WLED 0.15.x, 보쑴·λκ²° μνλ‘ λ μ΄μ κ°λ°λμ§ μμ), v16(WLED 16.0.1, W5500 νλμ¨μ΄ μμΌ μ΄λλ·), v17(WLED main, λ€μ΄ν°λΈ lwIP W5500 β κΆμ₯ λΌμΈ). μ΄ νλ μ΄μ
μ΄ λ€λ£¨λ κ²μ μ΄λλ· μν€ν
μ² μμ
μ΄ λ΄κΈ΄ v16κ³Ό v17μ΄λ€.
β‘ κ·Έ νκ²λ€μ λΉλν΄μ μμ±λ λ°μ΄λ리λ₯Ό λ°°ν¬νλ€. GitHub Actionsλ targets/** λλ μν¬νλ‘ νμΌ μ체λ₯Ό 건λ리λ νΈμΒ·PRμμλ§ λΉλνλ€. νΈλ¦¬κ±°λ₯Ό μλμ μΌλ‘ μ’κ² μ‘μ κ²μ΄λ€. μ€νλ§λ€ λ μ§λ³ λ‘κ·Έμ λΉλ λ©νλ°μ΄ν° JSONμ λ¨κΈ°λ©°, GitHub Releasesμ λ°ννλ€ β λ¨, νΈμ μ»€λ° λ©μμ§μ releaseλΌλ ν ν°μ΄ μμ λλ§. μ¬κΈ°μ legacyλ₯Ό λ§λΆμ΄λ©΄ μ΅μ μ΄ μλ ν리릴리μ€λ‘ νμλλ€. WLED μ¬μ©μ λλΆλΆμ κ°λ° νκ²½μ΄ μμ΄μ μμ€μμ λΉλν μ μλ€. κ·Έλμ λ°λ‘ κ΅¬μΈ μ μλ λ°μ΄λ리λ₯Ό μ 곡νλ κ²μ΄ λ°°ν¬ μΈ‘λ©΄μ μ‘΄μ¬ μ΄μ μ λΆλ€.
β’ λͺ¨λ 릴리μ€λ₯Ό λ κ°μ μ°μΆλ¬Όλ‘ λλλ€. νμ¨μ΄ μ λ°μ΄νΈκ° μ€ν¨ν΄λ μ΄μλ¨μ μ μκ² νκΈ° μν΄μλ€. μ΄ λΆλΆμ΄ μ μ₯μ μ체 λ¬Έμμ λλΆλΆμ μ°¨μ§νλ©°, λͺ νν μ€λͺ μ΄ νμνλ€.
π· OTAμ λνμ¬: 무μμ΄ μλ WLEDμ κ²μ΄κ³ , μ΄ μ μ₯μκ° μ€μ λ‘ λ§λ κ²μ 무μμΈκ°
OTA(무μ νμ¨μ΄ μ λ°μ΄νΈ)λ WLEDμ μλ μλ κΈ°λ³Έ κΈ°λ₯μ΄λ€.WLEDμμ OTAλ μ΄λ κ² λμνλ€. 보λμ μΉ UIλ₯Ό μ΄κ³ , μ€μ β Security & Updatesλ‘ λ€μ΄κ°μ, λ΄ PCμ μλ νμ¨μ΄ νμΌμ μ λ‘λνλ€. 보λλ κ·Έκ²μ μ¬λΆμ μ ν리μΌμ΄μ νν°μ μ κΈ°λ‘νκ³ μ μ΄λ―Έμ§λ‘ μ¬λΆν νλ€.
μ΄κ²μ΄ μ¬κΈ°μ κ·Έν λ‘ μ€μν μ΄μ λ μ€μΉ νκ²½ λλ¬Έμ΄λ€. μ΄λ° 컨νΈλ‘€λ¬λ€μ μꡬ μ€μΉλλ€ β νμ¬λ 12λ―Έν° λμ΄, 무λ 리그 λ΄λΆ, λ²½ λ€. μκ³΅μ΄ λλ λ€ USB μΌμ΄λΈμ κ½μΌλ €λ©΄ μ¬λ€λ¦¬μ μΆμ₯μ΄ νμνλ€. OTAλ λ ΈνΈλΆμμ 5λΆ λ§μ λλλλ, νμ₯μ μ¬λμ΄ λκ°λλμ μ°¨μ΄λ€.
μ΄ μ μ₯μκ° κ·Έ κΈ°λ₯μ λλ¬μΈκ³ λ§λ κ²μ λ κ°μ§λ€.
첫째, λ κ°μ μ°μΆλ¬Όλ‘ λλ λ¦΄λ¦¬μ€ νμ. λͺ¨λ 릴리μ€λ λ€μμ λ°ννλ€.
| μ°μΆλ¬Ό | μ λ¬ λ°©μ | μΈμ μ°λκ° |
|---|---|---|
wled-<version>-<target>-<suffix>.app.bin | OTA β 보λ μΉ UIλ‘ μ λ‘λ | μ§κΈ μ μ λμ μ€μ΄κ³ μ μ κ°λ₯ν 보λλ₯Ό μ λ°μ΄νΈν λ |
wled-<version>-<target>-<suffix>.full.bin | USB/UART β esptoolλ‘ νλμ± | μ 보λ, μλ΅ μλ 보λ, λλ νν°μ λ μ΄μμμ΄ λ°λ λ€ |
.full.binμ λΆνΈλ‘λ, νν°μ
ν
μ΄λΈ, μ ν리μΌμ΄μ
μ νλμ μ΄λ―Έμ§λ‘ ν©μΉ κ²μ΄λ€. λΆνΈλ‘λλ μ μμ΄ λ€μ΄μ€λ©΄ κ°μ₯ λ¨Όμ μ€νλμ΄ μ΄λ μ ν리μΌμ΄μ
νν°μ
μΌλ‘ λΆν
ν μ§ κ²°μ νλ μμ νλ‘κ·Έλ¨μ΄κ³ , νν°μ
ν
μ΄λΈμ νλμ μ΄λμ 무μμ΄ μλμ§ μλ €μ£Όλ μ§λλ€. μ΄κ²μ λ§λλ λΉλ λ¨κ³λ μΈ μ
λ ₯ μ€ νλλΌλ μμΌλ©΄ μλνκ² μ€ν¨νλ€. λ¦΄λ¦¬μ€ νμ΄μ§μ λ λ§λ€μ΄μ§ 볡ꡬ μ΄λ―Έμ§κ° μ¬λΌκ°λ κ²μ μμ μ΄λ―Έμ§κ° μλ κ²λ³΄λ€ λμκΈ° λλ¬Έμ΄λ€.
μ΄ λΆλ¦¬κ° μ‘΄μ¬νλ μ΄μ λ, OTAμ μννΈμ¨μ΄μ μΌλ‘ λΉ μ Έλκ° μ μλ μ€ν¨ λͺ¨λκ° μμ΄μλ€. νν°μ
λ μ΄μμμ΄ κΈ°κΈ°μ μ¬λΌκ° κ²κ³Ό λ€λ₯Έ λΉλλ .app.binμΌλ‘ μ λ¬ν μ μλ€. κ·Έλ¦¬κ³ νλμ λͺ¨λ ν€λκ° μ΄κΈλλ©΄ μ ν리μΌμ΄μ
μ½λκ° ν μ€λ μ€νλκΈ° μ μ ROM λ΄λΆμμ λΆνΈλ£¨νμ λΉ μ§λ©°, μλ¦¬μΌ μΆλ ₯μ΄ μ ν λμ€μ§ μλλ€ β USBλ‘ μΉ©μ μ§μ°λ κ² λ§κ³ λ 볡ꡬ λ°©λ²μ΄ μλ€. λ¬Έμνλ κ·μΉμ ν λ¬Έμ₯μ΄λ€. OTAκ° κ±°λΆλκ±°λ μ΄ν λΆν
μ΄ μ λλ©΄, λμλλ .full.binμ UARTλ‘ νλμ±νλΌ.
02 β μ LED μ μ΄μ μ΄λλ·μΈκ°?
π· 리μΌνμ ν½μ νλ‘ν μ½μ μ¬μ μ‘μ λ΄μ£Όμ§ μλλ€
DDPμ E1.31μ μ¬μ μ‘μ΄ μκ³ λ°λλΌμΈμ΄ λͺ νν UDP μ€νΈλ¦Όμ΄λ€. λ¦κ² λμ°©ν νλ μμ μΈλͺ¨μλ μ λκ° μλλΌ λ°©ν΄κ° λλ€ β λ λλ¬λ μ΄λ―Έ λ€μ νλ μμΌλ‘ λμ΄κ°κΈ° λλ¬Έμ΄λ€. μΉ λΈλΌμ°μ§μμ Wi-Fiλ₯Ό μΈ λ§νκ² λ§λ€μ΄μ£Όλ μ¬μλμ λ°±μ€ν λμμ΄, ν½μ μ€νΈλ¦¬λ°μμλ μ νν κ·Έ λ°λλ‘ μλνλ€. μ λ¬Έ μ‘°λͺ μ΄ μ μ μ΄λλ· μμμ λλ μ΄μ κ° μ΄ κ²°μ λ‘ μ μ§μ° νΉμ±μ΄λ€.
π· μμ€ μ€μΉμλ μμ€ λ§ν¬κ° νμνλ€
μ€μΉν 컨νΈλ‘€λ¬λ μκ³΅μ΄ λλλ©΄ 물리μ μΌλ‘ μ κ·Όμ΄ μ΄λ €μ΄ κ²½μ°κ° λλΆλΆμ΄λ€. μ΄λλ· + PoEλ μΌμ΄λΈ νλλ‘ μ μκ³Ό λ°μ΄ν°λ₯Ό λͺ¨λ 곡κΈνκ³ , μλ κ° μ μ§λλ©°, λ¬Έμ κ° μκΈ°λ©΄ μ€μμΉ ν¬νΈ μͺ½μμ μ§λ¨ν μ μλ λ§ν¬λ₯Ό μ€λ€.
π· ESP32-S3μλ EMACμ΄ μλ€ β κ·Έλμ PHYλ SPIμ λΆμ΄μΌ νλ€
μ΄ μ μ½μ΄ μ΄ νλ‘μ νΈλ₯Ό WIZnet μ΄μΌκΈ°λ‘ λ§λ λ€. ꡬν ESP32λ LAN8720 κ°μ RMII PHYλ₯Ό μ§μ ꡬλν μ μμλ€. S3λ λͺ» νλ€. S3μμμ μ΄λλ·μ λ°λμ SPIλ₯Ό κ±°μ³μΌ νκ³ , SPI μ΄λλ· μ νμ§λ μ¬μ€μ ENC28J60, W5500, κ·Έλ¦¬κ³ WIZnetμ νμ μΉ©λ€λΏμ΄λ€.
π· WIZnet λΌμΈμ μμ W5500μ μμΉ
(μ΄ μμ μ μΉ© κ° λΉκ΅λ μΌλ°μ μΈ λ°°κ²½ μ€λͺ μ΄λ©° μ μ₯μκ° μ£Όμ₯ν λ΄μ©μ΄ μλλ€. 보λμ W5500μ΄ μ΄λ―Έ μ€μ₯λμ΄ μΆνλλ―λ‘ λ©μΈν μ΄λκ° λμμ νκ°ν μ μ μλ€.) W5500μ μ΄ κΈμ μ€κ³μμ WIZnetμ μ£Όλ ₯ μ νμ§λ€. νλμ¨μ΄ μμΌ 8κ°, λ΄μ₯ TX/RX λ²νΌ 32KB, μ΅λ 80MHz SPI, 10/100 μ΄λλ·. μνκ³κ° λΉμ·νκ² κ°μΆ°μ§ μ μΌν λμμΈ ENC28J60κ³Ό λΉκ΅νλ©΄ μ¬κΈ°μ μ€μν μΆ μ λΆμμ W5500μ΄ μμ λ€ β ENC28J60μ 10Mbps μ μ©μ΄κ³ , νλμμ΄μ΄λ TCP/IP μ€νμ΄ μμ μμΌλ©°, μλΌν λμμΌλ‘ λλΌμ΄λ²κ° 볡μ‘ν΄μ§κΈ°λ‘ μ λͺ νλ€. WIZnet λ΄λΆμμ 보면 W6100μ IPv6 λμΌμ€νμ λνκ³ , W6300μ QSPI νΈμ€νΈ μΈν°νμ΄μ€λ‘ μ²λ¦¬λ μνμ μ¬λ¦¬λ©°, W55RP20μ W5500κΈ MAC/PHYμ RP2040μ ν ν¨ν€μ§μ ν΅ν©νλ€. μ°μ°μ λ΄λΉν ESP32-S3κ° μ΄λ―Έ μλ 보λλΌλ©΄, W5500μ νλ²ν SPI μΈν°νμ΄μ€μ μ±μν λλΌμ΄λ² μνκ³κ° μ νν μλ§μ μ νμ΄λ€.
03 β μμ€ν μν€ν μ²

04 β μ WIZnet W5500μΈκ°? β
π· μν€ν μ² μ νμ§λ₯Ό μ€μ λ‘ μ 곡νλ μ μΌν SPI μ΄λλ· μΉ©
μ΄ νλ‘μ νΈλ₯Ό μ°κ΅¬ν κ°μΉκ° μλ ν΅μ¬μ΄ μ¬κΈ° μλ€. λλΆλΆμ μ΄λλ· μ»¨νΈλ‘€λ¬λ ν΅ν© λͺ¨λΈμ΄ νλλΏμ΄λ€. W5500μ λ κ°λ₯Ό μ 곡νκ³ , μ΄ νλ‘μ νΈλ ν μμ§λμ΄κ° κ°μ νλμ¨μ΄μμ λ κ°μ§λ₯Ό λͺ¨λ ꡬννκ³ κ°κ°μ μ€μΈ‘ κ²°κ³Όλ₯Ό 곡κ°ν λλ¬Έ μ¬λ‘λ€.
π· λͺ¨λ 1 β TOE νλμ¨μ΄ μμΌ (v16 λΌμΈ)
v16 λΌμΈμ W5500μ WIZnetμ΄ μ€κ³ν κ·Έλλ‘, μμ‘±μ μΈ νλμ¨μ΄ TCP/IP μμΌ μμ§μΌλ‘ μ¬μ©νλ€. νΈμ€νΈλ μ΅μ ν¨μΉλ₯Ό μ μ©ν΄ λ²€λλ§ν Ethernet_Generic λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ W5500κ³Ό ν΅μ νλ©°, ESP32μ lwIPκ° μλλΌ μΉ© μ체μ νλμμ΄μ΄λ μ€ν μμ μμΌμ μ°λ€. λ©μΈν
μ΄λ λ³ΈμΈμ μ 리μ λ°λ₯΄λ©΄ μ΄κ²μ΄μΌλ§λ‘ W5500μ μ§μ§ μ°¨λ³ν νλμ¨μ΄ β μ€λ¦¬μ½ μμΌ μμ§ β μ΄κ³ , μ΄λ₯Ό μ΄λ€λ 건 μ€μ νλ‘ν μ½ μ€νλ‘λλ₯Ό μλ―Ένλ€. ESP32 CPUλ TCP μν λ¨Έμ λ, 체ν¬μ¬λ, μ¬μ μ‘ νμ΄λ¨Έλ 건λλ¦¬μ§ μλλ€.
νλμ¨μ΄ κ²μ¦ κ²°κ³Ό: SPIλ‘ μΉ© μΈμ(hardwareStatus=3), λ§ν¬ κ°μ§(linkStatus=1), DHCP μλ νλ, κ·Έλ¦¬κ³ Wi-Fiμ μ΄λλ·μ΄ μλ‘ λ€λ₯Έ IPλ‘ λμμ λμνλ©° WLED μ 보 ν¨λμ λλν νμλλ κ²κΉμ§ νμΈ.
κ·Έλ¦¬κ³ λ λ² μ¬νλ, λ¬Έμνλ νκ³: WLEDμ μ ν리μΌμ΄μ νΈλν½μ λ¨ νλλ μ΄ κ²½λ‘λ₯Ό μ§λκ°μ§ μλλ€. WLEDμ DDP, E1.31, μΉ UI, MQTT νΈλ€λ¬λ μ λΆ AsyncTCP/AsyncUDPμ λ°μΈλ©λμ΄ μκ³ , 그건 ESP32μ lwIPμ νλμμ΄μ΄λμ΄ μλ€. W5500μ νλμ¨μ΄ μμΌ APIλ λ³λ ¬λ‘ μ‘΄μ¬νλ λ λ²μ§Έ λ€νΈμν¬ μ€νμ΄λ©°, WLED νλ‘ν μ½ κ³μΈ΅μ μ΄λ€ μ½λλ κ·Έ APIλ₯Ό μΈ μ€ λͺ¨λ₯Έλ€. v16 νμ¨μ΄μ μ΄λλ· IPλ‘ DDPλ₯Ό 보λ΄λ μ€νΈλ¦½μ μΌμ§μ§ μλλ€.
μ΄κ±΄ W5500μ κ²°ν¨μ΄ μλλ€. νλμ¨μ΄ TCP/IP μ€νλ‘λκ° μμ μ ν리μΌμ΄μ μ μꡬνλ 쑰건μ μ νν μ§μ ν κ²μ΄λ€ β μ ν리μΌμ΄μ μ΄ μ€νλ‘λ μμ§μ μμΌ APIλ₯Ό ν₯ν΄ μμ±λμ΄ μμ΄μΌ νλ€. AsyncTCPμ λ¬ΆμΈ λ€νΈμνΉ μ½λκ° μλ§ μ€μΈ lwIP λ€μ΄ν°λΈ μ½λλ² μ΄μ€ WLEDλ κ·Έλ μ§ μλ€. λ©μΈν μ΄λλ μ΄κ±Έ ν΄κ²°νλ €λ©΄ 무μμ΄ νμνμ§κΉμ§ μ°μ νλ€ β WLEDμ μΉ/μμΌ κ³μΈ΅ κ³Ό 리μΌνμ νλ‘ν μ½ μμ λΆλ₯Ό W5500 μμΌ API κΈ°λ° μ½λλ‘ κ΅μ²΄ν΄μΌ νλ©°, μ΄κ±΄ νκ² μ€λ²λ μ΄κ° μλλΌ WLED λ€νΈμνΉ μ½μ΄μ μμ μ μ§ ν¬ν¬(standing fork)λΌλ κ²°λ‘ μ΄λ€.
π· λͺ¨λ 2 β λ€μ΄ν°λΈ lwIP νμμ MACRAW (v17 λΌμΈ)
v17 λΌμΈμ λ°λ κΈΈμ ννλ€. ESP-IDF 5.5.4 / arduino-esp32 Core 3.3.8μλ W5500μ MACRAW λͺ¨λλ‘ κ΅¬λνλ μΌκΈ ETH_PHY_W5500 λλΌμ΄λ²κ° λ€μ΄ μλ€. μ μ΄λλ· νλ μμ΄ κ·Έλλ‘ μ€κ°κ³ , νλ‘ν μ½ μ²λ¦¬λ μ λΆ ESP32μ lwIPκ° λ΄λΉνλ€. W5500μ μ¬μ€μ λ§€μ° μμ ν SPI λΆμ°©ν MAC/PHYκ° λλ©°, μμ€ν
μ λλ¨Έμ§ λΆλΆ μ
μ₯μμλ RMII PHYμ ꡬλΆλμ§ μλλ€.
ν¨κ³Όλ μμ νλ€. μ§μ§ lwIP netifμ΄κΈ° λλ¬Έμ DDP, E1.31, Art-Net, MQTT, μΉ UI, OTAκ° νλ‘ν μ½λ³ κΈλ£¨ μ½λ ν μ€ μμ΄ μλμΌλ‘ μ΄λλ·μ νκ³ λμνλ€. λκ°λ κ·Έλ§νΌ λΆλͺ
νλ€. νλμμ΄μ΄λ TCP/IP μμ§μ λκ³ , ESP32 CPUκ° μ€νμ μ§μ΄μ§λ€.
μ΄ μ€νλ‘λ λ μ€ν νΈνμ±μ λ§κ΅νμ΄ W5500 ν΅ν©μ κ·Όλ³Έμ μΈ μμ¬κ²°μ μ΄λ©°, μ΄ νλ‘μ νΈλ κ³΅κ° μ μ₯μμμ λ³Ό μ μλ κ·Έ λ§κ΅νμ κ°μ₯ λͺ νν μ€μΈκ³ μμ μ΄λ€.
π· λ¦΄λ¦¬μ€ νμ΄νλΌμΈ μμ²΄κ° OTA μμ μ±μ μ€μ¬μΌλ‘ μ€κ³λ¨
λ©μΈν μ΄λμ λΉλ μμ€ν μ μ λ°μ΄νΈ κ²½λ‘λ₯Ό λΆμ°λ¬Όμ΄ μλλΌ μΌκΈ μ°μΆλ¬Όλ‘ μ·¨κΈνλ€. λͺ¨λ 릴리μ€λ νκ²λΉ μ νν λ κ°μ μ κ·νλ μν°ν©νΈλ₯Ό λ°ννλ€:
wled-<version>-<target>-<suffix>.app.binβ OTA μ΄λ―Έμ§. μ μ λμ μ€μΈ κΈ°κΈ°μ WLED μ€μ β Security & Updates β Manual OTA νμ΄μ§λ‘ μ¬λ¦°λ€.wled-<version>-<target>-<suffix>.full.binβ λΆνΈλ‘λ + νν°μ ν μ΄λΈ + μ ν리μΌμ΄μ μ ν©μΉ μ΄λ―Έμ§. μ΅μ΄ UART νλμ±μ©μ΄μ, OTAκ° μ€ν¨νκ±°λ νν°μ λ μ΄μμμ΄ λ°λ κ²½μ°μ 볡ꡬμ©.
.full.binμ esptool.py merge_bin λ¨κ³λ‘ λ§λ€μ΄μ§λ€. S3 κΈ°μ€ λΆνΈλ‘λλ₯Ό 0x0, νν°μ
ν
μ΄λΈμ 0x8000, μ ν리μΌμ΄μ
μ 0x10000μ λ°°μΉνλ©°, μΈ μ
λ ₯ μ€ νλλΌλ μμΌλ©΄ μλνκ² μ€ν¨νλ€. λ λ§λ€μ΄μ§ 볡ꡬ μ΄λ―Έμ§κ° λ¦΄λ¦¬μ€ νμ΄μ§μ μ¬λΌκ°λ μΌμ΄ μμ²μ μΌλ‘ λΆκ°λ₯νλ€λ λ»μ΄λ€. .full.binμ μ μ΄μ κΈ°κΈ°κ° μ΄λ―Έ κ³€λν μνμΌ λ μμ λ»λ μν°ν©νΈμ΄κΈ° λλ¬Έμ μ΄ μ€κ³κ° μ€μνλ€.
λ¬Έμνλ 볡ꡬ κ·μΉμ ν λ¬Έμ₯μ΄κ³ , νμ₯ κΈ°μ μ μ
μ₯μμλ μ΄ μ μ₯μ μ 체μμ κ°μ₯ μΈλͺ¨ μλ λ¬Έμ₯μ΄λ€. OTAκ° κ±°λΆλκ±°λ μ΄ν λΆν
μ΄ μ λλ©΄, λμλλ .full.binμ UARTλ‘ νλμ±νλΌ. μ΄ κ·μΉμ νμλ‘ λ§λλ μ€ν¨ λͺ¨λκ° λ μλ€ β .app.binλ§μΌλ‘λ λμ΄κ° μ μλ νν°μ
λ μ΄μμ λ³κ²½, κ·Έλ¦¬κ³ μλμ μ€λͺ
ν νλμ λͺ¨λ ν€λ ν¨μ . νμλ μ ν리μΌμ΄μ
μ½λκ° λκΈ° μ ROM λ¨κ³μμ λΆνΈλ£¨νμ λΉ μ Έ μλ¦¬μΌ μΆλ ₯μ΄ μ ν μλ€.
v16 λΌμΈμ μ± νν°μ
λ μ΄μμμμμ λ°λ³΅ OTA λ° μ₯κΈ° OTA λμμ΄ μ¬μ ν λ―Έκ²μ¦μ΄λΌλ μ λ μ μ§νκ² κΈ°λ‘ν΄ λμλ€. νμ¨μ΄κ° μ¬μ© κ°λ₯ν μ± μ¬λ‘― μ€ μ¬μ μλ λΉμ¨λ§ μ°¨μ§νκ³ μμ§λ§, λ©μΈν
μ΄λλ μ€μ λ‘ ν΄λ³΄μ§ μμ κ²μ μ£Όμ₯νμ§ μλλ€. (νν°μ
μ©λ μμΉλ v16 λ
ΈνΈ κΈ°μ€μ΄λ―λ‘, νΉμ λΉλμ μ μ©νκΈ° μ μ νμ¬ .csvλ‘ λμ‘° νμΈνλ κ²μ΄ μ’λ€.)
π· κ²μ¦λ μ¦κ±° β
v17 λΌμΈμ κ²μ¦ λͺ©λ‘μ μ€λ¬Ό 보λ 2λ κΈ°μ€μΌλ‘ ꡬ체μ μ΄λ€:
- μ΄λλ· (LAN λ° PoE): pass
- Wi-Fi: pass
- xLights β μ΄λλ· κ²½μ DDP: pass
- xLights β Wi-Fi κ²½μ DDP: pass
- μ΄λλ· κ²½μ μΉ UI: pass
- Wi-Fi κ²½μ μΉ UI: pass
- λ°νμ LED λ²μ€ μ¬κ΅¬μ± β μ¬λΆν μμ΄ λ²μ€ μΆκ°/μ κ±°/μ¬μ€μ , RMT ꡬλ λ²μ€μ I2S/LCD ꡬλ λ²μ€ μμͺ½μμ "μμ Nκ° LED 건λλ°κΈ°" ν¬ν¨, μ΄λλ·κ³Ό Wi-Fi μμͺ½μμ: pass
MQTTλ μ¬μ© λμ΄κ°μ§ μκ³ "μμ§ λ―Έκ²μ¦"μ΄λΌκ³ λͺ μλμ΄ μλ€. μ΄ μ μ§ν¨μ pass λͺ©λ‘λ§νΌμ κ°μΉκ° μλ€.
05 β ν΅μ¬ κ΅¬μ± μμ
π WIZnet W5500 β λ λΉλ λΌμΈμμ TOEμ MACRAW μμͺ½ λͺ¨λ λͺ¨λ μ¬μ©
- v16 λΌμΈ: νλμμ΄μ΄λ TCP/IP μμΌ μμ§(TOE). ν¨μΉν
Ethernet_Genericμ λ²€λλ§ν΄ ꡬλ. λ§ν¬μ κ³Ό DHCPκΉμ§ νλμ¨μ΄ κ²μ¦λ¨. WLED μ ν리μΌμ΄μ νΈλν½μ μ£μ§ μλλ€λ μ μ΄ ν¨κ» λ¬Έμνλ¨. - v17 λΌμΈ (κΆμ₯): ESP-IDFμ
ETH_PHY_W5500μ ν΅ν MACRAW λͺ¨λ. μμ€ν μλ λ€μ΄ν°λΈ lwIP μΈν°νμ΄μ€λ‘ λ ΈμΆλλ©°, WLEDμ λͺ¨λ νΈλν½μ΄ μ΄ κ²½λ‘λ₯Ό μ§λκ°λ€. - SPI νλ§΅μ λ λΌμΈ λμΌ:
MISO=12 MOSI=11 SCLK=13 CS=14 INT=10 RST=9. Waveshare νμμ λ€μ΄μ΄κ·Έλ¨κ³Ό λμ‘° νμΈλ¨. - v17 ν¨μΉλ
xml.cppμ μμ½ ν λ³΄κ³ λ₯Ό, μ 보 ν¨λ(json.cpp/data/index.js)μ Wi-Fiμ μ΄λλ· IP λμ νμλ₯Ό μΆκ°νλ€. λλΆμ W5500μ νκ³Ό λ§ν¬ μνκ° WLED μ체 UIμ λλ¬λλ€.
π§ Waveshare ESP32-S3-ETH
ESP32-S3, νλμ 16MB, PSRAM 8MB, PoE μ§μ W5500 μ΄λλ·. λ΄μ₯ EMACμ΄ μλ€ β κ·Έλμ μ¬κΈ°μ W5500μ νΈμ μ¬μμ΄ μλλΌ νμ 쑰건μ΄λ€.
π‘ 8 Γ WS281x LED λ²μ€
RMT νλμ¨μ΄ μ±λ 4κ°μ I2S/LCD λ³λ ¬ μ±λ 4κ°λ‘ ꡬλλλ©°, WLEDμ λ²μ€ λ§€λμ κ° λ°νμμ λ²μ©μ μΌλ‘ μ²λ¦¬νλ€. v17 λΌμΈμμλ λ°μ΄ν° ν μμλ₯Ό μλμ μΌλ‘ 18,17,16,15,3,2,1,21λ‘ μ¬λ°°μΉνλ€. GPIO0μ μΈνΈμμ λΉΌκ³ β S3 μ€νΈλν νμ΄μ BOOT λ²νΌκ³Ό 곡μ λλ ν β W5500 SPI ν, SD μΉ΄λ, USBμ κ²ΉμΉμ§ μλ μ¬μ ν GPIO21λ‘ λ체νλ€.
ποΈ νκ² κ³μΈ΅ν λΉλ μμ€ν
targets/<target>/shared/κ° λ³΄λλ³ λ¨μΌ μ§μ€ μμ€μ΄κ³ , targets/<target>/v15|v16|v17/μ λ²μ λΈνλ§ λ΄λλ€. scripts/build-target.shκ° λ§€λνμ€νΈλ₯Ό μ½κ³ , WLED λ² μ΄μ€λ₯Ό ν΄μνκ³ (λ‘컬 체ν¬μμ μ°μ , μμΌλ©΄ μ
μ€νΈλ¦Ό fetch), νκ² μ€λ²λ μ΄λ₯Ό μ μ©ν λ€ λΉλνλ€. μ€νν λλ§λ€ logs/<target>/<version>/<YYYYMMDD>/ μλμ λ μ§λ³ λ‘κ·Έ, λ©νλ°μ΄ν° JSON, μμ½λ³Έμ κΈ°λ‘νκ³ , μ΅μ μ±κ³΅ μ€νλ³Έμ latest/μ 볡μ¬νλ€.
π ν ν° κ²μ΄νΈ λ°©μμ CI λ¦΄λ¦¬μ€ νμ΄νλΌμΈ
GitHub Actionsκ° κ΄λ ¨ νΈμλ§λ€ μν°ν©νΈλ₯Ό λΉλνμ§λ§, GitHub Releaseλ μ»€λ° λ©μμ§μ release ν ν°μ΄ λ€μ΄ μμ λλ§ λ°νλλ€. release legacyλ©΄ ν리릴리μ€λ‘ λ°νλλ€. λ°°ν¬ νμ¨μ΄ μ΄λ¦μ OTAμ© wled-<version>-<target>-<suffix>.app.binκ³Ό μ΅μ΄ UART νλμ±μ© .full.binμΌλ‘ μ κ·νλλ©°, νμλ λΆνΈλ‘λΒ·νν°μ
ν
μ΄λΈΒ·μ ν리μΌμ΄μ
μ νλμ μ΄λ―Έμ§λ‘ ν©μΉλ esptool.py merge_bin λ¨κ³μμ μμ±λκ³ μ
λ ₯μ΄ νλλΌλ μμΌλ©΄ μλνκ² μ€ν¨νλ€.
β οΈ κΈ°λ‘ν΄λ κ°μΉκ° μλ νλμ λͺ¨λ ν¨μ
μ΄ λ³΄λμ νλμλ DIOλ₯Ό μꡬνλλ°, esp32s3 μ½μ΄μλ DIO λΆνΈλ‘λ ELFκ° λ€μ΄ μμ§ μλ€. κ·Έλμ board_build.flash_modeλ qioμ¬μΌ νκ³ (PlatformIOκ° μ΄λ€ λΆνΈλ‘λλ₯Ό λ§ν¬ν μ§ κ²°μ ), custom_merge_flash_modeλ dioμ¬μΌ νλ€(ROMμ΄ λΆν
μ μ€μ λ‘ μ°Έμ‘°νλ κ°). μ΄κ±Έ ν리면 μ ν리μΌμ΄μ
μ½λκ° ν μ€λ λκΈ° μ μ ROM λ¨κ³μμ λΆνΈλ£¨νμ λΉ μ§κ³ , μλ¦¬μΌ μΆλ ₯μ΄ μ ν μμΌλ©°, esptool.py erase_flashλ‘λ§ λ³΅κ΅¬λλ€. λ€μ μ¬λμ μ£Όλ§μ ꡬν΄μ£Όλ μ’
λ₯μ μ 보λ€.
06 β μ μ© μλ리μ€
01. μμ€ κ±΄μΆ μ‘°λͺ λ° ν리λ°μ΄ λΌμ΄ν
xLights μνμ€κ° μμ² ν½μ μ λμ νλ μ λ μ΄νΈλ‘ DDPλ₯Ό ν΅ν΄ ꡬλνκ³ , 컨νΈλ‘€λ¬λ λ²½μ κ³ μ λμ΄ PoEλ‘ μ μμ λ°μΌλ©° 물리μ μΌλ‘ μμ΄ λΏμ§ μλ νκ²½. v17 λΌμΈμ΄ μ νν μ΄ μ νμ΄λ€ β μΌμ΄λΈ νλ, κ²°μ λ‘ μ μ§μ°, νλμ¨μ΄ κ²μ¦λ μ΄λλ· κ²½μ DDP.
02. 무λ·곡μ°μ₯Β·μ΄λ²€νΈ μ‘°λͺ
E1.31(sACN)κ³Ό Art-Netμ κ³΅μ° μ‘°λͺ μ μ΄μ λͺ¨κ΅μ΄λ€. κ΄κ° μλ°± λͺ μ ν΄λν°μ΄ 2.4GHz λμμ ν¬νμν€λ 곡μ°μ₯μ Wi-Fi ν½μ μ€νΈλ¦¬λ°μ μ΅μ μ νκ²½μ΄μ, W5500 μ λ§ν¬λ₯Ό μ λΉννλ μ΅μ μ κ·Όκ±°λ€.
03. W5500 ν΅ν© μμ¬κ²°μ μ μν λ νΌλ°μ€ μ€κ³
"W5500μ νλμ¨μ΄ TCP/IP μ€νμ μΈκΉ, μλλ©΄ MACRAW PHYλ‘ μΈκΉ?"λΌλ μ§λ¬Έ μμ μ μμ§λμ΄λΌλ©΄, μ΄μ μμͺ½ λΆκΈ°μ λν΄ λ¬Έμνλκ³ νλμ¨μ΄λ‘ κ²μ¦λ λ΅μ κ°κ° μ΄λ€ 쑰건μμ μ 리νμ§κΉμ§ ν¬ν¨ν΄ μ»μ μ μλ€. μμ½νλ©΄ μ΄λ λ€: μ ν리μΌμ΄μ κ³μΈ΅μ λ΄κ° ν΅μ νλ©΄ TOE, κΈ°μ‘΄ lwIP λ€μ΄ν°λΈ μ€νμ ν΅ν©νλ μν©μ΄λ©΄ MACRAW.
04. PoE ν κ°λ₯μΌλ‘ μ΄λ£¨μ΄μ§λ μ격 νλ¦Ώ μ μ§λ³΄μ
κ΄λ¦¬ν μ€μμΉ νλ λ€μ 컨νΈλ‘€λ¬ 20λκ° κ±Έλ¦° 곡μ°μ₯. v17 λΌμΈμ OTAλ₯Ό μ΄λλ·μΌλ‘ μ€μ΄ λλ₯΄λ―λ‘, κ°μ λ€νΈμν¬μ λΆμ λ
ΈνΈλΆ νλλ‘ μ 체 νλ¦Ώμ μ
λ°μ΄νΈν μ μλ€. Wi-Fi μ격 μ¦λͺ
μ κΈ°κΈ°λ§λ€ λ£μ νμλ μκ³ , μ₯λΉλ§λ€ μ¬λ€λ¦¬λ₯Ό ν μΌλ μμΌλ©°, μλ΅μ΄ μλ μ λμ μ€μμΉ ν¬νΈ μͺ½μμ λ§ν¬ μνλ₯Ό μ§λ¨ν μ μλ€. 20λ μ€ ν λκ° μ
λ°μ΄νΈλ₯Ό κΉλνκ² λ°μ§ λͺ»νμ λλ₯Ό μν΄ .app.bin / .full.bin μ΄λΆλ²μ΄ κ²°μ λ‘ μ μΈ λ³΅κ΅¬ μλ리μ€λ₯Ό μ 곡νλ€.
05. 보λλ³ νμ¨μ΄ ν¬ν¬ μ μ§λ³΄μμ ν νλ¦Ώ
νκ²/λ²μ μ€λ²λ μ΄ λͺ¨λΈ, λ§€λνμ€νΈ ν΄λ°± 체μΈ, ν ν° κ²μ΄νΈ λ¦΄λ¦¬μ€ μν¬νλ‘, ν¨μΉ λ리ννΈ κ²μ¬κΈ°(scripts/check-target-patches.sh)λ λΉ λ₯΄κ² μμ§μ΄λ μ
μ€νΈλ¦Όμ 컀μ€ν
λΉλλ₯Ό μ μ§λ³΄μνλ λͺ¨λ μ¬λμκ² μ¬μ¬μ© κ°λ₯ν ν¨ν΄μ μ΄λ£¬λ€. μλ² λλ μ€νμμ€ μΈκ³μ μλΉ λΆλΆμ΄ μ¬κΈ°μ ν΄λΉνλ€.
κ²°λ‘
μ΄ νλ‘μ νΈλ "W5500μ΄ WLEDμ λλ?"λΌλ μ§λ¬Έμ, ν¨μ¬ μ μ©ν 무μΈκ°λ‘ λ°κΏλμλ€ β μ€μ μ ν리μΌμ΄μ μμ W5500μ λ κ°μ§ ν΅ν© λͺ¨λκ° κ°κ° 무μμ μ 곡νλμ§μ λν νλμ¨μ΄ κ²μ¦λ λλν λΉκ΅μ΄λ©°, λΆμ κ²°κ³ΌκΉμ§ 곡κ°ν λ§νΌ μ μ§νλ€.
- β λ΄μ₯ EMACμ΄ μλ ESP32-S3μμ, RMII μ μ©μΈ WLED κΈ°λ³Έ μ΄λλ· ν μ΄λΈμ΄ μ»΄νμΌμ‘°μ°¨ κ±°λΆνλ μν©μ λ«κ³ W5500 μ΄λλ·μ λμμν΄
- β λμΌ λ³΄λμμ W5500 ν΅ν© λͺ¨λΈ λ κ°μ§ β TOE νλμ¨μ΄ μμΌ(v16)κ³Ό λ€μ΄ν°λΈ lwIP νμ MACRAW(v17) β λ₯Ό λͺ¨λ ꡬννκ³ νλμ¨μ΄ κ²μ¦
- β TOE μ€νλ‘λκ° μ lwIP λ€μ΄ν°λΈ μ ν리μΌμ΄μ μ νΈλν½μ λ€νΈμνΉ μ½μ΄ μ¬μμ± μμ΄λ μ€μ΄ λλ₯Ό μ μλμ§λ₯Ό, μ¬νλ μ¦κ±°μ ν¨κ» λ¬Έμν
- β DDP, E1.31, μΉ UIκ° μ΄λλ· μμμ λμν¨μ μ€λ¬Ό 보λ 2λλ‘ κ²μ¦ν v17 λΌμΈμ μ 곡. OTAμ MQTTλ κ°μ lwIP κ²½λ‘λ₯Ό ꡬ쑰μ μΌλ‘ λ°λΌκ°
- β OTAλ μ ν리μΌμ΄μ μ΄ λ°μΈλ©λ μ€νμ λ°λΌκ°λ€λ, λ°°ν¬μ κ²°μ μ μΈ κ·κ²°μ λλ¬λ β μ΄λλ· κ²½μ νμ¨μ΄ μ λ°μ΄νΈκ° lwIP λΌμΈμμλ§ κ°λ₯νλ€λ μ¬μ€μ΄, μν€ν μ² μ νμ κ³§ μ μ§λ³΄μ κ°λ₯μ±μ λ¬Έμ λ‘ λ°κΏλλλ€
- β μ€μ κ²°ν¨ 4건μ κ·Όλ³Έ μμΈ κ·λͺ λ° μμ . κ·Έμ€ 3건μ μ΄λλ·κ³Ό 무κ΄νκ² λͺ¨λ ESP32-S3 μ¬μ©μμκ² μν₯μ μ£Όλ μ μ€νΈλ¦Ό λ²κ·Έ
- β
볡ꡬ λΆκ°λ₯ν λΆνΈλ£¨νλ‘ λνλλ ROM λ¨κ³ νλμ λͺ¨λ ν¨μ (
qioλΆνΈλ‘λ ν€λ vsdioλ³ν© ν€λ)μ λ¬Έμν - β W5500μ WLED μ체 UIμ λ ΈμΆ β μμ½ ν λ³΄κ³ λ° μ 보 ν¨λμ Wi-Fi/μ΄λλ· IP λμ νμ
- β
λ μ§λ³ λ‘κ·Έ, λΉλ λ©νλ°μ΄ν°, ν ν° κ²μ΄νΈ 릴리μ€, μ κ·νλ
.app.bin/.full.binμν°ν©νΈλ₯Ό κ°μΆ μ¬ν κ°λ₯ν νκ²/λ²μ μ€λ²λ μ΄ νμ΄νλΌμΈ κ΅¬μΆ - β κ²μ¦λμ§ μμ νλͺ©(MQTT, ν«νλ¬κ·Έ κ°μ§, 3MB λ μ΄μμμμμ μ₯κΈ° OTA)μ κ³Όλ μ£Όμ₯ μμ΄ λͺ μ
Q&A
Q. v17 λΌμΈμ W5500μ νλμ¨μ΄ TCP/IP μμ§μ λλΉνλ κ² μλκ°? μλ°ν λ§νλ©΄ κ·Έλ λ€ β MACRAW λͺ¨λλ νλμμ΄μ΄λ μ€νμ μ°ννκ³ ESP32κ° μννΈμ¨μ΄λ‘ νλ‘ν μ½μ μ²λ¦¬νλ€. νμ§λ§ μ΄ μ ν리μΌμ΄μ μμ μ€μν μΌμ μ¬μ ν W5500μ΄ νλ€. EMACμ΄ μλ μΉ©μμ μ μ μ΄λλ· μ체λ₯Ό κ°λ₯νκ² λ§λλ MAC/PHYμ΄κ³ , μ°κ²°μ λ¨μν SPI λ²μ€μ΄λ©°, ESP-IDFμ μ±μν λλΌμ΄λ²κ° μλ€. 32KB λ΄μ₯ λ²νΌλ μ¬μ ν λ²μ€νΈλ₯Ό ν‘μνκ³ , L1/L2 μ²λ¦¬λ μ λΆ μΉ©μ΄ λ΄λΉνλ€. λ€νΈμνΉ κ³μΈ΅ μ μ²΄κ° lwIPμ λ¬ΆμΈ μ ν리μΌμ΄μ μ΄λΌλ©΄ μ΄κ±΄ μ¬λ°λ₯Έ μμ§λμ΄λ§ λ§κ΅νμ΄λ€.
Q. κ·Έλ¬λ©΄ W5500μ TOE λͺ¨λλ μΈμ μ¨μΌ νλ? μ ν리μΌμ΄μ κ³μΈ΅μ λ΄κ° μμ ν λλ€. μ κ· κ°λ° νμ¨μ΄ β μ°μ μ© Modbus TCP κ²μ΄νΈμ¨μ΄, λ°μ΄ν° λ‘κ±°, λͺ©μ νΉν HTTP/MQTT λλ°μ΄μ€ β λ₯Ό W5500 μμΌ APIμ λ§μΆ° μ§μ μμ±νλ©΄ μ΄μ μ μ λΆ κ°μ Έκ°λ€. νλμμ μννΈμ¨μ΄ TCP/IP μ€νμ΄ μκ³ , 체ν¬μ¬κ³Ό μ¬μ μ‘μ CPU μ¬μ΄ν΄μ μ°μ§ μμΌλ©°, μμΌ λμμ΄ κ²°μ λ‘ μ μ΄λ€. v16 λΌμΈμ λ°κ²¬μ "TOEκ° μ΄λ±νλ€"κ° μλλΌ "TOEλ μ ν리μΌμ΄μ μ΄ κ·Έκ²μ ν₯ν΄ μμ±λμ΄ μκΈ°λ₯Ό μꡬνλ€"μ΄λ©°, μ΄κ±΄ W5500μ΄ μλλΌ WLEDμ λν μ§μ μ΄λ€.
Q. λ λ€λ₯Έ νν SPI μ΄λλ· μ νμ§μΈ ENC28J60μ μ μ λλ? λ¨Όμ μ§μ΄λ κ²μ μ μ₯μκ° μ΄ μ§λ¬Έμ λμ§ μ μ΄ μλ€λ μ μ΄λ€. 보λμ W5500μ΄ μ€μ₯λ μ±λ‘ μΆνλλ―λ‘ μ ν κ³Όμ μμ²΄κ° μμλ€. μΌλ°μ μΈ λ°°κ²½μΌλ‘ λ΅νλ©΄, ENC28J60μ 10Mbps μ μ©μ΄κ³ , νλμμ΄μ΄λ TCP/IP μ€νμ΄ μμ μμ΄μ TOEλΌλ μ νμ§ μμ²΄κ° μ‘΄μ¬νμ§ μμΌλ©°, λλΌμ΄λ² μνκ³μ μλΌν μ°νμ μμ¬κ° κΈΈλ€. W5500μ 10/100μ΄κ³ , νλμ¨μ΄ μμΌ 8κ°μ 32KB λ²νΌλ₯Ό κ°μ·κ³ , SPIλ₯Ό μ΅λ 80MHzκΉμ§ μ°λ©°, ESP-IDFμ ETH_PHY_W5500μ΄λΌλ μΌκΈ λλΌμ΄λ² μ§μμ΄ μλ€ β λ°λ‘ κ·Έ μ§μμ΄ v17 λΌμΈμ κ°λ₯νκ² λ§λ€μλ€.
Q. μ€μ λ‘λ μ΄λ€ λΉλλ₯Ό νλμ±ν΄μΌ νλ? νλμ¨μ΄ μμΌ λ°©μ μ체λ₯Ό μ°κ΅¬ν λͺ©μ μ΄ μλλΌλ©΄ v17 λΌμΈμ΄λ€. μ μ λμ μ€μΈ κΈ°μ‘΄ μ€μΉμ OTAλ‘ μ¬λ¦΄ λλ .app.bin, μ 보λΒ·λ²½λ μνΒ·νν°μ
λ μ΄μμ λ³κ²½ νμλ UARTλ‘ .full.binμ μ΄λ€.
Q. μ΄λλ·μΌλ‘ νμ¨μ΄ μ λ°μ΄νΈκ° κ°λ₯νκ°? λ©μΈν μ΄λ λ³ΈμΈμ μμ μ λ°λ₯΄λ©΄ v17 λΌμΈμμ κ°λ₯νλ€. λ€λ§ ν΄λΉ λΌμΈμ νλμ¨μ΄ κ²μ¦ λͺ©λ‘μ OTAκ° νλͺ©μΌλ‘ μ¬λΌμ μμ§λ μμΌλ―λ‘, λ³λλ‘ μΈ‘μ λ κ²°κ³ΌλΌκΈ°λ³΄λ€ ꡬ쑰μ μΌλ‘ νλΉν μνλ‘ λ°μλ€μ΄λ κ²μ΄ λ§λ€. WLEDμ OTA μλν¬μΈνΈλ λλ¨Έμ§ κΈ°λ₯κ³Ό ν¨κ» lwIP/AsyncTCP μμ μμ΄μ, lwIPκ° μμ ν μΈν°νμ΄μ€λ₯Ό ν΅ν΄μλ§ κΈ°κΈ°μ λλ¬νλ€. v17μμλ W5500 μμ²΄κ° lwIP μΈν°νμ΄μ€μ΄λ―λ‘ μΆκ° μ½λ μμ΄ μ΄λλ· OTAκ° λμνλ€. v16μμλ W5500μ΄ λ³λμ νλμ¨μ΄ μμΌ μ€νμ λλ¦¬κ³ OTAλ κ·Έμͺ½μΌλ‘ λ€μ΄κ° κ²½λ‘κ° μλ€ β μ΄λλ· ν¬νΈμ IPλ μμ§λ§ κ·Έ μ£Όμλ‘ νμ¨μ΄λ₯Ό λ°μ΄ λ£μ μ μκ³ , μ λ°μ΄νΈλ Wi-Fiλ‘ κ°μΌ νλ€. μΈ λ§ν Wi-Fiκ° μλ μ€μΉ νμ₯μ΄λΌλ©΄ μ΄ μ°¨μ΄κ° κ³§ μ격 μ λ°μ΄νΈλ μΆμ₯μ΄λμ μ°¨μ΄λ€.
Q. OTA μ
λ°μ΄νΈκ° μ€ν¨νλ©΄ μ΄λ»κ² λλ? λμλλ .full.binμ UARTλ‘ νλμ±νλ©΄ λλ€. λΆνΈλ‘λΒ·νν°μ
ν
μ΄λΈΒ·μ ν리μΌμ΄μ
μ΄ ν μ΄λ―Έμ§μ λ€μ΄ μμ΄μ, μ€ν¨ν μ
λ°μ΄νΈκ° κΈ°κΈ°λ₯Ό μ΄λ€ μνλ‘ λ§λ€μ΄λ¨λ 볡ꡬλλ€. μ΄κ±Έ μ νμ΄ μλλΌ νμλ‘ λ§λλ μν©μ΄ λ μλ€. κΈ°κΈ°μ μ¬λΌκ° κ²κ³Ό νν°μ
λ μ΄μμμ΄ λ€λ₯Έ λΉλ(μ΄κ±΄ .app.binλ§μΌλ‘λ ν΄κ²°μ΄ μ λλ€), κ·Έλ¦¬κ³ νλμ λͺ¨λ ν€λ λΆμΌμΉ(μ ν리μΌμ΄μ
μ½λκ° λκΈ° μ ROM λ΄λΆμμ λΆνΈλ£¨νμ λΉ μ§κ³ μλ¦¬μΌ μΆλ ₯μ΄ μ ν μλ€). μμΌλ©΄ μ λλ μ€μΉ νμ₯μ΄λΌλ©΄ UART μ΄λν°λ₯Ό νμ₯μ λΉμΉν΄ λλ κ² μ’λ€.
Q. μμΌλ‘ λμ¬ WIZnet μΉ©μ΄ μ΄ λ§κ΅νμ λ°κΏ μ μμκΉ? κ°μΈμ μΈ μκ°μΌλ‘λ μΆ©λΆν κ°λ₯νλ€. W6300μ QSPI νΈμ€νΈ μΈν°νμ΄μ€λ SPI μΈ‘ μνμ ν¬κ² λμ΄μ¬λ¦¬κ³ , W55RP20μ MCUμ W5500κΈ MAC/PHYλ₯Ό ν ν¨ν€μ§λ‘ ν΅ν©νλ€ β μ²μλΆν° TOE λͺ¨λκ° μμ°μ€λ¬μ΄ μ νμΈ μ κ· μ»¨νΈλ‘€λ¬ μ€κ³μ νΉν λ§€λ ₯μ μΈ μ‘°ν©μ΄λ€.
Original Link: https://github.com/johnvoipguy/wled-custom-builds
Target detail: targets/waveshare-esp32s3-eth/README.md Β· v17 notes Β· v16 notes
License: EUPL-1.2