Syrena do modelu samolotu RC


Częstym w czasie lotów latającym modelem RC jest utrata kontaktu radiowego i ucieczka modelu.
Także przy kontrolowanym lądowaniu w wysokiej trawie zdarza się że przez długi czas nie możemy odszukać modelu.
Przedstawione urządzenie może pomóc nam rozwiązać ten problem.

Układ podłączamy do wolnego kanału w odbiorniku.
Przy skrajnym położeniu drążka (lub przełącznika dwustanowego) syrena jest wyłączona, przy przemieszczaniu drążka w drugą
stronę syrena zaczyna brzęczeć z częstością proporcjonalną do wychylenia drążka. Przedstawiony programik nie filtruje sygnału
więc wszelkie zakłócenia będą doskonale słyszne jako załamania dźwięku.
Układ zrobiony jest na popularnym, tanim i łatwo dostępnym mikroprocesorze firmy Atmel AT90S1200, dzięki czemu do maksimum
zmniejszyłem liczbę części (istnieje nawet możliwość wyrzucenia kwarcu z układu o czym napiszę za chwilę).

Wykaz części:

Mikroprocesor zaprogramować można bardzo prostym programatorem nie wymagającym żadnych elementów elektronicznych (za wyjątkiem wtyczki drukarkowej i podstawki DIL20), schemat i oprogramowanie najprostrzego programatora można znaleźć w sieci pod hasłem:

The BA1FB PC based AT90Sxxxx programmer
Jerry Meng
BA1FB (Ham radio callsign)
Email: ba1fb@qsl.net

Użyty procesor ma możliwość pracy bez zewnętrznego kwarcu więc układ można znacznie uprościć. Rolę kwarcu przejmuje wewnętrzny
generatorek RC, niestety nie jest on zbyt stabilny ale do tego zastosowania wystarczający. Dokłądną informację na ten temat zamieszcza
producent procesorka na swojej stronie WWW.ATMEL.COM .

Tutaj można ściągnąć skompilowany program SYR.HEX oraz zawartość EEPROM SYR.EEP.
Schemat ideowy w wersji dla programu "EAGLE Layout Editor" : SYRENA.SCH

Dla lubiących programować zamieszczam listing źródłowy utworzony w programem AVR Studio 3.5 . Można zmodyfikować program dodając różne efekty dźwiękowe a także zastosować inne opóźnienia dostosowując programik do posiadanego kwarcu.

LISTING PROGRAMU "SYRENA.ASM"

;***************************************************************************
; Syrena RC na AT90S1200 dane dla kwarcu 6MHz
;***************************************************************************
.include "1200def.inc"

.def Tgr =r0 ;czas pełnego wyłączenia (Ti<Tgr)
.def Tmax =r1 ;Tmax - parametr okreslający max wysokość tonu syreny
.def Ti =r10 ;czas impulsu
.def Ts =r11 ;pół okresu drgań syreny


.def ACC =r16
.def T5uS =r17
.def Status =r18 ; b4=5V/0V b0=on/off syreny
.def BCC =r19
.def dana =r20
.def adres =r21

.cseg
rjmp start
rjmp ext_int0
rjmp timer0_ovf
rjmp ana_comp

start: ldi ACC,0b01110111 ;PB.0,1,2,4,5,6 jako wyjścia
out DDRB,ACC
com ACC
out portb,ACC
ldi T5uS,7
ldi ACC,0
mov status,ACC ;na początek syrena wyłączona

ldi adres,0
rcall rd_eeprom ;wczytanie parametru nr 1 z EEPROM
mov Tgr,dana
ldi adres,1
rcall rd_eeprom ;wczytanie parametru nr 2 z EEPROM
mov Tmax,dana

;włączamy Timer0
ldi ACC,0b011 ;CK/1024 ustawienia preskalera 101-> fmax=292Hz
;CK/256 100->fmax=1171 Hz
;CK/64 011->fmax=4700 Hz
out TCCR0,ACC
ldi ACC,0b10
out TIMSK,ACC ;zezwalam na przerwania
sei
;sprawdzamy impulsy na PB.7 (wejście syreny)
synchro: sbic pinb,7 ;czekam jeśli trafił na 1
rjmp synchro

impuls: sbis pinb,7 ;czekam jeśli 0 na PB.7
rjmp impuls


ldi ACC,160 ;czekaj 800uS
mov Ti,ACC
delay1mS: rcall delay5uS
dec Ti
brne delay1mS
sbis pinb,7 ; jeśli Ti>800uS to skocz dalej
rjmp synchro ; jeśli nie to wróc do synchro
delay10: rcall delay5uS ;odmierzamy liczbę (Ti-800uS)/5uS
inc Ti
sbic pinb,7
rjmp delay10
;Sprawdzamy czy Ti>Tgr
mov ACC,Ti
clc
sbc ACC,Tgr
brcs cicho ;jeśli Ti<Tgr skacz do "cicho"
sbr status,0b1 ;ustawiamy b0=1 syrena gra

oblicz_Tp: mov ACC,Ti ; obliczamy pół okresu drgań syreny =Ti-Tmax
clc
sbc ACC,Tmax
mov Ts,ACC ;okres włączenia Ts
rjmp synchro ;powrót do wykrywania następnego impulsu
cicho: cbr status,0b1 ;skasuj bit b=0 (wyłącz syrenę)
rjmp synchro

delay5uS: mov ACC,T5uS
dec ACC
brne delay5uS+1
ret

ext_int0: reti

timer0_ovf: sbrs status,0 ; jak syrena ON to skocz dalej
rjmp odlacz
sbrs status,4 ;jak na syrenie U=5V to zrób 0V
rjmp syr_on
syr_off: ldi BCC,0b10001111
out portb,BCC ;U=0V na syrenie
cbr status,$10 ;kasujemy bit4 informujacy czy było napięcie 5V
out TCNT0,Ts ; wpisujemy ile trzeba czekać na następne przerwanie
reti

syr_on: sbrs status,0 ; jak syrena ON to skocz dalej
rjmp odlacz
ldi BCC,0b11111000 ;włączamy 5V na syrenie
out portb,BCC
sbr status,$10 ;ustawiamy bit4 w status
out TCNT0,Ts ; wpisujemy ile trzeba czekać na następne przerwanie
reti
odlacz: ldi BCC,0b10001000 ;0V na obu gałęziach mostka
out portb,BCC
ana_comp:reti

;Procedure wczytania danej z EEPROM
rd_eeprom: cli
out EEAR,adres
sbi EECR,EERE
in dana,EEDR
ret

.ESEG ;Zawartość EEPROM
.db 0x30,0xff ;Tgr,Tmax
.exit

Kolejny plik do pobrania to 1200def.inc.

Całość materiałów dotyczących prezentowanego układu można pobrać w postaci jednego pliku ZIP: syrena.zip.

Uwagi końcowe:
- podane rozwiązanie dość mocno obciąża procesor (pobór prądu w czasie wydawania dźwięku ok. 50 mA) dlatego kosztem zmniejszonej głośności polecam zastosowanie większych rezystorów nawet ponad 220 Om
- jeżeli ktoś lubi hałasować to może do wyjścia mikroprocesora dołączyć prosty wzmacniacz m.cz. (np. w postaci wtórnika emiterowego z 2-ch tranzystorów p-n-p i n-p-n) a dopiero za nim głośniczek przez kondensator separujący składową stałą.

Opracował: Ireneusz Kuczek