산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

아두이노로 RC 수신기 PPM 신호 디코딩하기: 단계별 가이드

부품 및 소모품

부품 수량
아두이노 우노 (Arduino UNO) 1

앱 및 온라인 서비스

아두이노 IDE (Arduino IDE)

프로젝트 소개

RC 송신기는 무선 링크가 필요한 프로젝트에 매우 적합합니다. 암호화된 링크로 좋은 범위를 제공하기 때문입니다.

모든 RC 수신기는 서보 모터를 구동하도록 만들어져 있습니다. 따라서 채널당 3개의 핀이 있습니다: 그라운드, Vcc, 신호. 여기에는 특수한 종류의 신호가 사용됩니다. 일정한 간격으로 펄스를 보냅니다. 서보가 1.5ms 펄스를 받으면 90도로 설정되고, 이 값을 1~2ms로 변화시키면 서보가 최소값과 최대값으로 이동합니다. (위 사진은 PPM 핀이 있는 6채널 수신기를 보여줍니다.)

쉬운 방법은 각 핀에서 펄스 폭을 측정하고 필요에 따라 데이터를 매핑하는 것입니다. 하지만 여기에 문제가 있습니다:

이 문제를 해결하기 위해 많은 수신기에는 PPM이라는 추가 핀이 있습니다. 이 PPM 핀은 모든 채널의 데이터를 단일 신호로 전송합니다.

PPM 핀 신호 구성 방식

아두이노로 RC 수신기 PPM 신호 디코딩하기: 단계별 가이드
아두이노로 RC 수신기 PPM 신호 디코딩하기: 단계별 가이드

이 신호는 빈 공간으로 구분된 데이터 패킷으로 구성됩니다. 여기서는 피크 사이의 공간이 채널의 값을 나타냅니다. 이 경우 6채널 수신기를 사용했으므로 7개의 펄스가 있습니다.

따라서 코드에서 먼저 분리 공간을 감지한 다음 각 채널에 대한 펄스에서 데이터를 기록하기 시작해야 합니다.

두 번째 이미지에서 볼 수 있듯이,

모든 데이터는 약 11500 마이크로초의 시간으로 분리됩니다. 그다음 6개의 값이 각 채널에 해당합니다.

코드 사용 방법

아두이노로 RC 수신기 PPM 신호 디코딩하기: 단계별 가이드

여기서 read_me()는 다음과 같이 지정된 함수입니다:

a=micros(); c=a-b; b=a; x[i]=c; i=i+1; if(i==15){for(int j=0;j<15;j++) {ch1[j]=x[j];} i=0; } }

이 부분은 인터럽트 핀에서 실행되어 15개의 시간 값을 배열에 저장합니다.

다른 함수인 read_rc()는 다음과 같습니다:

이 부분은 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개 채널 값 할당
}

제조공정

  1. 라즈베리 파이 대시보드로 집 온도 모니터링하기
  2. 아두이노만으로 DTMF 디코더 구축하기 – 추가 IC 불필요
  3. 아두이노로 모니터 앰비라이트(Ambilight) 시스템 직접 만들기
  4. 아두이노로 초음파 부양 장치 만들기: 단계별 가이드
  5. 아두이노 우노로 Atmel AT89 시리즈 손쉽게 프로그래밍하기 - 단계별 가이드
  6. 아두이노와 스마트폰으로 만드는 스마트 전압계 – 초간단 DIY 프로젝트
  7. 아두이노와 MAX30100으로 만드는 실시간 IoT 심박수 모니터
  8. 아두이노 우노 와이파이 웹 서버: 브라우저로 LED 제어하기
  9. 스마트 주차 카운터: 아두이노, 프로세싱, PHP로 실시간 차량 추적
  10. ECG 기반 실시간 심박수 LED 시각화 장치