Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Переназначение старых пультов дистанционного управления

Компоненты и расходные материалы

Arduino Nano R3
× 1
5 мм светодиод:красный
Один красный для светодиода состояния, после этого цвет не очень важен - просто нужно уметь определить, какой из них активен.
× 3
5 мм светодиод:зеленый
Цвет на самом деле не важен - просто нужно уметь определять, какой из них активен
× 1
5 мм светодиод:желтый
Цвет на самом деле не важен - просто нужно уметь определять, какой из них активен
× 1
Синий светодиод
Цвет на самом деле не важен - просто нужно уметь определять, какой из них активен
× 2
Беспаечная макетная плата, полный размер
× 1
Перемычки (общие)
× 1
Тумблер, (Выкл.) -Вкл.
Любой тумблер SPST будет работать
× 1
Блок питания макетной платы SparkFun 5 В / 3,3 В
Необязательно, если вы можете подавать 5 В из другого источника или если вы используете его через USB-соединение вашего компьютера. ,
× 1
ИК-приемник (общий)
Я использовал приемник инфракрасного ИК-датчика KY-022 37,9 кГц, который я получил от Amazon
× 1

Об этом проекте

Этот проект позволяет повторно использовать излишки пульта ДУ от старых видеомагнитофонов, телевизоров, DVD-плееров и т. Д.

Вы можете использовать пульты дистанционного управления для включения таких устройств, как лампы, обогреватели и т. Д. С реле, силовые транзисторы или любые другие устройства, которыми может управлять сигнал 5 В. Как показано здесь, он просто переключает до 6 светодиодов. Идея состоит в том, чтобы предоставить эскиз и макет платы, чтобы сигналы, отправляемые на светодиоды, можно было отправлять параллельно, что бы пользователь ни воображал!

По задумке он считывает 6 ИК-кодов с любого пульта ДУ и «запоминает» их. Мне нравится использовать клавиши 1, 2, 3, 4, 5, 6, но подойдут любые шесть клавиш. Обратите внимание, что любая другая клавиша с ИК-кодом, отличным от 6 известных кодов, действует как сброс и выключает все выходы. Я добиваюсь этого, записывая коды в виде длинных целых чисел в память EEPROM на плате Ardunio. Каждый из них занимает 4 байта, но, поскольку каждый UNO и NANO имеют 1024 байта памяти EEPROM, места достаточно. Как и следовало ожидать, эта память сохраняется при сбросах и отключениях питания. Все это поместилось бы на одной макетной плате, кроме тумблера. К этому переключателю можно припаять контакты, чтобы включить его на макетную плату. Я был ленив и держал его на столе во время разработки изолентой.

Я пробовал это с пятью разными старыми излишками, и все они работают одинаково. "Попался", с которым я боролся, был рассеянным светом или более слабыми сигналами от некоторых пультов дистанционного управления. Чтобы решить эту проблему, я осторожно наклонил "светодиод" приемника вниз примерно на 45 градусов и накинул на него маленькую самодельную коробку из картона и скотча с одним открытым концом. Кажется, что он улавливает коды постоянно и на расстоянии 5-8 футов или более. Я не пропускал более пяти дней тестирования и настройки программы.

Чтобы его запрограммировать, используйте позицию «обучение». Вы переходите из режима «бег» в режим «обучения», щелкая тумблер. Этот переключатель включает красный светодиодный индикатор режима, показывая, что он готов к прослушиванию. Он мигает светодиодом 1, и вы нажимаете кнопку на пульте дистанционного управления. Мигающий светодиод 1 запрограммирован на реакцию на этот код. Как только он распознает код, он быстро мигает светодиодным индикатором режима на секунду или две (так быстро, как будто он вибрирует!) И переходит к следующему светодиоду. Это продолжается до тех пор, пока не будут запрограммированы все шесть. Затем светодиодный индикатор режима медленно мигает с интервалом в одну секунду, показывая, что система должна быть переключена в рабочий режим.

При программировании я обнаружил, что наиболее распространенной ошибкой было забыть переместить палец к следующей цифре на пульте дистанционного управления. Таким образом, два выхода легко запрограммировать одним и тем же кодом. Каждый раз при запуске ищет такие дубли. Если он их обнаруживает, он несколько раз мигает «нарушающими» светодиодами, указывая на необходимость перепрограммирования. Однако человеку может потребоваться, чтобы несколько ключей выполняли одно и то же, поэтому это не требует перепрограммирования.

Состояние режима, ошибки и т. Д. Отображаются по частоте мигания КРАСНОГО светодиода состояния. Вся информация, отображаемая мигающими светодиодами и т. Д., Отправляется на монитор последовательного порта. Я настроил его на использование светодиодных последовательностей вспышек, чтобы пользователь мог настроить его без компьютера. За сообщениями, отправляемыми на последовательный монитор, легче следить, чем запоминать, что означают мигающие светодиоды с разной скоростью. Поскольку обычно это программируется всего несколько раз, вероятно, более естественным будет подключить его к компьютеру и смотреть текст на последовательном мониторе.

Код скетча содержит множество сдержек и противовесов. Они хорошо задокументированы (надеюсь!), Поэтому я не буду здесь приводить подробности. Пользователи, знакомые с C, C ++ и Arduino IDE, должны легко следить за кодом и при желании вносить изменения.

Приложение: Я тестировал это с 5 реле, включенными параллельно светодиодам с 1 по 5, и он работает, как ожидалось. Все они включают настольную лампу на 120 В переменного тока, поэтому схема работает должным образом. У меня кончились реле, поэтому можно предположить, что шестой сигнал тоже будет работать. Обратите внимание, это всего лишь доказательство концепции. Мне пришлось инвертировать сигналы первых четырех выходов с помощью четырехъядерного логического элемента NAND CD4011, потому что они закрываются при 0 вольт, а не при 5 вольт. Одиночное реле работает от сигнала +5 В, поэтому инверсия сигнала не требуется. Будьте осторожны при переключении сетевого напряжения. Они находятся под высоким напряжением и могут сильно ударить током или даже убить!

Помните, это всего лишь пример. Дайте волю воображению, какие устройства подключить к 6 выходам. Наслаждайтесь!

Код

  • ИК-пульт дистанционного перепрофилирования.
ИК-пульт дистанционного перепрофилирования скетча Arduino
 / * Переключение 6 светодиодов с помощью ИК-пульта дистанционного управления, чтобы проиллюстрировать, как переназначить удаленные пульты управления так, чтобы их можно было использовать для управления практически любым устройством. Этот эскиз изучает коды производителя для кнопок 1,2,3,4,5,6 и 0 на любом ИК-пульте дистанционного управления, когда тумблер находится в положении «Обучение» или в положении программирования. Эти значения сохраняются в EEPROM Arduino Nano. Когда тумблер переведен в режим «Работа», эти значения используются для определения того, какая клавиша нажата. Затем дистанционное управление включает и выключает 6 связанных светодиодов. Это демонстрирует, как выучить и использовать коды независимо от типа ИК-пульта дистанционного управления. Помимо светодиодов, выходы могут быть расширены для включения или выключения устройств с реле, мощными транзисторами и т. Д. Paul M Dunphy VE1DX Март 2020 г. * / // Включить удаленную библиотеку IR, разработанную Кеном Ширриффом # include  // Дать возможность читать / писать в 1024 байта EEPROM # include  long unsigned int intIRCode; длинное беззнаковое int сохраненоIRCodes [6]; длинное беззнаковое int dupeCheck [6]; // Определение пина для ИК-датчика const int Recv_Pin =2; // Определение констант контактов для переключения светодиодовconst int PinOne =12; const int PinTwo =11; const int PinThree =10; const int PinFour =9; const int PinFive =8; const int PinSix =7; // Определяем константы вывода для чтения и указываем // статус тумблера Run / Learn. const int switchPin =4; const int statusPin =5; const unsigned long int repeatKeyPress =0xFFFFFFFF; логическое значение learnMode; // Используется для отслеживания // в каком режиме мы находимся в соответствии с тумблером. Boolean first_iteration; // Определение целых чисел для запоминания состояний переключения каждого LEDint 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_5; int remote_code_5; int remote_code_5; // Определить ИК-приемник и объекты результатовIRrecv irrecv (Recv_Pin); decode_results results; void EEPROMWritelong (int address, long value) // Записать 4-байтовое (32-битное) целое число в EEPROM // Поскольку они имеют длину 4 байта, они хранится в // адресе по адресу + 3 {// Разложите длинное целое на 4 байта с помощью битового сдвига. // Один =старший байт -> четыре =младший байт четвертый байт =(значение &0xFF); третий байт =((значение>> 8) &0xFF); второй байт =((значение>> 16) &0xFF); первый байт =((значение>> 24) &0xFF); EEPROM.write (адрес, четыре); EEPROM.write (адрес +1, три); EEPROM.write (адрес + 2, два); EEPROM.write (адрес + 3, единица); } long EEPROMReadlong (длинный адрес) // Прочитать 4-байтовое (32-битное) длинное целое из EEPROM .// Поскольку они имеют длину 4 байта, они были сохранены // по адресу + 3 {long four =EEPROM.read ( адрес); длинная тройка =EEPROM.read (адрес + 1); два длинных =EEPROM.read (адрес + 2); длинный =EEPROM.read (адрес + 3); // Собираем байты в длинное целое и возвращаем return ((четыре <<0) &0xFF) + ((three <<8) &0xFFFF) + ((two <<16) &0xFFFFFF) + ((one <<24) &repeatKeyPress); } int Flip_LED (int led, int toggle_state) {if (toggle_state ==0) {digitalWrite (светодиод, HIGH); toggle_state =1; } else {digitalWrite (светодиод, НИЗКИЙ); toggle_state =0; } return toggle_state; } void Reset () {// Выключаем все светодиоды и устанавливаем переключатель // флажков в положение off (0) digitalWrite (PinOne, LOW); digitalWrite (PinTwo, LOW); digitalWrite (PinThree, LOW); digitalWrite (PinFour, LOW); digitalWrite (PinFive, LOW); digitalWrite (PinSix, LOW); togglestate1 =0; togglestate2 =0; togglestate3 =0; togglestate4 =0; togglestate5 =0; togglestate6 =0; } void guessType () {Serial.print ("Удаленный выглядит как"); переключатель (results.decode_type) {case NEC:Serial.println ("NEC"); ломать; case SONY:Serial.println ("СОНИ"); ломать; корпус RC5:Serial.println ("RC5"); ломать; корпус RC6:Serial.println ("RC6"); ломать; case БЛЮДО:Serial.println ("БЛЮДО"); ломать; case SHARP:Serial.println ("SHARP"); ломать; case JVC:Serial.println ("JVC"); ломать; case SANYO:Serial.println ("SANYO"); ломать; корпус MITSUBISHI:Serial.println («MITSUBISHI»); ломать; case SAMSUNG:Serial.println ("SAMSUNG"); ломать; корпус LG:Serial.println («LG»); ломать; case WHYNTER:Serial.println ("WHYNTER"); ломать; case AIWA_RC_T501:Serial.println ("AIWA_RC_T501"); ломать; case PANASONIC:Serial.println ("PANASONIC"); ломать; case DENON:Serial.println ("DENON"); ломать; по умолчанию:case UNKNOWN:Serial.println ("UNKNOWN"); ломать; }} int learnCodeRead (int pinCode) {если (irrecv.decode (&results)) {pinCode =results.value; } return pinCode; } void Confirm () {int i; для (я =0; я <=20; я ++) {digitalWrite (statusPin, HIGH); задержка (50); digitalWrite (statusPin, LOW); задержка (50); } digitalWrite (statusPin, HIGH); // Оставляем светодиод «Обучение» включенным} void learn_Mode () {boolean goodCode; int i, j; int location; int pins [6] ={12,11,10,9,8,7}; // Начинаем прослушивание каждого по порядку if (first_iteration) {Serial.println (); Serial.println («Вход в режим обучения»); Serial.println (); } intIRCode =0; location =0; goodCode =true; j =0; while ((goodCode =true) и (j <=5)) {для (i =0; i <=25; i ++) {digitalWrite (контакты [j], HIGH); задержка (200); intIRCode =learnCodeRead (intIRCode); digitalWrite (контакты [j], LOW); задержка (200); intIRCode =learnCodeRead (intIRCode); goodCode =((intIRCode! =repeatKeyPress) и (intIRCode! =0)); если (goodCode) {я =30; // Уловка для выхода из цикла, потому что 'break' // не работает с циклами} irrecv.resume (); // Снова начинаем прослушивание} goodCode =(intIRCode! =RepeatKeyPress и intIRCode! =0); если (goodCode) {если (j ==0) {guessType (); } Serial.print («Запись в расположение EEPROM»); Serial.print (расположение); Serial.print ("IR code ="); Serial.println (intIRCode, HEX); EEPROMWritelong (расположение, intIRCode); location =location + 4; j ++; Подтверждать(); intIRCode =0; irrecv.resume (); // Снова начинаем прослушивание}} Serial.println (); Serial.println («Вернуть Arduino обратно в рабочий режим.»); в то время как (digitalRead (switchPin) ==HIGH) {digitalWrite (statusPin, HIGH); задержка (1000); digitalWrite (statusPin, LOW); задержка (1000); } Serial.println (); Serial.println («Возвращение в рабочий режим.»); // Вероятно, здесь не нужно быть таким радикальным, // но это «сброс», чтобы убедиться, что мы выйдем из режима обучения // и перезапустим правильно. Это * вероятно * нормально, если // удалить следующие 4 строки. задержка (50); Serial.flush (); задержка (50); asm volatile ("jmp 0"); } void run_Mode () {if (first_iteration) {Serial.println ("Переход в режим выполнения"); } if (irrecv.decode (&results)) {если (results.value! =repeatKeyPress) {current_remote_code =results.value; Serial.print («Обнаружено нажатие клавиши, ИК-код =»); Serial.println (current_remote_code, HEX); если (current_remote_code ==remote_code_1) {togglestate1 =Flip_LED (PinOne, togglestate1); } иначе if (current_remote_code ==remote_code_2) {togglestate2 =Flip_LED (PinTwo, togglestate2); } иначе, если (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 {Reset (); }} задержка (500); // Используется для быстрого обхода строки данных // если кнопка удерживается. Уменьшает время отклика // за счет запаздывания цикла. irrecv.resume (); // Снова начинаем прослушивание}} void setup () {first_iteration =true; int i, j, k; int location; int dupeFlash [6] ={12,11,10,9,8,7}; // Номера контактов для прошивки // если дубликаты найдены Serial.begin (9600); irrecv.enableIRIn (); // Включение ИК-приемника / * Следующий раздел кода никогда не должен сбрасывать EEPROM. * Однако некоторые новые, готовые к использованию NANO появляются с их EEPROM, установленным * на FFFFFFFF. Это код, который отправляется многими ИК-пультами при * нажатой клавише. Этот скетч проверяет наличие этого кода в нескольких местах *, и он не будет работать должным образом, если «ключу» присвоено шестнадцатеричное значение FFFFFFFF. Чтобы * предотвратить эту ошибку, мы проверяем наличие FFFFFFFF, и если мы его находим, мы устанавливаем * 6 ключевых положений для кодов Sony RM-YD104. В этом случае, если вы * не используете этот конкретный пульт, вам необходимо запустить скетч в режиме «обучения» * для его инициализации. * /// =============Начать новую Arduino ==================логическое defaultToSony =false; long unsigned int IRCode =0; location =0; для (я =0; я <=5; я ++) {IRCode =EEPROMReadlong (местоположение); если (IRCode ==repeatKeyPress) {defaultToSony =true; } location =location + 4; } if (defaultToSony) {Serial.println ("HEX FFFFFFFF найден в памяти EEPROM. Установочные коды"); Serial.println ("для пульта Sony 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 ==================// Устанавливаем выводы светодиодов в качестве выходов pinMode (PinOne, OUTPUT); pinMode (PinTwo, ВЫХОД); pinMode (PinThree, ВЫХОД); pinMode (PinFour, ВЫХОД); pinMode (PinFive, ВЫХОД); pinMode (PinSix, ВЫХОД); Перезагрузить(); // Начнем со всех остальных pinMode (statusPin, OUTPUT); pinMode (switchPin, ВХОД); // Получить коды от последнего использованного удаленного устройства Serial.println (); Serial.println ("Чтение сохраненных кодов удаленного ИК-порта ..."); location =0; для (j =0; j <=5; j ++) {savedIRCodes [j] =EEPROMReadlong (местоположение); Serial.print («Чтение из местоположения EEPROM»); Serial.print (местоположение); Serial.print ("IR code ="); Serial.println (savedIRCodes [j], HEX); location =location + 4; dupeCheck [j] =savedIRCodes [j]; // Сохраняем копию для проверки дублирования} // Ищем последовательные повторяющиеся коды, назначенные // выходам. Мы не ищем общих дубликатов, потому что // они вряд ли произойдут. Опыт показал, что // во время программирования наиболее вероятной ошибкой является нажатие // одной и той же клавиши дважды на светодиоды, расположенные рядом друг с другом. Если дубликаты // обнаружены, укажите это, мигая подозрительными светодиодами. // Есть только 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 («Обнаружены повторяющиеся коды. Предложите повторно запустить режим обучения»); для (k =0; k <=5; k ++) {digitalWrite (dupeFlash [i], HIGH); digitalWrite (dupeFlash [j], ВЫСОКИЙ); задержка (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 («Сохраненные коды прочитаны.»); Serial.println (); } void loop () {// Проверяем, включен или выключен переключатель. Если он включен (в режиме обучения) // switchPin ВЫСОКИЙ:learnMode =(digitalRead (switchPin) ==HIGH); если (learnMode) {first_iteration =true; Перезагрузить(); digitalWrite (statusPin, HIGH); // Включаем светодиод режима обучения:learn_Mode (); Перезагрузить(); first_iteration =false; } else {digitalWrite (statusPin, LOW); // Выключаем светодиод режима обучения:run_Mode (); first_iteration =false; }} 

Схема


Производственный процесс

  1. Светоизлучающий диод (светодиод)
  2. Удаленный мониторинг погоды с помощью Raspberry Pi
  3. Универсальный пульт дистанционного управления Raspberry Pi
  4. Удаленный монитор сердечного ритма
  5. Мелодия танца в гробу
  6. Преобразуйте свой старый телефон в удаленный коммутатор
  7. Создание изображений с использованием одного светодиода
  8. 8-кратное светодиодное освещение со звуком
  9. Пять главных факторов выбора платформы управления
  10. Как безопасно утилизировать старое оборудование