Zobrazují se příspěvky se štítkemčesky. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemčesky. Zobrazit všechny příspěvky

úterý 18. července 2017

Nová tiskárna

18.7.2017
Nadešel čas postavit druhou generaci naší domácí 3D tiskárny. Ta půodní, dnes již historický Prusa i2 z roku 2012, stále věrně slouží, ale technika dost pokročila a rádi bychom tedy i my vylepšili naše možnosti.

 Ostatně, během posledních pár let se k nějakému vylepšení postupně schylovalo, a čas od času jsem nakoupil nové komponenty - tu lineární ložiska tu nové řemeny a řemenice, původně s tím, že pomocí nových komponent vylepším stávající tiskárnu. Zároveň mi bylo líto starou tiskárnu rozebírat, takže jsem se nakonec rozhodl, že postavím novou sakumprásk od začátku. Jde o to aby to byl stroj s tochu lepšími komponenty a tedy přesností a snad i rychlostí tisku. Zatímco stará tiskárna má Wade extruder na 3mm vlákno, nová bude používat 1.75 mm vlákno, protože třímilimetrový standard je doslova na vymření.  Myšlenka je ta, že na staré tiskárně dovypotřebujeme zásobu 3mm plastu a potom ji asi také upgradujeme na 1.75mm extruder. Ale mezi tím by již nová tiskárna měla být v provozu.

    Od minula se svět 3D tisku HODNĚ  změnil. Zatímco před pěti lety skoro nikdo o 3D tisku neslyšel, a i na internetu musel člověk informace pracně dohledávat, dnes je jimi doslova zavalen. Vše co je ke stavbě potřeba se dá snadno koupit na e-bay (ostatně včetně nepřeberného množství kompletních kitů pro stavbu tiskárny).

Mnoho velmi dobře podaných informací o 3D tisku lze najít na stránkách

https://toms3d.org/

a v souvisejícím youtube kanálu. Tom tam má seriál o stavbě levného klonu Prusa i3 mk2 s dřevěným domorobo rámem, včetně zdrojů a cen použitých komponent (vesměs z AliExpres).  

V tuto chvíli je plán pro novou tiskárnu zhruba následující:

- Bude to v podstatě Průša i3 rework, s profesionálně vyřezaným kovovým rámem. Rám jsme koupil na e-bay od jakési litevské firmy: 3dforced. Ten materiál, který používají je jakýsi sendvič ve kterém jsou dva duralové plechy a mezi nimi plast. Tak doufám, že jsem nenaletěl...
- Na e-bay jsem též koupil jsem Ramps elektroniku, to je taková klasika, pro začátek určitě dostačující.
- A dále tamtéž kompletní extruder: Geeetech MK8 extruder Updated Print Heat, řemeny a řemenice GT2 a lineární ložiska LM8UU.  Až budu měnit extruder u staré tiskárny tak si ho vytisknu, k ní by se moderní celokovový extruder asi moc nehodil.

-Pro posun Z-osy pro začátek použiji standartní nerezové závitové M5 tyče, možná časem vyměním za speciální trapezoidální závitové tyče, které se používají na moderních tiskárnách a jsou za nějaké ty stokoruny k dispozici. 
- Hladké 8mm tyče jsem opět objednal u Akrosu (akros.cz) ostatní hutní materiál opět u http://sroubysoukup.cz/. 
-Krokové motory jsem opět objednal u mikronix.cz. Vycházejí v podstatě stejně draho jako na e-bay a je to česká fima. Mimochodem už v současnosti nabízejí kompletní sady motorů pro 3D tisk se slevou. Vůbec komponenty jsou vesměs výrazně levnější než při minulé stavbě.
-Tištěné díly si ovšem vytisknu sám.

Něco již dorazilo, na jiné věci ještě čekám. Zatím se pustím do tištění plastových dílů a až budu mít základní hardware pohromadě, můžeme se s Kryštofem pustit do stavby hrubé konstrukce.

27.7.2017
Dnes dorazil rám a musím říct, že mě trochu zklamal. Materiál je velmi tenký, a obávám se, že tuhost není zdaleka dostatečná. Celková tloušťka sendwiche je pouhé 4mm, což by bylo asi v pořádku, kdyby se jednalo o solidní dural, ale pro senvichovouu strukturu dural-plast-dural to je prostě málo. Podložka pod tiskovou plochu asi bude fungovat, ale rám samotný spíš ne. Uvažuji, že ho rovnou nalepím epoxidem na tlustší překližku, vyříznu kolem přímočarou pilou a následně dobrousím. výhodou stále zůstává přesná poloha předvrtaých děr pro uchycení Z-posunu, která zůstane zachována. 

Extruder a hot end:
Jak již bylo řečeno mám koupený kompletní Geeetech MK8 celokovový extruder a hot-end.  Jedná se o konstrukci typu "direct drive", kdy je hnací rýhované kolečko přímo na ose krokového motoru. V tom se liší od extruderu, který mi věrně slouží na současné tiskárně (Wade extruder), kde je krokový motor převodován do pomala pomocí dvou ozubených kol. Výhodou přímého uspořádání je jednoduchost a kompaktnost a absence vůlí a nepřesností v převodech. Potenciální nevýhody jsou dvě - jednak nižší točivý moment a jednak potenciálně menší rozlišení posunu plastu. Druhý bod zřejmě bude zcela zanedbatelný, při použití 16-ti mikrostepů krokového motoru se snadno dostaneme na více než 100 kroků/mm což je naprosto dostatečné rozlišení.  Potřebný točivý moment bude záležet na seřízení extrudéru a bude se muset otestovat.
Nový extruder má aktivní chlazení horní (studené) části pomocí 12V větráčku. Nicméně na rozdíl od populárního V3D V6 hot endu nemá zvlášť dobře vyřešené tepelné oddělení spodní  horké a vrchní studené části (heat-brake). Vnitřek vodicí trubičky má však teflonovou vložku a ta by podle všeho měla do značné míry fungovat jako tepelná izolace samotného vlákna, takže plast by se měl tavit až ve spodní kovové části těsně nad tryskou. Řešení s použitím teflonu však funguje pouze do cca 250°C, protože při vyšších teplotách se začíná teflon rozkládat. Pro plasty s vyšší tavicí teplotou (například Nylon či polykarbonát) to není dostatečné (pro nylon by to možná mohlo fungovat, uvádí se pracovní teplota hot-endu 240-260°C). Pro tyto účely jsem objednal čínskou napodobeninu celokovového hot-endu V3D V6, který bych rád vyzkoušel pro tyto materiály. Nejspíš pro novou tiskárnu nejdřív použiji hotový MK8 extruder pro otestování (s PLA či ABS plasty) a poté provedu upgrade na celokovový V3D hot end (bude potřebovat i jiný extruder) a MK8 bych výhledově přesunul na starého Průšu 2, až bude přecházet na 1.75mm plast.  

14. 8. 2017
Po několikerém rozhodování jsem se nakonec rozhodl pro stavbu Prusa i3 rework, verzi 1.5. Hlavní důvod je ten, že tento model je postaven na rámu pro Prusa i3 mk1, který mám koupený, takže daleko méně riskuji, že nám něco nebde pasovat. Trochu oříšek byl najít odkazy na .stl soubory pro tištěné části, protože jejich stránka na Thingiverse je zablokovaná. Nakonec jsem je našel na stránce:

https://www.reprap-france.com/support

mají tam též detailní návod na sestavení a oživení tiskárny, což je užitečné.  V tuto chvíli jsme v procesu tištění plastových dílů.  



středa 11. června 2014

Nebojte se AVR assembleru

Následující text jsem napsal již před pár lety pro svou vlastní pořebu jako takový obsáhlejší tahák, protože si po čase věci špatně pamatuji. A také případně pro další začínající programátory mikročipů Atmel. Třeba to bude pro někoho užitečné. 

Stručný úvod do AVR assembleru
Ondřej Votava

Mikrokontroléry Atmel AVR patří mezi velmi rozšířené mikročipy. Staly se mimochodem základem v poslední době velmi populární platformy Arduino. Na nejnižší úrovni se tyto jednočipy programují v AVR assembleru, kde jednotlivé příkazy přímo odpovídají strojovým instrukcím procesoru. Ačkoli pro tyto mikrokontroléry v současné době existují též kompilátory upraveného jazyka c, pomocí nichž lze psát přehledné strukturované programy, poskytuje assembler jednoznačně nejlepší kontrolu daného hardware. Assembler dává možnost určit doslova, co bude procesor vykonávat v každém taktu jeho hodin (u AVR mikrokontrolerů s architekturou RISC v podstatě odpovídá každému taktu procesoru jedna provedená instrukce).

Cílem tohoto dokumetu je poskytnout základní praktické vědomosti s programováním v AVR assembleru pro mikrokontroléry Atmel. Nejedná se o vyčerpávající příručku, ale o nástroj, který by vám měl pomoci dostat se na prakticky použitelnou úroveň pokud možno rychle. Snažím se jednak vysvětlit základní koncepty a zároveň volit nejužitečnější a nejčastěji používanou podmnožinu příkazů a direktiv assembleru s jejichž pomocí je možné začít budovat vlastní programy. Asi nejlepší strategie je začít od jednoduchých příkladů, které lze najít na internetu a ty postupně upravovat a rozšiřovat.

Formáty čísel:

Základní jednotkou ukládání informace u 8-mi bitových mikrokontrolérů je byte o osmi bitech, který reprezentuje čísla od 0 do 255 (binárně 00000000 až 11111111). Větší zhusta používanou jednotkou je tzv. word, neboli slovo, které sestává z dvou bytů, tedy celkem 16 bitů a představuje čísla od 0 do 65535. Číselné konstanty v assembleru mohou být psány v několika různých formátech – jako čísla decimální, binární nebo hexadecimální. Například decimální číslo 162 by v hexadecimálním formátu bylo A2 a v binárním formátu 10100010. Abychom rozlišili mezi těmito formáty, píše se v programu před hexadecimální číslo 0x a před binární číslo 0b. Lze tedy napsat 162 = 0xA2 = 0b10100010. Psaní čísla různým způsobem nemá žádný vliv na to, jakým způsobem je číslo interpretováno překladačem, ale pro čitelnost programu je často výhodnější určitý formát. Nastavení jednotlivých bitů ve vstupním/výstupním registru je jasnější v binárním formátu, zatímco pro provádění matematických operací jsou pro nás sdadnější decimální čísla.

Registry:

AVR mikrokontroléry mají 32 osmibitových paměťových jednotek, kterým se říká registry, a ty jsou přímo přístupné pro CPU kontrolér pro použití v celé řadě instrukcí.
V assembleru jsou jejich původní názvy R0 až R31, nicméně pro lepší čitelnost programu je možné každému registru přiřadit jiný název pomocí direktivy:
.DEF name = Rx

S použitím této direktivy je navíc daleko jednodušší změnit číslo registru používaného pro určitý účel v celém programu naráz, pokud zjistíme, že jiný register by se nám k danému účelu lépe hodil. Tyto direktivy jsou zpravidla umístněny v záhlaví programu, kde si podle potřeby nadefinujeme jména registrů, které pak používáme podobně jako proměnné v jiných programovacích jazycích.

Abychom mohli registry prakticky použít, potřebujeme instrkukce, pomocí kterých je možné do nich zapisovat data, nebo je je naopak z nich číst. Dále potřebujeme provádět logické a aritmetické operace mezi hodnotami uloženými v registrech, nebo také například být schopni poslat hodnoty z registrů na výstupní porty kontroléru. Záhy zjistíte, že registry R0 až R15 se chovají trochu odlišně od registrů R16 až R31. Je to důsledkem architektury AVR procesorů a specifika budou upřesněna pro jednotlivé příkazy, kterých se to týká. Takže začněmě prvním úkolem, tedy přiřazením konstatní hodnoty registru. K tomu se používá příkaz:


LDI Rx, number
nebo
LDI name, number

kde name je název, který jsme přiřadili danému registru pomocí .DEF direktivy. Příkaz LDI lze použít pouze pro registry R16 až R32, nikoli pro R0 až R15. Těmto registrům je třeba přiřazovat hodnotu přesunutím (kopírováním) z jiného registru. K tomu se používá příkaz MOV:

MOV Ry, Rx

Zde je obsah registru Rx přepsán do Ry (hodnota v Rx se nezmění). Je všeobecné pravidlo, že cílový registr (tedy ten registr, kam je zapisován výsledek dané operace, tedy zde Ry) se píše hned za kód instrukce. Abychom zapsali konstantu do registru R0 až R15 lze tedy použít následující příkazy:

LDI R16, 150 ;hodnota 150 je zapsána do R15
MOV R15, R16 ;nyní hodnota 150 se zapíše z R16 do R15

Mimochodem, vše co se v daném řádku objeví za středníkem považuje překladač za komentář. Podle mojí zkušenosti čím víc komentářů tím lépe. Když se budete k nějakému projektu vracet po čase, oceníte, když je kód dobře okomentovaný. A to nemluvím o případech, když máte přepisovat či upravovat kód po někom jiném.

Porty:

Porty představují brány, kterými procesor ovládá další části mikrokontroléru. Například to jsou vstupní a výstupní porty, které ovládají logické úrovně na pinech kontroléru, dále jsou to “control” a “status” registry (poněkud matoucí označení, jsou to funkčně vnitřní PORTY), které ovládají další funkce mikrokontroléru. Některé nejběžnější příklady zde probereme, nicméně je třeba zdůraznit, že takřka vždy je třeba se při programování důkladně seznámit s detaily v manuálových listech daného mikrokontroléru.
Obecně je opět třeba vědět jak zapsat hodnotu do daného portu, případně jak přečíst, jakou hodnotu daný port má. Instrukce OUT slouží k zapsání hodnoty z registru do portu a má následující syntax:

OUT portname, Rx

Všiměte si, že konstatntí hodnotu nelze přímo zapsat do portu, takže k tomu musí být vždy použita dvoupříkazová struktura, jak je ukázáno v příkladu, kde je binární číslo 10101010 zapsáno do výstupního protu D:

LDI R16, 0b10101010 ;load constant to R16
OUT PORTD, R16 ;output register value to port

Zde používáme registr R16 jako pomocný registr, do kterého je konstanta nejdřív zapsána, a odkud se pak převede do portu. Je jakési nepsané pravidlo, že právě R16 je užíván jako pomocný registr pro tyto účely.
Bude užitečné se trochu detailněji zastavit u portů, které ovládají vstupní a výstupní piny mikrokontroléru. Množství vstupních a výstupních portů záleží na specifickém typu mikrokontroléru. Například oblíbený ATMega8 mikrokontrolér má tři porty ozačené jako B, C, D kde porty B a D mají 8 bitů (ovládají 8 pinů) zatímco port C má pouze 7 bitů (tedy ovládá 7 pinů mikrokontroléru). Každý bit těchto portů představuje jeden pin konkrétní pin mikrokontroleru. A každý jednotlivý pin může být použit buď jako vstup, nebo jako výstup (pokud je použit jako vstup, pak lze číst, zda je na tento pin přiloženo napětí, které odpovídá logické 0 nebo logické 1). Pokud je použit jako výstup, je možno ovládat výstupní napětí tak, že buď odpovídá logické 0 nebo logické 1. To, zda je daný pin použit jako vstup nebo výstup je určováno hodnotou zapsanou ve vnitřním registru zvaném “data-direction-register – DDR”, jak je pro port D uvedeno v následujícím příkladu:
LDI R16, 0b00001111 ; hodnota masky se vloží do R16
OUT DDRD, R16 ;write the mask to the DDR of port D.
Bity, které byly v DDR nastaveny jako 1 jsou výstupy, piny nastaveny jako 0 jsou vstupy. Hodnota výstupních pinů se pak dá nastavit opět pomící příkazu OUT, tentokrát do portu, zvaného v tomto případě PORTD:

LDI R16, 0b00001010 ; výstupní hodnoty se vloží do R16
OUT PORTD, R16 ;zápis na výstupní piny portu D.

Na pinech pro bity 3 a 1 se nyní objeví 5V (logická 1), na pinech pro bity 2 a 0 je nastaveno 0V, tedy logická 0.
Pro čtení hodnot na pinech, které byly konfigurovány jako vstupy (a obecně pro čtení hodnot z portů) slouží příkaz IN:
IN R16, PIND ;contents of PIND is transferred to R16

Ještě jedna poznámka k hardwaru vstpů/výstupů. Pokud je I/O port nastaven jako vstup, a do příslušného bitu v PORTX je zapsána hodnota 1, jsou aktivovány takzvané interní pull-up rezistory. Toto je užitečné, když je tento vstup ovládán například tlačítkem připojeným oproti zemi. Pokud je tlačítko stisknuté je na vstupu logická 0 (vstup je uzeměn), pokud není tlačítko stisknuté, interní pull-up rezistor nastaví vstup na hodnotu logické 1.

Základní logické operace: AND, ANDI, OR, ORI

Dvě základní logické operace, AND a OR mají následující pravdivostní tabulky:
AND
A
B
X
1
1
1
1
0
0
0
1
0
0
0
0


OR
A
B
X
1
1
1
1
0
1
0
1
1
0
0
0
V AVR assembleru těmto logickým operacím odpovídají příkazy AND a OR, které provedou příslušnou logickou operaci pro jednotlivé bity ve specifikovaných registrech. Jejich syntax je následující:
AND Ra, Rb
OR Ra, Rb
výsledek operace je podle již zmíněné konvence zapsán do registru Ra. V následujícím příkladu je operace AND použita k nastavení horních čtyř bitů registru na hodnotu 0000, zatímco spodní čtyři byty zůstanou nezměněny:

LDI R16, 0b10101010 ;nacteme hodnotu do registru
LDI R17, 0b00001111 ;toto je “maska” která určuje bity jsou k vynulování
AND R16, R17 ; nulování horních čtyř bitů
;výsledek v R16 bude 0b00001010

Příkaz OR může být použit podobným způsobem k nastavení specifických bitů na hodnotu logické 1, zatímco ostatní bity jsou nezměněny.
Příkazy ANDI a ORI pracují stejným způsobem, s tím rozdílem že druhým činitelem není registr Rb, ale konstantní číslo. Takže uvedený příklad může být také zapsán následujícím způsobem:
LDI R16, 0b10101010 ;načtěte číslo do registru
ANDI R16, 0b00001111 ; vynulují se horní čtyři bity
;výsledek v R16 bude 0b00001010

Větvení programu a podprogramy

Pro efektivní programování potřebujeme struktury pro větvení programu, tedy pro podmíněné a nepodmíněné skoky a volání podprogramů. AVR assembler má pro tento účel celou řadu příkazů. V následujícím výčtu je vybráno pouze několik z nich, které umožní programování širokou škálu bežných případů. Detaily použití všech příkazů pro větvení lze najít v AVR helpu a také v katakogových listech jednotlivých mikrokontrolerů.

RJMP – Relative JuMP

Jedná se o nepodmíněný skok na nové místo v programu, které je označeno návěstím (label) v assemblerovském programu. Nejlépe se to ukáže na jednoduchém příkladě:


looplabel: ;toto je návěstí na které se skáče
RJMP looplabel ;příkaz tvoří nekonečnou smyčku.

BRNE – BRanch if Not Equal (Skoč když není rovno nule)
Je prvním z rodiny příkazů umožňujích podmíněné skoky, neboli větvení programu.
Pokud provedení příkazu, který předchází tomuto podmíněnému skoku má výsledek 0 v cílovém registru (buď přičtením 1 k 255 nebo odečtením 1 od 1) je aktivován bit zvaný Zero-flag v stavovém registru CPU (CPU status register). BRNE příkaz testuje, zda je tento bit aktivován a pokud ne, provede skok na příslušné návěstí.

BRNE label
opět “label” značí návěstí od kterého program pokračuje po provedení skoku. Pokud však je podmínka splněna, t.j. Bit ve status registru je aktivován, program pokračuje následující instrukcí. Opět předvedeme na jednoduchém příkladě.

LDI R16, 0xFF ;do registru R16 nahrajeme hodnotu 255
loop:
DEC R16 ;snížíme hodnotu v R16 o 1
BRNE loop ;pokud hodnota v R16 není 0 skoč zpět na navesti loop

Zde jsme vytvořili zpožďovací smyčku. Délka zpoždění závisí na počáteční hodnotě v registru R16.
Komplementární příkaz k BRNE je BREQ (BRanch when EQual – skoč když je rovno nule) a existuje ještě řada dalších analogických příkazů pro podmíněné skoky. Jejich funkci lze nalézt v katalogových listech. S těmito dvěma se však pro začátek dá celkem vystačit.

SIBS and SIBC
Druhou skupinu větvicích příkazů přestavují SIBS a SIBC (a celá řada dalších, které patří do této rodiny). Podívejme se jak fungují. SBIS znamená “Skip if Bit in I/O space is Set” tedy vynech instrukci pokud je bit na vstupu nastaven na hodnotu 1. Tenot příkaz čte hodnotu bitu n portu X a pokud je jeho hodnota 1, vynechá příští instrukci v programu a pokračuje až tou další. Syntax tohoto příkazu je následující:

SIBS portX, n ;přečte bit n v portu X
RJMP label ;tato instrukce je vynechána poku je bit n 1

Analogicky funguje příkaz SIBC “ Skip if Bit in I/O spce is CLEAR” tedy vynech když je bit n v portu X vynulován. Tyto příkazy jsou například velmi užitečné k testování, kdy je stisknuto ovadací tlačítka na vstupu mikrokontroleru (případně jiný vnější vstup je aktivován).
K dispozici jsou i podobné příkazy, které místo se vstupními/výstupními porty pracují s hodnotami v registrech. Jsou to SBRS a SBRC a mají analogickou funkci a syntax. A na závěr se je třeba zmínit ještě příkaz CPSE (porovnej hodnotu v R1 a R2 a vynech příští instrukci pokud mají stejnou hodnotu). Syntax tohoto příkazu je:

CPSE R1 R2


Podprogramy
Používají se velmi podobně jako v jiných programovacích jazycích. Jejich syntax je snadná. Pro volání podprogramu je použit příkaz:

rcall label

a struktura podprogramu je:

label:
kód podprogramu
ret ;tento příkaz značí konec podprogramu.

Použití paměti pro program k uložení konstantních dat:

Je možné použít část paměti pro program k uložení dat, například pro ascii řetězce či numerické konstanty. Je to výhodné pro data která se často nemění, protože programovací paměť má pouze omezený počet zápisů, výrobce specifikuje 10000. Datový blok lze zapsat přímo do assemblerovského programu pomocí db (data block) direktivy:

label:
.db data1, data2,

Návěstí “label” určuje začátek datového bloku v paměti a je použito při čtení dat z paměti pomocí příkazu LPM (Load Program Memmory – přečti programovou paměť) jak je ukázáno v následujícím příkladu: Do dvoubitového registru Z je třeba načíst pozici návěstí v programové paměti a příkaz LPM potom načte hodnotu z této pozici do registru R0. Následující příklad ukazuje jak je ascii řetězec (kde každý znak je předsavován jedním bytem) přečten z datového bloku a poslán na LCD monitor (pomocí podprogramu lcddat). Datový blok začíná u návěstí “string”:

ldi ZH,high(2*string) ; Load high part of byte address into ZH
ldi ZL,low(2*string) ; Load low part of byte address into ZL
ldi chrcnt, 10 ;number of characters to be read
charloop:
lpm ;load program memory at address in pointer Z to register R0
mov LCDbyte, r0 ;write R0 to LCD byte
rcall lcddat
adiw ZL, 1 ;increase value of program pointer Z by 1
dec chrcnt
brne charloop ;pokud nebyl poslán poslední znak opakujte smyčku
.
.
.
;the data string hello word follows.
string:
.db “Hello Word”

úterý 13. listopadu 2012

účel tohoto blogu

Během léta 2012 jsme spolu se synem Kryštofem postavili 3D tiskárnu na základě informací otevřeného projektu RepRap. Jedná se o projekt, ve kterém účastníci sdílejí nápady a zkušenosti a díky tomu jde vývoj  kupředu.  Vždy když jsme během stavby narazili na nějakou překážku stačilo chvíli bádat po internetu a nalezl jsem buď přímou odpověď, nebo alespoň vodítko, které nakonec vedlo k vyřešení problému.  Bez této pomoci otevřené komunity bychom si tiskárnu nikdy nebyli schopni sami postavit.

Tak a teď mám pocit, že je řada na mě, abych taky alespoň malou troškou přispěl této komunitě.  Tento blog jsem založil, abych na něm publikoval své poznámky, které jsem si průběžně během stavby tiskárny psal. Bylo to původně čistě pro vnitřní potřebu, abych snadno dohledal co, jak a proč bylo uděláno. Napadlo mě, že něco málo z toho by mohlo být užitečné i pro další zájemce o stavbu RepRapu. Velkou většinu toho, co je zde uvedeno je již sice k nalezení jinde na internetu, spousta těch informací je však pouze anglicky a tak to pro někoho přece jen pořád může být trochu bariera. Takže z toho důvodu uvádím své poznámky v češtině, ve které je toho přece jen k nalezení podstatně méně. Pokud z toho něco bude k užitku, budu rád.