Selbstbau TV-Fernbedienung: Arduino UNO, batteriebetrieben, 3D-gedrucktes Gehäuse
Komponenten und Zubehör
| Arduino UNO | × | 1 |
| 9 V Blockbatterie | × | 1 |
| 9 V auf Hohlstecker-Adapter | × | 1 |
| IR-Sender (generic) | × | 1 |
| Maschinenschraube M3 | × | 4 |
| Maschinenschraube M2,5 | × | 3 |
| M3 Mutter | × | 4 |
| M2,5 Mutter | × | 3 |
| Durchsteckwiderstand 47 Ω | × | 2 |
| Lochrasterplatine 2,54 mm | × | 1 |
| PCB-Taster | × | 6 |
| Pinheader 36-polig 1-reihig (lang) | × | 1 |
Benötigte Werkzeuge und Maschinen
- 3D-Drucker (beliebig)
- Lötkolben
- Lötzinn (bleifrei)
- PLA-Filament 1,75 mm
Über dieses Projekt
Einführung
Die TV-Fernbedienung meiner Freundin ging kaputt. Statt billigen Ersatz zu kaufen, dachten wir: Wir sind beide Ingenieure – bauen wir unsere eigene! Eine schöne, lehrreiche Beschäftigung im Lockdown, um zu verstehen, wie Alltagstechnik funktioniert. Unser kleiner 3D-Drucker kam auch zum Einsatz.
Funktionsweise
Minimale Befehlsmenge: Wir definierten 6 essenzielle Befehle: Ein/Aus (Toggle), Quelle, Kanal+, Kanal−, Lautstärke+, Lautstärke−.
Tastenabfrage
Keine externen Pullup-Widerstände nötig – Nutzung der internen Pullups des Arduino. Solange nicht im Sleep-Mode, wird jeder Taster pro Loop-Zyklus gepollt. Entprellung via millis() (40 ms Wartezeit).
Infrarot-Sendeprotokoll
Bibliothek IRremote.h übernimmt Protokoll-Handling. Protokoll für den jeweiligen TV-Hersteller einstellen (jeder hat eigenes Protokoll). HEX-Codes für gewünschte Befehle googeln und Buttons zuordnen. Wichtig: IR-LED muss an Arduino PWM-Pin 3 angeschlossen sein.
Code unterstützt 3 TV-Typen per #define (LG, Samsung, Sony) – auskommentieren/aktivieren.
Stromsparen
Mehrere Strategien via avr/sleep.h und avr/power.h:
- Unbenutzte Peripherie abschalten: ADC, SPI, TWI (I²C), Timer1, USART.
- Onboard-LED (Pin 13) per
analogWrite(13,0)ausschalten. - Power-LED des Arduino UNO ausgelötet (nicht empfohlen, aber effektiv).
- Sleep-Mode nach 5 s Inaktivität:
millis()prüft letzte Tastenbetätigung. Aufwachen per Interrupt am On/Off-Taster (Pin 2).
Aufbau
Elektronik-Montage
Gesamte Schaltung auf Lochrasterplatine, passend für Arduino UNO Pinheader. Taster per Lötkolben an Endpositionen verlöten. Unterseite: Zwei 47 Ω Widerstände parallel → gewünschter IR-LED-Strom. Leiterbahnen per Lötzinn auf Lochraster gezogen, Taster-Pins und IR-LED an Pinheader angeschlossen. → Platine wirkt wie Shield, wird auf Arduino aufgesteckt.
Gehäuse: CAD & CAM
Gehäuse fasst Batterie, Arduino + Lochraster-Platine. Nur Tasten (oben) und IR-LED (vorn) sichtbar.
Zweiteilig, designed in SolidWorks, gesliced mit Ultimaker Cura, gedruckt in PLA (Anycubic Mega Zero).
Arduino mit 3 M2,5-Schrauben in Basis fixiert (Ausrichtungsbohrungen innen). IR-LED ragt aus Lochraster, aligniert mit Gehäuseloch; 3 Mini-Stege fixieren LED-Drähte lateral. 9 V Block per Pressfit in Batteriefach.
Deckel exponiert nur Tasten, neben jeder ein graviertes Symbol für Funktion.
Basis + Deckel per 4 M3-Schrauben verschraubt.
Fotogalerie
Code
TV_remote.ino
Arduino
#include <IRremote.h>
#include <avr/sleep.h>
#include <avr/power.h>
// Pin-Definitionen
// IR-LED MUSS an Arduino PWM Pin 3
#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 // Nur Pin 2 oder 3 auf Uno
// TV-Modell wählen
//#define LG_TV
//#define SAMSUNG_TV
#define SONY_TV
// HEX-Codes pro TV
#ifdef LG_TV
unsigned long on_off_code = 551489775; // 0x20DF10EF
unsigned long vol_plus_code = 551502015; // 0x20DF40BF
unsigned long vol_minus_code = 551534655; // 0x20DFC03F
unsigned long ch_plus_code = 551485695; // 0x20DF00FF
unsigned long ch_minus_code = 551518335; // 0x20DF807F
unsigned long source_code = 551538735; // 0x20DFD02F
#endif
#ifdef SAMSUNG_TV
unsigned long on_off_code = 3772793023; // 0xE0E040BF
unsigned long vol_plus_code = 3772833823; // 0xE0E0E01F
unsigned long vol_minus_code = 3772829743; // 0xE0E0D02F
unsigned long ch_plus_code = 3772795063; // 0xE0E048B7
unsigned long ch_minus_code = 3772778743; // 0xE0E008F7
unsigned long source_code = 3772809343; // 0xE0E0807F
#endif
#ifdef SONY_TV
unsigned long on_off_code = 2704; // 0xA90
unsigned long vol_plus_code = 1168; // 0x490
unsigned long vol_minus_code = 3216; // 0xC90
unsigned long ch_plus_code = 144; // 0x090
unsigned long ch_minus_code = 2192; // 0x890
unsigned long source_code = 2640; // 0xA50
#endif
//#define DEBUG
IRsend irsend;
unsigned long debounce_time;
unsigned long last_time;
void setup() {
analogWrite(13, 0); // Onboard LED aus
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);
// Power saving
power_adc_disable();
power_spi_disable();
power_timer1_disable();
power_usart0_disable();
power_twi_disable();
#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
}
}
// 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
}
}
// 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
}
}
// Sleep nach 5 s Inaktivität
if (millis() - last_time > 5000) {
#ifdef DEBUG Serial.println("Going to sleep...");
#endif
going_to_sleep();
#ifdef DEBUG Serial.println("Waking up...");
#endif
}
}
void going_to_sleep() {
sleep_enable();
attachInterrupt(digitalPinToInterrupt(Interrupt_Pin), wake_up, LOW); // Interrupt Pin als WIRED NOR
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_cpu();
}
void wake_up() {
sleep_disable();
detachInterrupt(digitalPinToInterrupt(Interrupt_Pin));
}
Custom Parts & Enclosures
3D-Druckdateien (SolidWorks Quelle) – auf Anfrage / im Projektverzeichnis.
Schaltpläne
Fritzing-Datei: remote_sketch_r4f8a47oWX.fz
Herstellungsprozess
- Integriertes QR-, RFID- und Temperatur-Verifikations-Zugangskontrollsystem
- IR-Fernbedienungsbefehle auf Raspberry Pi ohne LIRC erfassen: Python UART-Ansatz
- PiCy: Eigenen winzigen Raspberry-Pi-betriebenen Roboter bauen
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- ESP32-CAM Bewegungserkennungs-Kamera für Discord
- Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
- Unopad: Nahtloser Arduino MIDI-Controller für Ableton Live
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Millport SmartLathez 1740 CNC-Drehmaschine – Präzision & Power
- 5 Schlüsselvorteile der ferngesteuerten Produktionskontrolle für die moderne Industrie