Author Archives: Administrator

Talpuminis drėgmės jutiklis- debilo tvarinys

Pilnas internetas “arduininstų” projektų su kiniškais talpuminiais dirvos drėgmės jutikliais (capacitive soil moisture sensor v1.2). Vieniems kaip ir veikia, kitiems neveikia. Kiti gauna randominius parodymus. Eksperimentui nupirkau vieną ir pradėjau analizuotis. Ir jei pavyks, gal patobulinsim.

capacitive soil moisture sensor v1.2 - idiot design
Tai juodos spalvos PCB, strėlės formos, elektronika visiškai neapsaugoti nuo išorinių poveikių.

Pati schema nėra sudėtinga, aš tingėjau analizuotis, bet spėtinai tokia (internetuose vaikšto biški kogero su klaidom. Rezikas ne toks, sujungimo lygtai vieno nėra):
capacitive soil moisture sensor - idiote design schematics
(schema supaprastinta)
Mano turimas variantas, nestabiliai veikė- osciloskopas parodė, kad taimeris kartais pastringa. Tačiau pagrindinis dažnis buvo kažkur 1.7MHz (prie 5V), prie 3V kažkaip neveikė.

Kaip viskas veikia- AC įtampa, iš taimerio per R1 įtampos/srovės ribotuvą patenką į “jutiklinį” kondensatorių, o diodas D1 nuimą sukauptą DC potencialą nuo jutiklio kur gauta įtampą kaupiama C3 kondensatoriuje ir tolygiai iškraunama per apkrovą R2 (vienas megaomas, sako kartais jo nebūna).

Kokios bėdos- pas mane, taimeris nestabiliai veikė. Todėl nėra stabilumo išėjimo įtampoje. Taip pat neveikia prie 3V.

O pats matavimas visiška nesamonė- tai milžiniškos (megaomas!) varžos įtampos daliklis kuris tiesiogiai jungiasi prie MCU ADC. Ne visi MCU turi vienodus analoginius įėjimus- ADC įėjimo parametrai tai gali būti bet kokie. Megaominis įtampos daliklis nuogas- bet koks užteršimas ir parametrai pavažiuos. Taip pat jungiamieji laidai negali būti ilgi, o kontaktai blogi.

Diodas D1 tikriausiai “generic” silicio, čia nemanau, kad dėjo kokį nors detektorinį, nors negaliu patikrinti.

Ką galima pakeisti- pirmiausia, paleisti nuo 3V (šiuolaikiniai gi MCU), o ir naudojant nuo 5V sistemos, geriau statyti lokalų stabilizatorių (ten numatyta vieta, kur kreivai stovi rezistorius). Iš taimerio turi gautis stabilus meandras. Dažnis neturi plaukioti. Gal net kvarcą prisukti? Nežinau.

Išėjimo grandinę reikia tobulinti: arba statyti mažyti operacinį stiprintuvą (kartotuvą) ir jo žemo impendanso išėjimą jau naudoti su MCU ADC, ar net konvertuoti įtampą į srovę- tada MCU ir jutiklio laidas gali būti bet koks.

Apsaugoti visą PCB laku (gal net epoksidiniu). Papildomas sluoksnis reikalingas prie 555 taimerio, nes čia papildomos talpos gali paveikti generatoriaus dažnį.

O jei daryti rimčiau- visą detektorių, o tiksliau AC voltmetrą daryti su operaciniu stiprintuvų naudojant klasikines schemas. O gal daryti, kad Cx keistu generatoriaus dažnį ir tą dažnį matuoti su MCU?

ARM:0017 – Eik miegot laikrodis

Turim tokį grieką, kad kai žaidžiam žaidimus, žiūrom kokia pornografiją ar šiaip, ir staiga pastebim, kad jau gili naktis. Aišku kažkur yra laikrodukas lentynoje, bet geriau prisukti palei nosį, kad rodytu tuščiai praleistą laiką. 🙂

Tai DIY RTC laikroduko eksperimentas su pačiais pigiausiai komponentais. Kaip tik susirinkti ir ištestuoti. Kogero sunkiausiai bus padaryti korpusą:
OLED RTC to limit gaming time. STM32F103c and I2C OLED USB settings
Tai laikrodis, kuris nusistato per USB (jokių mygtukų), rodo laiką ir laiką nuo paskutinio įjungimo (uptime). Kadangi maitinasi iš USB, tai rodo kiek laiko pajungtas kompiuteris.

Schema paprasta- “blue pill” modulis, OLED modulis, du rezistoriai po 4K7 ant I2C buso, vienas rodos 270R nuosekliai 1N4148 diodui- krauti super kondensatorių ir aišku pats kondensatorius.

Laikas nusistato per USB. Reikia sužinoti kokį COM portą emuliuoja laikrodis. Pas mane COM12. Tada į tą portą pasiunčiam laiko tekstą. Su windows darosi su keistoką komandą bat faile (yra archyve):

set /p x=%TIME% <nul >\\.\COM12

Kodėl taip keistai? Klauskit Billo. Realiai ši komanda veikia su “nestandartiniais” COM porto numeriais ir nesiunčią jokių CRLF. Gal su Linux gautusi paprasčiau. Nėra to kubiko USB įrenginys labai stabilus, todėl jei kas, darykite kaip tikri kompiuterastai: išjungiam ir įjungiam.

Aišku visi failai ir CubeMX projektas:
STM32F103 RTC OLED USB source code and hex..

P.S. vietoje super kondiko galima įdėti 3V batareiką.

ARM:0016 STM32CubeMX – RTC problema

Tai labai trumpa žinutė, nes ST gudručiai ir kubiko programeriai pasistengė, kad gautusi sudėtingiau. O aš poto užmiršiu jei neužrašysiu.
Kad RTC (realaus laiko laikrodis) veiktu su STM32CubeMX paketu reikia daryti taip:

Susirandam “MX_RTC_Init(void)“, skrolinam iki komentaro “USER CODE BEGIN Check_RTC_BKUP“. Ten nuskaitom vieną iš vartotojui prieinamu “backup” reikšmių ir atidarom “IF”:

/* USER CODE BEGIN Check_RTC_BKUP */
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
{
/* USER CODE END Check_RTC_BKUP */

Skaičius “0x5051” gali būtu bet koks, svarbu kad jis nesigautu atsitiktinai sutampantis su tikrai pilno MCU starto skaičium.
Poto paskrolinam daug kodo su RTC inicializacija…

/* USER CODE BEGIN RTC_Init 2 */
} // Kitame user code virsuje yra IF komanda. Čia ji užsidaro.
else
{
// LAIKAS BUVO ISSAUGOTAS, NES USER REGISTRAS TURI MAGIC skaiciu 0x5051
// Čia galima ką nors padaryti iš tos laimės arba pagalvoti apie kalendoriaus atstatymą. Sako kad jis nelabai
}

//Čia įrašom tą MAGIC skaičių. Jis po pilno reseto ir RTC mirties turi neišlikti.
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//Write data to the specified backing area register
/* USER CODE END RTC_Init 2 */

Taip padaryta, kad useris aklai nepasitikėtu RTC veikimu ir tikrintu RAM išlikimą. Kai kuriuose forumuose rekomenduoja paprasčiausiai nutraukti RTC inicializacija su return komanda. Tačiau reikia daryti taip, kaip parašiau- pasitikrinam ar RAM išlaikė realius skaičius ir tik tada sakom, kad RTC korektiškai veikė kol procesorius stovėjo išjungtas. Jei RTC mirė, mirė ir jo RAM. Tada starto metu, žinom, kad laikrodis rodo nesamones.

P.S. Jei norim sekundinio pertraukimo, tai reikia paleisti kur nors RTC init gale šitą makrosą:

__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC);

ARM:0015 STM32CubeMX ekraniukų bibliotekos 2 dalis

Pratesimas- grafinių ekraniukų bibliotekos gcc C kalbos puristams. Kiek paoptimizuotos, pataisytos kelios ardruinistų ir adafruitistų klaidos. Ir aišku pridėta savų klaidų. Vienas ekraniukas I2C, visi kiti SPI. Ekraniukai naudoja tuos pačius SPI, D/C ir RESET signalus, ekraniukai pasirenka su CS signalu. Tai svabu, nes pats naujausias ekraniukas (240 x 240) neturi CS kojos išvestos į jungtį. Jungiant prie dedikuoto SPI tai nėra problema. Deja šiame projekte teko palituoti.

SPI and I2C graphic LCD OLED modules with STM32 stm32cubemx gcc
Ekraniukai (iš kairės į dešinę): ILI9341 (320 x 240), ST7789W (240 x 240), seniausias ST7735R (160 x 128, galimos kitos konfiguracijos), SSD1306 (128 x 64), SSD1306 (128 x 32, I2C).

Mažiesiems ekranams neparašytos grafinės bibliotekos, kaip matosi iš nuotraukos, naudojamas (vogtas) šriftas turi klaidas. Manau, vėliau pabaigsiu Windows softą šriftų redagavimui ir ekskportui, nes užkniso tie šriftai.
Bibliotekos kiek kitų versijų nei pirmame straipsnelyje, nes teko kiek unifikuoti ir optimizuoti. Pvz- jei reikia perduoti kelis baitus iš eilės, tai ir siunčiam kelis baitus, o ne kelis kartus siunčiam po baitą. Arba va:


//buvo:
for (pixels = 0; pixels < x1 - x0 ; pixels++) { ili9341_send_word(color); }
//tapo:
for(x0=x0;x0<x1;x0++){ILI9341_send_word(color);}

Pirma eilute originali, antra mano. Sutaupom kintamąjį ir bereikalingą skaičiavimą.

Dar vienas:


//buvo:
for(i=0;i < (w * h);i++)
{
c1 = *buffer++;
c2 = *buffer++;
ili9341_send_byte(c1);
ili9341_send_byte(c2);
}

//tapo:
ILI9341_write_buffer(buffer, w*h*2);

Kiek teko pamakaluoti kodą, nes kažkodėl ne visur suveikė “static”, o bibliotekos taigi kartojasi. Gi niekas negamina tokio kvailo projekto su tiek skirtingų ekraniukų.

Visas source kodas ir sukompiliuoti binarai:
LCD OLED screens SPI and I2C libraries for STM32CubeMX with demo program.
Konfiguracijos pagrinde vienoje vietoje ir darosi su #define. OLED ekraniukai naudoja harwarinį skrolinimą, galima diminti, kad pamažinti burn-out.

ARM:0014 STM32CubeMX jutiklių ir ekraniukų bibliotekos

Bet kokios naujos programos kurimas kontroleriukui tai iš esmės senesnių failų dėlionė iš bibliotekos. Todėl kiek labiau panaudojus STM32 serijos kontrolerius teko persirašyti kelias savo naudojamas bibliotekas iš AVR į STM32Cube versijas. Buvo sukurtas USB-COM projektas ir prie jo prikabinta visa serija bibiliotekų. Jos tikrai veikia ir kiek “normalizuotos”- senosios buvo istoriškai chaotiškos. Konversija praėjo keistokai lengvai. Vienas tik reikalas kuris suėdė kiek nervų- pačio STM32F čipuko jautrumas I2C šynos terminatoriams.

STM32F103 blue pill with OLED, I2c LM75 BM180 MAX44007 PCF8574
Visi jutikliai ir moduliukai iš Kinijos. Tik FM75 nuluptas nuo televizoriaus, o MAX44007 dovanotas žmogaus.
Veikiantys moduliai:

  • LM75 temperatūros jutiklis, I2C (FM75 tai rimtesnis, bet suderinamas su LM75)
  • MAX44007, I2C, apšvietimo jutiklis.
  • PCF8574, I2C, 8bit I/O extenderis.
  • Tekstinis LCD ekraniukas ant PCF8574 extenderio. Kartu gaunasi ir 5V atskirimas nuo 3V.
  • SSD1306 kontrolerio OLED ekraniukas ant I2C šynos.
  • Analoginiai signalai- nu čia ne moduliukas, bet pačio STM dalis.
  • RTC (laikrodis)- čia irgi ne moduliukas, o STM dalis.
  • BMP180 atmosferos slėgio jutiklis su temperatūros jutimu.

Pastabos: OLED ekraniukas naudoja Commodore 64 šriftą. Jį galima pakeisti kitu. Tekstinis ekraniukas- tai klasikinis LCD ekraniukas su ar be pašvietimo, paprastai jungiamas prie 7 ar daugiau GPIO pinų. Tie ekranai paprastai būna 5v technologijos ir su 3V technologija dažnai nerodo vaizdo. I2C I/O ekstenderis leidžia suderinti su 5V maitinimu- patį LCD ir IO modulį maitinam nuo 5V (tiesiai iš USB), o procesoriukas nuo 3V.
Visas kodas pilnai suderinamas su STM32CubeMX ir HAL. Kompiliuojasi su gcc be jokių warningų.

Nusikrauti source code, kubiko projektą ir sukompiliuotus failus:
STM32CubeMX project, I2C LM75 PCF8574 MAX44007 BMP180 text lcd screen

Per virtualų COM portą matosi visi jutiklių rodymai. Dalis informacijos išmetama per ekraniukus.

Gregoro Mendelio pėdomis

Beeinant Gregoro Mendelio pėdomis, galima atlikti tokį eksperimentą: paimti geltonus, kietus rutuliukus ir juodas sūtraukas. Poto sukrušti juos tarpusavyje.
genetika- pradiniai variantai
Pradinis variantas- geltoni, tai auginami Lietuvoje, gal pašariniai, o gal žmoginiai. O tie juodi sūtraukos- tai jau amerikoniškų dekoratyvinių variantas.
Pagal Gregą, turi gautis- du variantai pradinių, poto juodi- kieti- apvalaini, geltonos sūtraukos ir kas nors dar? Praktiškai gavosi:

genetika- rezultatu variantai
Tie blyškus nesusipratimai tai gal ne hibridas, o paprasčiausiai nesuspėjo subręsti. Tai jau antra hibridų karta. Pirmoji karta buvo visiškai pagal Gregą, čiau jau atsirado ir kažkoks dar chaotiško išsidėstymo faktorius.

Panašiai gavosi ir su kiniškom saulėgrąžom iš aliekspreso: Lietuviškos paprastosios su kiniškom pilnavidūrėm padarė visą šeimą hibridų…
Deja, klimatas kiek netinkamas – nors ir karšta vasara, bet ji buvo per trumpa. O ir namiškiai kažkaip nemėgsta mano eksperimentų su genetika 🙂

Plastiko degradacija ir restauravimas

Kažkada ekologai bambėjo, kad plastikas yra amžinas ir kad gamtoje jis nesusinaikina. Deja jie melavo. Jei paklaustumėt kokio nors Londono technikos muziejaus kuratoriaus, kokios didžiausios bėdos, jis iškarto pasakytu- plastiko degradacija. Ypač tai liečia celiulioidą ir kitus senuosius plastikus. Gal nelabai bėdos su ebonitu, bet jis darosi trapus.
Polietilenas teoriškai amžinas, bet praktiškai nuo gamtos darosi trapus. Polistirolas irgi byra. Epoksidinės/fenolinės dervos išleidžia savo blogį ir trukinėja. Netgi “medicininis” dvikomponentis siliconas (platinum cured) irgi sysina savo plastifikatorius. Senas “porolonas” arba pavirsta dulkėmis, kas yra pusė bėdos arba lipniu snargliu- kas nelabai faina. Kai kurios gumos pavirsta kietais miltukais, kitos- batų vakso/tepalo lipnumo ir spalvos tyre.

O va su ne tokiu nors senu ABS (ir ypač ABS+FR) irgi bėdos ir jos matomos. Teoriškai ABS išleidžia savo plastifikatorius ir ugnies atstumikus. O ten sako, kad yra bromo. Išoriškai- plastikas geltonuoja.

yellowing plastic retr0bright pageltonaves plastikas
Ypač tam padeda saulės šviesa. Skirtingas “geltonumas” tikriausiai dėl skirtingo plastiko sudėties, dar kiek padėjo saulės šviesa. Patys kairiniai mygtukai restauruoti.

Kita bėda, kad tos išskirtos medžiagos yra nuodingos ir visokios piktai korozinės. O jei gaminyje skirtingi plastikai, tai vienas plastikas ėda kitą plastiką. Netgi nauji plastikai nedraugauja. Kažkada, dar praeitam šimtmetyje, kai aš ėjau į mokyklą, dariau tokią bzbidką- iš tėvo gavau kažkokio minkšto termplastiko, kuris gana gerai dirbo trintuko darbą. Tačiau siaubingai greitai suėsdavo polistirolą ir jo giminaičius. Todėl keli bendraklasiai buvo apdovanoti to minkšto plastiko gabalėliais. O beveik visi tada naudojo plastikinius penalus. 🙂

yellowing plastic retr0bright pageltonaves plastikas
Priklausomai nuo pagaminimo, sąlygų, skirtingi plastikai skirtingai reaguoja. Aš nežinau kaip reaguoja ypač seni Atari, bet pas juos tamsios klavietūros- nelabai matosi. Tačiau man atrodo, kad 1970…1980 plastikas buvo “stripresnis”, poto nauji Atari ėjo su šviesiais korpusais, ir ten buvo visaip. Turiu kelis Commodore, jie irgi skirtingai pageltonavo.

Dabar apie remontą ir restauraciją. Jei plastikas pageltonavo, dar galima jį atstatyti. Šį metodą sugalvojo senų kompiuterių kolekcionieriai ir padarė jį “open source”. Vadinasi- retr0bright (retrobright).
yellowing plastic retr0bright pageltonaves plastikas
Tai tikrai tie patys mygtukai. Kaip matosi iš žalio fono, viršuje deja telefonas kiek paryškino geltonumą, tačiau patikėkit- jie tikrai buvo geltoni. Apačioje maždaug po paros- dviejų mirkymo.
Receptas paprastas- tikras vandenilio peroksidas (aš naudojau gal poros metų senumo, 35% stiprumo, industrinį H2O2) praskiestas per pusę. Spėju, kad jo stiprumas tarp 10 ir 15%. Daugiau stiprumo nereikia- dariau eksperimentus su grynu, tai ėdė plastiką. Svarbu daryti lėtai. Ir dar reikia ultravioletinės šviesos. Tinka ir saulės šviesa. Tačiau gyvenam Lietuvoje, tai salės nėra daug. Todėl panaudoja UV LEDus nuo “nagų džiovinimo” mašinėles. Bandžiau eksperimentą su baktericidine lempa, tai efekto nebuvo. O va tas violetiškai-mėlynai-ultravioletinis tikrai veikia. Apie pora vatų elektros į du LED ir kiaura diena švitinimo su pamaišimu. Naudojau uždarą plastiko indelį, nes apšviestas peroksidas ir jame plaukiojantis plastikas pradeda kiek burbuliuoti ir smirdėti. Kas ten apart “atominio deguonies” išsiskiria aš nežinau, bet geriau neuostyti.

Man biški neramu dėl šiuolaikinio “ekologiško” plastiko- kiek veikia ir ką išskyria šiuolaikiniai plastikai. Koks nors “dermeo” čiužinys irig pagamintas iš kažkokio “porolono” sluoksnio- kaip jis degraduoja ir ką jis “iškvepuoja” tiesiai žmogui į nosį? O kaip tai “melanino” puodeliai? O kaip plastikiniai elektriniai virduliai? Nafig. Reikia išbandytus kimšalus- vilną, arklio ašutus, jūros žoles ir paprastą medvilnę kišti į čiužinius (pūkai ir plunksnos deja mane alergizuoja), o arbatinuką sukonstruoti iš sidabro- sidabras tik švelniai toksiškas 🙂 Arba iš titano, tantalo ar niobio (tiesa dėl paskutinio tai nežinau).

ARM:0013 STM32CubeMX – USB HID klavietura

O dabar pasinersim į USB klavietūros gamybą. Pasinaudosim STM32CubeMX konservais, HID mouse pavyzdžiu, bet perdarysim savaip, kad gautusi klavietūra. Viską darom kaip USB-Peles pavyzdyje. Visiskai viską. Tačiau pakeisime įrenginio aprašymą (descriptor). Labai negudrausim, bet iš www.usb.org nusikrausim HID descriptorių generatorių ir jame pasirinksime klavietūra. Tai universalus ir perteklinis descriptorius, bet kol kas, paprastumo labui, naudosim taip kaip yra.

USB HID descriptor generator
Programos sugeneruotą descriptorių eksportuojam į “h” tipo failą: keybrd.h (jis bus įdėtas į source code archyvą).
Continue reading →

ARM:0012 STM32CubeMX – USB HID pele

Sekantis projektas iš konservų dėžutės vardu STM32CubeMX- pelė. Tai bus USB HID (human interface device) pelė. Pradedam nuo pelės, nes ji sugeneruojama automatiškai ir nereikia vargti su įrenginio aprašymų košmaru (device descriptor). Viską darom kai su virtualiu COM portu, tik pasirenkam kitą įrenginį:

STM32CubeMx HID mouse
HID klasė, daugiau pas kubika nieko nepakeisi (o gaila, nes norėturi didesnės klasių bibliotekos. O ir čia niekur neparašyta, kad čia ne paprastas HID, kas gali būti bet kas, o paprasčiausia pelė).
Continue reading →

ARM:0011 STM32CubeMX – pertraukimas per kojas

“Pertraukimai per kojas” :).

Iš vienos nesamonės liko tokia mažytė klavietūra su keturiais laidais. Maniau kad USB, deja ne- PS/2 standarto. Kaip tik proga parašyti ką nors apie programavimą. Todėl pirma, tarpinė užduotis: pajungti PS/2 klavietūra prie virtualaus COM porto (USB).

Amstrad mailboard
Kadangi jau męs mokam STM32CubeMX pradmenis iš senesnių postų: Pradinis ir USB COM portas, bus mažiau rašymo.
Taigis pradedam…
Continue reading →