Дата последнего изменения документа - 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