ARM38: HUB08 ir STM32F1 hardware

Šiais laikais dažnai galima rasti kiniškų LED matricų- ar tai išmestos, ar defektuotos arba nusipirkti pas pačius kinus. Tokias matricas valdo kiniški kontroleriai kurie viską ir atlieka, jei užtenka nervų suprasti kiniško softo kreivumą. Tačiau kartais atsiranda noras sukurti kažką savo ir paaiškėja, kad nelabai yra informacijos apie tas matricas- yra įvairios bibliotekos (gana kreivos) ar šiaip keisti sprendimai, bet pačio aprašymo nėra.
Šiame straipsnelyje pasinagrinėsim vienspalves (vieno ryškumo lygio) LED matricas su HUB08 jungtimi. Šios matricos maitinamos dažniausiai nuo 5V per atskirą jungtį, o informacija perduodama per 16 kontaktų jungtį su užrašu Hub08. Hub08 leidžia jungti matricas į grandinėles (daisy chain) ir kiniški moduliai ir jų softas automatiškai viską sutvarko. Mane domino kiek žemesnio lygio informacija.
hub08 protocol pinout
Kartais vietoje raudonų LED pajungiami ir mėlyni, taip gaunas RGB spalvos ar panašiai.

Hub08 leidžia perduoti vienu metu keturis duomenų kanalus su tuo pačiu clock (SPI). Dar yra ABCD kontaktai- tai 16 LED eilučių. Paprastai duomenų kanalai pavadinami R1,R2,G1,G2. T.y. dvi raudonos spalvos ir dvi žalios. Kodėl po dvi? Todėl, kad matrica dažniausiai buna 32 LEDų “aukščio” ir panašiai arba daugiau ilgio.

EN tai esamo buferio ir eilutės “rodymas” t.y. LED tuo metu šviečia. LAT (kartais STB) tai trumpas impulsas kuris perkelia duomenis iš SPI buferio į vidinį mikroschemos (74HC595) registrą. Teoriškai galima vienu metu rodyti vaizdą ir tuo pat metu krauti sekančios eilutės duomenis. Tačiau mano turimas kiniškas kontroleris to nedarė.
Matricų LEDai dirba impulsiniu režimu, todėl per juos teka didelė srovė, kuri statiniam režime tikriausiai sudegintu pačius LEDus. O ir nenorima rodyti visokias mirguliacijas jei pastringa kontroleris ar matrica, todėl LED matricoje yra hardwarinis kintamo signalo jutiklis- kol nėra impulsų, tol neveikia išėjimas. Matrica statiniam režime išsijungia.

Pažiūrim į kiniško kontrolerio signalą:
hub08 protocol line frame
(paveiksliukai dideli, naudokit zoom arba žiūrėkit kitame lange)
Beja, mano testuojama matrica uždega šviesos diodus kai duomenys lygus nuliui. Kai duomenys 1- LED nešviečia. Kiek stebina L (LAT, latch) signalo ir ABCD pokytis beveik vienu metu. Rekomenduočiau eilučių numerį keisti prieš ar po L signalo, o ne jo metu. Šis signalas yra “rising edge” tai kogero užtenka laiko duomenim pasikeisti. Kiniškos matricos CLK (paveikslėlyje S) buvo ~1.13MHz, eilučių dažnis apie 11kHz, bet tai priklauso nuo pačios matricos dydžio ir konfiguracijos. EN ilgumas duoda matricos šviesumą.

hub08 protocol data clock
Čia kiek geriau matosi SPI clock ir duomenų santykis. Ir kiek geriau matosi, kad ABCD ir L kinta ne vienu metu.

Eksperimentui paėmiau dvi matricas (32×64) ir susukau, kad gautusi kvadratas- 64×64. Viso 4096 šviesos diodai. (naudojau tik raudonus diodus, nes viena matrica buvo dvispalvė, kita vienspalvė). Kontroleris bus pats labiausiai prieinamas, STM32F103c8t6 (Bluepill) kiniškas padirbinys (gal dėlto man neveikia DMA). Deja, šis kontroleris turi paprastą SPI kuris turi tik vieną kanalą, todėl nutariau pagudrauti: duomenys ateina į pirmos matricos R2, pirmos matricos R2 išėjimas vel eina į tos pačios matrios R1 įėjimą. Pirmos matricos R1 išėjimas patenka į antros matricos R2. Antros matricos R2 OUT eina į R1 IN. Taip gaunasi, kad fiziškai ir logiškai visi, vienos eilutės, raudoni šviesos diodai susijungia į vieną SPI pliūpsnį. Reikia perduoti 32 baitus informacijos (32*8=256 šviesos diodai, 4 eilutės) “vienai, sujungtai eilutei”, viso 16 eilučių. Aišku, po tokio sujungimo LEDų numeracija bus kiek sudėtingesnė, bet gi skaičiuoja ARM kontroleris, jis moka matematiką.

Toliau galimi du sprendimai kaip organizuoti visko veikimą- dinaminis vaizdo kurimas “on the fly” kaip pas ATARI 2600 kai nereikia “daug” RAM arba naudoti video RAM variantą (512 baitų RAM). Pirmas variantas taupo atmintį, bet labai komplikuoja vartotojo programą- ten labai svarbus taimingas ir viso video vaizdo generavimas. Variantas su video atmintim žymiai lengvesnis- visą matricos valdymą galima užkrauti per pertraukimus (ir DMA, kuris man kažko neveikia), o vartotojo programa gali veikti pagrindiniam cikle be jokio vargo su SPI duomenų perdavimu ir GPIO perjunginėjimu. Manau iš esamų 20kbaitų, pusę kilobaito galima paaukoti video atminčiai.

Pačios matricos valdymas daromas per pertraukimus. Pirmiausia pasinaudojam taimerių ir generuojama “eilutės” pertraukimą- kelis šimtus hercų, kad visa matrica (eilutės/16) nemirgėtu. Šis pertraukimas paruošia signalus, pasiskaičiuoja RAM adresą, išjungia vaizdą ir per SPI persiunčia duomenis. Tuom jis baigia darbą. Jei veiktu DMA, tai net ir procesorius per daug nedirbtu.
Toliau SPI generuoja savo darbo pabaigos pertraukimą. Čia pasirenkam rodomą eilutę, įjungiam ekraną ir baigiam darbą- atiduodam procesoriaus resursus vartotojo programai iki sekančio taimerio ciklo. Teoriškai čia dar galima būtų iššaukti dar vieną taimerį kad reguliuoti matricos šviesumą, bet deja aš to daryti dar nemoku (kitam straipsnyje jau moku). Todėl dabar matrica šviečia pilnu šviesumu. Pertraukimai dar generuoja taip vadinamas vėliavas (flag)- kintamuosius kurie leidžia asinchroniškai pagrindinei programai žinoti kas šiuo metu vyksta. Tai ir kadro numeris ir VS “impulsas”. Tai leidžia vartotojo programai sinchronizuotis su matrica ir jos taimeriu.

Kaip visada programinė įranga:
LED matrix HUB08 demo program for STM32F103 with source code and hex file.

Faile “hub8.c” surašytas visas matricos interfeisas. Ir bazinės komandos plot, point ir teksto paišymas. Papildomai yra bendrinis linijos algoritmas (line.c). Pradėjau pilnai iškėlinėtį vartotojo programas į “user.c” failą- pagrindinima faile “main.c” lieka tik STM32CubeMX generuotas kodas ir kelios eilutės komandų. Taip paprasčiau perkelti programas iš vieno projekto į kitą.

64x64 RED LED

Demo programa nupaišo tekstą ir paleidžia taškelį kuris laksto po matricą ir “atsimuša” į jos kraštus. Kiek keistai paišosi taškelis- tai tik dėl float->int supaprastino konvertavimo. Reikia įvertinti 0,5 apvalinimą, o aš to nepadariau. Tačiau taškelis laksto, mano šuniukui tai labai patiko. Jis net užlipo ant stalo ir numetė tą matricą žemyn…

3 replies on “ARM38: HUB08 ir STM32F1 hardware”

  1. RGB

    RGB

    daryta ir su raudonais led, iš 3 64×32 matrix, poto nusipirkta is kinu RGB 64×64 4 vnt matrix, valdo esp32 smagus daiktai…

Leave a Reply

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