Category Archives: Betkas

Nespauskit

Nespauskit keistų linkų kuriuos gaunat. Aš spaudau už jus, kad žinotumėt.

Scenarijus paprastas- ateina žinutė apie neva nepristatytas siuntas. Ten būna dažnai keistoka nuoroda:

Nelabai gramatana žinutė turėtu kaip ir duoti įspėjimus. Atsidaręs interneto puslapis savo gramatika irgi sako, kad kažkas negerai. Žmogai, jei atsidarėte žinutę, kuri rašo apie jūsų siuntą ir jie jau žino telefoną, tai kodėl vėl prašo asmeninės informacijos? (Ten žemiau buvo ir telefono laukelis). O sekantis ekranas jau sako, kad reikia tik 0.27€ užmokėti. Tačiau bjaurus paštas tikrai be dviejų eurų nieko nedaro 🙂 Aha, ir kortelė ir CVV. Gal dar raktą nuo kambario su pinigais?

O, va ir kambario raktas. T.y. anonimiškas “bankas” ir patvirtinimo kodas. Aš naudojau randominį telefoną (nu ne randominį, bet policijos) ir generuotą kreditinę kortelę. Todėl galiu tik spėti apgavystės mechanizmą. Tikriausiai į mobilų ateina kažkas dar, gal koks netikras bankas. Gal šiuo momentu jau pasijungia gyvas žmogus kuris pradeda rankiniu metodu dirbti tarpine tarp aukos ir banko. Tačiau mano eksperimente įvedus bet kokius skaičius, puslapis užlinko.

O bonuse, tokius puslapius blokuoja mūsų pareigūnai. Tai jei neskubėsite spausti nuorodos, tai vėliau ji gali pasirodyti tokia kaip paveiksliuko dešinėje.

O dabar bambesys ir patarimai- net jei ir laukiate siuntos, neskubėkite. Niekur ta siunta nedings, nepanikuokit. Skaitykit atidžiai ir galvokite logiškai- kodėl? Kam jies to reikia? Kur jūsų siuntos identifikacinis numeris. Kodėl siuntėjo numeris ne iš Lietuvos? Kodėl interneto adresas toks keistas? O jei tikrai nerimas dėl siuntos, tai eikite į oficialų pašto puslapį. Nežinot siuntos numerio? Tai iš viso ko čia blaškotės? Laukite lapuko savo pašto dėžutėje. Ar net didelio laiško.

Visi dokumentai pildomi tik oficialiam pašto interneto puslapyje, o apkomėti galima tik teisingai prisiregistravus prie lpexpress savitarnos. Nebūkit šiuolaikiniai hipsteriai, kurie viską bando daryti savo ultra išmaniu įrenginiu, kuriame sudėtos VISOS JŪSŲ PASLAPTYS! Žinot patarlę apie “visus kiaušinius vienoje kraitelėje”?

O dabar testas:

Kuri žinutė teisinga?

makefile (užrašai sau)

Makefile tai specifinis instrukcijų rinkinys kuris gali pats paleisti kitas instrukcijas ir pats save ir panašiai. Naudojamas automatizuoti programų kūrybą ir gal dar ką nors. Ši žinutė skirta man pačiam, nes atmintis labai blogai dirba. O jei kitiems tiks, ar bus kokių nors patarimų- welcome.

  1. PROJECT = $(notdir $(CURDIR))
  2. SRC = $(wildcard *.c)
  3. BDIR = build
  4. OBJ = $(patsubst %.c, $(BDIR)/%.o, $(SRC))
  5. .PHONY: clean all hex
  6. #phony - komandos (jei netycia sutaptu su failo pavadinimu)
  7. all:
  8. @echo "all" $(PROJECT)
  9. #all pasileidzia kai paleidziamas make be komandu
  10. levas:
  11. @echo $(SRC) $(OBJ)
  12. #pirmas iki: objektas komanda arba failas, antras -kokiems failams galioja
  13. $(BDIR)/%.o: %.c
  14. echo $@
  15. mkdir -p $(BDIR)
  16. cp $< $@
  17. objects: $(OBJ)
  18. elf: $(BDIR)/$(PROJECT).elf
  19. #sutrumpinta komanda, kad nereiketu ivesti pilno failo pavadinimo
  20. $(BDIR)/$(PROJECT).elf: $(OBJ)
  21. cat $(OBJ) > $(BDIR)/$(PROJECT).elf
  22. clean:
  23. rm -f $(BDIR)/*.o $(BDIR)/*.hex $(BDIR)/*.bin $(BDIR)/*.elf

Komentarai:
Eilutės 1-4: paprasčiausi kintamieji ir kelios operacijos su jais. 1) kintamasis “PROJECT” pasidaro naudojamo folderio pavadinimu, 2) “SRC” – visų failų su išplėtimu masyvas. 3) paprasčiausias priskyrimas. 4) vieno masyvo konvertavimas į kitokį.
Eilutė 8: make visiškai nesvarbu ar dirbama su failais, komandomis ar “kažkokiais objektais”. Jei folderyje bus failas “clean” ir jis nekis, make pasitikrins tai ir nebevykdys komandos. Phony pasako, kad čia ne failas.
Eilutė 11: “all” pasileidžia, kai make paleidžiamas be parametrų, čia kaip “main()” funkcija.
Eilutė 15: komanda gali vadintis bet kaip. Tik turi užsibaigti dvitaškių. O jos atliekamos komandos turi būti “atitrauktos” per tabą.
Eilutė 20: komanda gali būti failo pavadinimas, kad ir iš komentaro, o antras žodis po dvitaškio kaip ir filtras kokius failus galima naudoti. Čia biški nesuprantu.
Eilutė 25: komanda “daryk objektus” pasiima visus būsimus “O” failus ir generuoja pagal 20 eilutę iš “C” failų. Jei “O” failai jau sugeneruoti ir jų “šaltinis” toks pats, failai ignoruojami.
Eilutė 27: Kad nereikėtų nurodyti kokį “ELF” failą generuojam, čia parašom supaprastinimą.
Eilutė 30: Kai reikia generuoti kokį “ELF“, kad ir iš 27 eilutės, naudojam tokią instrukciją ir gaminam iš “O” failų. Savo ruožtu, jei nėra “O” failų, tai juos generuojam iš “C” failų (20 eilutė). Ir kartu stebim, ar kas nepasikeitė
Eilutė 33: Paprasčiausiai ištrinam viską ką sugeneruojam.

Atrodo viskas siaubingai ir keistai. Ir net nesuprantu kaip tai veikia. Tačiau teisingai parašytas makefile viską labai palengvina, nes nebereikia galvoti, kas ten su kuo jungiasi ir kas iš ko darosi. Iš principo tai gana specifinė “skripto” kalba.

P.S. Jei dirbat su windows ir jus užkniso, kad kiekvieną kartą paspaudus ant “makefile” windows klausia su kokia programa ją atidaryti, darykite taip:

assoc .="No_Extension"
ftype "No_Extension"="C:\WinAVR\pn\pn.exe" "%1"

Tiktai “path” iki savo redaktoriaus pasikeiskit.

GAL/PAL “hackinimas”

Aš biški domiuosiu senais kompais, o ten dažnai naudojamos programuojamos logikos mikroschemos (PAL/TIBPAL/GAL/PALCE). Šios mikroschemos, ypač senos laidos, labai kaista ir net kartais nuo to kaitimo susidefektuoja. Todėl kartais jas reikia pakeisti “naujom” PALCE ar GAL mikroschemom. Visa bėda- nežinom mikroschemos turinio. Kartais “fuse” failai randami internete, kartais net būna “lygtys”. Kartais galima atstatyti turinį pagal prietaiso schemą (taip atstačiau ATARI 1200 čipą). Tačiau tai suveikia ne visada.

GAL ir PALCE čipai perrašomi. Todėl juos galima lupinėti iš senų plokščių ir panaudoti iš naujo.

Internete yra metodas, kad paprastas mikroschemas (be registrų) galima atburti naudojant paprastą “brute force” t.y. išbandant visus variantus ant kojyčių. PAL mikroschema prijungiama kaip 27C020 ir nuskaitoma kaip paprastas EPROM ir gautas “rom dump” sumaitinamas specialiai programai “pa.exe”.

Jei PAL/GAL mikroschema neturi viduje registrų ir (kas svarbu!) neturi viduje užciklintos logikas “ala” registras, tai viskas veikia. Deja, tos mikroschemos kurios man buvo svarbios buvo TIBPAL16L8 – gryna logika, bet “užciklintos” ir man nepavyko jas “nulaužti”…

Taip atrodo PAL16L8 į 27C020 adapteris.

Taigi, jei netyčia turit Amiga 2000 1Mb DRAM plokštės jungiamos į CPU slotą schemą ar PAL formules, pasidalinkit 🙂 Nes dabar atminties išpėtimas net pradeda smirdėti nuo karščio.

Pareigūnų sirena

Toks beveik vandalizacinis straipsnis. Tarp utilizuojamos technikos pasitaikė sirenos generatorius. Dar prie jo reikėtu ir aukštavolčio garsiakalbio, bet jo neturim.

Tokias sirenas naudoja įvairių šalių pareigūnai. Musiškiai naudoja tokią- dviejų melodijų ir beep-beep (air horn) imitacija.

Schemos nesinagrinėjau, bet spėju, kad tai bus gryna skaitmena stiprintuve- nemanau, kad du tranzistoriai su tokiu mažu aušinimu dirba kokiam nors kitokiam režime nei D. Trafukas švelniai groja sirenas, prie išėjimo pabandžiau paprastą gasiakalbį ir kelių šimtų omų rezistorių. Iškarto rezistorius pakaito- galios turi daug.

Tik trys mikroschemos. PICas lizdelyje- “operatyviai” galima keisti melodijas. Dar viduje turi būti kažkoks ADC keitimas, nes galima šnekėti per tą “gavarilką”– “vairuotojas, prašom sustoti” 🙂

Jokio panaudojimo nesurandu, nes negalima naudoti. Nebent kaip signalizacijos triukšmo šaltinį.

ARM48: USB HID host

Jei naudojamas STM32 čipas palaiko USB HOST režimą, tai prijungti USB įrenginį labai paprasta. Mano hardwarė labai paprasta- čipas ir dvi USB jungtys. Viena jungtis suprogramuota kaip virtualus COM portas skirta peržiūrėti rezultatus, o kita USB jungtis tai USB host. Čia galima prijungti pelę ir klavietūrą. Kiti HID įrenginiai nepalaikomi.
Primenu, kad HID klavietūra palaiko iki 6 klavišų nuspaudimus (neįskaitant modifikatorius: shift, control, alt…) ir atskirai siunčiami klavišų paspaudimai ir atleidimai.
Kad viskas veiktu, tereikia savo programoje pasirašyti callbacką:

  1. void USBH_HID_EventCallback(USBH_HandleTypeDef *phost)
  2. {
  3. char txt_buf[100];
  4. char t[4];
  5.  
  6. strcpy(t,"[x]");
  7. if(USBH_HID_GetDeviceType(phost) == HID_MOUSE) // if the HID is Mouse
  8. {
  9. HID_MOUSE_Info_TypeDef *Mouse_Info;
  10. Mouse_Info = USBH_HID_GetMouseInfo(phost); // Get the info
  11. int8_t dX_Val = Mouse_Info->x; // get the delta x value (note unsigned - signed conversion)
  12. int8_t dY_Val = Mouse_Info->y; // get the delta y value
  13.  
  14. int len = sprintf (txt_buf, "dX=%d, dY=%d, Button1=%d, Button2=%d, Button3=%d\r\n", dX_Val, dY_Val, Mouse_Info->buttons[0],Mouse_Info->buttons[1], Mouse_Info->buttons[2]);
  15. user_usb_tx((uint8_t *) txt_buf,len);
  16. }
  17. if(USBH_HID_GetDeviceType(phost) == HID_KEYBOARD)
  18. {
  19.  
  20. HID_KEYBD_Info_TypeDef *Keyboard_Info;
  21. Keyboard_Info = USBH_HID_GetKeybdInfo(phost); // get the info
  22. txt_buf[0]=0;
  23. unsigned char i;
  24. for(i=0;i<6;i++)
  25. {
  26. if(Keyboard_Info->keys[i] != OLDKEYS[i] )
  27. {
  28. if (Keyboard_Info->keys[i]==0) {strcat(txt_buf,"UPKEY:"); hex8(txt_buf,OLDKEYS[i]);t[1]=Scan2Char(OLDKEYS[i]); strcat(txt_buf,t);}
  29. else if (OLDKEYS[i]==0) {strcat(txt_buf,"DOWNKEY:"); hex8(txt_buf,Keyboard_Info->keys[i]);t[1]=Scan2Char(Keyboard_Info->keys[i]); strcat(txt_buf,t);}
  30. else {strcat(txt_buf,"ERR:"); hex8(txt_buf,Keyboard_Info->keys[i]); strcat(txt_buf,"-");hex8(txt_buf,OLDKEYS[i]);}
  31. }
  32. OLDKEYS[i]=Keyboard_Info->keys[i];
  33. }
  34. strcat(txt_buf,"\r\n");
  35. user_print_usb( txt_buf);
  36. }
  37. }

Pačiam HID reporte visada transliuojami visi nuspausti klavišai, todėl, jei reikia susiderinti su PS2 ar senesniu standartu, reikia tikrinti, koks klavišas nuspaustas ir koks paleistas. Ta daro ciklas 24-33 eilutėse.
Rezultatas:


UPKEY:12[o]
DOWNKEY:13[p]
UPKEY:13[p]
DOWNKEY:2F[[]
UPKEY:2F[[]
DOWNKEY:30[]]
UPKEY:30[]]
DOWNKEY:31[\]
UPKEY:31[\]
DOWNKEY:04[q]
DOWNKEY:16[s]
DOWNKEY:07[d]
DOWNKEY:09[f]


DOWNKEY:2C[ ]
UPKEY:16[s]
UPKEY:07[d]
UPKEY:09[f]
UPKEY:04[q]
UPKEY:2C[ ]
DOWNKEY:0B[h]
UPKEY:0B[h]

Visas demo softo source code čia: STM32CubeMX USB host HID demo source code.

Nerusiškas auksas

Paprastai šnekama, kad tarbiniai žmonės dėjo daug aukso ant detalių… tačiau spėju, kad dėl savo atsilikimo, męs nematėm vakarietiško aukso.

Čia buvo kažkokia radija ar šiaip hifi. Deja ją sulaužė jau tie, kurie atvežė plokštes į supirkimą. Komplekte dar buvo keturi paprasti NPN tranzistoriai. O dryžuotų buvo daugiau, bet užteko vieno kolekcijai.

Spėju, kad kokie nors 70-tieji metai. Bet darlingtonas macnas- jei čia BD700, tai 70..80V ir apie 8A. 70W išskiriamos galios? Gamintojas Motorola. Mažiukas irgi visas auksinis. Dar patinka, kad ant metalo yra BCE raidelės. Pas mažylį- centrinė koja B, bet tvirtinimo detalė C.

Tranzistoriai gyvi, tačiau kiniškas matuoklis nesugebėjo išmatuoti. O kas per MPS007 aš neradau.

Su Naujais, 2024 metais!

Sveikinu visus su Naujais Metais!

(Nu nepatinka mano telefonui ta bjauri mėlyna spalva. Pakeisti negaliu, o nenaudoti irgi negaliu, nes turiu ekraniukų gal 100 vienetų.)

Ką čia palinkėti? Kaip senas diedas- laimės ir sveikatos! Kaip elektronikos megėjas- mažiau magiškų dūmų, ir nepaimti lituoklio už ne to galo. Kaip kompiuteristas- kad mažiau reikėtu migruoti visą softą į kitos kartos OS. Kaip chemikas- kad nusėstu kai reikia nusodinti, kad ištirptu kai reikia ištirpinti. Kaip megėjas statybininkas- kad nereikėtu bendrauti su tikrais statybininkais.

ARM47 ir PID dalis #4

O dabar pašnekėsim apie STM32F4 serijos variantą ir source code. Pirmiausia- kodėl 4 serija? Todėl, kad tokia PCB pasitaikė po ranka. Ir tikrai ne dėl kažkokio mistinio FPU ar net DSP. Ir dar neaišku, ar mano turimas MCU yra originalas, o ne koks nors permarkiruotas šlamštas. Šaltinis solidus, bet kodėl jie juos išmetė? Reikia surasti kur nors panaudotą procesorių ir palyginti.

Source code yra sugeneruotas su CubeMX programa, kompiliuota su gcc. Ryšiai su kubiko paprogramėm tik per callback. Ir tai tik naudojam USB biblioteką (virtualus COM portas) ir taimerių pertraukimus. ADC skaitom blokavimo režime.

Pats PID skaičiavimas, float variantas visiškai toks pats kaip ir teoriniam variante:

float pid_generic(float measured, float setpoint, float amplif)
{
float output;
float deritative;
float error;
float proportional;
 
error = (setpoint - measured)/10;
proportional = error;
 
integral=integral + error * pid_dt;
deritative = (error - old_error) / pid_dt;
old_error = error;
 
output = (PID_KP * proportional + PID_KI * integral + PID_KD * deritative) * amplif;
 
return output;
}

Atsirado papildomas parametras “amplif” – tai bendro rezultato daugiklis, kaip ir sustiprinimas (ar susilpninimas). Teoriškai tą patį galima atlikti su pagrindiniais parametrais (P, I, D), bet taip lengviau priderinti prie “krosnelės” galingumo: kaitinimas dirba su integer skaičiais, ir PID rezultatas apsiapvalina. Taip prarandam “jautrumą”. Ir dar temperatūros parodymus pasmulkinam- tik dėl koeficientų.

uint32_t CalcTemp(void)
{
uint32_t a;
a=median_filter(adc_read_blocking(ADC_CHANNEL_4));
a=median_filter(adc_read_blocking(ADC_CHANNEL_4));
//a=median_filter(adc_read_blocking(ADC_CHANNEL_4));
// 786 - max t, 0.62V ->1655
// 3529 - kambario t, 2.83V -> 283
return (4096-a)/2; //12 bitų max apverčiam ir pašalinam LSB.
}
 

Dėl ADC blogumo, matuojam kelis kartus, invertuojam (dėl schemotechnikos išėjimas mažėja didėjant temperatūrai) ir pašalinam mažiausią bitą, nes jis rodo kvailystes. Funkcija “median filter” vogta iš interneto. Tai funkcija, kuri teoriškai turi išfiltruoti sporadiškus nukrypimus: jei eina 5, 6, 4, 3, 100 – tai tas šimtas kaip ir ne į temą. Kiek veikia per daug netikrinau. Manau, reikia dar padidinti buferį.

  1. readtemp=CalcTemp();
  2. pwm=PID(readtemp, SETTEMP);
  3. SetPWM(pwm);

O čia pats pagrindinis ciklas, kuris kartojamas sistemingai: 1 – nuskaitom, 2 – paskaičiuojam. 3 – valdom kaitinimą.

Visas likęs source kodas aptarnauja kontrolerio valdymą per terminalą (galima keisti parametrus) ir duomenų išmetimą analizei. Tai tik eksperimentinis variantas- darbiniam trūksta dar visokių apsaugų, normalaus valdymo ir indikacijos. Ir aišku, išėjimas čia PWM, kad tinkama mažam rezistoriui, bet ne tikram šildytuvui. Dar nesugalvojau, kaip padaryti korektiškai proporcinį valdymą realiai rėlei ar 50Hz simistoriniam reguliatoriui. Jei užteks kantrybės, tema bus vystoma.

Pats pilnas STM32F446 PID controller source code skirtas gcc ir kartu CubeMX projekto failas (versija užrakinta posto datai, galimi patobulinimai). Prie papildų- median filter, ftoa ir usb paprogramės. Visa mano kūryba “USER” aplanke.

Pt100 nuskaitymas

PT100 tai termorezistorius, kuris gana tiksliai matuoja temperatūrą. Skaičius 100 sako, kad prie 0℃ rezistoriaus varža yra 100Ω. O raidelės Pt sako, kad pirmieji šio rezistoriaus variantai buvo padaryti iš platinos. Ar dabar ten yra tos platinos aš jau nežinau. Bet seni tarybiniai termorezistoriai viduje turi labai labai plonos platinos vielos. Keičiantis temperatūrai keičiasi ir tos vielos varža.

O kaip nuskaityti tuos varžos omus? Pirmi pasiguglinimai parodo:

schemos

Čia visdėlto blogos schemos… Schema kairėje, jungimas prie mano nemėgiamo arduino. Paduodam elektrą per rezistorių ir matuojam su ADC parodymus. Atrodo kad viskas paprasta? Bet neteisinga- pirmiausia, per Pt100 rekomenduojama srovė iki 1mA. Čia 5.5mA ir pats termistorius jau nuo srovės kaista. Antroje schemoje srovė jau pamažinta ir kad ADC kažką matytu, pastatytas operacinis stiprintuvas (su 31 karto stiprinimu). Kaip ir logiška, bet deja, ne. Pt100 termistoriaus varža kinta tik keliasdešimt omų: prie 100℃ jis 138.5. Matuojant nuo 0℃ iki 100℃ turim tik 38.5Ω pokytį.

Ir dar abi schemos turi kitą problemą:

Paskaičiuojam schemą kairėje: įtampos pokytis ADC kojoje nuo 2.75V iki 2.58V, apie 0.1658V visam šimtui laipsnių. Kad ir koks geras ADC, didžioji jo matavimo dalis bus nenaudojama, o ir rezoliucija nebus labai jau didelė.

Antra schema, atrodo kaip ir geresnė, bet čia ta pati bėda- net po sustiprinimo, darbinis diapazonas nuo 3.04V iki 4.18V, apie 1.14V šimtui laipsnių. Kodėl, o todėl, kad pastovioji dedamoji nuo didžiosios dalies varžos irgi “pasidaugina” su operacinius stiprintuvu.

Ką daryti? Ogi daryti naudojant daugiau rezistorių:

pt100 amplifier

Šis testinis chaosas tai instrumentinis operacinis stiprintuvas LT1167 ir “matavimo tiltas” (Wheatstone bridge) – viršuje, kairėje. Papildomi rezistoriai dar padaro taip, kad diferencinis signalas gautusi virš 2.5V nuo žemės- čia jau LT1167 veikimo specifika naudojant vienpoliarį maitinimą. Dar, išėjimo signalas žemiau 0.6V nenusileidžia- čia irgi specifika, nėra jis rail-to-rail. Naudojant dvipoliarį maitinimą, tokios nesąmonės visiškai nereikalingos.

Šis “tiltas” duoda vieną triuką- taip galima iš schemos magiškai pašalinti “nenaudojamus” omus. Mano tiltas buvo surinktas iš trijų 120Ω rezistorių ir Pt100 termorezistoriaus. Dabar operacinis (čia instrumentinis) stiprintuvas gali žymiai daugiau stiprinti signalą. Testinėje schemoje gavosi kažkur nuo 6V iki 0.6V keičiant temperatūrą nuo kambario (~23℃) iki kažko karšto, bet ne verdančio. Maitinimas rodos buvo nuo 15V vienpoliario, o srovė per Pt100 ribota kažkur 10kΩ varža. (Tai tik testinė plokštė, neskirta naudoti su tikru procesorium).

Dar reikia sukonstruoti tikrą stabilizuotą maitinimo šaltinį (gal su specialia mikroschema) ir galimą viską sumontuoti gražiai. Bet tikslas tikrai nėra toks, tai tik tarpinis straipsniukas prie PID kontrolerio eksperimento.