Главная » Микроконтроллеры
Призовой фонд
на май 2017 г.
1. Тестер компонентов MG328
Паяльник
2. Осциллограф DSO138
Паяльник
3. Регулируемый паяльник 60 Вт
Паяльник
4. 100 руб.
От пользователей

Интерфейс связи между SIM300 и ATmega32

GSM/GPRS модуль SIM300, может применяться в устройствах, где необходима связь на большие расстояния. Например, роботом в Москве человек управляет сидя в Краснодаре! Или фермер включает водяной насос на рисовом поле из своего дома, расположенного за несколько километров от поля! Есть несколько вариантов связи с устройством:

Простая связь на основе 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[128];
UReadBuffer(gsm_buffer,16);

Приведенный выше пример будет считывать 16 байт данных (если они есть) из FIFO буфера в переменную gsm_buffer. Обратите внимание, что gsm_buffer выделен массив 128 байт, поскольку позже нам может потребоваться более 16 байт. Таким образом, этот буфер можно будет использовать для чтения до 128 байт в дальнейшем.

Функция, показанная выше, обычно применяется вместе с UDataAvailable ().

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

char gsm_buffer[128];
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;
}

За командой обычно следует ответ. Форма ответа такая: <CR><LF><response><CR><LF>
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[11]=='1')
            return SIM300_NW_REGISTERED_HOME;
         else if(sim300_buffer[11]=='2')
            return SIM300_NW_SEARCHING;
         else if(sim300_buffer[11]=='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_TIMEOUT;

   char *start,*end;
   start=strchr(sim300_buffer,'"');
   start++;
   end=strchr(start,'"');

   *end='\0';

   strcpy(name,start);

   return strlen(name);
}

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

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

Схема SIM300 и ATmega32

Мы использовали отладочную плату Xboard, поскольку она имеет ATmega32 с обвязкой, источник +5В и ЖК-дисплей.

Фото соединения SIM300 и ATmega32

Выводы SIM300

USART выводы Xboard

GSM модуль, соединённый с ATmega32

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

Демонстрационный исходный код написан на языке C и скомпилирован с использованием бесплатного AVR-GCC компилятора, использую последнюю Atmel Studio 6 IDE. Проект разделен на следующие модули:

  • Библиотека ЖК-дисплея
    - Файлы lcd.c, lcd.h, myutils.h, custom_char.h
    - Её работа заключается в контроле стандартного ЖК-дисплея 16x2.
    - Более подробную информацию можно найти по ссылке.
  • Библиотека USART
    - Файлы usart.c, usart.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) usart.c, usart.h в папку USART
Скопируйте файлы (с помощью проводника Windows) sim300.c, sim300.h в папку SIM300.
Добавьте файлы lcd.c, lcd.h, myutils.h, custom_char.h в проект с помощью solution explorer (дерева проектов).
Добавьте filesusart.c, usart.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.

Установка фьюзов ATmega32

Что делает демонстрационная программа?

Инициализирует ЖК-дисплей и модуль SIM300.
Проверяет, что модуль SIM300 подключен к USART и реагирует должным образом.
Отображает IMEI SIM300 модуля.
Отображает ID производителя
Проверяет наличие SIM-карты.
Ищет GSM сеть и устанавливает соединение. Для этого должна быть активная SIM-карта.
Показывает название оператора, например MTS или Megafon.

Инициализация

Инициализация

Показ IMEI

ID производителя

Проверка SIM-карты

Проверка SIM-карты

Проверка сети

Название оператора

Возможные проблемы

Нет изображения на ЖК-дисплее

Убедитесь, что в проекте AVR Studio установлена тактовая частота 16 МГц (16000000Hz)
Отрегулируйте контрастность потенциометром.
Нажмите кнопку сброса несколько раз.
Включите/выключите устройство несколько раз.
Подключайте ЖК-дисплей только так, как показано на схеме.

Во время инициализации SIM300 появляется ошибка "No Response (Нет ответа)"

Проверьте целость Rx, Tx и GND линий между SIM300 и Xboard.
Убедитесь, что микроконтроллер работает на частоте 16 МГц.
Установите фьюзы точно, как описано выше.

Ошибки компилятора

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

Общие советы для новичков

Используйте готовые отладочные платы и программаторы.
Попробуйте изучать AVR с самого начала, основываясь на статьях и учебниках.

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

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
U1 МК AVR 8-бит
ATmega32
1 Поиск в FivelВ блокнот
U2 Линейный регулятор
LM7805
1 Поиск в FivelВ блокнот
D1 Выпрямительный диод
1N4007
1 Поиск в FivelВ блокнот
D2 Светодиод1 Поиск в FivelВ блокнот
С1, С2 Конденсатор22 пФ2 Поиск в FivelВ блокнот
С3, С4, С6 Конденсатор0.1 мкФ3 Поиск в FivelВ блокнот
С5 Электролитический конденсатор470 мкФ1 Поиск в FivelВ блокнот
RV1 Подстроечный резистор10 кОм1 Поиск в FivelВ блокнот
R1 Резистор
4.7 кОм
1 Поиск в FivelВ блокнот
R2 Резистор
330 Ом
1 Поиск в FivelВ блокнот
Х1 Кварцевый резонатор16 МГц1 Поиск в FivelВ блокнот
Х2 Разьем для питания1 Поиск в FivelВ блокнот
Х3 МодульSIM3001 Поиск в FivelВ блокнот
LCD1 LCD-дисплейLM016L1 Поиск в FivelВ блокнот
L1 Катушка индуктивности10 мкГн1 Поиск в FivelВ блокнот
SW1 Выключатель1 Поиск в FivelВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Теги:

none Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Отслеживать передвижение своих сотрудников поможет gps жучок.

Комментарии (2) | Я собрал (0) | Подписаться

0
Дмитрий #
Приборчик может по смс передавать место положения (gps) ?
Ответить
0
Evgraf #
Может, если к контроллеру подвесть gps трекер
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
ELM327 OBD II — адаптер с поддержкой CAN Raspberry Pi 2
вверх