Addons Camera to Control Lights

Since I’m not interested in taking part in any stage performances, I had not thought about stage lights and how to control them. It was my first time to know such things exist. And I was also impressed how improved the technology is to control such a complex system. Even though I have a little interest in stage performances, but I do like photography. So, I thought it would be cool to make a controller that can control lights for photoshoots.


How might we help photographers to control light sources while doing photoshoots.



The idea is actually similar to external flash which can be attached to a camera to help photographer get better pictures. But, instead of using flash, the photographer can change the color of photoshoots lights and amount of lights using camera extension/addons that can be attached to a camera.

Camera External Flash



The photographer can change color lights and the brightness of the studio lights. They can change the color lights using buttons, each button indicates different color. For the brightness, they can change it with a knob-like controller. Since every camera has main dial which looks and works like a potentiometer, I decided to make a knob-like controller looked like the main dial. That way, the users are already familiar with how it would work because they have a mental model of using camera.

Camera Parts & Main Dial



There would be 3 buttons to control color lights, each color will be controlled by one button. Also, there would be a main dial-like controller to control the brightness. This addons/extension then can be attached directly to the camera.




  • Arduino MKR1000
  • Buttons (3)
  • Rotary potentiometer 10K Ohm
  • Resistors 10K Ohm
  • Wires
  • Breadboard


  • Cardboard
  • Glue
  • Foam sheets
  • Leather


To control stage lights, there’s a protocol called DM-512 lighting protocol. As it is stated from DMX USB below.

DMX is a lighting control protocol which allows users to have ultimate control over their lighting needs. Although it does not only apply to lighting, lighting is the most common use for DMX.

Learn more about DMX:

This protocol allows users to control lighting using computer or microcontroller. In this project, I used internet connection to communicate between the Arduino and the lights. So that it can be controlled wirelessly. Below is the network diagram of the system.

Network Diagram



Wiring with LED for debugging



#include <SPI.h>
#include <WiFi101.h>
#include <WiFiUdp.h>
#include <sACNSource.h>
#include "arduino_secrets.h"

WiFiUDP Udp;                                  // instance of UDP library
sACNSource myController(Udp);                 // Your Ethernet-to-DMX device
char receiverAddress[] = "";      // sACN receiver address

int myUniverse = 1;                                 // DMX universe
char myDevice[] = "myDeviceName";                   // sender name
char myUuid[] = "d0033579-8c4e-48fa-9465-568943893ffe"; // sender UUID

const int redPin = 10;         // digital pin 10 for red light
const int yellowPin = 8;      // digital pin 8 for yellow light
const int bluePin = 6;        // digital pin 6 for blue light

int redLight, yellowLight, blueLight = 0;

void setup() {
  // buttons input for controlling the lights
  pinMode(redPin, INPUT);
  pinMode(yellowPin, INPUT);
  pinMode(bluePin, INPUT);

  // potentiometer input for brightness
  pinMode(A1, INPUT);

  //  while you're not connected to a WiFi AP,
  while ( WiFi.status() != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(SECRET_SSID);           // print the network name (SSID)
    WiFi.begin(SECRET_SSID, SECRET_PASS);     // try to connect
  // initialize sACN source:
  myController.begin(myDevice, myUuid, myUniverse);

  // When you're connected, print out the device's network status:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");

  // set DMX channel values to 0:
  for (int dmxChannel = 1; dmxChannel < 513; dmxChannel++) {
    myController.setChannel(dmxChannel, 0);
  // send all packet to receiver


void loop() {
  int redVal = digitalRead(redPin);         // pin 6 for red
  int yellowVal = digitalRead(yellowPin);   // pin 7 for yellow
  int blueVal = digitalRead(bluePin);       // pin 8 for blue

  int sensorValue = analogRead(A1);
  int brightness = map(sensorValue, 0, 1023, 0, 255);     // map potentiometer value to 255

  if (redVal == HIGH && yellowVal == LOW && blueVal == LOW) {   // turn on red light
    redLight = 255;
    yellowLight = 0;
    blueLight = 0;
    delay(100);     // debouce
  } else if (redVal == LOW && yellowVal == HIGH && blueVal == LOW) {    // turn on yellow light
    redLight = 0;
    yellowLight = 255;
    blueLight = 0;
    delay(100); // debouce
  } else if (redVal == LOW && yellowVal == LOW && blueVal == HIGH) {    // turn on blue light
    redLight = 0;
    yellowLight = 0;
    blueLight = 255;
    delay(100); // debouce
  myController.setChannel(1, brightness);       // set brightness on channel 1
  myController.setChannel(2, redLight);         // set channel for red light (channel 2)
  myController.setChannel(4, blueLight);        // set channel for blue light (channel 4)
  myController.setChannel(5, yellowLight);      // set channel for yellow light (channel 5)
  myController.sendPacket(receiverAddress);     // send all packages set from channels

  // print on Serial window
  Serial.print("red: ");
  Serial.print(" yellow: ");
  Serial.print(" blue: ");
  Serial.print(" brightness: ");


Final Product


Making a Camera Extension Light Controller from Vidia Anindhita on Vimeo.

Leave a Reply

Your email address will not be published. Required fields are marked *