GsmHorn - устройство оповещения (GSM сигнализация) на базе микроконтроллера PIC16F84 и сотового телефона SiemensA35 (SiemensC55).

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

Вернуться на главную страницу .

Hosted by uCoz