Skip to main content
Built-in Elements

<antenna />

Overview

Use <antenna /> for any of these PCB representations:

  • Set antennaShape to generate a common band-qualified PCB copper shape.
  • Set pcbPath when you have validated custom copper geometry.
  • Set footprint without 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>
)
PCB Circuit Preview

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>
)
PCB Circuit Preview

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>
)
PCB Circuit Preview

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>
)
PCB Circuit Preview

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>
)
PCB Circuit Preview

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>
)
PCB Circuit Preview

Shape and port reference

antennaShapeTopologyElectrical ports
2.4ghz_quarter_wave_monopoleStraight monopolefeed
2.4ghz_meandered_monopoleCompact meandered monopolefeed
2.4ghz_inverted_fInverted-F with ground shortfeed, ground
2.4ghz_meandered_inverted_fCompact meandered inverted-Ffeed, ground
2.4ghz_folded_dipoleBalanced folded dipolefeed1 (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

PinAliasPresent forDescription
pin1feedEvery antennaPrimary RF feed and local-coordinate origin
pin1feed1Folded dipoleExplicit name for the first balanced feed when feed2 is present
pin2ground, gndInverted-F shapesGround short for the IFA
pin2feed2Folded dipoleSecond side of the balanced feed

Properties

PropertyTypeRequiredDescription
namestringYesComponent name or reference designator, typically "ANT1"
antennaShapeAntennaShapeNoGenerates 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"NoNominal-band metadata; never changes generated geometry
footprintstring | JSX.ElementFor packaged antennasPhysical antenna land pattern. Generated shapes create their own feed pads when omitted
pcbPathPcbPathNoValidated custom copper path; overrides generated shape geometry
manufacturerPartNumberstringNoManufacturer part number, especially useful for packaged antennas
pcbXnumber | stringNoX position of the antenna feed
pcbYnumber | stringNoY position of the antenna feed
pcbRotationnumber | stringNoCounter-clockwise rotation applied to footprint and generated or custom copper
layerLayerRefNoPCB layer for the component; defaults to "top"
symbolstring | JSX.ElementNoCustom schematic representation
cadModelobject | JSX.ElementNoOptional 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.

RF geometry

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.