아두이노와 CI-V로 아이컴 무전기용 외부 S-미터 만들기
부품 및 소모품
| 아두이노 우노 |
1개 |
| 단회전 포텐셔미터 10k옴 |
1개 |
| 저항 10k옴 |
1개 |
| 저항 4.75k옴 |
1개 |
| 다이오드 1N4148 |
1개 |
| 커패시터 10µF |
1개 |
| 페라이트 코어 라운드 케이블 |
2개 |
| 3.5mm (1/8) 커넥터 |
1개 |
| 아이컴 튜너 커넥터 (컴퓨터 파워 서플라이 커넥터로 대체 가능) |
1개 |
프로젝트 소개
이 회로는 아두이노 우노/나노를 사용해 아이컴 무전기에 CI-V 명령으로 신호 정보를 요청하고, 응답을 읽어 변환한 뒤 아날로그 출력으로 내보내 아날로그(아르송발) S-미터에 표시합니다.
전원은 아이컴 무전기의 안테나 튜너 포트에서 공급받습니다(최소 200mA, +12V). 튜너 포트가 없으면 +12V 출력하는 다른 포트/커넥터나 외부 DC 전원을 써도 됩니다.
안테나 튜너 커넥터가 없으면 PC 파워 서플라이 커넥터를 잘라서 아이컴 튜너 커넥터에 맞게 가공해 쓰세요.
이 프로젝트는 아이컴 IC-7000 트랜시버용으로 설계되었으나 CI-V 포트가 있는 모든 아이컴 무전기에 적용 가능합니다.
일부 아이컴 무전기에서는 CI-V '00' 범용 주소를 사용할 수 있어 코드 수정 없이 모든 아이컴 기기와 호환됩니다.
입출력 케이블에 페라이트 코어를 달아 RF 유도를 차단했습니다. S-미터로 가는 +12V DC는 필수 아님(미터 백라이트 등 선택 기능용).
10k옴 포텐셔미터는 신호 출력을 감쇠(대부분 아날로그 미터엔 너무 높음)하고, 강력한 로컬 신호(+60dB)에서 풀 스케일 읽기가 나오게 아날로그 미터를 캘리브레이션하는 데 씁니다.
아두이노를 CI-V 인터페이스로 활용한 유사 프로젝트:
코드
// IC7300 S-미터 읽기 및 기타 기능 테스트베드
// Luc Decroos (ON7DQ/KF0CR) 작성
// Daniel VE2BAP 수정 및 적용, 2018-12-01
#include <SoftwareSerial.h> // IC7000 통신용
#define BAUD_RATE 19200 // CI-V 속도
#define TRX_address (0x70) // HEX $70 = Icom IC-7000
//#define TRX_address ((byte)00) // $00: 아이컴 범용 주소 (모든 라디오 작동)
// 시리얼 연결
// RX = 아이컴 라디오 → 아두이노: 2번 핀, 4k7 저항 경유
// TX = 아두이노 → 아이컴 라디오: 7번 핀, 다이오드 1N4148 경유, 3.5mm 커넥터 팁에 10k 풀업 to Vcc(5V)
SoftwareSerial mySerial = SoftwareSerial(2, 7); // (RX, TX)
int readCounter; // 라디오에서 수신한 바이트 수 카운트
int sMeterVal1; // 신호 정보 담은 상위 BCD 바이트
int sMeterVal2; // 신호 정보 담은 하위 BCD 바이트
int sMeterOut = 11; // 외부 아날로그 S-미터 연결 핀
void setup() {
pinMode(13, OUTPUT);
digitalWrite(13, LOW); // LED(13번) 강제 끄기
pinMode(2, INPUT); // IC7000에서 CI-V 시리얼 통신
pinMode(7, OUTPUT); // IC7000로 CI-V 시리얼 통신
pinMode(sMeterOut, OUTPUT); // S-미터 출력 핀 설정
mySerial.begin(BAUD_RATE);
mySerial.listen(); // 소프트웨어 시리얼은 한 포트만 listen 가능
while (mySerial.available()) mySerial.read(); // 버퍼 비우기
}
void loop() {
// S-미터 값 읽고 표시
mySerial.flush();
// 시작 시퀀스: 라디오에 "S-미터 읽기" 명령 전송
mySerial.write(0xFE);
mySerial.write(0xFE);
mySerial.write(TRX_address);
mySerial.write(0xE0);
mySerial.write(0x15);
mySerial.write(0x02); // S-미터 읽기 명령 15 02
mySerial.write(0xFD); // 종료 시퀀스
delay(20);
// 라디오에서 정보 읽기
int nbChar = mySerial.available();
if (nbChar > 0) {
for (int readCounter = 0; readCounter < nbChar ; readCounter++) {
byte byteRead = mySerial.read();
if (readCounter == 6){
sMeterVal1 = ( (byteRead/16*10) + (byteRead%16) ); // 첫 바이트: BCD → 10진수 변환
}
if (readCounter == 7){
sMeterVal2 = ( (byteRead/16*10) + (byteRead%16) ); // 둘째 바이트: BCD → 10진수 변환
analogWrite(sMeterOut, ((sMeterVal1 * 100) + sMeterVal2)); // S-미터 값 계산 후 출력 핀에 기록
delay(20);
}
}
}
}
커스텀 파트 및 인클로저
프로젝트 사진들 참조 (회로 기판, 케이스 등)
회로도
회로도 이미지 참조