Ebben a cikkben röviden bemutatom a vezeték nélküli kapásjelző rendszeremhez épített adót. Ennek egy 80x40x20mm-es dobozkát választottam, melyben nincs csavaros felfogatás kialakítva, bepattintós fedele van. Ebbe terveztem és építettem be egy egyoldalas nyákot, amelyen a különböző információkat kijelző LED és az egyetlen nyomógomb a forrasztás felőli oldalról lett beültetve. Ezek a doboz elejébe fúrt lyukakba ülnek bele. Ezen kívül még a doboz oldalán alakítottam ki a helyet a ki/be-kapcsolásért felelős mikrokapcsoló számára. Sajnos a néhány milliméter vastagságú műanyagba még mindig nem tudok szép, egyenes oldalú, téglalap alakú lyukakat kialakítani. Főleg nem olyan picikét, ami egy mikrokapcsoló számára kell, így ez nem sikerült valami esztétikusra
.
A kapásjelző vevő egységbe épített BC-NBK receiver egy olyan egyszerű RF vevő, ami AM modulációt használ, és nem rendelkezik megszakítás-kimenettel (IRQ kimenet). Ez azt jelenti, hogy a vevőben lévő mikrovezérlőnek folyamatosan ébren kell lennie ahhoz, hogy a küldött üzenetet biztosan megkapja.
Most nézzük az adó kapcsolási rajzát:
Adó oldalon már nincs ilyen probléma, mert ott a mikrovezérlő alvó állapotban várja a kapásjelzőtől érkező jelet, mindössze néhány µA-es áramfogyasztás mellett. A kapáskor keletkező jel (erről bővebben picit később) felébreszti az ATtiny24-est, ami ekkor a T1 tranzisztor segítségével bekapcsolja TX-4MSIL adó modult, majd egy egyszerű manchester kódolás segítségével elküldi a riasztást a vevő felé. Az adó elektronikát szerettem volna általánosan használhatóvá tenni, azaz minden olyan elektromos kapásjelzővel, amelyen van jack kimenet (pl. a swinger világításához), jó eséllyel elboldogul. Az előző cikkben már említett elektromos kapásjelzők (Fox Warrior és Fox Micron MX2) is különböző jeleket, különböző jelszinteket generálnak a kapás jelzése során. Az én Fox Warrior típusú kapásjelzőimben, a jack csatlakozó utólag került beépítésre, amiket közvetlenül a kapást jelző LED-ekre kötöttem rá. Annak érdekében, hogy az adó kompatibilis legyen többféle kapásjelzővel is, azaz a kapásjelző felől érkező jel biztosan felébressze az ATtiny24-es mikrovezérlőt, egy 40106 Schmitt trigger IC-t vetettem be. A Schmitt trigger egy nagyon fontos és igen sokszor alkalmazott áramkör, amit többek között különböző amplitúdójú jelek amplitúdó uniformizálására szoktak használni:
A fenti képen látható, hogy függetlenül a zajos bemeneti jeltől (feketével jelölve), a kimeneten tiszta négyszögjel jelenik meg (zöld színnel).
Mint már említettem, a mikrovezérlő alvó állapotban van, amit csak a megfelelő bemenetein engedélyezett megszakítás kérelem ébreszt fel. Ezek a négy jack aljzatról érkezhetnek (PCINT1-PCINT4), vagy a nyomógomb felől (PCINT5):
MCUCR |= (1<<ISC01) ; // INT0, Falling edge
GIMSK |= (1<<PCIE0);
PCMSK0 |= (1<<PCINT1) | (1<<PCINT2) | (1<<PCINT3) | (1<<PCINT4) | (1<<PCINT5);
sei();
...
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
sleep_disable();
Riasztás esetén egyetlen bájt adatot küldünk a vevő felé, az adott bemenetnek megfelelően. Tehát mind a négy bemenet más-más bájt elküldését eredményezi. Ezt vevő oldalon a kapásjelzők megkülönböztetésére használhatjuk, ugyanis mind a négy kapásjelző más színű LED-et villant fel. Az adat küldésért felelős kód nagyon egyszerű, mindössze néhány sorból áll:
void rf_send(byte input)
{
// PREAMBLE
for(int i=0; i<400; i++)
{
PORTA |= (1<<TX_PIN); // TX pin HIGH
_delay_us(5);
PORTA &= ~(1<<TX_PIN); // TX pin LOW
_delay_us(5);
}
PORTA |= (1<<TX_PIN); // TX pin HIGH
_delay_ms(26);
PORTA &= ~(1<<TX_PIN); // TX pin LOW
_delay_us(500);
for(int i=0; i<8; i++)
{
if(bitRead(input,i)==1)
PORTA |= (1<<TX_PIN); // TX pin HIGH
else
PORTA &= ~(1<<TX_PIN); // TX pin LOW
delay_10us(50);
if(bitRead(input,i)==1)
PORTA &= ~(1<<TX_PIN); // TX pin LOW
else
PORTA |= (1<<TX_PIN); // TX pin HIGH
delay_10us(50);
}
PORTA &= ~(1<<TX_PIN); // TX pin LOW
_delay_ms(35);
}
A tényleges adat elküldése előtt, annak érdekében, hogy a vevő biztosan ráálljon az adó jelére, egy ún. bevezető (preamble) jelsorozatot is küldünk. Ez a vevőben lévő, és valószínűleg maximumra beállt AGC-t megfelelő szintre hozza.
Az adóba építettem még egy nyomógombot is, melyet ha 2 másodpercnél tovább lenyomva tartunk, akkor egyfajta távolságteszt módba lépünk. Ekkor másodpercenként néhányszor egy ötödik fajta, a kapást jelző adatoktól különböző jelet küldünk a vevő felé, amivel egy időben a vevőn felvillanó piros LED segít megtalálni a maximális távolságot.
if(InRangeTestMode)
{
nPacketSent++;
bitSet(PORTA,RF_POWER); // RF_POWER ON
delay_ms(3);
rf_send('Q'); // Q means range test mode for now :D
delay_ms(15);
bitClear(PORTA,RF_POWER); // RF_POWER OFF
}
Mindent egybevéve, szerintem sikerült egy hasznos kis kiegészítőt építenem, a boltokban kapható vezeték nélküli kapásjelző rendszerekhez képest töredék áron. Esztétikai értelemben a kivitelezés lehetett volna jobb is, illetve a vízhatlansággal sem foglalkoztam különösebben, de a projekt építése során így is rengeteget tanultam. A végeredmény pedig egy könnyen kezelhető, kapásjelző-típustól függetlenül használható kis eszköz lett :