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

Arduino를 사용하여 RC 수신기 PPM 신호 읽기

구성품 및 소모품

Arduino UNO
× 1

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

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

모든 RC 수신기는 서보 모터를 구동하도록 만들어졌습니다. 따라서 각 채널에는 접지, Vcc 및 신호의 3개의 핀이 있습니다. 여기서 특별한 종류의 신호가 사용됩니다. 일정 간격으로 펄스를 보냅니다. 서보가 1.5ms 펄스를 받으면 90도로 설정되고 이 값을 1-2ms에서 변경하여 서보가 최소값과 최대값으로 이동합니다. (위 사진에서 6채널 수신기는 PPM 핀으로 보여집니다)

그래서 쉬운 방법은 각 핀에서 펄스 폭을 측정하고 요구 사항에 따라 해당 데이터를 매핑하는 것입니다. 하지만 여기서 문제는 다음과 같습니다.

<울>
  • 수신기의 각 채널에 대해 와이어를 Arduino 핀에 연결해야 합니다. 이것은 많은 연결이 필요할 뿐만 아니라 Arduino에서 많은 핀을 소모합니다.
  • <울>
  • 대부분의 Arduino에는 2개의 인터럽트 핀이 있으므로 2개 이상의 채널을 사용하는 경우 이를 읽어 코드에 지연을 추가하여 일부 애플리케이션에 문제가 될 수 있습니다.
  • 이 문제를 해결하기 위해 많은 수신기에는 PPM이라는 추가 핀이 있습니다. 이 PPM 핀은 단일 신호로 모든 채널의 데이터를 전송합니다.

    PPM 핀 신호는 어떻게 구성됩니까?

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

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

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

    모든 데이터는 약 11500마이크로초의 시간으로 분리됩니다. 각 채널에 대해 6개 이상의 값이 있습니다.

    코드 사용:

    여기 read_me() 함수로 지정됨:

    a=micros(); c=a-b; b=아; 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[ channel no]라는 배열에 저장됩니다. 여기에서는 ch[1], ch[2], ch[3], ch[4], ch[5 ], 채널[6] 각 채널의 가치를 나타냅니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • RC 수신기 채널 읽기용 코드
  • RC 수신기 채널 읽기용 코드Arduino
    unsigned long int a,b,c;int x[15],ch1[15],ch[7],i;//값을 저장할 배열 및 변수 지정 void setup() {Serial.begin(9600); 핀모드(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);}무효 read_me() { // 이 코드는 PPM 핀(핀 2 또는 3)에서 RC 수신기의 값을 읽습니다. // 이 코드는 0-1000 값의 채널 값을 제공합니다. // -:ABHILASH :- //a=micros(); //핀 값이 떨어질 때 시간 값 a를 저장 c=a-b; //두 피크 사이의 시간 계산b=a; // x[i]=c; // arrayi=i+1에 15개의 값 저장; 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. Raspberry Pi를 사용하여 집 온도 모니터링
    2. Arduino만 사용하는 DTMF 디코더
    3. Arduino를 사용하여 모니터 Ambilight 만들기
    4. ARDUINO를 사용하는 초음파 부상 기계
    5. Arduino를 통한 Atmel AT89 시리즈 프로그래밍
    6. Arduino와 스마트폰을 사용한 DIY 전압계
    7. IoT를 사용한 심박수 모니터
    8. Arduino Uno WiFi를 사용하는 WebServerBlink
    9. Arduino + Processing + PHP를 사용한 자동차 카운터
    10. ECG를 사용한 심장 박동 표시기