На заметку: |
|
|
В этом цикле статей полностью раскрывается тема использования GSM-модуля SIM800L на примерах с платой Arduino Uno, а именно — отличия модулей друг от друга, подключение модуля, взаимодействие с ним при помощи AT-команд, подключение микрофона и колонок, совершение звонков, прием и отправка SMS и USSD-запросов, спящий режим модуля — погружение и пробуждение, распознавание DTMF, определение GPS-координат, FM-радио, прием и отправка данных по GPRS и т. д. |
|
Данная первая часть будет вводной и в ней будет рассказано об отличиях модулей друг от друга, о том, как выбирать плату, на которой распаян модуль, как правильно осуществлять питание модуля и как правильно подключать его к Arduino, а также здесь будут приведены основы работы с AT-командами и сравнение уровня сигнала сети со штатной спиральной и внешней антеннами. |
|
На заметку: |
В данной статье не рассматриваются модули SIMCom 900 серии(SIM900, SIM900H и пр.), так как они устарели и сняты с производства. В любом случае информация представленная в статье в большинстве своем справедлива и для модулей 900 серии.
|
|
Первоначальный ликбез Перед тем как углубляться в подробности, необходимо определиться с терминами и понятиями. Здесь и далее в статье, GSM-модулем SIM800L или модемом(GSM-модемом) будет называться модуль SIMCom SIM800L распаянный на плате: |
Проверено — автор рекомендует:
Купить GSM/GPRS-модуль SIM800LВидео-инструкция о покупке со скидками на Aliexpress |
|
|
Но на самом деле это некорректно — модуль SIM800L скрывается под металлической крышкой с бело-красной наклейкой: |
|
Модуль SIM800L справа на зеленой печатной плате
|
Модуль SIM800L слева, на зеленой печатной плате, отделен от красной платы общего модуля
|
10 |
Сердцем модуля SIM800L является чип Mediatek ARM MT6261. За GSM/GPRS-связь отвечает 4-диапазонный(GSM850/GSM900/DCS1800/PCS1900) приемопередатчик RF7198. |
Mediatek ARM MT6261 — это однокристальная система, предназначенная, в первую очередь, для носимой электроники. Чипсет включает в себя ARM-ядро, Bluetooth, LCD, GSM+GPRS, Camera и FM-Radio.
Даташит на Mediatek ARM MT6261 — MT6261A GSM GPRS EDGE-RX SOC Processor Data Sheet v0.2.rar |
12 |
Исходя из этого, важно понимать что различные модули 800 серии обладают разными характеристиками и функционалом. Поэтому, следующий вопрос... |
|
13 |
Как выбрать GSM/GPRS модуль 800 серии? Если отбросить несущественные для начинающих радиолюбителей и одинаковые для всех модулей характеристики, то принципиальные отличия можно кратко представить в таблице: |
|
|
15 |
Но поскольку даташит на Mediatek ARM MT6261 говорит о поддержке чипом Bluetooth, то очень высока вероятность того, что в модуле SIM800L, Bluetooth есть, но задушен прошивкой, что, в принципе, поправимо. |
С полным сравнением характеристик модулей 800 серии можно ознакомиться в таблице:
|
16 |
Если отбросить модули, предназначенные, в первую очередь, для GPS-трекинга(SIM808 и SIM868), из сравнения видно, что, игнорируя отмирающую технологию CSD, все модули имеют совершенно незначительные отличия. Так что, если наличие FM-приемника и Bluetooth не принципиально, то можно выбирать любой. |
|
17 |
Модуль выбрали, что дальше? Подавляющее большинство начинающих радиолюбителей не готовы работать с GSM/GPRS/GNSS-модулями напрямую. Именно поэтому производители радиоэлектронных компонентов предлагают большое количество плат с уже размещенными на них GSM-модулями. |
|
18 |
Каждая печатная плата — это переходник между GSM-модулем и пользователем. Самые простые из них предоставляют пользователю минимальный функционал — обмен данными с GSM-модулем по UART. В том числе, каждая из плат, в обязательном порядке имеет слот для внешней SIM-карты, таким образом, реализуя для пользователя этот интерфейс. Более сложные варианты, включая Arduino-шилды, наоборот, делают доступ к расширенному функционалу модуля более удобным. |
|
19 |
Отсюда, второй по важности задачей, после того как выбран необходимый GSM-модуль, является выбор платы на которой он распаян. Почему это важно? |
|
20 |
Возьмем для примера ситуацию, когда конечному пользователю необходимы звуковые функции(радио, звонки, аудио) и он определяется с модулем — SIM800L. Но при этом, купившись на питание от 5 В, выбирает такую плату: |
|
22 |
Но эта плата не имеет выводов для подключения колонок и микрофона, она не имеет выходов для сигнализации входящего звонка и т. д. — только UART для AT-команд. И получается, что функциональность выбранного модуля загублена платой. |
|
23 |
У нашего модуля выведен необходимый минимум, для доступа к подавляющему большинству функций, включая голосовые(выходы для подключения микрофона и динамика): |
|
25 |
Самый простой способ узнать о том, что из функционала«крадет» плата — сравнить распиновку модуля и выводы платы. Распиновку модуля можно подсмотреть в даташите — SIM800HL_Hardware_Design_V2.01.pdf (2,94 MB). |
|
26 |
Выбор плат и шилдов достаточно обширен(перейти в раздел GSM/GPRS/GNSS-модули на платах): |
Распиновка модуля SIM800H/L
|
28 |
Теперь перейдем к герою статьи. |
|
29 |
Питание Для начала работы понадобится рабочая SIM-карта формата microSIM. |
|
30 |
Для питания модуля требуется напряжение из диапазона 3.4-4.5 В, рекомендованное 4 В. Как видно, это нестандартные для Arduino/Raspberry Pi 3, напряжения(5 В / 3.3 В), рассчитанные на питание от литиевых аккумуляторов. |
|
31 | На заметку: |
При подключении питания, не соответствующего требуемому, модем выдает два типа сообщений. В случае, если питание находится на пороговом уровне(≤3.5 В, ≥4.4 В), модуль выдает предупреждение UNDER-VOLTAGE WARNING, OVER-VOLTAGE WARNING. В случаях, когда пороговый уровень превышен(≤3.4 В, ≥4.5 В), модуль сообщает об этом — UNDER-VOLTAGE POWER DOWN, OVER-VOLTAGE POWER DOWN и выключается.
|
|
32 |
С температурой дела обстоят также — при превышении пороговых значений(-30...80°С), сначала предупреждение, потом выключение
|
|
33 |
Для питания, модулю понадобится внешний источник питания и, если он не обеспечивает требуемого напряжения, то и DC-DC понижающий преобразователь напряжения. |
|
34 |
Нельзя запитывать модуль SIM800L от Arduino. Дело в том, что датчик бывает очень прожорлив(по даташиту максимальное потребление тока достигает http://www.w3.org/1998/Math/MathML">2А" role="presentation" style="display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; font-style: normal; font-weight: normal; font-size: 18.08px; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; margin: 0px; padding: 1px 0px; position: relative;">2А). А, как известно, Arduino не в состоянии обеспечить его таким током, поэтому очень вероятен сбой в работе — будет работать некорректно или модем, или Arduino, или оба вместе взятые(вполне вероятен выход Arduino из строя). Здесь может быть 2 выхода — либо SIM800L обеспечивается своим отдельным питанием(при этом земля GND обоих источников должна быть общая), либо и Arduino, и GSM-модуль запитываются одним мощным источником питания(http://www.w3.org/1998/Math/MathML">7−12В" role="presentation" style="display: inline-block; line-height: 0; text-indent: 0px; text-align: left; text-transform: none; font-style: normal; font-weight: normal; font-size: 18.08px; letter-spacing: normal; overflow-wrap: normal; word-spacing: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; margin: 0px; padding: 1px 0px; position: relative;">7−12В). |
|
36 |
Перед подключением модуля к преобразователю напряжения, необходимо, при подключенном к преобразователю источнике питания, при помощи мультиметра установить заданное выходное напряжение: |
|
38 |
Подключение к Arduino После того как питание GSM-модуля организовано, необходимо подключить его к управляющему устройству, например микроконтроллеру Arduino. |
|
39 | Важно: |
Распространенная ошибка: Нельзя напрямую подключать пин Arduino TX ко входу RX модуля SIM800L
|
|
40 |
Так подключать нельзя
|
|
41 |
Даташит (2,94 MB) модуля, в характеристиках Serial-порта, недвусмысленно говорит о максимальном уровне логической единицы на входе RX — 3,1 В(при минимальном 2,1 В): |
|
43 |
А поскольку на плате не было обнаружено никаких элементов, которые бы могли конвертировать входное напряжение, автором предлагается использовать банальный равноплечий делитель напряжения. Для организации логической единицы номиналом 2,5 В(это напряжение корректно вписывается в допустимый диапазон, и его легко получить из 5 В стандартной логики Arduino) нужно взять два резистора одинакового номинала в диапазоне 1-10 КОм: |
|
44 |
Вход RX Arduino находится в режиме INPUT, и он нормально реагирует на логическую единицу GSM-модуля 2,8 В — с ним ничего делать не надо
|
|
45 |
Первое включение При первом включении, индикатор модуля начинает часто мигать — это свидетельствует о поиске сети. Редкое мигание свидетельствует о том, что сеть найдена и модуль успешно к ней подключился. |
|
46 | На заметку: |
Если модуль мигает очень редко быстрыми сериями по 3 раза, значит, либо установлено некорректное напряжения питания, либо перепутаны провода RX/TX.
|
|
47 |
В случае, если штатная антенна не будет обеспечивать уверенного приема, можно подключить внешнюю антенну. |
|
48 |
О диагностике качества сигнала с внешней антенной, ниже в статье. |
|
49 |
Обмен данными Взаимодействие с модулем осуществляется по интерфейсу UART(Serial) при помощи специальных AT-команд. Для реализации обмена по UART-интерфейсу на пинах, отличных от стандартных RX(0)/TX(1)(они как правило заняты подключением к компьютеру), понадобится стандартная Arduino-библиотека SoftwareSerial.h: |
|
51 |
После сборки схемы в Arduino необходимо залить первый скетч: |
|
52 | Arduino (C++) |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <SoftwareSerial.h> SoftwareSerial SIM800(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); SIM800.begin(9600); // Скорость обмена данными с модемом SIM800.println("AT"); } void loop() { if (SIM800.available()) // Ожидаем прихода данных (ответа) от модема... Serial.write(SIM800.read()); // ...и выводим их в Serial if (Serial.available()) // Ожидаем команды по Serial... SIM800.write(Serial.read()); // ...и отправляем полученную команду модему }
|
|
53 | На заметку: |
По умолчанию, модем автоматически определяет скорость обмена данными, но этот параметр можно задать вручную на стороне модема при помощи команды AT+IPR=<rate>, где <rate> — скорость в бодах(по умолчанию — 0).
|
|
54 |
Скетч настраивает скорости обмена данными Arduino и SIM800L, и далее транслирует получаемые/отправляемые данные и отображает их в мониторе порта. При запуске Arduino, в Serial, помимо приветствия Start!, будет отправлена команда AT и модем ответит ОК: |
|
55 |
Для передачи команд GSM-модулю, необходимо установить параметр Newline
|
|
56 |
Теперь, когда параметр Newline установлен(каждая команда с новой строки), можно отправлять команды через поле Serial-порта. Если отправить команду ATI, можно получить информацию о версии модуля: |
AT-команды(от англ. ATtention —«внимание») — набор команд, состоящий из серий коротких текстовых строк, которые объединяются вместе, чтобы сформировать полные команды операций, таких как набор номера, начала соединения или изменения параметров подключения.
Подробно с полным набором AT-команд можно ознакомиться в официальном руководстве — SIM800 Series_AT Command Manual_V1.09.pdf (3,07 MB) |
58 |
Диагностические команды Существует набор команд при помощи которых можно определить состояние/готовность GSM-модуля совершать конкретные действия, а также получить другую полезную информацию диагностического характера. Некоторые из них представлены в таблице: |
|
|
60 |
Текущую конфигурацию модуля по профилям можно получить при помощи команды AT&V. |
|
61 |
Бонус: сравнение качества сигнала с разными антеннами Для диагностики качества сигнала и его сравнения со штатной спиральной медной антенной и с внешней антенной, будет использоваться скетч: |
|
62 | Arduino (C++) |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include <SoftwareSerial.h> SoftwareSerial SIM800(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L) void setup() { Serial.begin(9600); // Скорость обмена данными с компьютером Serial.println("Start!"); SIM800.begin(9600); // Скорость обмена данными с модемом SIM800.println("AT"); } long lastcmd = millis(); void loop() { if (SIM800.available()) // Ожидаем прихода данных (ответа) от модема... Serial.write(SIM800.read()); // ...и выводим их в Serial if (Serial.available()) // Ожидаем команды по Serial... SIM800.write(Serial.read()); // ...и отправляем полученную команду модему if (millis() - lastcmd > 5000) { // Прошло ли 5 секунд lastcmd = millis(); // Фиксируем время SIM800.println("AT+CSQ"); // Запрашиваем информацию о качестве сигнала } }
|
|
64 |
С его помощью, каждые 5 секунд времени запрашиваются данные о качестве сигнала. Тестирование проводилось по полчаса с антенной и без неё, ночью и днем. Результаты сравнения представлены на графике: |
|
66 |
Из графика видно, что внешняя антенна действительно улучшает сигнал. К сожалению, не удалось протестировать антенну в зоне неуверенного приема. Исходя из описания команды уровень нормального сигнала находится в диапазоне от 10 единиц, до 31. Качество сигнала в 20 единиц, является отличным результатом. Но в любом случае результат очевиден. |
|