Arduino

Z MAM wiki

Přejít na: navigace, hledání

Arduino je open-source vývojová platforma. Jedná se o desku s mikroprocesorem, vstupně-výstupními piny, oscilátorem, USB portem a konektorem pro připojení napájení. Je založeno na uživatelsky jednoduchém hardwaru a softwaru, díky čemuž se poměrně snadno ovládá a programuje. To ho činí atraktivním i pro "neprogramátory" - například umělce nebo kutily, kteří tak mohou vytvářet zajímavé instalace a projekty řízené mikroprocesorem bez praktické znalosti jazyka C nebo assembleru.

Mikroprocesor na desce se pochopitelně musí nějakým způsobem naprogramovat, k čemuž se však u Arduina používá vlastní jazyk (založený na jazyce Wiring, který zase vychází z jazyka Processing :), nicméně oba jazyky jsou nějakým způsobem postaveny na C/C++) a vlastní vývojové prostředí. Projekty založené na Arduinu mohou být buď samostatné (stand-alone) nebo mohou být připojené k počítači a komunikovat se softwarem, který na počítači běží (např. Flash, Processing, MaxMSP ad.)

Velkou výhodou Arduina je jeho otevřenost - na oficiálních stránkách je k dispozici veškerá dokumentace, je tedy možné si desku spájet doma, nebo si lze objednat již sestavenou. (Nebo je dokonce možné si ji sestavit s použitím kontaktního pole ;) )

Obsah

[editovat] Druhy desek

Arduino existuje v několika různých provedeních:

K základní desce může být připojena ještě další rozšiřující - tzv. shield, která přidá novou funkcionalitu - například připojení k ethernetu, ovládání motorů atd.

[editovat] Zapojení desky a nahrávání programu

Připojení desky k počítači se provádí pomocí USB kabelu, přes něj se programy do Arduina i nahrávají. Při prvním připojení je zapotřebí nainstalovat ovladače. Podrobný postup pro instalaci je možné nalézt na této stránce (OS Windows, Linux, Mac).

Pro psaní programů se (typicky) používá vlastní vývojové prostředí napsané v javě, které lze zdarma stáhnout (opět pro Windows, Linux nebo Mac). V tomto IDE se program (v "arduino-slangu" nazývaný skeč :) ) zkompiluje a nahraje do procesoru. V procesoru už je nahrán bootloader, který umožňuje přímé nahrání skeče bez nutnosti používat další hardware. Nicméně je možné pomocí jednoduché editace souboru nastavení použití bootloaderu zakázat a pro nahrání skeče použít libovolný programátor (např. Dragon nebo "home-made" ISP programátor - oficiální stránky Arduina dokonce obsahují návod, jak si takový "home-made" programátor vyrobit ;) ).

Krokování programu se (alespoň pokud vím) ve standardním IDE nekoná, tento nedostatek je však možné obejít dvěma způsoby:

  1. použitím funkce Serial.print([value]), což je obdoba stdout v C/C++, vypisuje tedy hodnoty programových proměnných. V IDE je pak nutné kliknout na tlačítko Serial Monitor, které otevře nové okno, do kterého budou hodnoty vypisovány. Je zde i možnost posílat data na desku.
  2. vzhledem k možnosti použití vlastního programátoru pro nahrávání skečí do procesoru lze použít například již zmíněný AVR Dragon v kombinaci s avr-gcc a AVR studiem nebo avrdude a pomocí těchto nástrojů program krokovat, stejně jako to provádíme na cvičeních. (V tomto případě je třeba programy psát přímo v AVR C/C++.)


Sketche pro Arduino jsou kompilovány pomocí avr-gcc, vytvořené objektové soubory jsou slinkovány se standardními knihovnami Arduina a poté je vzniklý hex file nahrán do mikroprocesoru.

[editovat] Programy

Ovládání IDE je poměrně intuitivní, základní informace lze v případě potřeby nalézt na stránce s instalací.

[editovat] Hello world

...aneb blikání jednou diodou. Často se používá jako test funkčnosti, protože některé desky, např. Duemilanove nebo Diecimila, v sobě mají diodu již zabudovanou (na pinu 13), takže pro blikání lze využít tuto a není tak ani potřeba připojovat diodu "fyzickou". Lze tak rychle zjistit, jestli deska správně funguje.

(převzato z oficiálních příkladů; pro zajímavost můžete porovnat s podobným příkladem ze cvičení :) )

/* Blink 

Opakovaně na 1 vteřinu zapíná a vypíná diodu připojenou k pinu 13.  */


int ledPin =  13;    // pin, na kterém je dioda připojena

// setup - proběhne jedenkrát  při spuštění skeče
void setup()   {                
 // inicializace pinu jako výstupního
 pinMode(ledPin, OUTPUT);     
}

// metoda loop() běží stále dokola, dokud je Arduino napájeno
void loop()                     
{
 digitalWrite(ledPin, HIGH);   // zapneme diodu
 delay(1000);                  // čekáme vteřinu
 digitalWrite(ledPin, LOW);    // vypneme diodu
 delay(1000);                  // čekáme vteřinu
}


Na tomto jednoduchém příkladu si lze všimnout několika věcí:

  • syntaxe je podobná C/C++. To samozřejmě není překvapení, protože jazyk používaný v IDE je vlastně jen jakousi sadou funkcí v C/C++. Před kompilací je kód jen drobně upraven a poté zkompilován pomocí klasického avr-gcc.
  • funkce setup() a loop() - tyto funkce jsou obsaženy v každé skeči pro Arduino. Funkce setup() se vždy volá pouze jednou na začátku, slouží k inicializaci proměnných, pinů, knihoven atd. Funkce loop() je, jak již název naznačuje, nekonečná smyčka, do jejíhož těla se píše kód, který má být vykonáván, tj. vlastní logika programu.
  • funkce pinMode(čísloPinu,MÓD) nastavuje zadaný pin jako vstupní nebo výstupní.
  • funkce digitalWrite(čísloPinu,HODNOTA) určuje, bude-li příslušný výstupní pin připojený k napětí (5V) nebo k zemi (0V). Je-li v MÓDu zadáno klíčové slovo HIGH, bude na pinu 5V, je-li zadáno LOW, na pinu bude 0V. Pokud je pin nastaven jako vstupní, jeho nastavení na HIGH zapne jeho pull-up rezistor, nastavení na LOW tento rezistor vypne.

[editovat] Maticový displej

Trochu složitější příklad ukazující, jak něco zobrazit na maticovém displeji připojeném k Arduinu.

Použitý displej má 8x8 LED, které mohou svítit červeně nebo zeleně. Pokud použijeme např. pouze červenou, bude stačit zapojit 16 pinů namísto všech 24. Zapojí se podle tohoto schématu (velmi pěkného).

Princip funguje tak, že obrazec či obrazce, které chceme na displeji zobrazovat, máme definované pomocí 1 a 0 v poli 8x8, kde 1 udává, že tento bod displeje budeme chtít rozsvítit, 0 že nikoli. V každém průchodu funkce loop() procházíme postupně všechny řádky a pro každý z nich všechny sloupce matice displeje, a pokud příslušný bod displeje koresponduje s 1 v poli obrazce, rozsvítíme ho. Po projití všech sloupců daného řádku celý řádek zhasneme. Díky setrvačnosti lidského oka se bude zdát, že jsme displej rozsvítili celý najednou. Máme-li více obrazců, po určitém počtu průchodů funkcí loop() změníme ukazatel na obrazec, čímž budeme v dalších průchodech vykreslovat obrazec daný tímto "novým" ukazatelem.

Kód programu (jádro vychází z programu na této stránce):

 /* Zobrazení obrazců na maticovém displeji 8x8 */
 
 int pixel;       // aktuálně procházený pixel displeje   
 int radek;       // aktuálně procházený řádek
 int sloupec;     // aktuálně procházený sloupec
 int counter = 0; // čítač průchodů smyčkou loop()
 int o = 1;       // vykreslovaný obrazec
 
 
 /* pole odpovídá rozmístění diod na displeji,
    1 = dioda svítí, 0 = dioda nesvítí */
 int obrazec1[64] = 
 {
   0,0,0,1,1,0,0,0,
   0,0,1,0,0,1,0,0,
   0,1,0,0,0,0,1,0,
   1,0,0,0,0,0,0,1,
   1,0,0,0,0,0,0,1,
   0,1,0,0,0,0,1,0,
   0,0,1,0,0,1,0,0,
   0,0,0,1,1,0,0,0
 };
 
 int obrazec2[64] = 
 {
   0,0,0,0,0,0,0,0,
   0,0,0,1,1,0,0,0,
   0,0,1,0,0,1,0,0,
   0,1,0,0,0,0,1,0,
   0,1,0,0,0,0,1,0,
   0,0,1,0,0,1,0,0,
   0,0,0,1,1,0,0,0,
   0,0,0,0,0,0,0,0
 };
 
 int obrazec3[64] = 
 {
   0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,
   0,0,0,1,1,0,0,0,
   0,0,1,0,0,1,0,0,
   0,0,1,0,0,1,0,0,
   0,0,0,1,1,0,0,0,
   0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0
 };
 
 int obrazec4[64] = 
 {
   0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,
   0,0,0,1,1,0,0,0,
   0,0,0,1,1,0,0,0,
   0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0,
   0,0,0,0,0,0,0,0
 };
 
 int* obrazec = obrazec1;  // obrazec, který budeme vykreslovat
 
 
 void setup()
 {
 // nastavení pinů jako výstupů (na Arduinu používáme piny 2-18)
 for (int i = 2; i < 18; i++)
   {pinMode(i, OUTPUT);}
 }

 
 void loop()
 {
   pixel = 0;  
   
   // scan displeje - procházíme řádky
   for (radek = 10; radek < 18; radek++) 
   {
     // připojení společné katody na zem
     digitalWrite(radek , LOW);
     
     // procházíme sloupce
     for (sloupec = 2; sloupec < 10; sloupec++) 
     {
         // vykreslujeme-li 4.obrazec, který má nejméně svítících bodů, budeme s nimi svítit o trochu déle,
         // aby každý obrazec byl na displeji zhruba stejnou dobu
         if (o == 4) {
           // pokud v poli odpovídá diodě "1", je rozsvícena
           if (obrazec[pixel] == 1) {
             digitalWrite(sloupec, HIGH); 
             delayMicroseconds(1500); 
             digitalWrite(sloupec, LOW);
           }        
         }
         
         // 3.obrazec má méně svítících bodů než první dva, budeme s nimi svítit opět trochu déle
         else if (o == 3) {
           // pokud v poli odpovídá diodě "1", je rozsvícena
           if (obrazec[pixel] == 1) {
             digitalWrite(sloupec, HIGH); 
             delayMicroseconds(700); 
             digitalWrite(sloupec, LOW);
           }        
         }
       
         else {
           // pokud v poli odpovídá diodě "1", je rozsvícena
           if (obrazec[pixel] == 1) 
           {
             digitalWrite(sloupec, HIGH); 
             delayMicroseconds(550); 
             digitalWrite(sloupec, LOW);
             
           }
         }              
          
         pixel = pixel + 1;
     }
         
     // připojení katody na +, zhasnutí řádku    
     digitalWrite(radek , HIGH); 
   }
   
   counter++;
   
   // po určitém počtu průchodů loop smyčkou (20) změníme obrazec
   if (counter%20 == 0) {
     switch(o) {
       case 1:
         obrazec = obrazec2;
         counter = 0;
         o = 2;
         break;
       case 2:
         obrazec = obrazec3;
         counter = 0;
         o = 3;
         break;
       case 3:
         obrazec = obrazec4;
         counter = 0;
         o = 4;
         break;
       case 4:
         obrazec = obrazec1;
         counter = 0;
         o = 1;
         break;        
     }
   }    
   
 } // end loop

[editovat] Odkazy

Oficiální stránky, kde je možné najít prakticky veškeré informace ohledně Arduina

Český obchod, kde je možné objednat si desky a příslušenství

Arduino od dovozce RS, lze vyzvednout za den či dva nedaleko FEL

Stránky J.Navrátila, na kterých lze najít mnoho informací včetně použití maticového displeje a několika dalších "arduino projektů"

Povedený tutoriál na ladyada vhodný i pro úplné začátečníky

Fórum na oficiálních stránkách, kde lze také najít mnoho užitečných informací

Osobní nástroje