Dimmbare LED Beleuchtung mit Arduino und IR Fernbedienung Modul

Von Sven
LED Band dimmen Arduino Nano IR Fernbedienung Modellbahn

Vorgeschichte

Für ein Diorama Projekt benötigte ich mehrere kleine LED Bänder zur Ausleuchtung. Diese sollten zur Darstellung verschiedener Tagesabläufe bzw. diverser Wetterszenarien in der Helligkeit gedimmt werden können. Eine Fernbedienung dieser Einstellungen und in Zukunft das Schalten anderer Funktionen sollte ermöglicht werden. Meine Wahl zur Realisierung der Wünsche fiel, wie so oft, auf einen Arduino Nano mit einer selbst geschrieben Software.

Materialliste

Für dieses Vorhaben benötigte ich nicht sehr viel, da hatte ich sogar noch etwas in der “Bastelkiste” herum liegen.

Arduino Nano mit Schraubklemmen Adapter

Arduino Nano mit Adapter Board MOBA Module

Technische Daten:
Microcontroller: ATmega328
Flash Speicher: 32 KB
SRAM: 2 KB
EEPROM: 1 KB
Taktrate: 16 MHz
I/O-Pins: 14
Anschluss: Mini-USB
LEDs: RXD, TXD, Power, Pin 13,
Größe: ca. 1,85 cm x 4,3 cm
Betriebsspannung: 5 V
Empfohlene Eingangsspannung: 7-12 V

IR Fernbedienung und Empfänger Kit / Modul

IR Empfaenger Fernbedienung Kit Modul Arduino Nano

Sensor IR Empfänger HX1838
Betriebsspannung: 5V
Ausgang: Digital
VCC: 3,3V – 5V
GND: externer GND
IN: externer Mikrocontroller I/O port, I/O-port pull-up Widerstand auf Platine
Empfangsabstand: 5-8 meter
Kit:
IR Fernbedienung
HX1838 Empfängermodul
3Pin Anschlussleitung

Motor Treiber Modul mit LN298N

Motor Treiber Modul L298N Arduino Nano

Doppelte H-Brücke
Chip: L298N
Logik Spannung: 5V
Treiber Spannung: 5V-35V
Logik Strom: 0mA-36mA
Treiber Strom: 2A (MAX single bridge)
Maximale Leistung: 25W

Diesen Motortreiber mit dem Leistungsteil verwendete ich zum Dimmen, da dieser unkompliziert über die Software angesteuert werden konnte. Dazu wird einfach über den Enable Eingang ein analoger Wert zwischen 0 und 255 vom Arduino übertragen.

Montage im Diorama

Die Bauelemente wurden mit Heißkleber auf dem Dioramaboden befestigt. Das hält im Normalfall sehr fest, ermöglicht aber auch wieder die Demontage. Die LED Streifen wurden in einzelne Segmente in der richtigen Länge unterteilt und mittels PIN Verbindern angeschlossen. Diese ermöglichen eine einfache Montage ohne Löten. Für die Leitungsverbindungen wurden Mehrfachverbinder und klassische Verbindungsklemmen von WAGO benutzt.

Schaltplan für den Arduino Nano

Der Schaltplan ist recht einfach. Im folgenden Bild können die Verbindungen verfolgt werden.

Arduino Testprogramm

Nach der Installation erfolgte die Programmierung des Arduino, um erst einmal diverse Sachen auszuprobieren.

Zuerst musste ich die Codes der Infrarot Fernbedienung herausbekommen. Dazu wurde ein kleiner Sketch mit Hilfe IRremote (GitHub) geschrieben und auf den Arduino übertragen. Mit dem seriellen Monitor konnten die ausgelesenen Fernbedineungscodes auf dem PC-Monitor angezeigt werden.

Den Sketch dazu gibt es hier:

/**
 * @file IRremote.hpp
 *
 * @brief Public API to the library.
 *
 * @code
 * !!! All the macro values defined here can be overwritten with values,    !!!
 * !!! the user defines in its source code BEFORE the #include <IRremote.hpp> !!!
 * @endcode
 *
 * This file is part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
 *
 ************************************************************************************
 * MIT License
 *
 * Copyright (c) 2015-2023 Ken Shirriff http://www.righto.com, Rafi Khan, Armin Joachimsmeyer
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is furnished
 * to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 ************************************************************************************
 *
 * For Ken Shiriffs original blog entry, see http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
 * Initially influenced by:
 * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
 * and http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
 */
#include <IRremote.hpp>
#define IR_RECEIVE_PIN 2
void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN);
}
void loop() {
  if (IrReceiver.decode()) {
    delay(50);
    IrReceiver.resume();
    int command = IrReceiver.decodedIRData.command;
    Serial.print("Dezimalwert: ");
    Serial.print(" -> ");
    Serial.println(IrReceiver.decodedIRData.command);
  }
}

Der Sketch zum Dimmen der LEDs mit der Fernbedienung

Nachdem nun geklärt welcher IR Code zu welcher Taste auf der Fernbedienung passt, konnte das eigentliche Programm geschrieben werden.

Auf der Fernbedienung werden die Tasten + und – zum Einstellen der Helligkeit verwendet und die Taste 0 zum Ausschalten. Die Codes dafür waren bei mir die 21 für +, die 7 für – und 22 für 0. Demzufolge mussten mit Hilfe einer switch-Anweisung nur diese Codes abgefragt werden, um entsprechend den Analogwert für für den Ausgang zum Treiberbaustein festzulegen.

#include <IRremote.hpp>
const int Bel = 6;
const int BIn = 5;
int BStatus = 125;
#define IR_RECEIVE_PIN 2
void setup() {
  pinMode(Bel, OUTPUT);
  pinMode(BIn, OUTPUT);
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN);
  digitalWrite(Bel, HIGH);
  analogWrite(BIn, BStatus);
}
void loop() {
  if (IrReceiver.decode()) {
    delay(50);
    IrReceiver.resume();
    int command = IrReceiver.decodedIRData.command;
    switch (command) {
      case 21: {
        BStatus = BStatus + 10;
        if (BStatus > 220){ BStatus = 220;}
        digitalWrite(Bel, HIGH);
        analogWrite(BIn, BStatus);
        break;
      }
      case 7: {
        BStatus = BStatus - 10;
        if (BStatus < 1){ BStatus = 1;}
        digitalWrite(Bel, HIGH);
        analogWrite(BIn, BStatus);
        break;
      }
      case 22: {
        digitalWrite(Bel, LOW);
        break;
      }
    }
  }
}

Das Aktivieren des Enable Eingangs des Treibermoduls erfolgt über die Variable Bel, welche am PIN D6 angeschlossen wurde und auf HIGH steht. Über den Ausgangspin D5 (BIn) erfolgt die Ausgabe des analogen Wertes der Variable BStatus, welche für die Helligkeit der LEDs zuständig ist. Für das vollständige Abschalten setze ich die Variable Bel auf LOW.

Damit funktionert das Dimmen der LED Bänder einwandfrei. Die Abstufungen (BStatus) zwischen den einzelnen Helligkeitsstufen habe ich für mich auf den Wert 10 festgelegt.