Заставляем работать Keyestudio GSM/GPRS Shield через библиотеку Амперки

Хочу представить библиотеку к GSM/GPRS Shield’у для Arduino от Keyestudio. Купил сие устройство из-за цены. В Китае он оказался почти в 2 раза дешевле, чем его аналог от Амперки, и в три раза чем у iAruino. Причина написания этого текста — отсутствие на сайте Keyestudio приемлемой библиотеки для работы с ним. Работа через набор AT-команд не считается. Библиотеки для других аналогичных устройств в прямую не подошли. Во всяком случае мне не удалось заставить их работать.

Пришлось адаптировать на мой взгляд самую проработаную «Амперковскую» библиотеку под данную плату, и тем самым попытаться сохранить совместимость кода написанного под амперковский shield.
Собственно ссылка на библиотеку: github.com/andrewinc/keyestudio-gsm-gprs-shield
Внешний вид Keyestudio GSM/GPRS Shield
Амперка использует в своём shield’е чип Sim900R, а здесь Sim900. Самое же главное отличие в сигнале ST: в исходной библиотеке и shield’е он есть, а в Keyestudio его нет. Между тем по нему было бы ясно включен или выключен чип. Зато есть кнопка SIM900_Power, что натолкнуло меня на нехорошие мысли об отсутствии программной возможности включить чип. К счастью, они оказались ошибочны.

Пин 9 — управляет включением чипа, тот самый заменитель кнопки Power, на амперковской плате обозначен PK.

Небольшая разница в версии чипа не повлияла на его возможности, во всяком случае — мне удалось инициировать звонок, отправить и получить SMS с помощь приведённых в библиотеке примеров. Полагаю — это основное направление использование этого shield’а.

Физические настройки


Плата общается с Arduino через UART-интерфейс. Для тех кто не в курсе UART — это пины TX и RX. По TX — данные следуют из Arduino, а по RX — обратно.

Есть ещё переключатель «UART_Port — DBG_Port», но я этим портом не пользовался. Переключатель остался в «UART_Port».

Особенность платы в том, что из коробки она не работает. Если обратить внимание на состояние перемычек после раскрытия упаковки (см. фото выше), то видны соединения TXD c 0, а RXD с 1. На Arduino для TX и RX используются те же пины. Проблема как раз в этом, т.к. они заняты для загрузки скетча, они же используются для обмена информацией через объект Serial, в т.ч. и для отладки. При соединении Arduino с shield’ом возникает конфликт и прошивка заканчивается неудачей.

Программный Serial


Известно, что у Arduino UNO только один Serial интерфейс, зато целое их семейство есть например, у Arduino Mega. Serial1 связан с парой TX1 и RX1, аналогично для Serial2 и Serial3.
Для использования именно Arduino UNO разумно применить программный Serial. Достаточно подключить соответствующую библиотеку, и создать сам объект, указав пины Arduino на которые приходят TXD и RXD сигналы с shield’а:

#include 
SoftwareSerial mySerial(6, 7);


В указанном примере TXD соединён с пином 6, а RXD — с 7.

Программное включение чипа


Пин включения/выключения чипа — 9, в отличии от TX и RX, нельзя скоммутировать на другие выводы Arduino, во всяком случае переключателей на shield’е для этого не нашлось.

Чтобы включить чип нужно подать высокий сигнал на 9 пин, подождать 1–3 секунды и подать на него же низкий сигнал. Далее обычно в коде можно видеть ожидание в секунд 5–15. Всё это напоминает манипуляции с кнопкой включения сотового телефона, и впоследствии его загрузкой и установлении связи с сетью.

В исходной библиотеке от Амперки существовала обратная связь через сигнал ST. Через него в процессе включения проверялось состояние: включен ли чип. Увы, в отсутствии этого сигнала методы включения и выключения чипа похожи как братья близнецы, ввиду того, что для выключения так-же подаётся продолжительный строб на 9 пин. Эти методы не были объединены в один из-за совместимости кода и из-за банальной лени.

Как это работает


Сама библиотека подключается строкой:

#include 


После чего можно создать объект на основе класса GPRSk и передать в конструктор тот самый mySerial или указать аппаратный Serial1, Serial2 и т.д. Пример:

GPRSk gprs(mySerial);


В функции setup обычно инициализируют Serial и mySerial, впрочем, если не планируется отправлять в монитор Arduino IDE отладочную информацию можно обойтись инициализацией только mySerial.

После этого в ключают питание чипа с помощью метода gprs.powerOn () и далее вызывается gprs.init () который вернёт true если чип готов к приёму/передаче информации.

Когда все эти задачи выполнены можно отправлять SMS:

gprs.sendSMS("+79007654321", "Hello SMS from Keyestudio!");


Читать новые сообщения:

char message[160];
char phone[16];
char datetime[24];
if (gprs.ifSMSNow()) {
    gprs.readSMS(message, phone, datetime);
}


совершать звонки:

gprs.callUp("+79007654321");


и т.п.

В рамках библиотеки прилагются «амперковские» примеры, где изменён только Serial1 на программный. Они были проверены на Keyestudio GSM/GPRS Shield и показали свою работоспособность.

Питание


Наблюдения показали, что этому «бутерброду» из Arduino UNO и GPRS shield’а недостаточно питания от USB. Это выражается в систематической выдаче false методом gprs.init ()
Недостаточно оказалось и питания в 200 мА (9В) в стандартный разъём питания Arduino в добавок к USB питанию. Вернее иногда gprs.init () проходил, а иногда нет. Полагаю, питания 5В 1–1.5А будет вполне достаточным.

Недостатки:


  1. Библиотека используют паузы delay (), что прерывает выполнение всего кода контроллера.
  2. Предполагается что на SIM-карте не установлен пин-код
  3. В тексте SMS-сообщений нет поддержки кириллицы.


Надеюсь данная библиотека может оказаться полезной, как и некоторые замечания по работе с данным shield’ом.

© Geektimes