Pokusy s optočlenom RPR 220 a ATtiny13

RPR 220 je kombinácia diódy a fototranzistora v jednom púzdre. Spolu tvoria fotoreflektor, ktorý sa dá využiť na zachytenie pohybu a detekciu telies. Celé to začalo jednou staršou tlačiarňou, z ktorej som vytiahol zaujímavú dosku plošného spoja.

Doska plošných spojov s RPR 220

V pravej časti dosky, na pozíciách PH703 a PH702 sú ešte fotoreflektory. Ten z pozície PH701 som už vytiahol na pokusy. Fungujú veľmi jednoducho. Svetlo je vysielané diódou (tmavšia diera) a ak sa má od čoho odraziť, tak prijímané fototranzistorom (svetlejšia diera). Pre viac informácií si preštudujte datasheet. Stiahnete si ho kliknutím na nasledujúci odkaz : datasheet súčiastky RPR220

Prvé pokusy s ATtiny13

Na začiatok som začal s veľmi jednoduchým programom a zapojením. Podľa nasledujúcej schémy som  k mikroprocesoru ATtiny13 pripojil fotoreflektor a jednu LED diódu.

Skrátene sa to zapojenie dá opísať takto : Vždy, keď prejdete rukou popred fotoreflektor, mikroprocesor rozsvieti LED diódu.

Podrobne zase takto : V zapojení využívam len dva vývody mikroprocesora – PB3 (pin č. 2.) a PB4 (pin č. 3.). PB3 je výstupný, spína LED diódu. PB4 je vstupný, načítava stav optoreflektora RPR220. Keď prejdem rukou (prstom, alebo hocičím iným) popred fotoreflektor, svetlo sa od nej odrazí. Toto odrazené svetlo prijme tranzistor a otvorí. Mikroprocesor zistí na pine PB4 logickú úroveň 0. a preto na pin PB3 pošle logickú 1. Tým cez rezistor R4 zopne tranzistor Q1 a rozsvieti LED diódu.

Program pre mikroprocesor vyzerá nasledovne:

#define F_CPU 9600000UL
#include <avr/io.h>
#include <avr/interrupt.h>

int main (void)
{
 DDRB &= ~0x10;   // PB4 vstupny
 DDRB |= 0x08;    // PB3 vystupne
 PORTB &= ~0x08;  // vynulovanie PB3
 PORTB &= ~0x10;  // PULL-UP na PB4 vypnuty

 while(1) // nekonecny cyklus
  {
     if(PINB & 0x10) PORTB |= 0x08;
    else PORTB &= ~0x08;
  }
}

Nič zložité, najprv definujem knižnice. Potom nastavím jeden pin ako vstupný, druhý ako výstupný. A nakoniec v nekonečnom cykle kontrolujem vstup a podľa neho mením výstup. Stiahnite si súbory k prvej časti článku v jednom archíve.

Vylepšenie programu a zapojenia cez prerušenia

V prvom zapojení musel mikroprocesor kontrolovať stav vstupu. Zmením zapojenie a po novom bude cez prerušenia upozornený, že sa niečo deje. Zareaguje tak, že rozsvieti diódu. Pri ďalšom prerušení diódu zhasne. A takto dookola. V zapojení je len jedna zmena, vstupný pin nebude PB4 ale PB1. Je to kvôli tomu, že len na pine PB1 môže mikroprocesor zareagovať na prerušenie.

Schéma zapojenia s ATtiny13 a RPR220, úprava kvôli prerušeniam

V programe nastanú väčšie zmeny. Najprv musím mikroprocesor nastaviť, aby reagoval na prerušenia. A potom musí vedieť, čo má vtedy  robiť. Odporúčam prečítať si strany 8, 44 a 46 datasheetu ATtiny13. Najdôležitejšie sú registre:

  • MCUCR – nastavuje na akú situáciu má mikroprocesor zareagovať. V mojom prípade je to prechod z úrovne logickej 1 na úroveň logickej 0 (Na pine PB1 je trvale +5V, pri odraze svetla sa tranzistor otvorí a napätie poklesne).
  • GIMSK – Povoľuje práve externé prerušenie od pinu PB1.
  • SREG –  Všeobecne povoľuje prerušenia.

Každé prerušenie treba obslúžiť a preto je na začiatku programu funkcia ISR. Tá sa postará o zmenu stavu pinu PB3 na opačný. A LED dióda  sa buď rozsvieti, alebo zhasne. Tu je hotový program:

#define F_CPU 9600000UL
#include <avr/io.h>
#include <avr/interrupt.h>

ISR(INT0_vect)    // funkcia vykonaná po prerušení
 {
  PORTB ^= 0x08;  // negácia pinu PB3
 }

int main (void)   // hlavná funkcia
{
 DDRB &= ~0x02;   // nastaví pin PB1 ako vstupný
 DDRB |= 0x08;    // nastaví pin PB3 ako výstupný
 PORTB &= ~0x08;  // vynulovanie pinu PB3
 PORTB |= 0x02;   // aktivuje PULL-UP na pine PB1 
 MCUCR |= 0x02;   // prerušenia len od prechodu 1-0
 MCUCR &= ~0x01;  // prerušenia len od prechodu 1-0
 GIMSK |= 0x40;   // povolí prerušenia od PB1 (INT0)
 SREG |= 0x80;    // globálne povolí prerušenia

 while(1) // nekonecny cyklus
  {
  }
}

Jedna poznámka k zapojeniu a programu. V schéme je rezistor R2 a cez program je aktivovaný PULL-UP rezistor. Pre správnu funkciu zapojenia stačí splniť len jednu podmienku. Buď aktivovať PULL-UP, alebo dať rezistor R2. Všetky súbory k druhej časti článku si môžete stiahnuť v jednom archíve.

Na koniec článku

Zapojenie je veľmi jednoduché a funguje. Niekedy v budúcnosti s ním vyskúšam sledovať polohu vlaku, alebo niečo podobné. Dovidenia pri ďalšom pokuse.

 

Autorom článku je : Lukáš

Lukáš je človek, venujúci sa všetkému možnému, ktorý sa dosť často niekde poflakuje s foťákom, alebo bicyklom. Profesionálne sa venuje silnoprúdovej elektrotechnike, amatérsky slaboprúdovej.