pondělí 16. března 2015

Když podložka nelepí

Na různých fórech o 3D tisku se toto téma vyskytuje poměrně často, a zdá se tedy, že je to jednou z Achylových pat našich domácích plastových továrniček na blbiny. Občas se prostě stane, že se tisknutý předmět v půlce uvolní a začne nám volně putovat po podložce. Nebo se nám začnou odlepovat a nadzvenávat růžky a celý předmět se vám nepěkně zkroutí. Je to protivné, zvláště když chcete tisknout větší, časově i plastově náročnější výrobky.  Dlouho jsem s tímto problémem bojoval a nedáno našel řešení, které velmi výrazně pomohlo.

Když jsem začínal před pár lety s tiskem na nevyhřívané podložce, čítal jsem často, že vyhřívaná podložka je jasným řešením - výrobky se přestanou kroutit a budou na podložce skvěle držet. Jenže jak se zdá, skutečnost je trošku složitější. Dnes má vyhřívanou podložku drtivá většina domácích 3D tiskáren (včetně té naší) a přesto se volání o pomoc u problémů s přilnavostí k podložce ozývá po internetu znovu a znovu.  A je zajímavé, že rady, které se z internetu ozývají zpět, nejsou dodnes tak jednoznačné, jak by si člověk myslel.

Následující řádky vycházejí z mojí vlastní zkušenosti a týkají se výhradně tisku pomocí plastu PLA, jelikož ABS jsem zatím nikdy nepoužíval. V některých bodech se zhruba všichni shodnou a i z mojí zkušenosti na nich opravdu záleží:

Každopádně záleží na dobrém nastavení výšky trysky nad podložkou při tisknutí první vrstvy. Podložka musí být perfektně rovnoběžná s pohybem tiskové hlavy. Výšku nastavuji tak, aby při pozici tiskové hlavy v nejnižší poloze byla tryska na tloušťku kancelářského papíru nad podložkou. To znamená, že když vložím proužek kancelářského papíru mezi podložku a hlavu a spustím tiskovou hlavu do nejnižší polony, musí prožek mírně drhnout, ale jít posunovat. Při tisku první vrstvy by měl plast vytvářet vlákno v průřezu sploštělé, nikoli kulaté (jak se vytlačuje do úzké štěrbiny mezi trysku a podložku. V žádném případě by nemělo být na podložku pokládáno z výšky (tryska by tedy neměla být výš než je její průměr). Kontrola a nastavení výšky trysky nad podložkou by se měla stát pravidelnou rutinou před tiskem, při troše praxe nezabere příliš času. 

Množství plastu hraje také důležitou roli pro adhezi k povrchu. Jednotlivá vlákna plastu by k sobě měla akorát přiléhat a spojit se tak v jednolitou plochu. Zároveň by se nemělo vytlačovat plastu víc, protože pak je povrch nerovný tryska ryje do již vytištěného plastu a v následujících vrstvách pak může tryska drhnout o nerovnosti v již zatuhlém plastu.  Je třeba si uvědomit, že množství vytlačovaného plastu je třeba optimalizovat pro každou novou várku plastu, kterou používáte. Stačí celkem malý rozdíl v průměru vlákna aby se znatelně změnilo množství vytlačeného plastu na jednotku jeho délky. Osobně mám pro každou roli plastu zvláštní profil nastavení v Sliceru, kde zohledňuji průměr a teplotu tavení toho kterého konkrétního plastu.  I různé barvy od téhož dodavatele se mohou v těchto parametrech znatelně lišit.

Teplota první vrstvy by měla být o trochu vyšší než u následujích vrstev, osobně používám cca 5°C rozdíl mezi první vrstvnou a těmi následujícími, což lze specifikovat ve Sliceru. Opět platí, že každý plast je trošku jiný a tiskovou teplotu je třeba pro něj optimalizovat. Teploty pro různé PLA plasty se mohou lišit i o více než 10°C.

Moje zkušenost je ta, že vyhřívání podložky NENÍ jednoznačné řešení pro odlepující-se tisky.  Dokonce bych řekl, že za určitých podmínek výrobky na studené podložce drží lépe než na vyhřívané.  Je fakt, že moje současná podložka má poněkud menší vyhřívací výkon, než bych si přál a jen obtížně ji zahřívám na obecně doporučovaných cca 70°C (pro PLA plast). Většinou pracuji při 55°C - 60°C a při těchto teplotách mi tisky opravdu držely špatně.  Vyhřívání však jednoznačně snižuje kroucení tisknutých předmětů a je dobré ho používat.

Modifikace povrchu pomocí PVA lepidla
Osobně mám smíšené zkušenosti s tiskem na čisté sklo. Libovolné leštění a odmašťování v mém případě nikdy nevedlo ke spolehlivé adhezi PLA plastu. A zajímavé je, že některé barvy PLA drží lépe než jiné, ale velký rozdíl to není. Při tisku na studenou podložku jsem dlouhou dobu používal roztok kalafuny v lihu pro zlepšení lepivosti povrchu, ale ani s ním to nebylo spolehlivé.  Na internetu je možné najít různé rady jak modifikovat povrch skla pro lepší adhezi. Mezi nimi dominují dvě metody: první je nasříkat podložku lakem na vlasy (levná varianta prý funguje nejlépe), druhá je natřít povrch PVA (Poly Vinil Alkohol) lepidlem, což je bílé vodou ředitelné lepidlo na dřevo a papír, dříve známé jako Herkules, dnes od mnoha různých výrobců. Před nedávnem jsem vyzkoušel tuto druhou metodu s výbornými výsledky, tak ji mohu doporučit ostatním (bez záruky). Sklo jsem rovnoměrně potřel vrstvičkou PVA lepidla mírně naředěného vodou. Když se naředí moc má tendenci na skle tvořit kapičky místo souvislé vrstvy, v tom případě zapněte vyhřívání podložky a trpělivně roztírejte lepidlo (stačí prstem, není to žádný hrozný jed) dokud nezhostne natolik, že vytvoří rovnoměrnou vrstvičku. Nechte dobře zaschnout a můžete tisknout. Při tisku na 55°C podložku drží tisky zatím zcela spolehlivě a to i celkem velké, které jsou obecně problematičtější.  Drží dokonce tak dobře, že po skončení tisku je toršku problém je odloupnout. Počkám až vychladne výrobek i podložka a potom s použitím mírné síly a různého kývání a kroutění tisk odloupnu. Zatím se vždy zadařilo pez poškození čehokoli vytištěný předmět uvolnit.  Velkou výhodou PVA nátěru je, že NENÍ POTŘEBA HO PO KAŽDÉM TISKU OBNOVOVAT.  Na mém prvním nátěru jsem již vytisknul cca 5 různých tisků a stále drží jako nový.



Lak na vlasy jsem nezkoušel, představa stříkání laku ze spreje v blízkosti ložisek a krokových motorů ve mě po pravdě řečeno vyvolává obavy.  Aplikace PVA je velmi jednoduchá a náklady v podstatě nulové (spotřeba pár kapek na podložku).



   s přáním mnoha zdařilých tisků Ondřej a Kryštof

středa 18. června 2014

První vážná porucha

Tak po takřka dvou letech vcelku bezproblémového provozu se nám poprvé na tiskárně něco vážněji porouchalo. V sobotu jsme s Kryštofem zkoušeli tisknout jednoduchou helikoptéru na gumu, když tu přestal fungovat posun vlákna v extruderu. Krokový motor se přestal otáčet. Ostatní osy chodily. Zkoušel jsem zda jsou v pořádku kabely a konektory tím, že jsem přepnul extruder na jiný pololu driver a zkusil s ním pootočit. To fungovalo, takže krokový motor a jeho kabel není ten problém. Jak jsem tak prohazoval kabílky ke krokovým motorům všiml jsem si, že když se dotknu 5V regulátoru, krokové motory se občas divně cuknou. Pak se chvíli zdálo, že se tiskárna umoudřila. Ale za chvíli se symptomy vrátily a ještě výrazně zhoršily, a posléze přestaly komunikovat všechny krokové motory. Tiskárna se občas přihlásila k PC, a občas se jevila jako úplně mrtvá.

   Zkoušel jsem nejdřív přeletovat 5V regulátor (říkal jsem si, že tam může být špatný kontakt), posléze jsem ho pro jistotu zcela vyměnil za nový LM7805. Tiskárna se nyní regulerně hlásí k PC a komunikuje s ním (takže dost možná prapříčinou problémů přece jen mohl být vadný regulátor). Je možné nastavit a stabilizovat teplotu jak pro extruder, tak pro podložku. Když se však pokouším pohnout krokovými motory chová se to velmi zvláštně: Příslušný motor se sice dá do pohybu, nicméně rychlostí asi tak jeden mikrokrok za sekundu, a pokračuje ve svém pohybu donekonečna. Zkoušel jsem vyměnit pololu/stepstik destičky za jiné, které shodou okolností mám v šuplíku - žádná změna.

  Takže se zdá, že v  řídícím mikrokontroleru Atmel ATmega644 nějakým způsobem běží firmware (procesor tedy není docela mrtvý), ale nekomunikuje dobře se stepstick/pololu drivery. Může to být, že se z nějakého důvodu poškodil částečně hardware Atmelu, takže program uvnitř běží, ale vstupní/výstupní porty nemají správné napěťové úrovně.  Nedá se ani vyloučit, že se část firmware (např. obsah eeprom??) poškodila. Problém může být i s dalším hardare na desce Sanguinololu.

  Takže plán útoku je následující:
  1) Zkusím přeprogramovat firmware ve stávajícím procesoru
  2) Pokud to nepomůže koupím nový ATMega644, nahraju do něj bootloader a firmware.
  3) Pokud nepomůže ani to, koupím celou novou desku Sanguinololu

  Samozřejmě jsem při té příležitosti zjistil, že nemám zálohovanou aktuální verzi firmware, která nám v tuto chvíli tiskárnu řídí. Totiž, v počátečních stádiích vývoje tiskárny jsem měl veškerý software na jedné fleshce, protože jsem používal k ovládání tiskárny netbook mojí manželky a nechtěl jí tam nechávat software na pevném disku. Když jsem pak ovládací software migroval na Ubuntu linux, byl již firmware nahraný a tak jsem aktuální verzi Arduino zdrojových kódů na tento počítač nezkopíroval. No, a fleshka se za ty dva roky někam zatoulala.
    Trik je v tom, že ten firmware byl poněkud modifikovaná verze oproti stažené varianě Sprinteru. Jednak jsem ji modifikoval, aby bylo možné firmware nahrát na ATMega644 a navíc jsem přídával podporu pro thermistor s pozitivní teplotní závislostí (KTY84).  Ty první modifikace jsem měl ještě jakž takž popsané v poznámkách o stavbě tiskárny (viz jeden z předchozích blogů), modifikaci pro thermistor však už ne tak docela (Mám tam vtipně poznamenáno, že to není tak triviální jak jsem si původně myslel, a že si snad udělám poznámky později. Neudělal...).

  Takže jsem se musel znovu ponořit do trošku nepřehledného zdrojového kódu Sprinteru a provést odpovídající změny: Naštěstí se snad ukazuje, že přece jenom co člověk již jednou dělal v paměti částečně uvízne, takže to nebylo tak bolestné, jako poprvé. I když jistotu, že jsem to udělal správně ještě nemám, to budu vědět až teprve když firmware úspěšně nahraji a tiskárna opět poběží.

   Ale abych podruhé neudělal úplně tu samou chybu, pokusím se alespoň nahrubo dokumentovat postup:

Pro doprogramování podpory pro KTY84 bylo potřeba provést změny v následujících souborech:
  Configuration.h
  heater.cpp
 thermistortables.h

V souboru Configuration.h:
   pouze přidáme do poznámky u nastavení termistorů, že varianta 8 odpovídá KTY84 NTP termistoru:

 //// Thermistor settings:
// 1 is 100k thermistor
// 2 is 200k thermistor
// 3 is mendel-parts thermistor
// 4 is 10k thermistor
// 5 is ParCan supplied 104GT-2 100K
// 6 is EPCOS 100k
// 7 is 100k Honeywell thermistor 135-104LAG-J01
// 8 is KTY 84 positive slope thermistor. Added O.V. 2014
#define THERMISTORHEATER 8  //extruder uses KTY84 thermistor
#define THERMISTORBED 4


V heater.cpp:
Je potřeba upravit rutiny ve kterých se čte analovová hodnota z termistoru:
     pro extruder:

  #ifdef HEATER_USES_THERMISTOR
    current_raw = analogRead(TEMP_0_PIN);
    #ifdef DEBUG_HEAT_MGMT
      log_int("_HEAT_MGMT - analogRead(TEMP_0_PIN)", current_raw);
      log_int("_HEAT_MGMT - NUMTEMPS", NUMTEMPS);
    #endif
   
    // When using NEGATIVE SLOPE thermistor (option 1-7), when the heater is colder than targer temp, we get a higher analog reading than target,
    // this switches it up so that the reading appears lower than target for the control logic.
    if (THERMISTORHEATER != 8) current_raw = 1023 - current_raw;  //O.V. 6/2014 this needs to be skipped for positive slope thermistor such as KTY84



    pro podložku:

  #ifdef BED_USES_THERMISTOR
 
    current_bed_raw = analogRead(TEMP_1_PIN);  
 
    #ifdef DEBUG_HEAT_MGMT
      log_int("_HEAT_MGMT - analogRead(TEMP_1_PIN)", current_bed_raw);
      log_int("_HEAT_MGMT - BNUMTEMPS", BNUMTEMPS);
    #endif              
 
    // If using NEGATIVE SLOPE thermistor (THERMISTORBED value 1-7), when the heater is colder than targer temp, we get a higher analog reading than target,
    // this switches it up so that the reading appears lower than target for the control logic.
//  current_bed_raw = 1023 - current_bed_raw;  //commented out by O.V. 6/2014
    if (THERMISTORBED!= 8) current_bed_raw = 1023 - current_bed_raw; //swithch the value only for options 1-7. Modified O.V. 6/2014


V thermistortables.h:
musíme nadefinovat novou kalibrační křivku pro KTY 84. Tím, že jsme v heater.cpp vynechali pro KTY84 termnistor opraci  current_raw = 1023 - current_raw, chová se tento termistor vzhledem k programu stejně jako termistory s negativní teplotní závislostí. Kalibrační křivka musí být tedy napsná tak, že se vzrůstající tepltou hodnota klesá. Konkrétně pro 4.7kOhm odpor v serii s KTY84 termistrem dostáváme kalibrační křivku (první sloupec je digitální hodnota, druhý je teplota v C):

#if (THERMISTORHEATER == 8) || (THERMISTORBED == 8) // KTY84 positive slope thermistor (-55C to 300C)
#define NUMTEMPS_8 32
const short temptable_8[NUMTEMPS_8][2] = {
   {662,    300},
   {670,    290},
   {678,    280},
   {687,    270},
   {696,    260},
   {706,    250},
   {715,    240},
   {725,    230},
   {735,    220},
   {744,    210},
   {754,    200},
   {763,    190},
   {773,    180},
   {782,    170},
   {792,    160},
   {801,    150},
   {811,    140},
   {820,    130},
   {829,    120},
   {838,    110},
   {847,    100},
   {856,    90},
   {865,    80},
   {873,    70},
   {882,    60},
   {890,    50},
   {898,    40},
   {905,    30},
   {909,    25},
   {913,    20},
   {920,    10},
   {927,    0},  //safety

};
#endif

a konečně doplnit položky v seznamu termistorů pod kalibračními tabulkami:
    pro extruder:

#elif THERMISTORHEATER == 8
#define NUMTEMPS NUMTEMPS_8
#define temptable temptable_8


   a pro podložku:
#elif THERMISTORBED == 8
#define BNUMTEMPS NUMTEMPS_8
#define bedtemptable temptable_8


Takže nakonec to není ani tak moc složité. Snad jsem na nic nezapoměl.

27.6.2014
Docela dlouho mi trvalo, než jsem se dostal k další práci na tiskárně. Teprve předvčírem večer jsem měl pohromadě čas, dostatek životní energie a elánu, flash-disk s potřebnými soubory (který jsem předtím opakovaně zapomínal v práci...) a Bětčin notebook, který jsem používal k uploadování firmware do Sanguinololu již v minulosti. Postup prací byl následující:

  1) Připojil jsem Sanguinololu s původním procesorerm přez 6-ti pinový ISP konektor a můj paralelní programátor k Ubuntu počítači (který jako jediný z našich domácích počítačů stále má paralelní port) a pomocí PonyProg2000 software přečetl paměť procesoru. To se zdařilo napoprvé a z toho jsem usoudil, že alespoň částečně je Atmel stále naživu.

2)  Vycházel jsem však z teorie, že odešly vstupy/výstupy, pomocí kterých Atmel komunikuje se stepstick drivery. Vyměnil jsem tedy v Sanguinololu starý Atmel za nově zakoupený ATMega644 (GME electronic Praha, cca 225kč) a opět přes PonyProg do něj prve stažený obsah paměti starého čipu nahrál (příkazem "Write all"), což opět proběhlo bez problémů. Následně jsem připojil některé krokové motory z RepRapu a zkusil jimi pomoví Pronterface otočit. Bohoužel Sanguinololu s novým Atmelem se choval nachlup stejně jako s tím starým.

3) Přikročil jsem tedy k uploadování nové verze Sprinter firmaware s výše popsanými úpravami. Díky tomu, že jsem dříve do nového čipu nahrál obsah paměti toho starého, nemusel jsem již nahrávat bootloader. Upload se zdařil bez větších zádrhelů.  Při opětovném testování krokových motorů se mi podařilo roztočit extruder. Opatrně jsem otestoval též teplotní stabilizaci trysky (nebyl jsem si 100% jist, že jsem správně naprogramoval podporu KTY84 termistoru). Vše se zdálo v pořádku, tak jsem popřipojoval všechny ostatní konektory a upevnil Sanguinololu zpět na tiskárnu.

4) Otestoval jsem pohyby všech os. Extruder běžel korektně oběma směry, nicméně X, Y, Z osy šly jen na jednu stranu. To mě chvíli mátlo, nicméně po troše testování jsem zjistil, že je to způsobené nastavením detekce dorazů ve firmware: Pro mechanické spínače je potřeba v souboru Configuration.h změnit false na true v následujících řádcích:

//If your axes move in one direction ONLY when the endstops are triggered, set [XYZ]_ENDSTOP_INVERT to true here:
const bool X_ENDSTOP_INVERT = true;
const bool Y_ENDSTOP_INVERT = true;
const bool Z_ENDSTOP_INVERT = true;

Poté už osy běhaly ochotně oběma směry.

6) Nastavil jsem motory osy Z tak aby opět byla tryska stejně vysoko nad podložkou na obou stranách základny. Během zkoušení a testování jsem totiž jednu stranu vytočil o trochu výš než druhou, takže mi jezdila trošku nakřivo. Testování provádím pomocí tenkého proužku kancelářského papíru, který zasunu mezi trysku a podložku, když je tryska v dolní pozici.  Nastavuji dorazový vypínač na jedné straně a pozici Z-motoru na opačné straně tak aby na obou stranách byla tryska v takové pozici, že papírek mírně drhne mezi tryskou a podložkou, ale lze s ním pohybovat (to znamená tryska nesedí na podložce celou vahou)

7) Vytiskl jsem jednoduchý testovací objekt, abych se přesvědčil, že vše opět pracuje jak má. Možná bude ještě potřeba doladit teplotu trysky, protože současná kalibrační křivka pro KTY84 není možná totožná s tou, kterou jsem tam měl dříve (originál se nezachoval ...)

TAKŽE JSME OPĚT V TISKNOUCÍM MODU, SLÁVA!!

Co se vlastě přihodilo úplně přesně nevím.  Zdá se, že nakonec chyba dost možná byla ve firmware, který se částečně přemazal (???). Dalo by se to potvrdit tím, že bych do Sanguinololu opět dal starý Atmel, nahrál do něj nový firmware a vyzkoušel zda bude fungovat.  Ale v tuto chvíli se mi do toho nechce, když vše funguje. 



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”

čtvrtek 31. října 2013

Vyhřívaná podložka - Heated print bed

Konečně jsem se dostal k tomu abych naši 3D tiskárnu vybavil vyhřívanou základnou. Dosud jsme tiskli na nevyhřívané sklo, nicméně i při použití PLA plastu to je problematické řešení a tištěné díly se často odlepovaly a kroutily. Podle všech dostupných informací vyhřívání základny tento problém dobře řeší. Pro tisk pomocí ABS je pak vyhřívaná základna nezbytností.

Na internetu je nespočet návodů jak realizovat vyhřívání podložky. Kdo ví co se sluší a patří, používá komerčně dostupnou vyhřívanou základnu na principu  plošného spoje, například MK1 vyvinoutá Josefem Průšou a její pozdější modifikace. Takové řešení je elegantní, spolehlivé, ale musíte sáhnout pro pár stovek do kapsy (rychlý průzkum trhu ukazuje $15 -$20 plus DPH plus doprava...). Existují různá amatérská řešení, například pomocí sady výkonových rezistorů na hliníkové základně. Nicméně většina z těchto řešení nakonec není o tolik levnější než profi PCB základna. Další nevýhodou často bývá nezanedbatelná výška celé sestavy, která ve výsledku ubírá z rozsahu pohybu v ose Z (vezmete-li síť výkonových rezistorů a nalepíte je zespoda na hliníkovou základnu o tloušťce pár milimetrů ztratíte zhruba 1cm výšky).  A konečně taková řešení jsou i nezanedbatelně těžká, což je též nežádoucí, protože to zbytečně zvyšuje síly při rozjezdu a zastavování platformy v ose Y a to vede k nepřesnostem v tisku.

Takže jsem chtěl vyzkoušet něco opravdu jednoduchého, levného, kompaktního a lehkého, přitom zároveň funkčního a spolehlivého. Příliš mnoho protichůdných požadavků? Myslím, že jsem nakonec přišel na řešení, které je spňuje. Jako odporový topný člen jsem použil obyčejný tenký smaltovaný měděný drát o průměru cca 0.2mm, jaký se používá na vinutí cívek a transformátorů. Ten jsem v dostatečné délce cik-cak nalepil zespoda přímo na skleněnou tiskací základnu pomocí vysokoteplotní kaptonové pásky.  Jak ukazuje fotografie, umístnil jsem při výrobě skleněnou desku na kus pěnového polystyrenu a zapíchal po obou stranách řadu špendlíků a drát natahal mezi nimi sem a tam. Poté vzniklou mřížku přilepil přímo ke sklu pomocí kaptonové pásky. Odpor takto vzniklé topné mřížky lze doladit podle tloušťky drátu a jeho délky.  Volil jsem celkový odpor cca 4Ohm, což při napájení 12V dá proud 3A a topný výkon cca 36W. To se ukazuje jako dostatečné přinejmenším pro vyhřívání na 60°C pro PLA tisk. Vývody jsem ke smaltovanému drátku přiletoval a zajistil proužkem kaptonové pásky ke hraně skla.
    Nakonec jsem přímo do středu skeněné desky umístnil termistor a opět ho přilepil pomocí proužku kaptonové pásky. Nakonec jsem do všech 4 rohů přilepil kaptonem obdélníky z 2mm silného kartonu a na ně dal proužky z oboustranně lepicí pásky, kterou je základna přilepená přímo na překližku v tiskárně. Topná mřížka i termistor jsou tedy přilepené zespoda na skle a tiskne se na vrchní stranu. Druhá fotografie ukazuje vyhřívanou základnu již zabudovanou v tiskárně. Mezery mezi podpůrnými kousky kartonu jsem ještě opatrně vyložil kousky složených papírových kapesníků, které fungují jako tepená izolace a zabraňují proudění vzduchu pod sklo a jeho ochlazování. Ale fakticky, myslím že to není tak docela potřeba.



Věnoval jsem tomuto projektu jedno odpoledne a dosavadní předběžné zkušenosti jsou velmi dobré. Základnu vyhřívám pro PLA tisk na 60°C. Sklo pouze před tiskem vyčistím lihem, žádná další úprava povrchu není zapotřebí. Tištěné díly drží velmi dobře dokud je základna vyhřívaná, zkoušel jsem je po ukončení tisku odloupnout, ale bez použití větší síly než malé se mi to nedařilo. Nicméně, když se pak základna nechá vychladnout díly samy odskočí od základny. Velmi pohodlné.

Podtrženo a sečteno, náklady byly v mém případě velmi nízké, protože špulku smaltovaného drátu i kaptonovou pásku jsem již měl v šuplíku. Výsledek je více než uspokojivý.

pátek 27. září 2013

Scientific prototyping with 3D RepRap printer.

One of the reasons for building the 3D RepRap printer was to use it for what I would call "Rapid Scientific Prototyping":  In my research I spend fair amount of time desingning scientific instrumentation and for that very often we need custom mechanical components. While our institute has fairly decent machine shop that makes such custom components for us, however it is fairly SLOW process: I have to make reasonably detailed and accurate drawing and description of what I need, talk to the shop staff and then submit a request. Then it takes couple of weeks (or longer) before the parts come back.

The problem is that often I do not quite know at the begining exactly how the part should look. I come with the best design I can think off, but often only after the pieces come back and I test the device I find out that some modifications will be needed. So it is back to the drawing.... With two or three itterations needed to make the design really work, it can take months before the job is done.

Therefore, at least for the early stages of the development we absolutely need a fast prototyping method, that would allow us to build work-shift first version of the device that that would allow us to figure out what exactly is needed in the final version. We need to test it, rebuild it, abuse it, until we are sure we know what we need. And exactly for this purpose the plastic 3D printing is a great help.  It is NOT by any means an universal solution, as the capabilities are rather limited at this point (the parts can not be too big nor too small, the mechanical properties of the plastic are not perfect...).  But many things can be designed and built very quickly by this method and furthermore subsequent modifications of the design are very rapid. Thus several modifications of the design can be achieved in a short time.

   Following example shows a design of a holder for small geared DC motor that we want to use to automatically adjust a precision screw that moves an optical grating in a diode laser.  The mount has to allow for small adjustments of the motor position in all three directions to position the motor exactly with respect to the grating mount. The design philosophy we use is based on the same ideas as the RepRap printer itself: we use combination of threaded rods, nuts, washers and custom printed pieces.  All the plastic pieces were designed using the OpenSCAD package, sliced with Slic3r and printed using Proterface software on standard RepRap Prusa (built mid 2012). We print using PLA.


Figure 1: set of basic pieces needed for the motor mount.  Nuts and bolts are M6, the base is 40mm x 40mm. 

 Figure 2: The base with mounting threded rods

 Figure 3: adding the optical gate holder. 
 Figures 4:  mounting the little DC motor between two plastic retaining plates. Motor height can be adjusted by moving the mounting nuts up and down the threaded rods.

Figure 5: The complete mount including the encoder wheel.  The wheel interrupts the optical gate (the black part) when the motor rotates thus the angle of rotation and/or angular velocity can be measured.  The encoder wheel is printed on a laser printer usning a laser printer transparency, it privides 4° resolution.

The function of the whole unit is demonstrated ofn following short video:
Encoder output signal




úterý 13. listopadu 2012

Poznámky o konstrukci RepRap tiskárny, červen - listopoad 2012

Poznámky o konstrukci 3D tiskárny RepRap Průša Mendel
(publikováno v podstatě beze změn z mých osobních poznámek, které jsem si psal během stavby. Informaci poskytuji v dobré víře, že to někomu může být užitečné, ale bez jakékoli záruky...)

červen 2012 -
Ondřej a Kryštof Votavovi

Začátek června 2012:
Spouštíme projekt, hledáme informace po internetu. Volba poměrně rychle padá na model RepRap Průša Mendel a to z následujících důvodů:
  1. Celá konstrukce je poměrně jednoduchá a hlavně velmi detailně zdokumentovaná
  2. V ČR existuje několik stavitelů těchto strojů, včetně jejich tvůrce Jozefa Průši, tak se dají dohledat informace o českých dodavatelích některých dílů (krokové motory, kovové části …)
Rozhodl jsem se v první fázi pokud možno nevynalézat znovu kolo a pokusit se v relativně krátkém čase postavit funkční stroj a to i za cenu trochu vyšších nákladů. Například, přesto, že mám dost zkušeností se stavbou elektroniky, výrobou tištěných spojů a dokonce i programováním mikrokontrolerů, rozhodl jsem se koupit pro první verzi kompletní sestavenou elektroniku. Myslím, že mi to ušetří dost tápání a dohledávání případdných chyb. Později se rá pokusím zreplikovat vlastní elektroniku, ale na začátku chci mít něco co funguje a můžu testovat rychle komunikaci s počítačem a ovládání krokových motorů. Tento stavebnicový způsob taky zvýší pravděpodobnost, že Kryštof u projektu vydrží a neodradí ho případné problémy s laděním hardware.

8. června 2012
Dost jsem se inspiroval informacemi od Jakuba Šerého, které jsou poměrně detailní a praktické. Podle jeho rady jsem objednal krokové motory od firmy Microcon.cz . Model SX17-0905 stál včetně DPH 396kč, za 5ks a dopravu jsem komplet zaplatil 2100kč. Motory poslali obratem, měl jsem je doma za 3dny, ani mi nepotvrdili emailovou objednávku.

Obdobně jsem se dle rady J.Š. rozhodl koupit hladké a závitové tyče pro z-posun nerezové. Zde jsem použil našeho ústavního dvorního dodavatele akros.cz se sídlem v Ďáblicích. Hladká tyč byla za 97kč (2kusy po 1.2m stačí na všechny hladké díly s minimálním prořezem) a 1m závitové tyče DIN 975/A4 za 113kč (což je trochu citelný náklad navíc, když člověk potřebuje pouze 2x 210mm kousky. Ale třeba se to vrátí ve formě čistšího chodu. K tomu jsem přibral 10ks DIN 975/A4 M8 matic, také pro z-posun. Akros odpověděl do 2. dne, zboží jsem si vyzvednul osobně.

Zbylý hutní materiál v pozinkované oceli jsem nakonec objednal u firmy sroubysoukup.cz. Nějak se mi nedařilo se dostat na stránky Ferona.cz a tady měli přehledný e-shop, tak jak jsem seděl u počítače tak jsem to tam všechno rovnou zadal. Tady to trvalo poněkud déle, asi týden než zboží dodali, protože čekali na M3 červíky, které nebyly skladem. Výdejní místo mají v Jeremenkově 64, Praha 4, kde jsem si zboží osobně vyzvednul.

Ozubené řemeny jsem objednal od pikron.cz, dodají prý do 3 týdnů, každý přijde na 112kč + DPH +doprava. Uvidíme jak dorazí.

Největší objednávka je z holandské firmy reprapword.com. Tam objednávám sadu plastů včetně částí na Wade extruder (60Eur), části hot-end extruderu (34Eur), kompletní elektronika četně driverů krokových motorů (79Eur) a 0.5kg PLA 3mm vlákna pro testování. Bohužel je v tuto chvíli čekací doba na plastové díly asi 3 týdny. Tak si musíme počkat. Poprosil jsem, za by neposlali elektroniku napřed, abycom mohli otestovat komunikaci s PC a krokovými motory. Ale na to vůbec nereagovali. Celkem bez problémů se s nimi člověk domluví anglicky, konkrétně si dopisuji s Martijn Witte, <martijn@net99.nl>. Jenom neodpovídá tak docela obratem.

Zbývá ještě pár kousků hutního materiálu, např. Ložiska, křídlové matky M4 pro extruder hnací M8 šroub extruderu pro posun vlákna, ty asi koupím v železářství po jednotlivých kusech. Dále nemám drobné elektonické díly, jako mikrospínače pro konce pojezdů, ty nakoupím u GME. Musím také zprovoznit některý starší počítačový zdroj pro napájení celé sestavy. RepRap potřebuje asi 5A na 12V. Myslím, že bych doma měl nějaký mít starší ale použitelný zdroj z PC.

12. června 2012
Zatímco čekám na různé díly (zejména tištěné součásti) díval jsem se na software pro 3D design, se kterými zatím nemám mnoho zkušeností. Samotný software pro ovládání RepRap tiskárny, Skeinforge, nechám na později, v tuto chvíli jsem se chtěl trochu zorientovat v CAD softwarech, pomocí kterých se vytvoří 3D návrh. Těch je samozřejmě celá řada a tak mě zajímaly dvě klíčové věci: 1) jaký formát výstupních souborů je zapotřebí pro ovládací software RepRapu a 2) jaké jsou nástroje s pokud možno nízkou počáteční barierou, aby člověk mohl začít s jednoduchými návrhy a postupně je zesložiťovat. Odpověď na tu první otázku je celkem jednoduchá, RepRap software vyžaduje soubory ve formátu .stl, které jak jsem pochopil jsou vcelku standartní a většina CAD programů by měla být schopná je vytvořit. Na druhou otázku samozřejmě není tak jednoduchá odpověď. V tuto chvíli jsem trochu experimentoval se dvěma možnými variantami a to OpenSCAD a Google Sketchup.

OpenSCAD je založený na skriptovacím jazyce, pomocí kterého se vytváří 3D objekt z primitivních objektů jako jsou kvádry, Válce, koule a mnohostěny. Je možné je spojovat, odečítat a různě kombinovat, čímž vzniká výsledný objekt. Ačkoli by se na první pohled mohlo zdát, že je to (na dnešní dobu) těžkopádný přístup, připadá mi, že má řadu výhod. Celé vývojové prostředí je vlastně velmi jednoduché, skládá se z okna pro vkládání zdrojového textu pro skript a grafického okna, kde se zobrazuje vytvořený objekt. Samotný skriptovací jazyk je vcelku logický a vlastně stačí ovládnout pár příkazů a člověk je schopen vytvářet celkem sofistikované objekty. Výhodou je, že se vše rovnou zadává v konkrétních číselných hodnotách, což je velmi praktické pro technické kreslení. Během pár hodin testování jsem byl schopen vytvořit jednoduchou krabičku na elektroniku.

 Přidávání různých otvorů, výstupků úchytů a podobně je vcelku přímočaré. Skriptovací jazyk umožňuje vytvářet předdefinované objekty a ty pak dle potřeby kombinovat, škáloavt a podobně. V grafickém okně lze objekt intuitivně otáčet a prohlížet z různých stran. Jednoznačně je tento program horký kandidát na použití pro mé potřeby technických návrhů ve 3D. OpenSCAD je zdarma a OpenSource, běží pod Linuxem, i pod Windows (kde jsem ho zatím zkoušel).

Google Sketchup je na opačné straně spektra, jedná se o velmi sofistikovaný plně grafický a zdá se, že i velmi intuitivní program pro 3D návrhy. Primárním účelem je 3D modelování budov pro Google Earth, nicméně pro návrhy objektů pro RepRap tiskárnu je též použitelný. Zatím jsem ho vlastnoručně nezkoušel, ale sledoval jsem serii instruktážních videí od Googlu a skutečně tento program vypadá prakticky, promyšleně a dotaženě. Existuje volná a profesionální verze, nevím jak zásadní jsou omezení ve volné verzi.

Do třetice musím zmínit program Art of Illusion, což je freewarový 3D modelovací software, plně grafický a s velkým množstvím funkcí. Při velmi stručném prohlédnutí několika tutorialů mi připadá, že s tímto software by se dalo namodelovat v podstatě cokoli, včetně animací. Jen na to mít čas a energii. Nicméně pro naše účely by asi pro začátek byl tento software trochu moc komplikovaný.

Overview of some other software packages that may be worth checking can be found at: http://www.reprap.org/wiki/Useful_Software_Packages.

Další programy v řetězci jsou nástroje, které ze souboru v STL forátu, který jsme vyrobili v CAD softwaru vytvoří předpis pro tvorbu daného objektu na RepRap tiskárně. Ačkoli i zde je celá řada možných variant (Skeinforge, Slic3r …), v tuto chvíli se mi zdá, že do začátku bude nejschůdnější cesta využít integrovaného prostředí Mendel Host Software, viz. http://reprap.org/wiki/Mendel_User_Manual:_Host_Software.

14.června 2012:
Dnes si vyzvedávám další část železářství – závitové tyče, matice a podložky, takže až budou tištěné části, můžeme začít se stavbou. Do té doby si ještě můžeme přeppřipravit následující věci:
  • Nařezat závitové tyče na správnou délku (hotovo 15.7.)
  • připravit tisknoucí základnu z překližky
  • vyrobit měřicí díly pro přesné nastavení rozměrů rámu.
    26. 6. 2012
Konečně v reprapworld.com naskladnili tištěné součástky pro Průšu a mohl jsem objednat chybějící díly. Jedná se o sadu trysky extruderu, kompletní Singolulu elektroniku i s ovladači motorů, sadu plastů a 0.5kg 3mm PLA vlákna na testování. Možná dorazí do pátku, psal jsem jim, že potom budu týden pryč. Snad jsem se s tou informací dozvonil...

9.7.2012
Zásilka z reprapword.com dorazila, zdá se, že tam jsou všechny požadované položky, zatím jsem nekontroloval jednotlivé plastové díly, ani funkčnost elektroniky. Dnes v podvečer se Kryštof vrací z letního tábora, tak doufám, že bychom mohli během příštích dnů alespoň postavit základní kostru a vyzkoušet ovládání krokových motorů pomocí Singolulu elektroniky.

13. 7. 2012
Zatím jediný drobný zádrhel s doručenými díly: Ukázalo se, že tato verze plastů požaduje kovová lineární ložiska LM8UU, místo jednoduchých tištěných lineárních ložisek v originální verzi Mendel-Prusa RepRapu. Podařilo se mi najít místního dodavatele těchto ložisek za rozumnou cenu (34kč/kus) Ivan Diviš (Divis hoby na Aukru, divisi@seznam.cz 608153531). Když jsem si ložiska u něj vyzvedával, dal mi celou řadu dobrých rad ohledně konstrukce a provozu 3D tiskáren. V podstatě říkal, že spoustu lidí je v současnosti staví, ale jen málokomu dobře funguje. Že je hodně důležité, aby konstrukce byla celkově hodně tuhá aby to dobře fungovalo, že vychytání dávkování plastu v závislosti na pohybu trysky je celkem důležité pro kvalitní tisk. Mimochodem, v Kroměříži jsem nalezl ještě o pár korun levnějšího dodavatele ložisek, 30kč/kus, ale zrovna je neměl skladem a bylo by třeba čeka 3 týdny, (Ali.G.I d <ALI.G.I@seznam.cz> ). Takže to vypadá, že hlavní díly máme všechny. Začal jsem řezat závitové tyče na správné délky, jsem někde v půlce. Pak můžeme začít šroubovat rám.

3.9.2012
Během srpna jsme s Kryštofem provedli hrubou stavbu tiskárny. Zdá se, že mechanika alespoň v hrubých rysech funguje – všechny tři osy se pohybují v plném rozsahu poměrně volně, po drobných úpravách všechny díly pasují na svá místa. V podstatě bylo potřeba zvětšit některé otvory v plastech, aby do nich pasovaly příslušné díly, zejména otvory pro osy krokových motorů v plastových řemenicích bylo třeba zvětšit. Upravoval jsem také spojovací díly mezi krokovými motory a závitovými tyčemi Z-osy, aby v nich naopak osy motorů neprokluzovaly.
Nyní nás bude čekat oživení elektroniky a softwaru. Zkoušel jsem nainstalovat ovládací software na Ubuntu. Náš domácí počítač se 64-bitovým Ubuntu linuxem zatím vzdoruje. Problém je s tím, že ovládací software potřebuje Java runtime environment a jsou tam problémy s knihovnami mezi 32- a 64-bitovými verzemi. V práci se mi po určitém úsilí podařilo na 32-bitovém ubuntu nainstalovat Java Runtime Environment (JRE) . Instalace vlastního ovládacího softwaru pak byla velmi jednoduchá – zazipovaný soubor stačí rozbalit a spustit software příkazem ./reprap . JRE je třeba stáhnout z www.java.com a nainstalovat (nejdřív rozbalit archiv a posléze instalovat, návody jsou k nalezení například na:
chvíli jsem s tím zápolil a na několikátý pokus se podařilo. Zdá se mi, že nejpřímočařejší je následující postup:

For me it's a little bit different. For Ubuntu 12.04 LTS Precise (Desktop):
  1. Download jre-*.tar.gz
  2. tar -zxvf jre-*.tar.gz
  3. mkdir /usr/lib/jvm/
  4. mv jre* /usr/lib/jvm/
  5. ln -s /usr/lib/jvm/jre*/bin/java /usr/bin/
That's all. To make sure it's correct:
java -version
Asi bude nejjednodušší v prvním kroku použít domácí laptop, který má také 32-bitový Ubuntu, tak by mohla být procedura podobná. Další krok bude zkusit rozpoznat elektroniku přes USB a zkusit měřit a ovládat teplotu a točit krokovými motory...

11.9.2012

Zde je soupis software který funguje pro naši RepRap tiskárnu se Sanguinololu 1.3a a StepStick drivery pro krokové motory. Tento soubor nástrojů je výsledek poměrně strastiplného výběru, při kterém jsem probádal celou řadu slepých uliček. Ukázalo se, že pro rychlý začátek je v současnosti nejschůdnější instalovat software na Windows, u Linuxu je to vše ještě o něco komplikovanější. Výsledný set se tedy sestává z následujících komponent:

  1. Driver pro FTDI232 čip v adresáři CDM 2.08.24 WHQL Certified. Je třeba stáhnout před prvním připojením desky k počítači. Když desku připojíme, zahlásí počítač nalezení nového hardware a pak je třebva vyhledat cestu do rozbaleného adresáře pro instalování driveru. Od té chvíle je tomuto zařízení přiřazen virtuální COM port, přes který komunikuje s ovládacím programem i s vývojovým prostředím Arduino.
  2. Vývojové prostředí Arduino, verze 0023 s komponentem pro Sanguino 0023r3
    Arduino je vývojové prostředí pro desku elektroniky, která řídí tiskárnu. V našem případě tedy Sanguinolulu v 1.3a. V této fázi jsem v podstatě Arduino používal pouze pro kompilaci firmware a jeho nahrání do mikrokontroleru přez USB rozhraní. Použitá verze 0023 je sice starší verze Arduina ale současná verze 1.1 není schopná firmware zkompilovat. Komponent pro Sanguino 0023r4 také nefunguje. Uspěl jsem až s tou verzí 0023r3. Ještě poznámka: na koupené desce Sanguinololu již měl mikrokontroler nainstalovaný bootloader, takže jsem mohl přímo nahrávat firmware přez USB/COM. Alespoň tahle část fungovala vlastně bez problémů. Jinak jsem vlastně na každém kroku narazil na nějaký problém, který bylo nutno řešit, hledat informace, zkoušet různé verze....
  3. Firmware pro Sanguinolulu
    Úspěšně se mi povedlo zkompilovat a nahrát do Sanguina jak SPRINTER tak i MARLIN. V současné době používám aktuální verzi Marlin_v1. Oba firmvary stačilo stáhnout a rozbalit zazipovaný adresář a v něm pak pomocí Arduina otevřít startovací soubor projektu (Marlin.pde či Sprinter.pde). Pod tools je třeba vybrat správnou desku (tools>board>Sanguinololu ATMega 644P) a příslušný COM port, kterým komunikuje počítač s deskou.
  4. Ovládací software na PC
    Používám PRINTRUN, který na rozdíl od RepRap host software bez problémů komunikuje s Sanguinololu. Instalace byla naprosto přímočará, stačilo stáhnout a rozbalit zazipovaný adresář. Použil jsem aktuální verzi printrun-win-Mar2012-slic3r.zip.
  5. Pro tvorbu návrhů asi budu používat OpenSCAD, který již jsem testoval před časem.

Veškerý aktuální software je v adresáři software-and-drivers, včetně zazipovaných stažených souborů.

Zapojení krokových motorů: S tím jsem měl překvapivě velké problémy. První pokusy o roztočení motorů (když se mi konečně podařilo rozběhat firmware a software a deska začala komunikovat s počítačem... ) vedly pouze k vibrování motorů místo jejich otáčení. Na různých fórech na internetu jsem hledal řešení, většinou tam radili nastavovat proud pomocí trimpotů na StepStick driverech, případně měnit prodlevy mezi pulsy krokového motoru. Nic z toho nemělo vliv na chování mého motoru. Nakonec se ukázalo, že značení vinutí na Microcon krokových motorech a na konektorech na desce jsou natolik nejednoznačné, že mohou vést ke špatnému zapojení.

17. 9. 2012
      Dokončili jsme mechanickou konstrukci všech tří os, instalovali krokové motory i koncové vypínače a RepRap bezchybně běhá podle příkazů Printrun programu. Zatím jsme testovali pouze manuální ovládání jednotlivých os, dosud jsem nezkoušel poslat G-kód pro výrobu nějaké součástky. Podle předběžných testů není v pořádku kalibrace osy Z. Osy X a Y se zdají být v pořádku.
Zkoušeli jsme zahřívání a teplotní stabilizaci trysky. Zpočátku vše vypadalo dobře, po zapnutí stabilizace teplota stoupala, když se však blížila k nastavené teplotě 185°C došlo k poškození termistoru – prasknul skleněný obal. Nevím, zda to byl vadný kus a nebo nebyla správně zvolená kalibrační křivka (v nastavení firmware Merlin jsem měl zvolenu variantu 1 pro 100kOhm termistor, při pokojové teplotě dával rozumné hodnoty) a ve skutečnosti došlo k přehřátí termistoru nad jeho maximum. Ať již tak nebo tak, musím pořídit nové teplotní čidlo. Kupodivu se ukazuje, že v ČR není úplně snadné koupit skleněný NTC termistor 100kOhm (schopný měřit minimálně do 200°C, lépe do 300°C). Tak zkoumám alternavivy: Z nabídky GME připadají v úvahu dvě teplotní čidla 1) Pt teplotní čidlo PT1000, které měří v teplotním rozsahu -50°C až 500°C. Má pozitivní teplotní závislst (se vzrůstající teplotou roste odpor čidla) 2) teplotní čidlo KTY84-130 s teplotním rozsahem -40°C až 300°C a také pozitivní teplotní závislostí. Shodou okolností obě čidla mají cca 1600Ohm odpor při 185°C, přičemž KTY84-130 má strmější teplotní závislost a bude tedy poskytovat lepší teplotní rozlišení než platinové čidlo. Cena obou čidel je poměrně příznivá, PT1000 stojí 35Kč, KTY84-130 stojí 21Kč. KTY je dodáváno ve formě skleněného válečku o průměru 1.6mm, takže bude snadné ho umístnit to zahřívacího bloku, skrz který vyvrtáme odpor o patřičném průměru. Takže to asi bude první volba. Nižší teplotní rozsah by něměl vadit, i pro ABS plast by tavicí teplota něměla přesáhnout 250°C. Výhodou obou těchto čidel oproti NTC termistorům je takřka lineární závislost odporu na teplotě
Ani jedno z uvedených čidel nemá ve firmware Merlin příslušnou kalibrační křivku, takže drobnou překážkou v jejich použití bude nutnost tuto kalibrační křivku do firmware dodat. Podle stručného studia zdrojových souborů pro Merlin by to neměl být zásadní problém.

24.9.2012
Během minulého týdne jsem byl nucen podniknout cestu do hlubších vrstev Sanguinololu a Arduina. Ukázalo se totiž, že došlo nejen k poškození termistoru, ale také odešel samotný mikrokontroler v Sanguinololu elektronice (dodnes netuším proč). Naštěstí se jedná o verzi 1.3a, která má procesor v DIL patici a bylo tedy možné ho vyjmout a vyměnit za nový. Každopádně mě čekalo nahrávání bootloaderu aby byl procesor schopen nahrávat firmware přez USB. Celý proces skýtal, jak se ukázalo řadu peripetií. Postup, kterým jsem prošel byl zhruba následující:
    1. V GME jsem za cca 200kč pořídil procesor ATMega644-20PI.
    2. Instaloval jsem PonyProg na můj linuxový počítač. Jedná se o software pro programování mikrokontrolérů, který jsem již v minulosti používal pod Windows pro programování Atmelů a mám pro něj vyrobený a vyzkoušený paralelní programátor. Bohužel v současnosti jediný počítač u nás doma, který má stále paralelní port je právě domácí linuxový stroj. Instalace pod Ubuntu byla překvapivě přímočará, jen je třeba pamatovat, že program se musí spouštět přez příkazovou řádku pomocí sudo: sudo ponyprog2000 jinak programátor není schopen komunikovat s paralelním portem.
    3. Vyhledal jsem bootloader pro  nahrATMega644 a nahrál jej do nového procesoru. Zde se vyskytlo pár dílčích problémů – první z nich bylo nastavení pojistek v procesoru, které určují zdroj a frekvenci hodin procesoru, velikost paměti pro bootloader a další parametry procesoru. V PonyProg se nastavují v Commands>Configuration and security bits. Jedná se o tři byty, které mají mít hodnotu:
      horní řádka (low_fuses)=0xFF
      prostřední řádka (high_fuses)=0xDC
      spodní řádka (extended_fuses)=0xFD
      AKTUALIZACE: TOTO NASTAVENÍ POJISTEK JE CHYBNÉ, VIZ NÍŽE!
      Při nastavování třeba pamatovat, že zaškrtnuté okénko znamená nastavení daného bitu na hodnotu 0, tedy 0xFF hodnota znamená, že žádné okénko není zaškrtnuté.
    4. Nahrál jsem úspěšně program do nového chipu přímo přes 6-ti pinový ISP konektor na desce Sanguinololu. Zde nenastal žádný zásadní problém. Postupuji tak, že nejdřív nastavím správný chip z menu Device>AVR micro, následně zkontroluji, že programátor komunikuje s chipem příkazem Command>Read Program v případě, že je chip prázdný, přečtou se samé 0xFF, jinak se zobrazí, co v mikrokontroléru je nahrané. Následně nahraji .hex soubor příkazem file>open program (FLASH) file a ten pak nahraji do chipu pomocí Command>write program (FLASH). To vše proběhlo v pořádku, ale pak nastaly problémy, neboť Arduino odmítlo s novým mikrokontrolérem s takto nahraným bootloaderem komunikovat. Teprve v této fázi jsem zjistil, že standartní kontrolér pro Sanguinololu je ATMega644P, který není shodný s ATMega644. Bohužel GME ATMegaž644P nevede a ani jinde se mi nedařilo ho (snadno) najít. Na druhou stranu se mi po internetu podařilo vystopovat informace, že i ATMega644 by měl být použitelný, ale potřebuje specifický bootloader, verze pro ATMega644P nefunguje. Naštěstí v adresáři firmware Marlin\Sanguino\bootloaders jsem nalezl obě verze bootloaderu, jak pro 644P tak i pro 644. Tak jsem nahrál nový bootloader pomocí PonyProg a znovu zkusil komunikaci s Arduinem. Tentokrát již bylo Arduino schopno s chipem komunikovat, ale dávalo chybu, protože ve specifikaci použité desky tools>board bylo specifikováno „Sanguino w 644P“ a tomu neodpovídal skutečný chip na desce. Tak jsem ještě musel upravit specifikace Sanguino desek v souboru \arduino-0023\hardware\Sanguino\boards.txt, kde jsou specifikované parametry jednotlivých desek. Zkopíroval jsem sekci pro ATMega644P a pozměnil řádky relevantní pro ATMega644 (označené červeně):
      ##############################################################
      atmega644.name=Sanguino W/ ATmega644
      atmega644.upload.protocol=stk500
      atmega644.upload.maximum_size=63488
      atmega644.upload.speed=38400
      atmega644.bootloader.low_fuses=0xFF
      atmega644.bootloader.high_fuses=0xDC
      atmega644.bootloader.extended_fuses=0xFD
      atmega644.bootloader.path=atmega644p
      atmega644.bootloader.file=ATmegaBOOT_644.hex
      atmega644.bootloader.unlock_bits=0x3F
      atmega644.bootloader.lock_bits=0x0F
      atmega644.build.mcu=atmega644
      atmega644.build.f_cpu=16000000L
      atmega644.build.core=arduino
      Změna v sekci bootloader by byla relevantní pouze, pokud by člověk chtěl nahrávat bootloader přímo z prostředí Arduino, což jsem zatím nezkoušel, ale v principu by to mělo jít. Nakonec ještě bylo potřeba provést změnu přímo ve zdrojovém kódu firmware, v souboru pins.h: v sekci pro Sanguinololu:
      ****************************************************************************************
* Sanguinololu pin assignment
*
****************************************************************************************/
#if MOTHERBOARD == 62
#define MOTHERBOARD 6
#define SANGUINOLOLU_V_1_2
#endif
#if MOTHERBOARD == 6
#define KNOWN_BOARD 1
//#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega1284P__)
#if !defined(__AVR_ATmega644P__) && !defined(__AVR_ATmega644__) && !defined(__AVR_ATmega1284P__)
    1. Po těchto změnách se konečně podařilo přeložit a nahrát firmware do procesoru a vrátit se zpět k problematice teplotní stabilizace.

Teplotní stabilizace s použitím KTY84-130 teplotního senzoru: Ukázalo se, že se jedná o podstatně zásadnější zásah do firmware, než jsem původně předpokládal. Software pro teplotní stabilizaci totiž apriory předpokládá NTC termistory, u kterých odpor klesá s teplotou. V této fázi jsem provedl modifikaci firmware Sprinter, který je jednak trochu jednodušší, ale hlavně podstatně přehledněji napsaný než Marlin. K popisu změn firware se snad časem dostanu, v tuto chvíli musím udělat pár poznámek o dalších krocích …

    26.9. 2012
    Status projektu je takový, že teplotní stabilizace funguje vcelku pěkně s KTY84-130. Veškerá elektronika je zapojená, dorazy na všech osách nastaveny, podávání plastu extruderem funguje, takže v principu jsme schopni začít tisknout. JENŽE: Komunikace mezi PC a Sanguinololu je eratická. Tiskárna reaguje na příkazy z PC chvilku a pak se zasekne, případně se mikrokontrolér sám od sebe resetuje. Při pokusu o tisk G-kodu přečte pár řádek a pak na náhodném místě zahlásí chybu „serial error, checksum ...“ případně něco na ten způsob. Informace na internetu je sporadická a nekonzistentní, strávil jsem s tím už pár večerů a nepodařilo se mi tento problém rozlousknout. Zkoušel jsem změnu napájení z 12V Pb akumulátoru na PC zdroj (což bych stejně musel udělat, ten akumulátor byla nouzovka vhodná tak pro počáteční testování). Zkoušel jsem nahrát zpět Marlin firmware, ale symptomy s ním jsou naprosto stejné. Asi nejnadějněší stopu, kterou musím důkladně probádat je z následujícího blogu:
    http://stevesfixitshop.blogspot.cz/2011/12/sanguinololu-13a-part-3not-out-of-woods.html

Autor popisuje symptomy v podstatě shodné s našimi. Jeho vysvětlení je to, že mikrokontroler má špatně nastavené pojistky pro zdroj systémových hodin. Konkrétně v jeho případě šlo o to, že měl pojistky nastavené pro krystalový oscilátor, zatímco skutečně měl zapojený keramický rezonátor, pro který bylo potřeba pojistky přenastavit. Údajně to vyřešilo jeho problém. Toto vysvětlení mi připadá docela dobře možné. Mám pocit, že v našem Sanguinololu je také keramický rezonátor a pojistky jsou podle mne nastaveny pro krystal. Takže jsem se musel trochu hlouběji ponořit do nastavení pojistek u ATMega644, podle originální datasheet. Nastavení zdroje systémových hodin je určený bity CKSEL 3 … 0, což jsou spodní 4 bity (tj. Spodní „nibble“) v extended_fuses. Ten má v tuto chvíli nastavenu hodnotu 0xD (hexadecimal) tedy:

CKSEL3 CKSEL2 CKSEL1 CKSEL0
binary 1 1 0 1
fuses   X (X znamená nastavenou pojistku)

to by podle datasheet odpovídalo krystalu (CKSEL3 = 1) pro frekvenční rozmezí 3 – 8 Mhz. To zdá se není tak úplně správně. Zaprvé tam máme asi spíš keramický rezonátor, čemuž by odpovídalo CKSEL3 = 0 a CKSEL0 = 0, a dále podle všeho by měly mít systémové hodiny frekvenci 16MHz, čemuž by odpovídalo nastavení CKSEL2 = CKSEL1 = 1. Takže by měly tyto pojisty být nastavené následujícím způsobem:
CKSEL3 CKSEL2 CKSEL1 CKSEL0
binary 0 1 1 0 = 0x6
fuses X   X

      V případě použití 16MHz krystalu by pak měly být pojistky nastaveny:
CKSEL3 CKSEL2 CKSEL1 CKSEL0
binary 1 1 1 1 = 0xF
fuses    
      V podstatě můžu vyzkoušet dvě varianty, zaprvé přenastavit pojistky na keramický oscilátor, zadruhé vyměnit keramický oscilátor za krystal. Ještě další možnost by byla přenastavit hodiny na vnitřní oscilátor procesoru a nastavit běh programu na 8MHz (to nevím přesně kde by se dělalo, zda by stačilo nastvit tuto hodnotu v definici desky (boards.txt v adresáři hardware/Sanguino), nebo by bylo třeba ještě něco měnit ve firmware. Tato varianta by byla velmi bezpečná co se týče procesoru, v podstatě by nehrozilo, že by se zablokoval a nedal by se dál programovat... Otázka ovšem je, zda by potom byl bootloader schopen nahrát firmware do mikrokontroleru. Mám tušení, že bootloader je designován pro určitou frekvenci sysémových hodin. Takže asi bude nejjednodušší postupovat následujícím způsobem: 1) zkontrolovat, co skutečně máme v desce, pokud keramický oscilátor, změnit hodnoty pojistek pro tuto variantu. Pokud je tam krystal tak přenastavit pojistky pro krystal. 2) pokud tam je keramický oscilátor a přenastavení pojistek nepomůže, zkusit tam dát 16MHz krystal a přenastavit pojistky pro tuto variantu. 3) pokud nepomůže ani to, zkusit vnitřní oscilátor a přenastavit systémovou frekvenci v boards.txt na 8MHz. Pokud pak nepůjde nahrát firmware, vrátit se k vnějšímu rezonátoru a zkoumat další varianty. Pokud vše selže, zkusit sehnat 644P mikrokontroler

    12.10. 2012
Takže zmíněné úpravy popsané v minulém zápisu zafungovaly na 100% . Používáme nastavení pro 16MHz keramický oscilátor (viz výše). Od té doby nemám nejmenší problémy s komunikací mezi Sanguinololu a počítačem a ještě týž večer (tj. 26.9.2012) jsme úspěšně vytiskli první objekt!

Od té doby jsme vyzkoušeli tisknout různé drobné předměty stažené ze thingiverse.com. Pro překlad .stl souborů do g-kódu používám buď Slic3r, který je integrován do Printrunu, kterým v současné době (stále pod Windows) ovládám tiskárnu, nebo (častěji) Skeinforge, který jsem nainstaloval zvlášť. Slic3r v některých případech .stl soubory špatně přeložil a vytvořil nefungující g-kódy (přesněji řečeno g-kódy, které vytiskly něco jiného než bylo v .stl předloze). Defaultní nastavení vede k tisku, který je o hodně rychlejší než u skeinforge, ale výsledná kvalita tisku je (zatím) horší. Skeinforge má hromadu možností, ve kterých se zatím teprve pomalu začínám orientovat. Docela dobroý úvod pro počáteční nastavení sepsal Jakub Šerých. Systematickému nastavení tiskových podmínek se ještě budu muset věnovat, pak k tomu napíšu nějaký záznam.
Tiskneme PLA na sklo, které (dle rady J. Šerých) před tiskem natírám roztokem kalafuny v lihu, pak i první vrstva celkem dobře drží, ale není problém finální výrobek odloupnout. Podložka je nevyhřívaná. Teplotu mám nastavenou na 185°C. Při nižších teplotách se vrstvy doře nespojují.
Ukazuje se, že při tištění pomocí plastu PLA je důležité chlazení pomocí větráčku, zejména pro tisk převislých částí a přemostění. Tak zkusím jako další vylepšení připojit malý větráček ze starého CPU chladiče. Sanguinololu je nachystané na ovládání větráčku pomocí jednoho PWM výstupu, ale bude potřeba vyrobit jednoduchý spínací obvod pomocí FET tranzistoru, zhruba takto: 

IRLML2502 tranzistor je SMD výkonový N-FET, který mi připadá pro tuto aplikaci velmi vhodný, mají ho v GME za 5.5kč. Případně pro opravdu velké výkony by se hodil IRLR8743 (22kč, GME). Katalogové listy pro obě součástky jsem stáhnul. Kromě toho bude potřeba vyrobit držák větráčku na tiskací hlavu, návrhy se dají stáhnout na thingiverse, takže by to neměl být velký problém.



    24.10. 2012
    Větrák se podařilo celkem slušně zprovoznit. Vyrobil jsem dle schématu výše malý plošňák, s IRLML2502 tranzistorem (Vmax = 20V, Imax = 4A, Ron = 0.08Ohm). Zapínání a vypínání ve firmware v podstatě také šlo celkem snadno, v souboru pins.h bylo potřeba nadefinovat použitý pin:
    #define FAN_PIN 4
    v oddílu pro Sanguinololu desku (motherboard 62). Zatím mi z nějakého důvodu nefunguje PWM regulace otáček, větrák se dá pouze zapnout (g-code příkaz M106) nebo vypnout (g-code příkaz M107) regulace by se měla provádět příkazem M106 Sxx , kde xx je číslo od 0 do 255, 0 znamená vypnutý větrák, 255 plný výkon. Jenže mě to nedělá vůbec nic. Držák jsem skutečně bez problémů stáhnul a vytisknul (www.thingiverse.com/thing:29999). Aby se při běhu větráku příliš neochlazovala tiskací hlava (hot end) obalil jsem ji tlustou vrstvou teflonové pásky, viz foto:


    To funguje vcelku dobře, nicméně uvažuji ještě o další izolaci hlavy, nevím zda výkon vyhřívání při puštěném větráku bude stačit pro případné použití ABS plastu (který potřebuje vyšší tavicí teplotu).
    Pracuji na zlepšování kvality tisku. Včera jsem si přečetl tutoriály k Slic3ru (http://richrap.blogspot.cz/2012/01/slic3r-is-nicer-part-1-settings-and.html) a přenastavil parametry tisku. Výsledek je VÝRAZNĚ vyšší kvalita tisku! Asi nejzásadnější změna byla snížení tloušťky vrstvy na 0.3mm a snížením množství plastu (oproti tomu, co tlačil skeinforge). Mám nastavený průměr vlákna 2.75mm. Tisknu poměrně pomalu, obvody (perimeter) 30mm/s, vnitřky (infill) 50mm/s přemostění 30mm/s. Píšťalka se tiskne asi 30min. Teplotu mám na 185°C, první vrstvu na 188°C. Jediný (ale bohužel vcelku zásadní) problém v tuto chvíli je, že s těmito hodnotami nastavení mi objekty špatně drží na studené skleněné podložce (kalafuna trochu pomáhá, ale není to dostatečné) takže se mi opakovaně stalo, že se mi tisknutý objekt uloupl z podložky. Zkazil jsem takto několik píšťalek... To asi budu muset vyřešit vyhřívaným stolkem. Zásadní výhodou slic3ru je, že umí zamezit vytékání plastu při přemisťování tiskové hlavy zpětným chodem extruderu. Výsledný tisk je takřka úplně bez natažených nití plasu, které by bylo potřeba odstraňovat. Píšťalka pískala bez jakéhokoli čištění, což se o té první opravdu říci nedalo. Mimochodem pro tištění v slic3ru jsem stáhnul „opravenou“ verzi píšťalky na http://www.thingiverse.com/thing:1048 .


    29.10. 2012
Pracuji na migrování software pro ovládání tiskárny z Bětčina windowsovského netbooku (který jsem jí za tímto účelem v minulém měsíci permanentně kradl) na můj desktop Ubuntu (11.10) linux. Je to výkonnější počítač s lepší grafickou kartou, takže Kryštof na něm může například navrhovat 3D objekty v „dětském CAD“ programu TinkerCAD. Nainstaloval jsem Printrun/Pronterface dle návodu na RepRap wiki

Ubuntu

sudo apt-get install python python-serial python-wxgtk2.8 python-tk git-core
There are also experimental packages for Ubuntu (maverick natty oneiric precise):
sudo apt-add-repository ppa:richi-paraeasy/ppa
sudo apt-get update
sudo apt-get install pronterface
Počítač hlásil celou řadu chyb při instalaci, ale kupodivu program byl nainstalován a vlastně okamžitě při připojení byl schopen lokalizovat správný USB s tiskárnou a připojit ji. Takže potud dobré. Záhy jsem však zjistil, že (k mému překvapení) používá Printrun v linuxu defaultně Skeinfoge a nikoli Slic3r. Vzhledem k tomu, že jsem právě velmi dobře nastavil parametry Slic3ru a tiskárna opravdu tiskne velmi kvalitně, rád bych měl možnost používat Slic3r i pod Ubuntu. Slic3r by se měl instalovat snando pomocí předkompilovaných balíků, které se pouze rozbalí. Zatímco mi to napoprvé fungovalo na 32-bitovém Ubuntu v práci, na domácím 64-bitovém systému to nefunguje, ačkoli jsem stáhnul a rozbalil verzi x64. Na internetu jsem k tomu zatím našel následující poznámku, která může být relevantní (z http://dustsreprap.blogspot.cz/2012/04/printing-at-90-micron-layers-and.html):

...I installed the precomputed Slic3r binaries from here

Since I run 64 bit and this is a 32 bit binary I also had to install the 32-bit support libraries (ia32-libs and ia32-libs-gtk packages).

You then need to configure pronterface to use Slic3r

Set the following to settings.
slicecommand:  {full_path_to}slic3r $s --load config.ini --output $o
sliceoptscommand: {full_path_to}slic3r --load config.ini --ignore-nonexistent-config

You then have to setup Slic3r for your printer (very easy if you have set up anything before)

… takže chci zkusit doinstalovat ty 32-bit support libraries...

rychlá poznámka: kupodivu mi na mém ubuntu FUNGUJÍ 32-bitové verze slic3ru ale NEFUNGUJÍ 64-bitové verze. Divné.