RC 송신기는 무선 링크가 필요한 프로젝트에 매우 적합합니다. 암호화된 링크로 좋은 범위를 제공하기 때문입니다.
모든 RC 수신기는 서보 모터를 구동하도록 만들어져 있습니다. 따라서 채널당 3개의 핀이 있습니다: 그라운드, Vcc, 신호. 여기에는 특수한 종류의 신호가 사용됩니다. 일정한 간격으로 펄스를 보냅니다. 서보가 1.5ms 펄스를 받으면 90도로 설정되고, 이 값을 1~2ms로 변화시키면 서보가 최소값과 최대값으로 이동합니다. (위 사진은 PPM 핀이 있는 6채널 수신기를 보여줍니다.)
쉬운 방법은 각 핀에서 펄스 폭을 측정하고 필요에 따라 데이터를 매핑하는 것입니다. 하지만 여기에 문제가 있습니다:
수신기의 각 채널마다 아두이노 핀에 와이어를 연결해야 합니다. 이는 많은 연결이 필요할 뿐만 아니라 아두이노의 많은 핀을 소모합니다.
대부분의 아두이노는 인터럽트 핀이 2개뿐이라 2개 이상의 채널을 읽으려면 코드에 지연이 추가되어 일부 애플리케이션에서 문제가 될 수 있습니다.
이 문제를 해결하기 위해 많은 수신기에는 PPM이라는 추가 핀이 있습니다. 이 PPM 핀은 모든 채널의 데이터를 단일 신호로 전송합니다.
PPM 핀 신호 구성 방식
이 신호는 빈 공간으로 구분된 데이터 패킷으로 구성됩니다. 여기서는 피크 사이의 공간이 채널의 값을 나타냅니다. 이 경우 6채널 수신기를 사용했으므로 7개의 펄스가 있습니다.
따라서 코드에서 먼저 분리 공간을 감지한 다음 각 채널에 대한 펄스에서 데이터를 기록하기 시작해야 합니다.
두 번째 이미지에서 볼 수 있듯이,
모든 데이터는 약 11500 마이크로초의 시간으로 분리됩니다. 그다음 6개의 값이 각 채널에 해당합니다.
이 부분은 10000마이크로초보다 큰 공간, 즉 우리 경우 분리 공간을 찾습니다. 그 공간을 감지하면 코드는 다음 섹션으로 이동합니다.
이 공간 다음의 6개 값이 각 채널 위치에 해당하며, ch[1], ch[2], ch[3], ch[4], ch[5], ch[6] 배열에 각 채널의 값으로 저장됩니다.
코드
RC 수신기 채널 읽기 코드 (Arduino)
unsigned long int a,b,c;
int x[15], ch1[15], ch[7], i; // 값 저장을 위한 배열 및 변수 지정
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), read_me, FALLING); // 핀 2에서 인터럽트 활성화
}
void loop() {
read_rc();
Serial.print(ch[1]); Serial.print("\t");
Serial.print(ch[2]); Serial.print("\t");
Serial.print(ch[3]); Serial.print("\t");
Serial.print(ch[4]); Serial.print("\t");
Serial.print(ch[5]); Serial.print("\t");
Serial.print(ch[6]); Serial.print("\n");
delay(100);
}
void read_me() {
// 이 코드는 RC 수신기의 PPM 핀(핀 2 또는 3)에서 값을 읽음
// 이 코드는 0-1000 범위의 채널 값을 제공함
// -: ABHILASH :-
a = micros(); // 핀 값이 하강할 때 시간 값 a 저장
c = a - b; // 두 피크 사이의 시간 계산
b = a;
x[i] = c; // 15개 값을 배열에 저장
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) {
ch1[j] = x[j];
}
i = 0;
}
} // 15회 읽기 후 임시 배열에서 다른 배열로 모든 값 복사
void read_rc() {
int i, j, k = 0;
for (k = 14; k > -1; k--) {
if (ch1[k] > 10000) { j = k; }
} // 다른 배열에서 10000us 분리 공간 감지
for (i = 1; i <= 6; i++) {
ch[i] = (ch1[i + j] - 1000);
} // 분리 공간 후 6개 채널 값 할당
}