More Icom Remote Device Updates

After much experimenting and trial and error, I got almost all of the radio functions tested and working. I did run into an interesting problem, though. If I included ALL of the Icom CI-V enabled radios, and included 2 “spare” integers with the lookup structure, the Arduino would fail out after 180 items in the list.

In order to fix this issue, I disabled all the “Receiver only” radios (IC-Rxx radios), and eliminated the spare integers – now it reads int he radio properly!

Another victory was getting Icom BCD encoding of values working. I’m sure there’s a valid reason for why they did this, but it’s a real hassle when it comes to rolling your own software! By including the following in the code:

#define DEC2BCD(dec) (((dec / 10) << 4) + (dec % 10)) //Decimal to BCD conversion routine

I can then simply enter a (1 or 2 digit) number, and get my BCD result! The following is the call to the above “macro” in action:

void set_RFPower(int level) // set RF Power


int level2 = constrain(level, 0, 0255); // limit values to allowable limits

 int x2 = ((level %100));  // tens and ones byte

int x1 = (level - x2)/100;  //thousands and hundreds byte

byte x1b = DEC2BCD(x1);

byte x2b = DEC2BCD(x2);


Serial.write(0x14);       // RX Levels command

 Serial.write(0x0A);       // RF Power Subcommand





I haven’t simplified the frequency portion of the code using this operation yet, but it is in the plans.

I’m working on the rotary encoder now – it’s coming along, but I have to work out the algorithm to allow the encoder to control frequency smoothly. Right now, I just have it counting and throwing the number on the LCD display. With this partially working, I have about 80% of the final hardware involved (still need a keypad and directional buttons for the menus, not to mention porting it to the Arduino Mega).

Leave a Reply