Hlavní navigace

Hrátky s LED a tlačítky pod Linuxem

11. 6. 2009
Doba čtení: 5 minut

Sdílet

V dnešním pokračování seriálu o Linuxu s páječkou v ruce začneme prvním praktickým zapojením. Použijeme paralelní port a jeho 5 vstupů a 12 výstupů. Zapojení je poměrně jednoduché - vezmeme 12 LED a přes odpory 1k2 je připojíme na výstupy paralelního portu proti zemi.

LEDky nebudou moc svítit kvůli velkým odporům (lepší by byly cca 330 ohm), ale nechceme příliš zatěžovat výstupy paralelního portu. Kdo má hotový oddělovač portu, může osadit odpory 330 ohm.

Schéma

Na schématu je rovnou zakreslena i druhá – vstupní – část s tlačítky. Tu není nutné mít pro správnou funkci výstupu – části se nijak neovlivňují.

Foto LED

Úvod do LED

LEDky doporučuji předem vyzkoušet (s odporem!) na 5V zdroji (s 1k2 klidně i na 12V zdroji). V případě použití šuplíkových zásob tím lze předejít velmi dlouhému debuggingu. Také se tak snadno dozvíme, která noha LEDky má jít na zem a která na port. LEDka má, stejně jako každá dioda, anodu a katodu. Voltampérová charakteristika diody je v závěrném směru (katoda na +) těsně pod napěťovou osou (téměř žádný proud) až do okamžiku průrazu (12V zatím všechny LEDky, co jsem měl, v závěrném směru snesly, ale je lépe se kouknout do katalogu, je-li). V propustném směru (anoda na +) je to exponenciela. Průsečíku její tečny v nekonečnu s osou napětí se říká prahové napětí. To je napětí, při kterém začíná LEDkou protékat nějaký rozumný (použitelný) proud. Toto napětí je pro LEDky svítící ve viditelném oboru 1.8V (červená) – 3.5V (modrá). To je důvod, proč zelená LED nesvítí na dvě NiCd baterie, ale červená ano. Bílá LED neexistuje, jedná se zpravidla o UV LED s luminoforem, jako je v zářivce. Charakteristiku a mnohem víc o diodách naleznete na Wikipedii.

Nové (nepoužité) LEDky mají zpravidla delší vývod, který vede na anodu (+) a ty, které jsou kulaté, mají pouzdro seříznuté u katody (-). Při pohledu do LED (má-li průhledné pouzdro) je vidět, že jeden vývod je uvnitř větší a je v něm malý krystalek a z druhého vede na vršek toho krystalku drátek. Krystalek je katoda. Pozor na testování multimetrem – nemusí být úspěšné. Běžné multimetry mají diodový test do 2V, což ukáže nějakou hodnotu pro IR LED a pro většinu červených LED. Pro ostatní LEDky už napětí nestačí a měřák se tváří, jakoby byla LEDka přerušená (spálená).

Další informace o LEDkách opět na Wikipedii.

Supersvítivé LEDky je také možno zkoušet poněkud neobvyklým způsobem na autobaterii, nebo jiném přibližně 12V zdroji. LEDku vezmeme za jeden vývod rukou, přiložíme druhým na baterií a druhý pól baterie připojíme prstem (klidně druhé ruky). V krystalu supersvítivé LED uvidíme poměrně jasné světélko ve správné barvě. Pokud ne, prohodíme polaritu LED (nebo baterie). 12V stejnosměrných je podle normy bezpečné napětí i ve zvláště nebezpečném prostředí (po kolena ve vodě, apod.), takže postup je zcela bezpečný, ale neprovádějte ho s baterií připojenou na nabíječku, nebo jiný zdroj (pokud nemáte naprostou jistotu, že je dostatečně galvanicky oddělen od sítě).

Bezpečné napětí je taková pomocná berlička (je stanovené normou) protože to, co zabíjí, je proud. Jenomže proudu si každý spotřebič vezme podle svého odporu a nebezpečný proud dokáže dodat do zkratu snad i baterka do digitálek. To, co lze ovlivnit, je napětí a tak se definuje podle bezpečnosti prostoru a průběhu (stejnosměrné / střídavé). Viz Elektrika.cz Pro práci s počítači stačí vědět, že 12V střídavých a 25V stejnosměrných jsou bezpečná napětí za jakýchkoliv okolností (kdo si někdy zkusil olíznout vývody 9V baterie, ví, že bezpečný nemusí znamenat příjemný).

Ovládání výstupu

Výstupy lze ovládat jednoduchým programem par_out. Použijte svou adresu portu (uvedená 0×378 je nejčastější), zpravidla se uvádějí v hexa, takže si nesmažte prefix 0×.

Zde je zdrojový kód par_out.c:

#include "parport.h"
#include <stdio.h"
#include <unistd.h>

#define PARPORT 0x378

int
main(int argc, char *argv[])
{
        int value;
        if(argc<=1)
                return 1;

        init_parport(PARPORT);

        if( sscanf(argv[1],"%i",&value) == 1){

                value&=0x0FFF; //get last 12 bits
                value^=0x0b00; //invert some bits
                //printf("%d\n",value);
                parport_write(value&0xFF);
                //printf("v1:%d\n",value&0xFF);
                parport_write2((value&0x0F00)>>8);
                done_parport();
                return 0;
        }else{
                done_parport();
                return 1;
        }

}

Ke stažení: par_out.c, parport.h a Makefile

Program přijímá jedno číslo jako parametr, omezí ho na 12 bitů, zneguje 9., 10., 11. bit a pošle ho na port. Některé výstupy portu jsou v hw negované, proto je tento program neguje zpět. Tedy „1“ znamená svítící LED a „0“ zhasnutou.

Pak není problém napsat v Bashi třeba jezdící světlo:

for a in `seq 1 10`; do
        for b in 1 2 4 8 16 32 64 128 256 512 1024 2048; do
                par_out "$b"
        done
done

Pokud to nefunguje korektně (hlavně nejvyšší 4 bity), je třeba vyzabíjet všechny tiskové daemony, kteří se s námi perou o ten port.

Další zajímavá aplikace jsou binární hodiny:

while true; do
        par_out "$(date '+%H*128+%M'|bc)"
        sleep 1;
done

K něčemu by šla využít i sedmá LEDka. Mohla by třeba blikat, aby bylo na první pohled vidět, jestli počítač stále žije a zároveň tím oddělí hodiny a minuty:

blik=0
while true; do
        if [ $blik = 0 ]; then
                export blik=64
        else
                export blik=0
        fi
        par_out "$(date '+%H*128+%M'|sed
"s/$/+$blik/"|bc)"
        sleep 1;
done

Ovládání vstupu

Další program naopak čte vstupy a vypisuje přečtené číslo na stdout. Číslo je posunuté o 3 bity doprava (nejnižší tři čtené bity nejsou spojeny s žádným hardware) a bity, které jsou hardwarově negované, jsou negované zpět.

Tlačítka
Tlačítka zezadu

Zde je zdrojový kód par_in.c:

#include "parport.h"
#include <stdio.h>
#include <unistd.h>

#define PARPORT 0x378

int
main(int argc, char *argv[])
{
        int value;

        //if( !
        init_parport(PARPORT);
        //      return 1;

        value=parport_read();

        value/=8; //move LSB to bít 0
        value^=0x09;
        //invert bits 0 and 3 (3 and 6 before move) according to manual
        //value^=0x0f;
        //invert bits 0, 1, 2 and 3 - needed on my computer

        printf("%x\n", value);
        //decadic output
        printf("%d%d%d%d%d\n", value&0x10?1:0, value&0x08?1:0, value&0x04?1:0, value&0x02?1:0, value&0x01?1:0);
        //binary output

        done_parport();
        return 0;
}

Ke stažení: par_in.c

Cloud 24 - tip 1

Je možné, že budete muset XORovat přečtenou hodnotu jinou maskou. Na nějaké šikovné využití zajisté přijdete sami.

Příště

Příště si ukážeme, jak postavit jednoduchý oddělovač paralelního portu, který umožní zvýšit jas LEDek a ochrání paralelní port před zničením v případě nějaké chyby. Jeho nevýhoda je, že musí být napájen +5V, ale napětí z USB portu bohatě postačí. Možná jsem měl oddělovačem začít, ale dát hned do prvního dílu něco, co je vlastně k ničemu, mi přišlo podlé. Aby i podle příštího dílu šlo postavit něco použitelného, představím vám program, kterým za pomoci tří tlačítek na paralelním portu ovládám již asi šest let hlasitost audiovýstupu počítače.

Byl pro vás článek přínosný?