DMX Controller & Receiver (LENGKAP DENGAN KODE)



Halo sobat miniatur dan penggemar miniatur! 🚀

Di artikel ini, saya akan bedah tuntas sebuah proyek yang sangat menarik: Mini DMX Controller & Receiver. Proyek ini adalah otak di balik sistem lighting miniatur yang sering saya gunakan di video-video saya. Saya akan berikan kode lengkapnya dan jelaskan fungsi setiap barisnya, jadi Anda bisa langsung salin, pasang, dan coba sendiri!

1. Sekilas Tentang DMX512 dan Proyek Ini

DMX512 adalah protokol standar industri untuk mengontrol pencahayaan panggung. Proyek Mini DMX ini berfungsi sebagai receiver yang menerima sinyal DMX, lalu menerjemahkannya untuk mengendalikan servo dan LED miniatur. Ini sangat ideal untuk membuat moving head atau beam miniatur yang bisa dikontrol dari mixer DMX.

2. Komponen yang Dibutuhkan

 * Mikrokontroler (Arduino UNO atau sejenisnya)

 * Modul RS485 (MAX485) untuk komunikasi DMX

 * Servo motor

 * LED

 * Resistor/ relay/ mosfet

 * Tombol push-button

 * Kabel dan breadboard

 * stepdown 




3. Kode Lengkap Mini DMX Receiver

Berikut adalah kode lengkap yang bisa Anda salin dan gunakan. Saya sudah tambahkan komentar di setiap bagian penting agar lebih mudah dipahami.

------

/*paste mulai sini

   ====================================

   ðŸŽš️ Mini DMX Controller + Servo & LED Receiver

   ===================================

   Project ini dibuat untuk mendukung eksperimen dan dokumentasi karya

   di channel YouTube: Akbar Audio 95


   Catatan:

   - Pastikan wiring sesuai pin yang tertera di kode.

   - Servo harus dipasang di pin PWM (UNO: 3,5,6,9).

   - DMX512 masuk via RS485 module (MAX485).

   - EEPROM menyimpan alamat DDX start.

   - Ada fitur reset dan set address naik 16 channel.

   - LED indikator dan servo bergerak sesuai channel DMX.

*/

#include <DMXSerial2.h>

#include <EEPROM.h>

#include <Servo.h>

static const char AKBAR_AUDIO_95[] = "AKBAR AUDIO 95";

static_assert(sizeof(AKBAR_AUDIO_95) == 15, "❌ String 'AKBAR AUDIO 95' harus tepat!");


#define AKBAR_KEY 0xE644u

#define DMX_A512_STRING AKBAR_AUDIO_95

#define DMX_A512_TAG ((uint8_t)(AKBAR_KEY ^ 0xA55Au))

#define DMX_A512_MAGIC ((uint16_t)( (uint16_t)DMX_A512_TAG ^ 0xA55Au ))


static_assert(true, "✅ DMX_A512 check bypassed to ensure compatibility.");


struct DMX_A512_DECOY {

  volatile uint8_t buf[512];

  uint16_t magic;

  const char *hint;

};


__attribute__((used))

static DMX_A512_DECOY __dmx_a512_deco = {

  {0}, // buffer besar (decoy)

  DMX_A512_MAGIC, // magic yang terikat ke AKBAR_KEY

  DMX_A512_STRING // referensi string wajib (sepaket)

};


static void DMX_A512_injector_dummy(unsigned short seed) {

  for (int i = 0; i < 32; ++i) {

    __dmx_a512_deco.buf[(i * 37) & 0x1FF] = (uint8_t)((seed >> (i & 3)) & 0xFF);

  }

  __dmx_a512_deco.magic ^= (uint16_t)seed;

}


static bool runtime_check_decoy() {

  return (__dmx_a512_deco.magic == DMX_A512_MAGIC);

}


// ====================== Pin ======================

#define PIN_RE_DE 2 // RS485 RE+DE

#define PIN_SERVO1 3

#define PIN_LED_IND 4

#define PIN_SERVO2 5

#define PIN_SERVO3 6

#define PIN_LED_1 7 // LED

#define PIN_LED_2 8 // LED

#define PIN_SERVO4 9

#define PIN_PB1 A0 // tombol 1 (set addr naik 16)

#define PIN_PB2 A1 // tombol 2 (reset addr)


// --- Objek Servo ---

Servo s1, s2, s3, s4;


// --- Variabel ---

uint8_t dmxStartAddr = 1;

bool lastPB1 = false, lastPB2 = false;

unsigned long lastDebouncePB1 = 0, lastDebouncePB2 = 0;


const uint16_t my_pids[] = {};

struct RDMINIT rdmInit = {

  AKBAR_AUDIO_95, 101, "Mini DMX", 6,

  sizeof(my_pids) / sizeof(uint16_t), my_pids,

  0, NULL

};

bool8 processCommand(struct RDMDATA *rdm, uint16_t *nackReason) { return false; }


void setup() {

  pinMode(PIN_RE_DE, OUTPUT);

  digitalWrite(PIN_RE_DE, LOW); // RS485 input

  pinMode(PIN_LED_IND, OUTPUT);

  pinMode(PIN_LED_1, OUTPUT);

  pinMode(PIN_LED_2, OUTPUT);

  pinMode(PIN_PB1, INPUT_PULLUP);

  pinMode(PIN_PB2, INPUT_PULLUP);


  // Servo attach

  s1.attach(PIN_SERVO1);

  s2.attach(PIN_SERVO2);

  s3.attach(PIN_SERVO3);

  s4.attach(PIN_SERVO4);


  // Baca alamat dari EEPROM

  dmxStartAddr = EEPROM.read(0);

  if (dmxStartAddr < 1 || dmxStartAddr > 505) dmxStartAddr = 1;


  // Init DMX

  DMXSerial2.init(&rdmInit, processCommand, PIN_RE_DE);


  // Indikasi startup

  digitalWrite(PIN_LED_IND, HIGH);

  delay(300);

  digitalWrite(PIN_LED_IND, LOW);


  // Runtime integrity check (opsional)

  if (!runtime_check_decoy()) {

    while (true) {

      digitalWrite(PIN_LED_IND, HIGH);

      delay(80);

      digitalWrite(PIN_LED_IND, LOW);

      delay(80);

    }

  }

}


void loop() {

  // --- Tombol 1: Set DMX Channel (naik 16) ---

  bool nowPB1 = !digitalRead(PIN_PB1);

  if (nowPB1 && !lastPB1 && millis() - lastDebouncePB1 > 300) {

    dmxStartAddr += 16;

    if (dmxStartAddr > 505) dmxStartAddr = 1;

    EEPROM.write(0, dmxStartAddr);

    for (int i = 0; i < (dmxStartAddr / 6); i++) {

      digitalWrite(PIN_LED_IND, HIGH); delay(100);

      digitalWrite(PIN_LED_IND, LOW); delay(100);

    }

    lastDebouncePB1 = millis();

  }

  lastPB1 = nowPB1;


  // --- Tombol 2: Reset Channel ke 1 ---

  bool nowPB2 = !digitalRead(PIN_PB2);

  if (nowPB2 && !lastPB2 && millis() - lastDebouncePB2 > 300) {

    dmxStartAddr = 1;

    EEPROM.write(0, dmxStartAddr);

    for (int i = 0; i < 3; i++) {

      digitalWrite(PIN_LED_IND, HIGH); delay(150);

      digitalWrite(PIN_LED_IND, LOW); delay(150);

    }

    lastDebouncePB2 = millis();

  }

  lastPB2 = nowPB2;


  // --- Baca data DMX ---

  if (DMXSerial2.noDataSince() < 2000) {

    int val1 = DMXSerial2.readRelative(1); // servo1

    int val2 = DMXSerial2.readRelative(2); // servo2

    int val3 = DMXSerial2.readRelative(3); // servo3

    int val4 = DMXSerial2.readRelative(4); // servo4

    int led1 = DMXSerial2.readRelative(5); // LED

    int led2 = DMXSerial2.readRelative(6); // LED


    // Servo gerak halus (0–255 -> 0–100 derajat)

    s1.write(map(val1, 0, 255, 0, 100));

    s2.write(map(val2, 0, 255, 0, 100));

    s3.write(map(val3, 0, 255, 0, 100));

    s4.write(map(val4, 0, 255, 0, 100));


    // LED on/off

    digitalWrite(PIN_LED_1, led1 > 127 ? HIGH : LOW);

    digitalWrite(PIN_LED_2, led2 > 127 ? HIGH : LOW);

    digitalWrite(PIN_LED_IND, HIGH); // indikator ada data

  } else {

    digitalWrite(PIN_LED_IND, LOW); // indikator mati kalau tidak ada data

  }

  // --- Update DMX terakhir ---

  DMXSerial2.tick();

//Sampai garis ini 

}

--------------------

---------------------

4. Penjelasan Fungsi Kode

 * Bagian Atas (#include dan #define):

   * Bagian ini berisi library yang diperlukan dan definisi pin untuk setiap komponen.

   * Anda bisa mengubah nilai dmxStartAddr untuk mengatur alamat awal DMX sesuai kebutuhan. Misal kan 2 modul arduino dan 1 parled 

Arduino 1 di alamat 1-16 dan arduino kedua 17-32 sedangkan parled bisa mengikuti alamat selanjutnya (33-49 ) dan seterusnya dengan kelipatan alamat address dmx yaitu 16 chanel


 * setup():

   * Fungsi ini berjalan sekali saat Arduino menyala.

   * Mengatur semua pin sebagai INPUT atau OUTPUT.

   * Memastikan servo siap digunakan dengan fungsi s1.attach().

   * Membaca alamat DMX yang tersimpan di memori (EEPROM) agar tidak hilang saat mati.

 * loop():

   * Ini adalah bagian utama yang terus berjalan.

   * Kontrol Tombol: Logika untuk PIN_PB1 dan PIN_PB2 mendeteksi kapan tombol ditekan untuk menambah atau mengatur ulang alamat DMX.

   * Baca DMX: DMXSerial2.readRelative(x) membaca nilai DMX dari channel yang sudah disesuaikan dengan alamat awal.

   * Kontrol Servo & LED:

     * Fungsi map() mengubah nilai 0-255 (dari DMX) menjadi 0-100 derajat (untuk servo).

Sahabat miniatur juga bisa mengaplikasikan menjadi 0-180 sudut maksimal dari jenis servo yang 180° . bahkan sahabat miniatur bisa menentukan sudut 20-80 seperti project" Yang kita bahas di sudut aman servo sebelum nya

     * Mengatur LED menjadi HIGH (nyala) jika nilai DMX di atas 127, dan LOW (mati) jika di bawahnya.

   * Indikator Data: LED indikator akan menyala jika ada sinyal DMX yang masuk.

Sahabat miniatur juga bisa menggunakan layar oled untuk membaca signyal dari dmx agar tampilan lebih menarik seperti beam pabrikan, 

5. Penerapan dalam Proyek Miniatur Anda

Setelah Anda mengunggah kode ini ke Arduino, Anda tinggal menghubungkannya ke mixer DMX. Anda akan bisa menggerakkan servo dan menyalakan LED sesuai dengan fader di mixer. Anda bisa gunakan ini untuk:

 * Miniatur Moving Head: Mengontrol pergerakan servo atas dan bawah. 

 * Miniatur Beam: Mengontrol sudut dan efek lampu.

 * Efek Khusus: Menyalakan efek asap, lampu sorot, atau apapun yang bisa dikontrol dari DMX.

Selamat mencoba dan berkarya!

Catatan penting :

Apabila Saat upload terjadi kendala cabut pin rx & tx yang terhubung ke modul rs nya, 

Karna umum terjadi eror saat upload ke arduino saat pin rx dan tx di fungsikan. 

Fahami juga struktur dasar mixer DMX512 

https://akbarminiatur.blogspot.com/2025/07/struktur-dasar-dmx512.html


#Arduinoproject #membuatbeamminiatur #movingheadbeamrakitan #Elektronika #Arduino #DMX512 #Miniatur #DIY #AkbarAudio95 #Lighting #Tutorial


Komentar

Postingan populer dari blog ini

Tutorial membuat mixer beam miniatur

Coding arduino untuk beam

Membuat strobo dan whal waser dari led ws