XDR-I2C is a modification of the Sony XDR-F1HD radio tuner.
Warning: This modification is provided as is. Do everything on your own responsibility! There’s always a risk of a permanent damage to your tuner!! Always unplug the power cord before doing anything inside it and use a properly grounded soldering iron.
- tuner control with a computer
- wide frequency tuning range (up to ~130 MHz)
- 1 kHz tuning steps (LW/MW/SW), 5 kHz (VHF)
- fixed or adaptive digital IF bandwidth
- signal level meter and squelch
- AM or FM demodulation on any frequency
- RDS fast PI mode and error correction
- selectable de-emphasis and AGC threshold
- digital alignment of the antenna circuit
- RF and IF +6dB gain boost
HD radio is NOT supported!
- XDR-F1HD tuner
- computer with a USB port
- Seeeduino board (switched to 3.3V operation)
- mini-USB cable, some wires and a transistor
The XDR-S3HD and S10HDiP are NOT supported at the moment. The stock controller seems to disrupt a reset-hack required for PC connection.
The following description assumes stock controller and Seeeduino co-existence. If you are interested in an extended modification, click here.
Switch the Seeeduino board to 3.3V mode. GND, SDA, SCL and RDS lines are connected directly to the Seeeduino. The RESET line is used to block XDR-F1HD’s main CPU while using this modification and requires a transistor. Do not connect the RESET line directly! I’m using a typical low power n-mosfet transistor BS170. It is connected as a key: source to JW29 (GND), drain to RESET (JW28) and gate to digital pin 4 in Seeeduino.
|Analog PIN 4||↔||JW12||(I²C SDA)|
|Analog PIN 5||↔||JW13||(I²C SCL)|
|Digital PIN 2||↔||JW16||(RDS)
|Digital PIN 4||↔||BS170 gate|
|JW25||↔ 150kΩ resistor ↔||JW21|
|Digital PIN 3||↔||IR LED (+)|
|GND||↔||IR LED (-)|
IR diode (with ~200Ω resistor) can be optionally used for automatic tuner power up. If you don’t connect it, you will have to turn on XDR-F1HD manually every time before starting up the modification. When wires are connected and Seeeduino is powered off, XDR-F1HD will not power up because the I²C bus is blocked (WAIT message will only flash on the screen). If you want to use XDR-F1HD without computer after this modification, connect 5.2 or 10.5V to the Seeeduino DC jack.
Don’t forget to toggle Seeeduino from 5V to 3.3V operation (mechanical switch on the board). Also consider adding a small fan because XDR-F1HD runs very hot. High temperatures always reduce the lifetime of electronic components.
Need an inspiration? Click here to see more pictures of modified tuners.
Drivers and the source code
Download the Arduino IDE and install drivers for the Seeeduino board from drivers\FTDI USB Drivers directory after plugging in the USB cable. Run the Arduino IDE, choose Tools -> Board -> Arduino Duemilanove w/ ATMega 328, open xdr-i2c.ino file and upload it to the Seeeduino board. If you get an error during upload you’ll have to select correct serial port. Check USB Serial Port device COM number in the Windows Device Manager.
Starting the modification
If you don’t have an IR led, you’ll have to turn on XDR-F1HD manually using the power button. Follow instructions from XDR-GTK page. See the Antenna input alignment paragraph below for fine tuning your XDR tuner unit.
Note: When the controller is running, XDR-F1HD’s display is dimmed.
All commands consist of one letter, data and are ended with end-line ASCII character.
- x – start the controller
- T – tune to a frequency [kHz]
T87500 – tune at 87.500 MHz
The controller will return an exact frequency, possibly rounded depending on the available tuning step.
- F – IF digital filter bandwidth (0-15 FM, 16-30 AM, negative number – adaptive bandwidth)
F15 – set the widest FM filter bandwidth
F-1 – set adaptive bandwidth
- A – AGC threshold level
A0 – highest
A1 – high
A2 – medium
A3 – low
- D – de-emphasis mode
D0 – 50µs
D1 – 75µs
D2 – off
- M – demodulation mode
M0 – FM
M1 – AM
- G – RF/IF gain
G00 – RF and IF normal gain
G10 – RF +6dB gain
G01 – IF +6dB gain
G11 – RF and IF +6dB gain
- V – antenna circuit tuning voltage
V0 – set minimal voltage
V127 – set maximal voltage
- S – spectral scan, reads signal levels from a desired frequency range (experimental!)
Sa87500 – set start frequency [kHz]
Sb108000 – set end frequency [kHz]
Sc100 – set step [kHz]
Sf3 – set filter
S – perform the spectral scan
Sm – like above, but multiple times (continuous)
- Y – audio volume scaler
Y0 – mute
Y100 – set highest volume
- Q – squelch threshold level
Q0 – squelch off
Q10 – squelch at 10dBf
Q-1 – stereo squelch
- Z – antenna switch
Z0 – set high state on digital pin 8
Z1 – set high state on digital pin 9
Z2 – set high state on digital pin 10
Z3 – set high state on digital pin 11
- C – antenna rotator
C0 – set low state on digital pin 6 (CW) and 7 (CCW)
C1 – set high state only on digital pin 6 (CW)
C2 – set high state only on digital pin 7 (CCW)
- X – shutdown the tuner
Antenna input alignment
Each tuner requires individual alignment of the antenna circuit. XDR-I2C source code contains values optimal for my tuner unit. Use a signal generator or a semi-local/local station with stable signal level to find out the best reported signal level for each frequency range. Local stations with very high signal levels may give wrong values due to the AGC.
The easiest way is to use the Antenna input alignment in the XDR-GTK user interface (select Show alignment checkbox in settings). Write down optimal values, change them in the source code (align.ino file) and re-upload program to the Seeeduino board with the Arduino IDE. Keep your modified file for future firmware updates!