Archívum: 2015 május


2015. Május 02.

Vezeték nélküli kapásjelző (Adó)

írta: Xaint

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 sad.

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 wink: