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

3D 인쇄 케이스가 있는 배터리 전원 TV 리모컨

구성품 및 소모품

Arduino UNO
× 1
9V 배터리(일반)
× 1
9V 대 배럴 잭 커넥터
× 1
IR 송신기(일반)
× 1
기계 나사, M3
× 4
기계 나사, M2.5
× 3
M3 너트
× 4
M2.5 너트
× 3
스루 홀 저항기, 47옴
× 2
프로토타이핑 보드, 2.54mm
× 1
PCB 푸시 버튼
× 6
남성 헤더 36 위치 1 행 길이(0.1")
× 1

필요한 도구 및 기계

3D 프린터(일반)
납땜 인두(일반)
납땜 와이어, 무연
PLA 필라멘트, 직경 1.75mm

이 프로젝트 정보

소개

여자친구의 TV 리모컨이 작동을 멈췄습니다. 그녀는 근처 상점에서 저렴한 교체품을 구입할 수도 있었지만 생각했습니다. 우리 둘 다 엔지니어, 함께 우리만의 것을 만들자!

우리는 기술이 상당히 보완적이기 때문에 봉쇄 기간 동안 시간을 ​​보낼 수 있는 색다른 방법이었지만 재미있는 방법이었고 일상적인 기술이 어떻게 작동하는지 조금 배울 수 있는 기회를 주었습니다.

아, 그리고 집에 작은 3D 프린터가 있는 것도 한몫했습니다.

작동 방식

우선 아두이노 UNO를 기반으로 심플한 디자인을 만들고 싶었기 때문에 TV를 작동시키는 데 필요한 최소한의 명령어 수를 평가했다. ON/OFF 토글, 소스 선택, Ch+, Ch-, Vol+, Vol-의 6개 명령이면 충분하다고 생각했습니다.

버튼 읽기

추가 저항의 사용을 피하기 위해 설계는 Arduino의 내부 풀업 저항에 의존합니다. 리모콘이 절전 모드가 아닌 경우(아래 참조) 각 버튼 상태는 각 루프 주기에서 폴링됩니다. 여러 히트를 계산하는 것을 피하기 위해 millis()를 활용하는 간단한 디바운싱 루틴이 구현됩니다. 기능.

적외선 신호 보내기

적외선 통신은 IRremote.h에 의해 처리됩니다. 라이브러리(코더에게 경의를 표합니다!). 우리가 해야 할 일은 TV에 대한 프로토콜을 설정하고(다른 제조업체에서 자체 프로토콜을 개발했습니다) Google에서 사용하려는 다양한 명령의 HEX 코드를 검색하여 버튼에 연결하는 것뿐이었습니다. 회로 설계와 관련하여 라이브러리의 명령이 IR LED를 효과적으로 파일럿하도록 하려면 Arduino UNO의 핀 3에 연결해야 합니다.

현재 이 코드는 #define 주석을 달거나 주석 처리를 해제하여 선택할 수 있는 세 가지 유형의 TV용으로 작성되었습니다. 코드의 첫 부분에 있는 지시문.

배터리 저장

전력 소비를 줄이기 위해 avr/sleep.h의 명령을 활용하는 몇 가지 전략이 구현됩니다. 및 avr/power.h 라이브러리.

사용하지 않는 모든 주변 장치 및 인터페이스(ADC, SPI, TWI, timer1, usart)는 설정 루틴에서 꺼집니다. PWM 핀 13의 내장 LED도 꺼집니다. 또한 권장 작업은 아니지만 항상 켜져 있는 Arduino UNO의 전원 LED를 납땜 제거하기로 결정했습니다.

또한 millis()를 이용하여 , 5초 동안 아무 버튼도 누르지 않으면 리모콘이 절전 모드로 들어가고 On/Off 버튼을 다시 누르면 깨어납니다.

제작 방법

전자제품 조립

전체 회로는 Arduino UNO 헤더에 맞도록 설계된 프로토타이핑 보드에 내장되어 있습니다. 납땜 인두를 사용하여 리모컨의 최종 위치를 고려하여 버튼을 납땜했습니다. 하단 부분에는 IR LED를 통해 원하는 전류를 얻기 위해 두 개의 47ohm 저항이 병렬로 납땜되었습니다.

솔더 와이어를 사용하여 버튼 핀과 IR LED를 수 핀 헤더에 연결하기 위해 프로토타이핑 보드에 트레이스를 만들었습니다.

이러한 방식으로 보드는 핀 헤더를 사용하여 Arduino UNO에 장착된 실드와 유사하여 모든 올바른 연결을 보장합니다.

인클로저 캐드 그리고 CAM

인클로저는 배터리, Arduino UNO + 프로토타이핑 보드 어셈블리를 포함하도록 설계되었으며 상단의 버튼과 전면의 IR LED만 노출됩니다.

인클로저는 SolidWorks CAD 소프트웨어를 사용하여 설계되고 Ultimaker Cura 슬라이싱 소프트웨어로 사전 처리되고 마지막으로 Anycubic Mega Zero 3D 프린터를 사용하여 PLA로 3D 인쇄되는 두 부분으로 구성됩니다.

Arduino UNO는 베이스 내부에서 돌출된 정렬 구멍에 맞는 3개의 M2.5 나사를 사용하여 베이스에 고정됩니다. Arduino가 고정되면 IR LED가 프로토타이핑 보드 외부로 돌출됩니다. 목적에 맞게 제작된 구멍과 정렬하고 인클로저의 두 부분을 조립하는 동안 제자리에 유지하기 위해 3개의 미니 포스트가 추가됩니다. LED 리드의 측면 움직임. 배터리는 전용 공간에 압입되어 있습니다.

커버는 버튼만 노출되도록 디자인하였으며, 각 버튼 외에 각 버튼의 기능을 나타내기 위해 기호를 각인하였습니다.

인클로저의 베이스와 커버는 4개의 M3 나사를 사용하여 조립됩니다.

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

코드

<울>
  • TV_remote.ino
  • TV_remote.ino아두이노
    #include #include #include // 핀 정의// IR LED는 Arduino PWM 핀 3에 연결되어야 합니다.#define OnOff 1# 소스 정의 0#define CH_plus 4#define CH_minus 5#define Vol_plus 6#define Vol_minus 7#define Interrupt_Pin 2 //Arduino Uno의 핀 2 또는 3만// TV 모델 정의//#define LG_TV//#define SAMSUNG_TV#define SONY_TV// 코드 정의#ifdef LG_TV unsigned long on_off_code =551489775; // HEX 20DF10EF unsigned long vol_plus_code =551502015; //HEX 20DF40BF unsigned long vol_minus_code =551534655; //HEX 20DFC03F unsigned long ch_plus_code =551485695; //HEX 20DF00FF unsigned long ch_minus_code =551518335; //HEX 20DF807F unsigned long source_code =551538735; //HEX 20DFD02F#endif#ifdef SAMSUNG_TV unsigned long on_off_code =3772793023; // HEX E0E040BF unsigned long vol_plus_code =3772833823; //HEX E0E0E01F unsigned long vol_minus_code =3772829743; //HEX E0E0D02F unsigned long ch_plus_code =3772795063; //HEX E0E048B7 unsigned long ch_minus_code =3772778743; //HEX E0E008F7 unsigned long source_code =3772809343; //HEX E0E0807F#endif#ifdef SONY_TV unsigned long on_off_code =2704; //HEX A90 unsigned long vol_plus_code =1168; //HEX 490 unsigned long vol_minus_code =3216; //HEX C90 unsigned long ch_plus_code =144; //HEX 090 unsigned long ch_minus_code =2192; //HEX 890 unsigned long source_code =2640; //HEX A50#endif//디버그 활성화//#define DEBUG//IRsend irsend; //IR 객체 생성 unsigned long debounce_time;unsigned long last_time;void setup() { analogWrite(13,0); //내장 led의 턴 //noInterrupts(); //인터럽트 비활성화 //CLKPR =_BV(CLKPCE); //클럭 프리스케일러 설정 활성화 //CLKPR =_BV(CLKPS0); //클럭 프리스케일러 =2 --> 8MHz로 설정 //interrupts(); 핀모드(온오프,INPUT_PULLUP); 핀모드(소스,INPUT_PULLUP); 핀모드(CH_plus,INPUT_PULLUP); 핀모드(CH_마이너스,INPUT_PULLUP); 핀모드(볼_플러스,INPUT_PULLUP); 핀모드(볼륨마이너스,INPUT_PULLUP); 핀모드(인터럽트_핀,INPUT_PULLUP); // 절전 power_adc_disable(); //모든 ADC 비활성화 power_spi_disable(); //SPI 비활성화 power_timer1_disable(); //disbale 타이머 1(0은 millis()용, 2는 imremote.h용) power_usart0_disable(); //직렬 비활성화 power_twi_disable(); //TWI 비활성화 #ifdef DEBUG Serial.begin(9600); #endif}void loop() { //OnOff 체크 if (!digitalRead(OnOff)) { debounce_time =millis(); 동안 (millis() - debounce_time <40 ) {; } if (!digitalRead(OnOff)) { #ifdef LG_TV irsend.sendNEC(on_off_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(on_off_code, 32); #endif #ifdef SONY_TV irsend.sendSony(on_off_code, 12); #endif last_time =millis(); // 마지막으로 버튼을 눌렀을 때 #ifdef DEBUG Serial.println("OnOff"); #endif } } // 소스 확인 if (!digitalRead(Source)) { debounce_time =millis(); 동안 (millis() - debounce_time <40 ) {; } if (!digitalRead(Source)) { #ifdef LG_TV irsend.sendNEC(source_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(source_code, 32); #endif #ifdef SONY_TV irsend.sendSony(source_code, 12); #endif last_time =millis(); // 마지막으로 버튼을 눌렀을 때 #ifdef DEBUG Serial.println("Source"); #endif } } //CH_plus 확인 if (!digitalRead(CH_plus)) { debounce_time =millis(); 동안 (millis() - debounce_time <40 ) {; } if (!digitalRead(CH_plus)) { #ifdef LG_TV irsend.sendNEC(ch_plus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(ch_plus_code, 32); #endif #ifdef SONY_TV irsend.sendSony(ch_plus_code, 12); #endif last_time =millis(); // 마지막으로 버튼을 눌렀을 때 #ifdef DEBUG Serial.println("CH+"); #endif } } //CH_minus 확인 if (!digitalRead(CH_minus)) { debounce_time =millis(); 동안 (millis() - debounce_time <40 ) {; } if (!digitalRead(CH_minus)) { #ifdef LG_TV irsend.sendNEC(ch_minus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(ch_minus_code, 32); #endif #ifdef SONY_TV irsend.sendSony(ch_minus_code, 12); #endif last_time =millis(); // 마지막으로 버튼을 눌렀을 때 #ifdef DEBUG Serial.println("CH-"); #endif } } // Vol_plus 확인 if (!digitalRead(Vol_plus)) { debounce_time =millis(); 동안 (millis() - debounce_time <40 ) {; } if (!digitalRead(Vol_plus)) { #ifdef LG_TV irsend.sendNEC(vol_plus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(vol_plus_code, 32); #endif #ifdef SONY_TV irsend.sendSony(vol_plus_code, 12); #endif last_time =millis(); // 마지막으로 버튼을 눌렀을 때 #ifdef DEBUG Serial.println("Vol+"); #endif } } //볼륨 마이너스 확인 if (!digitalRead(Vol_minus)) { debounce_time =millis(); 동안 (millis() - debounce_time <40 ) {; } if (!digitalRead(Vol_minus)) { #ifdef LG_TV irsend.sendNEC(vol_minus_code, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(vol_minus_code, 32); #endif #ifdef SONY_TV irsend.sendSony(vol_minus_code, 12); #endif last_time =millis(); // 마지막으로 버튼을 눌렀을 때 #ifdef DEBUG Serial.println("Vol-"); #endif } } if (millis()-last_time> 5000) { //버튼이 10초 동안 눌러지지 않았습니다. #ifdef DEBUG Serial.println("Going to sleep..."); #endif가는_to_sleep(); //절전 모드 진입 #ifdef DEBUG Serial.println("Wake up..."); #endif }}//절전 모드 functionvoid going_to_sleep() { sleep_enable(); // 절전 모드 활성화 attachInterrupt(digitalPinToInterrupt(Interrupt_Pin), wake_up, LOW); //깨어나기 위한 인터럽트 --> 인터럽트 핀을 WIRED NOR로 구성!!! set_sleep_mode(SLEEP_MODE_PWR_DOWN); //전체 절전 모드 sleep_cpu(); //수면 모드 활성화}//깨우기 functionvoid wake_up() { sleep_disable(); // 절전 모드 비활성화 detachInterrupt(digitalPinToInterrupt(Interrupt_Pin)); //인터럽트 제거}

    맞춤형 부품 및 인클로저

    회로도

    remote_sketch_r4f8a47oWX.fz

    제조공정

    1. QR, RFID 및 온도 확인을 통한 출입 통제
    2. LIRC 없이 Raspberry Pi와 함께 IR 리모컨 사용
    3. PiCy – 작은 Raspberry Pi 구동 로봇!
    4. MPU-6050을 사용한 Arduino 자이로스코프 게임
    5. ESP32가 장착된 Discord 보안 카메라
    6. Arduino로 코인 억셉터 제어
    7. Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러
    8. Bluetooth가 탑재된 Arduino로 LED 제어!
    9. CNC 선반
    10. 원격 생산 제어의 5가지 장점