Skip to content

OpenLaserDAC

Open-source ESP32-S3 laser DAC firmware with Ether Dream protocol

Lihan__

Published June 26, 2026

Original author: GabrieleOriginal source (new tab)

OpenLaserDAC

Project description

OpenLaserDAC โ€” Turning a $10 Chip into a Professional Laser Show Controller

#LaserDAC #EtherDream #ESP32-S3 #W5500 #UDP #TCP-TOE #ILDA #OpenSource #RealTime #DualCore

๐Ÿ“š Open-source hobby/maker project โ€” laser show control hardware from scratch โœ… Fully implemented: complete C codebase with ESP-IDF, PlatformIO build, hardware pin map, OTA update โ€” all verified in source


01 โ€” What is this project?

01 โ€” What is this project?

 

Laser show control has historically been the domain of specialized, expensive hardware. The Ether Dream is the industry-standard open laser DAC โ€” a device that receives the ILDA (International Laser Display Association) point stream from show software over Ethernet and drives the galvanometer mirrors and RGB color channels of a laser projector with sub-millisecond precision. A real Ether Dream unit costs hundreds of dollars and ships its data through a proprietary network protocol on a dedicated Ethernet link.

OpenLaserDAC replaces all of that with an ESP32-S3 microcontroller and a W5500 Ethernet chip. The firmware implements the complete Ether Dream protocol โ€” TCP command channel on port 7765, UDP broadcast discovery on port 7654, full state machine (Idle โ†’ Prepared โ†’ Playing โ†’ E-Stop) โ€” so that any existing show software (MadMapper, Liberation, or any Ether Dream client) connects without modification. On the output side, a DAC80508 8-channel 16-bit SPI DAC drives X/Y galvo mirrors and R/G/B laser beams at scan rates from 1 kHz to 100 kHz.

The result: a complete, field-functional laser DAC at a fraction of commercial cost, compatible with the professional lighting ecosystem, and fully open-source under GPL v3.


02 โ€” Why Ether Dream over the network?

๐Ÿ”ท Industry-standard protocol compatibility

MadMapper, Liberation, and dozens of other professional VJ and laser show tools speak Ether Dream natively. By implementing this protocol faithfully, OpenLaserDAC inherits an entire software ecosystem for free โ€” the user gets timeline animation, beat-sync, ILDA file playback, and 3D vector graphics without writing a single line of show code.

๐Ÿ”ท Real-time determinism over Ethernet

Laser galvanometers are mechanical systems: the mirrors must follow the point stream with microsecond-level consistency, or the projected image wobbles, flickers, or the galvos stall. Ethernet's packet-switched delivery would seem ill-suited to this โ€” but the Ether Dream protocol solves it with a deep, flow-controlled ring buffer. OpenLaserDAC implements an 8,192-point lock-free SPSC ring buffer between the Ethernet receive path and the GPTimer ISR that clocks out points to the DAC. The ISR reads from a 1,024-point sub-buffer refilled by a dedicated Core 1 task, achieving < 1 ยตs jitter per point at 10 kHz scan rate.

๐Ÿ”ท Dual network: Ethernet primary, WiFi AP fallback

The firmware tries Ethernet DHCP first (10 s timeout), falls back to static IP 192.168.77.1 if no lease arrives, and keeps a WiFi AP (OpenLaserDAC / openlaser) always running for web interface access and captive portal. This means the device works in any venue โ€” wired shows with MadMapper, and wireless configuration without a laptop in the rig.


03 โ€” System Architecture

 
03 โ€” System Architecture

04 โ€” Why W5500?

๐Ÿ”ท Hardwired TCP/IP with interrupt-driven receive โ€” no CPU overhead for the protocol stack

The Ether Dream protocol runs over TCP. On a software-stack MCU (e.g., ESP32's built-in WiFi with LwIP), TCP processing competes with the application for CPU cycles. The W5500's hardwired TOE (TCP/IP Offload Engine) handles TCP state (SYN/ACK, retransmit, checksumming) entirely in silicon. The ESP32-S3 CPU only touches frames when the W5500 asserts its interrupt pin (GPIO 8), at which point the rx_task (priority 22, above LwIP's internal tasks at priority 20) wakes instantly and drains the 16 KB internal MACRAW RX buffer via SPI before it overflows.

This priority architecture is not incidental โ€” the codebase documents it explicitly:

"CRITICAL: rx_task must be HIGHER priority than both tcpip_task (20) and network_task (19). At priority 15 (the default) it gets preempted while our server processes a large batch, so frames pile up inside the W5500's 16 KB MACRAW RX buffer. An 878-point batch = 11 TCP segments = ~16.4 KB of Ethernet frames โ†’ overflow โ†’ dropped segment โ†’ TCP retransmit after 200โ€“300 ms โ†’ client times out โ†’ disconnect. At priority 22 the ISR wakes rx_task immediately, it reads the frame from SPI in ~30 ยตs, hands it to LWIP, and returns โ€” no starvation."

๐Ÿ”ท W5500 socket mode: TCP (TOE) + embedded Ethernet MAC/PHY via esp_eth_mac_new_w5500

This project uses the W5500 through Espressif's official esp-eth-drivers component (esp_eth_mac_new_w5500 / esp_eth_phy_new_w5500). In this mode, the ESP-IDF Ethernet subsystem manages the W5500 as an external MAC+PHY โ€” the TCP/IP stack remains LwIP on the ESP32 side, but the W5500's internal 32 KB buffer and SPI framing provide deterministic, interrupt-driven frame delivery. The W5500 SPI bus runs at 50 MHz on SPI2_HOST for maximum frame throughput.

๐Ÿ”ท Dual SPI topology: W5500 on SPI2, DAC80508 on SPI3 โ€” zero bus contention

The system has two simultaneous high-speed SPI peripherals:

BusDeviceSpeedFunction
SPI2_HOSTW5500 Ethernet50 MHzNetwork frames (interrupt-driven)
SPI3_HOSTDAC8050850 MHzDAC output (~1 ยตs/point in GPTimer ISR)

Running them on separate SPI hosts means the 10 kHz GPTimer ISR and the Ethernet rx_task never block each other. This is the key hardware insight that makes the design work: the W5500 frees SPI3 for the real-time DAC path entirely.

๐Ÿ”ท Software diagnostic: W5500 Version Register read-back at boot

The firmware performs a direct SPI read of the W5500 Version Register (0x0039, expected 0x04) before handing control to the ESP-IDF driver. If the register returns 0x00 (chip absent or floating SPI lines), the system logs the exact GPIO numbers and aborts Ethernet initialization cleanly, falling back to WiFi-AP-only mode.

๐Ÿ”ท Verified in hardware โœ…

The README badge shows Beta status, and the codebase contains detailed performance tuning comments that are only possible with a real hardware setup โ€” including measured TCP retransmit timings (200โ€“300 ms), SPI transfer timing (~30 ยตs per frame drain), and per-point DAC timing (~1 ยตs).


05 โ€” Key Components

๐ŸŒ WIZnet W5500 โ€” TCP (TOE) Mode via ESP-IDF esp_eth_mac_new_w5500

  • SPI2_HOST, 50 MHz, CS GPIO 16, INT GPIO 8
  • Interrupt-driven receive, rx_task priority 22
  • 16 KB internal W5500 RX buffer โ€” critical for burst absorption during batch delivery

โšก ESP32-S3 (Dual Core, 240 MHz)

  • Core 0: Network stack, Ether Dream TCP/UDP server, HTTP/OTA server, WiFi AP
  • Core 1: GPTimer ISR (DAC output at scan rate), buffer refill task

๐Ÿ”Š DAC80508 (8-channel, 16-bit, SPI)

  • SPI3_HOST, 50 MHz โ€” dedicated bus, zero contention with Ethernet
  • 5 active channels: R/G/B laser + X/Y galvo mirrors
  • ~1 ยตs per point direct SPI write from IRAM ISR

๐Ÿ”„ Lock-Free SPSC Ring Buffer (8,192 points)

  • Atomic load_explicit / store_explicit โ€” no mutex, no blocking
  • 1,024-point ISR sub-buffer for deterministic interrupt latency
  • Refill task on Core 1 bridges ring buffer โ†’ ISR sub-buffer

๐Ÿ–ฅ๏ธ Web Interface + OTA

  • Status dashboard: connection state, buffer level, scan rate, heap
  • OTA firmware upload via HTTP POST โ€” no USB cable after first flash

06 โ€” Application Scenarios

01. Professional Laser Show with MadMapper or Liberation

Connect an RJ45 cable, plug in power, and OpenLaserDAC announces itself via UDP broadcast on port 7654. MadMapper discovers it identically to a hardware Ether Dream. The full Ether Dream command set (PREPARE / BEGIN / DATA / QUEUE_RATE / STOP / E-STOP / CLEAR_E-STOP) is implemented, so beam rate changes mid-show, emergency stops, and multi-universe setups all work as expected.

02. Portable Installation with WiFi-Only

No Ethernet cable on site? OpenLaserDAC falls back to WiFi AP mode (SSID: OpenLaserDAC). The Ether Dream server runs identically over WiFi โ€” useful for compact art installations or temporary outdoor setups where cable routing is impractical.

03. DIY Laser Controller for Galleries and Events

The open BOM (ESP32-S3 dev board + W5500 module + DAC80508 breakout) means a maker can build a field-functional laser controller for under $30 in parts, compatible with the same industry-standard show software used in professional venues. The OTA update system removes the need for USB access after installation.

04. Basis for Custom Protocol Extensions

The firmware roadmap includes IDN (ILDA Digital Network) protocol support, multi-DAC chip compatibility, geometric correction, and color calibration โ€” all on the same hardware. The W5500's deterministic Ethernet link is a prerequisite for any of these: WiFi jitter would break the flow-control model that keeps the ring buffer stable.


Conclusion

OpenLaserDAC is a complete proof-of-concept that a W5500 + ESP32-S3 at commodity cost can replace a dedicated professional laser DAC, without any compromise to the software ecosystem.

  • โœ… Full Ether Dream protocol: TCP + UDP, all commands, complete state machine
  • โœ… W5500 hardwired TCP/IP: interrupt-driven, 50 MHz SPI, priority-tuned rx_task
  • โœ… Dual SPI topology: W5500 on SPI2, DAC80508 on SPI3 โ€” zero contention
  • โœ… Lock-free 8,192-point ring buffer with 1,024-point ISR sub-buffer
  • โœ… GPTimer ISR: scan rates 1โ€“100 kHz, ~1 ยตs/point DAC output
  • โœ… WiFi AP always-on fallback with captive portal
  • โœ… OTA firmware update over HTTP โ€” no USB cable after first flash
  • โœ… Web dashboard: real-time buffer level, scan rate, heap, connection state
  • โœ… GPL v3 โ€” fully open, extensible, portable

The W5500 isn't just convenient here โ€” its hardwired TCP/IP and interrupt-driven frame delivery are load-bearing. Without deterministic Ethernet, the tight timing coupling between the show software's flow control and the DAC's point consumption would collapse. Laser show control is also the kind of project that uses W5500.


07 โ€” Similar Projects on WIZnet Makers

OpenLaserDAC is the first and only laser DAC project on the platform. The closest neighbors by W5500 usage are LED lighting controllers built on ArtNet, a completely different protocol. Two representative examples:

ProjectWIZnet ChipProtocolOutputNotes
OpenPixelNodeW5500ArtNet (UDP)WS2812 / DMX4-universe LED controller, open hardware PCB
2040-ArtNodeW5500ArtNet (UDP)WS281xKiCad PCB, RP2040 + W5500

These are fundamentally different applications. ArtNet is a UDP-based protocol for broadcasting DMX512 lighting values to LED fixtures โ€” it is connectionless, stateless, and tolerant of occasional packet loss (an LED strip that flickers for one frame is acceptable). Ether Dream is a TCP-based streaming protocol with explicit flow control, designed for analog galvanometer mirrors that must follow a continuous point stream with no interruption โ€” a 200 ms TCP gap produces a visible mirror stall or overshoot. The two share only the fact that they carry lighting-related data over Ethernet.

What the comparison reveals is the breadth of W5500 deployments across the creative lighting stack: from pixel LED arrays driven by ArtNet UDP, all the way to analog mirror-and-beam laser systems driven by Ether Dream TCP. Both ends of that spectrum use W5500.


Q&A

Q: How does the W5500 mode differ from a typical ArtNet/UDP project on WIZnet Makers? A: Most ArtNet LED controllers on the platform use W5500 in UDP socket mode (Sn_MR_UDP) for ArtNet, where the protocol is connectionless and frame loss causes visible LED flicker but not system failure. OpenLaserDAC uses W5500 through the ESP-IDF driver as an external Ethernet MAC/PHY with TCP (SOCK_STREAM), because the Ether Dream flow-control model depends on TCP ACKs to pace the show software's data rate to the DAC's consumption rate. Laser galvos have zero tolerance for stream interruption โ€” a 200 ms TCP retransmit stall would produce a visible galvo freeze or mirror overshoot.

Q: Can the scan rate be changed mid-show? A: Yes. The Ether Dream QUEUE_RATE command queues a rate change that takes effect at the next point with POINT_CONTROL_RATE_CHANGE set in its control field. The firmware implements a 16-slot rate change queue, allowing show software to schedule smooth rate transitions without dropping the connection.

Q: What happens if the W5500 is not connected? A: The boot sequence reads the W5500 Version Register directly over SPI at 1 MHz before handing control to the ESP-IDF driver. If the register returns 0x00, Ethernet initialization is aborted cleanly, the SPI GPIOs are "parked" (driven low to prevent RF noise near the WiFi antenna), and the system boots in WiFi-AP-only mode. The Ether Dream server still starts and is accessible over WiFi.


Original Link: https://github.com/gabgabe/OpenLaserDAC



OpenLaserDAC โ€” $10 ์งœ๋ฆฌ ์นฉ์œผ๋กœ ์ „๋ฌธ ๋ ˆ์ด์ € ์‡ผ ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“ค๊ธฐ

#LaserDAC #EtherDream #ESP32-S3 #W5500 #UDP #TCP-TOE #ILDA #์˜คํ”ˆ์†Œ์Šค #์‹ค์‹œ๊ฐ„ #๋“€์–ผ์ฝ”์–ด

๐Ÿ“š ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์ด์ปค/์ทจ๋ฏธ ํ”„๋กœ์ ํŠธ โ€” ๋ ˆ์ด์ € ์‡ผ ์ œ์–ด ํ•˜๋“œ์›จ์–ด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ง์ ‘ ๊ตฌํ˜„ โœ… ์™„์ „ํžˆ ๊ตฌํ˜„๋จ: ์ „์ฒด C ์ฝ”๋“œ๋ฒ ์ด์Šค(ESP-IDF), PlatformIO ๋นŒ๋“œ, ํ•˜๋“œ์›จ์–ด ํ•€๋งต, OTA ์—…๋ฐ์ดํŠธ โ€” ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๊ฒ€์ฆ


01 โ€” ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

 

01 โ€” ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

๋ ˆ์ด์ € ์‡ผ ์ œ์–ด๋Š” ์˜ค๋žซ๋™์•ˆ ๊ณ ๊ฐ€์˜ ์ „๋ฌธ ์žฅ๋น„ ์˜์—ญ์ด์—ˆ๋‹ค. Ether Dream์€ ์—…๊ณ„ ํ‘œ์ค€ ์˜คํ”ˆ ๋ ˆ์ด์ € DAC์ด๋‹ค. ์‡ผ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ILDA(๊ตญ์ œ ๋ ˆ์ด์ € ๋””์Šคํ”Œ๋ ˆ์ด ํ˜‘ํšŒ) ํฌ์ธํŠธ ์ŠคํŠธ๋ฆผ์„ Ethernet์œผ๋กœ ์ „์†กํ•˜๋ฉด, ์ด ์žฅ์น˜๊ฐ€ ๋ ˆ์ด์ € ํ”„๋กœ์ ํ„ฐ์˜ ๊ฐˆ๋ฐ”๋…ธ๋ฏธํ„ฐ ๊ฑฐ์šธ๊ณผ R/G/B ์ƒ‰์ƒ ์ฑ„๋„์„ ์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ ์ด๋‚ด์˜ ์ •๋ฐ€๋„๋กœ ๊ตฌ๋™ํ•œ๋‹ค. ์‹ค์ œ Ether Dream ์žฅ๋น„๋Š” ์ˆ˜๋ฐฑ ๋‹ฌ๋Ÿฌ์— ๋‹ฌํ•˜๋ฉฐ, ์ „์šฉ Ethernet ๋งํฌ์—์„œ ๋…์ž์ ์ธ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ๋กœ ๋™์ž‘ํ•œ๋‹ค.

OpenLaserDAC๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ ESP32-S3 ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ์™€ W5500 Ethernet ์นฉ์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ํŽŒ์›จ์–ด๋Š” Ether Dream ํ”„๋กœํ† ์ฝœ ์ „์ฒด๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค โ€” TCP ๋ช…๋ น ์ฑ„๋„(ํฌํŠธ 7765), UDP ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋””์Šค์ปค๋ฒ„๋ฆฌ(ํฌํŠธ 7654), ์™„์ „ํ•œ ์ƒํƒœ ๋จธ์‹ (Idle โ†’ Prepared โ†’ Playing โ†’ E-Stop). ๊ธฐ์กด ์‡ผ ์†Œํ”„ํŠธ์›จ์–ด(MadMapper, Liberation, ๊ธฐํƒ€ Ether Dream ํด๋ผ์ด์–ธํŠธ)๋Š” ์ˆ˜์ • ์—†์ด ๊ทธ๋Œ€๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. ์ถœ๋ ฅ ์ธก์—์„œ๋Š” DAC80508 8์ฑ„๋„ 16๋น„ํŠธ SPI DAC๊ฐ€ X/Y ๊ฐˆ๋ณด ๋ฏธ๋Ÿฌ์™€ R/G/B ๋ ˆ์ด์ € ๋น”์„ 1 kHz~100 kHz ์Šค์บ” ๋ ˆ์ดํŠธ๋กœ ๊ตฌ๋™ํ•œ๋‹ค.

๊ฒฐ๊ณผ: ์ƒ์šฉ ๋Œ€๋น„ ๋ช‡ ๋ถ„์˜ 1 ๋น„์šฉ์œผ๋กœ, ์ „๋ฌธ ์กฐ๋ช… ์ƒํƒœ๊ณ„์™€ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๋Š”, GPL v3 ์˜คํ”ˆ์†Œ์Šค ๋ ˆ์ด์ € DAC ์™„์„ฑ.


02 โ€” ์™œ Ether Dream์ธ๊ฐ€?

๐Ÿ”ท ์—…๊ณ„ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ ํ˜ธํ™˜์„ฑ

MadMapper, Liberation ๋“ฑ ์ˆ˜์‹ญ ์ข…์˜ ์ „๋ฌธ VJยท๋ ˆ์ด์ € ์‡ผ ๋„๊ตฌ๊ฐ€ Ether Dream์„ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•œ๋‹ค. ์ด ํ”„๋กœํ† ์ฝœ์„ ์ถฉ์‹คํžˆ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ OpenLaserDAC๋Š” ๊ฑฐ๋Œ€ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์ƒํƒœ๊ณ„๋ฅผ ๋ฌด์ƒ์œผ๋กœ ์ƒ์†๋ฐ›๋Š”๋‹ค โ€” ํƒ€์ž„๋ผ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„ํŠธ ์‹ฑํฌ, ILDA ํŒŒ์ผ ์žฌ์ƒ, 3D ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ ๋“ฑ์„ ๋ณ„๋„์˜ ์‡ผ ์ฝ”๋“œ ์—†์ด ๋ฐ”๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ท Ethernet์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ๊ฒฐ์ •๋ก 

๋ ˆ์ด์ € ๊ฐˆ๋ฐ”๋…ธ๋ฏธํ„ฐ๋Š” ๊ธฐ๊ณ„์  ์‹œ์Šคํ…œ์ด๋‹ค. ๋ฏธ๋Ÿฌ๋Š” ํฌ์ธํŠธ ์ŠคํŠธ๋ฆผ์„ ๋งˆ์ดํฌ๋กœ์ดˆ ์ˆ˜์ค€์˜ ์ผ๊ด€์„ฑ์œผ๋กœ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•œ๋‹ค โ€” ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํˆฌ์˜ ์ด๋ฏธ์ง€๊ฐ€ ํ”๋“ค๋ฆฌ๊ฑฐ๋‚˜ ๊ฐˆ๋ณด๊ฐ€ ๋ฉˆ์ถ˜๋‹ค. Ethernet์˜ ํŒจํ‚ท ์Šค์œ„์นญ ํŠน์„ฑ์ด ์ด์— ๋ถˆ๋ฆฌํ•ด ๋ณด์ด์ง€๋งŒ, Ether Dream ํ”„๋กœํ† ์ฝœ์€ ๊นŠ์€ ํ”Œ๋กœ์šฐ ์ œ์–ด ๋ง ๋ฒ„ํผ๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. OpenLaserDAC๋Š” Ethernet ์ˆ˜์‹  ๊ฒฝ๋กœ์™€ GPTimer ISR(DAC ํฌ์ธํŠธ ์ถœ๋ ฅ ํด๋Ÿญ) ์‚ฌ์ด์— 8,192ํฌ์ธํŠธ ๋ฝํ”„๋ฆฌ SPSC ๋ง ๋ฒ„ํผ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ISR์€ Core 1์˜ ๋ฆฌํ•„ ํƒœ์Šคํฌ๊ฐ€ ์ฑ„์šฐ๋Š” 1,024ํฌ์ธํŠธ ์„œ๋ธŒ ๋ฒ„ํผ์—์„œ ์ฝ์–ด 10 kHz ์Šค์บ” ๋ ˆ์ดํŠธ์—์„œ ํฌ์ธํŠธ๋‹น < 1 ยตs ์ง€ํ„ฐ๋ฅผ ๋‹ฌ์„ฑํ•œ๋‹ค.

๐Ÿ”ท ๋“€์–ผ ๋„คํŠธ์›Œํฌ: Ethernet ์šฐ์„ , WiFi AP ํด๋ฐฑ

ํŽŒ์›จ์–ด๋Š” Ethernet DHCP๋ฅผ ๋จผ์ € ์‹œ๋„ํ•˜๊ณ (10์ดˆ ํƒ€์ž„์•„์›ƒ), ์ž„๋Œ€๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ •์  IP 192.168.77.1๋กœ ํด๋ฐฑํ•œ๋‹ค. WiFi AP(OpenLaserDAC / openlaser)๋Š” ํ•ญ์ƒ ์ผœ์ ธ ์žˆ์–ด ์›น ์ธํ„ฐํŽ˜์ด์Šค ์ ‘๊ทผ๊ณผ ์บกํ‹ฐ๋ธŒ ํฌํ„ธ์„ ์ œ๊ณตํ•œ๋‹ค. ์œ ์„  ์‡ผ์™€ ๋ฌด์„  ์„ค์ • ๋ชจ๋‘๋ฅผ ์ปค๋ฒ„ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค.


03 โ€” ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

03 โ€” ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

04 โ€” ์™œ W5500์ธ๊ฐ€?

๐Ÿ”ท ํ•˜๋“œ์›จ์–ด TCP/IP โ€” CPU ํ”„๋กœํ† ์ฝœ ์Šคํƒ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์Œ

Ether Dream ํ”„๋กœํ† ์ฝœ์€ TCP ์œ„์—์„œ ๋™์ž‘ํ•œ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ์Šคํƒ MCU(์˜ˆ: WiFi + LwIP)์—์„œ๋Š” TCP ์ฒ˜๋ฆฌ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ CPU๋ฅผ ๊ณต์œ ํ•œ๋‹ค. W5500์˜ ํ•˜๋“œ์™€์ด์–ด๋“œ TOE(TCP/IP Offload Engine)๋Š” TCP ์ƒํƒœ ๊ด€๋ฆฌ(SYN/ACK, ์žฌ์ „์†ก, ์ฒดํฌ์„ฌ)๋ฅผ ์‹ค๋ฆฌ์ฝ˜์—์„œ ์™„์ „ํžˆ ์ฒ˜๋ฆฌํ•œ๋‹ค. ESP32-S3 CPU๋Š” W5500์ด ์ธํ„ฐ๋ŸฝํŠธ ํ•€(GPIO 8)์„ ์–ด์„œํŠธํ•  ๋•Œ๋งŒ ํ”„๋ ˆ์ž„์— ์ ‘๊ทผํ•˜๋ฉฐ, rx_task(์šฐ์„ ์ˆœ์œ„ 22, LwIP ๋‚ด๋ถ€ ํƒœ์Šคํฌ ์šฐ์„ ์ˆœ์œ„ 20๋ณด๋‹ค ๋†’์Œ)๊ฐ€ ์ฆ‰์‹œ ๊นจ์–ด๋‚˜ W5500์˜ 16 KB ๋‚ด๋ถ€ RX ๋ฒ„ํผ๋ฅผ SPI๋กœ ๋“œ๋ ˆ์ธํ•œ๋‹ค.

์ด ์šฐ์„ ์ˆœ์œ„ ์„ค๊ณ„๋Š” ๋‹จ์ˆœํ•œ ์„ค์ •๊ฐ’์ด ์•„๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์žˆ๋‹ค: ๊ธฐ๋ณธ ์šฐ์„ ์ˆœ์œ„ 15์—์„œ๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ค‘ rx_task๊ฐ€ ์„ ์ ๋˜์–ด W5500 ๋‚ด๋ถ€ ๋ฒ„ํผ(16 KB)๊ฐ€ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐํ•˜๊ณ , 878ํฌ์ธํŠธ ๋ฐฐ์น˜(= TCP ์„ธ๊ทธ๋จผํŠธ 11๊ฐœ = ์•ฝ 16.4 KB ์ด๋”๋„ท ํ”„๋ ˆ์ž„)๊ฐ€ ๋ฒ„ํผ๋ฅผ ๋„˜์ณ TCP ์žฌ์ „์†ก(200~300 ms)๊ณผ ํด๋ผ์ด์–ธํŠธ ํƒ€์ž„์•„์›ƒ์„ ์œ ๋ฐœํ•œ๋‹ค. ์šฐ์„ ์ˆœ์œ„ 22์—์„œ๋Š” ISR์ด rx_task๋ฅผ ์ฆ‰์‹œ ๊นจ์šฐ๊ณ , ์•ฝ 30 ยตs ๋งŒ์— SPI ๋“œ๋ ˆ์ธ์„ ์™„๋ฃŒํ•œ๋‹ค.

๐Ÿ”ท W5500 ์†Œ์ผ“ ๋ชจ๋“œ: TCP(TOE) โ€” esp_eth_mac_new_w5500

์ด ํ”„๋กœ์ ํŠธ๋Š” Espressif ๊ณต์‹ esp-eth-drivers ์ปดํฌ๋„ŒํŠธ(esp_eth_mac_new_w5500 / esp_eth_phy_new_w5500)๋ฅผ ํ†ตํ•ด W5500์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ ESP-IDF Ethernet ์„œ๋ธŒ์‹œ์Šคํ…œ์€ W5500์„ ์™ธ๋ถ€ MAC+PHY๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, TCP/IP ์Šคํƒ์€ ESP32 ์ธก LwIP์—์„œ ๋™์ž‘ํ•˜์ง€๋งŒ W5500์˜ ๋‚ด๋ถ€ 32 KB ๋ฒ„ํผ์™€ SPI ํ”„๋ ˆ์ด๋ฐ์ด ์ธํ„ฐ๋ŸฝํŠธ ๊ตฌ๋™ ํ”„๋ ˆ์ž„ ์ „๋‹ฌ์„ ๋ณด์žฅํ•œ๋‹ค. W5500 SPI ๋ฒ„์Šค๋Š” SPI2_HOST์—์„œ 50 MHz๋กœ ์šด์šฉ๋œ๋‹ค.

๐Ÿ”ท ๋“€์–ผ SPI ํ† ํด๋กœ์ง€: W5500(SPI2) + DAC80508(SPI3) โ€” ๋ฒ„์Šค ๊ฒฝ์Ÿ ์—†์Œ

์‹œ์Šคํ…œ์—๋Š” ๋‘ ๊ฐœ์˜ ๊ณ ์† SPI ํŽ˜๋ฆฌํผ๋Ÿด์ด ๋™์‹œ์— ๋™์ž‘ํ•œ๋‹ค:

๋ฒ„์Šค๋””๋ฐ”์ด์Šค์†๋„๊ธฐ๋Šฅ
SPI2_HOSTW5500 Ethernet50 MHz๋„คํŠธ์›Œํฌ ํ”„๋ ˆ์ž„ (์ธํ„ฐ๋ŸฝํŠธ ๊ตฌ๋™)
SPI3_HOSTDAC8050850 MHzDAC ์ถœ๋ ฅ (~1 ยตs/ํฌ์ธํŠธ, GPTimer ISR)

๋ณ„๋„ SPI ํ˜ธ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ 10 kHz GPTimer ISR๊ณผ Ethernet rx_task๊ฐ€ ์„œ๋กœ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒƒ์ด ์ด ์„ค๊ณ„์˜ ํ•ต์‹ฌ ํ•˜๋“œ์›จ์–ด ํ†ต์ฐฐ์ด๋‹ค โ€” W5500์ด SPI3๋ฅผ ์‹ค์‹œ๊ฐ„ DAC ๊ฒฝ๋กœ์— ์™„์ „ํžˆ ๊ฐœ๋ฐฉํ•œ๋‹ค.

๐Ÿ”ท ๋ถ€ํŠธ ์‹œ W5500 Version Register ์ฝ๊ธฐ ๊ฒ€์ฆ

ํŽŒ์›จ์–ด๋Š” ESP-IDF ๋“œ๋ผ์ด๋ฒ„์— ์ œ์–ด๊ถŒ์„ ๋„˜๊ธฐ๊ธฐ ์ „์— 1 MHz SPI๋กœ W5500 Version Register(0x0039, ์˜ˆ์ƒ๊ฐ’ 0x04)๋ฅผ ์ง์ ‘ ์ฝ๋Š”๋‹ค. 0x00์ด ๋ฐ˜ํ™˜๋˜๋ฉด(์นฉ ์—†์Œ ๋˜๋Š” SPI ๋ผ์ธ ๋ถ€์œ ) Ethernet ์ดˆ๊ธฐํ™”๋ฅผ ์ค‘๋‹จํ•˜๊ณ  WiFi AP ์ „์šฉ ๋ชจ๋“œ๋กœ ํด๋ฐฑํ•œ๋‹ค.

๐Ÿ”ท ์‹ค์ œ ํ•˜๋“œ์›จ์–ด์—์„œ ๊ฒ€์ฆ๋จ โœ…

์ฝ”๋“œ๋ฒ ์ด์Šค์—๋Š” ์‹ค์ œ ํ•˜๋“œ์›จ์–ด ์—†์ด๋Š” ์•Œ ์ˆ˜ ์—†๋Š” ์„ฑ๋Šฅ ํŠœ๋‹ ์ฃผ์„์ด ์ƒ์„ธํžˆ ๊ธฐ๋ก๋˜์–ด ์žˆ๋‹ค โ€” TCP ์žฌ์ „์†ก ํƒ€์ด๋ฐ(200~300 ms), SPI ํ”„๋ ˆ์ž„ ๋“œ๋ ˆ์ธ ํƒ€์ด๋ฐ(~30 ยตs), ํฌ์ธํŠธ๋‹น DAC ํƒ€์ด๋ฐ(~1 ยตs)์˜ ์‹ค์ธก๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.


05 โ€” ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ

๐ŸŒ WIZnet W5500 โ€” TCP(TOE) ๋ชจ๋“œ (esp_eth_mac_new_w5500)

  • SPI2_HOST, 50 MHz, CS GPIO 16, INT GPIO 8
  • ์ธํ„ฐ๋ŸฝํŠธ ๊ตฌ๋™ ์ˆ˜์‹ , rx_task ์šฐ์„ ์ˆœ์œ„ 22
  • ๋‚ด๋ถ€ 16 KB RX ๋ฒ„ํผ โ€” ๋ฐฐ์น˜ ์ „๋‹ฌ ์‹œ ๋ฒ„์ŠคํŠธ ํก์ˆ˜์— ๊ฒฐ์ •์ 

โšก ESP32-S3 (๋“€์–ผ ์ฝ”์–ด, 240 MHz)

  • Core 0: ๋„คํŠธ์›Œํฌ ์Šคํƒ, Ether Dream TCP/UDP ์„œ๋ฒ„, HTTP/OTA ์„œ๋ฒ„, WiFi AP
  • Core 1: GPTimer ISR(DAC ์ถœ๋ ฅ), ๋ฒ„ํผ ๋ฆฌํ•„ ํƒœ์Šคํฌ

๐Ÿ”Š DAC80508 (8์ฑ„๋„, 16๋น„ํŠธ, SPI)

  • SPI3_HOST, 50 MHz โ€” ์ „์šฉ ๋ฒ„์Šค, Ethernet๊ณผ ๊ฒฝ์Ÿ ์—†์Œ
  • ํ™œ์„ฑ ์ฑ„๋„ 5๊ฐœ: R/G/B ๋ ˆ์ด์ € + X/Y ๊ฐˆ๋ณด ๋ฏธ๋Ÿฌ
  • IRAM ISR์—์„œ ~1 ยตs/ํฌ์ธํŠธ ์ง์ ‘ SPI ์“ฐ๊ธฐ

๐Ÿ”„ ๋ฝํ”„๋ฆฌ SPSC ๋ง ๋ฒ„ํผ (8,192ํฌ์ธํŠธ)

  • load_explicit / store_explicit ์›์ž ์—ฐ์‚ฐ โ€” ๋ฎคํ…์Šค ์—†์Œ, ๋ธ”๋กœํ‚น ์—†์Œ
  • 1,024ํฌ์ธํŠธ ISR ์„œ๋ธŒ ๋ฒ„ํผ๋กœ ์ธํ„ฐ๋ŸฝํŠธ ๋ ˆ์ดํ„ด์‹œ ๊ฒฐ์ •๋ก  ๋ณด์žฅ
  • Core 1 ๋ฆฌํ•„ ํƒœ์Šคํฌ๊ฐ€ ๋ง ๋ฒ„ํผ โ†’ ISR ์„œ๋ธŒ ๋ฒ„ํผ๋ฅผ ๋ธŒ๋ฆฌ์ง€

๐Ÿ–ฅ๏ธ ์›น ์ธํ„ฐํŽ˜์ด์Šค + OTA

  • ์ƒํƒœ ๋Œ€์‹œ๋ณด๋“œ: ์—ฐ๊ฒฐ ์ƒํƒœ, ๋ฒ„ํผ ๋ ˆ๋ฒจ, ์Šค์บ” ๋ ˆ์ดํŠธ, ํž™
  • HTTP POST OTA ํŽŒ์›จ์–ด ์—…๋กœ๋“œ โ€” ์ตœ์ดˆ ํ”Œ๋ž˜์‹œ ์ดํ›„ USB ์ผ€์ด๋ธ” ๋ถˆํ•„์š”

06 โ€” ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

01. MadMapper / Liberation์œผ๋กœ ์ „๋ฌธ ๋ ˆ์ด์ € ์‡ผ

RJ45 ์ผ€์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜๊ณ  ์ „์›์„ ์ผœ๋ฉด OpenLaserDAC๊ฐ€ ํฌํŠธ 7654 UDP ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋กœ ์ž์‹ ์„ ์•Œ๋ฆฐ๋‹ค. MadMapper๋Š” ํ•˜๋“œ์›จ์–ด Ether Dream๊ณผ ๋™์ผํ•˜๊ฒŒ ์ธ์‹ํ•œ๋‹ค. ์‡ผ ์ค‘ ๋น” ๋ ˆ์ดํŠธ ๋ณ€๊ฒฝ, ๊ธด๊ธ‰ ์ •์ง€, ๋ฉ€ํ‹ฐ ์œ ๋‹ˆ๋ฒ„์Šค ์„ค์ •์ด ๋ชจ๋‘ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.

02. WiFi ์ „์šฉ ํฌํ„ฐ๋ธ” ์„ค์น˜

ํ˜„์žฅ์— Ethernet ์ผ€์ด๋ธ”์ด ์—†์–ด๋„ WiFi AP ๋ชจ๋“œ๋กœ ํด๋ฐฑ(SSID: OpenLaserDAC)ํ•œ๋‹ค. Ether Dream ์„œ๋ฒ„๊ฐ€ ๋™์ผํ•˜๊ฒŒ WiFi ์œ„์—์„œ ๋™์ž‘ํ•œ๋‹ค โ€” ์ผ€์ด๋ธ” ๋ฐฐ์„ ์ด ์–ด๋ ค์šด ๊ฐค๋Ÿฌ๋ฆฌ๋‚˜ ์•ผ์™ธ ์ž„์‹œ ์„ค์น˜์— ์ ํ•ฉํ•˜๋‹ค.

03. ์ „์‹œยท์ด๋ฒคํŠธ์šฉ DIY ๋ ˆ์ด์ € ์ปจํŠธ๋กค๋Ÿฌ

ESP32-S3 ๊ฐœ๋ฐœ ๋ณด๋“œ + W5500 ๋ชจ๋“ˆ + DAC80508 ๋ธŒ๋ ˆ์ดํฌ์•„์›ƒ์œผ๋กœ $30 ๋ฏธ๋งŒ์˜ ๋ถ€ํ’ˆ BOM์œผ๋กœ ์ „๋ฌธ ์‡ผ ์†Œํ”„ํŠธ์›จ์–ด์™€ ์™„์ „ ํ˜ธํ™˜๋˜๋Š” ๋ ˆ์ด์ € ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. OTA ์—…๋ฐ์ดํŠธ๋กœ ์„ค์น˜ ํ›„ USB ์—†์ด ํŽŒ์›จ์–ด๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

04. ์ปค์Šคํ…€ ํ”„๋กœํ† ์ฝœ ํ™•์žฅ ๊ธฐ๋ฐ˜

ํŽŒ์›จ์–ด ๋กœ๋“œ๋งต์— IDN(ILDA Digital Network) ํ”„๋กœํ† ์ฝœ, ๋‹ค์ค‘ DAC ์นฉ ์ง€์›, ๊ธฐํ•˜ ๋ณด์ •, ์ƒ‰์ƒ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. W5500์˜ ๊ฒฐ์ •๋ก ์  Ethernet ๋งํฌ๋Š” ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ์˜ ์ „์ œ ์กฐ๊ฑด์ด๋‹ค โ€” WiFi ์ง€ํ„ฐ๋Š” ๋ง ๋ฒ„ํผ ํ”Œ๋กœ์šฐ ์ œ์–ด ๋ชจ๋ธ์„ ๋ถ•๊ดด์‹œํ‚จ๋‹ค.


Conclusion

OpenLaserDAC๋Š” W5500 + ESP32-S3๋ฅผ ์กฐํ•ฉํ•ด ์ƒ์šฉ ์ „๋ฌธ ๋ ˆ์ด์ € DAC๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด ์ƒํƒœ๊ณ„ ํ˜ธํ™˜์„ฑ ์†์‹ค ์—†์ด ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ์„ ์™„์ „ํžˆ ์ฆ๋ช…ํ•œ ํ”„๋กœ์ ํŠธ๋‹ค.

  • โœ… Ether Dream ํ”„๋กœํ† ์ฝœ ์™„์ „ ๊ตฌํ˜„: TCP + UDP, ์ „์ฒด ๋ช…๋ น์…‹, ์™„์ „ํ•œ ์ƒํƒœ ๋จธ์‹ 
  • โœ… W5500 ํ•˜๋“œ์™€์ด์–ด๋“œ TCP/IP: ์ธํ„ฐ๋ŸฝํŠธ ๊ตฌ๋™, 50 MHz SPI, ์šฐ์„ ์ˆœ์œ„ ํŠœ๋‹๋œ rx_task
  • โœ… ๋“€์–ผ SPI ํ† ํด๋กœ์ง€: W5500(SPI2) + DAC80508(SPI3) โ€” ๊ฒฝ์Ÿ ์—†์Œ
  • โœ… ๋ฝํ”„๋ฆฌ 8,192ํฌ์ธํŠธ ๋ง ๋ฒ„ํผ + 1,024ํฌ์ธํŠธ ISR ์„œ๋ธŒ ๋ฒ„ํผ
  • โœ… GPTimer ISR: 1~100 kHz ์Šค์บ” ๋ ˆ์ดํŠธ, ~1 ยตs/ํฌ์ธํŠธ DAC ์ถœ๋ ฅ
  • โœ… WiFi AP ์ƒ์‹œ ์ผœ์ง ํด๋ฐฑ + ์บกํ‹ฐ๋ธŒ ํฌํ„ธ
  • โœ… HTTP OTA ํŽŒ์›จ์–ด ์—…๋ฐ์ดํŠธ โ€” ์ตœ์ดˆ ํ”Œ๋ž˜์‹œ ์ดํ›„ USB ๋ถˆํ•„์š”
  • โœ… ์‹ค์‹œ๊ฐ„ ๋Œ€์‹œ๋ณด๋“œ: ๋ฒ„ํผ ๋ ˆ๋ฒจ, ์Šค์บ” ๋ ˆ์ดํŠธ, ํž™, ์—ฐ๊ฒฐ ์ƒํƒœ
  • โœ… GPL v3 โ€” ์™„์ „ ์˜คํ”ˆ, ํ™•์žฅ ๊ฐ€๋Šฅ, ํฌํ„ฐ๋ธ”

W5500์€ ๋‹จ์ˆœํžˆ ํŽธ๋ฆฌํ•œ ์„ ํƒ์ด ์•„๋‹ˆ๋‹ค โ€” ํ•˜๋“œ์™€์ด์–ด๋“œ TCP/IP์™€ ์ธํ„ฐ๋ŸฝํŠธ ๊ตฌ๋™ ํ”„๋ ˆ์ž„ ์ „๋‹ฌ์ด ๊ตฌ์กฐ์ ์œผ๋กœ ํ•„์ˆ˜๋‹ค. ๋ ˆ์ด์ € ์‡ผ ์ œ์–ด ๋˜ํ•œ W5500์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋‹ค.


07 โ€” WIZnet Makers์˜ ์œ ์‚ฌ ํ”„๋กœ์ ํŠธ

OpenLaserDAC๋Š” ํ”Œ๋žซํผ ์ตœ์ดˆ์ด์ž ์œ ์ผํ•œ ๋ ˆ์ด์ € DAC ํ”„๋กœ์ ํŠธ๋‹ค. W5500 ์‚ฌ์šฉ์ด๋ผ๋Š” ์ ‘์ ์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ์€ ArtNet ๊ธฐ๋ฐ˜์˜ LED ์กฐ๋ช… ์ปจํŠธ๋กค๋Ÿฌ๋“ค์ด๋‹ค. ๋Œ€ํ‘œ ์‚ฌ๋ก€ ๋‘ ๊ฐ€์ง€:

ํ”„๋กœ์ ํŠธWIZnet ์นฉํ”„๋กœํ† ์ฝœ์ถœ๋ ฅ๋น„๊ณ 
OpenPixelNodeW5500ArtNet (UDP)WS2812 / DMX4์œ ๋‹ˆ๋ฒ„์Šค LED ์ปจํŠธ๋กค๋Ÿฌ, ์˜คํ”ˆ ํ•˜๋“œ์›จ์–ด PCB
2040-ArtNodeW5500ArtNet (UDP)WS281xKiCad PCB, RP2040 + W5500

์ด ๋‘˜์€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์‘์šฉ์ด๋‹ค. ArtNet์€ UDP ๊ธฐ๋ฐ˜์˜ DMX512 ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ”„๋กœํ† ์ฝœ๋กœ, ๋น„์—ฐ๊ฒฐ์‹ยท๋ฌด์ƒํƒœ์ด๋ฉฐ ํŒจํ‚ท ์†์‹ค์„ ํ—ˆ์šฉํ•œ๋‹ค(LED ์ŠคํŠธ๋ฆฝ์ด ํ•œ ํ”„๋ ˆ์ž„ ๊นœ๋นก์ด๋Š” ๊ฒƒ์€ ์ˆ˜์šฉ ๊ฐ€๋Šฅ). Ether Dream์€ ๋ช…์‹œ์  ํ”Œ๋กœ์šฐ ์ œ์–ด๋ฅผ ๊ฐ–์ถ˜ TCP ์ŠคํŠธ๋ฆฌ๋ฐ ํ”„๋กœํ† ์ฝœ๋กœ, ์ค‘๋‹จ ์—†๋Š” ์—ฐ์† ํฌ์ธํŠธ ์ŠคํŠธ๋ฆผ์„ ์š”๊ตฌํ•˜๋Š” ์•„๋‚ ๋กœ๊ทธ ๊ฐˆ๋ฐ”๋…ธ๋ฏธํ„ฐ ๋ฏธ๋Ÿฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋๋‹ค โ€” TCP 200 ms ๊ณต๋ฐฑ์€ ๋ฏธ๋Ÿฌ์˜ ๊ฐ€์‹œ์  ๋ฉˆ์ถค์ด๋‚˜ ์˜ค๋ฒ„์ŠˆํŠธ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค. ๋‘ ํ”„๋กœํ† ์ฝœ์˜ ๊ณตํ†ต์ ์€ ์กฐ๋ช… ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ Ethernet์œผ๋กœ ์ „์†กํ•œ๋‹ค๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.

์ด ๋น„๊ต๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์€ W5500์ด ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ์กฐ๋ช… ์Šคํƒ์˜ ์–‘ ๊ทน๋‹จ์„ ๋ชจ๋‘ ์ปค๋ฒ„ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค: ArtNet UDP๋กœ ๊ตฌ๋™ํ•˜๋Š” ํ”ฝ์…€ LED ์–ด๋ ˆ์ด๋ถ€ํ„ฐ, Ether Dream TCP๋กœ ๊ตฌ๋™ํ•˜๋Š” ์•„๋‚ ๋กœ๊ทธ ๋ฏธ๋Ÿฌยท๋น” ๋ ˆ์ด์ € ์‹œ์Šคํ…œ๊นŒ์ง€. ๊ทธ ์ŠคํŽ™ํŠธ๋Ÿผ์˜ ์–‘ ๋ ๋ชจ๋‘ W5500์„ ์‚ฌ์šฉํ•œ๋‹ค.


Q&A

Q: W5500 ๋ชจ๋“œ๊ฐ€ ํ”Œ๋žซํผ์˜ ์ผ๋ฐ˜์ ์ธ ArtNet/UDP ํ”„๋กœ์ ํŠธ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? A: ํ”Œ๋žซํผ์˜ ๋Œ€๋ถ€๋ถ„ ArtNet LED ์ปจํŠธ๋กค๋Ÿฌ๋Š” W5500์„ UDP ์†Œ์ผ“ ๋ชจ๋“œ(Sn_MR_UDP)๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ์ด ๋น„์—ฐ๊ฒฐ์‹์ด์–ด์„œ ํ”„๋ ˆ์ž„ ์†์‹ค์ด LED ๊นœ๋นก์ž„์„ ์œ ๋ฐœํ•˜์ง€๋งŒ ์‹œ์Šคํ…œ ์‹คํŒจ๋กœ ์ด์–ด์ง€์ง€๋Š” ์•Š๋Š”๋‹ค. OpenLaserDAC๋Š” ESP-IDF ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด W5500์„ ์™ธ๋ถ€ Ethernet MAC/PHY๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ TCP(SOCK_STREAM)๋ฅผ ์ ์šฉํ•œ๋‹ค. Ether Dream ํ”Œ๋กœ์šฐ ์ œ์–ด ๋ชจ๋ธ์ด TCP ACK์— ์˜์กดํ•ด ์‡ผ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ฐ์ดํ„ฐ ์ „์†ก ์†๋„๋ฅผ DAC ์†Œ๋น„ ์†๋„์— ๋งž์ถ”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ ˆ์ด์ € ๊ฐˆ๋ณด๋Š” ์ŠคํŠธ๋ฆผ ์ค‘๋‹จ์„ ์ „ํ˜€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

Q: ์‡ผ ๋„์ค‘ ์Šค์บ” ๋ ˆ์ดํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? A: ๊ฐ€๋Šฅํ•˜๋‹ค. Ether Dream์˜ QUEUE_RATE ๋ช…๋ น์ด ๋ ˆ์ดํŠธ ๋ณ€๊ฒฝ์„ ํ์— ๋„ฃ๊ณ , POINT_CONTROL_RATE_CHANGE ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ ๋‹ค์Œ ํฌ์ธํŠธ์—์„œ ์ ์šฉ๋œ๋‹ค. ํŽŒ์›จ์–ด๋Š” 16์Šฌ๋กฏ ๋ ˆ์ดํŠธ ๋ณ€๊ฒฝ ํ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‡ผ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š์ง€ ์•Š๊ณ  ๋ถ€๋“œ๋Ÿฌ์šด ๋ ˆ์ดํŠธ ์ „ํ™˜์„ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

Q: W5500์ด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? A: ๋ถ€ํŠธ ์‹œํ€€์Šค์—์„œ ESP-IDF ๋“œ๋ผ์ด๋ฒ„์— ์ œ์–ด๊ถŒ์„ ๋„˜๊ธฐ๊ธฐ ์ „์— 1 MHz SPI๋กœ W5500 Version Register๋ฅผ ์ง์ ‘ ์ฝ๋Š”๋‹ค. 0x00์ด ๋ฐ˜ํ™˜๋˜๋ฉด Ethernet ์ดˆ๊ธฐํ™”๋ฅผ ์ค‘๋‹จํ•˜๊ณ , SPI GPIO๋ฅผ "ํŒŒํ‚น"(WiFi ์•ˆํ…Œ๋‚˜ ๊ทผ์ฒ˜์˜ RF ๋…ธ์ด์ฆˆ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด LOW๋กœ ๊ตฌ๋™)ํ•œ ๋’ค WiFi AP ์ „์šฉ ๋ชจ๋“œ๋กœ ๋ถ€ํŒ…ํ•œ๋‹ค. Ether Dream ์„œ๋ฒ„๋Š” WiFi๋ฅผ ํ†ตํ•ด ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.

Comments

Comments