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

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

부품 및 소모품

아두이노 우노1개
SG90 마이크로 서보 모터2개

프로젝트 소개

아두이노의 모든 디지털/아날로그 핀(A6, A7 제외)에서 RC 수신기 PWM 신호(또는 일반 PWM)를 읽고, 송신기 신호 손실 시 안전한 페일세이프 값을 출력하는 범용 코드입니다. 핀 변경 인터럽트(Pin Change Interrupt)를 활용해 pulseIn()처럼 블로킹하지 않고 효율적으로 측정합니다.

아래 영상은 이 코드(PWMread_RCfailsafe.ino)로 아두이노 우노를 서보 믹서로 사용하는 예시입니다.

목차

서보와 속도 컨트롤러는 어떻게 PWM으로 제어되나?

서보/ESC 제어용 PWM(1000~2000μs 펄스 폭, 약 50Hz)에 대한 이해가 필요합니다. 좋은 설명 영상 참고. 또한 아두이노 IDE, 변수 타입, 제어문, 배열, Servo 라이브러리 기초 지식이 필요합니다.

RC 모델/로봇에서 아두이노 활용 예

코드 개요: RC 수신기 PWM 디코딩 with 페일세이프

핀 변경 인터럽트로 PWM 측정. 선택한 핀들의 포트 레지스터(Port B/C/D)에 따라 3개 ISR(PCINT0_vect, PCINT1_vect, PCINT2_vect) 중 하나가 트리거됩니다. ISR 내부에서 어떤 핀이 변했는지 판별, micros()로 시간 기록, 펄스 폭과 주기 계산, 플래그 설정. 메인 루프에서 플래그 확인 후 데이터 처리.

주의: SoftwareSerial 등 핀 변경 인터럽트 쓰는 라이브러리와 충돌함.

핵심 함수 RC_decode(): 펄스 폭(1000~2000μs)을 ±100%(±1.0) 제어 신호로 변환. 페일세이프는 10~330Hz, 500~2500μs 범위 밖이면 사전 설정된 페일세이프 값 반환. 송신기별 캘리브레이션 값(RC_min[], RC_mid[], RC_max[])과 페일세이프 위치(RC_failsafe[])는 코드 내 배열로 설정.

참고: Joop Brokking 영상 (핀 변경 인터럽트로 RC 수신기 읽기 원리 8분간 설명), 포트 조작 튜토리얼

PWMread_RCfailsafe.ino 사용법

1단계: 예제 하드웨어 구성 (아두이노 우노 기준)

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

2단계: PWMread_RCfailsafe.ino 스케치 폴더에 복사

예제 스케치 RC_Read_Example 다운로드 후 메인 스케치로 사용. .ino 파일을 같은 폴더에 넣으면 IDE에서 두 번째 탭으로 나타남.

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

3단계: 입력 핀 지정

PWMread_RCfailsafe 탭 → USER DEFINED VARIABLES 섹션 → pwmPIN[] 배열에 입력 핀 번호 나열. 순서가 채널 순서(첫 번째=채널 1). 핀 개수/순서 자유, A6/A7 불가. 아두이노 메가 미지원(수정 가능).

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

4단계: 사용 가능 함수 확인

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

5단계: 원시 펄스 폭 데이터 시리얼 출력 (캘리브레이션용)

RC_avail()로 새 데이터 확인 → print_RCpwm()로 시리얼 출력.

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

6단계: 송신기 캘리브레이션

시리얼 모니터의 원시 펄스 폭 값을 보고 RC_min[], RC_mid[], RC_max[] 배열 수정. 풀 레이트로 조작해 최대 해상도 확보.

7단계: 캘리브레이션된 채널 출력 확인

print_RCpwm() 주석 처리 → RC_decode(channel)로 ±1 범위 변환 → decimal2percentage()로 % 출력.

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

8단계: 페일세이프 위치 설정

RC_failsafe[] 배열에 각 채널별 페일세이프 값(±1 범위) 입력. 송신기 온/오프로 동작 확인. 수신기 자체 페일세이프 기능은 끄세요 (아두이노가 신호 손실 감지 못 함).

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

수신기 프레임 레이트 및 주파수 표시

PWM_read(채널)로 새 펄스 감지 → PWM_period(), PWM_freq()로 주기/주파수 추출. 채널 1이 프레임 첫 펄스이므로 권장. PWM_read()를 RC_decode()보다 먼저 호출해야 함 (같은 플래그 공유). 예제: RC_FrameRate.ino.

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

수신기 주기(보통 20ms) 알면 다음 데이터 도착 전까지 처리 시간 계산 가능. RC_avail()가 일정 시간(예: 21ms) 내 새 데이터 못 받으면 강제로 RC_decode() 호출해 페일세이프 트리거하거나 PID 루프를 일정 주기로 돌릴 수 있음.

now = millis();
if(RC_avail() || now - rc_update > 21) {
  rc_update = now;
  // RC_decode()로 입력 업데이트
  // PID 컨트롤러 실행
  // 서보 믹싱 적용
  // 서보 위치 지정
}

서보 믹싱 예제

RC_ServoMixer_Example.ino 참조. 2채널(엘리베이터 CH2, 에일러론 CH3)을 믹싱해 2개 서보(D9, D10)로 출력. 서보 라이브러리 사용. 방향/레이트/서브트림 설정 가능.

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

믹스 공식: mix1 = CH2 - CH3, mix2 = CH2 + CH3 (출력 범위 -1~+1 클램프). 서보 펄스 폭(μs) 변환 함수 calc_uS()로 방향/레이트/서브트림 반영.

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

중립 1500μs, 최대 편차 ±500μs 기준: pulse = 1500 + (서보_위치% × 레이트 × 방향 + 서브트림) × 500. 방향/레이트/서브트림은 정적이거나 다른 채널 입력으로 동적 변경 가능.

이 접근 방식의 이유

pulseIn()은 펄스 대기 중 코드 블로킹, 다중 입력 시 데이터 손실. 핀 변경 인터럽트 + 직접 포트 조작으로 메인 루프 지연 최소화. 하지만 구현 복잡함. → 범용 .ino 파일로 모듈화해 프로젝트 간 이식 쉽게 만들었음. 복사→핀 지정→함수 호출만 하면 됨.

한계점

micros() 함수 해상도

4μs 단위 카운트. 실용상 충분. 0.5μs 해상도 필요시 타이머 인터럽트 사용(가이드).

코드 효율성

6~9채널 수신 시 ISR 처리 시간이 전체의 1.4~2.0%. 채널 수별 ISR 소요 시간:

채널 수ISR 최대 소요 시간
1< 8μs
2< 12μs
3< 16μs
4< 20μs
5< 20μs
6< 24μs

ISR 진입/종료 약 4μs. 펄스 1개 측정 시 ISR 2회 실행(상승/하강). 6채널 기준 펄스 1개 측정 48μs, 전체 6채널 288μs. 20ms 주기 대비 1.44%. pulseIn()은 채널당 최대 20ms 블로킹이니 훨씬 효율적.

최대 실용 주파수: 2.5kHz (micros() 100스텝 해상도). 1채널 2.5kHz 시 ISR 점유율 3%, 최소 측정 듀티 0.03(펄스 폭 12μs). 더 고주파수는 ISR 재작성 필요.

코드

전체 코드는 원문 참조 (용량상 생략). GitHub 또는 프로젝트 페이지에서 다운로드 가능.

회로도

RC 수신기: 5V/GND(ICSP 핀), 신호 6선 → D2~D7
마이크로 서보 1: 5V/GND, 신호 → D9
마이크로 서보 2: 3.3V/GND, 신호 → D10

아두이노 PWM 리더 & RC 수신기 디코더: 내장 페일세이프로 안전하게

제조공정

  1. C 입출력(I/O) 마스터: 표준 스트림, 문자/행/포맷 입출력 함수 총정리
  2. 아두이노 우노로 만드는 LCD 애니메이션 & 게임 기초
  3. 아두이노와 스마트폰으로 만드는 스마트 전압계 – 초간단 DIY 프로젝트
  4. 아두이노 DHT11 이더넷 실드 온습도 데이터 로거
  5. DHT11 온습도 센서와 블링크(Blynk)로 원격 모니터링하기 - 아두이노 단계별 튜토리얼
  6. 파이썬 3로 아두이노 우노 제어하기 – 시리얼 통신 LED 제어 기초
  7. 아두이노 나노 + 128x64 OLED로 실시간 셀룰러 오토마타 (생명 게임) 구현
  8. 아두이노 나노와 RDA8057M으로 소형 FM 라디오 만들기
  9. 아두이노와 TEA5767 모듈로 만드는 고성능 FM 라디오 수신기
  10. 아두이노용 절연 아날로그 입력 회로 만들기