// IC-705 CI-V -> FT-818 band data conversion unit // 2022.4.20 // JG1PJB T.Kuwahara //#define DEBUG #define PWM_PIN 3 const unsigned char rigAdr = 0xA4; const unsigned char comAdr = 0xE0; // Dummy computer address const unsigned char sndCmd[6] = {0xFE, 0xFE, rigAdr, comAdr, 0x03, 0xFD}; const unsigned char dutyTbl[13] = {0, // 0V (PWM Off) 17, // 0.22V * (5V/3.3V) -> 0.33V 34, // 0.44V * (5V/3.3V) -> 0.67V 51, // 0.66V * (5V/3.3V) -> 1.00V 68, // 0.88V * (5V/3.3V) -> 1.33V 85, // 1.10V * (5V/3.3V) -> 1.67V 102, // 1.32V * (5V/3.3V) -> 2.00V 119, // 1.54V * (5V/3.3V) -> 2.33V 136, // 1.76V * (5V/3.3V) -> 2.67V 153, // 1.98V * (5V/3.3V) -> 3.00V 170, // 2.20V * (5V/3.3V) -> 3.33V 187, // 2.42V * (5V/3.3V) -> 3.67V 204}; // 2.64V * (5V/3.3V) -> 4.00V unsigned char rcvBuf[64]; int rcvPtr = 0; int prevBand = 0xFF; void setup() { // Dummy wait(1sec) delay(1000); // Serial port setup Serial.begin(38400, SERIAL_8N1); // PWMpin Ssetup pinMode(PWM_PIN, OUTPUT); analogWrite(PWM_PIN, 0); // 0V (PWM Off) // Send IC-705 CI-V command do{ sendCIV(); delay(100); }while(Serial.available() == 0); // Until IC-705 bootup is complete } void loop() { unsigned char chrbuf; int band; // Receive response data if(Serial.available() > 0){ // Check receive buffer chrbuf = Serial.read(); // Read one byte #ifdef DEBUG Serial.write(chrbuf); #endif if(chrbuf == 0xFD){ // Check delimiter rcvBuf[rcvPtr] = chrbuf; // Set delimiter in array band = getBand(rcvBuf); // Parse response data #ifdef DEBUG Serial.print("Band:"); Serial.print(band); #endif if(band != 0xFF){ outSig(band); // Band data out } rcvPtr = 0; // Clear receive buffer pointer // Send CI-V command sendCIV(); } else{ rcvBuf[rcvPtr] = chrbuf; // Set the read data in array rcvPtr++; } } } void sendCIV() { Serial.write(sndCmd, sizeof(sndCmd)); Serial.flush(); } int getBand(unsigned char *buf) { // Check response data(Command 0x03 : Read frequency) if(buf[0] != 0xFE || buf[1] != 0xFE || buf[2] != comAdr || buf[3] != rigAdr || buf[4] != 0x03 || buf[10] != 0xFD){ return 0xFF; // Error } // Parse response data, return band number switch((buf[9] & 0x0F) * 100 + // 100MHz (buf[8] >> 4) * 10 + // 10MHz (buf[8] & 0x0F)){ // 1MHz case 1: // 1.9MHz Band return 1; case 3: // 3.5MHz Band return 2; case 7: // 7MHz Band return 3; case 10: // 10MHz Band return 4; case 14: // 14MHz Band return 5; case 18: // 18MHz Band return 6; case 21: // 21MHz Band return 7; case 24: // 24MHz Band return 8; case 28: case 29: // 28MHz Band return 9; case 50: case 51: // 50MHz Band case 52: case 53: return 10; case 144: case 145: // 144MHz Band return 11; case 430: case 431: case 432: case 433: case 434: // 430MHz Band case 435: case 436: case 437: case 438: case 439: return 12; default: // Out of amateur radio band return 0; } } void outSig(int band) { if(band == prevBand){ // Check band change return; } else{ prevBand = band; // Set new band number analogWrite(PWM_PIN, dutyTbl[band]); // PWM output digitalWrite(13, HIGH); // Flash on-board LED delay(500); digitalWrite(13, LOW); } }