Zápisník experimentátora
Tento článok sa sústreďuje na rýchlejšie verzie Arduina. Obe vyžadujú napájanie 3,3 V a obe majú dostatočný počet PWM výstupov, aby sa s nimi dali robiť pohodlné efekty bez doplňujúsich obvodov. Sústredíme sa na tri algoritmy, ktoré budú ovládať LED diódy. Budú to drobné variácie na tému Knight Rider alebo Larson Scanner.
Arduino Due mám z Aliexpresu, ale dnes je najvýhodnejšia cena asi na Banggood. Teensy 3.2 som si kúpil ako doplnok ku výrobe plošného spoja na OSH Park. A kvôli pohodlnosti používam pomocný plošný spoj s ôsmimi LED diódami a ôsmimi rezistormi, aby som nemal skúšobné pole také zapratané vodičmi.
Všetky tri algoritmy budú na tému Knight Ridera. Tak ten blikajúci efekt nazývame u nás. Američania mu hovoria Larson Scanner, pretože tam viac pozerali aj seriál Battlestar Galactica, kde bolo niečo podobné použité.
Obe Arduina majú dostatok PWM výstupov, takže sa dá celý efekt pohodlne vytvoriť. Líšia sa medzi sebou ina číslami pinov, ktoré podporujú PWM. Budeme potrebovať 8 pinov.
Takto vyzerá tretí algoritmus na Arduino Due.
Takto vyzerá tretí algoritmus na Teensy.
Základom je vytvoriť si pole pinov, ktoré predstavujú LED diódy s PWM výstupmi.
Arduino Due ich má napríklad takto.
const int led[]={3,4,5,6,7,8,9,10};
const int ledsize=sizeof(led)/sizeof(int);
Teensy 3.2 ich má napríklad takto.
const int led[]={3,4,5,6,9,10,23,22};
const int ledsize=sizeof(led)/sizeof(int);
Zvyšok programu je už v oboch prípadoch rovnaký. Tu sa prejavuje sila knižníc Arduina, ktoré vďaka dobre navrhnutej abstrakcii dokážu fungovať na úplne rozdielnych mikrokontroléroch.
Nastavenie konkrétneho algoritmu a rýchlosti animácie.
// select algorithm
#define algo_digital
//#define algo_analog1
//#define algo_analog2
// speed in millis (500-slow, 100-normal, 10-fast)
#define spd 100
Samotné algoritmy.
void setup()
{
for(int i=0;i<ledsize;i++)
pinMode(led[i], OUTPUT);
}
void loop()
{
for(int i=0;i<ledsize;i++)
{
// simple moving LED
#if defined(algo_digital)
digitalWrite(led[i], i==pos ? HIGH : LOW);
#endif
// active LED is brighter, inactive LED is lighter
#if defined(algo_analog1)
analogWrite(led[i], i==pos ? 40 : 1);
#endif
// 3 different light intesities
#if defined(algo_analog2)
int val=0;
switch(abs(i-pos))
{
case 0: // active
val=40;break;
case 1: // one to the left and one to the right
val=10;break;
default:// inactive
val=1;break;
}
analogWrite(led[i], val);
#endif
}
pos+=dir;
if(pos==0)
dir=1; // move to the right
if(pos==ledsize-1)
dir=-1; // move to the left
delay(spd);
}
S parametrami programov sa dá podľa vlastnej chuti experimentovať, toto berte iba ako vzor, ktorý mal poslúžiť na oboznámenie sa s týmito výkonnými mikrokontrolérmi.
11.10.2015