AB6A · Amateur Radio · Icom IC-905

IC-905 SEND

Band-specific transmit sequencing for the IC-905 VHF/UHF/SHF Transceiver — driven entirely off the Ethernet link between the controller and the RF deck.

A native C systemd service for the Raspberry Pi that taps the control stream, decodes band, frequency and the explicit transmit command, and drives PCA9538A relays as a timed TX/RX sequence — for every band, 2m through 10 GHz.

What it does.

The IC-905 splits its controller and RF deck, linked only by Ethernet. This service listens on that link and turns it into precise, band-aware relay control — no SEND-jack PTT, no per-band wiring.

📡

Pure-Ethernet TX

Reads the controller's explicit transmit command (byte 38 of the 0x44 status frame) — works on every band, including 2m/70cm.

🎚️

Band-aware

Decodes band & frequency from the same stream and switches the right relays for the active band.

⏱️

Timed sequencing

Per-relay millisecond delays close in order on TX and open mirrored on RX — protects amp and relay contacts.

📶

MQTT monitor + control

Authenticated local broker publishes band/TX/frequency/relay state and accepts manual relay commands over WiFi.

Low latency

Packet path stays off the network and MQTT threads, so relay timing is never blocked.

📝

Config-driven

A simple /etc/ic905-relay.conf maps bands to relays with delays — multi-band rules and per-band timing supported.

Every band, decoded.

The radio reports the true frequency only on 2m; every higher band reports an IF value it up-converts from. All six were measured on-air and map cleanly.

BandReal frequencyReported IFRelay action
2m144 MHz144.1 MHz · true✓ verified
70cm430 MHz233.1 MHz✓ verified
23cm1296 MHz407.0 MHz✓ verified
13cm2400 MHz566.1 MHz✓ verified
6cm5600 MHz1073.0 MHz✓ verified
3cm10 GHz1757.3 MHz✓ verified

Classification keys off the decoded band, not the raw IF — boundaries centered on the measured values.

How it works.

01

Tap

Promiscuous capture on eth0 of the controller→deck stream (TCP 50004).

02

Decode

Band/frequency at offset 184, TX state at byte 38 of the 0x44 frame.

03

Sequence

Schedule relay open/close events per the config delays on each TX/RX edge.

04

Drive

Write the PCA9538A I²C expanders; publish state to MQTT.

Configure it.

One plain-text file — /etc/ic905-relay.conf — maps bands to relays. Every rule is three fields:

relay

1–6. Relays 1–3 are on board 1 (I²C 0x70), 4–6 on board 2 (0x73).

band

2m 70cm 23cm 13cm 6cm 3cm (or MHz), or all for every band. Combine with /: 23cm/2m.

delay_ms

Milliseconds after the TX edge before the relay closes. Per-band delays can be /-listed too.

# relay, band, delay_ms
1, 23cm, 0       # 23cm: relay 1 closes immediately,
2, 23cm, 10      #        relay 2 ten ms later  (board 1)
4, 13cm, 0       # 13cm sequence on board 2
5, 13cm, 20
3, all,  25      # amp PTT on ANY band, after the others
6, 2m/70cm, 0    # one relay shared by two bands

On TX the matching relays close in increasing-delay order; on RX they open in mirrored reverse order (same gaps), so contacts are never hot-switched. A band change while keyed ramps the old band down, then the new band up. Edit, then sudo systemctl restart ic905-relay. More ready-to-use patterns in CONFIG-EXAMPLES.md.