CAT control & ALC sensing complete!

I’ve finally managed to finish my Arduino CAT control project! Woo hoo!

The project took longer than anticipated due to a number of reasons, one of which being the fine weather we’ve enjoyed this summer (and all the camping that goes with it). The other reason was my focus on other things, namely, healing up well.

Leg in hard cast

Leg in hard cast

A few weeks ago, I fully ruptured my Achilles tendon while playing a spirited game of squash. (It turns out that racket sports account for the greatest percentage of Achilles tendon damage.) I opted for the surgical repair and went under the knife on Aug 2nd. I’m currently in a below-the-knee cast and will remain as such for the foreseeable future. The surgery went well and my wound site has healed extremely quickly (pic: 8 days post op) so I remain optimistic. I will be off work for the next little bit so I’ll have some time to look at radio projects!

RX and TX displays

RX and TX displays
External meter jack on FT-857D

External meter jack on FT-857D

The LCD display will indicate whether the radio is in RX mode (and hence the signal strength) or TX mode (the ALC level). This is all made possible because the FT-857D has an external meter port on the bottom of the front display. The ouput of the meter jack goes from 0V to 5V which is perfect for sampling with a simple 10-bit ADC such as that found in the Arduino. By mapping the values of voltage (0V = 0, 5V = 1024) to a smaller range (such as 0-128) we can display the data on a 16×2 LCD display quite nicely while retaining vital data.

To tell whether the radio is in RX or TX mode, I am passing the command:

boolean checkTX(){
  boolean TX = 0;
  byte cmdOut[5]= {0x00,0x00,0x00,0x00,0xf7};
  rigCat.flush(); // clear incoming serial buffer
  for (byte i=0; i<5; i++) {

And then I wait for the resulting data to come back via:

  byte bytesIn = 1;  // only collect the first byte
  for(byte j=0; j<bytesIn; j++){
    cmdData[j] =;

In all cases, unless the radio is actually transmitting, the data that comes back in cmdData[0] is = 255 so, we can simply finish with:

  if (cmdData[0] != 255) TX = true;
  return TX; // return the result to the function call

I am currently working on creating an Arduino library so that others may benefit from my bit-banging. Ideally, you will be able to declare a radio much like you would a variable and then pass commands to it via the FT857D library (and hence CAT commands).

A list of support functions is as follows:

  • lock on / off
  • PTT on / off
  • Set frequency
  • Set operating mode
  • Clarifier on / off
  • Clarifier frequency
  • VFO A / B swapping
  • Split operation on / off
  • Repeater offset direction (+, -, simplex)
  • Repeater offset frequency
  • CTCSS / DCS modes (encode, decode, encode & decode, off)
  • CTCSS tone / DCS code
  • Read RX status (squelch status, ctcss / dcs matching, disc. centr., S-meter data)
  • Read TX status (PTT, SWR status, split status, PO-meter data)
  • Read RX frequency & mode
This entry was posted in Project and tagged , , , , , . Bookmark the permalink.

3 Responses to CAT control & ALC sensing complete!

  1. Jeff Addleman says:

    Can you provide an arduino sketch to just read the frequency of a Yaesu using the RS232 port? I am trying to understand how to send the “FA;” command and receive the string.

  2. David says:

    Great news re. your recovery & your progress on this project.

    I have an early model FT-857 with lines in the display – damage from the prior owner’s mobile use w/o effective protection of the display.

    Is it possible to essentially duplicate the display externally using your Arduino/LCD system?

    Also, have you looked at the Teensy 3.0 (I believe it can run Arduino code as well as Linux)?


Leave a Reply

Your email address will not be published. Required fields are marked *