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. 



Žádné komentáře:

Okomentovat