Šiame įraše papasakosiu, kaip BTF-LIGHTING LED juostų valdiklius perrašyti iš gamyklinės programos į labai populiarią atvirojo kodo WLED programą.

Pradžia
Pastaruoju metu, kai diegiu LED juostas naudoju BTF-LIGHTING gamintojo produktus. Neturėjau su jais problemų, o kokybė visiškai atitinka mano lūkesčius.
Turint LED juostą, reikia ją kažkaip valdyti. Paprasti vartotojai dažniausiai nusiperka paprasčiausią valdiklį, dažnai su pulteliu ir taip valdo savo LED juostas. Šiek tiek labiau susidomėję naudotojai arba projektų kūrėjai dažnai renkasi WLED atvirojo kodo programą ir ją adaptuojant įgyvendina savo idėjas. WLED dažniausiai diegiama į labai populiarų mikrovaldiklį ESP32, bet toks valdiklis neturi korpuso, o jo veikimui reikalinga 5v įtampa, kas reiškia, kad jeigu LED juostai reikalinga 12v ar 24V įtampa, reikės papildomos 5v įtampos ESP32 valdikliui arba įtampos žeminimo keitiklio, kad gauti 5v iš 12v arba 24v.

Tuo pačiu užmačiau, kad BTF-LIGHTING turi savo valdiklių seriją SP5XX, šios serijos turi WIFI+BT funkcionalumą, o SP6XX serija naudoja BT+RF valdymą pulteliu. SP530E yra universalus valdiklis su daug išėjimų kuriais galima valdyti įvairias LED juostas. Mano poreikis buvo valdyti RGBW SPI juostas kurioms reikalingi tik trys laidai: 12v, GND ir Signal. Pasirinkau SP539E valdiklį kuris viduje turi ESP32C3 mikrovaldiklį, bet ar jį galėsiu perprogramuoti buvo klausimas į kurį reikėjo atsakymo.


Gamykliškai BTF-LIGHTING valdikliai turi įrašytą savo programą ir yra valdomi aplikacija BanlanX kuri man nelabai patiko. Tokie nustatymai kaip laikmačiai, išsitrina po maitinimo atjungimo, taip pat valdiklį būtų patogu prijungti prie WIFI ir valdyti per http protokolą. Nepaisant viso to valdiklis turi savo korpusą kurį iš karto galima patogiai sumontuoti, taip pat įėjimo įtampa tokia pati kokia reikalinga LED juostai išėjime, todėl viduje automatiškai užmaitinamas ESP32C3 mikrokontroleris todėl tuo rūpintis atskirai nereikia. Maitinimo prijungimui galima naudoti laidus arba DC kištuko lizdą.
Tai gi, kokia situacija su SP539E ir kitais BTF-LIGHTING valdikliais? Visi jie savyje turi įdiegtą gamyklinę programą, bet ji yra užšifruota, nes ESP32C3 mikrokontrolris turi įjungtą šifravimą ir programos įrašymo metu ją užšifruoja pagal savyje turimus raktus. Ją galima nuskaityti, įrašyti atgal ir ji veiks, bet jos modifikuoti neišeis. Nepaisant viso to, ESP32C3 nėra gamykliškai užrakintas, todėl programą galima pakeisti į savo norimą, pvz. WLED. Kaip tai vyksta?
Programavimas
Pirmiausiai prisilituoju programatorių prie SP539E valdiklio. Naudoju CH341A Pro kuris nėra labai stabilus ir gali tam tikrais atvejais sudeginti lustus su kuriais dirbama, bet šiuo atveju jis tiks ir atliks darbą. Naudoju UART komunikaciją, 4 laidai – 3.3v valdiklio įtampą, GND ir TX su RX. TX jungiasi su RX ir RX su TX.
Kad valdiklis pereitų į programavimo režimą ant plokštės esantis GND ir GPIO9 trumpinamas įjungimo metu ir atleidžiamas po kelių kelių sekundžių.
Patikriname su kokiu valdikliu turime reikalų:
esptool v5.1.0
Connected to ESP32-C3 on COM9:
Chip type: ESP32-C3 (QFN32) (revision v0.3)
Features: Wi-Fi, BT 5 (LE), Single Core, 160MHz, Embedded Flash 4MB (XMC)
Crystal frequency: 40MHz
MAC: a0:76:4e:xx:xx:xx
Stub flasher is already running. No upload is necessary.
Flash Memory Information:
=========================
Manufacturer: 20
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin…
Turime ESP32-C3 su 4MB atmintimi. Išsisaugome gamyklinę programą, kurį yra užšifruota:
esptool v5.1.0
Connected to ESP32-C3 on COM9:
Chip type: ESP32-C3 (QFN32) (revision v0.3)
Features: Wi-Fi, BT 5 (LE), Single Core, 160MHz, Embedded Flash 4MB (XMC)
Crystal frequency: 40MHz
MAC: a0:76:4e:xx:xx:xx
Stub flasher is already running. No upload is necessary.
Configuring flash size…
Read 4194304 bytes from 0x00000000 in 378.0 seconds (88.8 kbit/s) to ‘sp539e-sifruotas.bin’.
Hard resetting via RTS pin…
Iš karto pasakysiu, kad su įjungtu SP539E šifravimu, man paleisti WLED nepavyko, po įrašymo jis tiesiog nepasileisdavo. Padarysime viską paprasčiau – tiesiog išjungsime mikrokontrolerio šifravimą. Įspėsiu, kad šis žingsnis negrįžtamas. Patikriname kokia šiuo metu yra mikrokontrolerio apsaugos būsena:
esptool v5.1.0
Connected to ESP32-C3 on COM9:
Chip type: ESP32-C3 (QFN32) (revision v0.3)
Features: Wi-Fi, BT 5 (LE), Single Core, 160MHz, Embedded Flash 4MB (XMC)
Crystal frequency: 40MHz
MAC: a0:76:4e:xx:xx:xx
Stub flasher is already running. No upload is necessary.
Security Information:
=====================
Flags: 0x00000000 (0b0)
Key Purposes: (4, 0, 0, 0, 0, 0, 12)
BLOCK_KEY0 – XTS_AES_128_KEY
BLOCK_KEY1 – USER/EMPTY
BLOCK_KEY2 – USER/EMPTY
BLOCK_KEY3 – USER/EMPTY
BLOCK_KEY4 – USER/EMPTY
BLOCK_KEY5 – USER/EMPTY
Chip ID: 5
API Version: 3
Secure Boot: Disabled
Flash Encryption: Enabled
SPI Boot Crypt Count (SPI_BOOT_CRYPT_CNT): 0x1
Hard resetting via RTS pin…
Išjungiame valdiklio šifravimą visiems laikams:
espefuse v5.1.0
Connecting…
=== Run „burn-efuse“ command ===
The eFuses to burn:
from BLOCK0
– SPI_BOOT_CRYPT_CNT
Burning eFuses:
– ‘SPI_BOOT_CRYPT_CNT’ (Enables flash encryption when 1 or 3 bits are set and disables otherwise) 0b001 -> 0b011
Check all blocks for burn…
idx, BLOCK_NAME, Conclusion
[00] BLOCK0 is not empty
(written ): 0x000000000000000000000000040400000000000100800100
(to write): 0x000000000000000000000000000c00000000000000000000
(coding scheme = NONE)
.
This is an irreversible operation!
Type ‘BURN’ (all capitals) to continue.
>BURN
BURN BLOCK0 – OK (all write block bits are set)
Reading updated eFuses…
Checking eFuses…
Successful.
Šiuo metu galima diegti WLED, bet to per komandinę eilutę nedarysiu, o parodysiu paprastesnį būdą kaip susikurti savo WLED versiją kur galima atlikti reikalingas modifikacijas. Naudosiu programą Visual Studio Code su PlatformIO. Atsisiunčiame WLED source kodą, naudoju 0.15.1 versiją ir atsidarau per Visual Studio Code. Šiame etape reikia atlikti svarbų pakeitimą.
Visi BTF-LIGHTING valdikliai yra skirtingi ir pritaikyti skirtingoms LED juostoms valdyti. Mano SP539E turi tik tris išėjimus: Maitinimas, GND ir Signalas LED juostos valdymui. Kai gamintojas projektavo/programavo valdiklį pasirinko kažkurį GPIO išėjimą kurį naudos LED juostos signaliniam valdymui. Ant SP539E tai yra GPIO19, bet yra vienas kabliukas, GPIO19 pagal nutylėjimą yra naudojamas USB komunikacijai, o kadangi jos mes neturime ir mums reikalingas šis išėjimas jį reikia atlaisvinti nuo USB, kitaip mes jo negalėsime pasirinkti WLED nustatymuose.

Per Visual Studio Code koreguojame failą platformio.ini, jame susiradus turimą valdiklį [env:esp32c3dev] koreguojame eilute:
keičiame į
-DARDUINO_USB_CDC_ON_BOOT=0
Viskas, prijungiame programatorių prie kompiuterio, ant valdiklio trumpiname GND ir GPIO9 kontaktus programatoriaus įjungimo metu, tada atleidžiame. Visual Studio Code PlatformioIO lange pasirenkame esp32c3dev ir spaudžiame Build arba Upload. Paspaudus Build programa supakuojama ir išsaugoma į aplanką build_output > release. O Upload supakuoja ir įrašo į mikrovaldiklį.
Pasileidžiame WLED, prisijungiame prie jo WiFi pavadinimu WLED-AP. Nepamirštame pakeisti nustatymo, kad signalas į LED juostą išeina per GPIO19, o ant valdiklio esantis mygtukas yra GPIO8, per jį galima išjungti/įjungti LED juostą.

Nuo šio momento visus kitus nustatymus keičiame pagal savo norus ir prijungtą LED juostą. Aš naudoju WS2814 LED juostą (DC12V 5M 300LEDS, White PCB, RGB WW IP65).

Paliksiu čia apytikslį SP530e valdiklio išėjimų aprašymą, gal tai padės programuojant:
GPIO 0: Mėlynas LED indikatorius (Blue LED)
GPIO 1: Žalias LED indikatorius (Green LED)
GPIO 2: panašu, kad neprijungtas prie 74HC245D;
GPIO 3: 74HC245D → gate rezistorius → MOSFET gate (PWM);
GPIO 4: Šiltai balta (WW) PWM kanalas (74HC245D → gate rezistorius → MOSFET gate (PWM))
GPIO 5: Šaltai balta (CW) PWM kanalas (74HC245D → gate rezistorius → MOSFET gate (PWM))
GPIO 6: Žalia (G) PWM kanalas (74HC245D → gate rezistorius → MOSFET gate (PWM))
GPIO 7: Mėlyna (B) PWM kanalas (74HC245D → gate rezistorius → MOSFET gate (PWM))
GPIO 8: panašu, kad neprijungtas prie 74HC245D; gali būti mygtukas;
GPIO 9: naudojamas programavimo režimui įjungti, trumpinamas su GND;
GPIO 10: Raudona (R) PWM kanalas
GPIO 19: Adresuojamų LED duomenų linija (Data)
GPIO 20/21: UART RX/TX, neprijungtas prie 74HC245D.
Kol kas tiek.
– Jonas


