Хочу представить библиотеку к GSM/GPRS Shield'у для Arduino от Keyestudio. Купил сие устройство из-за цены. В Китае он оказался почти в 2 раза дешевле, чем его аналог от Амперки, и в три раза чем у iAruino. Причина написания этого текста — отсутствие на сайте Keyestudio приемлемой библиотеки для работы с ним. Работа через набор AT-команд не считается. Библиотеки для других аналогичных устройств в прямую не подошли. Во всяком случае мне не удалось заставить их работать.
Пришлось адаптировать на мой взгляд самую проработаную «Амперковскую» библиотеку под данную плату, и тем самым попытаться сохранить совместимость кода написанного под амперковский shield.
Собственно ссылка на библиотеку: github.com/andrewinc/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'ом возникает конфликт и прошивка заканчивается неудачей.
Известно, что у Arduino UNO только один Serial интерфейс, зато целое их семейство есть например, у Arduino Mega. Serial1 связан с парой TX1 и RX1, аналогично для Serial2 и Serial3.
Для использования именно Arduino UNO разумно применить программный Serial. Достаточно подключить соответствующую библиотеку, и создать сам объект, указав пины Arduino на которые приходят TXD и RXD сигналы с shield'а:
В указанном примере TXD соединён с пином 6, а RXD — с 7.
Пин включения/выключения чипа — 9, в отличии от TX и RX, нельзя скоммутировать на другие выводы Arduino, во всяком случае переключателей на shield'е для этого не нашлось.
Чтобы включить чип нужно подать высокий сигнал на 9 пин, подождать 1-3 секунды и подать на него же низкий сигнал. Далее обычно в коде можно видеть ожидание в секунд 5-15. Всё это напоминает манипуляции с кнопкой включения сотового телефона, и впоследствии его загрузкой и установлении связи с сетью.
В исходной библиотеке от Амперки существовала обратная связь через сигнал ST. Через него в процессе включения проверялось состояние: включен ли чип. Увы, в отсутствии этого сигнала методы включения и выключения чипа похожи как братья близнецы, ввиду того, что для выключения так-же подаётся продолжительный строб на 9 пин. Эти методы не были объединены в один из-за совместимости кодаи из-за банальной лени.
Сама библиотека подключается строкой:
После чего можно создать объект на основе класса GPRSk и передать в конструктор тот самый mySerial или указать аппаратный Serial1, Serial2 и т.д. Пример:
В функции setup обычно инициализируют Serial и mySerial, впрочем, если не планируется отправлять в монитор Arduino IDE отладочную информацию можно обойтись инициализацией только mySerial.
После этого в ключают питание чипа с помощью метода gprs.powerOn() и далее вызывается gprs.init() который вернёт true если чип готов к приёму/передаче информации.
Когда все эти задачи выполнены можно отправлять SMS:
Читать новые сообщения:
совершать звонки:
и т.п.
В рамках библиотеки прилагются «амперковские» примеры, где изменён только Serial1 на программный. Они были проверены на Keyestudio GSM/GPRS Shield и показали свою работоспособность.
Наблюдения показали, что этому «бутерброду» из Arduino UNO и GPRS shield'а недостаточно питания от USB. Это выражается в систематической выдаче false методом gprs.init()
Недостаточно оказалось и питания в 200мА (9В) в стандартный разъём питания Arduino в добавок к USB питанию. Вернее иногда gprs.init() проходил, а иногда нет. Полагаю, питания 5В 1-1.5А будет вполне достаточным.
Надеюсь данная библиотека может оказаться полезной, как и некоторые замечания по работе с данным shield'ом.
Пришлось адаптировать на мой взгляд самую проработаную «Амперковскую» библиотеку под данную плату, и тем самым попытаться сохранить совместимость кода написанного под амперковский shield.
Собственно ссылка на библиотеку: github.com/andrewinc/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.h>
SoftwareSerial mySerial(6, 7);
В указанном примере TXD соединён с пином 6, а RXD — с 7.
Программное включение чипа
Пин включения/выключения чипа — 9, в отличии от TX и RX, нельзя скоммутировать на другие выводы Arduino, во всяком случае переключателей на shield'е для этого не нашлось.
Чтобы включить чип нужно подать высокий сигнал на 9 пин, подождать 1-3 секунды и подать на него же низкий сигнал. Далее обычно в коде можно видеть ожидание в секунд 5-15. Всё это напоминает манипуляции с кнопкой включения сотового телефона, и впоследствии его загрузкой и установлении связи с сетью.
В исходной библиотеке от Амперки существовала обратная связь через сигнал ST. Через него в процессе включения проверялось состояние: включен ли чип. Увы, в отсутствии этого сигнала методы включения и выключения чипа похожи как братья близнецы, ввиду того, что для выключения так-же подаётся продолжительный строб на 9 пин. Эти методы не были объединены в один из-за совместимости кода
Как это работает
Сама библиотека подключается строкой:
#include <GPRSk_Shield_Arduino.h>
После чего можно создать объект на основе класса 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А будет вполне достаточным.
Недостатки:
- Библиотека используют паузы delay(), что прерывает выполнение всего кода контроллера.
- Предполагается что на SIM-карте не установлен пин-код
- В тексте SMS-сообщений нет поддержки кириллицы.
Надеюсь данная библиотека может оказаться полезной, как и некоторые замечания по работе с данным shield'ом.
Поделиться с друзьями
x893
Полагать не надо — открыть книжечку по sim900 и там посмотреть циферку.
andrewinc
Даташид sim900 сообщает:
The power supply range of SIM900 is from 3.2V to 4.8V. The transmitting burst will cause voltage drop and the power supply must be able to provide sufficient current up to 2A.
x893
Конечно может быть и меньше.
Если сесть около антенны БС, то пока мозги не закипят, модулю и 100 mA может хватить.
shadovv76
при условии, что устройства данного типа должны работать удаленно, не стоит пренебрегать требованиями даташита
madf
"Бедные" ардуинщики, либы нет — всё, конец света, нет производительности и ограничен функционал, а по существу этих проблем нет.
PKav
А если нет шилда с микросхемой — значит, микросхемы не существует в природе.
А если есть шилд — значит в природе существует только одна микросхема подобного типа.