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

Пульт дистанционного управления для телевизора с питанием от батареи и футляр, напечатанный на 3D-принтере

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

Arduino UNO
× 1
Батарея 9 В (стандартная)
× 1
9 В для разъема Barrel Jack
× 1
ИК-передатчик (общий)
× 1
Крепежный винт, M3
× 4
Крепежный винт, M2,5
× 3
Гайка M3
× 4
Гайка M2,5
× 3
Резистор в сквозное отверстие, 47 Ом
× 2
Макетная плата, 2,54 мм
× 1
кнопка PCB
× 6
Male-Header 36 Position 1 Row- Long (0.1 ")
× 1

Необходимые инструменты и машины

3D-принтер (общий)
Паяльник (общий)
Проволока для припоя, без свинца
Нить PLA, диаметр 1,75 мм

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

Введение

Перестал работать пульт от телевизора моей девушки. Она могла купить дешевую замену в магазине поблизости, но потом подумала:мы оба инженеры, давайте вместе сделаем свою!

Поскольку наши навыки дополняют друг друга, это был другой, но интересный способ провести некоторое время во время изоляции, и он дал нам возможность немного узнать о том, как работает эта повседневная технология.

Да, и наличие дома небольшого 3D-принтера тоже сыграло свою роль.

Как это работает

Прежде всего, поскольку мы хотели создать простой дизайн на базе Arduino UNO, мы оценили минимальное количество команд, необходимых для работы с нашим телевизором. Мы посчитали, что достаточно 6 команд:переключение ON / OFF, выбор источника, Ch +, Ch-, Vol +, Vol-.

Чтение кнопок

Чтобы избежать использования дополнительных резисторов, в конструкции используются внутренние подтягивающие резисторы Arduino. Если пульт дистанционного управления не находится в спящем режиме (см. Ниже), каждое состояние кнопки опрашивается в каждом цикле цикла. Чтобы избежать подсчета множественных попаданий, реализована простая процедура устранения неполадок, использующая millis () функция.

Отправка инфракрасных сигналов

Инфракрасную связь обеспечивает IRremote.h библиотека (Престижность кодировщикам!). Все, что нам нужно было сделать, это настроить протокол для нашего телевизора (разные производители разработали свои собственные протоколы) и поискать в Google коды различных команд в шестнадцатеричном формате, которые мы хотели использовать, и связать их с кнопками. Что касается схемотехники, чтобы команды из библиотеки эффективно управляли ИК-светодиодом, он должен быть подключен к контакту 3 Arduino UNO.

В настоящее время код написан для трех разных типов телевизоров, которые можно выбрать, добавив / раскомментируя #define директива в первой части кода.

Батарея экономия

Для снижения энергопотребления реализовано несколько стратегий, использующих команды из avr / sleep.h и avr / power.h библиотеки.

Все неиспользуемые периферийные устройства и интерфейсы (ADC, SPI, TWI, timer1, usart) отключаются в процессе настройки. Встроенный светодиод на 13-м выводе ШИМ также не горит. Мы также решили отключить светодиодный индикатор питания Arduino UNO, который в противном случае всегда горит, хотя это не рекомендуется.

Кроме того, используя millis () , если ни одна из кнопок не нажимается в течение 5 секунд, пульт ДУ переходит в спящий режим, из которого выводится из спящего режима при повторном нажатии кнопки включения / выключения.

Как это устроено

Электроника сборка

Вся схема встроена в макетную плату, предназначенную для подключения к разъемам Arduino UNO. Паяльником припаял кнопки с учетом конечного положения на пульте. В нижней части два резистора по 47 Ом были припаяны параллельно, чтобы получить желаемый ток через ИК-светодиод.

Используя припойную проволоку, на макетной плате были сделаны дорожки для соединения контактов кнопки и ИК-светодиода с разъемами «папа».

Таким образом, плата напоминает щит, который устанавливается на Arduino UNO с помощью штыревых разъемов, обеспечивая все правильные соединения.

Корпус CAD и CAM

Корпус был спроектирован так, чтобы содержать батарею, макетную плату Arduino UNO + в сборе, открывая только кнопки вверху и ИК-светодиод на лицевой стороне.

Корпус состоит из двух частей, спроектированных с использованием программного обеспечения SolidWorks CAD, предварительно обработанных с помощью программного обеспечения для резки Ultimaker Cura и, наконец, напечатанных на 3D-принтере из PLA с помощью 3D-принтера Anycubic Mega Zero.

Arduino UNO крепится к основанию с помощью 3 винтов M2,5, которые вставляются в установочные отверстия, выдавленные изнутри основания. После того, как Arduino закреплен, ИК-светодиод будет выступать за пределы макетной платы, чтобы выровнять его со специальным отверстием и удерживать его на месте при сборке двух частей корпуса, добавляются три мини-стойки, чтобы избежать боковые движения светодиодных проводов. Аккумулятор запрессовывается в специальное место.

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

Основание и крышка корпуса крепятся 4 винтами M3.

Код

  • TV_remote.ino
TV_remote.ino Arduino
 #include  #include  #include  // Определение контакта // ИК-светодиод должен быть подключен к контакту 3 PWM Arduino # определить OnOff 1 # define Source 0 #define CH_plus 4 #define CH_minus 5 #define Vol_plus 6 #define Vol_minus 7 #define Interrupt_Pin 2 // Только контакт 2 или 3 на Arduino Uno // определение модели ТВ // # определение LG_TV // # определение SAMSUNG_TV # определение SONY_TV // Определение кодов # ifdef LG_TV unsigned long on_off_code =551489775; // HEX 20DF10EF беззнаковое длинное vol_plus_code =551502015; // HEX 20DF40BF long unsigned vol_minus_code =551534655; // HEX 20DFC03F беззнаковое длинное ch_plus_code =551485695; // HEX 20DF00FF беззнаковое длинное ch_minus_code =551518335; // Шестнадцатеричный код 20DF807F беззнаковый длинный source_code =551538735; // HEX 20DFD02F # endif # ifdef SAMSUNG_TV long без знака on_off_code =3772793023; // HEX E0E040BF беззнаковое длинное vol_plus_code =3772833823; // Шестнадцатеричный E0E0E01F беззнаковый длинный vol_minus_code =3772829743; // HEX E0E0D02F unsigned long ch_plus_code =3772795063; // HEX E0E048B7 unsigned long ch_minus_code =3772778743; // Шестнадцатеричный E0E008F7 беззнаковый длинный source_code =3772809343; // HEX E0E0807F # endif # ifdef SONY_TV unsigned long on_off_code =2704; // HEX A90 беззнаковое длинное vol_plus_code =1168; // HEX 490 беззнаковое длинное vol_minus_code =3216; // HEX C90 unsigned long ch_plus_code =144; // HEX 090 беззнаковое длинное ch_minus_code =2192; // HEX 890 беззнаковый длинный source_code =2640; // HEX A50 # endif // Включить отладку // # определить DEBUG // IRsend irsend; // Создание объекта IR без подписи long debounce_time; unsigned long last_time; void setup () {analogWrite (13,0); // включение встроенного светодиода // noInterrupts (); // запретить прерывания // CLKPR =_BV (CLKPCE); // включить настройки предварительного делителя частоты // CLKPR =_BV (CLKPS0); // устанавливаем предделитель частоты =2 -> 8 МГц // interrupts (); pinMode (OnOff, INPUT_PULLUP); pinMode (Источник, INPUT_PULLUP); pinMode (CH_plus, INPUT_PULLUP); pinMode (CH_minus, INPUT_PULLUP); pinMode (Vol_plus, INPUT_PULLUP); pinMode (Vol_minus, INPUT_PULLUP); pinMode (Interrupt_Pin, INPUT_PULLUP); // энергосбережение power_adc_disable (); // отключение всех АЦП power_spi_disable (); // отключение SPI power_timer1_disable (); // отключение таймера 1 (0 для millis (), 2 для irmote.h) power_usart0_disable (); // отключение последовательного порта power_twi_disable (); // отключение TWI #ifdef DEBUG Serial.begin (9600); #endif} void loop () {// проверяем OnOff if (! digitalRead (OnOff)) {debounce_time =millis (); while (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 (); while (millis () - debounce_time <40) {; } if (! digitalRead (Источник)) {#ifdef LG_TV irsend.sendNEC (исходный_код, 32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG (исходный_код, 32); #endif #ifdef SONY_TV irsend.sendSony (исходный_код, 12); #endif last_time =millis (); // последний раз была нажата кнопка #ifdef DEBUG Serial.println ("Source"); #endif}} // проверяем CH_plus if (! digitalRead (CH_plus)) {debounce_time =millis (); while (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 (); while (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 (); while (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}} // проверяем Vol_minus if (! digitalRead (Vol_minus)) {debounce_time =millis (); while (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 ("Ухожу в спящий режим ..."); #endif going_to_sleep (); // переход в спящий режим #ifdef DEBUG Serial.println ("Пробуждение ..."); #endif}} // Функция спящего режимаvoid going_to_sleep () {sleep_enable (); // включить спящий режим attachInterrupt (digitalPinToInterrupt (Interrupt_Pin), wake_up, LOW); // прерывание для пробуждения -> настроить вывод прерывания как ПРОВОДНОЙ НЕТ !!! set_sleep_mode (SLEEP_MODE_PWR_DOWN); // режим полного сна sleep_cpu (); // активируем спящий режим} // функция пробужденияvoid wake_up () {sleep_disable (); // отключаем спящий режим detachInterrupt (digitalPinToInterrupt (Interrupt_Pin)); // удаляем прерывание} 

Изготовленные на заказ детали и корпуса

Схема

remote_sketch_r4f8a47oWX.fz

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

  1. Контроль доступа с помощью QR, RFID и проверки температуры
  2. Использование ИК-пульта дистанционного управления с Raspberry Pi без LIRC
  3. PiCy - крошечный робот на базе Raspberry Pi!
  4. Игра с гироскопом Arduino с MPU-6050
  5. Камера безопасности Discord с ESP32
  6. Управление монетоприемником с помощью Arduino
  7. Unopad - MIDI-контроллер Arduino с Ableton
  8. Arduino с Bluetooth для управления светодиодом!
  9. Токарный станок с ЧПУ
  10. 5 преимуществ дистанционного управления производством