2015-04-30

3D 8x8x8 LED kubas

Atpigus puslaidininkiams gaminiams LED apšvietimas vis labiau užkariauja įvairias sritis. Kalbant apie jas siūlau pasižvalgyti po šviesų arba LED kubų pasaulį. Elektronikos entuziastų gaminami LED kubai - ne tik gražus vaizdas ir šviesų šou, bet ir sumanus technologinis iššūkis-projektas. Tiesa, dabar sukonstruoti savo kubą ypač paprasta kaip niekad - parduodami jų pusfabrikačiai. Kaip tik vienas toks ir man pakliuvo į rankas. Ką iš jo pagaminau ir kaip man sekėsi jį modifikuoti - skaitykite toliau šiame straipsnyje.





I. Intro

Pradžiai priminsiu, kad LED kubas - tai daug LED diodų turinti elektrinė schema, kur diodai vienas su kitu išdėlioti/sujungti į kubo formos gardelę. Toks kubas akivaizdžiai naudojamas įvairiems šviesos efektams generuoti bei yra daugiau šou priemonė nei realus praktinis daiktas.  Tokią schemą, žinoma, nėra labai sudėtinga pagaminti, tačiau sugalvojus tai padaryti pats projektas iškelia gan įdomių techninių reikalavimų ir problemų. Apie jas manau verta šiek tiek pakalbėti - bet vėliau. Kitas dalykas - kaip ir minėjau įžangoje, jeigu kubo projektavimo procesas netraukia, tai galima nusipirkti jau paruoštų LED kubo rinkinių (pvz. iš ebay). Tokį vieną gavau ir aš - LightSquared 8x8x8 LED cube DIY kit (aka. 3d8s ideasoft). Rinkinys skirtas paprastam 512 LED lempučių kubui pasigaminti, visos detalės jau pateiktos (žr. foto žemiau) - telieka tik teisingai sulituoti. Pradedančiajam elektronikoje ar siekiančiam pagerinti litavimo (kantrybės, kruopštumo irgi!) įgūdžius tai - puikus rinkinys. Mane labiausiai sudomino programavimo/valdymo galimybės ir kubo veikimo principai. Apie juos, surinkimą ir valdymą būtent ir pakalbėsime toliau.


II. Surinkimas

Iš pirmo žvilgsnio surinkti LED kubą atrodo niekai, bet net ir tokį paruoštą rinkinį užtruksime - visą dieną. Pirmiausia, kaip ir visi kinų gaminiai - jis neturi normalios dokumentacijos, anglų kalba labai laužyta/nerišli. Jeigu prie rinkinio negaunate parsisiųsti vartotojo vadovo, valdymo kodo - tai jo tenka ieškoti per visą internetą. Ne visi pardavėjai jį pateikia. Kaip ten bebūtų, susiradus vartotojo vadovą (su nuotraukomis!) ir pažingsniui atliekant nurodymus galima teisingai sulituoti kubą iš pirmo karto. Jeigu schemą sulituoti užtrunka porą valandų, tai likusi diena - bus paaukota 512 LED lempučių kojelių lankstymui ir litavimui. Gan nuobodus ir monotoniškas darbas - tačiau pabaigoje atperkantis kančias. Taigi schemą sulitavau gan greitai, o su lemputėmis teko ilgiau pasiterlioti.

Rinkinyje LED diodų duodama daugiau - mano atveju buvo 559 vienetai. Renkant ar prieš surinkimą būtina patikrinti, ar visi šviečia-veikia. Taip pat duodamas ir vienas papildomas poslinkio registras (shift register), jeigu netyčia būtų sugadintas. Iš visos didelės LED krūvos švietė visi, tačiau vienas turėjo sukeistas kojeles (anodą ir katodą), registrai veikė be problemų.

LED kubas sudarytas iš 8 x 64 lempučių sluoksnių, kuriuos reikia lituoti vieną po kito bei sujungti tarpusavyje. Iš papildomų lempučių kojelių sulitavau ilgas vielutes ir prijungiau kiekvienam sluoksniui atitinkamą neigiamą kontaktą. 8 lempučių sienos ilgis pasirinktas neatsitiktinai - tai puikiai atitinka vieną baitą mikrovaldiklio atmintyje arba vieną LED eilutę (būsenų on/off masyvą). Prisiuosčius kanifolijos ir lydmetalio kvapo bei viską sujungus gauname galutinį rezultatą, kurio kreivumas atvirkščiai proporcingas įdėtai kantrybei darbo metu. Mano galutinis rezultatas žemiau.


III. Efektai

Atėjus lemiamam momentui, paduodame maitinimą ir paspaudžiame įjungimo mygtuką - kubas sužimba visu gražumu. Maitinamas jis per USB jungtį - tam rinkinyje įdėtas USB laidas, kurio daugiau nei energijos tiekimui neina panaudoti. Duotame mikrovaldiklyje jau įrašytas kodas su nemažu kiekiu animacijų/efektų. Kol visi efektai pradeda kartotis turi praeiti apie 5 minutės. Tamsoje vaizdas žymiai įspūdingesnis. Kaip viskas atrodo - žiūrėkite žemiau esantį video.





IV. Dar galima?

Pasidžiaugus pagamintu daiktu ir beveik išmokus animacijas atmintinai - pradedama galvoti, kur dėtį kubą, nes pats įdomumas ir buvo - surinkimas ir gal pora valandų besidžiaugiant reginiu. Toliau, aišku,  atsibosta - galima drėbti į kampą, išlituoti arba bandyti įdėti dar animacijų/patiems suprogramuoti animacijas. Pasirinkus paskutinįjį variantą (sunkiausią), tenka informacijos ieškoti apie kubą internete. Tačiau prisiminus kinų gaminius, iškart vėl susiduriame su informacijos stygiumi. Net jeigu ir randame kažkokių užuominų apie kubą, tai - arba pagalbos prašymai padėti programuoti kubą, arba įvairūs aprašymai kinų hieroglifais, kuriuos tenka versti į anglų kalbą. Nors kubas parduodamas masinei rinkai, bet informacijos kaip programuoti jį ar valdyti - labai mažai. Kitas keblus dalykas - kinų panaudotas mikrovaldiklis STC12C5A60S2, kurį irgi pradžioje neaišku, kaip programuoti. Jis pasirinktas greičiausiai dėl to, kad yra pigus ir populiarus Kinijoje. Pakeisti jį kokiu kitu (pvz. Atmega16/32) sudėtinga, nes neatitinka išvadų reikšmės. Tad belieka aiškintis apie jį daugiau.

 

Žinoma, kas ieško - tas randa. Pasirodo, šis mikrovaldiklis yra senos ir labiai populiarios 8051 mikrovaldiklių šeimos palikuonis. Jaučiantiems nostalgiją ar dirbusiems su ja - viskas galbūt aiškiau. Programuojamas jis dažniausiai su Keil uVision programiniu paketu/įrankiais (naudojamas C51 kompiliatorius), o mašininis kodas (hex) įrašomas į STC mikrovaldiklį naudojant STC-ISP programinę įrangą per nuosekliąją (serial/uart) jungtį. Taip, šis STC mikrovaldiklis turi savyje iš gamyklos įrašytą startavimo programą (bootloader'į) per kurį jis yra perprogramuojamas (flash'inamas). Kadangi perprogramavimas vyksta per UART/serial jungtį, tai nereikia kažkokių ypatingų programatorių, kaip pavyzdžiui Atmega serijos valdikliams, užtenka ir įprasto USB-2-TTL moduliuko. STC12C5A60S2 galėtume pavadinti savotišku kinų Arduino. Standartinį kodą, kuris būna įrašytas į jį galima rasti pas pardavėjus ar klaidžiojant internete. Tad belieka užkurti paminėtus įrankius ir pasižiūrėti, ką galima padaryti su šiuo kubu.

V. Programavimas

Norint programuoti STC12C5A60S2 pirmiausia reikia pasimodifikuoti plokštę - prisilituoti jungtis prie neužimtų VCC, GND, P30, P31 išvadų (žr. foto žemiau). Tai standartinės nuoseklios (serial/UART) sąsajos išvadai. Čia P30 atitinka RXD, o P31 atitinka TXD. Po to galime jungtį prie kokio nors kompiuterinio USB-2-TTL konverterio/modulo (rasti galima ebay ir pan.). Primenu, kad laidus reikia jungti sukryžiuotai: PC RXD < > STC TXD bei PC TXD < > STC RXD.

Esant sėkmingam ryšiui su mikrovaldikliu galima pabandyti perprogramuoti jį. Patikrinimui ir perprogramavimui naudojame STC-ISP programą. Ją atsidarius turime pasirinkti mikrovaldiklio tipą, teisingą COM jungtį, paspausti mygtuką "Check MCU" bei išjungti ir vėl įjungti LED kubo maitinimą. Tuomet įjungimo metu nuskaitoma informaciją iš valdiklio. Tai atlikus ekrane matysime pavaizduotus užrašus - versiją, valdiklio veikimo dažnį ir t.t.


Praėjus ankstesnį etapą, galima bandyti ir perprogramuoti. Pradžiai siūlau pasirinkti originalaus sukompiliuoto mašininio kodo failą (hex) su mygtuku "Open Code File" ir po to spaudžiant "Download/Program" pradėti operaciją. STC-ISP programai pasirengus išjungiame ir vėl įjungiame kubo maitinimą. Po įjungimo prasidės perprogramavimas. Jeigu viskas sėkmingai įvyks - tai kubo veikime jokių pokyčių nepastebėsime, tiesiog programa bus perrašyta naujai.


Keilu uVision nemokama versija turi savo trūkumų - negalima sukompiliuoti programos, kuri užima daugiau nei 2KB flash atminties ir t.t. Taigi originalaus LED kubo kodo sukompiliuoti bus neįmanoma, nes jis per daug užima. Žinoma, galima susirasti interneto platybėse ir pilną Keil versiją, tačiau yra kita galimybė - valdyti kubą per nuosekliąją jungtį tiesiai iš kompiuterio ar su kitu mikrovaldikliu (pvz. atmega). Aišku, kad taip būtų galima daryti, reikia pirmiausia suprogramuoti tai leidžiančią STC programą. Per daug nesivarginus, tokį kodą (firmware v2), kuris lengvai kompiliuojasi su Keil uVision, jau parašiau ir jį rasite [čia], kartu su kitais prie kubo gamintojo pateiktais failais. Įdėjau ir mašininio kodo .hex failą, tad net kompiliuoti nereiks. Tereikia įrašyti į mikrovaldiklį anksčiau nagrinėtu būdu. Norintiems savarankiškai paprogramuoti su Keil - visada prašom, tam pateiktas Keil projekto failas.

VI. Valdymas iš PC


Naujoji STC mikrovaldiklio programa (firmware v2) leidžia kubo LED lemputes valdyti per serial/UART jungtį, t.y. animuoti. Animacijų generavimo palengvinimui pasaulyje jau prikurta daugybė programų, kurias galime rasti internete. Kinas aGuegu sukūrė paprastą valdymo protokolą ir programą 8x8x8 kubo valdymui. Šiek tiek ją modifikavau ir patobulintą variantą rasite [čia], t.y. tinkantį mūsų atvejui (kubo valdymui per UART). Programa palaiko animacijų redagavimą, grojimą ir t.t. Be abejo, išsaugojus animaciją .dat formatu į uSD kortelę bei iš jos skaitant, galima valdyti kubą kitu mikrovaldikliu (pvz. atmega/arduino [kodas] ar pan.), kuris prijungtas prie UART jungties. Kaip veikia programa ir kaip sukurti animacijas žiūrėkite žemiau esančiame video.



VII. Techniniai dalykai

Dar šiek tiek informacijos apie patį kubą, jo valdymą - technines detales. Ankstesniame skyriuje minėjau, jog verta pakalbėti apie kubo projekto ypatybes, reikalavimus ir problemas. Taigi, pradėkime nuo paprastesnių dalykų. Vienas iš jų - energijos tiekimo užtikrinimas. Kubui įtampa tiekiama iš USB lizdo, tad maksimali galia, kurią galime paimti yra apie 5V * 500mA = 2.5W. Jeigu vieno LED naudojama srovė ~5mA, tai geriausiu atveju galime vienu metu maksimaliu ryškumu įžiebti 500mA/5mA = 100 LED lempučių. Kube turime 5x daugiau - taigi, kaip gi įmanoma įžiebti visą kubą su 2.5W? Atsakymas slypi kubo sudalinime į sluoksnius. Užtikrinama sąlyga - vienu metu dega tik vieno sluoksnio lemputės. Atsiminkime, sluoksnis sudarytas iš 8x8=64 lempučių, taigi čia jau arčiau tos ribos, kurias galime įžiebti. Dabar jeigu sluoksnius įjungiame vieną po kito ir darome tai taip greitai (perjunginėjame), jog žmogaus akis nepastebi - turime įspūdį, jog dega viso kubo visos lemputės vienu metu. Super triukas! 

Kitas, ne ką mažiau įdomus dalykas kubo projektavime - išvadų skaičius. Kaip valdyti 512 lempučių su ribotu skaičiumi (t.y. < 44) mikrovaldiklio išvadų? Atsakymas - pasitelkti poslinkio registrus (pvz. 74HC573). Toks registras valdomas 2 išvadais, o išėjimų skaičius - 16. Išėjimų skaičius gerokai padaugėja. Registrus galima jungti į kaskadas. Tačiau to vis tiek nepakanka net gi su 8 registrais (nes 8x16=128). Todėl dar naudojamas specialus sujungimo metodas vadinamas Charlieplexing, kuris leidžia valdyti maksimalų objektų(lempučių) skaičių su turimais išvadais.

Viso kubo lempučių būsenų (on/off) informaciją galime sutalpinti į 64 baitus, t.y. 8x8x8 bitus, iš čia ir kubo pavadinimas. Kubui valdyti pakanka paduoti šią informaciją. Per serial/uart jungtį reikia siųsti gana paprasto formato duomenų paketą (kaip pateikta žemiau). Siuntimo UART parametrai: baud - 9600 bps, 1 stop bitas, be lygiškumo (no parity) bito.


unsigned char frame[65] = {
    0xF2,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF
};

Pakete 0xF2 baitas nusako, kad toliau prasideda pilna kubo informacija (animacijos kadras). Likę 64 baitai apibrėžia visų kubo lempučių būseną. Kiekviena paketo eilutė nusako vieno sluoksnio būseną, o eilutėje esantys baitai - sluoksnio eilučių būseną. Galimos baitų reikšmės 0x00 - 0xFF diapazone, kur 0x00 - sluoksnio vienos eilutės visos 8 lemputės išjungtos, o 0xFF - sluoksnio vienos eilutės visos 8 lemputės įjungtos. Pavyzdiniame pakete kiekvieno sluoksnio pirmųjų eilučių lemputės įjungtos (0xFF reikšmė). Siunčiant tokius paketus bent  ~30 kadrų/s (t.y. kas ~33ms) užtikrinsime sklandžią animaciją.

VIII. Reziumė

Taigi išnarplioti šį kinų gamybos LED kubą nebuvo lengva, o ypač suprogramuoti STC mikrovaldikliui efektyvią programą darbui su UART. Jeigu to nesiimame, tai tik sulituoti kubą nėra labai sudėtinga. Visa informacija apie kubą, programą galite rasti Github'e. Tikiuosi, kad pritaikysite pateiktas žinias ir savo darbams. Sėkmės ir iki kito karto!

LED Cube source - Github
Cube control program source - Github

26 komentarai:

  1. isigijau ir surinkau ir as toki kuba. tik deja normaliai neveikia. isemus sluoskniu valdymo mikroschema uln2803 nera skirtumo ar ji yra ar ne. pakeiciau kita, rezultatas nepasikeite. kame gali but problema?

    AtsakytiPanaikinti
    Atsakymai
    1. Reiškia ULN2803 niekuo dėtas, problema - kitur.
      Pirmiausia reikia pasitikrinti, ar tikrai viskas sulituota teisingai, ar mikroschemos neįdėtos apsuktos, ar teisingai prilituotas A09-103 rezistorius, ar neužtrumpinti kontaktai, gal koks reikalingas liko neprilituotas? Taip pat pasitikrinti, ar sluoksniai teisingai sujungti (žr.foto), ar gerai paduodamas GND'as sluoksniams.

      Galiausiai nieko neradus - teiktų pradėt žiūrėt sujungimo schemą.

      Panaikinti
  2. Surinkau RGB led kuba pagal sias instrukcijas http://www.kevindarrah.com/?cat=99. Programavime esu zalias. Noriu padaryti kad kubas veikt usu atmega32 valdikliu, ir pajungus prie PC butu galima su kokia programa generuoti animacijas.
    Kal turi minciu ar gali pagelbet ? :)
    Dekui

    AtsakytiPanaikinti
    Atsakymai
    1. Tada vertėtų nuo paprastesnių dalykų pradėti - suprogramuot mirksiuką (LED degiojimą), išmokti, kaip dirbti su UART ir pan.
      Viską įmanoma padaryti, tačiau praverstų daugiau patirties. Valdymo kodo nedaug, išskyrus darbą su pačiu UART'u.

      Panaikinti
  3. Sveikas
    Rasai: "Be abejo, išsaugojus animaciją .dat formatu į uSD kortelę bei iš jos skaitant, galima valdyti kubą kitu mikrovaldikliu (pvz. atmega/arduino [kodas] ar pan.), kuris prijungtas prie UART jungties". Kaip suprantu arduino su kodu ir sd korteliu skaitytuvu jungiu prie atmega32 Tx Rx pinu? Ar klystu?
    Ar gali nukreipt kur apie tai daugiau pasiskaityt.
    Padariau led kuba vadovaudamasis siomis instrukcijomis http://www.instructables.com/id/Led-Cube-8x8x8/#step1.
    Per UART jungti su tavo pasiulyta programa animacijas atkuria netiksliai, ar gali buti kad si programa netinkama Atmega32 kontroleriui.
    Is karto dekoju uz pagalba :)

    AtsakytiPanaikinti
    Atsakymai
    1. Ne, Arduino/Atmega su uSD kortele jungi prie STC mikrovaldiklio (koks yra originaliame LED kube).
      Jeigu nori kubą valdyti su Atmega32, tai reikia perrašyt UART komunikavimo dalį. Firmware v2 skirtas tik STC mikrovaldikliui. Animacijos grojimo iš uSD kortelės kodas galbūt ir tinka Atmega32, nebandžiau.

      Panaikinti
  4. Tai as tai ir turejau omenyje. Tik man neaisku kaip pajunti arduino prie STC mikrovaldiklio (kurie pinai ir pan). Gal kokia schemute turit?

    AtsakytiPanaikinti
    Atsakymai
    1. Viskas parodyta "V. Programavimas" skyriuje, yra netgi foto. Arduino turi UART išvadus, tad siūlau pasidomėti jų paskirtim ir kaip juos sujungti.

      Panaikinti
  5. Atmega328 2pin(RXD) --> STC (TXD), Atmega328 3pin(TXD) --> STC (RXD), tas pats kas jungti prie PC, tik cia kompo vaidmeni atliks ir animacijas leis Arduino? SD readeris prie Arduino VCC, GND ir CS.
    Tikiuosi gerai viska supratau :)
    Dekui uz pagalba

    AtsakytiPanaikinti
  6. Sveikas, norėčiau su tavim susisiekti asmeniškai, kaip tai galėčiau padaryt ? :)

    AtsakytiPanaikinti
    Atsakymai
    1. Gali rašyti per Google+ arba į el. paštą: tomas.uktveris [slyva] gmail.com

      Panaikinti
  7. does not detect the STC....
    you know how to help me ?
    thanks

    AtsakytiPanaikinti
    Atsakymai
    1. Nope, have no clue. There's a mistake somewhere (as always), so doublecheck.

      Panaikinti
  8. Thanks for Your work on this :)
    Do you know any way to convert the 3D8 .dat files to hex files in any way?
    Would be nice to not have to be connected to PC and arduino all the time :)
    Thanks again

    AtsakytiPanaikinti
    Atsakymai
    1. Hi, no there's no way from hex to c code. You can always connect to arduino that's reading the animations from microSD card and sending them via serial.

      Panaikinti
  9. Hey, i’m a newbie in electronics and i just built this led cube
    Now i’d like to add more animations but your tutorial is a bit high level for me :)
    Is it possible to make a simple summary of what to use/buy (usb2ttl i guess), how to connect the cube to the pc and what to do on the pc (what to download, where to press and that’s it :p).
    I just wanna know what to do, not how it works :)
    Thank you, you did a really great job with that cube ;)

    AtsakytiPanaikinti
    Atsakymai
    1. Hi, you already found out what you need. Buy the usb 2 ttl tool from ebay or some electronics shop ahd your'e good to go. Everything's already covered with screenshots.

      Panaikinti
  10. Hey,
    I have one Question to you. maybe you can help.
    I allready flashed my STC_Controller sucessfully,
    and the cube shows me the (sand clock) like in the video!
    But now I want to Start the software:
    When I klick on connect to COM_Port they connect.
    When I Klick to one LED the Animation (moving LEDs) stops.
    Now the cube is hanging in this possitions,
    but when I change a lot of LEDs in the software they change...
    But there are not the same LEDs like in the Programm.

    How can I get the live Update of the LEDs?

    Please help me.
    Thanks for the answer

    AtsakytiPanaikinti
    Atsakymai
    1. Hi, ensure "Loop animation" is checked before pressing start. Also, add more than one animation frame. That's it.

      Panaikinti
    2. Looks to me the PC side and TTL converter is working great. The problem mostly is with the cube. Check if your RXD/TXD wires are connected correctly & not exchanged - and also, there could be some hardware difference, also it could be a bug in the firmware v2 or some mistake in the cube itself (hardware). It's up to you to find out.

      Answer to:
      Thanks for your Answer,
      but I have Loop Animation checked!
      I used the 3D8S.exe Alpha or dontmatrixjava.jar.
      But when I connect COM my Cube do nothing,
      when I load an example the Cube is freezing.
      My TTL Converter is blinking very fast,
      but the Cube do nothing...
      Where could be my Problem ?!
      I flashed the STC with the v2 8x8x8.hex!
      Thanks again for answering ;)

      Panaikinti
    3. Also check your TTL parameters: baud, parity & stop bits, should be 9600,none,1 respectively.

      Panaikinti
  11. STS-ISP programa ismeta klaida nors softas naujausias. Ju puslapyje naujausia versija 6.85. Kame gali buti reikalas?

    Re-handshaking ... Successful [0.579"]
    Current Baudrate: 57600
    Erasing MCU flash ...
    Download failed ! (6.85Q)(2017-02-07 00:22:26)
    Please using the newest software !

    AtsakytiPanaikinti
  12. gal yra kokia kiotkia programa siu valdikliu programavimui?
    Dekui

    AtsakytiPanaikinti
    Atsakymai
    1. Kiek žinau nėra, čia oficialus gamintojo įrankis, tad tikresnio nebus. Galima ieškoti 8051 įrankių internete, bet vargu ar jie veiks su kinų valdikliais.

      Tikrinčiau pirmiausia ar viskas su geležim teisingai prieš kaltinant STC-ISP programą. Blogas gali būti netgi UART modulis nesugebantis patikimai dirbti didesniais greičiais arba ilgi laidai, etc.

      Panaikinti