Skip to content

GhoUl

A Cubus Sapiens oldal

Folytatódnak kalandozásaink 2072-ben, humorunk egyre árnyaltabb lesz…

JK: Csak annyit tudtam meg, hogy híres vagyok.

Egy JK1 (kalóz) által vízbe visszadobott hal és JK2 (pap) többszöri sikertelen mágiadetekciója után:
JK2: Megfogok valamit, ami nem törékeny, és odavágom a falhoz.
JK1: Kár, hogy most dobtam vissza a halat.

KM: Addig kell, hogy dobj, amíg critical glitch nem jön ki.

KM: (lelkiismeretesen) Előre is elnézést kérek a modulért.
JK: Ööö… azaz ma mind meghalunk?

KM: Minden motoroson két ember ült.

(karakterlap-elemzés)
KM: Neked nagyon jók a fizikához kapcsolódó képességeid.
JK: Mint Einsteinnek? Vagy jól vezetem az elektromosságot?

(túszejtő akció közben)
JK1 (rigger): Átadom VR-ben a drone fegyvereinek vezérlését a fegyverspecialistának.
JK2 (fegyverspecialista, tússzal a kezében): Egy tipp: lehetőleg csak azután tedd, miután bevonszoltam a foglyot a kocsiba…

JK1: Nekem 2 SIN-em van!
JK2: KétSINű…

JK1 (rég eltűnt, de megkerült NJK nagybácsijának): Halálra kerestelek téged!
JK2 (az azóta befutott runner): Mi pedig halálra kerestük magunkat.

Nemrég HMHVV révén keletkezett vámpír NJK egy keresztet szorongat, amit papunknak jó lenne megszereznie:
JK1 (pap a vámpírnak): Segíteni jöttem.
JK2: Segíteni hordozni a keresztjét?
JK1: Mindenkinek megvan a maga keresztje…

Kicsit lassan haladok az önképzéssel, nehezen gyűjtöm össze a megfelelő mennyiségű szorgalmat, hogy a hétköznapi hajtás után egy-egy hétvégén pihenés helyett elővegyem a hardvereket a fiókból. Ezen a hétvégén kivételesen sikerült. Hogy pontos legyek, kezembe került egy inkrementális enkóder, ami (akinek nem ismerős a fogalom) arra jó, hogy forgó mozgás irányát, mennyiségét és esetleg sebességét meghatározzuk.

Az abszolút enkóderekkel ellentétben az inkrementális enkóderek nem képesek megadni a forgás pillanatnyi helyét, segítségükkel csak azt lehet meghatározni, hogy történt-e forgás valamelyik irányba. Viszont jelentősen olcsóbbak, és kevesebb lábat foglalnak el a mikrokontrolleren. Ez sem utolsó szempont, tekintve hogy pár óra kínlódás után rájöttem, hogy a kontrolleremen két láb halott..

Általában véve a forgási enkóderek működését a Wikipedia vonatkozó cikke jobban elmagyarázza, mint én tudnám, így erre nem térek ki részletesen. A lényeg csupán annyi, hogy egy egységnyi forgás alatt két kapcsoló zár az enkóderben egymás után, a forgás irányától függően. Ennek tipikus bekötése active-low jelleggel rendkívűl egyszerű, az enkóder C csatlakozója ráköthető a földre, az A és B lábak számára pedig kiválasztunk két portot a kontrolleren, az én esetemben ez RB6 és RB7 lett. Ezen kívül semmilyen más alkatrészre nincs szükség, hiszen a Pic16F690-es processzor integráltan tartalmaz felhúzó áramkört, ami képes magas szinten tartani az adott portot, és leföldelés esetén biztonságos szinten tartja az áramot.

A feladat tehát a következő: detektálni kell az enkóder kapcsolóinak a zárását, figyelembe véve a sorrendjüket, és ennek megfelelően kell egy változó értékét növelni, vagy csökkenteni. Ha az A kapcsoló zár előbb, és később a B, akkor növelni, ha fordítva akkor csökkenteni kell eggyel a változót. Az általam használt EC12E típusú enkóder 24 diszkrét egységre bont egy kört, azaz 15 fokonként képes érzékelni a forgást, tehát a változó értékét 15-el megszorozva megkapjuk a pontos forgást. Az enkóder mechanikus jellege miatt a használat közben számítani kell pergés előfordulására, aminek a kezeléséről gondoskodni kell.

A mikroprogram gyors időközönként leolvassa a kapcsolók állását, és ez alapján kell eldöntenie, hogy merre forgatjuk az enkóder karját. Mivel figyelembe kell venni a kapcsolók korábbi állapotát is, triviálisan adja magát egy állapotgép-alapú megoldás, ami a pergést úgy küszöböli ki, hogy megengedi az állapotok közötti oda-vissza ugrálást a pergést követve, a pergés stabilizálódásával pedig az állapot is a megfelelő értéken rögzül.

Az állapotgép bemenete a két kapcsoló állása és minden leolvasáskor végrehajt egy lépést:

Az állapotgép megfelelő élei biztosítják, hogy amíg valamelyik kapcsoló pereg, addig a megfelelő két állapot között lépkedjen. Az ábrán pirossal és kékkel jelöltem azokat a lépéseket, mikor is növelem vagy csökkentem a forgást mérő változó értékét.

A programot a gyakorlatban is kipróbáltam, assembly-ben írtam a Pic16F690-hez a kódot, és a pickit2 próbapanelen lévő 4 led segítségével jelzem a változó aktuális értékét:

#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

     cblock 0x20
State		;state machine variable
Display         ;data to be displayed
     endc

     org 0
Start:
	clrf PORTB
     	bsf STATUS,RP0		; select Register Page 1
	bcf OPTION_REG,7
     	movlw 0xFF
     	movwf TRISA		; Make PortA all input
     	movwf TRISB
     	clrf TRISC		; Make PortC all output
     	clrf ANSEL 		; all pins digital

     	bcf STATUS,RP0		; back to Register Page 0
     	bsf STATUS,RP1		; Reg page 2

	movlw 0xFF
	movwf WPUB		; enable weak pull-up for Port B

	bcf STATUS, RP1		; Reg page 0

     	clrf Display
	clrf State

MainLoop:

;state table:
; input	|  000 	|  010	|  100	|  011	|  101	|
;  00	| 		->000			| == always ->000
;  01	|      ->010 	| ->000 | ->010 |->000- | == if state,0 ->000 (dec if 101), else ->010
;  10	| ->100	| ->000	| ->100 |->000+	| ->100 | == if state,1 ->000 (inc if 011), else ->100
;  11	| ->000 | ->011 | ->101 | ->011 | ->101 | == if state,0 ->101, else if state,1 ->011, else ->000

;decide current input: 00, 01, 10, or 11
;note that all input are active low

	btfss PORTB,6
	goto Input0
	goto Input1

Input0:
	btfss PORTB,7
	goto Input00
	goto Input01	

Input1:
	btfss PORTB,7
	goto Input10
	goto Input11

Input11: ;00
	clrf State		;state ->000
	goto Output
Input10: ;01
	btfss State,0
	goto I01B		;if 0xx
	goto I01A		;if 1xx
I01A:
		btfsc State,2	;if xx1
		decf Display,1	; decrement data
		clrf State	;->000
		goto Output
I01B:
		clrf State	;->010
		bsf State,1
		goto Output
Input01: ;10
	btfss State,1
	goto I10B		;if x0x
	goto I10A		;if x1x
I10A:
		btfsc State,2	;if xx1
		incf Display,1	; increment data
		clrf State	;->000
		goto Output
I10B:
		clrf State	;->100
		bsf State,0
		goto Output
Input00: ;11
	btfsc State,0		;if 1xx
	goto IA
	btfsc State,1		;or x1x
	goto IA
	goto Output
IA:
		bsf State,2 	;->uu1
	goto Output

Output:

     movfw     Display       ; Copy the display to the LEDs
     movwf     PORTC

     goto      MainLoop
     end

A dolgot összeállítva minden várakozásomat felülmúlva működött, a forgást pontosan és gyorsan méri, bár csak kézzel forgattam, így nem tudtam letesztelni, hogy mekkora szögsebességet képes még mérni. Mindenestre akár felhasználónak nyújtott bemeneti eszközként is remekül szerepelhet, mindenképpen kifinomultabb megoldás mint pl. egy potméter A/D átalakítóval. Digitális hifiken rendszeresen találkozhatunk ezzel a megoldással hangerő-szabályozás formájában.

Kissé eltűntem az utóbbi időben. Szemlátomást továbbra sem tudom tartani azt a magamnak tett ígéretemet, hogy rendszeresen írjak ide valamit. Mivel várhatóan ez a jövőben is hasonlóan bizonytalan lesz (reálisabban gondolkozva: várhatóan ez a jövőben csak romlani fog :) ), most már nem is próbálkozok efféle ígérettel.

Miért nem írok? Szerencsére nem azért, mert nincs miről írni. Például az utóbbi időben szórakoztam olyan, Eclipse-közeli dolgokkal, amelyeket megérné leírni, hogy később ne a saját kódomból kelljen visszafejteni, miért úgy csináltam. :D Arról nem is beszélve, hogy esetleg másnak is hasznos lehet.

A gondolatot folytatva könnyen eljutok odáig, hogy miért (próbálok) írni. Azért, hogy a gondolataim egy részét összeszedjem. Elsősorban magamnak, de ha van még valaki, akinek segít, annál jobb. És igen, egy bejegyzés mindig kicsit rólam is szól. Még akkor is, ha abszolút technológiaismertető vagy hasonló az egész. Más kérdés, hogy ez írás közben gyakran az én fejemben sem tiszta. De ahhoz, hogy bármit leírjak, alaposabban végig kell gondolni, mint a használatához. És ez segít az én fejemben is egy kicsit rendet tenni. Szóval megéri.

Rövidre zárva: sírást befejezem, írás lesz még, vannak konkrét ötletek (például Command framework vagy buildelés kapcsán), csak idő/energia kérdése, hogy ebből valami kisüljön. Addig is jöjjön inkább egy aktuális, Eclipse fejlesztéshez kötődő tapasztalat.

Egy fejlesztői gép: 1000$. Egy Eclipse fejlesztési környezet: ingyen. A JDT hibaüzenet alapján kitalálni, hogy az EMF modell milyen változtatása nem került fel a repository-ba: megfizethetetlen.

Avagy részletesebben: az EMF egy borzasztó jól megtervezett és integrált környezet. Olyan Java kódot generál, hogy gyorsan kitalálható, pontosan mi változott a modellben… Az én mostani esetemben például a multiplicitás változott. A hibaüzenetekből és a generált Javadocból ez gyorsan kiderült. Bár van negatív oldal is, egy konkrét idézet a generált Javadocból, amivel már az EMF környékén mindenki találkozott:

If the meaning of the ‘Replicas’ containment reference list isn’t clear, there really should be more of a description here…

Ez annyira imádnivalóan undorító. :D Tényleg csak egy smiley hiányzik a szövegből, amin keresztül a számítógép kiröhög engem, mint felhasználót, hogy ezt megetted… Bárcsak eljutnánk odáig, hogy ne az ember legyen a számítógépért, hanem a számítógép az emberért…

Mi tetszik nekem az informatikában? Az, hogy lehetőségem van emberek kezébe eszközt adni, amivel elvégezheti a dolgait. Alkotó folyamat, ami nem öncélú. Kevés felemelőbb dolog van számomra, mint alkotni valamit, amit mások tudnak használni.

Ugyanakkor ezen eszközök készítése két részből áll: van egy része, ami jól szabályozható, átlátható és specifikálható, ehhez nem kell más, mint leülni, és végrehajtani a feladatokat; valamint van egy része, ami kreativitást igényel, senki nem mondja meg, hogy csináld, miért úgy csináld, esetleg mit csinálj, hanem valahogy neked kell eljutni a még nem létező célhoz. Ez persze problémás lehet:

An undefined problem has an infinite number of solutions. (Robert A. Humphrey)

A szabályozható résszel nincs sok probléma, le kell ülni és meg kell csinálni. Más a helyzet a kreatív részével: vagy megvan az inspiráció, az ötlet, a múzsa csókja, vagy nincs. Ha megvan, jó, akkor pillanatok alatt megoldod az előtted lebegő feladatot, ha nincs meg, akkor viszont ülsz felette, és csak nézel.

És ami fontosabb kérdés: mit csinálj akkor, ha köt a határidő, szorongatnak, és nem jön az ihlet? Vagy a másik fele: mit csinálj akkor, ha megjött az évtized ötlete, megvalósítottad, és mindenki téged emel fel? És ezután elvárják tőled, hogy legközelebb is ilyen jó legyél?

Ezzel a kérdéssel foglalkozik Elizabeth Gilbert a TEDTalks előadásán. Egy író szemében a kreativitás kérdése talán fontosabb, mint nekünk, ugyanis ott sokkal korlátozottabb az a rész, amit csak meg kell csinálni. Az ő véleménye, hogy az ötleteket úgy kell kezelni, mintha azokat egy külső entit isteni lény adná – ez volt az ókori görögök és rómaiak megoldása. Ezzel ugyan siker esetén kevésbé emelik fel az embert, de a kudarc esetén sem egyedül az alkotó a felelős.

Ez egy érdekes álláspont – ugyanis a modern, “gondolkozó” ember számára azt állítani, hogy a gondolatai (amik Descartes számára az egyetlen biztos pont a világegyetemben) külső forrásból jönnek. Ugyanakkor a gondolat biztosan nem alaptalan, hiszen egy közös brainstorming remek módja annak, hogy az ember “ihlethez” jusson, és kitalálja, mit akar csinálni. És ilyen esetben sem valami abszolút logikus, levezetett álláspont kerül elő, hanem egy közös ötletgyűjtés, ami segíthet abban, hogy valami sikeres dolog jöjjön ki belőle.

Ugyanakkor, mivel az ötletek forrása nem ismert, ha az ember jobban boldogul azzal, hogy valaki külső, nem látható lényt képzel neki, akkor érdemes azt csinálni. Sok érdekes dolog kijöhet belőle. Eddig úgyis csak azt csináltam egy probléma esetén, hogy addig nézegettem, amíg valahogy meg nem láttam, mit lehet vele kezdeni.

Mindenesetre Elizabeth Gilbert megközelítése tetszik: tegyük oda magunkat, végezzük el a munka ránk háruló részét, és reménykedjük, hogy a múzsánk is megteszi a magáét. Nektek van esetleg más ötletetek az inspiráció kezelésére?

Életünk első kalandozása a Shadowrun világában, mely egy ártatlan bevásárlásnak indult, és amelyben sajnos minden NJK-nak volt neve. Featuring: Timi hangokat halló kalóza, TeoZ gremlin-elf adeptje, D-nee tárgyalóképes fegyverspecialistája, Overander figyelemelterelő covert ops specialistája, Eversong troll riggere, és természetesen Stampie, mint egykor ember KM.

JK1 (gremlins negative qualityvel): Nem csoda, hogy nincs commlinkem.
JK2: Persze, hiszen gremlin vagy.
JK1: Nem gremlin vagyok, hanem elf.

JK (rigger): Milyen messze vagyunk a kocsimtól?
KM: (hasból) …1 km-re.
JK: Pont 1 km a hatótávolságom!

JK1: Ott valaki mozog.
JK2: (miután perception testre dobott critical glitch folytán képzelődött) Én meg hangokat hallok!

JK: (NJK-król) Vagy egyszerűen nem álltak le gondolkodni.
KM: Túl sok az augmentation…

JK1: (két kétajtós szekrénnyel való harc közben) Mekkora egy szekrény sebzése?
JK2: Ez egy gyenge idegzetű szekrény.

JK: (miután elintéztük az összes ellent, de erről a karakter nem tudhatott, csak a játékos) Én felkiáltok, hogy nincs több… szerintem.

NJK: (frissen megmentve, félelemmel a hangjában) Kik vagytok ti?
JK: Shadowrunnerek, akik éppen most fejezték be első moduljukat.

Intelligencia – a telligencia ellentéte.