ARM46: WS2812 RBG LED juostelė kitaip

Prieš septynius metus rašiau apie WS2812 RGB LED juostelę ir kaip ją valdyti su AVR. Naujam projektui kilo mintis panaudoti minėtus diodus pašvietimui. Tingėjau rašyti savo programą LED valdymui, tai pažiūrėjau internetuose kaip rekomenduoja STM32 procikui. Ir pirmieji pavyzdukai buvo su taimeriu, PWM ir pertraukimais. Kažkaip griozdiškai viskas atrodė ir dar mano projekte sunaudoti visi PWM signalai.

RGB LED W2812
(fotkė vogta iš interneto, vėliau pakeisiu)

O gal panaudoti tokius:
LEDas
Turiu visą špūlę tik nežinau kas tai.

Kiek paguglinau giliau ir radau elegantišką sprendimą su SPI. Netgi galimas DMA variantas. Man tereikia valdyti tik 6 diodus, tai DMA nenaudosim. Tiesa, po šio sprendimo lieka SPI CLK koja nepanaudojama. O ir pats SPI sunaudojamas. Principas tame, kad reikiamus signalo intervalus suformuojam su keliais bitais baite. Poto užtenka buferį išpumpuoti per SPI ir WS2812 pilnai viską supranta.
Metodas pilnai vogtas iš interneto, todėl va kopyraitas: “© 2008 – 2022 Martin van der Werff · Groningen, The Netherlands.”. Originalaus puslapio adresas: https://www.newinnovations.nl/post/controlling-ws2812-and-ws2812b-using-only-stm32-spi/.

Failiukai, jei nesinori pačiam spausdinti arba jei originalus puslapis dings: WS2812 SPI gcc C.

ARM45: CAN bus

Iš archyvo ištraukiau “motininę PCB” su nesupjaustytom schemutėm. Tai husqvarnos išmanios žoliapjovės “loop sensor” plokštė. Dabar tas “loop” visiškai nedomina. Prilituojam USB lizdą ir bandom suprogramuoti CAN protokolo siuntėją ir gavėją.
husqvarna loop sensor can usb board

PCB numatytas maitinimas iš CAN jungties, todėl norint maitinti iš USB, reikia pajugti papildomą laidelį. Visą kitą paliekam kaip buvo. Iš aiškių elementų: Texas Instruments TCAN330 čipas ir SPI EEPROM, toliau komparatorius, analoginis multipleksorius ir keletas tranzistorių. Loop ryšiui- ritė laido juodame korpuse.

husqvarna loop sensor can usb board
Perdaryta plokštė jau su ISP jungtimi ir sujungta į grupę per CAN laidus (laidinio telefono kabelis).

USB CAN schema STM32F
Procesoriukas (STM32F302CCT6) turi “hardwarinį” CAN, tai dar ir panaudojus CubeMX sukurtą skeletą darbo nelieka daug. Ryšiui su išoriniu pasauliu nutariau panaudoti USB CDC (serial) įrenginį. Kad viskas veiktu, procesoriaus CLK turi būti kiek aukštesnis nei pagal nutylėjimą sugeneruoja kubikas. Aš pasirinkau 72MHz, maksimumą. Dar, kad nesipjautų pertraukimai, CAN RX1 kiek pažeminau prioritetuose iki “1”.

Apie softą:
CAN siuntimui naudojam HAL paprogramę HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox). TxHeaderyje nurodom kam siunčia ir kokio tipo paketas. TxData- tai max 8 baitai duomenų. TxMailbox- nežinau kas tai, teoriškai “pašto dėžutė” kurioje kabo paketas, kol nėra pristatytas. Kaip jis veikia nežinau ir nesvarbu.

CAN paketo priėmimas kiek įdomesnis. MCU turi kažkiek “hardwarinio” spartinimo, todėl paketų filtrą ir priėmimą galima automatizuoti. Pats priėmimas geriausiai veikia per pertraukimą- gaunam paketą, jį priima ir pakelia vėliavėlę. O toliau jau softas rūpinasi kas bus toliau.
Todėl pirma reikia sukonfiguruoti paketų filtrą:

void can_filter(void) //CAN filtas- tai hardwarinis (softwarinis) paketu filtras, kad duomenys eitu tik reikalingi.
{
CAN_FilterTypeDef canfilterconfig;

canfilterconfig.FilterActivation = CAN_FILTER_ENABLE;
canfilterconfig.FilterBank = 10; // which filter bank to use from the assigned ones??? Kodėl?
//canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //Ziureti kuris yra. Šits kažko neveikė
canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO1; //O šitas jau veikia.
canfilterconfig.FilterIdHigh = CAN_ID_RX << 5;
canfilterconfig.FilterIdLow = 0;
canfilterconfig.FilterMaskIdHigh = CAN_ID_RX << 5;
canfilterconfig.FilterMaskIdLow = 0x0000;
canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
canfilterconfig.SlaveStartFilterBank = 0; // how many filters to assign to the CAN1 (master can)
// doesn't matter in single can controllers
HAL_CAN_ConfigFilter(&hcan, &canfilterconfig);
}

Čia yra niuansų- CAN_FILTER_FIFO0 ir FIFO1.

Ir kitas niuansas RX pertraukimo Call-back:

void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) //RX interrupto callbackas. Gali buti "Fifo0", zr. filtrą ir galimus int.
{
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &RxHeader, RxData);
CAN_MSG_R=1;
}

Matot “CAN_RX_FIFO1” ir “HAL_CAN_RxFifo1MsgPendingCallback”? Fifo0 ar Fifo1 nėra taip paprastai pasirenkamas, o nuo ko priklauso aš pilnai ir nesupratau. Kažkodėl FIFO0 neveikė. Gal buvo per vėlus vakaras ar panašiai. Bet su FIFO1 viskas veikia.

Kitas momentas- pirma sukonfiguruoji, poto paleidi. Jei reikia perkonfiguruoti- pirma stabdom, poto perkonfiguruojam ir poto paleidžiam:

can_filter(); //pirma filtras, poto start
HAL_CAN_Start(&hcan );
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO1_MSG_PENDING);

Visas veikiantis demo source kodas: STM32F302 USB CAN writer reader source code.
Ten dar yra windows console programėlė filtro konfiguracijos testavimui (su source code, ne mano).

ARM44: Netikras flešiukas

Norim imituoti USB Flash diskelį? Jokių problemų su STM32F103.
STM CubeMX programoje pasirenkam turimą procesoriuką, įjungiam USB DeviceFS, middleware sekcijoje pasirenkam USB-DEVICE-Mass Storage Class. Sugeneruojam kodą.

Eima į aplanką “\USB_DEVICE\App” ir redaguojam failą “usbd_storage_if.c”:


#define STORAGE_LUN_NBR 1
#define STORAGE_BLK_NBR 0x28000 / 0x200 //Čia mūsų disko dydis padalintas iš sektorių dydžio. Tai mažas diskelis.
#define STORAGE_BLK_SIZ 0x200 //Čia sektoriaus dydis, 512 baitų

kiek žemiau ieškom skaitymo iš disko procedūros:

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
memcpy(buf, disk + blk_addr * STORAGE_BLK_SIZ, blk_len * STORAGE_BLK_SIZ);
return (USBD_OK);
/* USER CODE END 6 */
}

Tai netikras diskas, todėl skaitysim iš MCU flash atminties, o rašymus į diską ignoruosim. Šioje vietoje paprasčiausiai “memcopy” iš flaš atminties į skaitymo buferį. Atmintis adresuojama baitais, o procedūra užklausinėja sektoriais (blokais). Todėl reikia dauginti iš bloko dydžio.

Toliau reikia sugeneruoti 8″ disketės image. Kodėl? Todėl, kad ji maža ir jos imidžo generatorių galima lengvai rasti internete. Kadangi nemoku su linkeriu prijungti tiesiogiai binarinių failų, tai su savo programa skirta šriftams sugeneruojam C kodą su imidžu.
Diskas tikrai netilps į mažo MCU atmintį, tai reikia kiek pataisyti:


const unsigned char disk[163840]={
0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x57, 0x49, 0x4E, // 00
0x34, 0x2E, 0x31, 0x00, 0x02, 0x01, 0x01, 0x00, // 01
0x02, 0x40, 0x00, 0x40, 0x01, 0xFE, 0x01, 0x00, // 02
...

Sukompiliuojam, supumpuojam į procesoriuką ir:

usb flash disk on STM32F103
Gaunam “Read Only” USB diską. Visus rašymus diskas ignoruoja, todėl Windows per daug nepyksta, nes jai vaidenasi, kad viskas OK. Netgi matom, kad “System Volume Information” susikūrė.

Visas source code (su įžymiuoju penis.jpg):STM32F103 source code for USB mass storage (flash disk)

Kam visą tai naudingą? Ogi, galima prijungti SD diskelį ar SPI flash mikroschemą. Kokius nors duomenis loginti per fatfs į mikroschemą, o kai prisijungiam prie kompo per USB, visi duomenys matosi kaip failai.
O jei mokate gerai programuoti, galima “on the fly” generuoti FAT failų sistemą ir skaityti ar rašyti informaciją. Nereikia jokio softo hoste- visi duomenys matosi kaip virtualūs failai.

Griekas 2

Buvo straipsnis apie Grieką.

Dabar naujas, didesnės rezoliucijos…
Pekino antis griekas

Receptas: viena pekino antis, viena elektrinė orkaitė, viena moteris kuri aptrina prieskoniais tą antį.

Kepimas: Tai riebi antis. Todėl kepti reikia ilgiau. Antis sukišama į kepimo rankovę jau apiprieskoniuota. Ir papūdoma šaldytuve 24…48 valandas. Orkaitė įkaitinama iki 200…220℃ temperatūros. Antis kišama į karštą orkaitę ir kepama apie valandą laiko (skaičiuojant nuo inkišimo). Jei tai maža šaldyta antis, šis etapas kiek trumpesnis. Šio etapo metu nutirpdomi riebalai ir pageltoninama škūra.
Toliau sumažinam temperatūra iki 150…120℃ ir kepama dar apie valandą (mažesnėm trumpiau). Jau galima valgyti, bet kol visi maisto valgytojai susirinks, antį palikti orkaitėje ir kaitinti iki 100℃ (70℃) temperatūroje (hipsterinis lėtas kepimas).
Kol antis kepa, rekomenduojama pakeisti virtuvės čiaupą ir kanalizacijos vamzdžius. Taip greičiau praeis laikas.

Kai susirenka visi prie stalo, ir ypač tie, kurie vėluoja, tada išimam blėką su antim ir atsargiai išimam antį iš kepimo maišelio. Kodėl atsargiai- nes antis linkus subyrėti į gabalėlius. Valgyti karštą ir su mažiau balasto (daržovių).

Rekomenduoja kepti antį krutine į apačią- taip krutinėlė gausis minkšta. Visus riebalus gali išsaugoti ir kepti ant jų visokias bulvytes. O galima ir išpilti į krosnį ir sudeginti.

Mėsai valgyti nereikia peilio- visos dalys išsiardo pačios.

ARM43: Parduoto gyvenimo laikrodis

Bevaikščiojant po …lobyną, pamačiau nerusišką matuoklį. Kodėl jis “nerusiškas”? Ogi todėl, kad jis elegantiškas, gražus, matuoja velniai žino ką ir yra ne rūsiškas. 🙂

Skalė matuoja kažką nuo nulio iki dėvynių. Benešant iš sandėlio kilo mintis. Besidalinant mintimis su žmonėm vienas netgi iškarto pasakė- padarai, perku už 100€. Bet ir pačiam mintis patiko.
9h laikrodis
Tai parduoto gyvenimo laikrodis. Kiekvieną rytą, darbo metu jis rodo nuo 9 ir po truputi mažėja iki nulio. Lygiai penktą valandą po pietų, matuoklio rodyklė priartėja prie nulio ir daugiau nekruta iki kito ryto. Nuotraukoje jis toks nučiupinėtas, nes ką tik pagamintas ir nenuvalytas.
Continue reading →

Oro slėgis- jie tai gali!

Daugelis, kai skraidė lėktuvėliais, pastebėjo oro slėgio kitimą kabinoje kylant ir leidžiantis. Tai kiek susiję su aliumininės dešrelės standumu (erekcija)- reikia palaikyti kažkokį oro slėgio skirtumą, kad palaikyti lėktuvo konstrukcijos stiprumą ir kartu, kad lėktuvo keleiviai neišmirtu. Šią savaitę teko atlikti keturis skrydžius nedideliais atstumais su to pačio modelio lėktuvėliu. Ir trečiasis skydis vos vos neužmušė. Leidimosi metu, po kaip ir įprasto oro slėgio pokyčio, netikėtai pradėjo skaudėti galvą (taip, kad liesti kaktos negalima). Net dabar, po dviejų parų kiek tai skauda. Skaudėjimo metu susiprotėjau pažiūrėti oro slėgį…
barometras
Aišku neištraukiau iš kišenės tokio… Bet pasinaudojau telefono barometru, kuris gal nėra labai tikslus ar kalibruotas. Kalibraciją galima atlikti ir vėliau:
barometrai
963 vs 990 hPa. Tas kairėje kažkada netgi turėjo kalibraciją. Taigis, oro slėgis kabinoje, kai pradėjo skaudėti galvą buvo nežinomas, bet kai skausmas kiek atlygo, tai telefonas parodė 880hPa. Nusileidus ant žemės, oro slėgis buvo 998hPa. Po valandos, jau kito skrydžio metu, aš monitorinau slėgį pilnai… Ir jokio pokyčio nebuvo! Ir ausys lygiai tą patį pasakė. Nuo 998 pripūtė iki 1012 ir leidžiantis išleido iki 1002hPa! Oro slėgis aerouoste buvo 999hPa.
Vadinasi, svoločiai, gali teisingai reguliuoti kabinos slėgį! O ne daryti kabinos išhermetizavimą 1…1.5km aukštyje. O kita mintis- manau mano galva sprogtu, jei įvyktu avarinis išhermetizavimas… nes su amžiumi labai pradėjau jausti žemą slėgį prieš audras. Ne veltui, tiek barometrų turiu.

Ne emuliatorius!

Čia tikrai ne emuliatorius, o multifunkcinis vienetinis instrumentas….
Kažkada rašiau apie Z80 plokštę ir pramoninį kompiuterį. O dabar neturėjau ką veikti ir ištraukiau seną “toolsą”, kiek ji patobulinau ir pademonstruosiu. Tai tikrai ne ZX spectrum emuliatorius, nors jis tai gali daryti:
multifunkcinis Z80 daiGtas: ZX spectrum mode
Aišku taimingai neteisingi, kokios nors prigulnybės nepadarytos. Bet čia ne ZX emuliatorius, o Z80 debug įrankis. Nuo randomu internete jis skiriasi tuom, kad bet kuriu momentu galima bet ką sugadinti- perrašyti procesoriaus registrus, pakeisti RAM turinį (ar ROM), peršokti iš vieno procesoriaus emuliatoriaus į kitą. Čia iš esmės yra du “procikai”: loginis- kuris gal labiau intelio, Zilog režime jis neparašytas iki galo, nes man to nereikėjo. Ir “C-sharp”, tai procikas kurį radau internete.
Continue reading →

Kalibratorius Siemens B1108

Labai retai, bet papuola, kai utilizuojama kokia nors laboratorija ir jos sandėliukas. Prieš kelias dienas tokis įvykis ir prasidėjo. Ir aš išgelbėjau du tokius prietaisiukus:
Siemens B1108
Tai Siemens B1108 termoporų, termorezistorių ir, kas labiau įdomu- ommetrų, voltmetrų ir ampermetrų kalibratorius. Gaila, kad AC įtampą išduoda tik stačiakampę, tai mano “true RMS” volmetras rodo dar kažką, bet kiti tai ne.
Kodėl išmestas? Ogi todėl, kad keturi guminiai mygtukai neveikė dėl senatvės. Išardžiau, nuploviau su spiritu ir veikia.
Turiu du vienetus, todėl vieną, su mechaniniu defektu (nulaužtas, bet nepamestas geltonas žiedas) galiu kam nors padovanoti už kokia nors dovaną. 🙂
Galėsit pasitikrinti savo testerius arba atidaryti termoporų testavimo biznį.

Kad neuždidinti straipsnio, mano testerio testavimas 🙂 komentaruose.