Zápisník experimentátora
Hierarchy: Osvetlenie RC modelu lietadla
Kamarát sa venuje lietaniu s RC modelmi lietadiel. Požiadal ma o napísanie programu, ktorý bude osvetľovať jeho model tak, aby bolo lietadlo dobre viditeľné aj počas horšieho počasia. Tento program je návrhom algoritmu, ktorý bude blikať LED diódami.
V lietadle sa majú nachádzať tri 10W LED diódy. Majú postupne blikať tak, aby bolo lietadlo dobre viditeľné. Tri diódy sa nachádzajú na:
Pretože LED diódy v podstate iba bliknú, nie je potrebné ich chladenie a všetko chladenie by mal zabezpečiť prúdiaci vzduch okolo modelu. 10 W LED diódy sú konštruované ako matica 3x3 LED diód. Pripájajú sa na 12 V a dokopy odoberajú 900 mA (ideálne v podobe prúdového zdroja). To sú len orientačné hodnoty, môže sa pochopiteľne použiť aj menší prúd.
Napísanie kódu, ktorý by splnil dané zadanie je triviálne. ATtiny85 má za bežných okolností 5 digitálnych pinov. Na tri LED diódy nám stačia tri piny. V programe sú použité piny 0, 1 a 2. Štruktúra pattern nám definuje dvojicu čas čakania a rozsvietenie jednotlivých LED diód.
V premennej p je uložené pole vzoriek, ktoré predstavujú zmeny svietenia jednotlivých LED diód. Čiže celý algoritmus robí to, že nastaví danú vzorku a potom čaká určitý počet milisekúnd. Takto sa to opakuje, kým sa celé pole vzoriek nezanimuje a potom sa všetko opakuje. Jediná konštrukcia jazyka C by mohla robiť problémy. digitalWrite(led1, value&0b001 ? HIGH : LOW); znamená to, že ak je bit 0 rovný jednotke, potom zapni danú LED diódu. Podobne sa obsluhujú aj zvyšné dve diódy.
const uint8_t &value=p[i].value; je premenná typu referencia a je tam preto, aby bol výsledný kód pekne čitateľný.
Kód bol skompilovaný s jadrom pre ATtiny od Davida Mellisa z vetvy pre 1.6.x.
const int led1=0;
const int led2=1;
const int led3=2;
struct pattern {
long ptime;
uint8_t value;
};
// 50ms - pattern
// led1
// 10000000000000000000
// led2
// 01000000000000000000
// led3
// 00110000000000000000
//
const pattern p[]= {
{50,0b001},
{50,0b010},
{100,0b100},
{800,0b000},
};
const int plen=sizeof(p)/sizeof(pattern);
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}
void loop() {
for(int i=0;i<plen;i++) {
const uint8_t &value=p[i].value;
digitalWrite(led1, value&0b001 ? HIGH : LOW);
digitalWrite(led2, value&0b010 ? HIGH : LOW);
digitalWrite(led3, value&0b100 ? HIGH : LOW);
delay(p[i].ptime);
}
}
Toto bol len prvý krok, ktorý mal odskúšať, či algoritmus robí to, čo si jeho autor predstavoval. Mám to síce poskladané len na vývojovej doske s malými LED diódami, ale vizuálne sa mi to celkom pozdáva. Uvidíme, či sa bude skladať aj zvyšok obvodu, ktorý by sa mal nachádzať v trupe lietadla.
Zdrojový kód je na tejto stránke.
03.05.2016