Подключение GSM модуля SIM800C к ESP8266/ESP32/Arduino

Для разработки 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

Схема платы SIM800C

В datasheet модуля указан максимальный уровень логической единицы на входе RX — 3,1 В (при минимальном 2,1 В). Для конвертации TTL уровней на плате SIM800C разведен конвертер. В принипе достаточно было конвертер поставить только на RX вход, поскольку микроконтроллеры Arduino/ESP8266/ESP32 чувствительны к низкому входному напряжению TTL с SIM800C.

TTL level converter and power converter of the SIM800C board
Конвертер TTL уровней и преобразователь напряжения 5V -> 3,7V модуля SIM800C

Схема двунаправленного конвертера уровней довольно стандартная и обеспечивает приведение напряжения логической 1 на SIM800 к уровню VDD_EXT. Это напряжение снимается с SIM800 и по datasheet соотвествует 2,8 V.

Output voltage SIM800 on the VDD_EXT output
Напряжение на выходе VDD_EXT чипа SIM800

Соотвественно, на входе модуля SIM800 преобразователь уровней обеспечивает напряжение логической 1 не выше 2,9 V при максимальном значении.

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




Резистивный делитель при подключении входов SIM800 напрямую к Arduino

Вероятно, в данном случае использовали более дорогую схему согласования уровней, чтобы гарантировать, что пользователь неосторожными действиями не сожжет 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 к ESP8266/ESP32
Резистивный делитель напряжения для подключения SIM800 без конвертера TTL уровней к ESP8266/ESP32

Напряжение питания модуля SIM800 (VBAT) 3,4 — 4,5 V, рекомендуемое 4 V при максимальном токе до 2А. Модуль достаточно прожорлив, поэтому его нельзя запитывать от платы Arduino и от маломощных USB зарядок, дажы не вывести их из строя.

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

SIM800Cpower converter filters
Схема фильтрации питания платы SIM800C

Слот 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 pinUSB-to-TTL converterБП +5 VПримечания
TXDRXD
RXDTXD
GNDGNDGND
+5V+5VБлок питания на пиковы ток не менее 1 А!!!
V_TTL+5V
PWXGNDЗакоротить пин PWX на GND, чтобы модуль стартовал сразу при включении питания.
Схема подключения модуля SIM800C к ESP32
Схема подключения модуля SIM800C

Лучше подавать сначала питание на модуль GSM, а затем уже подключать USB к PC, но это не критично.

Схема соединения SIM800С с ESP32

На картинке нужно добавить соединение между PWX и GND! Детальная схема подключения SIM800L к ESP32 с примером кода в статье.

Схема подключения модуля SIM800C к 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.

Фильтры на блок питания для SIM800
Фильтры на блок питания для Neoway M590

Отправка SMS через SIM800

Для теста работы пытаемся отправить SMS. Для начала отправляем команду: AT+CMGF=1. Если возник ERROR — скорее всего не прошла регистрация SIM-ки в сети.

AT командаОтветПримечания
AT+CMGF=1OKПереводим в текстовый режим отправки сообщений.

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 bers from 00 to FF;
«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+CIICROKПереводим в режим беспроводного соединения (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

SIM800C fritzing part *.fzpz
SIM800C fritzing part *.fzpz
SIM800L fritzing part *fzpz
SIM800L fritzing part *fzpz

Поскольку не нашел нужного fritzing part для SIM800C, пришлось нарисовать. Файл здесь.

Полезные ссылки

Spread the love
Запись опубликована в рубрике IT рецепты с метками , . Добавьте в закладки постоянную ссылку.

2 Responses to Подключение GSM модуля SIM800C к ESP8266/ESP32/Arduino

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *