Проекти на gsm модулі та мікроконтролері. Досвід роботи із GSM-модемом SIM900. Загальні поради для новачків

Нарешті мені вдалося зайнятися вивченням, мабуть найпопулярнішого в DIY середовищі GSM модуля GSM900. Що таке модуль GSM? Це пристрій, який реалізує функції стільникового телефону. Іншими словами, GSM900 дозволяє дзвонити іншим абонентам стільникової мережі, приймати дзвінки, надсилати та приймати SMS-повідомлення. А ще, зрозуміло, передавати дані протоколу GPRS.

Мені цей модуль знадобився цілком конкретної мети: з'явився проект системи освітлення, керованої дистанційно. Найпростіше це завдання вирішується SMS-повідомленнями: відправив одну sms — світло ввімкнулося, відправило інше — вимкнулося. Жодних пультів не треба, а телефон є у всіх (навіть у бомжів). Власне, я розгляну саме цей варіант використання модуля GSM900.

1. Прошивка

Волею доль, у мене в руках опинився модуль GSM 900A. Прочитавши перший форум про пожвавлення цієї штуки, з'ясувалося, що літера A в назві означає приналежність модуля до азіатського регіону. Отже, працювати з нашими операторами він не стане. Зневіра 🙁

Благо, в наступних постах на тому ж форумі містилася заспокійлива інформація:) Виявилося, що не все так погано, і щоб модуль заробив у нашому регіоні, його просто перепрошувати. Цей процес добре описаний у блозі нашого соратника Alex-EXE: прошивка "all in one" sim900
Спробую зробити те саме, але ще докладніше, і з урахуванням особливостей мого модуля.

Якщо у вас правильний модульі прошивка не потрібна, можна відразу стрибати на розділ №2.

Інструменти

Отже, для початку підготуємо все необхідні інструменти. По-перше, безпосередньо для прошивки знадобиться програма SIM900 Series download Tools Develop, яку можна легко знайти в інтернеті ().

По-друге, стане в нагоді і сам файл прошивки 1137B02SIM900M64_ST_ENHANCE, який теж легко видобувається ().

Нарешті, по-третє, нам потрібний буде гарний терміналдля експериментів із модулем. Зазвичай я використовую TeraTerm, але на цей раз його можливостей не вистачило (або я не розібрався). Довелося встановити монстра з геніальною назвою.

Підключення до USB-UART мосту

Тепер підключаємо лінії RX та TX до мосту. Як останній я використовував CP2102. У моєму випадку, всупереч логіці, RX і TX моста з'єднувалися з RX і TX GSM-модуля симетрично (а не хрест-навхрест, як заведено).

Також слід запитати модуль від стабільного та потужного джерела, оскільки піковий струм на модулі може досягати 2А (нібито). Підійдуть 4 акумулятори типорозміру AA. Повна схема включення виглядає так:

SIM900
CP2102 Gnd Gnd
CP2102 +5V VCC_MCU
CP2102 RX SIMR
CP2102 TX SIMT
Зовнішнє джерело+5В VCC5
Зовнішнє джерело Gnd Gnd
RST

Ця модель не має кнопки скидання, так що для прошивки нам потрібно на пару секунд кинути контакт RST на землю. Для цього ми поки що залишимо його висіти у повітрі.

Попереднє налаштування модуля

Перед тим, як приступити до прошивки, ми з'єднаємося з модулем і змінимо швидкість UART. Для цього запустимо термінал Terminal, виберемо правильний порт, і встановимо швидкість обміну - 9600. Після цього тиснемо "Connect".

Все спілкування з модулем відбувається у вигляді AT-команд.

Перше, що ми скажемо модулю, буде найпримітивніша AT-команда: «AT». Це такий своєрідний ping, який модуль повинен відповісти словом «OK».

Якщо все пройшло успішно, і модуль дійсно відповів нам "OK", відправляємо команду налаштування швидкості:

AT+IPR=115200

Наприкінці команди має стояти службовий символ повернення каретки – CR. В ASCII таблиці він має код 13 (або 0x0D шістнадцятковій системі). Символ підставиться автоматично, якщо ви поставите галку +CR напроти рядка введення в нашому терміналі. В інших терміналах також є подібні налаштування.

У відповідь на введену команду знову отримаємо - "OK".

Це налаштування знадобиться нам для прискорення процедури прошивки. В іншому випадку, як зазначив у своєму блозі Alex-EXE, прошивка займе близько години.

Налаштування програми

Після того, як всі дроти встромлені в потрібні місця, та модуль підготовлений до прошивки, запускаємо додаток SIM900 Series download Tools Develop. Налаштування програми складається з декількох пунктів:

  • у полі Target вказуємо цільовий чіп. Чомусь у мене не вийшло залити прошивку на SIM900A, тому я вибрав «SIM900»;
  • вибираємо правильний порт у полі Port;
  • Baud Rate ставимо до 115200;
  • нарешті, вказуємо файл прошивки у полі Core File (файл із розширенням cla).

З налаштуванням все.

Прошивка

Тепер виконуємо строго та послідовно шість важливих кроків.

  • Підключаємо до модуля живлення (наші 4 акумулятори). Повинна спалахнути червона лампа живлення, а лампа статусу повинна почати блимати.
  • Підключаємо USB-UART до комп'ютера.
  • Замикаємо провід RST на землю (пам'ятаємо, що весь цей час він бовтався у повітрі).
  • Натискаємо у програмі кнопку Start Download.
  • Вважаємо в умі до трьох, і відриваємо RST від землі.

Чекаємо на 6 хвилин до завершення прошивки.

Що ми маємо після прошивки

По-перше, модуль тепер уміє працювати з нашими операторами. По-друге, ми поставили розширену прошивку, серед особливостей якої, наприклад, отримання координат модуля по стільниковим вежам, робота з електронною поштоюта доступ до додаткових 2.5 Мб пам'яті.

2. Експерименти із GSM модулем

Спробуємо виконати різні корисні операції з модулем. Для початку введемо ПІН-код (якщо він є):

AT+CPIN=8899

Відповідь модуля буде такою:

CPIN: READY.

Після цього отримаємо від модуля трохи інформації.

AT+GMR – ідентифікатор прошивки. AT+GSN – IMEI. AT+CPAS - стан (0 – готовий до роботи, 2 – невідомо, 3 – вхідний дзвінок, 4 – голосове з'єднання). AT+COPS? - інформація про оператора.

Телефонні дзвінки

Тепер наберемо якийсь номер. Робиться це за допомогою команди:

ATD+790XXXXXXXX;

Крапка з комою в кінці команди дуже важлива, не забудьте про неї!

Якщо під час UART сеансу на пристрій хтось зателефонує, повернеться повідомлення:

Відповісти на дзвінок (взяти слухавку) можна командою:

Якщо до модуля підключено навушники та мікрофон, можна поспілкуватися з віддаленим абонентом як за звичайним стільниковим телефоном.

Завершує виклик команда:

Надсилання SMS

Спочатку увімкнемо текстовий режим повідомлень:

AT+CMGF=1

і встановимо кодування:

AT+CSCS= "GSM"

Модуль підтримує й інші кодування, зручніші для автоматичних систем. Але нам для експериментів найзручніше використовувати саме GSM режим, в якому телефон задається цифрами, а текст повідомлень пишеться в ASCII кодування. Тепер відправимо комусь повідомлення:

AT+CMGS="+79123456789"

А наприкінці команди необхідно додати відразу два службові символи: CR та LF. У Terminal це можна зробити галочкою CR=CR+LF, або вручну додавши наприкінці рядка: AT+CMGS=»+79123456789″&0D&0A

Після введення цієї команди у відповідь буде отримано символ «>», що означає початок введення повідомлення. Пишемо якийсь текст:

Hello World!

Наприкінці повідомлення нам потрібно буде передати один із двох спеціальних символів. Щоб надіслати повідомлення введемо символ з ASCII таблиціз номером 26. Щоб скасувати надсилання — символ із номером 27.

У терміналі, що використовується, для відправки символу за кодом можна використовувати один з двох виразів: у шістнадцятковому форматі: $1A, і в десятирічному: #026

Прийом SMS

Якщо під час сеансу на пристрій прийде SMS, повернеться повідомлення формату:

CMTI: "SM",4

тут 4 - це номер вхідного непрочитаного повідомлення.

AT+CMGR=4

У відповідь отримаємо:

CMGR: "REC READ","+790XXXXXXXX","","13/09/21,11:57:46+24" Hello World! OK

Загалом усе просто. Цього нам цілком достатньо для реалізації задуманого. Для більш глибокого вивчення можливостей GFM900 рекомендую почитати ще одну статтю Alex-EXE: at-команди gsmмодема sim900

3. Взаємодія з мікроконтролерами

Взагалі, щоб керувати зовнішніми пристроямизовсім не обов'язково спарювати модуль GSM900 з іншим мікроконтролером. У цей модуль можна зашити свою програму, яка робитиме все, що завгодно з вільними GPIO висновками. Однак, у більшості готових плат GPIO не розлучені, тому для створення прототипу задуманого пристрою скористаємося найпростішим Arduino Uno/ Nano.

Спілкуватись Arduino і GSM900 будуть по тому ж UART інтерфейсу. Для цього з'єднаємо ці два пристрої за наступною схемою:

GSM900 GND VCC_MCU SIMT SIMR
Ардуїно Уно GND +5V RX TX

Тепер складемо програму, яка ловитиме СМС-ки, і запалюватиме світлодіод на нозі №13 на пару секунд. Цим ми імітуємо управління якимось зовнішнім пристроєм.

Const String spin = "1234"; const int rel_pin = 13; String ss = ""; // Відправка пін-коду void sendPin()( String cmd = "AT+CPIN="+spin+char(0x0D); Serial.print(cmd); ) // Увімкнення світлодіода на 2 секунди void receiveSMS(String s)( digitalWrite(rel_pin, HIGH);delay(2000);digitalWrite(rel_pin, LOW); = 0;

Завантажуємо програму на Arduino і тестуємо систему. Якщо все зроблено правильно, надсилання SMS-повідомлення на пристрій призведе до вмикання світлодіода на 2 секунди. Зрозуміло, замість світлодіода можна вмикати/вимикати потужне реле, до якого підключено опалювальний котел у заміському будинку.

Останнім часом з'явилося багато різних варіантів схем пристроїв сигналізації GSM. Якщо в цій схемі застосовується модуль GSM, то в більшості випадків широко поширений модуль виробництва китайської фірми SimCom SIM300. Даний модуль показав себе з хорошого боку, як щодо надійності, так і низької вартості.
В представлений опис пристрою сигналізації GSMна основі модуля SIM300, розроблене автором. Там же наводяться креслення друкованих плат та повнофункціональна версія прошивки мікроконтролера. Також під цю систему сигналізації розроблені різні модулі розширення, пульти ДУ, клавіатурні блоки управління, блоки живлення.
Але фірмою-виробником було заявлено, що з кінця 2010 року виробництво модулів GSM лінійки SIM3xx буде припинено. Замість нього рекомендується використовувати новий модуль, що випускається тим самим виробником – SIM900. Причому, як було заявлено, SIM900 буде набагато функціональнішим за свого «предка», і, що для нас є одним з найважливіших критеріїв, дешевше.

Дещо про SIM900…

Так що ж є модуль SIM900? Візьмемо в руки данішляху і спробуємо його прочитати.
Модуль SIM900 є чотиридіапазонним GSM/GPRS прилад, що працює на частотах 850/900/950/1900 МГц, призначений для передачі голосу, даних, SMS повідомлень і ін.
Основні технічні характеристики модуля:
Діапазон частот:
GSM850, EGSM900, DCS1800, PCS1900
з сумісність із GSM phase 2/2+.
Випромінювана потужність:
class 4 (2W/900 MHz)
class 1 (1W/1800 MHz)

Управління: AT commands (GSM 07.10)
Напруга живлення модуля: 3,4 - 4,5 В
Струм споживання:
у сплячому режимі – 1,5 мА
у режимі передачі – до 500 мА
максимальний – 1,8 А
Робоча температура: -30 … +80 С
розміри: 24х24х3 мм
Маса: 3,4 г
Як можна побачити, даний модуль за габаритами відрізняється від свого попередника, модуля SIM3xx приблизно в півтора рази. Але і за параметрами та функціональністю теж перевершує на порядок.


Рисунок 1 – Зовнішній вигляд модуля GSM SIM900



Рисунок 2 – Призначення висновків модуля SIM900

Зовнішній вигляд модуля подано на рис. 1, а призначення висновків – на рис. 2. За малюнками можна визначити, що крім стандартного інтерфейсного набору, властивого попереднім моделям (порти UART для обміну даними, виведення статусу модуля STATUS, висновки інтерфейсу SIM-картки тощо), додано кілька нових (висновки підключення клавіатури KBR/KBC, ШИМ-вихід PWM, виведення скидання модуля NRESET).
Зважаючи на те, що даний модуль на момент написання цієї статті ще не пройшов повної «обкатки» на теренах України, постійно проводяться доопрацювання програмного забезпечення, в описі можливі зміни, які не погіршують роботу в цілому.

Основні параметри пристрою

Цей пристрійє продовженням лінійки приладів сигналізації GSM, розроблених автором. Тому параметри багато в чому ідентичні.
Спостереження за станом чотирьох шлейфів сигналізації (ШС) у всіх режимах роботи, крім режиму «Програмування», та відображення стану шлейфів за допомогою світлодіодних індикаторів, розташованих на передній панелі приладу (світлення індикатора – «шлейф у нормальному стані», в іншому випадку – присутній обрив чи замикання шлейфу сигналізації).
У шлейфи сигналізації можуть бути включені:
> магнітоконтактні сигналізатори (геркони СМК, СОМК);
> сповіщувачі типу "Фольга", "Вікно";
> сповіщувачі пожежні (ІП-104, ІП-105);
> датчики руху, об'єму, биття;
> інші датчики, що мають замкнутий вихід у нормальному стані, та розмикаючі контакти при порушенні.
Підтримка приладом наступних типівзон (шлейфів) сигналізації:
"нормальна" (сигнал "Тривога" формується відразу при надходженні сигналу порушення цілісності шлейфу сигналізації, шлейф після спрацьовування не відновлюється);
"з затримкою" (користувачеві надається час на вихід і на вхід, щоб можна було встигнути ввімкнути прилад і залишити об'єкт або розкрити об'єкт і вимкнути прилад);
«коридор» (при спрацьовуванні зони та подальшому її поверненні в нормальний стан даний типзони знову береться під охорону);
«цілодобова, пожежна» (шлейф сигналізації постійно під охороною, зняття та взяття проводиться за допомогою спеціальної SMS-команди);
«цілодобова, Кнопка тривоги»(Шлейф сигналізації постійно під охороною, зняття та взяття проводиться за допомогою спеціальної SMS-команди, при спрацьовуванні шлейфу проводиться тільки додзвон, відправка SMS-повідомлення про саботаж, сирена при цьому не включається);
«відключена» (система не реагує на жодні зміни на вході ШС).
Увімкнення режиму "Охорона" за допомогою "прихованої", або "секретної" кнопки, "секретного" перемикача (замість якого може бути використана клавіатура із замикаючими контактами, типу "Satel"), пульта дистанційного керування, ключа TouchMemory (Dallas) або додаткову клавіатуру, залежно від прошивки контролера. Прошивка, що описується тут, використовує тільки «секретний» перемикач, інші версії будуть розглянуті пізніше.
Підтримується два режими роботи приладу:
сигналізація GSM (GSM-термінал підключений і з ним здійснюється обмін даними);
автономна сигналізація (GSM-термінал не бере участі в роботі системи, пристрій працює як автономна сигналізація).
Зняття з охорони та постановка під охорону за допомогою дзвінка з певного телефону (може бути вимкнено) з передачею відповідного SMS про стан системи.
Передача підтверджуючого SMS-повідомлення при взятті об'єкта під охорону (може бути вимкнено).
Формування сигналу «Тривога» (включення сирени, передача даних «тривоги» на мобільний телефон) при порушенні цілісності («обрив» або «замикання») хоча б одного зі шлейфів сигналізації.
Надсилання SMS-повідомлень та автодозвон на три мобільні або стаціонарні (якщо забезпечується підтримка SMS-функцій оператором зв'язку) номери телефонів.
Переведення приладу в режим «Знятий з охорони» за допомогою лише пульта дистанційного керування, клавіатури, шляхом прийому SMS-повідомлення з мобільного номера 1 та (або) додзвону з цього номера (може бути відключено), а також «секретного» перемикача, залежно від від прошивки контролера.
Можливість дистанційного керування пристроєм шляхом передачі SMS-повідомлень певного змісту (може бути вимкнено).
Програмування основних функцій та параметрів приладу (номери телефонів, час затримки, час роботи сирени тощо) за допомогою комп'ютерної програми Lite Programmer у режимі «Програмування» приладу. При цьому вихід СОМ порту комп'ютера (висновки RxD і TxD) підключаються до відповідного роз'єму приладу сигналізації за допомогою спеціального кабелю.
Подача приладом певного сигналу користувачеві про брак коштів на рахунку мобільної картки.
Подача приладом певного сигналу для користувача про відсутність сигналу зв'язку з мобільною станцією.
Передача сигналу SMS при зникненні напруги живлення мережі (220В) в режимі "Охорона" (може бути відключено).
Застосування вбудованого модему GSM дозволяє обійтися без зайвих блоків та підключень, а також підвищити сумісність та стабільність зв'язку GSM-каналу.
Програмована реакція силового виходу: увімкнення виходу тільки в режимі "Тривога" на встановлений користувачемчас (від 60 до 240 секунд).
Використання оригінального протоколу передачі даних ІЧ-випромінювання пультом дистанційного керування для керування пристроєм та пультом радіовипромінювання, а також оригінальне кодування даних, що надходять з клавіатури.
Є можливість контролю приладом напруги живлення мережі та напруги акумуляторної батареї, при цьому при зникненні та появі напруги мережі надсилаються відповідні SMS-повідомлення. Також при зниженні напруги живлення резервного джерела(Акумулятора) нижче заданого рівня (8-9В) надсилається повідомлення, після чого прилад переходить в «сплячий» режим, вихід з якого можливий тільки при відновленні живлення (мережевого або акумуляторного).
Надсилання SMS-повідомлення на мобільний номер 1 при надходженні вхідних дзвінків із зазначенням вхідного номера(Може бути відключена).
Прилад дозволяє здійснити комутацію зовнішніх звукових або світлових оповіщувачів (дзвінок, сирена, лампа) з робочою напругою 12В і струмом, що споживається до 1,25А.
Прошивка мікроконтролера, описана в цій статті, призначена для роботи пристрою спільно з «секретним» перемикачем, а також увімкнення-вимкнення приладу за допомогою додзвону та відсилання SMS-повідомлень. Решта варіантів виконання пристрою буде описана в наступних матеріалах, за наявності, природно, читацького інтересу.

Технічні характеристики

Кількість шлейфів сигналізації – 4.
Опір виносного елемента (кінцевого), ком – 2,7.
Максимальний опір шлейфу охорони без урахування опору виносного елемента Ом – 750.
Струм від джерела постійного струму(без підключених активних датчиків сигналізації), при напрузі 12,6 В, у наступних режимах роботи, не більше:
- "черговий", без використання GSM-модуля - 0,16 А;
- "черговий", при використанні GSM-модуля - 0,23 А;
- "охорона", при використанні GSM-модуля - 0,28 А;
- «тривога», при використанні GSM-модуля та відключеної сирені – 0,34 А;
- пікове (імпульсне) споживання - 1,8 А.
Підтримувані стандарти GSM: 850/900/1800/1900 MHz.
Межі установок часу:
- Час затримки на вхід – 0…150 секунд;
- Час затримки на вихід – 0…250 секунд;
- Час роботи сирени – 30…250 секунд.

Опис схеми

Схема електрична основна принципова блоку наведена на рис. 3. Я уточнюю – «основного блоку», адже до даних систем сигналізації додатково розроблено великий набір периферії: тут і різноманітні пульти керування, блоки розширення та ін.
Порівняно з попереднім варіантомсхема зазнала якісних змін: крім, як говорилося вище, застосування іншого модуля GSM, також виключено реле (замість нього застосована ІМС – набір потужних транзисторних ключів), і навіть виключено блок перетворювача RS232-UART (як показала практика, програмування проводиться дуже часто , і для цього використовують, в основному, ноутбук, в якому порт RS232 часто просто відсутня).



Рисунок 3 – Схема електрична принципова

Головним керуючим елементом пристрою є мікроконтролер ATmega168 виробництва компанії Atmel. Мікроконтролер контролює стани шлейфів сигналізації, підключених до входів АЦП, і, в залежності від режиму роботи, здійснює подальші дії, як-от: додзвон і відсилання SMS-повідомлень, включення сирени, і т.д.
Входи АЦП PC0-PC3 призначені контролю стану шлейфів сигналізації, МК виробляє вимірювання напруги цих висновках, і, залежно від напруги, формує сигнал «обрив», «норма» чи «замикання». На PC5, PC6 подаються напруги з виходу блоку живлення контролю їх значень. До речі, якщо ці висновки не будуть підключені, пристрій не запуститься!
У схемі використовуються контрольні світлодіоди: LED1 – контроль роботи модуля GSM (за наявності зв'язку та роботи модуля моргає з частотою 1 спалах протягом 2-3 секунд, в інших випадках є проблеми зі зв'язком або з самим модулем), LED2 – контроль роботи системи ( в робочих режимах моргає із частотою 3-5 разів на секунду, в режимі програмування горить постійним світлом). Крім цього, до висновків IND1...IND4 підключаються світлодіоди контролю стану шлейфів сигналізації LED4...LED7. KEY_S – власне, сама «таємна» кнопка чи перемикач. SPEAKER – роз'єм для підключення динаміка, він може бути на будь-який опір, потужність щонайменше 0,25 Вт.

Про живлення приладу.Даний пристрій вимагає напруги живлення в межах 10 – 18 В, при струмі до 2 А. Блок живлення доцільно побудувати таким чином, щоб напруга живлення не пропадала навіть при зникненні мережі, тобто передбачити акумуляторну батарею. Рекомендується використовувати блок живлення, що застосовується в попередніх версіяхописуваного пристрою. Також описано і підключення блока живлення до приладу сигналізації.

Програмування основних функцій пристрою

Програмування основних функцій приладу здійснюється за допомогою спеціальної програми Lite Programmer. Остання версіяпрограми завжди можна завантажити на сайті автора. В принципі, замість комп'ютера для програмування приладу можливо використовувати мобільний телефон, підключений до пристрою через data-порт, або інфрачервоний порт, але для цього потрібно написати хоча б java-мідлет, а за відсутністю вільного часу автору просто ніколи цим зайнятися, та й програмування за допомогою ноутбука поки що влаштовує. Якщо є охочі зайнятися вирішенням цього питання – пишіть автору на електронну пошту, всю документацію буде представлено.
Підключення пристрою здійснюється до вільного СОМ-порту комп'ютера через спеціальний перетворювач RS232-UART, або до USB-порту через перехідник USB-UART. Тільки не надумайте підключати безпосередньо, без перехідника (є зараз і такі умільці)! Це загрожує смертю мікроконтролеру чи порту комп'ютера!
Порядок перемикання режим програмування:
1. Натиснути кнопку S1 на час не менше 2 секунд і дочекатися припинення миготіння індикатора стану роботи модуля 2HL1 (зазвичай не більше 10 секунд)
2. Знеструмити пристрій.
3. Встановити джампер J1, перевівши пристрій у режим «Програмування».
4. Підключити кабель для підключення пристрою до комп'ютера.
5. Здійснити встановлення зв'язку з пристроєм та програмування (описано нижче).
6. Знеструмити пристрій.
7. Вимкнути кабель зв'язку з ПК та прибрати джампер J1.
8. Програмування завершено, можна подати живлення та користуватися приладом.
Головна формаПрограма є стандартною, ніяких надмірностей і «наворотів». У правій частині форми встановлюється номер СОМ-порту, а також швидкість прийому-передачі даних (для нашого випадку - 115200 бод), для переведення пристрою в режим програмування вибрати у кадрі "Дія" (у правому нижньому кутку) - "встановити зв'язок", при цьому світлодіод 1LED1 займеться постійним світлом. Можна програмувати!



Рисунок 4 – Головна форма програми Lite Programmer

Особливих труднощів робота з програмою для користувача, хоча б раз у житті включає комп'ютер не представляє. Крім того, все докладно описано у згадуваній неодноразово Інструкції з експлуатації та програмування. Якщо коротко: встановлюєте потрібні вам параметри, переконуєтеся, що у третій колонці червоним кольором з'явився напис "Змінити", у кадрі "Дія" вибираєте пункт "Програмування", натискаєте кнопку "Виконати", і все. Якщо параметр запрограмований, то в п'ятій колонці з'явиться напис "Запрограмовано", при помилках програма також видасть відповідне повідомлення.

Деякі аспекти програмування.

Слід особливу увагуприділити процесу програмування, оскільки від цього залежить робота пристрою загалом. Як показала практика, основна помилка допускається під час встановлення номера SMS-центру мобільного оператора. Якщо Ви цей номер не знаєте, або не впевнені, краще його зовсім не програмувати. Програмне забезпечення модуля GSM у разі самостійно визначить номер.
Також уважно поставтеся до встановлення номера USSD-запиту про залишок коштів, якщо планується його використовувати. Спочатку пристрій розроблявся для українських користувачів, тому мінімальна сума залишку коштів дорівнює одному-дев'яти гривням-рублям. Можливі два варіанти вибору установки. Перший – вибрати потрібного оператора, і програма сама виставить необхідний номер та суму мінімального залишку, що дорівнює двом гривням. Другий варіант – вибрати з спадного меню вибору оператора USSD-запиту пункт TUNE USSD, і потім у формі заповнити необхідні параметри: мінімальна сума (від одного до дев'яти рублів), роздільник рублі-копійки (деякі оператори застосовують різні знаки поділу, наприклад, точка , кома, двокрапка).
Програма поки що підтримує тільки латиницю при введенні текстів SMS-повідомлень, оскільки дана функціяпідтримується і програмою мікроконтролера. В даний час ведуться роботи з включення та кирилиці.

Короткий Посібник з експлуатації.

Перед встановленням у пристрій сигналізації слід деяким чином «підготувати» SIM-картку, а саме: відключити пароль. Рекомендується використовувати у пристрої SIM-картку того самого мобільного оператора, що й телефони додзвону. Принаймні ймовірність доставки SMS-повідомлень неодноразово зросте.
Після подачі живлення та запуску прилад видасть один довгий звуковий сигнал внутрішнім динаміком, потім здійснюється встановлення зв'язку з модулем, по завершенню якої звучать три короткі звукові сигнали. Прилад готовий до роботи.
Далі йтиметься про використання приладу як пристрій охоронної сигналізації приміщень будинків та ін. Для використання пристрою як автомобільної сигналізації або інших функцій потрібна в першу чергу інша прошивка мікроконтролера, а це виходить за межі цієї статті. Це тема наступних публікацій.
Щоб поставити прилад під охорону, потрібно замкнути перемикач KEY_S. До речі, замість цього перемикача можна використовувати будь-яку клавіатуру із замикаючими контактами, наприклад, Satel SW02. Після цього прилад почне відраховувати час на вихід (час встановлюється при програмуванні), протягом якого необхідно залишити об'єкт, що охороняється. Якщо після закінчення часу на вихід усі шлейфи перебувають у зібраному стані, пристрій переходить у режим охорони. У тому випадку, якщо після закінчення часу на вхід хоча б один із шлейфів буде в обриві або замиканні, прилад видає переривчастий звук протягом 100-140 секунд, надсилається повідомлення про невзяти об'єкт під охорону на номер 1 (якщо запрограмовано), після чого переходить у режим тривоги з надсиланням усіх повідомлень та додзвоном. Також можна поставити прилад під охорону додзвоном із номера, запрограмованого першим, або надісланим SMS-повідомленням із текстом «START» із цього ж номера. Слід пам'ятати, що у цій версії прошивки не рекомендується спільне використанняпри постановці під охорону «секретного» перемикача та функцій GSM для виключення їхнього взаємного впливу. При спільному використанні пріоритет буде на стороні перемикача, GSM-функції не працюватимуть!
У режимі охорони пристрій постійно контролює стан всіх шлейфів сигналізації, а також стан модуля GSM. При цьому, якщо відбувається спрацьовування шлейфу, надсилаються SMS-повідомлення та здійснюється додзвон, відповідно до карти програмування. Дзвінок здійснюється до зняття абонентом трубки, але не більше восьми разів. Також в режимі охорони контролюється живлення мережі 220В та акумуляторної батареї резервного джерела. При цьому, при кожному зникненні 220В і його появі відбувається передача відповідного SMS-повідомлення (цю функцію можна відключити при програмуванні).
Для зняття приладу з охорони необхідно відкрити об'єкт, і протягом часу на вихід розімкнути контакти перемикача. Якщо цього не зробити, пристрій переходить у режим тривоги. Або зняти об'єкт з охорони до розтину, зателефонувавши або відправивши з першого номера SMS-повідомлення «STOP».
У черговому режимі пристрій контролює стан шлейфів сигналізації, а також модуль GSM. При втраті зв'язку з модулем або втраті мережі через кожні 2-4 хвилини лунає п'ять короткочасних зумерів. Також кожні 30-40 хвилин іде опитування стану рахунку мобільного номера. При цьому лунають десять короткочасних звукових сигналів («трель»), і надсилається одне SMS-повідомлення (“NO MONEY!!”) на номер 1.
У таблиці наведено службові повідомлення, які може надсилати пристрій при появі тих чи інших подій (при відключеній функції відправки, при програмуванні, дані повідомлення не надсилаються!):

Текст SMS

Опис

Примітка

Stop guard!

Підтвердження зняття системи з охорони

черговий режим

POWER OFF!

Несправність або відсутність напруги мережі 220В

Тільки у режимі охорони

Power ON

Поява напруги мережі 220В (після відсутності)

ALL POWERS OFF!

Всі напруги живлення нижче норми. Через деякий час пристрій перейде в режим сну.

У всіх режимах роботи

Start after sleeping

Відновлення роботи пристрою після зникнення живлення

NO MONEY!

Мінімальна сума коштів у рахунку. Необхідно поповнити рахунок!

Даний пристрій має великий потенціал у плані вдосконалення та модернізації, його можна використовувати не тільки як сигналізацію, але і як будь-який пристрій збору-передачі даних, сконфігурувавши програму мікроконтролера під кожен конкретний випадок.

Висновок

Цей пристрій пройшов початкове тестування в лабораторії автора і показав непогані результати. Модуль SIM900 показав стабільну роботупід час управління стандартними AT-командами, особливих скарг немає. Незабаром буде розроблено друковані плати даного приладу та підготовлено відповідну документацію. Демо-версія прошивки мікроконтролера додається до цієї статті. Повнофункціональна версія прошивки мікроконтролера пристрою надається будь-кому, хто бажає безкоштовно. Для цього слід надіслати відповідний запит на електронна скринькаавтора або за ICQ. Також розглядаються будь-які пропозиції щодо організації виробництва описуваного приладу сигналізації та периферійних пристроїв.
Надалі планується забезпечити сумісність приладу з усіма периферійними пристроями, призначеними для попередньої версії сигналізації GSM авторства Д. Дмитренка. Тут зібрано доповнення до статті для різних приватних застосувань.

Всі прошивки в даний час повнофункціональні, крім прошивок, що підтримують ключі iButton, там обмеження на кількість максимально використовуваних ключів - від одного до трьох.

1. Використання для керування пристроєм ключа TouchMemory

В даний час розроблено прошивку мікроконтролера для роботи з ключами TouchMemory. Для цього необхідно пристрій доповнити нескладним пристроєм, що складається з двох резисторів, ємності та стабілітрона. І, звичайно, використовувати прошивку для цього типу пристроїв.
Приклад використання такого пристрою наочно описується у статті Сигналізація GSM із застосуванням ключів iButton. Там же, на схемі електричної принципової показано підключення додаткового пристрою, наведені креслення друкованої плати.
Прошивку можна завантажити [шукаємо для DDN Research HG45Q]

Досвід використання SIM900, описаний нижче буде кориснішим тим, хто вже встиг трохи попрацювати з модулем. Для тих самих читачів, хто тільки починає вивчення даної мікросхеми і планує використовувати її для обміну даними через інтернет, ми підготували серію уроків на цю тему. Ось.

Отже, SIM900 – GSM-модуль компанії SIM COM, управляється AT-командами, вміє надсилати SMS, здійснювати дзвінки, організовувати пряме CSD-з'єднання, обмінюватися інформацією GPRS.

У моїх руках була замовлена ​​з Китаю налагоджувальна плата SIM900 GPRS shield – сумісна з платформою Arduino.

На платі знаходиться сам чіп SIM900, роз'єм для мікрофона і навушників, перемикач джерела живлення (від зовнішнього роз'ємуабо від Arduino), антена, кілька світлодіодів для індикації режимів роботи, роз'єм для батареї (якщо потрібний годинник реального часу), кнопка ввімкнення/вимкнення. Гарний опися знайшов на wiki виробника . Там же наведено код для керування модемом у різних режимах.

Як заявляє нам виробник, плата відмінно сумісна з Arduino Uno. Дійсно, плата SIM900 просто встромляється в Uno і відразу починає працювати. Однак, як з'ясувалося, Arduino Uno може виявитися «слабкуватим» для реалізації деяких функцій, але про це я розповім трохи нижче.

З Arduino Mega плата працює з деякими обмеженнями. Це пов'язано з тим, що Мега на відміну від Uno піни 7 і 8, недоступні для використання як software serial (програмний USART). Це вирішується перемиканням інтерфейсу USART на ноги 0 та 1, для цього на платі SIM900 передбачені джампери.

Взагалі, плату можна підключити до будь-якого контролера з USART. Наприклад, пробував керувати модемом за допомогою контролера STM32F4.

SIM900: SMS-повідомлення та дзвінки

Випробування модуля для обміну SMS-повідомленнями та дзвінків пройшли «на УРА»! Модуль впорався з цими завданнями без особливих проблемдля цього я просто скопіював c того ж сайту, скомпілював і прошив у Arduino Uno ось цей код:

//Serial Relay - Arduino will patch a //serial link між комп'ютером та GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include SoftwareSerial GPRS(7, 8); unsigned char buffer; // buffer array for data recieve over serial port int count=0; // counter for buffer array void setup() ( GPRS.begin(19200); // the GPRS baud rate Serial.begin(19200); // the Serial port of Arduino baud rate. ) void loop() ( if (GPRS .available()) // if date is comming from softwareserial port ==> data is comming from gprs shield ( while(GPRS.available()) // reading data в char array ( buffer=GPRS.read(); // writing data in array if(count == 64)break; ) Serial.write(buffer,count); data from array count = 0; // set counter while loop to zero ) if (Serial.available()) // if data available on hardwareserial port ==> data is comming from PC or notebook GPRS.write(Serial .read());// write it to the GPRS shield ) void clearBufferArray() /

Щоб посилати модулю команди, його потрібно підключити до комп'ютера. Це можна зробити за допомогою USB порту Arduino. На комп'ютері цього потрібен будь-який монітор COM-порта. Його можна завантажити звідси, а можна використовувати монітор, вбудований в Arduino IDE.

Все, що робить прошита програма Arduino, - "ловить" команди користувача і посилає їх модулю, а потім повертає користувачеві відповіді SIM900. Таким чином, передаючи модулю AT-команди в ручному режимі, я випробував прийом та передачу SMS-повідомлень, а підключивши у відповідні роз'єми мікрофон та навушники – скористався модулем SIM900 як мобільний телефон.

Передача даних по GPRS за допомогою SIM900

Свої перші досліди передачі даних через GPRS я почав, використовуючи для управління SIM900 платформу Arduino UNO (просто тому, що вона була під рукою). Для початку купив хостинг із сервером під Apatche і розгорнув на ньому найпростіший додаток, який вміло відповідати на GET-запити. Вийшло! Я так само посилав команди з ПК контролеру Arduino, який у свою чергу пересилав їх SIM900.

Все працювало коректно, поки GET-запити були досить короткими (до 100 символів). Але щойно запити стали довшими — почалися збої: запити передавалися не повністю. Було помічено, що глюки можуть з'явитися або зникнути навіть при збільшенні/зменшенні програми Arduino на кілька рядків. Згодом з'ясувалося, що збої пов'язані з програмним USARTом, який Arduino UNO використовує спілкування з SIM900, т.к. такий USART повністю залежить від програмного циклу ядра контролера. При малій кількості даних вони встигають передаватися завжди, а при збільшенні їх кількості - результат передачі залежить від тривалості програмного циклу.

Висновок з усього вищесказаного: використовувати програмний USART при спілкуванні з SIM900 НЕ МОЖНА, особливо коли йдеться про велику кількість даних, що передаються.

У Arduino Uno всього один «залізний» інтерфейс USART, який був зайнятий під обмін з ПК, тому довелося відмовитися від UNO, замінивши її на Arduino Mega, яка не страждає на брак «залізних» USARTів. Після такого «рокування» робота пристрою стала стабільною та коректною.

SIM900: TCP-IP стек або HTTP? Що краще?

Вивчаючи посібник з управління модемом, я виявив, що існує дві групи AT-команд. Перша група використовується передачі даних через вбудований TCP-IP стек, а друга використовує HTTP протокол вже реалізований внутрішньої логікою SIM900. Скільки я не мучив Google і Яндекс намагаючись дізнатися, чим відрізняються дані способи, які плюси і мінуси кожного з них, - нічого не знайшов, тому спробував обидва і ділюся своїм практичним досвідом тут.

Обидва способи робітники мають право на існування.

TCP-IP стек трохи складніше ініціалізується (більше команд потрібно передати модулю), ним трохи складніше керувати. Щоб передати запит, необхідно відкрити з'єднання, дочекатися відповіді та коректно закрити його.

HTTP – це, кажучи простими словами, браузер вбудований у SIM900. Він простий в ініціалізації, щоб розпочати обмін із сервером необхідно відкрити сеанс. При цьому відкриття та закриття з'єднання при кожному запиті та вирішення інших «організаційних завдань» лягатиме на плечі SIM900. Це зручно, до того ж передача даних у такий спосіб відбувається дещо швидше, саме через те, що SIM900 швидше виходить виконувати всі «допоміжні операції», ніж це може робити контролер.

Таким чином, при виборі способу обміну я таки зупинився на протоколі HTTP.

Некоректний GET-запит на сервер

На самому початку своєї роботи з передачі даних по GPRS я припустився помилки, яка коштувала мені не одного дня мук. Не маючи достатнього досвіду роботи із взаємодії з сервером за допомогою GET-запитів, я, набравшись поверхневих знань в інтернеті, склав запит на вигляд:

GET http://xxx.ru/d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

Цей запит не є коректним, проте його чудово «їв» браузер і проксі сервер, з якого я надсилав запити для налагодження - саме тому я вважав запит вірним.

Найдивовижніше те, що SIM900 теж чудово справлявся з «поганим» запитом (а відправляв запити тоді через TCP-IP стек). Однак, одного дня сервер почав відповідати на такі запити помилкою 404. Сталося це за так і не з'ясованими обставинами, чи хостинг-провайдер змінив алгоритми обробки запиту (він відхрещується від цього), чи це зробив мобільний оператор. Але факт залишається фактом. Тоді я спробував передати той самий запит через HTTP - все працювало. Пояснюється це тим, що внутрішній HTTP протокол модуля SIM900 (як я вже казав, по суті, вбудований браузер) вміє сам правильно «розпаровувати» некоректні запити і транслювати в мережу вже в правильному вигляді. Це ще один плюс (сумнівний, звичайно) використання HTTP, оскільки дозволяє програмісту деякі неточності. А взагалі, звичайно, запит має бути написаний правильно і виглядати так:

GET /d_command.php?UC=1111 HTTP/1.1
HOST: xxx.ru

З таким коректним запитом SIM900 успішно обмінюється через TCP-IP стек, і через HTTP.

Зависання SIM900

Іноді при обміні GPRS виникають ситуації, після яких модуль може зависнути. Цьому виною можуть бути некоректні дані, що прийшли по мережі і загнали в ступор SIM900, або перешкоди на лінії обміну модуля та контролера, при яких SIM900 отримав «не те, що чекав», або якісь невідомі проблеми. Виробник чіпа попереджає про те, що це може відбуватися і пропонує у таких випадках перезавантажувати модуль за допомогою спеціальної послідовності імпульсів, що подаються на вхід PWRKEY.

Однак, як з'ясувалося, це не завжди допомагає - після такого перезавантаження модуль може прокинутися все ще "глюкнутим". І про це також нас попереджає виробник, якщо уважно читати DataSheet на модуль. Ось що рекомендується у документації:

NOTE: Це необов'язково cut off the VBAT потужність безпосередньо безпосередньо з використанням external reset pin, коли SIM900 може не відповідати AT Command “AT+CPOWD=1” і PWRKEY pin.

Тому найправильнішим способом перезавантаження модуля є повне зняття з нього живлення (з ніжки VBAT), витримка деякої паузи (хоча секунду про всяк випадок) і повторна подача харчування. Для перезавантаження модуля на платі краще передбачити реле або транзисторний ключ, керований контролером.

Висновок

Надалі я планую випустити серію статей-уроків, в яких розповім як організувати обмін між серверним веб-додатком та SIM900, починаючи з покупки хостингу у провайдера закінчуючи написанням коду програм, що управляють.

До побачення! Слідкуйте за оновленнями LAZY SMART .

Може застосовуватися у пристроях, де необхідний зв'язок великі відстані. Наприклад, роботом у Москві людина керує сидячи у Краснодарі! Або фермер включає водяний насос на рисовому полі зі свого будинку, розташованого за кілька кілометрів від поля! Є кілька варіантів зв'язку з пристроєм:

Простий зв'язок на основі SMS повідомлень:
Увімкнення/вимкнення пристрою за допомогою простих SMS команд. Для керування пристроєм можна використовувати будь-який мобільний телефон.
Охоронна/пожежна сигналізація, яка інформує господаря про надзвичайну ситуацію в будинку за допомогою SMS.

Зв'язок на основі викликів:
“Розумна” охоронна/пожежна сигналізація, яка викликає поліцію чи пожежників та повідомляє про надзвичайну ситуацію за допомогою заздалегідь записаних голосових повідомлень.

Зв'язок із використанням інтернету (GPRS):
Користувач може керувати пристроєм із будь-якого ПК/планшета/мобільного телефону, підключеного до Інтернету. Наприклад, інформаційні дисплеї, встановлені на трасах, управляються із центральної диспетчерської.
Робот керований через інтернет. Такий робот доступний з будь-якого пристрою, підключеного до інтернету з будь-якої точки світу.
Портативні пристрої, встановлені в транспортних засобах, які підключаються до Інтернету за допомогою GPRS модуля SIM300 та додають поточну позицію (за допомогою GPS (Global Position System, Глобальна Система позиціонування)) на сервер. Ці дані зберігаються з бази даних на сервері разом з ідентифікатором автомобіля. Для перегляду маршруту автомобіля можна з'єднатися з сервером з комп'ютера за допомогою World Wide Web (Всесвітньої мережі).

Переваги використання модуля SIM300

Набір SIM300 Kit є повністю самостійним модулем із роз'ємом SIM-карти, блоком живлення тощо. Цей модуль може бути легко пов'язаний із дешевими мікроконтролерами AVR/PIC/8051. Зв'язок із мікроконтролером здійснюється через асинхронний послідовний порт. Це основний тип послідовного зв'язку, який апаратно підтримується більшістю мікроконтролерів. Дані передаються біт за бітом і збираються в байти. На найвищому рівні це виглядає як простий текстовий потік. Усього потоків два: один від мікроконтролера до SIM300 та інший від SIM300 до мікроконтролера. Команди передаються як простий текст.

Якщо ви ніколи не використовували послідовну передачу даних і не чули про неї, то бажано розібратися в її роботі та попрактикуватися на більш простих прикладах.

Зв'язок із модулем SIM300 за допомогою AVR UART

Апаратна частина мікроконтролера, що використовується для послідовного зв'язку, називається UART, і ми використовуємо його для зв'язку з модулем SIM300 (Також він може використовуватися для зв'язку з іншими пристроями, наприклад, зчитувачами RFID, модулями GPS, сканерами відбитків пальців і т.д.). UART є дуже поширеним способом зв'язку у світі електроніки, ми написали для нього чисту та просту бібліотеку, яку ми застосовуємо у всіх своїх проектах із використанням UART.

Оскільки байт від SIM300 може прийти на мікроконтролер у будь-який час, те, що станеться, якщо мікроконтролер зайнятий чимось іншим? Щоб вирішити цю проблему, ми зробили буферизацію вхідних даних, що базується на перериваннях. Буфер знаходиться в оперативній пам'яті мікроконтролера. Він має функцію, що дозволяє визначити кількість байт у черзі.

Нижче наведено функції бібліотеки AVR USART:

void USARTInit(uint16_t ubrrvalue)

Ініціалізація апаратної частини AVR USART. Значення параметра ubrrvalueвстановлюється бажана швидкість передачі. За замовчуванням швидкість передачі даних для SIM300: 9600 біт/сек. Для мікроконтролера AVR працює на частоті 16 МГц значення ubrrvalueдля такої швидкості має бути 103 .

char UReadData()

Читання одного символу з черги. Якщо у черзі нічого немає, то відповідь 0.

void UWriteData(char data)

Записує один байт даних на лінію Tx, використовуючи UWriteString ().

uint8_t UDataAvailable()

Повідомляє кількість даних у черзі FIFO.

void UWriteString(char *str)

Записує рядок у Сі стилі, що закінчується нуль символом у лінію Tx.
Приклад 1: UWriteString("Hello World!");
Приклад 2: char name="Avinash!"; UWriteString(name);

void UReadBuffer(void *buff,uint16_t len)

Копіює вміст FIFO буфера на згадку, певну buff, кількість скопійованих даних визначається параметром len. Якщо по UART в FIFO буфер надійшло менше даних, ніж треба (відповідно до параметра len), то місце, що залишилося, буде заповнене нулями.

char gsm_buffer;
UReadBuffer(gsm_buffer,16);

Наведений вище приклад зчитуватиме 16 байт даних (якщо вони є) з FIFO буфера в змінну gsm_buffer. Зверніть увагу, що gsm_bufferвиділено масив 128 байт, оскільки пізніше нам може знадобитися понад 16 байт. Таким чином, цей буфер можна використовувати для читання до 128 байт надалі.

Функція, показана вище, зазвичай застосовується разом з UDataAvailable().

while(UDataAvailable()<16)
{
//Do nothing
}

char gsm_buffer;
UReadBuffer(gsm_buffer,16);

Фрагмент коду, показаний вище, чекає поки в буфері накопичиться 16 байт даних, а потім зчитує їх.

void UFlushBuffer()

Скасує очікування на дані FIFO буфером. Перш ніж надсилати нову команду GSM модулю, скасуйте очікування даних FIFO буфером.

Наведені вище функції використовуються для надсилання та отримання текстових команд від GSM модуля SIM300.

Набір команд AT для SIM300

Тепер, року Ви знайомі з основами бібліотеки AVR USART та її використанням для ініціалізації USART, відправлення та отримання даних, настав час, щоб вивчити команди модуля SIM300 і як надсилати їх та приймати відповіді. SIM300 має кілька функцій: надсилання текстового повідомлення, дзвінок і т.д. Кожна з цих функцій виконується після певної команди і SIM300 має свій набір команд.

Усі команди SIM300 починаються з префіксу AT+і закінчуються Carriage Return(скорочено, повернення каретки). ASCII код CR - 0x0D (десяткове 13). Усі команди, які ви надсилаєте SIM300, будуть повертатися TX лінії SIM300. Тобто, якщо ви відправляєте команду 7 байт (включаючи завершальний CR), то ви відразу отримаєте ці 7 байт у буфер по UART. Якщо ви не отримали її, це означає, що щось не в порядку!

Перша функція, яку ми вивчимо буде SIM300Cmd (const char * cmd), вона виконує такі дії:

  • Пише команди, задані параметром cmd.
  • Додає CRпісля команди.
  • Чекає на повернення команди, і якщо вона приходить до тайм-ауту, вона відповідає SIM300_OK(Константа, визначена в sim300.h). Якщо на повернення чекали занадто довго, а його не було, вона відповідає SIM300_TIMEOUT.

Примітка: Усі залежні функції SIM300 зберігаються у файлі sim300.c. Зразки та константи зберігаються у sim300.h

Робота з SIM300Cmd ()

Int8_t SIM300Cmd(const char *cmd) ( UWriteString(cmd); //Send Command UWriteData(0x0D); //CR uint8_t len=strlen(cmd); len++; //Add 1 for trailing CR added to all commands uint16_t i= 0; // Wait for echo while (i< 10*len) { if(UDataAvailable() < len) { i++; _delay_ms(10); continue; } else { //We got an echo //Now check it UReadBuffer(sim300_buffer,len); //Read serial Data return SIM300_OK; } } return SIM300_TIMEOUT; }

За командою зазвичай слідує відповідь. Форма відповіді така:
LF- Line Feed, його ASCII код 0x0A (10 у десятковій системі)

Таким чином, під час очікування відповіді після відправки команди можуть статися три речі:

  • Відповіді немає протягом тривалого часу. Ймовірною причиною може бути те, що SIM300 не підключений до мікроконтролера.
  • Відповідь отримана, але не та, яка очікувалася. Причиною може бути несправність послідовної лінії, неправильно встановлена ​​швидкість передачі даних або мікроконтролер, що працює з неправильною частотою.
  • Отримано правильну відповідь.

Наприклад, команда Get Network Registration(Реєстрація в мережі) виконується таким чином: Command String (Команда): " AT+CREG?"

Response(Відповідь): +CREG: , OK

Ви бачите правильну відповідь 20 байт. Тобто після відправки команди "AT+CREG?" необхідно чекати на отримання 20 байт або поки закінчиться певний час. Друга умова виконується, щоб уникнути зависання, якщо SIM300 несправний. Тобто замість того, щоб завжди чекати відповіді, буде видана помилка, якщо SIM300 відповідає занадто довго (це називається тайм-аут)

Якщо отримано правильну відповідь, ми аналізуємо змінну для отримання інформації про реєстрацію в мережі.

Залежно від поточного стану реєстрації в мережі, значення може бути: 0 - Не зареєстровано, зараз SIM300 не шукає нового оператора для реєстрації. 1 - Зареєстрований у домашній мережі. 2 - Не зареєстровано, зараз SIM300 шукає нового оператора для реєстрації. 3 – У реєстрації відмовлено. 4 – Невідомо. 5 – Зареєстрований, роумінг.

Робота з SIM300GetNetStat ()

Int8_t SIM300GetNetStat() ( //Send Command SIM300Cmd("AT+CREG?"); //Now wait for response uint16_t i=0; //correct response is 20 byte long //So wait until we have got 20 bytes // in buffer.while(i<10) { if(UDataAvailable()<20) { i++; _delay_ms(10); continue; } else { //We got a response that is 20 bytes long //Now check it UReadBuffer(sim300_buffer,20); //Read serial Data if(sim300_buffer=="1") return SIM300_NW_REGISTERED_HOME; else if(sim300_buffer=="2") return SIM300_NW_SEARCHING; else if(sim300_buffer=="5") return SIM300_NW_REGISTED_ROAMING; else return SIM300_NW_ERROR; } } //We waited so long but got no response //So tell caller that we timed out return SIM300_TIMEOUT; }

Так само реалізована функція: int8_t SIM300IsSIMInserted()

При іншому типі відповідей ми знаємо заздалегідь точний розмір відповіді як у наведеній вище команді. Наприклад, це команда Get Service Provider Name (Отримання назви оператора (провайдера)), де довжина імені оператора невідома заздалегідь. Це може бути MTS, Beeline і т.п. Для вирішення цієї проблеми ми користуємося тим, що перед і після відповіді знаходиться CR LF. Таким чином, ми просто записуємо в буфер всі символи доти, доки ми не зустрічаємо CRщо означає кінець відповіді.

Для спрощення обробки таких команд ми зробили функцію
SIM300WaitForResponse (uint16_t timeout)

Ця функція чекає на відповідь від SIM300 (кінець відповіді позначається CR) і повідомляє розмір відповіді, в той час, коли сама відповідь копіюється в глобальну змінну sim300_buffer.

Якщо відповідь не отримана до тайм-ауту, то відповідь 0. Час тайм-ауту в мілісекундах можна встановити параметром timeout. Вона не вважає запізнювальні LF або останні OK, вони залишаються в UART FIFO буфері. Тому перед поверненням ми використовуємо команду UFlushBuffer ()видалити їх з буфера.

Робота з SIM300WaitForResponse (uint16_t timeout)

Int8_t SIM300WaitForResponse(uint16_t timeout) ( uint8_t i=0; uint16_t n=0; while(1) ( while (UDataAvailable()==0 && n

Робота з SIM300GetProviderName (char *name)Функція виконує такі дії:

  1. Очищає USART буфер для видалення всіх помилок або відповідей.
  2. Відправляє команду "AT+CSPN?" використовуючи функцію SIM300Cmd ("AT+CSPN?");
  3. Потім вона чекає на відповідь, використовуючи функцію SIM300WaitForResponse ()
  4. Якщо ми отримуємо не нульову відповідь, вона розбирає її, щоб отримати назву оператора.

Подібним чином реалізовані такі функції:

  • uint8_t SIM300GetProviderName(char *name)
  • int8_t SIM300GetIMEI(char *emei)
  • int8_t SIM300GetManufacturer(char *man_id)
  • int8_t SIM300GetModel(char *model)
uint8_t SIM300GetProviderName(char *name) ( UFlushBuffer(); //Send Command SIM300Cmd("AT+CSPN?"); uint8_t len=SIM300WaitForResponse(1000); if(len==0) return SIM300 ; start=strchr(sim300_buffer,"")); start++; end=strchr(start,"""); *end="\0"; strcpy(name,start);

SIM300 та ATmega32. Апаратна частина

Для демонстрації зв'язку з SIM300 використовуючи AVR ATmega32, нам знадобляться такі компоненти:
- ATmega32 з обв'язкою – регістром скидання, ISP штирьками, кварцом 16 МГц.
- Джерело +5В для живлення ATmega32 та РК-дисплея.
- Символальний РК-дисплей 16x2 для індикації результатів.
- Модель SIM300.

Ми використовували налагоджувальну плату Xboard, оскільки вона має ATmega32 з обв'язкою, джерело +5В та РК-дисплей.

Демонстраційний вихідний код для AVR та SIM300

Демонстраційний вихідний код написаний мовою C і скомпільований з використанням безкоштовного комп'ютера AVR-GCC, використовую останню . Проект поділено на такі модулі:

  • Бібліотека РК-дисплея
    - Файли lcd.c, lcd.h, myutils.h, custom_char.h
    - Її робота полягає у контролі стандартного РК-дисплея 16x2.
    - Більш детальну інформацію можна знайти за посиланням.
  • Бібліотека USART
    - Файли usat.c, usat.h
    - Її робота полягає у контролі апаратного USART мікроконтролера AVR. Включає функції ініціалізації USART, відправки / прийому символів, відправки / прийому рядків.
  • Бібліотека SIM300
    - Файли sim300.c, sim300.h

Покрокове налаштування проекту AS6

Створіть новий проект AS6 під назвою Sim300Demo.
Використовуючи solution explorer (дерево проектів), створіть папку з ім'ям "lib" у поточній папці.
Всередині папки "lib" створіть папки "LCD", "USART" та "SIM300".
Скопіюйте файли (за допомогою провідника Windows) lcd.c, lcd.h, myutils.h, custom_char.h до папки lcd.
Скопіюйте файли (за допомогою провідника Windows) usat.c, usat.h у папку USART
Скопіюйте файли (за допомогою провідника Windows) sim300.c, sim300.h до папки SIM300.
Додайте файли lcd.c, lcd.h, myutils.h, custom_char.h у проект за допомогою solution explorer (дерева проектів).
Додайте filesusart.c, usat.h до проекту за допомогою solution explorer (дерева проектів).
Додати файли sim300.c, sim300.h до проекту за допомогою solution explorer (дерева проектів).
Визначте значення F_CPU = 16000000 використання AS6.
Скопіюйте та вставте основний файл Sim300Demo.c у програму.
Скомпілюйте проект, щоб отримати hex файл.
Прошийте Xboard за допомогою USB-програматора.
Якщо ви використовуєте новий мікроконтролер ATmega32, встановіть LOW FUSE на 0xFFта HIGH FUSE на 0xC9.

Що робить програма демонстрації?

Ініціалізує РК-дисплей та модуль SIM300.
Перевіряє, що модуль SIM300 підключений до USART і належним чином реагує.
Відображає модуль IMEI SIM300.
Відображає ID виробника
Перевіряє наявність SIM-картки.
Шукає мережу GSM і встановлює з'єднання. Для цього має бути активна SIM-картка.
Вказує назву оператора, наприклад MTS або Megafon.

Можливі проблеми

Немає зображення на РК-екрані

Переконайтеся, що у проекті AVR Studio встановлено тактову частоту 16 МГц (16000000Hz)
Налаштуйте контрастність потенціометром.
Натисніть кнопку скидання кілька разів.
Увімкніть/вимкніть пристрій кілька разів.
Підключайте РК-дисплей лише так, як показано на схемі.

Під час ініціалізації SIM300 з'являється помилка "No Response (Немає відповіді)"

Перевірте цілість Rx, Tx та GND ліній між SIM300 та Xboard.
Переконайтеся, що мікроконтролер працює на частоті 16 МГц.
Встановіть ф'юзи точно, як описано вище.

Помилки компілятора

Багато людей використовують уже написані та скомпіловані програми. У них відсутній досвід і вони не знайомі з основами програмування та компіляції. Ознайомитись з компіляторами та їх роботою на різних платформах (PC/MAC/Linux) буде відмінним початком. Вбудовані системи не підходять вивчення основ. Вони призначені тим, хто має ці навички та просто користується ними.
Переконайтеся, що всі файли бібліотеки РК-екрана додані до проекту.
Переконайтеся, що AVR-GCC встановлено. (Дистрибутив Windows називається WinAVR)
Переконайтеся, що в проекті AVR Studio вказано AVR GCC.

Загальні поради для новачків

Використовуйте готові налагоджувальні плати та програматори.
Спробуйте вивчати, ґрунтуючись на статтях та підручниках.

Список радіоелементів

Позначення Тип Номінал Кількість ПриміткаМагазинМій блокнот
U1 МК AVR 8-біт

ATmega32

1 До блокноту
U2 Лінійний регулятор

LM7805

1 До блокноту
D1 Випрямний діод

1N4007

1 До блокноту
D2 Світлодіод 1 До блокноту
С1, С2 Конденсатор22 пФ2 До блокноту
С3, С4, С6 Конденсатор0.1 мкФ3

Ідея проекту: спроектувати пристрій на базі мікроконтролера AVR для управління готовим модулем GSM (я вибрав модуль TC35 від SIEMENS, але можна використовувати будь-який інший, якщо використовується зв'язок через послідовний порт RS232). Пристрій має бути компактним, мінімально простим та надійним.

Надсилання заздалегідь записаного в пам'ять повідомлення на вказаний номер повинно виконуватися після натискання кнопки. Усього потрібно було 6 кнопок для відправки на 6 різних номерів. Для індикації процесів було обрано 3 світлодіоди (Ready, Send, Error), але згодом було додано алфавітно цифровий LCD 16x2 (скоріше, для налагодження пристрою, ніж для звичайного використання).

Проектувалася вся справа на платі Pinboard II (Rev 2) із стандартним процесорним модулем на ATmega16. На готовому пристрої схема була дещо іншою (і мікроконтролер використовувався ATmega8). Програма писалася в AVR Studio 4.19. У проекті були використані різні файли заголовків (#include) для перемикання між Pinboard і готовим пристроєм.

Загальна схема системи:


Для контролера було випиляно таку хустку:

Часу було багато, тому я замовив плати у китайців:

А коли із залізом було закінчено, слідом пішов процес програмування. Все написано на Сі під AVR Studio 4.19. Повний проект викладаю наприкінці статті, якщо комусь цікавий повний код. Але поки що поговоримо про спілкування з GSM модулем.

Повний перелік команд AT є на кожен модуль в його документації. Але надсилання повідомлення відбувається кількома командами.

//Команда: AT+CMGF=1 //відповідь модуля: OK
Переводить модуль у текстовий режим. Цифровий режим я поки не освоїв (поки не було потреби). Відповідь модуля на початкових стадіях проекту не використовувалася. Але потім (коли був написаний дешифратор команд) був умовою продовження відправки або повідомлення про помилку протоколу. Йдемо далі:

Команда: AT+CMGS=(номер телефону) відповідь модуля: > надсилаємо повідомлення: Hello, GSM module! відповідь модуля: +CMGS: 62 OK
Після набору повідомлення потрібно відправити не Enter (0x0D) а CTRL-Z (0x1A). Відповідь модуля після надсилання містить порядковий номер повідомлення.

Для відправлення команд в модуль в модуль і отримання відповідей я використовував два кільцеві буфери з вхідними та вихідними індексами.

Для більшої зрозумілості коду наведу заголовки:

#define BUF_SIZE 128 #define BUF_MASK (BUF_SIZE-1) #define IN_BUF_SIZE 64 #define IN_BUF_MASK (IN_BUF_SIZE-1) volatile char buffer=""; volatile char inbuf="$"; //inner buffer USART volatile uint8_t ind_in=0, ind_out=0, rxind_out=0, rxind_in=0, mess = 0;
Запис рядків або окремих символів у буфер проводився звичайними функціями:

//sending RS232 with interupt void SendByte(char byte) ( buffer = byte; ind_in &= BUF_MASK; ) void SendStr(char *string) ( while (*string!="\n") //check if End ( SendByte( *string); string++; ) )
А відправлення здійснюється через обробник переривання:

//Sending data from buffer ISR (USART_UDRE_vect) ( UDR = buffer; //запис з буфера ind_out &= BUF_MASK; //перевірка маски кільцевого буфера if (ind_in == ind_out) //якщо буфер вже порожній ( UCSRB &= ~( 1<Тепер для відправки потрібно записати потрібну команду в буфер (включаючи кінцевий символ \n), а потім включити переривання спустошення регістра відправки (UDR):

SendStr("AT+CMGF=1\n"); SendByte(CR); // відправляємо (0x0D) UCSRB &= ~(1<Поки йде відправка, можна надіслати напис на LCD або просто почекати (delay).
Писати тим часом у буфер не можна. Досвідченим шляхом виявив, що модуль не встигає обробити суцільний команд. А зупинка відбувається, коли буфер порожній (вхідні та вихідні індекси рівні).

І таким чином ми надсилаємо повідомлення. Залежно від натиснутої кнопки (у головному циклі я сканую порт) відбувається надсилання повідомлення:

While (1) ( tmp = PINC; switch (tmp) ( case 1: send_sms(0,NUM1); break; case 2: send_sms(0,NUM2); break; case 3: send_sms(0,NUM3); break; //і так далі... default: break; ) Ready_Snd (); //переведення назад в режим готовності )
У функцію надсилання я надсилаю номер вибраного повідомлення (їх у мене 2 типи) та номер телефону.
Можна навіть відправити команду на дзвінок тими самими командами AT. Все залежить від необхідної функції.

Тепер про отримання команд із модуля.

Модуль відправляє багато команд. Наприклад, OK, RING, ERROR…
Іноді потрібно, щоб при отриманні команди контролер зміг впізнати її та виконати якусь дію. Наприклад, отримано вхідний дзвінок. Модуль при цьому відправляє до контролера:

RING RING RING
Залежно від налаштувань модуля може надсилати ще й номер того, хто дзвонить. Поки немає жодної програми, контролер нічого з цим зробити не зможе (у кращому випадку) або (у гіршому) зробить що не те, а то й зовсім зависне (не зможе вийти з переривання).

Вимоги до коду обробки:
1. Мінімальна кількість часу збереження отриманих команд. Жодних затримок у програмі переривання бути не повинно. Потім уже з отриманим масивом робитимемо що завгодно.

2. Збереження всіх отриманих команд у одному буфері. Для розділення окремих будемо використовувати символ $.

3. Розпізнавання поширених команд у числові коди. Наприклад, OK буде 1, ERROR – 4, RING – 2.

Наведу заголовки з попередньої статті із поправками:

#define BUF_SIZE 128 //Вихідний буфер #define BUF_MASK (BUF_SIZE-1) #define IN_BUF_SIZE 64 //Вхідний буфер #define IN_BUF_MASK (IN_BUF_SIZE-1) volatile char buffer=""; volatile char inbuf="$"; //inner buffer USART volatile uint8_t ind_in=0, ind_out=0, rxind_out=0, rxind_in=0, mess = 0; volatile uint8_t com_detect=0; //сюди буде записано виявлену команду #define TIMEOUT 100 //на випадок якщо команду так і не прийнято
Пишемо обробник переривання прийому даних:

//Recieving Data from RS232 ISR (USART_RXC_vect) (uint8_t tmp; tmp = UDR; if (tmp == 0x0D) //отриманий кінець команди - (mess++; //one more message inbuf = "$"; //вставляємо роздільник у буфер rxind_in &= IN_BUF_MASK; ) else ( if (tmp != 0x0A) //очищення незрозумілого символу з модуля ( inbuf = tmp; //записуємо буфер rxind_in &= IN_BUF_MASK; ) ) sei (); )
Тепер у нас усі команди записані у буфері. Можна у вільний час перевірити змінну mess і якщо вона не дорівнює нулю – запустити обробник команди. У самому проекті було додано команди для LCD екрану. Тут я їх пропущу через непотрібність.

Void rx_check_in (void) ( uint8_t count = 0; com_detect = 0; // обнулення команди (щоб не заважало попереднє сміття) while (1) ( if (inbuf != "$") // виявлено кінець команди (розділювач) ( com_detect ^= inbuf;//робимо XOR отриманим символам rxind_out &= IN_BUF_MASK; count++; //вважаємо, скільки символів у команді) else (rxind_out++; ; ) ) )
Отримані символи ми пропускаємо через м'ясорубку. Робимо XOR операцію. Отримуємо таким чином унікальний код (не впевнений на рахунок унікальності, але поки що не підводило). R^I^N^G нам дасть 0x12. O^K дасть 0x04. Цей код та кількість символів (у команді) збережені в змінних com_detect (глобальна) та count. Тепер запустимо обробник:

Void code_com (uint8_t count) ( switch (com_detect) ( case (0x12): if (count == 4) com_detect = 2; break; //R^I^N^G case (0x58): if (count == 5) ) com_detect = 3; break; //ERROR case (0x04): if (count == 2) com_detect = 1; break; //OK case (0x5C): if (count == 3) com_detect = 4; break; / /ATI default: com_detect = 0; ))
Розпізнали команду. Кількість символів я ввів для надійності на випадок, якщо в довгій команді XOR код збігається. Команди можна додавати. Потрібно лише підрахувати (або макросом) XOR код бажаної команди та присвоїти їй цифру.

Тепер у com_detect у нас отримана команда. Тепер пристрій може відреагувати SMS-повідомленням на отриманий дзвінок:

While (1) ( if (mess != 0) //if we have mess in buffer ( // code mess--; //minus one rx_check_in (); //розпізнаємо окрему команду if (com_detect == 2) // якщо була команда RING (код 2) ( //Посилаємо повідомлення // і приймаємо вхідні команди (OK) if(!send_sms(1,NUM0)) ErrMes(); //якщо після відправки не було команди OK) //тоді видати повідомлення про помилку протоколу com_detect = 0;
Так можна обробляти різні отримані команди.

Підсумок: пристрій може надсилати повідомлення на телефон і вміє реагувати на різні команди від GSM модуля.

Дякую за увагу.