<antenna />
Overview
Use <antenna /> for any of these PCB representations:
- Set
antennaShapeto generate a common band-qualified PCB copper shape. - Set
pcbPathwhen you have validated custom copper geometry. - Set
footprintwithout a shape or path for a packaged chip antenna.
frequencyBand is optional metadata. It does not select or resize generated
copper; the value embedded in antennaShape is authoritative. Wi-Fi, Bluetooth
LE, Thread, and Zigbee can share a 2.4 GHz antenna when the complete RF design
has the required impedance and bandwidth, so there is no wireless-standard
prop.
The generated shapes use component-local coordinates with feed at the
origin. pcbX, pcbY, pcbRotation, and layer transform the entire antenna.
An explicit pcbPath takes precedence over antennaShape.
Generated 2.4 GHz PCB antennas
The examples below put an ESP32-C3-style QFN32 radio immediately beside the
antenna and show the routed RF feed. They intentionally omit the matching
network so the antenna topology stays legible. Each board disables autorouting
and uses pcbPath={[]} to keep the intentionally short feed direct at an
illustrative 0.3mm width; neither that width nor the omitted network should
be copied as a 50 Ω design. Determine both from the finished stackup and tune
the assembled product. See the
ESP32-C3 RF design guidance.
Quarter-wave monopole
2.4ghz_quarter_wave_monopole generates a straight, single-ended radiator. It
uses only the feed port and needs the most board-edge length of the monopole
options.
const Esp32C3Radio = ({ pcbX, pcbY = 0, pcbRotation = 180 }) => (
<chip
name="U1"
manufacturerPartNumber="ESP32-C3"
footprint="qfn32_w5mm_h5mm_p0.5mm_pw0.2mm_pl0.4mm_thermalpad3mmx3mm"
pinLabels={{ pin1: "LNA_IN" }}
pcbX={pcbX}
pcbY={pcbY}
pcbRotation={pcbRotation}
schX={-4}
/>
)
export default () => (
<board width="40mm" height="7mm" minTraceWidth="0.2mm" routingDisabled>
<Esp32C3Radio pcbX={-16} />
<antenna
name="ANT1"
antennaShape="2.4ghz_quarter_wave_monopole"
pcbX={-12}
pcbY={-1.75}
schX={4}
/>
<trace
from=".U1 > .LNA_IN"
to=".ANT1 > .feed"
pcbPath={[]}
thickness="0.3mm"
/>
</board>
)
Meandered monopole
2.4ghz_meandered_monopole folds a single-ended radiator into a smaller
rectangle. Connect the radio output to feed.
const Esp32C3Radio = ({ pcbX, pcbY = 0, pcbRotation = 180 }) => (
<chip
name="U1"
manufacturerPartNumber="ESP32-C3"
footprint="qfn32_w5mm_h5mm_p0.5mm_pw0.2mm_pl0.4mm_thermalpad3mmx3mm"
pinLabels={{ pin1: "LNA_IN" }}
pcbX={pcbX}
pcbY={pcbY}
pcbRotation={pcbRotation}
schX={-4}
/>
)
export default () => (
<board width="24mm" height="10mm" minTraceWidth="0.2mm" routingDisabled>
<Esp32C3Radio pcbX={-8} />
<antenna
name="ANT1"
antennaShape="2.4ghz_meandered_monopole"
pcbX={-4}
pcbY={-1.75}
schX={4}
/>
<trace
from=".U1 > .LNA_IN"
to=".ANT1 > .feed"
pcbPath={[]}
thickness="0.3mm"
/>
</board>
)
Inverted-F antenna
2.4ghz_inverted_f has a feed and a shorting ground port. The generated
ground point includes a tented via intended to land on the RF ground plane.
const Esp32C3Radio = ({ pcbX, pcbY = 0, pcbRotation = 180 }) => (
<chip
name="U1"
manufacturerPartNumber="ESP32-C3"
footprint="qfn32_w5mm_h5mm_p0.5mm_pw0.2mm_pl0.4mm_thermalpad3mmx3mm"
pinLabels={{ pin1: "LNA_IN" }}
pcbX={pcbX}
pcbY={pcbY}
pcbRotation={pcbRotation}
schX={-4}
/>
)
export default () => (
<board
width="29mm"
height="15mm"
minTraceWidth="0.2mm"
routingDisabled
placementDrcChecksDisabled
>
<Esp32C3Radio pcbX={-9.75} pcbY={-4.7} pcbRotation={270} />
<antenna
name="ANT1"
antennaShape="2.4ghz_inverted_f"
pcbX={-8}
pcbY={-1.5}
schX={4}
/>
<trace
from=".U1 > .LNA_IN"
to=".ANT1 > .feed"
pcbPath={[]}
thickness="0.3mm"
/>
</board>
)
Meandered inverted-F antenna
2.4ghz_meandered_inverted_f combines the IFA ground short with a compact
meander. Feed the radio into feed; the generated ground short terminates at
a tented via.
const Esp32C3Radio = ({ pcbX, pcbY = 0, pcbRotation = 180 }) => (
<chip
name="U1"
manufacturerPartNumber="ESP32-C3"
footprint="qfn32_w5mm_h5mm_p0.5mm_pw0.2mm_pl0.4mm_thermalpad3mmx3mm"
pinLabels={{ pin1: "LNA_IN" }}
pcbX={pcbX}
pcbY={pcbY}
pcbRotation={pcbRotation}
schX={-4}
/>
)
export default () => (
<board
width="20mm"
height="14mm"
minTraceWidth="0.2mm"
routingDisabled
placementDrcChecksDisabled
>
<Esp32C3Radio pcbX={-5.75} pcbY={-4.3} pcbRotation={270} />
<antenna
name="ANT1"
antennaShape="2.4ghz_meandered_inverted_f"
pcbX={-4}
pcbY={-1}
schX={4}
/>
<trace
from=".U1 > .LNA_IN"
to=".ANT1 > .feed"
pcbPath={[]}
thickness="0.3mm"
/>
</board>
)
The IFA previews scope placementDrcChecksDisabled to their boards because the
generated shorting via intentionally occupies the ground pad.
Folded dipole
2.4ghz_folded_dipole is balanced and exposes feed1 and feed2; feed
remains an alias of feed1. The preview uses the two RF outputs of an
nRF24L01+-style QFN20 radio to demonstrate the two-port connection.
export default () => (
<board width="50mm" height="18mm" minTraceWidth="0.2mm" routingDisabled>
<chip
name="U1"
manufacturerPartNumber="nRF24L01+"
footprint="qfn20_w4mm_h4mm_p0.5mm_pw0.2mm_pl0.4mm_thermalpad2mmx2mm"
pinLabels={{ pin12: "ANT1", pin13: "ANT2" }}
pcbX={0}
pcbY={-5}
pcbRotation={90}
schX={-4}
/>
<antenna
name="ANT1"
antennaShape="2.4ghz_folded_dipole"
pcbX={-0.6}
pcbY={-1.5}
schX={4}
/>
<trace
from=".U1 > .ANT1"
to=".ANT1 > .feed2"
pcbPath={[]}
thickness="0.3mm"
/>
<trace
from=".U1 > .ANT2"
to=".ANT1 > .feed1"
pcbPath={[]}
thickness="0.3mm"
/>
</board>
)
The two direct traces illustrate the balanced port mapping. A production nRF24L01+ design still needs the bias, harmonic-filtering, and impedance- matching network from the radio's reference design; do not replace that network with these two traces.
Packaged chip antenna
For a chip antenna, omit antennaShape and describe the manufacturer's land
pattern with footprint. This example models a Johanson
2450AT18A0100001E/legacy 2450AT18A100: terminal 1 is the 50 Ω feed and terminal
2 is NC. The second pad is therefore physical copper without a portHints
mapping. Copy the exact land pattern and placement clearance from the current
manufacturer datasheet.
const Esp32C3Radio = ({ pcbX, pcbY = 0, pcbRotation = 180 }) => (
<chip
name="U1"
manufacturerPartNumber="ESP32-C3"
footprint="qfn32_w5mm_h5mm_p0.5mm_pw0.2mm_pl0.4mm_thermalpad3mmx3mm"
pinLabels={{ pin1: "LNA_IN" }}
pcbX={pcbX}
pcbY={pcbY}
pcbRotation={pcbRotation}
schX={-4}
/>
)
export default () => (
<board width="13mm" height="8mm" minTraceWidth="0.2mm" routingDisabled>
<Esp32C3Radio pcbX={-3.5} />
<antenna
name="ANT1"
manufacturerPartNumber="2450AT18A0100001E"
frequencyBand="2.4ghz"
pcbX={0.5}
pcbY={-1.75}
schX={4}
footprint={
<footprint>
<smtpad
shape="rect"
width="0.7mm"
height="1.6mm"
pcbX={0}
portHints={["pin1"]}
/>
<smtpad
shape="rect"
width="0.7mm"
height="1.6mm"
pcbX={2.7}
/>
<silkscreenrect
width="3.2mm"
height="1.6mm"
pcbX={1.35}
/>
</footprint>
}
/>
<trace
from=".U1 > .LNA_IN"
to=".ANT1 > .feed"
pcbPath={[]}
thickness="0.3mm"
/>
</board>
)
Shape and port reference
antennaShape | Topology | Electrical ports |
|---|---|---|
2.4ghz_quarter_wave_monopole | Straight monopole | feed |
2.4ghz_meandered_monopole | Compact meandered monopole | feed |
2.4ghz_inverted_f | Inverted-F with ground short | feed, ground |
2.4ghz_meandered_inverted_f | Compact meandered inverted-F | feed, ground |
2.4ghz_folded_dipole | Balanced folded dipole | feed1 (feed alias), feed2 |
When pcbPath is supplied, the antenna uses the custom-path behavior and has
only feed, even if antennaShape is also present.
Pins
| Pin | Alias | Present for | Description |
|---|---|---|---|
pin1 | feed | Every antenna | Primary RF feed and local-coordinate origin |
pin1 | feed1 | Folded dipole | Explicit name for the first balanced feed when feed2 is present |
pin2 | ground, gnd | Inverted-F shapes | Ground short for the IFA |
pin2 | feed2 | Folded dipole | Second side of the balanced feed |
Properties
| Property | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Component name or reference designator, typically "ANT1" |
antennaShape | AntennaShape | No | Generates one of the band-qualified PCB shapes listed above |
frequencyBand | "2.4ghz" | "5ghz" | "6ghz" | "dual_band_2.4ghz_5ghz" | "tri_band_2.4ghz_5ghz_6ghz" | No | Nominal-band metadata; never changes generated geometry |
footprint | string | JSX.Element | For packaged antennas | Physical antenna land pattern. Generated shapes create their own feed pads when omitted |
pcbPath | PcbPath | No | Validated custom copper path; overrides generated shape geometry |
manufacturerPartNumber | string | No | Manufacturer part number, especially useful for packaged antennas |
pcbX | number | string | No | X position of the antenna feed |
pcbY | number | string | No | Y position of the antenna feed |
pcbRotation | number | string | No | Counter-clockwise rotation applied to footprint and generated or custom copper |
layer | LayerRef | No | PCB layer for the component; defaults to "top" |
symbol | string | JSX.Element | No | Custom schematic representation |
cadModel | object | JSX.Element | No | Optional 3D model configuration |
The antenna also accepts the common PCB and schematic layout props used by normal components.
Custom PCB paths
Use pcbPath for antenna geometry copied from a validated reference design.
The route starts at feed, and raw coordinate entries are millimeters in the
antenna's local frame. It can contain coordinate points, global port selectors,
and via entries supported by <trace pcbPath>.
<antenna
name="ANT1"
pcbX={-8}
pcbY={-1}
footprint="0402"
pcbPath={[
{ x: 1, y: 0 },
{ x: 1, y: 5 },
{ x: 12, y: 5 },
{ x: 12, y: 3.5 },
{ x: 3, y: 3.5 },
]}
/>
See Draw a WiFi Antenna for a focused custom-path example.
Generated geometry is a practical starting point, not a tuned or certified RF design. Antenna dimensions, controlled impedance, stackup, ground plane, matching network, enclosure, and clearance all affect performance. Start from the radio and antenna manufacturers' reference designs, preserve the required copper-free area, then verify and tune the assembled product with suitable RF test equipment.