Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Zelfgemaakte Arduino TV-afstandsbediening – Batterij, 3D-geprinte behuizing

Onderdelen en benodigdheden

Arduino UNO × 1
9V-batterij (standaard) × 1
9V naar Barrel Jack Connector × 1
IR-zender (standaard) × 1
Machine Schroef M3 × 4
Machine Schroef M2.5 × 3
M3 moer × 4
M2.5 moer × 3
Doorverbindweerstand 47 ohm × 2
Experimenteerprint 2.54 mm × 1
PCB drukknop × 6
Male Header 36 Positie 1 Rij - Lang (0.1") × 1

Benodigde tools en machines

  • 3D-printer (standaard)
  • Solderbout (standaard)
  • Soldeerdraad, loodvrij
  • PLA-filament, diameter 1.75 mm

Over dit project

Inleiding

De TV-afstandsbediening van mijn vriendin werkte niet meer. Ze had een goedkope vervanging kunnen kopen, maar dacht: we zijn allebei ingenieurs, laten we er zelf een maken samen!

Omdat we complementaire vaardigheden hebben, was dit een leuke, andere manier om tijd door te brengen tijdens de lockdown en een kans om te leren hoe deze alledaagse technologie werkt. En het hebben van een kleine 3D-printer thuis hielp natuurlijk ook.

Hoe het werkt

Allereerst evalueerden we het minimum aantal commando's dat we nodig hadden voor onze TV, rekenend op de Arduino UNO. We vonden 6 commando's voldoende: AN/UIT toggle, Bronselectie, Ch+, Ch-, Vol+, Vol-.

Knoppen uitlezen

Om extra weerstanden te vermijden, gebruikt het ontwerp de interne pull-up-weerstanden van de Arduino. Als de afstandsbediening niet in slaapmodus is (zie hieronder), wordt elke knopstatus in elke luscyclus gepolled. Om meerdere hits te voorkomen, is een eenvoudige debouncing-routine geïmplementeerd met de millis()-functie.

Infrarood signalen zenden

Infraroodcommunicatie wordt afgehandeld door de IRremote.h-bibliotheek (credit aan de makers!). We hoefden alleen het protocol voor onze TV in te stellen (verschillende fabrikanten hebben eigen protocollen) en de HEX-codes voor de gewenste commando's op te zoeken op Google en aan de knoppen te koppelen. Voor de schakeling: de IR-LED moet aan pin 3 van de Arduino UNO verbonden zijn.

De code ondersteunt momenteel drie TV-typen, selecteerbaar door een #define-richtlijn in de code te (de)commentariëren.

Batterijbesparing

Om stroomverbruik te reduceren, zijn diverse strategieën geïmplementeerd met commando's uit de avr/sleep.h en avr/power.h bibliotheken.

  • Alle ongebruikte peripheralinterfaces (ADC, SPI, TWI, timer1, USART) worden in setup() uitgezet.
  • De ingebouwde LED op PWM-pin 13 wordt uitgezet.
  • We beslisten de voeding-LED van de Arduino UNO uit te solderen (altijd aan), hoewel niet aanbevolen.
  • Via millis(): als 5 seconden geen knop ingedrukt wordt, gaat de afstandsbediening in slaapmodus, waaruit deze ontwaakt wanneer de Aan/Uit-knop opnieuw wordt ingedrukt.

Hoe het gebouwd is

Elektronica-montage

De complete schakeling zit op een experimenteerprint, ontworpen om op de Arduino UNO-headers te passen. Met een solderbout werden de knoppen gesoldeerd rekening houdend met de eindpositie op de afstandsbediening. Aan de onderkant werden de twee 47-ohm-weerstanden parallel gesoldeerd voor de gewenste stroom door de IR-LED.

Met soldeerdraad werden sporen gemaakt op de experimenteerprint om de knoppen en IR-LED te verbinden met male pin-headers. Zo lijkt het bord op een shield die op de Arduino UNO past via de pin-headers, wat alle juiste verbindingen garandeert.

Behuizing: CAD en CAM

De behuizing is ontworpen om de batterij, de Arduino UNO + experimenteerprint-montage te bevatten, met alleen de knoppen bovenaan en de IR-LED aan de voorzijde zichtbaar.

De behuizing bestaat uit twee delen, ontworpen in SolidWorks CAD-software, voorverwerkt met Ultimaker Cura slicing-software en 3D-geprint in PLA op een Anycubic Mega Zero 3D-printer.

De Arduino UNO wordt aan de basis bevestigd met 3 M2.5-schroeven, die passen in uitlijningsgaten geëxtrudeerd vanaf de binnenkant van de basis. Eenmaal de Arduino bevestigd, steekt de IR-LED uit de experimenteerprint, uitgelijnd met het gat en vastgezet door drie mini-posten die laterale beweging van de LED-draden voorkomen. De batterij wordt in een speciale ruimte ingedrukt (press-fit).

Het deksel is ontworpen om alleen de knoppen bloot te leggen, met naast elke knop een ingegraving symbool voor de functie. Basis en deksel worden gemonteerd met 4 M3-schroeven.

Fotogalerij

(Afbeeldingen van het bouwproces en eindresultaat)

Code

TV_remote.ino

#include <IRremote.h>
#include <avr/sleep.h>
#include <avr/power.h>

// Pin definities
// IR LED MOET op Arduino PWM pin 3 aangesloten zijn
#define 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 // Alleen pin 2 of 3 op Arduino Uno

// TV-model definitie
//#define LG_TV
//#define SAMSUNG_TV
#define SONY_TV

// Code definities
#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

// Debug inschakelen
//#define DEBUG

IRsend irsend;
unsigned long debounce_time;
unsigned long last_time;

void setup() {
  analogWrite(13, 0); // ingebouwde LED uit
  pinMode(OnOff, INPUT_PULLUP);
  pinMode(Source, 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);

  // Stroom besparen
  power_adc_disable();
  power_spi_disable();
  power_timer1_disable();
  power_usart0_disable();
  power_twi_disable();

#ifdef DEBUG
  Serial.begin(9600);
#endif
}

void loop() {
  // Check 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
    }
  }

  // Check Source
  if (!digitalRead(Source)) {
    debounce_time = millis();
    while (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
    }
  }

  // Check 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
    }
  }

  // Check 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
    }
  }

  // Check 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
    }
  }

  // Check 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
    }
  }

  // Slaapmodus na 5 seconden inactiviteit
  if (millis() - last_time > 5000) {
#ifdef DEBUG
    Serial.println("Going to sleep...");
#endif
    going_to_sleep();
#ifdef DEBUG
    Serial.println("Waking up...");
#endif
  }
}

// Slaapmodus functie
void going_to_sleep() {
  sleep_enable();
  attachInterrupt(digitalPinToInterrupt(Interrupt_Pin), wake_up, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_cpu();
}

// Wake-up functie
void wake_up() {
  sleep_disable();
  detachInterrupt(digitalPinToInterrupt(Interrupt_Pin));
}

Schema

Schema voor de afstandsbediening. Details: hier.

Productieproces

  1. Geïntegreerde QR, RFID en Temperatuurverificatie Toegangscontrolesysteem
  2. IR-afstandsbediening-commando's vastleggen op Raspberry Pi zonder LIRC: Een Python UART-benadering
  3. PiCy: Bouw Je Eigen Kleine Raspberry Pi-aangedreven Robot
  4. Bouw een real-time gyroscoop-spel met Arduino Nano & MPU-6050 sensor
  5. ESP32-CAM bewegingdetecterende beveiligingscamera voor Discord
  6. Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
  7. Unopad: Naadloze Arduino MIDI-controller voor Ableton Live
  8. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  9. Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
  10. 5 Belangrijkste voordelen van externe productiecontrole voor de moderne industrie
  11. Millport SmartLathez 1740 CNC Draaibank – Precisie & Vermogen