Experimenty so 7 segmentovým displejom z mikrovlnky

Zápisník experimentátora

Tento nádherný displej som vymontoval z pokazenej mikrovlnky. Od bežných displejov sa líši tým, že okrem štyroch čísiel dokáže zobraziť aj desať šípok. V mikrovlnke sa to používa na indikáciu zvoleného programu. Pre nás to môže poslúžiť ako príjemné rozšírenie možností displeja. V tomto článku si vyskúšame niekoľko experimentov a nadobudnuté vedomosti sa dajú využiť aj pri iných sedemsegmentových displejoch.

Ako displej získať

Toto je najväčší kameň úrazu, ale aspoň nás donúti naučiť sa princíp konštrukcie sedemsegmentových displejov a ako sa tieto displeje dajú používať. Na experimenty budeme potrebovať:

  • SMC-E22E/E30S-GNE - Toto je konkrétne môj displej, ktorý som vymontoval z pokazenej mikrovlnky.
  • Skúšobné pole
  • 8x rezistor 1k - Displej má 8 katód a na každú pripojíme jeden rezistor. V takomto zapojení potečie cez jednu diódu iba pár mA, čiže nebude svietiť priveľmi jasno. Podľa dokumentácie tento displej znesie až 30 mA na jednu diódu.
  • Arduino Pro Mini

Vnútorné zapojenie displeja

Tu je popisované zapojenie môjho displeja. Iné displeje budú mať zapojenie vývodov iné. Vždy sa treba snažiť nájsť datasheet ku konkrétnemu displeju, alebo objaviť prepojenie vývodov pomocou multimetra.

Na Internete sa mi nepodarilo nájsť datasheet priamo k tomuto displeju, ale priložený datasheet je k nejakému veľmi podobnému modelu. Všimnite si, že displej má len jeden rad vývodov na zadnej strane. Zapojenie jednotlivých diód je na schéme. Môže vyzerať nepochopiteľne, ale zo schémy je vidno, že vývody anódy 9, 10, 12 a 13 slúžia na ovládanie čísla a anóda 11 na ovládanie šípok. Neplatí to úplne doslovne, ale na základnú orientáciu to stačí.

Celkovo máme k dispozícii 40 LED diód, čo nám dáva veľký priestor na tobrazenie požadovanej informácie.

Na rozdiel od iných sedemsegmentových displejov má tento displej vývody zapojené logicky. Nie sú vôbec poprehadzované a prvých 8 sú katódy a zvyšných 5 sú anódy.Preto sa to dobre pamätá a aj zapojenie na skúšobnom pili vyzerá pekne. Je to vidno aj na obrázku hore.

Ako displej pripojiť k Arduinu

Pri pripojení displeja je rozumné trošku preskúmať porty mikrokontroléra ATmega328P a zapojiť to podľa nich, aby ste si ušetrili množstvo zbytočného programovania. Preto je vhodné, ak všetky anódy pripojíte na jeden port a všetky katódy na druhý port.

  • PORTD - Sem sa pripojí 8 katód. V Arduine sú to piny 0, 1, 2, 3, 4, 5, 6, 7. Pozor na to, že pri takomto zapojení kolidujeme so sériovým portom. Ale ten v nasledujúcich príkladoch nebudeme potrebovať.
  • PORTB - Sem sa pripojí 5 anód. V Arduine sú to piny 8, 9, 10, 11, 12.

Nezabudnite pripojiť na všetky katódy rezistory. V mojich príkladoch sú použité rezistory s hodnotou 1k, aby som nemal problémy s fotografovaním, ale pokojne môžete použiť obĺúbené hodnoty 330R, ak si potrpíte na poriadny jas diód.

Príklad 1 - Zobrazenie čísiel

Prvý príklad nám poslúži ako odrazový mostík. Pomocou neho si vysvetlíme, ako sa dá pomocou štyridsiatich LED diód vytvoriť číslo na displeji. Na prvý príklad ale nebudeme potrebovať všetky vývody displeja. Bude nám stačiť jedna anóda a 8 katód. Celý príklad bude fungovať na prvom mieste zo štyroch možných na displeji.

Na tomto displeji sú katódy zapojené nasledovne.

    3
   6 2
    5
   7 1
    8

Chýbajúca LED 4 je napojená na hornú šípku a v tomto príklade ju nebudeme potrebovať.

Najprv si zadefinujeme čísla od 0 po 9. Pretože máme 8 katód, môžeme pre každú LED diódu vyhradiť 1 bit. Jednotlivé čísla sú uložené v poli numbers a celkový počet čísiel máme v premenne cnt. Daný vzorec nám pohodlne spočíta kompilátor a pretože sme premennú označili ako const, vo výsledom programe nám kompilátor všetko zredukuje na nastavenie konštantnej hodnoty.

uint8_t numbers[]={
  0b11100111, // 0
  0b00000011, // 1
  0b11010110, // 2
  0b10010111, // 3
  0b00110011, // 4
  0b10110101, // 5
  0b11110101, // 6
  0b00000111, // 7
  0b11110111, // 8
  0b10110111, // 9
};

const uint8_t cnt = sizeof(numbers)/sizeof(uint8_t);

Teraz môžeme nastaviť jednotlivé piny na doske. Všetky ktoré budeme používať nastavíme ako výstupy. Kvôli prehľadnosti som vo funkcii setup použil funkcie pinMode. Prvú anódu príkazom digitalWrite nastavíme na HIGH, aby do pinu dodávala prúd. Keď teraz niektorú katódu pripojíme na GND, prúd bude pretekať a dióda sa rozžiari.

// Anodes - 8, 9, 10, 11, 12
const int ANODE = 8;

void setup() {
// cathodes (PORTD)
for(int i=0;i<8;i++)
  pinMode(i,OUTPUT);

// anodes (PORTB)
pinMode(ANODE,OUTPUT);

// turn on 1st digit
digitalWrite(ANODE,HIGH);
}

A aby sme videli animáciu, postupne budeme nastavovať jednotlivé katódy. Kód je až prekvapujúco jednoduchý. V cykle postupne nastavujeme jednotlivé čísla a počkáme sekundu, kým sa prepneme na ďalšie. Čo vlastne robí riadok PORTD=~numbers[i];? Pretože sme všetky katódy dali na rovnaký port, nemusíme každý jednotlivý pin zapnúť alebo vypnúť. Môžeme to urobiť jedinou operáciou priradenia. Znak ~ vykoná negáciu bitov, pretože náš displej vyžaduje, aby sa svietiaca dióda pripojila na GND. Pretože máme definície svietiacich bitov ako jednotky (lepšie sa to človeku potom predstavuje), musíme ich prehodiť na opačnú logickú hodnotu, aby sa nám zapli správne diódy.

void loop() {
for(int i=0;i<cnt;i++)
  {
  PORTD=~numbers[i];
  delay(1000);
  }
}

Určite vás teraz napadlo, či by sme mohli zobrazovať čísla aj na ďalších pozíciach. Pokiaľ potrebujete iba posunúť číslo, urobíte to zmenou premennej ANODE. Čo by sa stalo, keby ste zapojili dve anódy? Len by sa rozsvietilo rovnaké číslo aj na ďalšej pozícii. Diódy by ale svietili slabšie, pretože pretekajúci príd by bol rovnaký a musel sa rozdeliť na dve vetvy.

Príklad 2 - animácia šípok

V druhom príklade sa zameriame na animovanie šípok. Budeme postupne zapínať každú šípku. Tu už nevystačíme s ovládaním katódy a musíme naraz nastavovať anódu aj katódu. Aby sme nemuseli pracne nastavovať rôzne kombinácie pinov, dopredu si vytvoríme bitové mapy pre PORTB a PORTD.

uint8_t arrow[][2]={
  {0b00001000,0b00000001},
  {0b00001000,0b00000010},
  {0b00001000,0b00000100},
  {0b00001000,0b00001000},
  {0b00001000,0b00010000},
  {0b00000001,0b00000100},
  {0b00010000,0b00000100},
  {0b00100000,0b00000100},
  {0b10000000,0b00000100},
  {0b01000000,0b00000100},
};

const uint8_t cnt = sizeof(arrow)/(sizeof(uint8_t)*2);

Vo funkcii setup iba nastavíme všetky piny ako výstupy.

void setup() {
// cathodes (PORTD)
for(int i=0;i<8;i++)
  pinMode(i,OUTPUT);

// anodes (PORTB)
for(int i=8;i<13;i++)
  pinMode(i,OUTPUT);
}

Celé čaro animácie vykoná niekoľko jednoduchých priradení. Na PORTB najprv priradím 0, čim všetky diódy zhasnem. Potom na PORTB zapnem na logickú jednotku tie diódy, ktoré majú svietiť. A na PORTD musím opät urobiť priradenie negovanej hodnoty, pretože tieto piny potrebujem uzemniť.

void loop() {
for(int i=0;i<cnt;i++) {
  PORTB=0;
  PORTD=~arrow[i][0];
  PORTB=arrow[i][1];
  delay(1000);
  }
}

Príklad 3 - od statického ku spojitému

Posledný príklad nás pripraví na to, ako na displeji zobrazovať ľubovoľnú kombináciu čísiel a šípok. Tu si ukážeme iba princíp pomocou skracovania času medzi prepnutím jednotlivých diód. V samostatnom článku si ukážeme, ako na túto činnosť využiť prerušenia a časovač.

Algoritmus bude v tomto prípade postupne skracovať časový interval a budeme sledovať, kedy z jednotlivých prepínajúcich sa diód vznikne spojité svietenie všetkých LED diód. To je okamih, ktorý hľadáme. Našli sme takú obnovovaciu frekvenciu, pri ktorej už ľudské okolo nerozozná blikanie jednotlivých diód a vśetko sa mu javí ako svetlo.

uint8_t arrow[][2] = {
  {0b00001000, 0b00000001},
  {0b00001000, 0b00000010},
  {0b00001000, 0b00000100},
  {0b00001000, 0b00001000},
  {0b00001000, 0b00010000},
  {0b00000001, 0b00000100},
  {0b00010000, 0b00000100},
  {0b00100000, 0b00000100},
  {0b10000000, 0b00000100},
  {0b01000000, 0b00000100},
};

const uint8_t cnt = sizeof(arrow) / (sizeof(uint8_t) * 2);

// Anodes - 8, 9, 10, 11, 12

long DLY = 100000L;

void setup() {
  // cathodes (PORTD)
  for (int i = 0; i < 8; i++)
    pinMode(i, OUTPUT);

  // anodes (PORTB)
  for (int i = 8; i < 13; i++)
    pinMode(i, OUTPUT);
}

void loop() {
  for (int i = 0; i < cnt; i++) {
    //PORTB = 0;
    PORTB = arrow[i][1];
    PORTD = ~arrow[i][0];

    if (DLY > 1000)
      delay(DLY / 1000);
    else
      delayMicroseconds(DLY);
  }

  if (DLY > 50000L)
    DLY -= 5000;
  else if (DLY > 10000L)
    DLY -= 1000;
  else if (DLY > 1000L)
    DLY -= 100;
}

Zdrojové texty

Všetky zdrojové texty sa nachádzajú na GitHub.

  • microwave_01 - Príklad 1.
  • microwave_02 - Príklad 2.
  • microwave_03 - Príklad 3.

Video

Aby ste si vedeli príklady názornejšie predstaviť, všetky príklady sú aj na videu.

Pokračovanie

V nasledujúcom článku si vyskúšame časovač a prerušenia, aby sme na displeji zobrazili ľubovoľnú kombináciu znakov.



Download

17.12.2016


Menu