이 프로젝트에서는 PIC 마이크로 컨트롤러를 사용하여 IR 리모컨을 사용하여 적은 수의 AC 부하를 원격으로 제어 할 것입니다. 유사한 프로젝트 IR 원격 제어 홈 자동화는 이미 Arduino에서도 수행되었지만 여기에서는 EasyEDA의 온라인 PCB 설계자 및 시뮬레이터를 사용하여 PCB에서 설계했으며 PCB 설계 서비스를 사용하여 다음 섹션에 표시된대로 PCB 보드를 주문했습니다. 조.
이 프로젝트가 끝나면 안락한 의자 / 침대에서 일반 리모컨을 사용하여 AC 부하를 전환 (ON / OFF) 할 수 있습니다. 이 프로젝트를 더욱 흥미롭게 만들기 위해 Triac의 도움으로 팬의 속도를 제어하는 기능도 활성화했습니다. 이 모든 작업은 IR 리모컨에서 간단한 클릭만으로 수행 할 수 있습니다. 이 프로젝트에는 TV / DVD / MP3 리모컨을 사용할 수 있습니다. 리모트로부터의 다른 IR 신호는 마이크로 컨트롤러에 의해 수신되고 릴레이 드라이버 회로를 통해 각 릴레이를 제어합니다. 이 릴레이는 AC 부하 (조명 / 팬)를 연결하고 분리하는 데 사용됩니다.
작동 설명:
이 프로젝트의 작업은 이해하기 매우 간단합니다. IR 리모컨 에서 버튼을 누르면 38Khz 변조 주파수를 사용하여 인코딩 된 펄스 형태로 일련의 코드를 전송합니다. 이 펄스는 TSOP1738 센서에서 수신 한 다음 컨트롤러에서 읽습니다. 그런 다음 컨트롤러는 수신 된 펄스 열을 16 진수 값으로 디코딩하고이를 프로그램의 사전 정의 된 16 진수 값과 비교합니다.
일치하는 항목이 있으면 컨트롤러는 각 Relay / Triac을 트리거하여 상대 작업을 수행하고 해당 결과도 온보드 LED로 표시됩니다. 여기이 프로젝트에서는 조명 부하로 색상이 다른 4 개의 전구 (작은 전구)를 사용했으며 다른 전구 (더 큰 전구)는 데모 용 팬으로 간주합니다.
릴레이 1을 토글하려면 키 1을, 릴레이 2를 토글하려면 2를, 릴레이 3을 토글하려면 3을, 릴레이 4를 토글하려면 4를, 팬 속도를 높이려면 Vol +를, 팬 속도를 낮추려면 Vol-를 선택했습니다.
참고: 여기에서는 팬 대신 100 와트 전구를 사용했습니다.
다양한 장치에 사용할 수있는 여러 유형의 IR 리모컨이 있지만 대부분은 38KHz 주파수에서 작동합니다. 이 프로젝트에서는 IR TV 리모컨을 사용하여 가전 제품을 제어하고 IR 신호를 감지하기 위해 TSOP1738 IR 수신기를 사용합니다. 이 TSOP1738 센서는 38Khz 주파수 신호를 감지 할 수 있습니다. IR 원격 및 TSOP1738의 작동은이 기사에서 자세히 다룹니다. IR 송신기 및 수신기
PIC 마이크로 컨트롤러는 + 5V에서 작동하고 릴레이는 + 12V에서 작동하므로 변압기를 사용하여 220V AC를 낮추고 풀 브리지 정류기를 사용하여 정류합니다. 이 정류 된 DC 전압은 조정기 IC 7812 및 7805를 사용하여 각각 + 12V 및 + 5V로 조정됩니다.
릴레이를 트리거하기 위해 BC547과 같은 트랜지스터를 사용하여 PIC 마이크로 컨트롤러의 신호를 기반으로 릴레이를 켜고 끄는 전자 스위치 역할을 할 수 있습니다. TRIAC는 출력 전압을 제어 할 수있는 전력 반도체입니다. 이 기능은 팬의 속도를 제어하는 데 사용됩니다.
또한 PIC 마이크로 컨트롤러를 사용하여 Triac을 제어하기 위해 Triac 드라이버를 사용했습니다. 이 드라이버는 출력 전력을 제어 할 수 있도록 Triac에 발사 각도 펄스를 제공하는 데 사용됩니다. 여기에서는 6 단계의 속도 제어를 사용했습니다. 레벨이 0이면 팬이 꺼집니다. 레벨이 1이면 속도는 전체 속도의 1/5입니다. 레벨이 2가되면 속도는 전속력의 2/5가되고 나머지는 각각 속도가됩니다. 현재 속도 수준은 온보드 7- 세그먼트 디스플레이를 사용하여 모니터링 할 수 있습니다.
프로젝트의 블록 다이어그램은 아래와 같습니다.
구성품:
이 프로젝트를 빌드하는 데 필요한 구성 요소는 다음과 같습니다.
- PIC18f2520 마이크로 컨트롤러 -1
- TSOP1738-1
- IR TV / DVD 리모컨 -1
- 트랜지스터 BC547-4
- 릴레이 12 volt -4
- 홀더가있는 전구 -5
- 전선 연결-
- EasyEda PCB -1
- 16x2 LCD
- 전원 공급 장치 12v
- 터미널 커넥터 2 핀`-8
- 터미널 커넥터 3 핀 -1
- 변압기 12-0-12 -1-
- 전압 레귤레이터 7805-1
- 전압 레귤레이터 7812-1
- 커패시터 1000uf -1
- 커패시터 10uf -1
- 커패시터 0.1uf -1
- 커패시터 0.01uf 400V`-1
- 10,000 -5
- 1k -5
- 100 옴 -7
- 공통 음극 세그먼트 -1
- 1n4007 다이오드 -10
- BT136 트라이 액 -1
- 남성 / 여성 헤더-
- LED -6
- 광 커플러 moc3021 -1
- 옵토 커플러 mtc2e 또는 4n35 -1
- 20Mhz 크리스탈 -1
- 33pf 커패시터 -2
- 5.1v 제너 다이오드 -1
- 47ohm 2 와트 저항 -1
이러한 모든 구성 요소는 일반적으로 사용되며 쉽게 구입할 수 있습니다. 그러나 온라인에서 베스트 바이를 찾고 있다면 LCSC를 추천합니다.
LCSC는 모든 종류의 프로젝트를 위해 전자 부품을 구매할 수있는 훌륭한 온라인 상점입니다. 약 25,000 종류의 부품이 특징이며, 가장 좋은 점은 소규모 프로젝트를 위해 소량의 품목도 판매하고 Global Shipping도 있다는 것입니다.
IR 리모컨 디코딩:
앞서 말했듯이 프로젝트에 모든 종류의 리모컨을 사용할 수 있습니다. 그러나 우리는 특정 리모컨에서 어떤 종류의 신호가 생성되는지 알아야합니다. 리모컨의 모든 개별 키에 대해 해당 키에 대해 동등한 HEX 값이 있습니다. 이 HEX 값을 사용하여 마이크로 컨트롤러 측의 각 키를 구분할 수 있습니다. 따라서 리모컨을 사용하기 전에 특정 리모컨에 미리 설정된 키의 HEX 값을 알아야합니다. 이 프로젝트에서는 NEC 리모컨을 사용했습니다. NEC 리모컨의 키에 대한 HEX 값은 다음과 같습니다.
HEX 값에는 7 개의 문자가 있고 마지막 2 개만 다른 것을 알 수 있습니다. 따라서 각 키를 구별하기 위해 마지막 2 자리 만 고려할 수 있습니다.
회로도:
프로젝트의 회로도는 아래와 같습니다.
위의 회로도는이 프로젝트에 사용 된 모든 구성 요소의 레이아웃을 제공하므로 esayEDA 회로도 편집기를 사용하여 쉽게 만들었습니다. 또한 설치가 필요하지 않으며 이동 중에 온라인으로 사용할 수 있습니다.
핀 배치 및 구성 요소 값은 위의 회로도에 명확하게 지정되어 있습니다. 여기에서 회로도 파일을 다운로드 할 수도 있습니다.
프로그램 작성:
이 프로젝트의 프로그램은 MPLABX를 사용하여 수행되며 코드도 매우 간단하고 이해하기 쉽습니다. 전체 코드는이 튜토리얼의 끝 부분에 제공되며 프로그램의 몇 가지 중요한 부분이 아래에 설명되어 있습니다.
코드 시작 부분에 필요한 라이브러리를 포함하고 핀을 정의하고 변수를 선언해야합니다.
#포함
그 후 "for"루프를 사용하여 간단한 지연 함수를 만들었습니다.
무효 지연 (int time) {for (int i = 0; i
그 후 다음 함수를 사용하여 타이머를 초기화했습니다.
void timer () // 10-> 1us {T0PS0 = 0; T0PS1 = 0; T0PS2 = 0; PSA = 0; // 타이머 클럭 소스는 프리스케일러 T0CS = 0; // 프리스케일러는 FCPU (5MHz)에서 클럭을 가져옵니다. T08BIT = 0; // 16 비트 모드 TMR0IE = 1; // TIMER0 인터럽트 사용 PEIE = 1; // 주변 인터럽트 활성화 GIE = 1; // 전역 적으로 INT 활성화 TMR0ON = 1; // 이제 타이머를 시작하십시오! }
이제 주 함수에서 선택한 핀에 대한 방향을 제공하고 타이머 및 외부 인터럽트 int0을 초기화하여 제로 크로싱을 감지합니다.
ADCON1 = 0b00001111; TRISB1 = 0; TRISB2 = 1; TRISB3 = 0; TRISB4 = 0; TRISB5 = 0; TRISC = 0x00; TRISA = 0x00; PORTA = 0xc0; TRISB6 = 0; RB6 = 1; relay1 = 0; relay2 = 0; relay3 = 0; relay4 = 0; rly1LED = 0; rly3LED = 0; rly2LED = 0; rly4LED = 0; fanLED = 0; i = 0; ir = 0; tric = 0; 시간제 노동자(); INTEDG0 = 0; // 하강 에지에서 인터럽트 INT0IE = 1; // INT0 외부 인터럽트 활성화 (RB0) INT0IF = 0; // INT0 외부 인터럽트 플래그 삭제 bit PEIE = 1; // 주변 인터럽트 활성화 GIE = 1; // 전역 적으로 INT 활성화
이제 여기서는 IR 신호를 감지하기 위해 인터럽트 또는 캡처 및 비교 모드를 사용하지 않습니다. 여기에서는 누름 버튼을 읽는 것처럼 데이터를 읽기 위해 디지털 핀을 사용했습니다. 신호가 높거나 낮을 때마다 디 바운싱 방법을 넣고 타이머를 실행합니다. 핀이 다른 상태로 변경 될 때마다 시간 값이 배열에 저장됩니다.
IR 원격은 로직 0을 562.5us로, 로직 1을 2250us로 보냅니다. 타이머가 약 562.5us를 읽을 때마다 0으로 가정하고 타이머가 약 2250us를 읽을 때 1로 가정 한 다음 16 진수로 변환합니다.
리모트에서 들어오는 신호는 34 비트를 포함합니다. 배열에 모든 바이트를 저장 한 다음 사용할 마지막 바이트를 디코딩합니다.
while (ir == 1); INT0IE = 0; while (ir == 0); TMR0 = 0; while (ir == 1); i ++; dat = TMR0; if (dat> 5000 && dat <12000) {} else {i = 0; INT0IE = 1; } if (i> = 33) {GIE = 0; 지연 (50); cmd = 0; for (j = 26; j <34; j ++) {if (dat> 1000 && dat <2000) cmd << = 1; 그렇지 않으면 if (dat> 3500 && dat <4500) {cmd- = 0x01; cmd << = 1; }} cmd >> = 1;
위의 코드는 타이머 인터럽트를 사용하여 IR 신호를 수신 및 디코딩하고 해당 HEX 값을 변수 cmd에 저장합니다. 이제이 HEX 값 (cmd 변수)을 사전 정의 된 HEX 값과 비교하고 아래와 같이 릴레이를 전환 할 수 있습니다.
if (cmd == 0xAF) {릴레이 1 = ~ 릴레이 1; rly1LED = ~ rly1LED; } else if (cmd == 0x27) {relay2 = ~ relay2; rly2LED = ~ rly2LED; } else if (cmd == 0x07) {relay3 = ~ relay3; rly3LED = ~ rly3LED; } else if (cmd == 0xCF) {relay4 = ~ relay4; rly4LED = ~ rly4LED; } else if (cmd == 0x5f) {속도 ++; if (속도> 5) {속도 = 5; }} else if (cmd == 0x9f) {속도-; if (속도 <= 0) {속도 = 0; }}
이제 어떤 팬이 현재 작동 중인지 알기 위해 7 세그먼트 디스플레이를 사용해야합니다. 다음 줄은 7 세그먼트 디스플레이의 핀을 지시하는 데 사용됩니다.
if (speed == 5) // 꺼짐 5x2 = 10ms triger // speed 0 {PORTA = 0xC0; // 0 표시 RB6 = 1; fanLED = 0; } else if (speed == 4) // 8ms 트리거 // speed 1 {PORTA = 0xfc; // 1 개 표시 RB6 = 1; fanLED = 1; } else if (speed == 3) // 6ms 트리거 // 속도 2 {PORTA = 0xE4; // 2 개 표시 RB6 = 0; fanLED = 1; } else if (speed == 2) // 4ms 트리거 // 속도 3 {PORTA = 0xF0; // 3 개 표시 RB6 = 0; fanLED = 1; } else if (speed == 1) // 2ms 트리거 // 속도 4 {PORTA = 0xD9; // 4 개 표시 RB6 = 0; fanLED = 1; } else if (speed == 0) // 0ms 트리거 // 속도 5 최대 전력 {PORTA = 0xD2; // 5 개 표시 RB6 = 0; fanLED = 1; }
아래 기능은 외부 인터럽트 및 시간 오버플로를위한 것입니다. 이 기능은 제로 크로싱을 감지하고 트라이 액을 구동합니다.
무효 인터럽트 isr () {if (INT0IF) {지연 (속도); tric = 1; for (int t = 0; t <100; t ++); tric = 0; INT0IF = 0; } if (TMR0IF) // TMR0 Overflow ISR {TMR0IF = 0; }}
이 IR 원격 제어 홈 오토메이션 의 최종 PCB는 다음과 같습니다.
EasyEDA를 사용한 회로 및 PCB 설계:
이 원격 제어 홈 자동화 를 설계하기 위해 우리는 회로와 PCB를 원활하게 생성하기위한 무료 온라인 EDA 도구 인 EasyEDA를 사용했습니다. 우리는 이전에 EasyEDA에서 PCB를 거의 주문하지 않았고 회로 그리기에서 PCB 주문에 이르기까지 전체 프로세스를 발견함에 따라 여전히 서비스를 사용하고 있으며 다른 PCB 제조업체에 비해 더 편리하고 효율적입니다. EasyEDA는 회로 도면, 시뮬레이션, PCB 설계를 무료로 제공하며 고품질이지만 저렴한 가격으로 맞춤형 PCB 서비스를 제공합니다. 회로도, PCB 레이아웃, 회로 시뮬레이션 등에 Easy EDA를 사용하는 방법에 대한 전체 자습서를 보려면 여기를 확인하십시오.
EasyEDA는 매일 개선되고 있습니다. 그들은 많은 새로운 기능을 추가하고 전반적인 사용자 경험을 향상시켜 EasyEDA를 회로 설계에 더 쉽고 유용하게 만듭니다. 곧 오프라인 사용을 위해 컴퓨터에 다운로드하여 설치할 수있는 데스크톱 버전을 출시 할 예정입니다.
EasyEDA에서는 회로 및 PCB 설계를 공개하여 다른 사용자가 복사 또는 편집하고 이점을 얻을 수 있도록 할 수 있습니다. 또한이 원격 제어 홈 자동화를 위해 전체 회로 및 PCB 레이아웃을 공개했습니다 .
아래는 EasyEDA의 PCB 레이아웃의 상단 레이어 스냅 샷이며, '레이어'창에서 레이어를 선택하여 PCB의 모든 레이어 (Top, Bottom, Topsilk, bottomsilk 등)를 볼 수 있습니다.
온라인 PCB 샘플 계산 및 주문:
PCB 설계를 완료 한 후 Fabrication output 아이콘을 클릭 하면 PCB 주문 페이지로 이동합니다. 여기에서 Gerber Viewer에서 PCB를 보거나 PCB의 Gerber 파일을 다운로드하여 모든 제조업체에 보낼 수 있으며 EasyEDA에서 직접 주문하는 것이 훨씬 쉽고 저렴합니다. 여기서 주문하려는 PCB 수, 필요한 구리 층 수, PCB 두께, 구리 무게 및 PCB 색상까지 선택할 수 있습니다. 모든 옵션을 선택한 후 "카트에 저장"을 클릭하고 주문을 완료하면 며칠 내에 PCB를 받게됩니다.
이 PCB를 직접 주문하거나이 링크를 사용하여 Gerber 파일을 다운로드 할 수 있습니다.
PCB를 주문한 지 며칠 후 우리는 PCB를 얻었습니다. 우리가받은 보드는 아래와 같습니다.
PCB를 받으면 필요한 모든 구성 요소를 PCB에 장착하고 마지막으로 IR 원격 제어 홈 오토메이션을 준비했습니다. 기사 끝의 데모 비디오에서이 회로가 작동하는지 확인합니다.