Для разработки IoT устройств приходится использовать различные GSM модули. К сожалению, NB IoT или LoraWAN чипы на данный момент стоят минимум в три раза дороже, поэтому в большинстве проектов их использование неоправданно, пока не снизится стоимость.
Модуль хорошо документирован. Документация здесь. Сайт кривой. Скачать документацию официально не просто. 🙁 Поэтому используем прямую ссылку, не требующую регистрации, на всю необходимую документацию и прошивки для SIM800C. Прямая ссылка на документацию и инструменты прошивки для SIM800x. Документация по схемотехнике.
На Aliexpress есть несколько вариантов модулей SIM800C. Ссылка здесь. В данном примере я рассмотрю вариант с разведенным на плате конвертером уровней TTL 5V <-3,3V и преобразователем напряжения с 5V до ~3,7 Вольт (стандартное напряжение Li-Ion батарей сотовых телефонов).
В принципе, можно использовать более дешевый вариант модуля SIM800L, адаптировав уровень TTL под 5V Arduino с помощью резисторного делителя напряжения, либо заказав плату двунаправленного TTL конвертера уровней 5V <-> 3V ценой в районе 0,5 $ и добавив DC-DC down-step модуль для снижения напряжения с 5V до 3,7 V по цене 0,3 $ но в совокупности цена получится примерно такой-же, экономии не будет.
Однако надо понимать, что при добавлении двунаправленного TTL конвертера уровней на него надо подать опорное напряжение равное уровню допустимого напряжения на входе SIM800, а это ~2,9 V, а не 3,3 V, которых взять негде, поскольку выход VDD_EXT с чипа SIM800 не выведен.
Батарею можно напрямую подключить к пину Vbat. На этом входе можно замерять напряжение на чипе. Оно составляет 3,7 V, встроенный преобразователь напряжения работает нормально, хоть и схема проще, чем у самого дешевого DC-DC step down конвертера.
Схема платы SIM800C
В datasheet модуля указан максимальный уровень логической единицы на входе RX — 3,1 В (при минимальном 2,1 В). Для конвертации TTL уровней на плате SIM800C разведен конвертер. В принипе достаточно было конвертер поставить только на RX вход, поскольку микроконтроллеры Arduino/ESP8266/ESP32 чувствительны к низкому входному напряжению TTL с SIM800C.
Схема двунаправленного конвертера уровней довольно стандартная и обеспечивает приведение напряжения логической 1 на SIM800 к уровню VDD_EXT. Это напряжение снимается с SIM800 и по datasheet соотвествует 2,8 V.
Соотвественно, на входе модуля SIM800 преобразователь уровней обеспечивает напряжение логической 1 не выше 2,9 V при максимальном значении.
Поскольку двунаправленного преобразования на RX не требуется, в теории, можно было бы использовать дешевый резистивный делитель, как указано в статье по подключению модуля SIM800L. Подробная схемотехника подключения этого модуля к ESP32 и код программы в моей статье.
Вероятно, в данном случае использовали более дорогую схему согласования уровней, чтобы гарантировать, что пользователь неосторожными действиями не сожжет RX порт чипа SIM800. В случае резистивного делителя это можно сделать попутав Rx и Tx. Ну и важно для полноценного согласования уровней SIM800 с микроконтроллером 5-ти вольтовой логики, когда уровень логический единицы может быть высоким, так что микроконтроллер не будет воспринимать уровень логической единицы на выходе Tx.
Замечу, что при использовании дешевого модуля SIM800C/L без конвертера уровней, даже при подключении его напрямую к ESP8266/ESP32 с уровнем логики 3,3 V вместо максимальных 3,1 V, указанных в datasheet, можно вывести SIM800 из строя. По крайней мере у меня один модуль SIM800L перестал реагировать на RX. Видимо, внутри чипа нет защитных диодов, либо они не справились даже с такой небольшой разницей в напряжении.
Поэтому при подключении модуля SIM800 без конвертера уровней к ESP8266/ESP32 тоже нужно добавить хотя-бы резистивный делитель на вход RXD.
Напряжение питания модуля SIM800 (VBAT) 3,4 — 4,5 V, рекомендуемое 4 V при максимальном токе до 2А. Модуль достаточно прожорлив, поэтому его нельзя запитывать от платы Arduino и от маломощных USB зарядок, дажы не вывести их из строя.
На плате уже разведен фильтр для подавления импульсных помех для обеспечения стабильной работы модуля, однако, как показывает опыт, этого фильтра недостаточно при работе от простых блоков питания.
Слот SIM карты, в отличие от недорогого модуля SIM800L, подключен к чипу с защитой диодной сборкой SMF05C. Она предохраняет чип SIM-карты и SIM800C от статического электричества.
Недостатки платы SIM800C
Не могу сказать, что модуль SIM800C разработан удачно. Замечания такие:
- Расстояние между гребенками не кратно 2,54 мм, поэтому модуль не встает в breadboard макетные платы. Этой проблемы нет даже у дешевой платы SIM800L. Она встает в макетную плату без проблем. Это очень большой косяк разработчиков!!!
- Для понижения напряжения с 5V до 3,7V используется схема с двумя диодами. Как говорится в статье, падение напряжения на диодах в обычном режиме работы порядка 0,6 — 1,2V и SIM800 достаточно напряжения для работы. Однако при пиковых значениях токов падение напряжения возрастает и на чипе напряжение может быть ниже 3,3 V. В результате, например, при запуске, когда энергопотребление высокое, модуль может многократно перегружаться. Поэтому я рекомендую запитывать модуль через вход VBAT подав напряжение 3,8 V c DC-DC конвертера напряжения (DC-DC stepdown converter) или от батареи.
Распиновка платы модуля SIM800C
- 5V: power supply pin, the only input DC5V, used to power the board.
- V_TTL: access control board microcontroller core target voltage of 5V / 3.3V (according to its own microcontroller is much to distinguish kernel V), this pin is used to convert the GSM module board TXD and RXD for the corresponding TTL logic. Описание пространное. На этот пин нужно подать 5V при подключении к платам с уровнем логики 5V (например, Arduino) и 3,3V при подключении GSM модуля к ESP8266/ESP32.
- GND: power supply ground
- TXD: send pin serial port module, TTL level (not directly connected to RS232 level)
RXD : receive pin serial port module, TTL level (not directly connected to RS232 level)- DTR: Data Terminal Ready
- SPKP: Core Audio output pin
- SPKN: Core Audio output pin
- MICN: Core Audio input
- MICP: Core Audio input
- RI: Ring core pin tips
- VRTC: RTC pin external battery
- GND: power supply ground
- PWR: This pin can turn down or turn off the module. Этот пин должен быть замкнут на GND на время не менее 1 с для включения модуля. Чтобы модуль стартовал сразу при включении — PWR закорачивают на GND.
- GND: power supply ground
- VBAT: lithium battery input pin, 3.3v-4.4v
Схема соединения SIM800C c USB-to-TTL конвертером
Перед использованием модуля SIM800C с микроконтроллерами стоит проверить его работоспособность соединив с конвертером USB to TTL.
Таблица соединения SIM800C с USB-to-TTL converter
SIM800C pin | USB-to-TTL converter | БП +5 V | Примечания |
TXD | RXD | ||
RXD | TXD | ||
GND | GND | GND | |
+5V | +5V | Блок питания на пиковы ток не менее 1 А!!! | |
V_TTL | +5V | ||
PWX | GND | Закоротить пин PWX на GND, чтобы модуль стартовал сразу при включении питания. |
Лучше подавать сначала питание на модуль GSM, а затем уже подключать USB к PC, но это не критично.
Схема соединения SIM800С с ESP32
На картинке нужно добавить соединение между PWX и GND! Детальная схема подключения SIM800L к ESP32 с примером кода в статье.
Тестирование SIM800
- Запускаем Arduino IDE.
- В настройках порта (Tools -> Port) выбираем порт на котором работает USB-to-TTL конвертер.
- Переходим в Tools -> Serial Monitor (Ctrl-Shift-M).
- Выбираем скорость 115200. Где-то проскакивает, что у чипа работает автоопределение скорости. По моим тестам — не работает. 🙂
- Набираем AT и ввод. Документация по AT коммандам SIM800 здесь.
- Если модуль рабочий и корректно подключен, то появится хотя-бы ответ «OK». Если модуль определил SIM-ку и зарегистрировался в сети оператора, то будет развернутая информация.
AT OK +CPIN: READY Call Ready SMS Ready
- Отправляем команду: AT+COPS=?
После нескольких секунд ожидания появится ответ, вроде: +COPS: (2,»Bee Line GSM»,»BeeLine»,»25099″),(1,»MTS»,»MTS»,»25001″),(1,»MOTIV»,»MOTIV»,»25020″),(1,»MegaFon»,»MegaFon»,»25002″),,(0-4),(0-2). Модуль «видит» ближайшие соты. Уже хорошо. - Проверим статус PIN кода на SIM карте командой:
AT+CPIN? Если появился ERROR — что-то не так. - Запускаем команду: AT+CMEE=2. Эта команда при выводе сообщения об ошибке предоставляет максимально детальную информацию. Сохраняем командой: AT&W.
- Поворяем комунду AT+CPIN? Появляется детальный код ошибки. Например, в моем случае: +CME ERROR: SIM not inserted.
- Проверяем установку SIM карты. SIM слот распаянный на модуле «без защиты от дурака», т.е. позволяет вставить SIM-ку любым способом, без привычных ограничений как на сотовом телефоне или в других типах слотов. На SIM слоте мелко есть пиктограмма правильной установки карты.
- Повторяем команду AT+COPS=? Ответ изменился. Появились строчки «Call Ready» и «SMS Ready», значит карта определилась нормально и зарегистрировалась в сети оператора:
AT+COPS=? Call Ready SMS Ready +COPS: (1,"Bee Line GSM","BeeLine","25099"),(1,"MOTIV","MOTIV","25020"),(3,"MTS","MTS","25001"),(3,"MegaFon","MegaFon","25002"),,(0-4),(0-2) OK
- Отправляем команду AT+CSQ для получения уровня сигнала. Первая цифра в ответе должна быть отлична от нуля. Например, +CSQ: 23,0.
- Проверяем регистрацию в сети оператора командой AT+CREG? Правильный ответ: +CREG: 0,1
Ошибка +CSQ: 0,0
Если команда получения уровня сигнала AT+CSQ возвращает +CSQ: 0,0, то наверняка будут проблемы с регистрацией в сети. Команда AT+CREG? вернет +CREG: 0,2 вместо +CREG: 0,1. Какие действия для разрешения ошибки:
- Проверяем в другом устройстве, что SIM-ка корректно регистрируется в сети.
- Вставляем в SIM800 в соответствии с пиктограммой на слоте и проверяем командой AT+CPIN, что SIM карта определилась корректно.
- Командой AT+CBAND? проверяем, что SIM800 настроен на все диапазоны частот. На моем модуле, когда он нормально регистрируется в сети Билайна, результат: DCS_MODE,ALL_BANDS.
- Основной момент на который обратить внимание!!! Не зависимо от того, какой ток держит блок питания или DC-DC step-down модуль, хоть 3A и вы в этом лично убеждались, попробуйте запустить SIM800 от батареи. Возьмите аккумулятор от мобильного телефона на 3,7 В или Li-Ion элемент 18650 на 3,7 V и присоедините плюс батареи к пину V_BAT , а минус — на GND.
- Спустя некорое время проверяем уровень сигнала AT+CSQ. Скорее всего проблема с регистрацией разрешится.
Все GSM модули, не важно, дорогой SIM800 или дешевый M590 КРАЙНЕ чувствительны к качеству блока питания. И дело не только в токе, но и в пульсациях. Я запитывал SIM800C от разных БП с макисмальными токами до 2,1 A и он нормально включался, отвечал на AT команды, но не регистрировался в сети. После подключения на батарею TR 18650 сеть сразу нашлась.
Ниже приведены вырезки из design guide для модулей SIM800 и M590. Они почти сходятся в блоке фильтрации. Нужно ставить керамические конденсаторы на 10 pF и 33 pF (у M590 на 100 pF) для сглаживания высокочастотных пульсаций и электролитические хотя-бы на 100 uF, а лучше на 1000 uF.
Отправка SMS через SIM800
Для теста работы пытаемся отправить SMS. Для начала отправляем команду: AT+CMGF=1. Если возник ERROR — скорее всего не прошла регистрация SIM-ки в сети.
AT команда | Ответ | Примечания |
AT+CMGF=1 | OK | Переводим в текстовый режим отправки сообщений. |
AT+CSCS=»GSM» | OK | Устаналиваем charset: «GSM» GSM 7 bit default alphabet (3GPP TS 23.038); «UCS2» 16-bit universal multiple-octet coded character set (ISO/IEC10646); UCS2 character strings are converted to hexadecimal numbers from 0000 to FFFF; e.g. «004100620063» equals three 16-bit characters with decimal values 65, 98 and 99 «IRA» International reference alphabet (ITU-T T.50) «HEX» Character strings consist only of hexadecimal «PCCP» PC character set Code «PCDN» PC Danish/Norwegian character set «8859-1» ISO 8859 Latin 1 character set |
AT+CSCS? | +CSCS: «GSM» | Проверяем, что нужная кодовая таблица установилась корректно. |
AT+CMGS=»+796019xxxxx» | > | Номер телефона вводить обязательно с +, иначе будет сообщение об ошибке: +CMS ERROR: invalid input value. После запуска команды появится запрос на ввод текста сообщения, которое должно быть завершено отправкой CTRL-z (0x1A или (char)26). К сожалению, Arduino Serial Monitor не позволяет отправить этот код, так что только программно. |
Передача данных по TCP
Далее привожу AT команды для установки tcp соединения через GPRS.
AT команда | Ответ | Примечания |
AT+CPIN? | +CPIN: READY OK | Проверка SIM PIN |
AT+CSQ | +CSQ: 23,0 OK | Проверка уровня сигнала. Первая цифра — уровень сигнала <rssi>: 0 — 115 dBm or less 1 -111 dBm 2…30 -110… -54 dBm 31 -52 dBm or greater 99 — not known or not detectable Вторая цифра — количество ошибок в канале. 0 — хорошо. |
AT+CREG? | +CREG: 0,1 OK | Первая цифра <n>: 0 — Disable network registration unsolicited result code 1 — Enable network registration unsolicited result code +CREG: 2 — Enable network registration unsolicited result code with location information Вторая цифра <stat>: 0 — Not registered, MT is not currently searching a new operator to register to 1 — Registered, home network — правильный вариант 2 — Not registered, but MT is currently searching a new operator to register to 3 — Registration denied 4 — Unknown 5 — Registered, roaming |
AT+CGATT? | +CGATT: 1 OK | Статус GPRS Service-а <stat>: 0 — Detached 1 — Attached — правильный вариант |
AT+CIPSHUT | SHUT OK | Deactivate GPRS PDP Context. В доке разработчик эта команда не указана, но без неё у меня не проходила команда установки APN. |
AT+CSTT= «internet.beeline.ru»,»beeline»,»beeline» | OK | Устанавливаем APN. В примере — для оператора «Билайн». |
AT+CSTT? | +CSTT: «internet.beeline.ru»,»beeline»,»beeline» | Проверяем, что APN сохранился. |
AT+CIICR | OK | Переводим в режим беспроводного соединения (GPRS or CSD). |
AT+CIFSR | 100.89.139.161 | Получаем выделенный оператором динамический IP адрес. |
AT+CIPSTART= «TCP»,»116.228.221.51″,»8500″ | OK | Установка тестового TCP соединения с каким-то китайским тестовым сервером. |
Отправка данных по HTTP
AT+SAPBR=3,1,»CONTYPE»,»GPRS»
AT+SAPBR=3,1,»APN»,»internet.beeline.ru»
AT+SAPBR=3,1,»USER»,»beeline»
AT+SAPBR=3,1,»PWD»,»beeline»
AT+SAPBR=1,1 — Устанавливаем GPRS соединение
AT+HTTPINIT — Инициализация http сервиса
AT+HTTPPARA=»CID»,1 — Установка CID параметра для http сессии
AT+HTTPPARA=»URL»,»http://www.ya.ru» — адрес web сервера
AT+HTTPACTION=0 — GET запрос.
-> +HTTPACTION: 0,302,0 — 302 код ошибки — Found.
Fritzing part for SIM800C
Поскольку не нашел нужного fritzing part для SIM800C, пришлось нарисовать. Файл здесь.
Полезные ссылки
- Код для ESP32 для отправки AT комманд на SIM800.
- Hardware design manual SIM800 с сайта производителя (Eng).
- Схема модуля SIM800C (комментарии на китайском).
- Документация по AT коммандам SIM800 здесь.
- https://simcom.ee/documents/SIM800x/SIM800_Series_download_Tools_Customer_v1.19.rar — программатор SIM800 модулей на сайте производителя.
- Отправка через HTTP GET.
- Отправка данных на ThingSpeak через HTTP GET.
- Подробное описание SIM800L (Rus).
- Подключение модуля SIM800C (Eng).
- Подключение модуля SIM800C (Eng).
- Подключение модуля SIM800C (Rus).
- Подключение к Arduino SIM800 (Eng).
- AT commands Neoway M590 (Eng).
- Hardware design manual Neoway M590 (Eng).
- Распайка модуля Neoway M590
- Видео по пайке модуля Neoway M590.
- Видео по сборке, подключению и тестированию Neoway M590.
- Видео по подключению Neoway M590 к ПК.
- Обстоятельное описание Neoway M590 (Rus).
- Подключение Neoway M590 к Интернет
- https://www.instructables.com/id/GSMGPRS-Module-DIY-Kit/
- Распайка модуля Neoway M590 mini
- Видео по распайке модуля Neoway M590 mini
- Распайка и подключение Neoway M590 mini.
2 Responses to Подключение GSM модуля SIM800C к ESP8266/ESP32/Arduino