logo elektroda
logo elektroda
X
logo elektroda

[BK7231N / CBU] SK26 Galaxy Star Projector

similicious  15 3405 Cool? (+1)
Listen:

TL;DR LABEL_AI_GENERATED

  • The SK26 Galaxy Star Projector uses a BK7231N on a CBU module to drive an RGB nebula LED, laser stars, a motor, a microphone, and three front buttons.
  • Teardown requires removing 4 bottom screws, 6 frame screws, and carefully unplugging glued cables while freeing the glued main board and motor frame.
  • Flashing uses the labeled VCC/GND pads under the module, with TX/RX on pins 15 and 16, and the BK7231 GUI Flash Tool backs up firmware.
  • An autoexec.bat script adds PWMToggler control for the laser and motor, links them to LEDState, and enables color cycling with a customizable 13-color palette.
  • Home Assistant MQTT entities expose the RGB light, laser, motor, and color-cycle switch, but the built-in piezo microphone sync could not be made to work.
AI summary based on the discussion. May contain errors.
Overview

Galaxy projector displaying colorful lights and a mobile app for control.

This projector has 5 components
- RGB LED, projected through a lens (nebula)
- Laser, projected through a screen (stars)
- Motor, turns the lense and screen, resulting in movement of the nebula and stars
- Microphone, to sync the light to music
- 3 Buttons on the front, to turn on the projector, cycle scenes, activate music mode

Info:
- Chip: BK7231N
- Module: CBU

Close-up view of the projector's circuit board with labeled ports and buttons.

It's quite close to the device showcased here, but it features a different chip, Tuya module and construction, so I figured it would be worth documenting. Nevertheless, most of the work has been done for the Genio projector so it was easy to get this one running. Thanks @joelstevens1101 and @pkaczmarek2 for your work!

Teardown

Remove the 4 screws at the bottom of the device. They are quite hard to reach, you need a very short phillips head screwdriver.

Lift off the top cover to right hand side. Caution: The button board is connected with the main board, so you need to unplug the red cable before removing the cover completely.
Close-up of the projector's interior with an open casing, showing a red cable connecting the buttons to the main board.

Remove 6 more screws from the black middle frame.
Interior view of a starry sky projector with labeled components.
Remove the lense and the screen. The motor is attached to the frame on the bottom. When moving the frame make sure you don't damage the cables. Either put the frame to the side or unplug the cable with pliers.

The main board is glued in place. I had to wiggle it for some time with moderate force to get it out. When pulling out the board, again pay attention to the cables.
Interior of a disassembled projector showing electronic components.

Unplug the rest of the cables. They are also glued to the connectors, so make sure you pull on the plug, not on the cables.

You did it! The board looks like this:
Top view of an SK26 projector circuit board with component and connector labels.
LED projector circuit board with various components and a CBU module on the surface.

Flashing

For VCC and GND I used the pads below the module, as they are easier to solder to. They are labelled. TX (Pin 15) and RX (Pin 16) are on the right hand side of the chip. Tin your wires and pads, flux will help you. To solder, just connect the wire with the pad and touch it with the iron briefly.
Circuit board with marked RX, TX, VCC, and GND pins

Connect the soldered wires to your programmer. I used a NodeMCU that I had lying around as described here. Conveniently it also operates on 3.3V so I had no issue with voltage conversion.

The BK7231 GUI Flash Tool works just fine for flashing. It is quite straightforward: Make sure you select the correct COM port and BK7231N as the chip. Start the backup and flashing procedure and power cycle the chip when prompted. Note: Only reset the chip, not the programmer. You can find the backup of my devices ROM attached to this thread.
readResult...-23-05.bin (2 MB)You must be logged in to download this attachment.

Should you not able be able to get a connection to in the flash tool, double check your solder joints. The ones on the chip in my picture actually short TX and RX, so I had to redo them.

After flashing is complete, power cycle the device again. A new Wifi network should appear. Set up the device to join your local network. Confirm you can connect the device to it using your Wifi.

Congrats! That was the hard part - the new firmware is flashed. You can now desolder the wires you used for flashing and put the device back together.

Setup

Launch the webapp and head to Import. Paste the template in the first column and click Clear OBK and apply new script from above.


{
  "vendor": "Generic",
  "bDetailed": "0",
  "name": "Smart LED Galaxy Projector",
  "model": "SK26",
  "chip": "BK7231N",
  "board": "CBU",
  "flags": "1446912",
  "keywords": [
    "led",
    "rgb",
    "star",
    "nebula",
    "projector",
    "laser",
    "motor"
  ],
  "pins": {
    "6": "PWM_n;3",
    "7": "PWM;5",
    "8": "PWM;4",
    "14": "Btn_SmartLED;0",
    "20": "Btn_ScriptOnly;0",
    "22": "Btn_ScriptOnly;0",
    "24": "PWM_n;2",
    "26": "PWM_n;1"
  },
  "command": "",
  "image": "https://obrazki.elektroda.pl/2917649700_1702586359.jpg",
  "wiki": "https://www.elektroda.com/rtvforum/viewtopic.php?p=20863828#20863828"
}

After restarting, on the main page you should be already able to control the RGB LED. But we are not done yet.

To get the motor and laser working head over to Filesystem, click Create File, confirm autoexec.bat as the name and paste the following content into it. It will couple the state of the of the LED to the motor and laser and set startup values for them.


// PWM TOGGLER SETUP

// enable toggler driver
startDriver PWMToggler

// toggler slot one is the laser, channel 4
toggler_channel0 4
toggler_name0 Laser

// toggler slot two is the motor, channel 5
toggler_channel1 5
toggler_name1 Motor

// set startup values for laser
toggler_set0 100
toggler_enable0 1

// set startup values for motor
toggler_set1 100
toggler_enable1 1

// LED, LASER, MOTOR COUPLING

// when disabling the LED, also disable laser and motor
addEventHandler LEDState 0 backlog toggler_enable0 0; toggler_enable1 0; 

// when enabling the LED, also enable laser and motor
addEventHandler LEDState 1 backlog toggler_enable0 1; toggler_enable1 1; 

// BUTTONS

// TOGGLE LASER
alias enable_laser toggler_enable0 1
alias disable_laser toggler_enable0 0

addEventHandler OnClick 20 if $CH4==100 then disable_laser else enable_laser

// TOGGLE MOTOR
alias enable_motor toggler_enable1 1
alias disable_motor toggler_enable1 0

addEventHandler OnDblClick 20 if $CH5==100 then disable_motor else enable_motor

// CYCLE FEATURE
setChannelType 10 Toggle
setChannelLabel 10 "color cycle" 0

alias add_color_cycle_event addRepeatingEventID 10 -1 420 led_nextcolor
alias remove_color_cycle_event cancelRepeatingEvent 420

addChangeHandler Channel10 == 1 add_color_cycle_event
addChangeHandler Channel10 == 0 remove_color_cycle_event

alias enable_color_cycle SetChannel 10 1
alias disable_color_cycle SetChannel 10 0

addEventHandler OnClick 22 if $CH10==1 then disable_color_cycle else enable_color_cycle
addEventHandler LEDState 0 disable_color_cycle

// COLOR PALETTE
SPC 0 FF00AE
SPC 1 BB00FF
SPC 2 5500FF
SPC 3 0008FF
SPC 4 0040FF
SPC 5 0D6CD2
SPC 6 17D1FF
SPC 7 1EFF30
SPC 8 FCD023
SPC 9 FC8F00
SPC 10 FF0000
SPC 11 FF0088
SPC 12 FF00DD

Confirm with Save, Reset SVM and run file as script thread.

Now the main menu should look like this:
LED projector control panel with various options such as mode switching and brightness settings.

You can toggle the LED, Motor and Laser and control the brightness and speed. Also there is a button to automatically cycle the colors. The color pallete can be customized at the bottom of the script.

Buttons

The buttons are configured like this
- Music: 1x Click: toggle laser, 2x Click: toggle motor
- Switch: 1x Click: toggle LED + laser + motor, 2x Click: next color, Hold: change brightness
- Scene: Toggle automatic color palette cycle

Homeassistant

This config adds the light, motor, rgb and the color cycle mode to Homeassistant. You will need to adjust the mqtt topics to match your configuration.

Projector 3000 app interface with control options enabled.


mqtt:
  light:

    - unique_id: "star_projector_rgb"
      name: "RGB"
      availability_topic: "home/living-room/star-projector/connected"

      device:
        name: "Star Projector"
        model: "SK26"
        manufacturer: "Tuya"
        identifiers: "sk26affe"

      # on / off
      state_topic: "home/living-room/star-projector/led_enableAll/get"
      command_topic: "cmnd/home/living-room/star-projector/led_enableAll"
      payload_on: 1
      payload_off: 0

      # rgb
      rgb_state_topic: "home/living-room/star-projector/led_basecolor_rgb/get"
      rgb_value_template: "{{ value[0:2]|int(base=16) }},{{ value[2:4]|int(base=16) }},{{ value[4:6]|int(base=16) }}"
      rgb_command_topic: "cmnd/home/living-room/star-projector/led_basecolor_rgb"
      rgb_command_template: "{{ '#%02x%02x%02x0000' | format(red, green, blue)}}"

      # brightness
      brightness_command_topic: "cmnd/home/living-room/star-projector/led_dimmer"
      brightness_state_topic: "home/living-room/star-projector/led_dimmer/get"
      brightness_scale: 100

    - unique_id: "star_projector_laser"
      name: "Laser"

      state_topic: "home/living-room/star-projector/toggler_enable0/get"
      command_topic: "cmnd/home/living-room/star-projector/toggler_enable0"
      payload_on: 1
      payload_off: 0

      brightness_state_topic: "home/living-room/star-projector/toggler_set0/get"
      brightness_value_template: "{{value}}"
      brightness_command_topic: "cmnd/home/living-room/star-projector/toggler_set0"
      brightness_scale: 100

      device:
        identifiers: "sk26affe"

    - unique_id: "star_projector_motor"
      name: "Motor"

      state_topic: "home/living-room/star-projector/toggler_enable1/get"
      command_topic: "cmnd/home/living-room/star-projector/toggler_enable1"
      payload_on: 1
      payload_off: 0

      brightness_state_topic: "home/living-room/star-projector/toggler_set1/get"
      brightness_value_template: "{{value}}"
      brightness_command_topic: "cmnd/home/living-room/star-projector/toggler_set1"
      brightness_scale: 100

      device:
        identifiers: "sk26affe"

  switch:

    - unique_id: "star_projector_color_cycle"
      name: "Color cycle"

      state_topic: "home/living-room/star-projector/10/get"
      command_topic: "home/living-room/star-projector/10/set"
      payload_on: 1
      payload_off: 0
      
      device:
        identifiers: "sk26affe"


What doesn't work

Microphone
The projector has a builtin piezo microphone to sync the light to music. I wasn't able to get that working. I assume it's connected to PIN 5 (ADC) but I can't tell if the readings correlate to the music.
Graph showing fluctuating raw values on the y-axis over time.

About Author
similicious wrote 8 posts with rating 1 . Been with us since 2023 year.

Comments

similicious 16 Dec 2023 12:20

Not sure how my post ended up in this forum. Or was it moved here automatically? Anyways, feel free to move it to the appropriate place. [Read more]

p.kaczmarek2 16 Dec 2023 12:39

Thank you for this detailed guide, @similicious ! That will certainly be helpful for both beginners and advanced IoT tinkerers. Don't worry about it being temporary in the "Temp" section, we just need... [Read more]

similicious 16 Dec 2023 13:45

Amazing, thanks for your help! I will use that to map laser and motor controls to the buttons. As for the color palette, it would be pretty cool to be able to configure the palette, so Btn_SmartLED... [Read more]

p.kaczmarek2 16 Dec 2023 13:59

So basically you want a command to set palette color by index? [Read more]

similicious 16 Dec 2023 14:12

It would be amazing to have a command to toggle a toggler. And also one to add to it, like so addEventHandler OnClick 20 toggler_toggle0 addEventHandler OnDblClick 20 toggler_add0 10 addEventHandler... [Read more]

p.kaczmarek2 16 Dec 2023 14:44

For now, I've added ability to set the palette. Can you check? https://github.com/openshwprojects/OpenBK7231T_App/commit/2b43acdbb670a5a37cf7b37c6407950b2031ff87 Build is ready. Usage is: SPC 0... [Read more]

similicious 16 Dec 2023 15:08

It works, thanks a lot! [Read more]

p.kaczmarek2 16 Dec 2023 15:28

This is a good idea but I need to respect flash size limits. What about supporting the following syntax: // sets the toggler to 25 toggler_set1 25 // add 25 to the toggler (and clamp) toggler_set1... [Read more]

similicious 16 Dec 2023 19:24

Alright, I had to figure out the scripting language a bit, but I got it now. Buttons now toggle laser, motor, and automatic color palette cycle mode. I did not end up using the new toggler set feature,... [Read more]

p.kaczmarek2 16 Dec 2023 19:55

How is the microphone supposed to work? [Read more]

similicious 16 Dec 2023 23:49

I'm not sure. The microphone is connected via two wires. If I follow the traces correctly, they go into an LM358 IC, which is an amplifier of some kind. Then I just assume that the signal goes to Pin 5... [Read more]

divadiow 11 Apr 2024 20:43

and from that comes { "gw_bi": { "uuid": "3a9bf5eed0067d90", "psk_key": "7E93y6pAENNtUK7I6UvsoT3hqGzuaMycMPJ5S", "auth_key": "zPk1vDKhOsyitxfudrT9WDAP3ktgTlP3", ... [Read more]

similicious 11 Apr 2024 20:49

Cool! How have you read this data? [Read more]

helge1 15 Apr 2024 01:24

Hi, thank you for this great work! I received my sk26 today which I ordered after I had discovered this thread. I already use two sk20 star projectors with ESPHome (there's a software jailbreak available... [Read more]

helge1 27 Apr 2024 01:14

Quick update for everyone who is maybe also interested in using ESPHome for this Tuya MCU: I flashed the configuration from https://github.com/M4GNV5/esphome-SK20-Nebula-Light which was developed for the... [Read more]

FAQ LABEL_AI_GENERATED

TL;DR: With 4 bottom screws and “the hard part” being the flash step, this FAQ shows SK26 owners how to open, wire, flash, script, and integrate the BK7231N/CBU galaxy projector with OpenBeken or ESPHome, while avoiding damaged button cables, glued plugs, and failed serial connections. [#20863828]

Why it matters: The thread turns a partly undocumented Tuya star projector into a repeatable mod with working RGB, laser, motor, button remapping, MQTT, and partial ESPHome support.

Approach Setup effort Confirmed working functions Best use case
OpenBeken Medium RGB, laser, motor, color cycle, MQTT, button scripting Fastest full control on SK26
ESPHome SK20 config adapted to SK26 Higher Partial first, then improved YAML with RGB, laser, motor, scenes Native Home Assistant workflows
Stock Tuya firmware Low Basic app control, music mode present but unreliable No hardware changes

Key insight: The SK26 is fully usable after flashing because the critical functions are simple PWM outputs: RGB LED, laser, and motor. The only major unresolved feature in the thread is the microphone-based music sync.

Quick Facts

  • The SK26 projector has 5 main functional parts: RGB LED, laser, motor, microphone, and 3 front buttons. That matters because each one maps cleanly to OpenBeken roles or scripts except the microphone path. [#20863828]
  • Teardown needs 4 screws on the bottom and then 6 more screws in the black middle frame. Several connectors and the main board are glued, so pulling on wires instead of plugs is the main damage risk. [#20863828]
  • Flashing uses a 3.3 V serial setup. The author wired VCC/GND to labelled pads under the module and used TX on pin 15 and RX on pin 16 on the right side of the chip. [#20863828]
  • The published OpenBeken template maps PWM to pins 6, 7, 8, 24, and 26, with buttons on 14, 20, and 22. In practice, that gives separate control of RGB light, laser, motor, and script-only button actions. [#20863828]
  • The recovered Tuya schema exposes key datapoints for the original firmware, including manual/scene/music mode, laser brightness 10–1000, and motor speed 1–100%. That confirms the hardware supports more than simple on/off control. [#21041909]

How do I tear down and open the SK26 Galaxy Star Projector without damaging the button board, glued connectors, or motor cables?

Open it in three careful steps. 1. Remove the 4 bottom screws with a very short Phillips screwdriver. 2. Lift the top cover to the right and unplug the red button-board cable before fully removing it. 3. Remove 6 more screws from the black middle frame, then move the motor frame gently so its cables are not stretched. The main board and several plugs are glued, so pull on connectors with pliers, not on the wires. [#20863828]

What is the BK7231N chip, and why does it matter when flashing or customizing the SK26 star projector?

The BK7231N is the main Wi-Fi microcontroller in the SK26, and it determines the flashing method, pin map, and firmware choice. "BK7231N is a Wi‑Fi microcontroller that runs the device logic and exposes GPIO, PWM, ADC, and serial flashing interfaces." In this thread, selecting BK7231N in the BK7231 GUI Flash Tool is mandatory, and the OpenBeken template is built specifically for that chip and its mapped pins. [#20863828]

What is the Tuya CBU module in the SK26 projector, and how is it different from other Tuya Wi-Fi modules?

The SK26 uses a Tuya CBU module built around the BK7231N, so the module choice matters for board layout and flashing access. "CBU is a Tuya Wi‑Fi module that carries the BK7231N chip, exposes labelled pads and edge pins, and serves as the projector’s removable radio-control board." The author noted this SK26 is close to another projector, but it has a different chip, Tuya module, and construction, so pinouts and teardown details are not interchangeable. [#20863828]

Which pins and pads should I use to flash the BK7231N/CBU board in the SK26, and how do I wire TX, RX, VCC, and GND correctly?

Use the labelled power pads under the module for VCC and GND, then solder to TX pin 15 and RX pin 16 on the chip side. The author chose the lower pads because they are easier to solder than the fine-pitch module edge. Keep the programmer at 3.3 V; a NodeMCU used as an FTDI bridge worked without level shifting. Tin both wire and pad first, add flux, and touch briefly with the iron. [#20863828]

Why does the BK7231 GUI Flash Tool fail to connect to a BK7231N projector, and how can I troubleshoot bad solder joints or a TX/RX short?

It usually fails because the serial wiring or soldering is bad, not because the SK26 is unsupported. The author reports a real failure case: the joints in the photo actually shorted TX and RX, and the flash tool would not connect until those joints were redone. Check four things: correct COM port, BK7231N selected, solid 3.3 V power, and clean isolated TX/RX joints. When prompted, reset only the projector, not the programmer. [#20863828]

What steps are needed to import the OpenBeken template and create the autoexec.bat script so the SK26 motor, laser, and RGB LED all work together?

Do it in three steps. 1. In the OpenBeken web app, open Import, paste the SK26 JSON template, and apply it. 2. Reboot and verify RGB control appears on the main page. 3. In Filesystem, create autoexec.bat, paste the PWMToggler script, and save using “Save, Reset SVM and run file as script thread.” That script links LED state to laser and motor, creates a color-cycle channel, and sets startup values so all three functions work together after reboot. [#20863828]

How can I remap the SK26 front buttons in OpenBeken so single-click, double-click, and hold actions control the LED, laser, motor, and color cycle?

Use Btn_ScriptOnly for scripted buttons and bind actions with addEventHandler. The final SK26 mapping is specific: Music button single-click toggles laser and double-click toggles motor; Switch single-click toggles LED, laser, and motor, double-click goes to next color, and hold changes brightness; Scene toggles automatic color cycling. The maintainer also explained that OpenBeken supports events like OnClick, OnDblClick, and OnHold for custom commands. [#20863828]

What does the SPC command do in OpenBeken, and how can I use it to customize the SK26 color palette instead of the default Tasmota-style colors?

SPC sets a palette entry to a specific RGB value, so you can replace the default color sequence with your own. The maintainer added this feature during the thread and gave the syntax SPC 0 FF0000, which sets palette slot 0 to red. The published SK26 script uses 13 palette lines, from SPC 0 FF00AE through SPC 12 FF00DD, so the Scene button can cycle through custom nebula colors instead of the default Tasmota-style palette. [#20864016]

Why are laser and motor speed changes in the 0 to 100 toggler range barely noticeable on the SK26 projector?

Because the usable visual range is compressed, small changes inside 0–100 do not create a strong visible difference on this hardware. The author tested the new relative toggler_set feature and then chose not to use it, stating that changes within the 0–100 range were barely noticeable anyway. As a result, the final button logic only toggles laser and motor on or off instead of stepping them in small increments. [#20864426]

How do I add the SK26 Galaxy Star Projector to Home Assistant over MQTT with separate controls for RGB light, laser, motor, and color cycle mode?

Publish four entities over MQTT: one RGB light, one laser light, one motor light or fan-style control, and one switch for color cycle. The shared example defines separate topics for led_enableAll, led_basecolor_rgb, toggler_enable0, toggler_set0, toggler_enable1, toggler_set1, and channel 10 for the color-cycle switch. You must edit the topic prefix, such as home/living-room/star-projector, to match your own MQTT structure before Home Assistant discovery or manual YAML will work correctly. [#20863828]

What is the PWMToggler driver in OpenBeken, and how is it used for controlling the SK26 laser and motor channels?

PWMToggler is the OpenBeken driver that turns PWM outputs into named, adjustable toggle channels for non-RGB loads. In the SK26 script, startDriver PWMToggler creates two slots: channel 4 is named Laser and channel 5 is named Motor. Startup values are set to 100, both channels are enabled, and LED on/off events are linked so disabling the main LED also disables laser and motor. That makes the projector behave like one coherent device. [#20863828]

OpenBeken vs ESPHome for the SK26 star projector — which approach gives better control, easier setup, and better Home Assistant integration?

OpenBeken gives the quickest full SK26 control, while ESPHome gives stronger native Home Assistant workflows after more setup. OpenBeken already has a complete thread-tested path for flashing, button remapping, MQTT, PWMToggler, and custom palette control. ESPHome first worked only partially when an SK20 YAML was flashed unchanged, but a later adapted YAML added RGB, laser, motor, scenes, OTA, API, and web server support. Choose OpenBeken for fastest results and ESPHome for deeper Home Assistant-centric configuration. [#21061833]

How can I adapt an ESPHome configuration made for the SK20 nebula light to work on the SK26 with its different pin mapping and blue laser hardware?

Start with the SK20 YAML, then change the SK26 pin map and test each output one by one. A later working example remaps red to P26, green to P24, blue to P6, laser to P8, motor to P7, button LED GPIO to P22, and the main button to P14. The user first flashed the SK20 config with no edits; it did not damage the projector, but only part of the functionality matched. That confirmed the SK26 is close enough to reuse the design, but not the original pin assignment. [#21061833]

Why does the SK26 microphone or music-sync mode not work reliably, and how might the LM358 amplifier and ADC pin be involved?

The thread could not make music sync reliable because the analog path was identified only partially and the original firmware already behaved poorly. The author traced the two-wire microphone to an LM358 amplifier, then assumed the conditioned signal reached pin 5 as an ADC input. MQTT plots showed changing readings, but no confirmed correlation strong enough for a stable trigger algorithm. The author also noted the music feature did not work properly even under stock firmware. [#20864806]

How was the Tuya schema, device metadata, and local key for the SK26 extracted from the ROM backup and cloud data?

It was extracted by reading the ROM backup and decoding the Tuya data structures stored inside it, then pairing that with cloud responses. The follow-up post shows recovered fields such as product ID, schema, local key, region, firmware 9.9.4, and datapoints like switch_led, laser_switch, fan_switch, and fan_speed. It also exposes cloud-side metadata such as category “Star projector”, model SK26, and detailed schema descriptions, proving the backup contained enough material to reconstruct the device profile. [#21041909]
AI summary based on the discussion. May contain errors.
%}