Mám funkční Arduino, nebo zmetek?

O tom, že mnohé prodávané čínské výrobky nesplňují ani základní požadavky na kvalitu, se všeobecně ví, i přes to je kupujeme. Jsou prostě mnohem levnější, a kdo by chtěl zbytečně utrácet, že? Arduino v tomto směru není výjimkou.

Nebudeme se zabývat tím, jak poznat od sebe originály, klony, které to přiznávají, a padělky, ty se snaží vypadat jako originály při podstatně horší kvalitě. Přiblížíme si jeden test, který může ukázat, že s naším Arduinem cosi není v pořádku, a s vysokou pravděpodobností je to nekvalitní zmetek. Nezáleží na tom, jestli je to originál respektive „originál“ nebo klon, nezáleží na prodejci ani ceně. Pokud tímto testem Arduino projde, ještě to neznamená, že je ve všech ohledech kvalitní, ale pokud neprojde, je situace jasná.

Test je velmi jednoduchý, jde o to, že častou chybou nekvalitně vyrobených mikrokontrolérů je „courání“ jejich AD převodník i při naprosto konstantním vstupním napětí. Zkrátka pokaždé přečte jinou hodnotu. Můžeme dělat test se všemi analogovými vstupy postupně (jeden po druhém), což bude trvat delší dobu, a lze také propojit všechny vstupy vzájemně a testovat je společně, takto to uděláme nyní.

Arduino můžeme napájet i přes USB z počítače, kvalitní baterie je lepší. Nic jiného nebude k arduinu připojeno. Jako referenční zdroj použijeme napájecí napětí (implicitní volba), zdrojem měřeného napětí pro převodníky bude dělič ze dvou stejných rezistorů s odporem mezi 1 kΩ a 2k2. Budeme v pravidelných intervalech číst napětí ze všech analogových vstupů a vypisovat výsledek do sériového monitoru v PC. Program pro Arduino UNO může vypadat nějak takto:

// program TEST ADC
void setup() {
  Serial.begin(9600);               // prenos do PC 9600Bd
}

void loop() {
  for (int i = 0; i < 6; i++) {     // pro AD vstupy 0 - 5
    Serial.print(analogRead(i));    // vypis - zmerene napeti
    Serial.print("    ");           // odsazeni
  }
  Serial.println(" ");              // odradkovani
  delay(200);
}

Rozsah měřené hodnoty je 0 – 1023. Pokud je dělič opravdu ze stejných rezistorů, měli bychom teoreticky ze všech vstupů dostávat stabilně jen hodnotu poloviny rozsahu, tedy 511 nebo 512. Odpory v děliči se mohou lišit v rámci tolerance, na přesné hodnotě čísla tolik nezáleží jako na tom, jestli a o kolik se hodnota mění. V praxi se do vstupu dostane nějaké to rušení a hodnota nebude úplně konstantní, pokud bude kolísat v rozmezí ±1, je to pochopitelné. O hodnotu ±2 by už kolísat neměla, ale řekněme, že se to dá tolerovat. Větší odchylky znamenají, že je prostředí extrémně zarušené, nebo mikrokontrolér nedělá to, co má. Některé výrazně nekvalitně vyrobené mikrokontroléry v tomto testu vykazují kolísání o ±10 nebo až ±100.

Co z toho plyne v praxi? Nejde jen o to, že AD převodníky takového mikrokontroléru měří chybně a nejde jim věřit, že budeme zoufale hledat chybu v programu když nebude fungovat podle předpokladů, a ona tam není, je to signál, že celý čip je vadný a nikdo nemůže přesně říct, jestli bude správně vyhodnocovat úrovně digitálních signálů, jestli bude reagovat dostatečně rychle, jestli vytvoří správné úrovně na výstupech a bude do nich přecházet tak rychle jak má, jestli bude fungovat v celém povoleném rozsahu teplot atd. Nejde mu prostě věřit.


Můžeme na vstup AD převodníku připojit jezdec potenciometru zapojeného mezi +5V a zem, nastavit malé napětí blízké nule (asi tak hodnotu 50 – 100) nebo naopak napětí blízké napájecímu (970 – 920) a opět sledovat, jestli a jako moc se změřená hodnota mění. Práce s potenciometrem dovolí otestovat, jestli se vlastnosti nějak mění se změnou napětí, ale obecně je napětí z potenciometru méně stabilní než napětí z děliče složeného ze dvou pevných rezistorů.


Dalším příznakem problematického mikrokontroléru může být to, že vstupní odpor AD převodníků je podstatně menší, než by měl být. Program zjednodušíme a zpomalíme, zkoušíme jeden vstup po druhém. Všechny vstupy jsou odpojené, připojujene vždy jen ten jeden zkoušený.

// program TEST2 ADC0
void setup() {
  Serial.begin(9600);  // prenos do PC 9600Bd
}

void loop() {
  Serial.println(analogRead(0));
  delay(1000);
}

Nezapojený vstup by měl naměřit napětí zhruba v rozsahu 200 – 500, výsledek může hodně kolísat i mimo tyto meze, to je v pořádku. Vstup připojený k +5V přes odpor 2M2 by měl naměřit napětí téměř plné, hodnoty mezi 1010 a 1023. Vstup připojený přes odpor 2M2 k zemi by měl naměřit napětí blízké nule, řekněme 0 – 5, s podstatně menším kolísáním než v blízkosti kladného napájecího napětí . Pokud se hodnoty výrazně liší, ukazuje to na malý vnitřní odpor vstupu.