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

오래된 리모컨 재활용

구성품 및 소모품

Arduino Nano R3
× 1
5mm LED:빨간색
상태 LED용 빨간색 1개, 그 이후에는 색상이 그다지 중요하지 않습니다. 활성 상태인지 식별할 수 있습니다.
× 3
5mm LED:녹색
색상은 별로 중요하지 않습니다. 어떤 색상이 활성 상태인지 식별할 수만 있으면 됩니다.
× 1
5mm LED:노란색
색상은 별로 중요하지 않습니다. 어떤 색상이 활성 상태인지 식별할 수만 있으면 됩니다.
× 1
파란색 LED
색상은 별로 중요하지 않습니다. 어떤 색상이 활성 상태인지 식별할 수만 있으면 됩니다.
× 2
무납땜 브레드보드 전체 크기
× 1
점퍼 와이어(일반)
× 1
토글 스위치, (끄기)-켜기
모든 SPST 토글 스위치가 작동합니다.
× 1
SparkFun 브레드보드 전원 공급 장치 스틱 5V/3.3V
다른 소스에서 5볼트를 공급할 수 있거나 컴퓨터의 USB 연결에서 사용하는 경우 선택 사항 ,
× 1
IR 수신기(일반)
아마존에서 구입한 KY-022 37.9KHz 적외선 IR 센서 수신기를 사용했습니다.
× 1

이 프로젝트 정보

이 프로젝트를 통해 오래된 VCR, TV, DVD 플레이어 등의 잉여 리모콘을 재사용할 수 있습니다.

리모컨을 사용하여 릴레이, 전력 트랜지스터 또는 5볼트 신호로 제어할 수 있는 모든 것으로 램프, 히터 등과 같은 장치를 켤 수 있습니다. 여기에 표시된 것처럼 최대 6개의 LED만 토글합니다. 아이디어는 스케치 및 브레드보드 레이아웃을 제공하여 LED로 전송된 신호가 사용자가 상상하는 것과 병렬로 전송될 수 있도록 하는 것입니다!

설계된 대로 모든 리모콘에서 6개의 IR 코드를 읽고 "기억"합니다. 나는 1, 2, 3, 4, 5, 6을 사용하는 것을 좋아하지만 6개의 키가 모두 작동합니다. 6개의 알려진 코드 이외의 IR 코드가 있는 다른 키는 재설정 역할을 하고 모든 출력을 꺼짐으로 설정합니다. Arduio 보드의 EEPROM 메모리에 긴 정수로 코드를 작성하여 이를 달성합니다. 각각 4바이트를 차지하지만 UNO와 NANO는 각각 1024바이트의 EEPROM 메모리를 가지고 있기 때문에 충분한 공간이 있습니다. 이 메모리는 예상대로 재설정 및 전원 끄기를 통해 유지됩니다. 토글 스위치를 제외하고 모든 것이 단일 브레드보드에 맞습니다. 이 스위치에 핀을 납땜하여 브레드보드에 포함할 수 있습니다. 나는 게으르며 개발 중에 테이프를 사용하여 책상에 붙였습니다.

나는 5개의 다른 오래된 잉여 제품으로 그것을 시도했고, 모두 같은 성능을 보였습니다. 내가 고군분투한 "잡았다"는 미광 또는 일부 리모컨의 약한 신호였습니다. 이를 해결하기 위해 수신기 "LED"를 약 45도 아래로 조심스럽게 구부리고 그 위에 작은 수제 판지와 테이프 상자를 한쪽 끝을 열어 둡니다. 5-8피트 또는 그 이상 떨어진 곳에서 일관되게 코드를 잡는 것 같습니다. 5일 넘게 프로그램을 테스트하고 조정하는 동안 한 번도 빠트린 적이 없습니다.

프로그래밍하려면 "학습" 위치를 사용하십시오. 토글 스위치를 켜서 "실행" 모드에서 "학습" 모드로 이동합니다. 이 토글은 들을 준비가 되었음을 나타내는 빨간색 모드 표시기 LED를 켭니다. LED 1이 깜박이고 리모컨의 키를 누릅니다. 깜박이는 LED 1은 해당 코드에 반응하도록 프로그래밍되어 있습니다. 코드를 인식하는 즉시 모드 표시기 LED를 1~2초 동안 빠르게 깜박이고(매우 빠르게 진동하는 것처럼 보입니다!) 다음 LED로 이동합니다. 이것은 6개 모두가 프로그래밍될 때까지 계속됩니다. 그런 다음 시스템이 실행 모드로 전환되어야 함을 나타내는 모드 표시기 LED가 1초 간격으로 천천히 깜박입니다.

프로그래밍할 때 가장 흔한 실수는 리모컨의 다음 숫자로 손가락을 옮기는 것을 잊는 것이었습니다. 따라서 동일한 코드로 두 개의 출력을 쉽게 프로그래밍할 수 있습니다. 시작할 때마다 이러한 중복 항목을 찾습니다. 발견하면 "문제가 되는" LED를 몇 번 깜박여 재프로그래밍이 필요할 수 있음을 나타냅니다. 그러나 사람은 동일한 작업을 수행하는 여러 키를 원할 수 있으므로 강제로 다시 프로그래밍하지 않아도 됩니다.

모드 상태, 오류 등은 RED 상태 LED의 깜박임 속도로 표시됩니다. 깜박이는 LED 등으로 표시되는 모든 정보는 직렬 모니터로 전송됩니다. 사용자가 컴퓨터 없이 설정할 수 있도록 플래시의 LED 시퀀스를 사용하도록 설정했습니다. 직렬 모니터로 전송된 메시지는 다양한 속도로 깜박이는 LED가 의미하는 것을 암기하는 것보다 따라하기 쉽습니다. 이것은 일반적으로 몇 번만 프로그래밍되므로 PC에 연결하고 직렬 모니터에서 텍스트를 보는 것이 더 자연스럽습니다.

스케치 코드에는 많은 견제와 균형이 있습니다. 그것들은 잘 문서화되어 있으므로(희망합니다!) 여기서 세부 사항을 제공하지 않겠습니다. C, C++ 및 Arduino IDE에 익숙한 사용자는 코드를 쉽게 따라하고 원하는 경우 수정할 수 있어야 합니다.

부록: 나는 이것을 LED 1 ~ 5와 병렬로 연결된 5개의 릴레이로 테스트했으며 예상대로 작동합니다. 그들은 모두 120VAC 테이블 램프를 토글하므로 회로가 예상대로 작동합니다. 릴레이가 부족하여 6번째 신호도 작동한다고 가정해야 합니다. 이것은 개념 증명일 뿐입니다. CD4011 쿼드 NAND 게이트로 처음 4개 출력의 신호를 반전해야 했습니다. 왜냐하면 5볼트가 아닌 0볼트에서 닫히기 때문입니다. 단일 릴레이는 + 5볼트 신호에서 작동하므로 신호 반전이 필요하지 않습니다. 주 전압을 전환할 때 주의하십시오. 전압이 높기 때문에 심각한 충격을 주거나 심지어 사망에 이르게 할 수도 있습니다!

이것은 단지 예일 뿐입니다. 6개의 출력에 어떤 장치를 연결할지 상상해보세요. 즐기세요!

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

코드

<울>
  • IR 원격 용도 변경 스케치
  • IR 원격 용도 변경 스케치Arduino
    /* IR 리모컨을 사용하여 6개의 LED를 전환하여 거의 모든 장치를 제어하는 ​​데 사용할 수 있도록 잉여 리모컨의 용도를 변경하는 방법을 보여줍니다. 이 스케치는 토글 스위치가 "학습" 또는 프로그램 위치에 있을 때 IR 리모컨의 1,2,3,4,5,6 및 0 버튼에 대한 제조업체 코드를 학습합니다. 이 값은 Arduino Nano의 EEPROM에 저장됩니다. 토글 스위치가 "실행" 모드에 있을 때 이 값은 어떤 키를 눌렀는지 결정하는 데 사용됩니다. 그러면 6개의 관련 LED가 리모컨으로 켜고 끌 수 있습니다. IR 리모컨의 종류에 관계없이 코드를 배우고 익힐 수 있는 방법을 보여주기 위한 것입니다. LED 외에도 출력을 확장하여 릴레이, 고전력 트랜지스터 등으로 장치를 켜거나 끌 수 있습니다. Paul M Dunphy VE1DX 2020년 3월 */ // Ken Shirriff가 개발한 IR 원격 라이브러리 포함#include // EEPROM의 1024바이트 읽기/쓰기 기능 제공#include long unsigned int intIRCode; long unsigned int storedIRCodes[6];long unsigned int dupeCheck[6]; // IR sensor에 대한 핀 정의 const int Recv_Pin =2; // LEDsconst int PinOne =12; const int PinTwo =11; const int PinThree =10; const int PinFour =9; const int PinFive =8; const int PinSix =7;// 실행/학습의 상태를 읽고// 표시할 핀 상수를 정의합니다. switch.const int switchPin =4; 상수 정수 상태 핀 =5; const unsigned long int repeatKeyPress =0xFFFFFFFF; 부울 학습 모드; // 토글에 따라 // 어떤 모드인지 추적하는 데 사용됩니다. switch.boolean first_iteration; // 각 LED의 토글 상태를 기억할 정수를 정의합니다.int togglestate1;int togglestate2;int togglestate3;int togglestate4;int togglestate5;int togglestate6;int current_remote_code;int remote_code_1;int remote_code_2;int remote_code_3;int remote_code_4;int remote_code_5;int remote_code_6; // IR 수신기 및 결과 개체 정의IRrecv recv(Recv_Pin);decode_results results;void EEPROMWritelong(int address, long value)// EEPROM에 4바이트(32비트) long 정수 쓰기// 길이가 4바이트이므로 다음과 같습니다. // address to address + 3 { // bitshift를 사용하여 긴 정수를 4바이트로 분해합니다. // 1 =최상위 -> 4 =최하위 바이트 4 =(값 &0xFF); 3바이트 =((값>> 8) &0xFF); 2바이트 =((값>> 16) &0xFF); 바이트 1 =((값>> 24) &0xFF); EEPROM.write(주소, 4); EEPROM.write(주소 + 1, 3); EEPROM.write(주소 + 2, 2); EEPROM.write(주소 + 3, 1); }long EEPROMReadlong(long address)// EEPROM에서 4바이트(32비트) long 정수를 읽습니다.// 길이가 4바이트이므로 // address to address + 3 { long four =EEPROM.read( 주소); 긴 3 =EEPROM.read(주소 + 1); 긴 두 =EEPROM.read(주소 + 2); 긴 것 =EEPROM.read(주소 + 3); //바이트를 긴 정수로 조합하고 return return ((four <<0) &0xFF) + ((three <<8) &0xFFFF) + ((two <<16) &0xFFFFFF) + ((one <<24) &반복키 누르기); }int Flip_LED(int led, int 토글_상태) { if(toggle_state==0) { digitalWrite(led, HIGH); 토글_상태=1; } else { digitalWrite(LED, LOW); 토글_상태=0; } 반환 토글 상태; }void Reset() { // 모든 LED를 끄고 토글 플래그를 // 끄기로 설정합니다. (0) digitalWrite(PinOne, LOW); digitalWrite(PinTwo, LOW); digitalWrite(PinThree, LOW); digitalWrite(PinFour, LOW); 디지털 쓰기(핀파이브, 낮음); digitalWrite(PinSix, LOW); 토글 상태1 =0; 토글 상태2 =0; 토글 상태3 =0; 토글 상태4 =0; 토글 상태5 =0; 토글 상태6 =0; }void guessType() { Serial.print("원격은 "); switch (results.decode_type){ case NEC:Serial.println("NEC"); 부서지다; 케이스 소니:Serial.println("소니"); 부서지다; 케이스 RC5:Serial.println("RC5"); 부서지다; 케이스 RC6:Serial.println("RC6"); 부서지다; 케이스 DISH:Serial.println("DISH "); 부서지다; 케이스 SHARP:Serial.println("SHARP "); 부서지다; 케이스 JVC:Serial.println("JVC"); 부서지다; 케이스 산요:Serial.println("산요"); 부서지다; 케이스 미츠비시:Serial.println("MITSUBISHI "); 부서지다; case SAMSUNG:Serial.println("SAMSUNG "); 부서지다; 케이스 LG:Serial.println("LG "); 부서지다; 케이스 WHYNTER:Serial.println("WHYNTER "); 부서지다; 케이스 AIWA_RC_T501:Serial.println("AIWA_RC_T501 "); 부서지다; 케이스 PANASONIC:Serial.println("PANASONIC "); 부서지다; 케이스 DENON:Serial.println("DENON "); 부서지다; 기본값:케이스 UNKNOWN:Serial.println("UNKNOWN "); 부서지다; } } int learnCodeRead(int pinCode) { if (irrecv.decode(&results)) { pinCode =결과.값; } 리턴 핀코드; } 무효 Confirm() { int i; for(i=0, i<=20, i++) { digitalWrite(statusPin, HIGH); 지연(50); digitalWrite(상태핀, 낮음); 지연(50); } 디지털 쓰기(상태핀, 높음); // "학습" LED를 높게 유지 } void learn_Mode() { 부울 goodCode; 정수 i, j; int 위치; 정수 핀[6] ={12,11,10,9,8,7}; // 순서대로 각각 수신 시작 if (first_iteration) { Serial.println(); Serial.println("학습 모드 진입"); 직렬.println(); } intIRCode =0; 위치 =0; 좋은 코드 =참; j =0; 동안 ((goodCode=true) 및 (j<=5)) { for(i=0; i<=25; i++) { digitalWrite(pins[j], HIGH); 지연(200); intIRCode =LearnCodeRead(intIRCode); 디지털 쓰기(핀[j], 낮음); 지연(200); intIRCode =LearnCodeRead(intIRCode); goodCode =((intIRCode !=repeatKeyPress) 및 (intIRCode !=0)); if (goodCode) { i=30; // 'break'가 루프에서 작동하지 않기 때문에 루프에서 벗어나도록 속임수 } recv.resume(); // 다시 듣기 시작 } goodCode =(intIRCode !=repeatKeyPress 및 intIRCode !=0); if (goodCode) { if (j==0) { 추측 유형(); } Serial.print("EEPROM 위치에 쓰기 ");Serial.print(위치); Serial.print(" IR 코드 =");Serial.println(intIRCode,HEX); EEPROMWritelong(위치, intIRCode); 위치 =위치 + 4; j++; 확인하다(); intIRCode =0; recv.resume(); // 다시 듣기 시작 } } Serial.println(); Serial.println("아두이노를 실행 모드로 되돌립니다."); 동안 (digitalRead(switchPin) ==HIGH) { digitalWrite(statusPin, HIGH); 지연(1000); digitalWrite(상태핀, 낮음); 지연(1000); } 직렬.println(); Serial.println("실행 모드로 돌아갑니다."); // 여기에서 그렇게 과감할 필요는 없지만 // 이것은 학습 모드에서 나와 제대로 다시 시작하도록 하기 위한 // "재설정"입니다. // 다음 4줄을 제거해도 *가능*합니다. 지연(50); Serial.flush(); 지연(50); asm 휘발성("jmp 0"); } 무효 run_Mode() { if (first_iteration) { Serial.println("실행 모드 시작"); } if (irrecv.decode(&results)) { if (results.value!=repeatKeyPress) { current_remote_code =결과.값; Serial.print("키 누름 감지, IR 코드 ="); Serial.println(current_remote_code,HEX); if (current_remote_code ==remote_code_1) { togglestate1 =Flip_LED(PinOne,togglestate1); } else if (current_remote_code ==remote_code_2) { togglestate2 =Flip_LED(PinTwo,togglestate2); } else if (current_remote_code ==remote_code_3) { togglestate3 =Flip_LED(PinThree,togglestate3); } else if (current_remote_code ==remote_code_4) { togglestate4 =Flip_LED(PinFour,togglestate4); } else if (current_remote_code ==remote_code_5) { togglestate5 =Flip_LED(PinFive,togglestate5); } else if (current_remote_code ==remote_code_6) { togglestate6 =Flip_LED(PinSix,togglestate6); } else { 재설정(); } } 지연(500); // 버튼을 누르고 있는 경우 // 빠른 데이터 문자열을 탐색하는 데 사용됩니다. 루프에 지연을 도입하여 // 응답 시간을 줄입니다. recv.resume(); // 다시 듣기 시작 } } void setup() { first_iteration =true; 정수 i,j,k; int 위치; int dupeFlash[6] ={12,11,10,9,8,7}; // 플래시에 핀 번호 // 중복이 발견되면 Serial.begin(9600); 불가.enableIRIn(); // IR 수신기를 활성화합니다. /* 다음 코드 섹션은 EEPROM을 재설정할 필요가 없습니다. * 그러나 일부 새로운 "기성" NANO는 EEPROM이 * FFFFFFFF로 설정된 상태로 표시됩니다. 이것은 * 키를 누르고 있을 때 많은 IR 리모컨이 보내는 코드입니다. 이 스케치는 여러 위치에서 해당 코드를 확인하고 * "키"에 16진수 FFFFFFFF가 할당되면 제대로 작동하지 않습니다. 이 문제를 방지하기 위해 FFFFFFFF를 확인하고 하나를 찾으면 6개의 주요 위치를 Sony RM-YD104 코드로 설정합니다. 이런 일이 발생하면 특정 리모컨을 사용하지 않는 경우 * 스케치를 초기화하기 위해 "학습" 모드에서 스케치를 실행해야 합니다. */// =============새로운 Arduino 시작 ==================부울 defaultToSony =false; long unsigned int IRCode =0; 위치 =0; for(i=0; i<=5; i++) { IRCode =EEPROMReadlong(위치); if (IRCode==repeatKeyPress) { defaultToSony =true; } 위치 =위치 + 4; } if (defaultToSony) { Serial.println("EEPROM 메모리에서 HEX FFFFFFFF를 찾았습니다. 설정 코드"); Serial.println("소니 RM-YD104 리모컨용입니다. 지금 '학습' 모드를 실행 중입니다."); Serial.println("리모컨이 없다면 권장합니다."); EEPROMWritelong(0, 0x10); 지연(50); EEPROMWritelong(4, 0x810); 지연(50); EEPROMWritelong(8, 0x410); 지연(50); EEPROMWritelong(12, 0xC10); 지연(50); EEPROMWritelong(16, 0x210); 지연(50); EEPROMWritelong(20, 0xA10); 지연(50); } // =============End New Arduino ==================// LED 핀을 출력으로 설정 pinMode(PinOne, OUTPUT); 핀모드(핀투, 출력); 핀모드(핀쓰리, 출력); 핀모드(핀4, 출력); 핀모드(핀파이브, 출력); 핀모드(핀식스, 출력); 초기화(); // 모두 off pinMode(statusPin, OUTPUT); 핀모드(스위치핀, 입력); //마지막으로 사용한 원격지에서 코드 가져오기 Serial.println(); Serial.println("저장된 IR 원격 코드 읽기 ... "); 위치 =0; for(j=0; j<=5; j++) { storedIRCodes[j] =EEPROMReadlong(위치); Serial.print("EEPROM 위치에서 읽기 ");Serial.print(위치); Serial.print("IR 코드 =");Serial.println(savedIRCodes[j],HEX); 위치 =위치 + 4; dupeCheck[j]=저장된IRCodes[j]; // 중복 검사를 위해 사본을 저장합니다. } // 출력에 할당된 연속적인 중복 코드를 찾습니다. // 발생할 가능성이 거의 없기 때문에 전체 중복을 찾지 않습니다. 경험에 따르면 // 프로그래밍하는 동안 가장 가능성이 높은 실수는 // bacl-to-back LED에서 동일한 키를 두 번 누르는 것입니다. // 중복이 발견되면 의심되는 LED를 깜박임으로써 이를 표시합니다. // LED가 6개뿐이므로 중복을 찾는 데 // 21번의 비교만 필요합니다(6 + 5 + 4 + 3 + 2 + 1 =21). // 이 섹션은 // 먼저 배열을 정렬하여 중복을 찾도록 향상될 수 있습니다. for (i =0; i <5 - 1; i++) { for (j =i + 1; j <6; j++ ) { if (dupeCheck[i] ==dupeCheck[j]) { Serial.println("중복 코드 발견. 학습 모드 재실행 제안"); for(k=0; k<=5; k++) { digitalWrite(dupeFlash[i],HIGH); digitalWrite(dupeFlash[j],HIGH); 지연(1000); digitalWrite(dupeFlash[i],LOW); digitalWrite(dupeFlash[j],LOW); 지연(1000); } } } } remote_code_1 =저장된IRCodes[0]; remote_code_2 =저장된IRCodes[1]; remote_code_3 =저장된IRCodes[2]; remote_code_4 =저장된IRCodes[3]; remote_code_5 =저장된IRCodes[4]; remote_code_6 =저장된IRCodes[5]; 지연(1000); Serial.println("저장된 코드를 읽습니다."); 직렬.println(); } void loop() { // 토글이 켜져 있는지 꺼져 있는지 확인합니다. 켜져 있는 경우(학습 모드에서) // switchPin은 HIGH입니다. learnMode =(digitalRead(switchPin) ==HIGH); if (learnMode) { first_iteration =true; 초기화(); digitalWrite(상태핀, 높음); // 학습 모드 LED 켜기:learn_Mode(); 초기화(); 첫 번째 반복 =거짓; } else { digitalWrite(statusPin, LOW); // 학습 모드 LED 끄기:run_Mode(); 첫 번째 반복 =거짓; } }

    회로도


    제조공정

    1. 발광 다이오드(LED)
    2. Raspberry Pi를 사용한 원격 날씨 모니터링
    3. Raspberry Pi 범용 리모컨
    4. 원격 심박수 모니터
    5. 관춤 멜로디
    6. 기존 전화를 원격 스위치로 전환
    7. 하나의 LED를 사용하여 이미지 생성
    8. 사운드에 의한 8x LED 조명
    9. 제어 플랫폼 선택을 위한 상위 5가지 요소
    10. 오래된 기계를 안전하게 폐기하는 방법