Проекты. Некорректный GET-запрос на сервер. SIM900: SMS-сообщения и звонки

Итак, после продолжительного времени раскуривания тонкостей работы с GSM модулем SIM900D анонсируем первый рабочий проект, совмещающий в себе охранную систему с возможностью удаленного контроля. Если кратко, то устройство способно отправлять информирующие SMS в случае срабатывания датчика проникновения, делать дозвон для возможности аудиоконтроля помещения, следить за температурой и отправлять ее смс-кой по запросу, а также управлять какой-нибудь нагрузкой по команде отправленной по смс.

Кто следил за данной темой, тот в курсе, что у меня GSM модуль и модуль управления им - две разные платы, соединенные бутербродом (см. плата с SIM900D и плата управления ). На управляющей плате помимо микроконтроллера ATmega32a стоит модуль питания, выполненный на преобразователе LM2596 , он запитывает схему постоянным напряжением 3,5 вольт. В принципе подойдет любой другой источник питания, главное чтобы он был способен кратковременно вытянуть до 2 ампер (именно такое потребление GSM-модуля в момент регистрации).

Удобства ради, к плате управления подключен дисплей от телефона Nokia3310, методы работы с котором уже ни раз описывались на этом сайте. Благодаря дисплею можно быстро определить состояние устройства и значение датчиков.

В итоге получившаяся схема подключения вышла такая (кликабельно):

Нумерация выводов микроконтроллера на схеме приведена для DIP корпуса, поэтому если повторяете схему с использованием мк в корпусе TQFP будьте внимательны, нумерация выводов у него отличается. Тактируется микроконтроллер от внешнего кварца на 16 МГц.

Линия Control идущая от коллектора транзистора Q2 к выводу PortD.4 микроконтроллера добавлена для перестраховки и нужна за тем чтобы следить включен ли модуль. Так как порог выключения у SIM900 составляет 3,2 вольта то даже при незначительной просадке напряжения модуль автоматически выключится, тогда как микроконтроллер продолжит работать и выполнять программу (порог сброса у ATmega32a 2,7 вольта). В рабочем состоянии на этой линии находится низкий уровень. Если микроконтроллер обнаружит что на этой линии высокий уровень, выполнится функция повторного запуска GSM модуля.

А вот так это выглядит в работе на данный момент.

После окончательной обгонки программы, все это будет засунуто в корпус, а разъемные соединения для надежности будут запаяны.

На дисплей выводится основная информация о состоянии устройства: название оператора, качество сигнала связи, значение температуры с датчика 18b20, состояние выхода нагрузки и датчика проникновения, а так же время и дата.

Видео включения модуля

Время и дата берутся от встроенных в GSM-модуль часов. Для их работы обязательно наличие 3-х вольтовой батарейки подключенной к выводу 15 (VRTC). Диод D1 рекомендуется ставить с низким падением напряжения, например Шоттки. Настройка часов и даты делается в ручную, команды были описаны ранее

Дата выводится на дисплей в том формате как получается с модуля, тоесть сначала год, затем месяц и дата. Здесь пока ничего менять не стал.

За измерение температуры отвечает датчик DS18B20, он подключается к выводу PortD.3 микроконтроллера.

К PortD.6 можно подключить какую-нибудь нагрузку и управлять ей посредством команд смс. У меня сейчас висит светодиод - D4 на схеме. Но ничего не мешает повесить сюда релюху или симистор и управлять чем-нибудь посерьезней.

В охранных целях планируется применение датчика движения HC-SR501 , купленного на E-bay. В случае срабатывания на выходе датчика появляется логическая единица. Поймав ее, микроконтроллер даст команду на отправку SMS сообщения по телефонному номеру, заданному в программе.

Выход датчика подключается к выводу PortD.7 микроконтроллера, на схеме, датчик условно заменен на кнопку.

Заместо датчика движения можно ставить любые другие средства обнаружения проникновения - датчики открывания окон и дверей, датчики разбития стекла, фотоэлектрические датчики и др. в общем все на что способна фантазия.

Для того чтобы предотвратить многократное отсылание предупреждающих смс в случае срабатывания датчика, в программу введено ограничение: после первого отправленного смс ставится запрет на последующую отправку. Чтобы заново разрешить отправку уведомляющих сообщений при срабатывании датчика, необходимо отослать на модуль смс с определенной командой. Когда посылка смс запрещена на дисплей возле состояния датчика, выведется восклицательный знак.

Список команд

А вот и список команд в смс которые обрабатывает модуль. Для удобства и простоты комады цифровые, возможно в следующих версиях прошивки будут более осмысленные имена команд:)

0 - Отключение нагрузки (на выводе PortD.6 выставляется логический 0)

1 - Включение нагрузки (на выводе PortD.6 выставляется логическая 1)

2 - Приняв эту команду, модуль перезвонит на указанный в программе телефонный номер

3 - Запрос баланса и отправление его смс-кой обратно на указанный номер. Здесь есть один важный нюанс - ответы на USSD запросы обязательно должны приходить в латинице. Иначе заместо осмысленного текста в ответ придет сообщение в шестнадцатеричной кодировке. Как перевести USSD в латиницу нужно уточнить у своего оператора. К примеру, на используемой мной симке от Смартса, нужно ввести *102*1# (в мегафоне *105*0#)

4 - Запрос температуры. Значение температуры будет отправлено нам в смс.

5 - Разрешенить отсылать сообщения в случае срабатывания датчика проникновения.

6 - Запрет на отправление уведомляющих смс от датчика проникновения.

? - По этой команде модуль пришлет нам смс, в котором находится общая информация об устройстве, такие как значение с датчика температуры, включена ли нагрузка, состояние на входе от датчика проникновения и разрешена ли отправка уведомляющих смс от него. К примеру, вот как может выглядеть такое сообщение: температура +24, нагрузка выключена, на выходе датчика движения 0, отправка смс в случае срабатывания запрещена.

Теперь как настроить чтобы модуль отправлял sms именно на ваш номер. В архиве с программой находим основной файл программы, она так и называется "программа" :) и находим в ней константу:

Const Phonenumber = "+7908390хххх"

подставляем сюда свой номер телефона, компилируем программу и получаем hex файл прошивки.

Программа как и всегда написана в Bascom-AVR, поэтому разобраться с алгоритмом работы с GSM модулем достаточно просто. Удачи!

Ну и напоследок демонстрация того как модуль обрабатывает команды.

Отдельное спасибо за участие и помощь в разработке, давнему товарищу сайта Сергею RD3AVJ!

UPD: от 31.10.12

Немного доработал прошивку, теперь для того чтобы задать номер на который будут слаться уведомляющие SMS не нужно перекомпилировать программу. Достаточно послать на модуль смску с сообщением "Firstnumber" (без ковычек) и номер, с которого была отправлена эта команда, записывается в энергонезависимую память микроконтроллера.

Идея проекта: спроектировать устройство на базе микроконтроллера AVR для управления готовым GSM модулем (я выбрал модуль TC35 от SIEMENS, но можно использовать любой другой, если используется связь через последовательный порт RS232). Устройство должно быть компактным, минимально простым и надёжным.

Отправка заранее записанного в память сообщения на указанный номер должна выполняться после нажатия кнопки. Всего нужно было 6 кнопок для отправки на 6 различных номеров. Для индикации процессов были выбраны 3 светодиода (Ready, Send, Error), но в последствии был добавлен алфавитно цифровой LCD 16x2 (скорее, для отладки устройства, чем для обычного использования).

Проектировалось всё дело на плате Pinboard II (Rev 2) со стандартным процессорным модулем на ATmega16. На готовом устройстве схема была немного другой (и микроконтроллер использовался ATmega8). Программа писалась в AVR Studio 4.19. В проекте были использованы различные заголовочные файлы (#include) для переключения между Pinboard и готовым устройством.

Общая схема системы:


Для контроллера была выпилена такая платка:

Времени было много, поэтому в последствии я заказал платы у китайцев:

А когда с железом было закончено, следом пошёл процесс программирования. Всё написано на Си под AVR Studio 4.19. Полный проект выкладываю в конце статьи, если кому интересен полный код. Но пока поговорим об общении с GSM модулем.

Полный перечень AT команд есть на каждый модуль в его документации. Но отправка сообщения происходит несколькими командами.

//команда: AT+CMGF=1 //ответ модуля: OK
Переводит модуль в текстовый режим. Цифровой режим я пока не освоил (пока не было необходимости). Ответ модуля на начальных стадиях проекта никак не использовался. Но потом (когда был написан дешифратор команд) служил условием продолжения отправки или сообщения об ошибке протокола. Идём дальше:

Команда: AT+CMGS=(номер телефона) ответ модуля: > отправляем сообщение: Hello, GSM module! ответ модуля: +CMGS: 62 OK
После набора сообщения, нужно отправить не Enter (0x0D) а CTRL-Z (0x1A). Ответ модуля после отправки содержит порядковый номер отправляемого сообщения.

Для отправки команд в модуль в модуль и получения ответов я использовал два кольцевых буфера со входящими и исходящими индексами.

Для большей понятности кода приведу заголовки:

#define BUF_SIZE 128 #define BUF_MASK (BUF_SIZE-1) #define IN_BUF_SIZE 64 #define IN_BUF_MASK (IN_BUF_SIZE-1) volatile char buffer=""; volatile char inbuf="$"; //inner buffer of USART volatile uint8_t ind_in=0, ind_out=0, rxind_out=0, rxind_in=0, mess = 0;
Запись строк или отдельных символов в буфер производилась обычными функциями:

//sending RS232 with interupt void SendByte(char byte) { buffer = byte; ind_in &= BUF_MASK; } void SendStr(char *string) { while (*string!="\n") //check if End { SendByte(*string); string++; } }
А отправка производится через обработчик прерывания:

//Sending data from buffer ISR (USART_UDRE_vect) { UDR = buffer; //запись из буфера ind_out &= BUF_MASK; //проверка маски кольцевого буфера if (ind_in == ind_out) //если буфер уже пуст { UCSRB &= ~(1< Теперь для отправки нужно записать нужную команду в буфер (включая конечный символ \n), а затем включить прерывания опустошения регистра отправки (UDR):

SendStr("AT+CMGF=1\n"); SendByte(CR); //отправляем (0x0D) UCSRB &= ~(1< Пока идёт отправка, можно отправить надпись на LCD или просто подождать (delay).
Писать в это время в буфер нельзя. Опытным путём обнаружил, что модуль не успевает обработать сплошной потом команд. А остановка происходит, когда буфер пуст (входящий и исходящие индексы равны).

И таким образом мы отправляем сообщение. В зависимости от нажатой кнопки (в главном цикле я сканирую порт) происходит отправка сообщения:

While (1) { tmp = PINC; switch (tmp) { case 1: send_sms(0,NUM1); break; case 2: send_sms(0,NUM2); break; case 3: send_sms(0,NUM3); break; //и так далее... default: break; } Ready_Snd (); //перевод обратно в режим готовности }
В функцию отправки я посылаю номер выбранного сообщения (их у меня 2 типа) и номер телефона.
Можно даже отправить команду на звонок теми же AT командами. Всё зависит от необходимой функции.

Теперь о получении команд с модуля.

Модуль отправляет множество команд. Например, OK, RING, ERROR…
Иногда нужно, чтобы при получении команды контроллер смог опознать её и выполнить какое-то действие. Например, получен входящий звонок. Модуль при этом отправляет в контроллер:

RING RING RING
В зависимости от настроек модуля, может отправлять ещё и номер того, кто звонит. Пока нет никакой программы, контроллер ничего с этим сделать не сможет (в лучшем случае) или (в худшем) сделает что не то, а то и вовсе зависнет (не сможет выйти из прерывания).

Требования к коду обработки:
1. Минимальное количество времени на сохранение полученных команд. Никаких задержек в программе прерывания быть не должно. Потом уже с полученным массивом будем делать что угодно.

2. Сохранение всех полученных команд в одном буфере. Для разделения отдельных будем использовать символ $.

3. Распознавание распространенных команд в числовые коды. Например, OK будет 1, ERROR - 4, RING - 2.

Приведу заголовки из предыдущей статьи с поправками:

#define BUF_SIZE 128 //Исходящий буфер #define BUF_MASK (BUF_SIZE-1) #define IN_BUF_SIZE 64 //Входящий буфер #define IN_BUF_MASK (IN_BUF_SIZE-1) volatile char buffer=""; volatile char inbuf="$"; //inner buffer of USART volatile uint8_t ind_in=0, ind_out=0, rxind_out=0, rxind_in=0, mess = 0; volatile uint8_t com_detect=0; //сюда будет записана обнаруженная команда #define TIMEOUT 100 //на случай если команда так и не принята
Пишем обработчик прерывания приёма данных:

//recieving Data from RS232 ISR (USART_RXC_vect) { uint8_t tmp; tmp = UDR; if (tmp == 0x0D) //получен конец команды - { mess++; //one more message inbuf = "$"; //вставляем разделитель в буфер rxind_in &= IN_BUF_MASK; } else { if (tmp != 0x0A) //очистка непонятного символа с модуля { inbuf = tmp; //записываем в буфер rxind_in &= IN_BUF_MASK; } } sei (); }
Теперь у нас все команды записаны в буфере. Можно в свободное время проверить переменную mess и если она не равна нулю - запустить обработчик команды. В самом проекте были добавлены команды для LCD экрана. Здесь я их пропущу за ненадобностью.

Void rx_check_in (void) { uint8_t count=0; com_detect = 0; //обнуление команды (чтобы не мешал предыдущий мусор) while (1) { if (inbuf != "$") //обнаружен конец команды (разделитель) { com_detect ^= inbuf; //делаем XOR полученным символам rxind_out &= IN_BUF_MASK; count++; //считаем, сколько символов в команде } else { rxind_out++; rxind_out &= IN_BUF_MASK; code_com (count); //!! важная часть - раскодировать команду break; } } }
Полученные символы мы пропускаем через мясорубку. Делаем XOR операцию. Получаем таким образом уникальный код (не уверен на счёт уникальности, но пока не подводило). R^I^N^G нам даст 0x12. O^K даст 0x04. Этот код и количество символов (в команде) сохранены в переменных com_detect (глобальная) и count. Теперь запустим обработчик:

Void code_com (uint8_t count) { switch (com_detect) { case (0x12): if (count == 4) com_detect = 2; break; //R^I^N^G case (0x58): if (count == 5) com_detect = 3; break; //ERROR case (0x04): if (count == 2) com_detect = 1; break; //OK case (0x5C): if (count == 3) com_detect = 4; break; //ATI default: com_detect = 0; } }
Распознали команду. Количество символов я ввёл для надёжности на случай если в длинной команде XOR код совпадёт. Распознаваемые команды можно добавлять. Нужно только подсчитать (или макросом) XOR код желаемой команды и присвоить ей цифру.

Теперь в com_detect у нас полученная команда. Теперь устройство может отреагировать SMS сообщением на полученный звонок:

While (1) { if (mess != 0) //if we have mess in buffer { // code mess--; //minus one rx_check_in (); //распознаём отдельную команду if (com_detect == 2) //если была команда RING (код 2) { //Посылаем сообщение // и принимаем входящие команды (OK) if (!send_sms (1,NUM0)) ErrMes (); //если после отправки не было команды OK } //тогда выдать сообщение о ошибке протокола com_detect = 0; //обнуляем команду }
Так можно обрабатывать разные полученные команды.

Итог: устройство умеет отправлять сообщение на телефон и умеет реагировать на различные команды от GSM модуля.

Спасибо за внимание.

Опыт использования SIM900, описанный ниже будет более полезен тем, кто уже успел немного поработать с модулем. Для тех же читателей, кто только начинает изучение данной микросхемы и планирует использовать её для обмена данными через интернет мы подготовили серию уроков на эту тему. Вот .

Итак, SIM900 – GSM-модуль компании SIM COM, управляется AT-командами, умеет посылать SMS, совершать звонки, организовывать прямое CSD-соединение, обмениваться информацией по GPRS.

В моих руках оказалась заказанная из Китая отладочная плата SIM900 GPRS shield – совместимая с платформой Arduino.

На плате находится сам чип SIM900, разъёмы для микрофона и наушников, переключатель источника питания (от внешнего разъёма или от Arduino), антенна, несколько светодиодов для индикации режимов работы, разъём для батарейки (если нужны часы реального времени), кнопка включения/выключения. Хорошее описание я нашёл на wiki производителя . Там же приведён код для управления модемом в различных режимах.

Как заявляет нам производитель плата отлично совместима с Arduino Uno. Действительно, плата SIM900 просто втыкается в Uno и сразу же начинает работать. Однако, как выяснилось, Arduino Uno может оказаться «слабоватой» для реализации некоторых функций, но об этом я расскажу чуть ниже.

С Arduino Mega плата работает с некоторыми ограничениями. Это связано с тем, что у Меги в отличие от Uno пины 7 и 8, недоступны для использования в качестве software serial (программный USART). Это решается переключением интерфейса USART на ноги 0 и 1, для этого на плате SIM900 предусмотрены джамперы.

Вообще, плату можно подключить к любому контроллеру с интерфейсом USART. Например, пробовал управлять модемом с помощью контроллера STM32F4.

SIM900: SMS-сообщения и звонки

Испытания модуля для обмена SMS-сообщениями и звонков прошли «на УРА»! Модуль справился с этими задачами без особых проблем, для этого я просто скопировал c того же сайта , скомпилировал и прошил в Arduino Uno вот этот код:

//Serial Relay - Arduino will patch a //serial link between the computer and the GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include SoftwareSerial GPRS(7, 8); unsigned char buffer; // buffer array for data recieve over serial port int count=0; // counter for buffer array void setup() { GPRS.begin(19200); // the GPRS baud rate Serial.begin(19200); // the Serial port of Arduino baud rate. } void loop() { if (GPRS.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield { while(GPRS.available()) // reading data into char array { buffer=GPRS.read(); // writing data into array if(count == 64)break; } Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook GPRS.write(Serial.read()); // write it to the GPRS shield } void clearBufferArray() // function to clear buffer array { for (int i=0; i

Для того, чтобы посылать модулю команды, его нужно подключить к компьютеру. Это можно сделать, используя USB порт Arduino. На компьютере для этого нужен любой монитор COM-порта. Его можно скачать отсюда , а можно использовать монитор, встроенный в Arduino IDE.

Всё, что делает прошитая программа Arduino, — «ловит» команды пользователя и посылает их модулю, а затем возвращает пользователю ответы SIM900. Таким образом, передавая модулю AT-команды в ручном режиме, я опробовал приём и передачу SMS-сообщений, а подключив в соответствующие разъёмы микрофон и наушники — воспользовался модулем SIM900 в качестве мобильного телефона.

Передача данных по GPRS с помощью SIM900

Свои первые опыты по передаче данных через GPRS я начал, используя для управления SIM900 платформу Arduino UNO (просто потому, что она была под рукой). Для начала купил хостинг с сервером под Apatche и развернул на нём простейшее приложение, которое умело отвечать на GET-запросы. Получилось! Я все так же посылал команды с ПК контроллеру Arduino, который в свою очередь пересылал их SIM900.

Всё работало корректно до тех пор, пока GET-запросы были достаточно короткими (до 100 символов). Но как только запросы стали длиннее — начались сбои: запросы передавались не полностью. Было замечено, что глюки могут появиться или исчезнуть даже при увеличении/уменьшении управляющей программы Arduino на несколько строк. Впоследствии выяснилось, что сбои связаны с программным USARTом, которой Arduino UNO использует для общения с SIM900, т.к. такой USART целиком и полностью зависит от программного цикла ядра контроллера. При малом количестве данных, они успевают передаваться всегда, а при увеличении их количества — результат передачи зависит от длительности программного цикла.

Вывод из всего вышесказанного: использовать программный USART при общении с SIM900 НЕЛЬЗЯ , особенно когда речь идёт о большом количестве передаваемых данных.

У Arduino Uno всего один «железный» интерфейс USART, который был занят под обмен с ПК, поэтому пришлось отказаться от UNO, заменив её на Arduino Mega, которая не страдает недостатком «железных» USARTов. После такой «рокировки» работа устройства стала стабильной и корректной.

SIM900: TCP-IP стек или HTTP? Что лучше?

Изучая руководство по управлению модемом, я обнаружил что существует две группы AT-команд. Первая группа используется для передачи данных через встроенный TCP-IP стек, а вторая использует HTTP протокол уже реализованный внутренней логикой SIM900. Сколько я ни мучал Google и Яндекс пытаясь узнать, чем же отличаются данные способы, каковы плюсы и минусы каждого из них, — ничего не нашёл, поэтому попробовал оба и делюсь своим практическим опытом тут.

Оба способа рабочие и имеют право на существование.

TCP-IP стек немного сложнее инициализируется (больше команд нужно передать модулю), им немного сложнее управлять. Для того, чтобы передать запрос, необходимо открыть соединение, дождаться ответа и корректно закрыть его.

HTTP — это, говоря простыми словами, браузер встроенный в SIM900. Он прост в инициализации, для того чтобы начать обмен с сервером необходимо открыть сеанс. При этом открытие и закрытие соединения при каждом запросе и решение других «организационных задач» ложиться на плечи SIM900. Это удобно, к тому же передача данных таким способом происходит несколько быстрее, как раз из-за того, что у SIM900 быстрее получается выполнять все «вспомогательные операции», чем это может делать управляющий контроллер.

Таким образом, при выборе способа обмена я все-таки остановился на протоколе HTTP.

Некорректный GET-запрос на сервер

В самом начале своей работы по передаче данных по GPRS я допустил ошибку, которая стоила мне не одного дня мучений. Не имея достаточного опыта работы по взаимодействию с сервером посредством GET-запросов, я, набравшись поверхностных знаний в интернете, составил запрос вида:

GET http://xxx.ru/d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

Этот запрос не является корректным, однако его отлично «кушал» браузер и прокси сервер, с которого я отправлял запросы для отладки — именно поэтому я считал запрос верным.

Самое удивительное то, что SIM900 тоже отлично справлялся с «плохим» запросом (а отправлял запросы я тогда через TCP-IP стек). Однако, в один прекрасный день сервер начал отвечать на такие запросы ошибкой 404. Произошло это по так и не выясненным обстоятельствам, то ли хостинг-провайдер поменял алгоритмы обработки запроса (он открещивается от этого), то ли это сделал мобильный оператор. Но факт остаётся фактом. Тогда же я попробовал передать тот же запрос через HTTP — всё работало. Объясняется это тем, что внутренний HTTP протокол модуля SIM900 (как я уже говорил, по-сути встроенный браузер) умеет сам правильно «распарсивать» некорректные запросы и транслировать в сеть уже в правильном виде. Это еще один плюс (сомнительный, конечно же) использования HTTP, поскольку позволяет программисту некоторые неточности. А вообще, конечно, запрос должен быть написан правильно и выглядеть вот так:

GET /d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

С таким корректным запросом SIM900 успешно обменивается и через TCP-IP стек, и через HTTP.

Зависание SIM900

Иногда при обмене по GPRS возникают ситуации, после которых модуль может зависнуть. Этому виной могут быть некорректные данные, пришедшие по сети и загнавшие в ступор SIM900, или помехи на линии обмена модуля и контроллера, при которых SIM900 получил «не то, что ждал», или ещё какие-то неведомые проблемы. Производитель чипа предупреждает о том, что это может происходить и предлагает в таких случаях перезагружать модуль с помощью специальной последовательности импульсов, подаваемых на вход PWRKEY.

Однако, как выяснилось, это не всегда помогает — после такой перезагрузки модуль может «проснуться» всё ещё «глюкнутым». И об этом тоже нас предупреждает производитель, если внимательно читать DataSheet на модуль. Вот что рекомендуется в документации:

NOTE: It is recommended to cut off the VBAT power supply directly instead of using external reset pin when SIM900 can not respond to the AT command “AT+CPOWD=1” and PWRKEY pin.

Поэтому самым правильным способом перезагрузки модуля является полное снятие с него питания (с ножки VBAT), выдержка некоторой паузы (хотя бы секунду на всякий случай) и повторная подача питания. Для перезагрузки модуля на плате лучше предусмотреть реле или транзисторный ключ, управляемый контроллером.

Заключение

В дальнейшем я планирую выпустить серию статей-уроков, в которых расскажу как организовать обмен между серверным веб-приложением и SIM900, начиная с покупки хостинга у провайдера заканчивая написанием кода управляющих программ.

До свидания! Следите за обновлениями на LAZY SMART .

Может применяться в устройствах, где необходима связь на большие расстояния. Например, роботом в Москве человек управляет сидя в Краснодаре! Или фермер включает водяной насос на рисовом поле из своего дома, расположенного за несколько километров от поля! Есть несколько вариантов связи с устройством:

Простая связь на основе SMS сообщений:
Включение/выключение устройства при помощи простых SMS команд. Для управления устройством можно использовать любой мобильный телефон.
Охранная/пожарная сигнализация, которая информирует хозяина о чрезвычайной ситуации в доме при помощи SMS.

Связь на основе вызовов:
“Умная” охранная/пожарная сигнализация, которая вызывает полицию или пожарных и сообщает о чрезвычайной ситуации при помощи заранее записанных голосовых сообщений.

Связь с использованием интернета (GPRS) :
Пользователь может управлять устройством с любого ПК/планшета/мобильного телефона, подключенного к интернету. Например, информационные дисплеи, установленные на трассах, управляются из центральной диспетчерской.
Робот, управляемый через интернет. Такой робот доступен с любого устройства подключенного к интернету из любой точки мира.
Портативные устройства, установленные в транспортных средствах, которые подключаются к интернету с помощью GPRS модуля SIM300 и добавляют текущую позицию (с помощью GPS (Global Position System, Глобальная Система Позиционирования)) на сервер. Эти данные сохраняются с базу данных на сервере вместе с идентификатором автомобиля. Для просмотра маршрута автомобиля можно соединиться с сервером с компьютера при помощи World Wide Web (Всемирной Паутины).

Преимущества использования модуля SIM300

Набор SIM300 Kit является полностью самостоятельным модулем с разъёмом SIM-карты, блоком питания и т.д. Этот модуль может быть легко связан с дешевыми микроконтроллерами AVR/PIC/8051. Связь с микроконтроллером осуществляется через асинхронный последовательный порт. Это основной тип последовательной связи, который аппаратно поддерживается большинством микроконтроллеров. Данные передаются бит за битом и собираются в байты. На высоком уровне это выглядит как простой текстовый поток. Всего потоков два: один от микроконтроллера к SIM300 и другой от SIM300 к микроконтроллеру. Команды передаются как простой текст.

Если вы никогда не использовали последовательную передачу данных и не слышали о ней, то желательно разобраться в её работе и попрактиковаться на более простых примерах.

Связь с модулем SIM300 при помощи AVR UART

Аппаратная часть микроконтроллера, используемая для последовательной связи, называется UART, и мы используем его для связи с модулем SIM300 (Также он может использоваться для связи с другими устройствами, например считывателями RFID, GPS модулями, сканерами отпечатков пальцев и т.д.). UART является очень распространенным способом связи в мире электроники, мы написали для него чистую и простую библиотеку, которую мы применяем во всех своих проектах с использованием UART.

Поскольку байт от SIM300 может прийти на микроконтроллер в любое время, то, что произойдет, если микроконтроллер занят чем-то другим? Чтобы решить эту проблему, мы сделали буферизацию входящих данных, основанную на прерываниях. Буфер находится в оперативной памяти микроконтроллера. У него есть функция, позволяющая определить количество байт в очереди.

Ниже приведены функции библиотеки AVR USART:

void USARTInit(uint16_t ubrrvalue)

Инициализация аппаратной части AVR USART. Значением параметра ubrrvalue устанавливается желаемая скорость передачи данных. По умолчанию скорость передачи данных для SIM300: 9600 бит/сек. Для микроконтроллера AVR работающего на частоте 16 МГц значение ubrrvalue для такой скорости должно быть 103 .

char UReadData()

Чтение одного символа из очереди. Если в очереди ничего нет, то ответ 0.

void UWriteData(char data)

Записывает один байт данных на линию Tx, используя функцию UWriteString ().

uint8_t UDataAvailable()

Сообщает количество данных в очереди FIFO.

void UWriteString(char *str)

Записывает строку в Си стиле, оканчивающуюся нуль символом в линию Tx.
Пример 1: UWriteString("Hello World !");
Пример 2: char name="Avinash !"; UWriteString(name);

void UReadBuffer(void *buff,uint16_t len)

Копирует содержимое FIFO буфера в память, определенную buff, количество скопированных данных определяется параметром len. Если по UART в FIFO буфер пришло меньше данных, чем надо (в соответствии с параметром len), то оставшееся место будет заполнено нулями.

char gsm_buffer;
UReadBuffer(gsm_buffer,16);

Приведенный выше пример будет считывать 16 байт данных (если они есть) из FIFO буфера в переменную gsm_buffer . Обратите внимание, что gsm_buffer выделен массив 128 байт, поскольку позже нам может потребоваться более 16 байт. Таким образом, этот буфер можно будет использовать для чтения до 128 байт в дальнейшем.

Функция, показанная выше, обычно применяется вместе с UDataAvailable ().

while(UDataAvailable()<16)
{
//Do nothing
}

char gsm_buffer;
UReadBuffer(gsm_buffer,16);

Фрагмент кода показанный выше, ждет пока в буфере накопится 16 байт данных, а затем считывает их.

void UFlushBuffer()

Отменяет ожидание данных FIFO буфером. Прежде чем отправлять новую команду GSM модулю, сначала отмените ожидание данных FIFO буфером.

Приведенные выше функции используются для отправки и получения текстовых команд от GSM модуля SIM300.

Набор AT команд для SIM300

Теперь, года Вы знакомы с основами библиотеки AVR USART и её использованием для инициализации USART, отправки и получения данных, настало время, чтобы изучить команды модуля SIM300 и как отправлять их и принимать ответы. SIM300 имеет несколько функций: отправка текстового сообщения, звонок и т.д. Каждая из этих функций выполняется после определённой команды, и SIM300 имеет свой набор команд.

Все команды SIM300 начинаются с префикса AT+ и заканчиваются Carriage Return (сокращенно, возврат каретки). ASCII код CR - 0x0D (десятичное 13). Все команды, которые вы отправляете SIM300, будут возвращаться по TX линии SIM300. То есть если вы отправляете команду 7 байт (включая завершающий CR), то вы сразу получите эти 7 байт в буфер по UART. Если вы не получили её, то это значит, что-то не в порядке!

Первая функция, которую мы изучим будет SIM300Cmd(const char *cmd) , она выполняет следующие действия:

  • Пишет команды, заданные параметром cmd .
  • Добавляет CR после команды.
  • Ожидает возврата команды, и если она приходит до тайм-аута, она отвечает SIM300_OK (константа, определенная в sim300.h). Если возврата ждали слишком долго, а его не было, она отвечает SIM300_TIMEOUT.

Примечание: Все зависимые функции SIM300 хранятся в файле sim300.c. Образцы и константы хранятся в sim300.h

Работа с SIM300Cmd ()

Int8_t SIM300Cmd(const char *cmd) { UWriteString(cmd); //Send Command UWriteData(0x0D); //CR uint8_t len=strlen(cmd); len++; //Add 1 for trailing CR added to all commands uint16_t i=0; //Wait for echo while(i < 10*len) { if(UDataAvailable() < len) { i++; _delay_ms(10); continue; } else { //We got an echo //Now check it UReadBuffer(sim300_buffer,len); //Read serial Data return SIM300_OK; } } return SIM300_TIMEOUT; }

За командой обычно следует ответ. Форма ответа такая:
LF - Line Feed, его ASCII код 0x0A (10 в десятичной системе)

Таким образом, во время ожидания ответа после отправки команды могут случиться три вещи:

  • Ответа нет в течении длительного времени. Вероятной причиной может быть то, что SIM300 не подключен к микроконтроллеру.
  • Ответ получен, но не тот, который ожидался. Причиной может быть неисправность последовательной линии, неверно установленная скорость передачи данных или микроконтроллер, работающий с неверной частотой.
  • Получен правильный ответ.

Например, команда Get Network Registration (Регистрация в сети) выполняется следующим образом: Command String (Команда): "AT+CREG? "

Response (Ответ): +CREG: , OK

Вы видите правильный ответ 20 байт. То есть после отправки команды "AT + CREG?" необходимо ждать получения 20 байт или пока истечет определенное время. Второе условие выполняется во избежание зависания, если SIM300 неисправен. То есть вместо того, чтобы вечно ждать ответа, будет выдана ошибка, если SIM300 отвечает слишком долго (это называется тайм-аут)

Если получен правильного ответа, то мы анализируем переменную для получения информации о регистрации в сети.

В зависимости от текущего состояния регистрации в сети значение может быть: 0 - Не зарегистрирован, сейчас SIM300 не ищет нового оператора для регистрации. 1 - Зарегистрирован в домашней сети. 2 - Не зарегистрирован, сейчас SIM300 ищет нового оператора для регистрации. 3 - В регистрации отказано. 4 - Неизвестно. 5 - Зарегистрирован, роуминг.

Работа с SIM300GetNetStat ()

Int8_t SIM300GetNetStat() { //Send Command SIM300Cmd("AT+CREG?"); //Now wait for response uint16_t i=0; //correct response is 20 byte long //So wait until we have got 20 bytes //in buffer. while(i<10) { if(UDataAvailable()<20) { i++; _delay_ms(10); continue; } else { //We got a response that is 20 bytes long //Now check it UReadBuffer(sim300_buffer,20); //Read serial Data if(sim300_buffer=="1") return SIM300_NW_REGISTERED_HOME; else if(sim300_buffer=="2") return SIM300_NW_SEARCHING; else if(sim300_buffer=="5") return SIM300_NW_REGISTED_ROAMING; else return SIM300_NW_ERROR; } } //We waited so long but got no response //So tell caller that we timed out return SIM300_TIMEOUT; }

Точно так же реализована функция: int8_t SIM300IsSIMInserted()

При другом типе ответов мы не знаем заранее точный размер ответа как в приведенной выше команде. Например, это команда Get Service Provider Name(Получение названия оператора (провайдера)), где длина имени оператора неизвестна заранее. Это может быть MTS, Beeline и т.п.. Для решения этой проблемы мы пользуемся тем, что перед и после ответа находится CR LF . Таким образом, мы просто записываем в буфер все символы до тех пор, пока мы не встречаем CR , что означает конец ответа.

Для упрощения обработки таких команд, мы сделали функцию
SIM300WaitForResponse (uint16_t timeout)

Эта функция ждет ответа от SIM300 (конец ответа обозначается CR) и сообщает размер ответа, в то время, когда сам ответ копируется в глобальную переменную sim300_buffer .

Если ответ не получен до тайм-аута, то ответ 0. Время тайм-аута в миллисекундах можно задать параметром timeout . Она не считает запаздывающие LF или последние OK , они остаются в UART FIFO буфере. Поэтому перед возвратом мы используем команду UFlushBuffer () , чтобы удалить их из буфера.

Работа с SIM300WaitForResponse (uint16_t timeout)

Int8_t SIM300WaitForResponse(uint16_t timeout) { uint8_t i=0; uint16_t n=0; while(1) { while (UDataAvailable()==0 && n

Работа с SIM300GetProviderName (char *name) Функция выполняет следующие действия:

  1. Очищает USART буфер, чтобы удалить все ошибки или ответы.
  2. Отправляет команду "AT + CSPN?" используя функцию SIM300Cmd ("AT + CSPN?");
  3. Затем она ждет ответа, используя функцию SIM300WaitForResponse ()
  4. Если мы получаем не нулевой ответ, она разбирает его чтобы получить название оператора.

Подобным образом реализованы следующие функции:

  • uint8_t SIM300GetProviderName(char *name)
  • int8_t SIM300GetIMEI(char *emei)
  • int8_t SIM300GetManufacturer(char *man_id)
  • int8_t SIM300GetModel(char *model)
uint8_t SIM300GetProviderName(char *name) { UFlushBuffer(); //Send Command SIM300Cmd("AT+CSPN?"); uint8_t len=SIM300WaitForResponse(1000); if(len==0) return SIM300_TIMEOUT; char *start,*end; start=strchr(sim300_buffer,"""); start++; end=strchr(start,"""); *end="\0"; strcpy(name,start); return strlen(name); }

SIM300 и ATmega32. Аппаратная часть

Для демонстрации связи с SIM300 используя AVR ATmega32, нам понадобится следующие компоненты:
- ATmega32 с обвязкой – регистром сброса, ISP штырьками, кварцем 16 МГц.
- источник +5В для питания ATmega32 и ЖК-дисплея.
- символьный ЖК-дисплей 16x2 для индикации результатов.
- модуль SIM300.

Мы использовали отладочную плату Xboard , поскольку она имеет ATmega32 с обвязкой, источник +5В и ЖК-дисплей.

Демонстрационный исходный код для AVR и SIM300

Демонстрационный исходный код написан на языке C и скомпилирован с использованием бесплатного AVR-GCC компилятора, использую последнюю . Проект разделен на следующие модули:

  • Библиотека ЖК-дисплея
    - Файлы lcd.c, lcd.h, myutils.h, custom_char.h
    - Её работа заключается в контроле стандартного ЖК-дисплея 16x2.
    - Более подробную информацию можно найти по ссылке .
  • Библиотека USART
    - Файлы usart.c, usart.h
    - Её работа заключается в контроле аппаратного USART микроконтроллера AVR. Включает в себя функции инициализации USART, отправки/приема символов, отправки/приема строк.
  • Библиотека SIM300
    - Файлы sim300.c, sim300.h

Пошаговая настройка проекта AS6

Создайте новый проект AS6 под названием "Sim300Demo".
Используя solution explorer (дерево проектов) создайте папку с именем "lib" в текущей папке.
Внутри папки "lib" создайте папки "LCD", "USART" и "SIM300".
Скопируйте файлы (с помощью проводника Windows) lcd.c, lcd.h, myutils.h, custom_char.h в папку lcd.
Скопируйте файлы (с помощью проводника Windows) usart.c, usart.h в папку USART
Скопируйте файлы (с помощью проводника Windows) sim300.c, sim300.h в папку SIM300.
Добавьте файлы lcd.c, lcd.h, myutils.h, custom_char.h в проект с помощью solution explorer (дерева проектов).
Добавьте filesusart.c, usart.h в проект с помощью solution explorer (дерева проектов).
Добавить файлы sim300.c, sim300.h в проект с помощью solution explorer (дерева проектов).
Определите значение F_CPU = 16000000 использования AS6.
Скопируйте и вставите основной файл Sim300Demo.c в программу.
Скомпилируйте проект чтобы получить hex файл.
Прошейте Xboard с помощью USB программатора.
Если вы используете новый микроконтроллер ATmega32, установите LOW FUSE на 0xFF и HIGH FUSE на 0xC9 .

Что делает демонстрационная программа?

Инициализирует ЖК-дисплей и модуль SIM300.
Проверяет, что модуль SIM300 подключен к USART и реагирует должным образом.
Отображает IMEI SIM300 модуля.
Отображает ID производителя
Проверяет наличие SIM-карты.
Ищет GSM сеть и устанавливает соединение. Для этого должна быть активная SIM-карта.
Показывает название оператора, например MTS или Megafon.

Возможные проблемы

Нет изображения на ЖК-дисплее

Убедитесь, что в проекте AVR Studio установлена тактовая частота 16 МГц (16000000Hz)
Отрегулируйте контрастность потенциометром.
Нажмите кнопку сброса несколько раз.
Включите/выключите устройство несколько раз.
Подключайте ЖК-дисплей только так, как показано на схеме.

Во время инициализации SIM300 появляется ошибка "No Response (Нет ответа)"

Проверьте целость Rx, Tx и GND линий между SIM300 и Xboard.
Убедитесь, что микроконтроллер работает на частоте 16 МГц.
Установите фьюзы точно, как описано выше.

Ошибки компилятора

Многие люди используют уже написанные и скомпилированные программы. У них отсутствует опыт и они не знакомы с основами программирования и компиляции. Ознакомится с компиляторами и их работой на разных платформах (PC / MAC / Linux) будет отличным началом. Встроенные системы не подходят для изучения основ. Они предназначены тем, кто имеет эти навыки и просто пользуется ими.
Убедитесь, что все файлы библиотеки ЖК-дисплея добавлены к проекту.
Убедитесь, что AVR-GCC установлен. (Дистрибутив Windows называется WinAVR)
Убедитесь, что в проекте AVR Studio указан AVR GCC.

Общие советы для новичков

Используйте готовые отладочные платы и программаторы.
Попробуйте изучать , основываясь на статьях и учебниках.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК AVR 8-бит

ATmega32

1 В блокнот
U2 Линейный регулятор

LM7805

1 В блокнот
D1 Выпрямительный диод

1N4007

1 В блокнот
D2 Светодиод 1 В блокнот
С1, С2 Конденсатор 22 пФ 2 В блокнот
С3, С4, С6 Конденсатор 0.1 мкФ 3

Здравствуйте!
Встала тут задача по управлять загородным домом, последить за температурой, дверями, окнами. И тут же возник вопрос о среде передачи данных. Ну провода и радиоканал отпадают из-за дороговизны, ВОЛС просто мечты, а вот GSM то что нужно. Сначала пал глаз на старые телефоны "Motorola", "Nokia", "SonyEricsson". Посмотрел, повертел и передумал. Первое, не хотел подпаиваться к контактам кнопок, да и обратной связи нет. Второе, разбираться с ПО телефона, ну это совсем не в кассу. В общем в творческих раздумьях и плавая в просторах всемирной паутины, изловив пару вирусов был найден компромисс. И работа с ПО и без всяких кнопок. Все это предлагает модуль SIM900D . Чем он мне приглянулся.
- Первое это простота монтажа. В этом вы убедитесь позже. - Второе это общение через UART. (Это значит МК + SIM900D = нормальная связь) - Третье это питание модуля от 3 до 4.8 вольт. Хош AVR, хош ARM. По вкусу. Ну лирики хватит, пора по делу.
Выглядит сей модуль так.

По поводу монтажа. Как видите модуль заточен на поверхностный монтаж. Размеры контактных площадок достаточно большие даже для ЛУТа. Ниже картинка моего устройства.

Как видите ничего сложного. Теперь давайте поговорим о схеме подключения этого чуда. Глядим мануал. И видим распиновку.

Да, много всего, но все использовать не будем. Первое что нам потребуется это обвязать все выводы "GND". Если глянуть на правый верхний угол, то можно заметить три отдельных вывода. Два "GND" и "ANT". Эти выводы расположены таким образом не просто так. Глянем в документацию на картинку подключения антенны.

59 и 61 контакты должны находиться как можно ближе к выводу антенны. Дополнительные схемы выделенные пунктиром, нужны для подключение антенн с кабелем. Поэтому я впаял SMA разъем как можно ближе к выводам 59, 60, 61 и не стал заморачиваться со схемой согласования, при этом с антенной на 3-х метровом кабеле и в месте очень плохого приема, выжал из модуля 13 балов из 31. Разъем видно на картинке выше. Точнее ноги от него)) Сам разъем с другой стороны. При этом контакты 59 и 61 как бы обнимают антенну. Ну как-то так. Далее давайте поговорим о SIM-карте. Для ее установки я использовал вот такой разъем (SIM ICA-501-006-01-F7)

Самое интересное то что я нашел 3 варианта распиновки SIM-карт. Какую использовать? Не буду вносить интриги, а для простоты привожу распиновку данного разъема. Вид сверху.

Но это еще не все. Если глянуть в монуал на схему включения SIM-карты, то там можно увидеть некую микросхемку под названием SMF05C . Эта микросхема содержит защитные диоды аж 5 штуков. Нужна для зашиты контактов SIM-карты. Конечно можно ее и не ставить, но тогда будьте внимательны и не трогайте контакты пальцами!!! Я как грешный человек за себя не ручаюсь, поэтому микруху припоял. А вот и сама схема.

Она конечно приведена для 8-и контактной SIM-карты, но для 6-ти будет тоже самое. Есть правда две засады с этой микросхемой. Первая это то что ее хрен где сыщешь. А вторая то что размер ее... Я когда получил заказ и достав положил ее на стол... Короче на втором рисунке сверху она впаяна между SIM-картой и батарейкой. Для сравнения резисторы 0805. Ну а справа транзистор в корпусе SOT-23. Так ну вроде с SIM-картой разобрались, поехали дальше. А дальше светотехника. Вообще говоря это на любителя. Так как все эти сигналы можно завести прямо в МК и он там сам пускай разбирается. Я все их вывел из чувства к прекрасному. Так что решайте сами.
- Первое это сигнал включен модуль или нет (STATUS) лог 1 - Второе это сигнал наличия регистрации сети (NETLIGHT) лог 1/0 (мигает) Если мигает с одинаковой частотой, значит не зарегистрировался в сети Если длинный промежуток, значит есть конект к сети. - Третье это сигнал звонка/sms (RING) лог 0 Горит если есть входящий звонок и моргнет при получении sms-сообщения. Первые два сигнала нужно подключать через NPN транзистор в ключевом режиме.

А третий сигнал (RING) нужно подключать через PNP транзистор. Еще один не мало важный сигнал, это кнопка включения и выключения модуля. (куда же без нее). Вот что нам предлагает мануал.

То есть подали лог 1 на базу транзистора на 1 секунду и модуль включился.
Теперь давайте поговорим о питании. Да, я бы ща от хорошей тарелочки борьща не отказался бы, а вы? Ну ладно, едем дальше. Питается модуль напругой от 3 до 4.8 вольтов. Вроде все просто, да не так. В момент звонка, передачи sms, поиска сети модуль может потребовать аж до 2А. Во как. Так что любители LM7805 и КРЕНок могут огорчиться. К счастью в мануале присутствуют две схемы на микросхемах MIC29302 (я так в продаже ее и не нашел) и LM2596 (эту купить можно). Но я лениииивый и собирать питалово с таким большим количеством обвязки просто не захотел. Я пошукал в интернете и нашел. Есть такой хороший стабилизатор для процессоров типа "Пень", "AMD" на 3.3в и до 7.5А. Во, думаю то что надо и ARM запитать можно и модуль. Вот схема этого чуда.

А вот как это выглядит в собранном виде.

Радиатор поставил со страху, в принципе микросхема не греется даже во время звонка. И последнее на что следует обратить внимание, это на батарейку. Она нужна для поддержания жизни часов реального времени. Самое важное что оставлять этот вывод в воздухе нельзя. Лично я сошелся на подключении батарейки чего и вам желаю. Можно конечно две АА влепить)) но как-то крупновато, а вот в форме таблетки 2032 на 3v то что надо. Благо они стоят не дорого и отсеки паять можно прям на плату. По моему это самое простое решение. Решать вам. Ну вроде и все. Вот как это все безобразие выглядит вместе и в работающем состоянии.

В следующей статье я расскажу как ломал этот модуль но уже программно через терминал при помощи АТ команд.
Выкладываю схемы в PCAD-2006
Архив с файлами модуля GSM.
Архив с файлами блока стабилизации.
Продолжение цикла статей о GSM модуле.
AT-Команды.
Связь модуля с ATmega8515.
Отладочная плата на базе SIM900D


Foli 14.03.13

Хотелось бы подробней о АТ командах, UARTу и непосредственно работы с этим в CodeVision

Алексей 15.03.13

С АТ командами разбираюсь. Не хочу выкладывать половину работы, так как есть некоторые вопросы. А с UARTтом и CVAVR там все просто. Как только разберусь с АТ командами сразу выложу и какие команды и как из CVAVR их подать.

Anatok 04.11.13

Все это красиво. А вот если сигнализация работала хотя бы при минус 30-и градусах и зарядилась скрытыми солнечными батареями особенно зимой, то желающих иметь такой аппарат было бы очень много.

Алексей 04.11.13

GSM модуль жрет до 2А при регистрации в сети или звонке или связи по GPRS. Для таких ресурсов требуется хороший аккумулятор, а при -30 АКБ долго не проживет. Даже в метеостанциях на уличных датчиках рекомендуют использовать простые батарейки.

Мишка 11.11.13

Если еще актуально и интересно...помотри на EAT для SIM900. В нем внутри ARM и есть SDK в котором можно загружать приложения в SIM900 из которых можно много всего делать...например посылать те-же AT команды...+клавиатура + SPI дисплей... + 2 АЦП:) Нескучного вечера:)

Мишка 11.11.13

А све-таки для него очень красиво делать для него питание на L5973D. Да про 2А написана в даташите...но практически это очень кратковременные импульсы. У меня он прекрасно работает например с Arduino Mega которая сама питается от USB порта (у которога ток 0.5 А)

Алексей 11.11.13

В этом-то и загвоздка. Я тоже по началу питал от 7805, все работало, а потом бац... И при подключении к сети все гаснет, а потом в рестарта идёт. Видимо сторожевая собака по припадке питания рестартует. А с L7953D будет красиво, но где её взять и скопа она будет стоить:) Поэтому я перешёл на IRU1075

Алексей 11.11.13

Прошу прощения за ошибки, это чертов ГУДРОЙД горбыли лепит за меня. Думает он умнее. Не буду править, пусть Гуглу стыдно будет за их работу.

дядяМиша 24.12.13

У меня при регистрации в сети атмега в перезагруз уходит. Хотя стоит импульсный dcdc. Конденсаторов на 200мкф. А бывает, работает стабильно. Замучался уже.

Алексей 25.12.13

Схему в студию. Со слов довольно сложновато понять проблему.

дядяМиша 25.12.13
дядяМиша 25.12.13

Http://ybex.com/d/tk7kgiefpklpeujb1zbl4lo5 mrkf7ayvci04ouq3.html МК запитан от 2.8 (пробовал даже 3.7) Вольт, чтобы не городить преобразователь уровня.

Алексей 25.12.13
сергей 19.07.14

Алексей здравствуйте! у вас есть готовые платы с сим900, можно ли купить?

Алексей 19.07.14

В каком смысле готовые? Сам модуль уже собран и остается под конкретный девайс изготовить плату с требуемыми выходами и входами. Та что в данной статье это лишь демо плата для отладки программ. Для конкретного девайса требуются размеры, расположение разъемов, выходов на наушники и микрофон. Где будет антенный разъем. Дайте более подробную информацию о том что Вам нужно.

Андрей 28.09.14

Я так понимаю это прототип той платки которую я жду не дождусь. Только в коммерческом варианте её поженили с блоком питания и облагородили аудио выходами. Что есть большой гуд.

Алексей 28.09.14

Собственно так и есть. Я просто сразу убил несколько зайцев. Решил извечную проблему с питанием и согласованием уровней на UART. И для шика добавил аудио вход и выход. Фактически готовый сотовый телефон.

Андрей 28.09.14

Хотел бы внести рацуху на будущее. по сути данная плата законченный узел. И её ПРАКТИЧЕСКИ можно использовать в готовом изделии. однако есть одно НО. При мезонном навесе её по любому лучше ставить сверху (разъем антены, доступ к симкарте) поэтому вполне целесообразно параллельно всем штырькам для "периферии" оставлять отверстия для таких же штырьков с возможностью впайки оных направлением "вниз". Т.е. захотел я данный девайс насадить на плату микроконтроллера, развёл под твой, запаял ответные разъемы в него и состыковал. Ещё и с

Андрей 28.09.14

Сожрало полмессаги, но мысль надеюсь понятна-)

Алексей 28.09.14
Сергей 01.02.15

Подскажите почему модуль греется и неловит сеть?

Алексей 01.02.15

Здесь есть несколько причин. Первая, превышено питание. Второе, не попал ли плюс на общий. Нужно внимательно посмотреть ножки питания. Третье, не касается ли модулю брюхом питающих линий. На брюхе есть несколько технологических контактов которые должны быть изолированны от каких либо проводников. Четвертое, не замкнут ли вывод антенны с общим выводом. А если быть точнее, то необходимо смотреть плату. Сбросьте мне плату на почту и я посмотрю, может там что-то не так.

Сергей 01.02.15

Платы у меня заводские, МастерКит BM8039 и на обеих одна и та же проблема..вставляешь симку модуль начинает грется и нет сети.

Алексей 01.02.15

Довольно сложно сказать. Схема заводская, надо по плате полазить. Из документации видно что на плате нет рекомендуемых защитных диодов для SIM-карты. Сама карта и разъем по пинам совпадают? 300 модуль старый и по моему он работает только с симками 5 вольтовыми, а сейчас они все на 3в. Но я могу и ошибаться. Надо смотреть саму плату, так сложно что-то сказать. Если симптом на обеих один и тот же, то я бы какпал в сторону разъема и вольтажа симок. Еще раз, современные симки на 3-х вольтовые.

Сергей 01.02.15

Стоит sim900D...диодов нет.Когда вставляю карту появляется питание на модуле и он начинает греться,но на симку напр. с 9 ноги не идёт..

Сергей 01.02.15

Изначально работали нормально..потом что то коратнуло...не могу понять что..

Сергей 01.02.15

Можно как то проверить модуль не выпаивая?

Алексей 01.02.15

А что именно коротнуло? Если питание на симку не идет, то я боюсь сдохла линия для симки. А симка сколько ног? 6 или 8? Для проверки можно не вставляя симки пообщаться с модулем по шине UART 3, 4 ноги. Если откажется принимать АТ команды, то я думаю можно его хоронить.

АНОНИМ 01.02.15

Что коротнуло точно незнаю..ног 8 ..а как пообщаться то?

Алексей 01.02.15

А на разъеме тоже 8? Берем микросхему FT232RL, собираем переходник USB<->TTL, припаеваемся к UART модуля, запускаем терминал, например Putty, пишем AT и давим ентер. Если вернет ОК, значт еще не все потеряно. Если тишина... На помойку. А да, какие светодиоды а плате? как определяется наличие регистрации в сети?

Сергей 02.02.15 03:12

На разъёме тоже 8..на плате два светодиода зелёный и красный,наличие сети определяется по морганию зелёного раз в три секунды...можно как то вставить фото платы?

Алексей 02.02.15 07:42

Проще перейти на форум.

Сергей 02.02.15 14:02

Если не вставлять симку значит нужно подать питание на модуль?

Алексей 02.02.15 15:48

Я не могу гадать на кофейной гуще. Мне нужна либо схема, либо плата. И причем тут питание модуля и сим карта? Там скорее всего еще с каким-то микроконтроллером пересекается. Он и подает питание. В общем нужна схема. А так это как диагноз по телефону ставить.

Сергей 02.02.15 15:56

Где на форуме можно выложить схему?

Сергей 02.02.15 15:57

Питание на модуль приходит только когда вставляешь симку

Алексей 02.02.15 19:27

Ну нет такого у модуля SIM900D. Для включения модуля необходимо удержать низкий уровень на ножке 12, а потом поднять. Сим карту вообще нельзя вставлять или вынимать при включенном модуле, есть вероятность сжечь порт. Если посмотреть документацию, то можно там найти рекомендации по установке защитных диодов на линии порта сим карты. На форуме . Создать тему и выложить фото.

Евгений 08.09.15 12:04

У меня при подаче напряжения на модуль, на 12 ноге присутствует положительный потенциал, на 5 ноге так же положительный (при условии, что данные ноги висят в воздухе). Подскажите пожалуйста, ведь на 5 ноге вроде должен быть ноль? Если не так, пожалуйста поправьте меня.

Алексей 08.09.15 13:21

12 ножка это включения модуля. На ней при подаче питания висит 1. Для включения модуля нужно прижать на пару секунд 12-тую ножку к общему проводу, то есть подать 0. При подаче питания на модуль 5 ножка должна быть подтянута к общему проводу двумя резисторами (это видно из схемы включения транзистора в ключевом режиме) и на ней должен быть 0, так как базу нужно подтянуть к нулю для полного закрытия транзистора. После прижатия 12 ноги к нулю, на 5 ножке должна появится 1, а через некоторое время меандр с указанием статуса наличия и подключения к сети.