Zensunni.org

Arduino - Elecraft T1 Interface

I recently built an Elecraft T1 automatic tuner to use with my Flex-1500 SDR. The manual for the T1 ATU gives information about the protocol that is used to remotely control the ATU allowing the ATU to retune the antenna on band changes. Elecraft only sell a cable to interface with the FT-817 so I began to wonder if I could interface the Flex-1500 with the T1 using an Arduino prototyping board.

Being a software defined radio the “brains” of the Flex-1500 actually run on a PC in the form of PowerSDR. I had a Google and it appeared that most people were using a piece of software called DDUtil to interface between PowerSDR and external hardware. I downloaded DDUtil, installed it and quickly came to the conclusion that I needed to create a device that acted as a “passive listener”.

DDUtil can be configured to send a simple CAT command to a serial port on a repeated basis. I configured some virtual serial ports in Windows to monitor the signal being sent from DDUtil to the external device and found that it simply sends an IF CAT command on a repeating basis. The IF command contains the frequency that the radio is tuned to.

When connected to a PC the Arduino presents itself to the operating system as a serial port so all I needed to do was program the Arduino to decode the IF command, convert the frequency into a band and then send the band information to the Elecraft T1.

The connection to the T1 is made using a 3.5mm stereo plug. The tip carries the data about the band, the ring is used to trigger a retune of the ATU and the sleeve is the ground. The tune is connected to the Arduino using an NPN transistor (I used a generic PN100) in an open-collector configuration. The band is sent to the T1 as a number between 0 and 12 by encoding the four bits and sending them via the tip of the connector. The details are described in the T1 manual on page 8.

A schematic for the interface is shown below. I built this as a daughter board that the Arduino Nano can plug into. This board contains the NPN transistor, a current limiting resistor and a three pin connector that is used to connect the cable that carries the signal to the T1. I made the cable from a good quality shielded twin core microphone cable.

The completed board is shown below. There are a number of header sockets on the board which are there simply to support the Arduino. Only three pins are actually connected between the Arduino and the board (D2, D3 and GND).

The Arduino sketch is as follows:

Elecraft T1 Interface Arduino Sketch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/******************************************************
*  Elecraft T1 Interface                              *
*                                                     *
*  This Arduino sketch allows DDUtil to control       *
*  an Elecraft T1 ATU via the T1's remote control     *
*  interface.                                         *
*                                                     *
*  Copyright (c) Matthew Robinson - VK6MR, 2011       *
*                                                     * 
*  This code is released under a Creative Commons     *
*  Attribution-NonCommercial-ShareAlike 3.0           *
*  Unported (CC BY-NC-SA 3.0) license.                *
*                                                     *
*  http://creativecommons.org/licenses/by-nc-sa/3.0/  *
*                                                     *
******************************************************/


int TUNE = 2;
int DATA = 3;

int prevBand = -1;
int band = 0;

char buffer[64];
int  bufptr = 0;

void setup() {
  Serial.begin(9600);

  pinMode(TUNE, OUTPUT);
  digitalWrite(TUNE, LOW);

  pinMode(DATA, INPUT);
}

void loop() {
  if (Serial.available()) {
    char character = Serial.read();

    if (character != '\n' && character != '\r') {

      buffer[bufptr] = character;
      if (buffer[bufptr] == ';') {

        // Message should always be 14 chars
        if (bufptr == 13) {
          parseBuffer();

          if (band != -1) {
            if (band != prevBand) {
              sendBand();
              prevBand = band;
            }
          }
        }

        bufptr = 0;
      }
      else {
        bufptr++;

        // Don't overrun the buffer, messages should only be 14 chars anyway
        if (bufptr > 60)
          bufptr = 0;
      }
    }
  }
}

// buffer is of form:
// IF00003700000;
// IF00051000000;

void parseBuffer() {
  if (buffer[0] != 'I' || buffer[1] != 'F') {
    band = -1;
    return;
  }

  // We are only interested in the significant figures
  int freq = buffer[6] - 48;
  freq += (buffer[5] - 48) * 10;

  band = 0;

  if (freq >= 1 && freq <= 2) {
    band = 1; // 160
  }
  else if (freq >= 3 && freq <= 4) {
    band = 2; // 80
  }
  else if (freq == 5) {
    band = 3; // 60
  }
  else if (freq == 7) {
    band = 4; // 40
  }
  else if (freq == 10) {
    band = 5; // 30
  }
  else if (freq == 14) {
    band = 6; // 20
  }
  else if (freq == 18) {
    band = 7; // 17
  }
  else if (freq == 21) {
    band = 8; // 15
  }
  else if (freq == 24) {
    band = 9; // 12
  }
  else if (freq >= 28 && freq <= 29) {
    band = 10; // 10
  }
  else if (freq >= 50 && freq <= 54) {
    band = 11; // 6
  }
}

void sendBand() {

  // Pull the TUNE line high for half a second

  digitalWrite(TUNE, HIGH);
  delay(500);
  digitalWrite(TUNE, LOW);

  // The ATU will pull the DATA line HIGH for 50ms
  while(digitalRead(DATA) == LOW) {
  }
  while(digitalRead(DATA) == HIGH) {
  }


  // Wait 10ms
  delay(10);

  // and then send data on the DATA line
  pinMode(DATA, OUTPUT);

  // 1 bits are HIGH for 4ms 
  // 0 bits are HIGH for 1.5ms
  // Gap between digits is 1.5ms LOW

  // 1st bit
  sendBit(band & 8);
  sendBit(band & 4);
  sendBit(band & 2);
  sendBit(band & 1);

  // Leave the line LOW
  digitalWrite(DATA, LOW);

  // and switch it back to an input
  pinMode(DATA, INPUT);
}

void sendBit(int bit) {

  digitalWrite(DATA, HIGH);
  if (bit != 0) {
    delay(4);
  } else {
    delayMicroseconds(1500);
  }

  digitalWrite(DATA, LOW);
  delayMicroseconds(1500);
}

Yaesu VX-6R USB Programming Interface

A couple of years ago I built a programming interface for my Yaesu VX-6R handheld radio based on the CATbox circuit created by G4TIC. I have been using the interface with the excellent VX-6 Commander from Jim Mitchell (KC8UNJ). Even at the time I no longer had a computer with an RS232 serial port and although the interface worked it was never reliable using USB to RS232 converter cables.

I have recently been playing with the FT232RL USB to TTL serial chip on a number of other projects. It occurred to me that this would make the basis for a much more reliable interface to the VX-6. In order to make it easier to use the FT232 SMD chip I have been using a breakout board from Sparkfun Electronics (available from Little Bird Electronics in Australia) which contains all the support circuitry to get the FT232RL working, including TX and RX LEDs.

Before embarking on building an interface based on the FT232RL, I returned to Jim Mitchell’s site and checked out the page on interface cables where I found a USB design from Alexander Meier (DG6RBP) which uses an older chip from the same manufacturer as the FT232RL. I quickly breadboarded an interface using the buffer circuit from Alexander’s circuit, the section of the circuit consisting of four transistors and seven resistors connected to TX/RX on the older FT232BM chip, and the FT232RL Sparkfun breakout board. Much to my surprise and delight it worked first time, a refreshing change from the previous interface I built.

Having proved that the circuit would work, I then moved on to consider how I could build a permanent interface based on the FT232RL. After some consideration it occurred to me that it made sense to simply integrate the buffering circuit with the breakout board. Using protoboard, I built a circuit consisting of the transistor buffering (I used the generic PN100 NPN transistor) and two headers into which the Sparkfun breakout board can be plugged.

The board has a four pin header which connects to the radio. The header consists of data out, data in and ground. However, for the VX-6R the data in and data out are connected and I only use two wires to connect to the radio. If I want to use the interface with a radio that requires separate data lines I can remove the solder bridge connecting them.

The resulting board and FT232RL combination is extremely compact and works flawlessly every time (so far at least). I have the added benefit of being able to unplug the FT232RL breakout board and use it to connect with other devices and projects.

Virgin Broadband Huawei E169 Installer Remover for Mac OS X

I have wireless broadband from Virgin Mobile Australia which came with a Huawei E169 USB modem. As Mac users of this modem will know, EVERY single time you plug the modem in a “CD disk” mounts on the desktop and if you are really unlucky the installer application starts running.

I have found a way to stop this happening by telling OS X (Leopard, Snow Leopard and Lion) to not automount the “CD disk”.

I have written a package installer which will set the configuration so this disk wont mount in future. The package can be downloaded from http://www.blendedcocoa.com/downloads/VirginInstallerDiskRemover.pkg.

Download and run the package installer. Follow the instructions to install the configuration change. If you get an error it is probably because the modem can’t be found, make sure it is plugged in and that the installer disc is mounted on your desktop.

How It Works

Basically, the package contains a script that adds a configuration line to the /etc/fstab file, if the file doesn’t exist (which is probably the case) it is created. The following line is added to the file:

UUID=A97C9EAF-E18F-3BE3-80CD-8A8C6FB6E8E7 none hfs ro,noauto

The A97C...E8E7 text is the universal unique identifier (UUID) of the “CD disk” image. I am fairly certain that this UUID will not change between different VBB E169′s but the script should determine the correct UUID using diskutil anyway.

If /etc/fstab exists the script will make a backup (/etc/fstab.previrgin.date) and then add the above configuration to the end of /etc/fstab. If /etc/fstab already has an entry for the UUID the script will do nothing.

The script isn’t particularly complicated and should work in most cases. However, USE THE SCRIPT AT YOUR OWN RISK!!!

P.S. If you aren’t using the latest drivers from Virgin (particularly if you are using Snow Leopard) go and get them from http://virginmobile.custhelp.com/app/answers/detail/a_id/175/p/132/r_id/100671.

Update – 4th Jan 2012: Added Lion to the list of tested versions of OS X that the fix works with.

They’re Gone

I dropped my parents at the airport yesterday morning ready for their 8:40am flight to Singapore. This meant getting up at 5am and getting to the airport at about 6am. After they had checked in we had some over-priced coffee and orange juice before saying our goodbyes at the security checkpoint.

I got in to work at about 7:30am and by the time it got to 4pm I was stuffed so I went home early. The house felt different with only Zac and me.

Zac doesn’t seem to have taken it well. He is missing all the attention and as a consequence has only me to annoy. He was particularly grumpy this morning as I didn’t immediately get up and feed him in the way that he has become accustomed.

In Which I Miss the Dust and Mention Some Stuff I’ve Been Doing

So, I’ve been home from Burning Man and the USA for over a month now but until now I haven’t gotten around to moving the Gone to Burning Man post from the top of my blog. I suspect this is probably because I’d still like to be at Burning Man.

Anyway, since getting back a few notable events have occurred.

  • My parents have come over to stay for a couple of months :-D
  • I went to Tambellup as part of the John Curtin Weekend of volunteering.
  • We’ve been to Melbourne for a week, where I graduated from my Masters degree.
  • I went to the weekend CampOut with a bunch of people from the Perth fire crew.
  • I have finally made the switch to Mac OS X with a shiny new aluminium MacBook.
  • I’ve started doing an online course to upgrade my radio license to the Advanced level.
  • Watched the Red Bull Air Race yesterday afternoon.

I think those are the events of importance that have occurred in the last month or two. Hopefully I will get back to more regular posting now that I have shifted the Gone to BM image from the top of the blog.

T-28 Days and Counting

It is now just four short weeks until Rusty and I fly out to Dallas for Burning Man. I feel like there is lots of stuff that needs doing before we can go but I’m sure it’ll all get done in time.

If you are a regular visitor to this blog it is probably worth adding our Burning Man blog to your bookmarks and/or RSS reader. You can get to the Burning Man blog at http://www.zensunni.org/burningman or by clicking on the handy link on the right hand side of this page.

Hopefully, the Burning Man blog will start to get updated more regularly now that the trip approaches.

That’s It, I’m Done!

As of about 20 minutes ago I submitted the last two assignments for my Masters degree in Astronomy. Obviously I won’t officially know that I’ve passed these units for about 3 weeks but I am happy that I have done what is needed to pass and complete the degree.

I’m glad to be finished but a little bit sad that I won’t be doing more next semester.

Yay! All done!

I’m going off for a sleep now.