Дата последнего изменения документа - 29 мая 2008г.
Идея данного устройства родилась, как альтернатива автомобильному пейджеру. Сразу скажу, что GsmHorn существует на самом деле, это устройство перекочевало уже во второе мое авто, и исправно срабатывает (к счастью, только на соседских мальчишек-футболистов, использующих авто для тренировки по "бразильской" системе). Работает эта штука так: в автомобиле у Вас спрятан "лишний" сотовый телефон, подключенный к GsmHorn, а тот в свою очередь подключен к сигнализации автомобиля или к какому-то датчику. Когда срабатывает автомобильная сигнализация, GsmHorn звонит на Ваш мобильный (или несколько мобильных, или даже немобильных, но умеющих определять номер). Ну и естественно, что с минимальными переделками, Вы можете использовать эту штуковину не только для охраны автомобиля, но и, например, для охраны квартиры. Экономическую целесообразность данной затеи посчитайте для себя сами. В моем автомобиле в качестве "лишнего" телефона используется Siemens A35, который достался мне "по-наследству". Устройство работает и с телефоном Siemens С55, только в этом случае придется удалить некоторые строки из программы микроконтроллера. Подозреваю, что устройство будет работать и с другими телефонами, которые поддерживают AT-команды (как, например, Siemens С55) и совместимы по уровню напряжения.

Теперь более подробно о том, как эта штука работает. Вход "Тревога" подключается к выходу состояния автомобильной сигнализации или непосредственно к сирене. Можно подключить его к любому другому датчику, главное условие, чтобы при срабатывании датчика на входе "Тревога" потенциал сменился с низкого (0 Вольт) до высокого (12 Вольт). Выход "К RxD телефона" необходимо подключить к 6 контакту системного разъема телефона, а выход "К GND телефона" подключить к 1 контакту разъема телефона. В случае использования Siemens C55, подключить к 4 и 2 контакту соответственно. Напряжение контроллера понижено с помощью стабилитрона до 3,3 В для согласования уровня напряжения с телефоном. Светодиод нужен для индикации режимов работы: при включении питания он дважды моргает, при передаче команд в телефон - непрерывно светится. В дежурном режиме микроконтроллер находится в режиме Sleep, "пробуждает" его передний фронт импульса на входе "Тревога". Амплитуда этого импульса 12 В. "Проснувшись", контроллер звонит сначала на телефон из первой ячейки телефонной книги SIM-карты, через некоторое время на телефон из второй ячейки, и снова засыпает. Количество дозвонов и их интервалы Вы без труда сможете изменить самостоятельно в тексте программы.
Итак, дошла очередь до программы микроконтроллера, обращаю Ваше внимание, что для Siemens C55 некоторые строки из программы нужно будет удалить ( это отмечено в комментариях):
;gsmhorn1.asm v1.1 for Siemens A35
;*** Assembler directives**************************************************************
LENGTH EQU 0x0E ; Length to send
NEW_SIGNAL EQU 0x0F ; Bit0=1 if waiting for a new signal (to avoid sending the first 'random' LENGTH)
OBYTE EQU 0x10 ; Original byte used in receive subroutine
BYTE EQU 0x11 ; Byte used in send and receive subroutines
BITCOUNT EQU 0x12 ; Bit counter used in send and receive subroutines
COUNT1 EQU 0x13 ; Time counter used in the delay subroutine
COUNT2 EQU 0x14 ; Time counter used in the delay subroutine
COUNT3 EQU 0x15 ; Time counter used in the delay subroutine
INTCON EQU 0Bh
;*** Beginning of the program ***********************************************************
ORG 0x000 ; Processor reset vector
reset GOTO init ; Go to initialization
ORG 0x009
;*** Initializations ********************************************************************
init BSF STATUS,RP0 ; Select Bank 1
MOVLW b'11000101' ; прерывание по переднему фронту
MOVWF OPTION_REG ; Configure options
MOVLW b'11110011' ; RB0 (interrupt) RB2 and RB3 as output, others as inputs
MOVWF TRISB ; Configure PORTB
MOVLW b'00011111' ; RA<0:4> as inputs
MOVWF TRISA ; Configure PORTA
BCF STATUS,RP0 ; Return to Bank 0
CLRF PORTB ; Initialize PORTB outputs to 0V
CLRF PORTA ; Initialize PORTA outputs to 0V
BSF INTCON,4 ;разрешение прерывания
; Дважды моргнем светодиодом
BSF PORTB,3
CALL delay
BCF PORTB,3
CALL delay
BSF PORTB,3
CALL delay
BCF PORTB,3
CALL delay
thru SLEEP
;По выходу из спячки зажигаем светодиод
BSF PORTB,3
;Подать команду "ATH0"
MOVLW d'6' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'5' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'3' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'65' ; ASCII code for 'A'
CALL tx_w ; Send W
MOVLW d'84' ; ASCII code for 'T'
CALL tx_w ; Send W
MOVLW d'72' ; ASCII code for 'H'
CALL tx_w ; Send W
MOVLW d'48' ; ASCII code for '0'
CALL tx_w ; Send W
MOVLW d'13' ; ASCII code for Enter
CALL tx_w ; Send W
CALL delay
;Команда "ATD>1;"
MOVLW d'6' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'7' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'1' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'65' ; ASCII code for 'A'
CALL tx_w ; Send W
MOVLW d'84' ; ASCII code for 'T'
CALL tx_w ; Send W
MOVLW d'68' ; ASCII code for 'D'
CALL tx_w ; Send W
MOVLW d'62' ; ASCII code for '>'
CALL tx_w ; Send W
MOVLW d'49' ; ASCII code for '1'
CALL tx_w ; Send W
MOVLW d'59' ; ASCII code for ';'
CALL tx_w ; Send W
MOVLW d'13' ; ASCII code for Enter
CALL tx_w ; Send W
;выдерживаем большую паузу
CALL big_delay
BSF PORTB,3
;Команда ATH0
MOVLW d'6' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'5' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'3' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'65'
CALL tx_w
MOVLW d'84'
CALL tx_w
MOVLW d'72'
CALL tx_w
MOVLW d'48'
CALL tx_w
MOVLW d'13'
CALL tx_w
CALL delay
;Команда "ATD>2;"
MOVLW d'6' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'7' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'1' ; Эту строку удалить для Siemens C55
CALL tx_w ; Эту строку удалить для Siemens C55
MOVLW d'65'
CALL tx_w
MOVLW d'84'
CALL tx_w
MOVLW d'68'
CALL tx_w
MOVLW d'62'
CALL tx_w
MOVLW d'50'
CALL tx_w
MOVLW d'59'
CALL tx_w
MOVLW d'13'
CALL tx_w
;выдерживаем большую паузу
CALL big_delay
BCF INTCON,1 ;сбросить бит прерывания
GOTO thru
;*** Send subroutine *********************************************************
tx_w: MOVWF BYTE ; Store byte to send (W) in BYTE
tx_start_bit: BCF PORTB,2 ; logic 0 (start bit)
NOP ; 1 Must wait 17 us for 57600 bauds
NOP ; 2
NOP ; 3
NOP ; 4
NOP ; 5
NOP ; 6 Next bit will be set in 11 us from now
tx_data: MOVLW 9 ; Number of bits to send + 1
MOVWF BITCOUNT ; Bit counter
tx_next_bit: DECFSZ BITCOUNT,F ; Decrement counter
GOTO tx_bit ; If !=0, send the bit
GOTO tx_stop_bit ; Else send the stop bit
tx_bit: RRF BYTE,F ; Rotate right to get next bit
BTFSS STATUS,C ; If it's a zero
GOTO tx_0 ; Then send a 0
GOTO tx_1 ; Else send a 1
tx_0: NOP ; To have the same delay than when it's a 1
BCF PORTB,2 ; logic 0
NOP ; 1 Must wait 17 us for 57600 bauds
NOP ; 2
NOP ; 3
NOP ; 4
NOP ; 5
NOP ; 6 Next bit will be set in 11 us from now
GOTO tx_next_bit ; Loop
tx_1: BSF PORTB,2 ; logic 1
NOP ; 1 Must wait 17 us for 57600 bauds
NOP ; 2
NOP ; 3
NOP ; 4
NOP ; 5
NOP ; 6 Next bit will be set in 11 us from now
GOTO tx_next_bit ; Loop
tx_stop_bit: NOP ; 13 Requiered for the last data bit
NOP ; 14
NOP ; 15
NOP ; 16
BSF PORTB,2 ; logic 1 (stop bit)
NOP ; 1 Must wait 17 us for 57600 bauds
NOP ; 2
NOP ; 3
NOP ; 4
NOP ; 5
NOP ; 6
NOP ; 7
NOP ; 8
NOP ; 9
NOP ; 10
NOP ; 11
NOP ; 12
NOP ; 13
NOP ; 14
NOP ; 15 The return will take the last 2 us
tx_done: RETURN ; All bits send, return
;*** Delay subroutine ***********************************************************
delay: MOVLW d'200' ; Delay duration
MOVWF COUNT1 ; Initialize COUNT1
MOVLW d'255' ; Maximum value
MOVWF COUNT2 ; Initialize COUNT2
DECFSZ COUNT2,F ; COUNT2--
GOTO $-1 ; Loop until COUNT2=0
DECFSZ COUNT1,F ; COUNT1--
GOTO $-5 ; Loop until COUNT1=0
RETURN
;*** Big delay subroutine *********************************************************
big_delay: MOVLW d'120'
MOVWF COUNT3 ; Initialize COUNT1
mm: BSF PORTB,3
CALL delay
BCF PORTB,3
DECFSZ COUNT3,F ; COUNT3--
GOTO mm ; Loop until COUNT3=0
RETURN
;*** End of program *************************************************************
END
Два слова о питании телефона. Я вообще убрал аккумулятор из телефона, и запитал его от бортовой сети автомобиля через стабилизатор.
Некоторую проблему представляет собой зимняя эксплуатация. Во-первых, зимняя эксплуатация, собственно, исключает возможность использования аккумулятора телефона. Во-вторых, сам телефон, а точнее его индикатор, тоже не рассчитан на работу с минусовыми температурами. Опыт эксплуатации показывает, что, к счастью, ничего не показывающий на морозе экран телефона, еще не означает, что телефон "вырубился". По мере потепления в салоне автомобиля, экран телефона "проявляется". Меньше всего нареканий вызывает сам контроллер. В своем городе я не нашел контроллер в исполнении "автомобильный", но даже с контроллером в исполнении "промышленный" не было замечено ни одного сбоя, хотя зимы в нашем городе не бывают теплыми.
Буду рад, если Вы пришлете мне свои отзывы и предложения на gsmhorn@narod.ru.
И последнее:
Автор не несет никакой ответственности за возможную порчу телефона и за любые
другие негативные последствия, возникшие вследствие использования данного
устройства.
(C) Ilya Permyakov, 2005-2009