Osvetlenie pre RC model lietadla

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.

Myšlienka

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:

  • Ľavé krídlo
  • Pravé krídlo
  • Na trupe v blízkosti chvostovky

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.

Zdrojový kó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);
  }
}

Realizácia

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.

GitHub

Zdrojový kód je na tejto stránke.


03.05.2016


Menu