Category Archives: MCU

VFD laikrodis (pastrigo)

Kadangi turiu VFD grafinį displėjų (128×64), ir kad ji nepamesti kur nors garaže, nutariau padaryti eilinį laikrodį. Panaudojau macniausią STM32F103 su 1M flešiuku, taigi priprogramuoti galima daugiau. O dar prikabinau reikalingų ir nereikalingų jutiklių.

Esami sensoriai:

  • DS1307 – RTC, nes pas STM32F103-čią seriją vidinis RTC gaidys.
  • BMP280 – oro slėgio (ir temperatūros) jutiklis.
  • MPU6050 – akselerometras ir giroskopas.
  • QMC5883L – 3 ašių magnetometras (kompasas).
  • VEML7700 – apšvietimo jutiklis.
  • HTU21 – drėgmės ir temperatūros jutiklis. Šis kiek beprasmis, nes viduje kiek per šilta nuo elektronikos.
  • Du mygtukai sensoriniai.
  • GPS.

Dar galima pridėti vieną kitą naują jutiklį- lygtai turiu spalvos, radarą, širdies plakimo, “infrared gesture sensor”, VL53LOX (atstumo). Gal visi ir netilps, nes korpusas vos vos didesnis už VFD ekraną.

Viena bėda- jutiklių daug, bet ką su jais daryti nežinau. Kol kas suprogramuota ar beveik suprogramuota:

  • Automatinis laiko ir datos nustatymas (su žiemos/vasaros laiku) iš GPS. Beja, šiandien GPS kažkodėl išmetė neteisingą datą. Todėl nuotraukoje balandžio mėnesio informacija.
  • Apšvietimo jutiklis kiek keičia laikrodžio šviesumą. Pilnoje tamsoje keičiasi ir šriftas.
  • Pagal laikrodžio padėti rodomas laikas- jei ant šono, skaičiukai šonu. Tam panaudotas akselerometras.
  • Oro slėgį kaip ir matuoja.
  • Drėgmės matuoklis matuoja, bet viduje beveik visada 30 laipsnių šilumos, tai drėgmė nelabai. Bandžiau perskaičiuoti į 20 laipsnių, bet čia tik teorijos.
  • Yra sukeltas pilnas astronomijos modulis iš interneto, kur tiksliai skaičiuoja dangaus kūnų padėtis. Taip žinom kada teka ir leidžiasi saulė ir mėnulis (ar koks Jupiteris). Ir aišku tikros mėnulio fazės. Čia kiek painiavos ant ekrano, nes yra du moduliai iš interneto ir jie skaičiuoja skirtingai (tiksliau gal aš skirtingai interpretuoju duomenis).
  • Yra grafinių primityvų bibliotekos (iš čia ir analoginis laikrodis). Net išnaudota VFD hardvarės subtilybės, kai paišoma ant dviejų nepriklausomų ekranų- taip nereikia perpaišyti ciferblato, kai ant jo užeina rodyklės. Rodyklės ir fonas tai du skirtingi ekranai (planes).
  • USB.

O dabar klausimas! Ką reikia įprogramuoti į šį laikrodį? Nes dabar tik 139kb užima softas (nenaudojama boot užsklanda), taigi liko kokie 850kb.

P.S. Lietuviškos raidės bus.

ARM51: Trimix

Projekto įdėja ne mano. Mano tik algoritmai, programa ir šiaip biški matematikos, nes kažkodėl realaus pasaulio matematika neatitiko to ką rodė jutikliai.

Taigi, Trimix arba trimix dujų mišinys. Tai deguonies, azoto ir helio mišinys naudojamas nardant į kiek gilesnius vandenius. Aš tiksliai nežinau, kam buvo kuriamas šis prietaisas, nes yra ir komerciniai dujų analizatoriai (vieną tokį ir turėjau kai testavau) ir dar šis modelis gavosi kaip ir didesnis (dėl fizikos).

Skaitliuko dėžutė tikrai tuščia. Nors viduje mano PCB, DC/DC keitiklis, 5V stabilizatorius (jei ne iš USB)

Matavimo principas- deguonies kiekį parodo jutiklis, jis taip pat parodo dujų temperatūrą. O helio kiekis matuojamas netiesiogiai- matuojamas garso greitis. Visi žino, kad įkvėpus helio, balso tembras pasidaro aukštesnis. Tai vyksta ne dėl to, kad kažkas pasikeičia balso stygose, o dėl to, kad garsas sklinda greičiau ir atitinkamai keičiasi “balso dėžutės” parametrai. Garso greitį matuojam… matuodami atstumą su ultragarsiniu jutikliu. Kuo didesnis garso greitis, tuo mažesnį atstumą rodo jutiklis.

Hardwarė labai paprasta, nes čia prototipas. Aš paėmiau vieną iš savo dev PCB su LCD ir priejos pradėjau klijuoti kitus elementus.

Matavimo celė su žinomu (ir reguliuojamu ilgiu). Pirmas prototipas.

Deguonies jutiklis kompiuterizuotas ir jungiasi prie MCU per UARTą. O štai atstumo jutiklis analoginis ir industrinis. Ne vien tik reikia maitinti didesne įtampa nei 12V, bet ir išėjimas kinta nuo nulio iki 10V. STM32F tikrai nepatinka tokios įtampos prie ADC. Todėl pastatėm įtampos daliklį. Tačiau STM32F103 serijos ADC šiaip nėra labai geras, o pridėjus netoliese DC/DC keitiklį, prototipinius laidus gavosi nelabai jau tikslūs skaičiai. Nes vienu metu norėjau statyti kitus ADC, iš kinijos užsakiau beveik visus gatavus modelius, taip pat ištraukiau iš stalčiaus ultra brangų senovinį 24 bitų ADC. Tačiau užsakovas pristabdė projektą ir išsinešė testuoti su esamu MCU ADC.

Kita bėda- atstumo jutiklis turi didelį “užkaitimo” driftą. Tai industrinis jutiklis (UNAM 12U9914/S14D), kuris tikrai tikslus, tačiau po įjungimo jis turi bent 10 minučių paveikti kol stabilizuojasi. Todėl teko daryti užnulinimo (tarinimo) mygtuką. Paleidus gryną orą reikia nuspausti mygtuką ir MCU persikalibruoja vieną tašką.

Kitas kalibracijos taškas- 100% helis. Paleidus gryną helį kalibruojam. Taip gaunam kitą tašką.

O dar yra “fabrikinė” kalibracija- taip jau gaunasi, kad keičiant dujų procentus, priklausomybė tarp ilgio ir helio nėra tiesinė. O ir atstumo jutiklis kiek kvailioja, Todėl programoje yra numatyta kita funkcija- raw duomenų nuskaitymas. Paleidus žinomą mišinį nuskaitom papildomai dar vieną ar du taškus. Tada turėdami 0, 100 ir tarpinius skaičius suskaičiuojam kreivės parametrus ir išvedam kreivės “išlenkimo” koeficientą. Šis koeficientas suvedamas į prietaiso EEPROM. Naujai kalibruojant (100% helis) ar taruojant (0% helis) šis koeficientas naudojamas perskaičiuoti kreivę. Iš esmės tai kreivės paišymas per 3 taškus.
Po tokių skaičiavimų rezultatai jau atitiko pramoninio prietaiso parodymams.

Aš paviešimu ne galutinį firmwaro source kodą ir negalutinis vidines instrukcijas. Taip pat neviešinu diskusijų su užsakovu ir excelio lentelių kur skaičiavom kitus parametrus (kad ir temperatūrą). Tačiau gal kam nors bus įdomu. Bendravimas su MCU per virtualų COM portą.

Vidinės instrukcijos– čia kaip koks kursinis darbas. Biški teorijos, biški praktikos.

Trimix source code STM32F103 gcc STM32CubeMX griaučiai (ne galutinis, bet veikiantis).

Pastebėti visokie įdomumai. Pavyzdžiui- helio įsigėrimas į 3D spausdintą plastiką:

Ar visokie gliukai su jutikliais.

Projektas tikrai žalias, bet jį galima iš čia pateiktų duomenų pasikartoti. Aš dalinuosi tik todėl, kad pas nepamirščiau ir dėl to, kad esami source kodai internete – totalus Arduinas su klaidom.

O helis skaičiuojamas labai paprastai 🙂

void Calc_Helis(double atstumas)
{
double a=coef_a;
double b=coef_b;
double c=coef_c;
helis=atstumas*atstumas*a+atstumas*b+c;
}

Sėkmės!

P.S. Dėkui Dianai už įdėją. Sėkmės doktarantūroje.

ARM: MPU-6050™ paleidimas

Per visus tuos arduinus ir kitokius pitoninius iškrypimus, net kelias dienas nepaleidau MPU-6050™ akselerometro ir giroskopo. Pasirodo, reikia atidžiau skaityti produkto datašytą. O kad pas visokius arduinus mikroschema pasileidžia su ne pilna inicializacija ir konfiguracija aš nežinau. Bet mano variantas veikia ant gryno gcc.

STM32F103 MPU-6050™ source code, tik .c ir .h failai. Su nedideliu demo.

ARM55: TG12864H (ST7565) SPI

Tai dar vienas atmintinukas apie LCD ekraniukus. Tokie ekraniukai kogero eina iš kokio Ali, bet aš juos radau kažkokiuose kasos aparatuose. Iš įpatybių: Read Only, SPI.

Beveik viskas veikia naudojant standartines ST7565 bibliotekas, tačiau yra kažkoks bugas su inicializacija. Kol kas sprendimas- du kartus inicializuoti ekraniuką.

Kadangi nėra galimybės nuskaityti ekrano atminties, norint pasinaudoti grafinėmis funckijomis (taškai, nuskaityti tašką) reikia daryti šešėlinę atmintį (shadow ram) ir ten laikyti ekraniuko ekrano kopiją.

Veikiančios demo programos source code, STM32F103 procesoriukui, STM32CubeMX griaučiai.

ARM54: ADC AD7710

Seniai jau mėtėsi šis prabangus ADC- AD7710AR. Jis toks specifinis: aukštos įtampos maitinimas, beveik SPI ir 24 bitai.

Minimalus maitinimas- 5V, ir jo išėjimas labai arti 5V. Tačiau STM32F103 yra 5V tolerantiškas. Tačiau viskam yra ribos. MCU biški kaista. Todėl prie visų kojų nuosekliai pajungiau 64 omų rezistorius- gal kiek ir padėjo. Dar reikėtu dviejų maitinimo šaltinių- vienas skaitmenai (5V), o štai analoginei daliai kogero geriau net bipoliaris maitinimas. Tačiau iš bėdos galima prijungti prie 5V.

O štai su “SPI” interfeisu biški bėda. Primiausia čia pusė duplekso ir duomenys eina per tą patį laidą. STM32F103 lygtai ir palaiko tokį režimą, tačiau kelių dienų eksperimentai parodė, kad visdėlto neveikia. Arba CLK lieka pastoviai, arba nespėja persijungti ar tai nuskaito bet kokią informaciją. Ir dar, jaučiu problemos su mikroschemos greičiais.

O dabar dar viena kvailystė- jei nuskaitom duomenis kai įjungtas 16 bitų režimas, reikia ir skaityti tik 16 bitų, o jei skaitom 24, tai reikia ir skaityti 24. Ir dar reikia stebėti ar duomenys paruošti skaitymui. O dar yra kita kvailystė- atskiras valdymo pinas skaitymui ir rašymui, o ne vienas R/W pinas. Kodėl taip padaryta aš nežinau.

Internete neradau gyvo pavyzduko, kad viskas veiktu. Tačiau po eksperimentų gavosi, kad grynai “softwarinis” variantas puikiausiai veikia.

Čia eksperimentinis source kodas STM32F103 serijos mikroschemai AD7710. Pagrindas – STM32CubeMX.

P.S. čipo kaina biški nustebino.

Futaba VFD GU112x16G (ARM)

Dar biški VFD temos. Turiu kelis mažesnius grafinius VFD modulius: Futaba GU112x16G-7806A. Tai darvienas modulis suderinamas su standartiniu LCD moduliu. Tačiau tai kartu ir grafinis modulis.

Šiame eksperimente aš nejungiau modulio prie standartinio paralelinio interfeiso, o pabandžiau su alternatyvinius metodus: SPI ir su papildoma plokštele- I2C (PCF8574). I2C variantas lėtokas. SPI variantas gretas, jei naudoti papildomą MB laidą per pertraukima. Šis MCU tikrai per greitas šiam moduliui ir buvo bėdų. O jei naudoti su hardcoded užvėlinimu, papildomo laido nereikia. Per i2c ir taip viskas veikia lėtai, todėl nereikia nieko stebėti.

Kairėje SPI, dešinėje su papildomu kinišku moduliu, I2C.

Atkreipkite dėmesį, kad šis modulis naudoja visai kitokį SPI variantą nei didesnis modulis.

Demonstracinis source kodas SPI ir I2C variantams. STM32F103 procesoriui, cubeMX skeletas.

Futaba VFD GP9002A01A (ARM)

Nors realiai tai GP9002A02A. Man patinka VFD technologija. Keista spalva, didelis šviesumas ir kažkoks lempinis vaizdas. Todėl jei matau kur nors palaidą VFD ekraniuką, stengiuosi prigriebti. Aišku aš kalbu apie panaudojamus modulius, o ne kažkokius “custom made” iš senoviškų magnetofonų. O kiek kartų mačiau milžiniškus grafinius modulius kurie buvo sudaužyti- stiklinis korpusas neduoda tvirtumo. O šis modulis nukentėjo kitaip- jo trafukas su plonučiais laideliais atitrūko nuo transformatoriaus korpuso. Teko klijuoti ir užsiimti mikrochirurgija- trafukas visgi smd.

Tai grafinis ir tekstinis modulis. Galima pumpuoti binarinę informaciją arba galima naudotis integruotais šriftais ir kiek keistokais šrifto dydžiais. Ekranas kaip ir “grayscale”, bet man nepavyko. Gali būti, kad yra skirtumas tarp “01A” ir “02A”.

Futaba moduliai dažnai būna ne tik lygiagretaus interfeiso, kaip LCD moduliai, bet turi slaptus papildomus interfeisus: asinchroninis nuoseklusis (kaip RS232, tik TTL lygiai) ir SPI (synchronious serial). Asinchroninis dažnai būna per lėtas, net prie 115kbit matosi kaip formuojasi vaizdas. Paralelinis naudoja labai daug laidų, tačiau labai greitas. O štai SPI kaip ir kompromisas. Pas šį VFD maksimalus greitis kažkur 2Mbit. Nauji moduliai dažnai būna USB/HID- tokių dar nečiupinau.

Su STM32CubeMX sugeneruojam programos griaučius. Aš pasirinkau kojeles iš eilės. Procesoriukas- bet koks. Čia konkrečiai STM32F103VBT6. Kur kibirą turiu.

Mums be SPI, reikia CD (command/data), CS (chip select) ir jei norime gražiai animuoti: VFD_INT (čia kadrų sinchroimpulsas). CS – programinis, nes yra biški triukų. Net porą vakarų turėjau praleisti, kol pradėjo teisingai veikti. Trumpai- CS, CD ir SPI sekos svarbios!

Iš datašyto matom, kad SPI nėra defaultinis. Pirmiausia LSB, antriausia netipiniai CLK. Dar žiūrom į C/D.

VFD datasheet SPI

Labai padeda susigaudyti settinguose šis vogtas iš interneto paveikslėlis. Renkam tą kuris panašiausias:

Beveik visos komandos surašytos į programą. Aišku kiek užknisa ekrano atminties organizavimas, bet viską galima apeiti naudojant galingus MCU.

Ir aišku VFD ekrano valdymo source code STM32F103 procesoriui. (ARM-0053).

Darbo Vietos

Kartais nėra apie ką rašyti, tai nutariau aprašyti savo sėdimas/gulimas darbo vietas.

Čia mažiausiai su darbu susijusi darbo vieta. Čia kartais vyksta intelektualiniai pokalbiai, ieškoma internete ar šiaip. Šis kompiuterius iš šiukšlyno ir pagrinde groja muziką. Klaviatūra aprašyta mano bloge– tai iš aero uosto terminalo.

Pereinam į kitą pastatą:

Čia naujausia darbo vieta. Tipo “sysadmino” urvas. Laidų chaosas 19″ spintoje ne mano nuopelnas.

Pereinam į kitą pastatą:

Čia praleidžiama gana daug laiko. Tik nesimato XRF, jis kažkur išneštas fotografavimo metu. Dešinėje- mikrobanginis mineralizatorius. Reikėtu jį išmesti, bet ranka nekyla- veikiantis daiGtas. Viršuje centre savadarbis “darbo laiko” laikrodis, plastikinių kortelių printeris, lipdukų printeris. Šiaip lipdukų printerių daug. Paprasčiau daryti taip, jei reikia spausdinti skirtingo dydžio lipdukus nei kaitalioti popierį.

O dabar kito tipo patalpa:

Meditacinis akvariumas. Ten tikrai ne rūkas viduje. Paprasčiausiai radau kalną smilkalų kurie supelijo. Todėl juos visus susmilkinau. 🙂

Kita patalpa:

Pagrindinė litavimo ir kompiuterinių žaidimų vieta. Iš chaoso ant stalo- nei lituoju nei žaidžiu paskutiniu metu.

Ta pati patalpa, kitas kambarys:

Čia pagrindinė degradacijos ir programavimo vieta. Programavimo konsultantas pasiruošęs. O apačioje mėtosi gabalai dar nepublikuoto projekto su kodiniu pavadinimu “Trimix“. Jei bendraautorius ir sponsorius leis, bus daugiau informacijos.

Šiaip yra dar viena vieta kur galiu pasislėpti. Todėl jei kartais nerandat manęs, tai aš kažkur esu čia.

Blogas GCC arba x86 bėdos

Papuolė į rankas tokia maža ISA PCB su keliais čipais. Su magišku užrašu “Y2000”. Ir iškarto trenkė nostalgija, apie tai, kaip visi panikavo, kad kompiuteriai 2000-taisiais metais išprotės, nes metai tik dviženklis skaičius. Aišku buvo bėdų su tais metais, bet daugelis panikuotojų nepagalvojo, kad technologija smarkiai tobulėja ir kompai pradėjo labai greitai morališkai senti.

O tiems, kurie strigo su sena technika, atsirado visokie BIOS pataisymai. O jei nėra BIOS pataisymo, va jums papildoma plokštė su ROM. (Kitos mikroschemos tik supaprastina ROM pajungimą prie ISA linijų)

Nutariau pažiūrėti, kas tos mikroschemos viduje. Viduje labai mažai kodo, tai buvo kaip tik, kad pasimokinti Hidros (GHIDRA) programos vartojimo.

ISA PCB yra 8 bitų. Vadinasi suderinama su pačiais primityviausiais x86 procesoriais. Vadinasi kiek rimtesni procesoriai turi veikti “REAL MODE” režime. x86 procesoriaus kodas vos vos panašus į Z80 ir tikrai panašus į 8086. Hidra išardė kodą. O internetai padėjo atpažinti- pirmi trys baitai tai 55 AA 10. “55AA” tai signatūra, o 10 tai programos ROM dydis (kart 512 baitų, h100). O nuo 4 baito prasideda pati programa.

Konkreti Y2K PCB darė šitą: išvalo ekraną (rodos), parašo užrašą, nuskaito dalį RAM ir kažką paskaičiuoją ir jei nepavyko, sako error ir išeina, nuskaito RTC per BIOS, nuskaito RTC tiesiogai, palygina, ir jei kažkas gaunasi arba rašo, kad kompas suderinamas su Y2K arba bando (?) pačinti BIOSą. Čia jau spėlioju, nes mano žinio gana trumpos čia.

Kilo mintis padaryti va taip:

Copy-paste kažkiek asemblerio mnemonikų… ir kaip sukompiliuoti? Internetai sako, kad standartinis GCC, su raktažodžiais tipo “-m16 -nostdlib -ffreestanding” turi gaminti x86, 16bitų, REAL kodą. Ir tikrai, kopijuotas kodas iš Hidros susikompiliavo. Toliau teko kankintis su LD.exe ir visokiais loaderiais, kad gautųsi ROM image, o ne exe failas. Tai irgi buvo pilnas nuotykių žaidimas kuris nepavyko iki galo.

Tačiau kodas neveikė realiuose kompiuteriuose.

Ir pasirodo, kad JOKS GCC nesugeba generuoti teisingą 16 bitų, REAL MODE kodą. Iš principo. Binarinių failų palyginimas parodė, kad CALL, RETF ir gal kitokios instrukcijos generuojamas 32 bitų. Tas 32 bitų kodas “kaip ir suderinamas”, bet kai paleidi iš BIOSo, tai tikrai nesuderinamas. Ir nesvarbu koks procesorius- 486DX irgi nesuprato.

Rašyti softą be CALL kaip ir sunkoka. Gerai, kad čia tik kelios eilutės- išvalyti ekraną, per BIOSą (TTY režime) išspjauti tekstą ir nuskaityti ANYKEY iš klaviatūros. Teko viską perrašyti tiesiogiai. Ir rankutėmis įkelti “RETF” teisingą kodą programos gale. Kodu nesidalinu, nes jis baisus, nesuprantamas ir ten per daug POP/PUSH (kopijavau iš tikrų paprogramių, kur išsaugoja registrus). Svarbu veikia.

ROMas turi primityviausią kontrolinę, 8 bitų, sumą. Todėl reikią paskutinį baitą ROMe kaitalioti tol, kol suma nepasidaro 00.

O dar radau keistą PCI plokštę iš Izraelio- kažkoks tipo “security”. Pati PCB tai kastruota tinklo plokštė su BOOT ROM. Jei bus azarto, bus galima pasinagrinėti šitą kodą.

Taigi, be normalaus asemblerio, koduoti ROMą labai sunku. O tiek turėjau planų- panaudoti C kalbą ROMe ir PC kompiuterį panaudoti kaip mikrokontrolerį. Kam? Ogi smalsu. Nebent PCI kompiuteriai jau tikrai valgo 32 bitus ROMe.

O grynai asembleris tai NASM. Jam puikiausiai kompiliuojasi. Tikriausiai komentaruose bus pilnas komplektas NASM kompiliatoriui.

P.S. Originalus Y2000 ROMas.

Spalis 24

Spalio mėnesio fotopostas. Biški nėra ką rašyti.